Google API大全之静态图引用Word格式文档下载.docx
《Google API大全之静态图引用Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《Google API大全之静态图引用Word格式文档下载.docx(20页珍藏版)》请在冰豆网上搜索。
要注意的是,调用GoogleMaps静态地图同样要申请地图的API_Key,申请的地址为:
Maps的授权码是相同的。
在填入使用者申请的API_Key之后,上例我们所调用的静态地图对应的访问地址如下:
orangea&
zoom=13&
size=500x300&
key=YOUR_KEY_HERE
通过静态地图调用API,可以进一步增加电子地图的应用范围,同时也使获得地图的方法变得更为简洁直接。
33.2
GoogleStaticMapsAPI语法格式
33.2.1
GoogleStaticMapsAPI常用参数
GoogleStaticMaps的图像都是通过特定的URL地址返回的,在URL请求中用户可以指定请求的位置、地图大小、缩放级别、地图类型及标记点的设置。
常见的GoogleStaticMaps请求地址串可以表示如下:
由于地图请求是由标准HTTP提交的,所有参数都须要使用&
字符作为间隔,其中某些参数是可选的。
地址串中所附带的参数及其取值如下。
Center:
如果图标没有出现在地图中央,需要用center来定义地图的中心位置,后面所跟的纬度和经度须要使用逗号作为分隔。
Zoom:
用以定义地图的缩放级别,可以通过数字选择0~18的缩放级别。
Size:
用以定义地图图像的大小,分别用横向和纵向的像素来表示。
Format(可选):
定义生成的影像格式。
默认情况下,静态地图API将生成GIF格式的图像,其他可选的格式类型为JPEG和PNG类型。
相对来说,GIF和PNG格式包含的图像细节更多,但JPEG格式的压缩比更大。
Maptype(可选):
可以选择的地图类型包含有卫星影像、地形图、混合地图及适于便携设备的地图。
在默认情况下,我们获得的是正常的行政交通图。
Markers(可选):
用来定义附加在地图图层之上的一个或多个地点标记,标记之间可以使用标记分隔符(|)进行划分。
Path(可选):
通过两点或多点的链接来定义显示在地图之上的道路路径,同样,一系列的点之间也使用标记(|)来进行分隔。
Frame(可选):
为返回的地图图像添加一个可以设定颜色的边界。
Key:
填入为站点申请的GoogleMapsAPI授权码,这个APIKey与使用GoogleMaps时的授权码相同,可以在Google开发者站点免费申请。
在使用GoogleStaticMapsAPI时,我们还须要注意的是目前GoogleStaticMapsAPI的查询调用限制为每天1000次请求,这样的设定是为了限制用户大量获取静态地图而移作他用。
如果发现有滥用API获取静态地图的站点,Google可能会暂停对站点地图请求的响应。
33.2.2
GoogleStaticMapsAPI的支持服务
在使用GoogleStaticMapsAPI来获取地图时,往往仅知道请求位置的地址而对其所处的经纬度信息并不了解。
这样,我们可以通过Google提供的地址译码(Geocoding)服务来将用户输入的地址转换成为对应的经纬度坐标。
在GoogleMaps的API之中已经包含了地址译码功能,使用者可以在HTTP请求中调用GClientGeocoder对象来完成地址译码的操作。
在Google提供的官方示例(geocoding-simple.html)中,我们可以使用如下的代码来完成输入地名的地址译码操作,其地址译码界面如图33-3所示。
(点击查看大图)图33-3
地名到经纬度的地址译码操作
上述的地址译码操作是通过GoogleMapsAPI的调用实现的。
首先,在地图初始化时,通过GMap2类生成一幅新的地图,之后使用GClientGeocoder类创建地理译码器的实例,与Google服务器建立连接来获得地址译码的转换。
代码段如下:
functioninitialize(){
if(GBrowserIsCompatible()){
map=newGMap2(document.getElementById("
map_canvas"
));
map.setCenter(newGLatLng(37.4419,-122.1419),13);
geocoder=newGClientGeocoder();
}
目前,中国国内地图的地址解析器支持市、县、区级别,在美国可以支持到街区门牌号。
在接下来的showAddress函数中,我们取得geocoder返回结果对应的经纬度,进行判断之后将得到的经纬度标注在地图之上。
其代码如下:
functionshowAddress(address){
if(geocoder){
geocoder.getLatLng(
address,
function(point){
if(!
point){
alert(address+"
notfound"
);
}else{
map.setCenter(point,13);
varmarker=newGMarker(point);
map.addOverlay(marker);
marker.openInfoWindowHtml(address);
转换地址到经纬度后,我们就可以根据得到的经纬度设置地图显示的中心位置,以及进行记号点标注等操作。
当然,如果不希望在代码中调用GClientGeocoder类来实现地址译码的功能,还可以直接通过浏览器URL提交的HTTP请求来获得地址译码。
在URL中实现地址译码仅须要将请求提交到:
q(必需):
后面跟将要译码的地址字串。
Key(必需):
申请的GoogleAPI授权码。
output(必需):
生成输出文件的格式,可选的格式为json(默认)、xml、kml、csv。
gl(可选):
可以用来指定国家代码。
下面举例说明。
我们通过请求得到Google总部山景城的经纬度位置如下:
现在得到的输出格式是XML文档的形式,其代码如下:
<
?
xmlversion="
1.0"
encoding="
UTF-8"
?
>
kmlxmlns="
Response>
name>
1600AmphitheatreParkway,MountainView,CA<
/name>
Status>
code>
200<
/code>
request>
geocode<
/request>
/Status>
Placemarkid="
p1"
address>
1600AmphitheatrePkwy,MountainView,CA94043,USA<
/address>
AddressDetailsAccuracy="
8"
xmlns="
urn:
oasis:
names:
tc:
ciq:
xsdschema:
xAL:
2.0"
Country>
CountryNameCode>
US<
/CountryNameCode>
AdministrativeArea>
AdministrativeAreaName>
CA<
/AdministrativeAreaName>
Locality>
LocalityName>
MountainView<
/LocalityName>
Thoroughfare>
ThoroughfareName>
1600AmphitheatrePkwy<
/ThoroughfareName>
/Thoroughfare>
PostalCode>
PostalCodeNumber>
94043<
/PostalCodeNumber>
/PostalCode>
/Locality>
/AdministrativeArea>
/Country>
/AddressDetails>
Point>
coordinates>
-122.085121,37.423088,0<
/coordinates>
/Point>
/Placemark>
/Response>
/kml>
如果不指定输出格式,则按照默认的JSON格式输出内容。
上述内容的JSON格式输出后,我们在JSON格式化工具(
(点击查看大图)图33-4
JSON格式化后查看包含的内容
除此之外,在GoogleMaps提供的服务中,还包含XML和数据解析服务、使用Flash的方式展现街景图,以及GoogleEarth浏览器插件的支持。
更多的细节可以参考GoogleMaps提供服务的页面:
对于熟悉Ruby和Rails的开发者,进行地图Mashup应用开发可借助名为StaticGmaps(http:
//static-gmaps.rubyforge.org/)的gems封装,它为GoogleStaticMapsAPI提供了Ruby的访问接口,可帮助用户节省开发过程中的工作量。
33.3
GoogleStaticMapsAPI示例
33.3.1
开发环境简介
在了解GoolgeStaticMapsAPI基本函数的使用之后,下面着手制作一个可以调用静态地图的小程序,应用所要实现的功能描述如下:
设计一个包含输入框、确认按钮和静态地图图片显示面板的应用程序界面。
应用启动后,用户可以在文本框中输入所要查找的地名。
点击确定按钮之后,组合静态地图的URL请求串,取得请求的静态地图,并显示在窗体之中。
静态地图生成后,可以保存在程序运行的当前位置目录中。
简单的需求描述如上,让我们看看上述嵌入GoolgeStaticMaps的小应用是如何编码实现的。
为了保持应用的简明和趣味性,在这里我们使用Python语言、PyQt图形库,以及NetBeansIDE的NBPython编程环境来完成这个调用静态地图的小例子。
Python语言和Qt图形库开发的应用程序具备跨平台特性,示例中我们使用Windows开发环境,开发所使用的软件环境搭建如下:
NBPythonMilestone6
Python2.5.2Windowsinstaller
http:
//www.python.org
PyQt(PyQt-Py2.5-gpl-4.4.3-1.exe)
//www.riverbankcomputing.co.uk/
在开始之前,让我们对于Qt及程序中将使用的PyQt图形库先有个简单的认识。
Qt是一套成熟稳定的GUI工具箱,Qt跨平台的图形库可以运行在Windows、Linux、MacOSX及多种便携式设备平台之上。
著名的GoogleEarth应用的界面也是使用Qt图形库进行设计的,Qt图形库分别针对Linux、Windows及Mac平台发布了不同的版本。
Qt在设计上具备良好的面向对象结构,以及众多实用的API。
而PyQt则为Python程序员开发基于Qt图形库的跨平台应用搭建了桥梁。
相对于Python默认使用的图形库Tk(由Tkinter绑定),PyQt具备众多的优点,如Qt使用信号/插槽(Signals/Slots)的机制在窗口构件(以及其他对象)之间传递事件和消息,让编写事件触发的代码段变得十分轻松;
并且PyQt包含300多个类和近6000个函数和方法,功能十分强大。
至于PyQt的安装,相对来说较为复杂,通常须要下载源代码之后在本机编译为二进制的代码,编译的过程在Linux环境下出错的概率较小,但在Windows环境下编译时往往须要多尝试几次才可以编译通过。
在环境搭建方面不必有过多的担心,在这里我们使用PyQt提供的已经编译好的二进制安装版本PyQt-Py2.5-gpl-4.4.3-1.exe。
除了Python的解析器须要单独安装之外,这个版本包含了使用PyQt进行应用开发需要的所有要素,包含的主要要素如下:
PyQt库。
Qt库。
QtDesigner(界面设计器)。
QtAssistant(编程助手)。
QtLinguist(国际化翻译工具)。
pyuic4(ui界面文件的编译器)。
QScintilla(Scintilla编辑器类的Qt接口)。
编程环境使用了NetBeans的PythonIDE,NBPython可以作为一个插件加入到NetBeans环境之中,也可以单独下载46MB的NetbeansPython专用IDE。
在这个IDE中,计划添加的Python支持功能有:
语法高亮显示。
代码补全。
Python与Jython的支持。
PyUnit单元测试支持。
Python代码断点调试。
Python类库管理。
Python控制台。
Python脚本执行。
Python版本管理。
NetBeans的PythonIDE同样提供了不同平台下的安装版本,在Windows环境下的运行版本如图33-5所示。
(点击查看大图)图33-5
NetBeans的PythonIDE
使用Qt进行跨平台GUI应用开发的优势之一就是它有方便的Qt界面设计器,可以很快地设计出美观大方的程序窗体布局。
下面我们打开QtDesigner,新建一个对话框,然后在对话框中添加一个名为Address的Lable标签(QLable)、一个文本输入框(QLineEdit),以及一个确定按钮(QPushButton)。
在应用程序的窗口主体也加入一个Lable标签,用于显示从Google获得的静态地图。
最后使用栅格布局(GridLayout)调整各个部件的位置。
设计好之后的对话框如图33-6所示。
在使用Qt设计器的同时,还可以随时点击"
窗体-预览"
(Ctrl+R)来预览当前窗体的模样。
窗体的预览如图33-7所示。
保存之后,Qt设计器生成了一个拓展名为.ui的文件。
在Qt中,UI文件以XML的格式记录了QTDesigner所生成界面的相关内容,包含在UI文件中的内容如下:
(点击查看大图)图33-6
Qt设计器中进行应用程序窗体设计
(点击查看大图)图33-7
Qt设计器中预览设计的窗体
Widget属性,包含的元素(如按钮、文本框、下拉列表,等等),Layout布局方式等相关属性。
引用的头文件(使用C++时会编译生成头文件)。
变量。
槽(Slot)。
函数。
UI文件保存之后,可以使用Qt提供的UIC(userinterfacecompiler)编译器将UI文件内容转换成标准.h和.cpp文件。
在PyQt中,UI文件将被转换为.py文件。
UI文件编译器位于PyQt的安装目录(Windows环境下,通常是C:
\Python25\Lib\site-packages\PyQt4)中,在终端模式的命令行提示符下,使用目录中的pyuic4.bat命令即可将UI文件编译为Python的代码。
使用方法如下:
pyuic4.batUI_FILE-oPY_FILE
在这里,UI_FILE为UI文件的路径,PY_FILE为计划生成的Python文件的路径。
例如,可以使用ui_myapp.py来命名生成的Python文件。
除此之外,pyuic4命令后还可以添加参数。
参数-p(-preview)将会生成UI文件转换后的预览,而不生成代码文件;
参数-x(-execute)生成用来测试和显示类的额外代码;
参数-d(-debug)用以显示调试输出。
我们将UI生成的Python代码命名为ui_staticmap.py。
下面在NetBeans中新建一个工程,为设计的窗体添加事件相应代码。
NetBeans的PythonIDE安装之后,首先须要在菜单Tools-PythonPlatforms中设置Python解释器的路径,如图33-8所示。
(点击查看大图)图33-8
IDE中设置Python解释器路径
33.3.2
定制静态地图应用
下面我们在NetBeans的PythonIDE中新建一个Python工程,点击创建工程,出现的界面如图33-9所示。
(点击查看大图)图33-9
新建Python工程
输入工程的名称为staticmap,PythonIDE会为我们创建名为staticmap.py的代码文件,并将其设定为主文件,如图33-10所示。
(点击查看大图)图33-10
设定工程名称和存储位置
下面为生成的主文件staticmap.py添加相应的代码,首先在程序的开始加载所需的模块,引用部分代码段如下:
fromPyQt4.QtCoreimport*
fromPyQt4.QtGuiimport*
importurllib
引入QtCore和QtGui所包含的类,PyQt4的基本模块都包含在QtGui中。
由于静态地图的请求还须要对URL地址进行解析,所以再引入urllib类库处理HTTP相关的部分。
主程序部分也不复杂,其代码如下:
defmain():
app=QApplication(sys.argv)
w=MyWindow()
w.show()
sys.exit(app.exec_())
对于PyQt4程序来说,要创建一个application对象。
application类位于QtGui模块中,程序的主体就是这个QApplication,sys.argv用于传入命令行参数。
MyWindow是用于定义窗体的类,w.show()的作用是将定义的窗体显示出来。
最后,主程序会进入application的事件循环。
循环不断从窗口接受要处理的事件,然后将其分发给对应的事件处理方法。
事件循环的终止须要通过调用exit()方法或销毁widget来结束,调用sys.exit()方法可以确保程序正确退出,并且在退出时会告知系统。
由于exec是python的一个关键字,所以在exec_()方法后会有一个下划线来表示与关键字的区别。
在MyWindow类中,我们指定QDialog是刚才在Qt设计器中通过UI文件生成的Ui_Dialog(须要与UI设计器中指定的名称保持一致),其代码如下:
classMyWindow(QDialog):
def__init__(self,*args):
QDialog.__init__(self,*args)
self.ui=Ui_Dialog()
self.ui.setupUi(self)
#createconnection
self.connect(self.ui.pushButton,SIGNAL("
clicked()"
),self.run_command)
__init__内的代码段定制界面的外观,我们引用了Qt设计器中通过UI文件编译生成的Ui_Dialog。
当然,如果不是很复杂的界面,完全可以在函数中通过手工编写来加入窗体中要显示的文本框、按钮等部件。
在这里,我们通过信号槽的机制将确认按钮与接下来执行命令的操作run_command进行连接,也就是说,当按钮被点击时,触发的事件交由run_command函数进行处理。
run_command函数的代