首页 静态地图服务Google

静态地图服务Google

举报
开通vip

静态地图服务Google第X章静态地图服务——GoogleStaticMapsAPI................................................................11.GoogleStaticMapsAPI概述.............................................................................................12.GoogleStaticMapsAPI语法格式..........................

静态地图服务Google
第X章静态地图服务——GoogleStaticMapsAPI................................................................11.GoogleStaticMapsAPI概述.............................................................................................12.GoogleStaticMapsAPI语法格式.....................................................................................32.1GoogleStaticMapsAPI常用参数..........................................................................32.2GoogleStaticMapsAPI的支持服务......................................................................43.GoogleStaticMapsAPI示例.............................................................................................73.1开发环境简介.........................................................................................................73.2定制静态地图应用...............................................................................................12第X章静态地图服务——GoogleStaticMapsAPI导读:本章介绍了静态地图GoogleStaticMapsAPI的常用函数、API调用方式以及使用静态地图API的开发示例。1.GoogleStaticMapsAPI概述GoogleMaps提供了强大的地图调用函数,但是对于普通的用户来说,至少需要了解一定的JavaScript语法才可以用好GoogleMaps所提供的各种功能。但对于部分用户来说,仅希望在自己的站点嵌入一幅静态的地图示意图即可,而并不需要GoogleMaps提供的缩放、拖拽等Ajax功能。那么,对于这些用户,不必编写JavaScript代码就可以在站点嵌入静态地图的GoogleStaticMapsAPI便是最好的选择。静态地图API极大地方便了用户调用GoogleMaps提供的地图图片,GoogleMaps还为用户提供了一个静态地图的辅助生成器(http://gmaps-samples.googlecode.com/svn/trunk/simplewizard/makestaticmap.html),帮助用户在不使用动态脚本的情况下就可以定制一幅所需的静态地图图片。在辅助生成器中,可以通过地址译码查找所需的地图位置,定义静态地图图片的缩放尺度、图片大小、地图类型、标识点位置以及标注显示的大小、颜色和显示的字母。设定之后用户定制的静态地图图片会实时刷新,并给出得到图片的预览和图片调用的URL地址。用户复制地址后,便可以轻易的将所需地图图片嵌入到页面中显示。目前静态地图支持GoogleMaps所提供的四种地图类型,包含行政区划图(Map)、卫星影像(Satellite)、混合模式(Hybrid)以及地形地貌图(Terrain)。比方说我们在搜索框输入Beijing来调用北京的静态地图图片,如果需要设定路径,还可以在地图上通过单击来绘制一条需要显示的路径。图:查找北京所对应的静态地图图片接下来设定返回图片的大小为500*300,标记点使用橙色,显示字母A,设定好之后,就可以在下方的浏览窗口中得到一幅对应的静态地图图片。图:GoogleMaps静态地图辅助生成器中得到的图片需要注意的是,调用GoogleMaps静态地图图片同样需要申请地图的API_Key,申请的地址为:http://code.google.com/apis/maps/signup.html,API_Key与使用GoogleMaps的授权码是相同的,在填入使用者申请的API_Key之后,刚才我们所调用的静态地图图片对应的访问地址如下:http://maps.google.com/staticmap?center=39.908173,116.397947&markers=39.908173,116.397947,orangea&zoom=13&size=500x300&key=YOUR_KEY_HERE通过静态地图的调用API,可以进一步增加电子地图的应用范围,同时也使得获得地图图片的方法变得更为简洁直接。2.GoogleStaticMapsAPI语法格式2.1GoogleStaticMapsAPI常用参数GoogleStaticMaps的图像都是通过特定的URL地址返回,在URl请求中,用户可以指定请求的位置、地图大小、缩放级别、地图类型以及标记点的设置。常见的GoogleStaticMaps请求地址串可以表示如下:http://maps.google.com/staticmap?center=经纬度&markers=经纬度,颜色&zoom=缩放级别&size=尺寸&key=申请的key值由于地图图片请求是由标准HTTP提交,所有参数都需要使用&字符作为间隔,其中某些参数是可选的。地址串中所附带的参数及其取值如下:zCenter:如果没有图标出现在地图中央的话,需要用cent来定义地图的中心位置,后面所跟的纬度和经度需要使用逗号作为分隔;zZoom:用以定义地图的缩放级别,可以通过数字选择0至19的缩放级别;zSize:用以定义地图图像的大小,分别用横向和纵向的像素来表示;zFormat(可选):定义生成的影像格式,默认情况下,静态地图API将生成GIF格式的图像,其他可选的格式类型为JPEG和PNG类型。相对来说,GIF和PNG格式包含的图像细节更多,但JPEG格式的压缩比更大;zMaptype(可选):可以选择的地图类型包含有卫星影像、地形图、混合地图以及适于便携设备的地图,在默认情况下,我们获得的是正常的行政交通图;zMarkers(可选):用来定义附加在地图图层之上的一个或多个地点标记,标记之间可以使用标记分隔符(|)进行划分;zPath(可选):通过两点或多点的链接来定义显示在地图之上的道路路径,同样,一系列的点之间也是使用标记(|)来进行分隔;zFrame(可选):为返回的地图图像添加一个可以设定颜色的边界;zKey:填入为站点申请的GoogleMapsAPI授权码,这个APIKey与使用GoogleMaps时的授权码相同,可以在Google开发者站点免费申请。在使用GoogleStaticMapsAPI时,我们还需要注意的是,目前GoogleStaticMapsAPI的查询调用限制为每天1000次请求,这样的设定是为了限制用户大量获取静态地图的图片而移作他用,如果发现有滥用API获取静态图片的站点,Google可能会暂停对站点地图图片请求的响应。2.2GoogleStaticMapsAPI的支持服务我们在使用GoogleStaticMapsAPI来获取地图图片的时候,往往仅知道请求位置的地址,而对其所处的经纬度信息并不了解,这样的话,我们可以通过Google提供的地址译码(Geocoding)服务来将用户输入的地址转换成为对应的经纬度坐标。在GoogleMaps的API之中已经包含了地址译码功能,使用者可以在HTTP请求中调用GClientGeocoder对象来完成地址译码的操作。在Google提供的官方示例(http://code.google.com/apis/maps/documentation/examples/geocoding-simple.html)中,我们可以使用如下的代码段来完成输入地名的地址译码操作,首先在初始化时我们通过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中实现地址译码仅需要交请求提交到地址:http://maps.google.com/maps/geo?,并其后添加上相对应的浏览器请求参数,常用的请求参数如下:zq(必需)—后面跟将要译码的地址字串;zKey(必需)—申请的GoogleAPI授权码;zoutput(必需)—生成输出文件的格式,可选的格式为json(默认)、xml、kml、csv;zgl(可选)—可以用来指定国家代码;举个例子,我们通过请求得到Google总部山景城的经纬度位置如下:http://maps.google.com/maps/geo?q=1600+Amphitheatre+Parkway,+Mountain+View,+CA&output=xml&key=现在我们得到的输出格式是XML文档的形式,代码如下:1600AmphitheatreParkway,MountainView,CA200geocode
1600AmphitheatrePkwy,MountainView,CA94043,USA
USCAMountainView1600AmphitheatrePkwy94043-122.085121,37.423088,0
如果不指定输出格式,则是按照默认的JSON格式将内容进行输出,上述内容的JSON格式输出后,我们在JSON格式化工具(http://lab.gracecode.com/format_json/)中查看时内容如下:图:JSON格式化后查看包含的内容除此之外,在GoogleMaps提供的服务之中,还包含有XML和数据解析服务、使用Flash的方式展现街景图的示例,以及GoogleEarth浏览器插件的支持,更多的细节可以参照GoogleMaps提供服务的页面:http://code.google.com/apis/maps/documentation/services.html如果使用Ruby和Rails进行地图Mashup应用的开发,可以使用名为StaticGmaps(http://static-gmaps.rubyforge.org/)的gems封装,为GoogleStaticMapsAPI提供了Ruby的访问接口,帮助用户简化开发过程中的工作量。3.GoogleStaticMapsAPI示例3.1开发环境简介在了解GoolgeStaticMapsAPI的基本函数的使用之后,下面就让我们着手制作一个可以调用静态地图的小程序,应用所要实现的功能描述如下:z首先需要设计一个包含输入框,确认按钮和静态地图图片显示面板的应用程序界面;z应用启动后,用户可以在文本框中输入所要查找的地名,点击确定按钮之后,组合静态地图的URL请求串,取得请求的静态地图图片,显示在窗体之中,并将图片保存在程序运行的当前位置;简单的需求描述如上,让我们小步快跑,看看这样嵌入GoolgeStaticMaps的应用是如何实现的。为了尝试一下新的技术并保持应用的趣味性,在这里我们使用Python语言、PyQt图形库以及NetBeansIDE的NBPython编程环境来完成这个调用静态地图的小例子。使用Python语言和Qt图形库开发的应用具备跨平台的特性,在这里我们使用的是Windows开发环境,开发所使用的软件环境搭建如下:zNBPythonMilestone6https://nbpython.dev.java.net/zPython2.5.2Windowsinstallerhttp://www.python.orgzPyQt(PyQt-Py2.5-gpl-4.4.3-1.exe)http://www.riverbankcomputing.co.uk/在开始之前,先简单介绍一下Qt以及程序中将使用的PyQt图形库。Qt是一套成熟稳定的GUI工具箱,Qt跨平台的图形库可以运行在Windows、Linux、MacOSX以及多种便携式设备平台之上。Google著名的GoogleEarth应用的界面也是使用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进行应用开发所有需要的要素。主要包含的项如下:zPyQt库zQt库zQtDesigner(界面设计器)zQtAssistant(编程助手)zQtLinguist(国际化翻译工具)zpyuic4(ui界面文件的编译器)zQScintilla(Scintilla编辑器类的Qt接口)编程环境使用了NetBeans的PythonIDE,NBPython可以作为一个插件加入到NetBeans环境之中,也可以单独下载46MB大小的NetbeansPython专用IDE,在这个IDE中,计划添加的Python支持功能有:z语法高亮显示z代码补全zPython与Jython的支持zPyUnit单元测试支持zPython代码断点调试zPython类库管理zPython控制台zPython脚本执行zPython版本管理NetBeans的PythonIDE同样提供了不同平台下的安装版本,在Windows环境下的运行如下图所示。图:NetBeans的PythonIDE使用Qt进行跨平台GUI应用开发的优势之一就是方便的Qt界面设计器,使用QtDesigner可以很快的设计出美观大方的程序窗体布局。下面我们打开QtDesigner,新建一个对话框,之后在对话框中添加一个命名为Address的Lable标签(QLable),一个文本输入框(QLineEdit)以及一个确定按钮(QPushButton),在应用程序的窗口主体,也加入一个Lable标签,用于显示从Google获得的静态地图。之后使用栅格布局(GridLayout)调整各个部件的位置。设计好之后的对话框如下图所示。图:Qt设计器中进行应用程序窗体设计在使用Qt设计器的同时,我们还可以随时点击“窗体—预览”(Ctrl+R)来预览查看当前窗体的模样。窗体的预览如下图所示。图:Qt设计器中预览设计的窗体保存之后,Qt设计器为我们生成了一个拓展名为.ui的文件。在Qt中,UI文件以XML的格式记录了QTDesigner所生成界面的相关内容,包含在UI文件中的内容如下:zWidget属性,包含的元素(如按钮、文本框、下拉列表等等),Layout布局方式等相关属性;z引用的头文件(使用C++时会编译生成头文件);z变量;z槽(Slot);z函数;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解释器的路径,如下图所示。图:IDE中设置Python解释器路径3.2定制静态地图应用下面我们在NetBeans的PythonIDE中新建一个Python工程,点击创建工程后如下图所示。图:新建Python工程输入工程的名称为staticmap,PythonIDE会为我们创建名为staticmap.py的代码文件,并将其设定为主文件,如下图所示。图:设定工程名称和存储位置下面我们来为生成的主文件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)#createconnectionself.connect(self.ui.pushButton,SIGNAL("clicked()"),self.run_command)__init__内的代码段定制界面的外观,我们引用了Qt设计器中通过UI文件编译生成的Ui_Dialog。当然,如果不是很复杂的界面,也完全可以在函数中手工编写来加入在窗体中要显示的文本框、按钮等部件。在这里,我们通过信号槽的机制将确认按钮与接下来执行命令的操作run_command进行连接,也就是说,当按钮被点击时,触发的事件交由run_command函数进行处理。run_command函数的代码如下:defrun_command(self):addr=str(self.ui.le.text().toUtf8())self.getGeoCode(addr)在函数中取得从输入栏获取的地址作为查询条件传递给getGeoCode函数,QLineEdit.text()回传的QString字符串与Python字串不同,可以转成Unicode字串后再赋值给字符串变量。getGeoCode函数取得坐标的代码段如下:defgetGeoCode(self,addr):geo_url='http://maps.google.com/maps/geo?'+urllib.urlencode({'q':addr})+'&output=csv&key='+google_keytry:g=urllib.urlopen(geo_url)ret=g.read().split(',')if(ret[0]!='200'):QMessageBox.warning(None,"Error",addr+"notfound",QMessageBox.Yes)else:self.showMap(ret[2],ret[3])excepturllib.HTTPError:QMessageBox.warning(None,"Error","Httperror",QMessageBox.Yes)因为我们在静态地图请求中,输入项为请求地址的地名,需要通过Google提供的地址译码功能将地名对应的位置转换为经纬度。所以我们使用的URL字串为“http://maps.google.com/maps/geo?”后面带的参数是查询的地址,output是输出的格式,目前的输出格式支持xml、kml、csv、Json等四种格式,我们在这里使用的是以逗号分隔的csv格式,后面再添加上之前申请的GoogleMapsAPIKey就可以得到解析后的地址坐标。在urllib库的支持下,我们得到请求位置的地址坐标,如果没有找到地址对应的坐标,则使用QMessageBox来弹出一个消息用以提示用户。如果找到地址对应的坐标,就将经纬度坐标作为参数传递给函数showMap来显示对应的地图。函数showMap的代码如下:defshowMap(self,lat,lang):stmap_url='http://maps.google.com/staticmap?center='+lat+','+lang+'&markers='+lat+','+lang+',red&zoom=14&size=512x512&maptype=mobile&key='+google_keyurllib.urlretrieve(stmap_url,"stmap.gif")image=QImage("stmap.gif")self.ui.imageLabel.setPixmap(QPixmap.fromImage(image))self.ui.imageLabel.adjustSize()在正确取得坐标后,我们将纬度(lat)和经度(lang)传递给showMap函数,用以组装请求静态地图的字符串。在这里定义的缩放等级为14,在GoogleMaps中缩放的范围是0到18,0级即为整个地球,18级为显示最为精细的地图,但在美加等国之外,往往无法获得最为精细的地图。取回地图的图片大小设置为512x512像素,同时512x512像素也是可以获取的最大的图片。MapType种类设置为mobile,比较适合在便携式设备上查看,此外还可以在地图上放置自定义的图标,此处就采用在图片中心显示的默认图标。得到的静态地图使用urllib.urlretrieve()函数保存为名为stmap.gif的图片,之后将图片填充到imageLabel所对应的显示标签之中。这样,取得的地图就可以显示在程序对应的视窗之上。下面我们在NetBeans中点击运行(F6)来启动应用,在弹出的对话框中,输入LosAngeles的简称LA,点击确定之后,就可以在程序中获取到Google静态地图返回的地图图片如下所示。图:在程序中调用Google的静态地图应用程序完整的代码清单参见:importosimportsysfromPyQt4.QtCoreimport*fromPyQt4.QtGuiimport*importurllibfromui_staticmapimportUi_Dialoggoogle_key='YOU_API_KEY_HERE'defmain():app=QApplication(sys.argv)w=MyWindow()w.show()sys.exit(app.exec_())classMyWindow(QDialog):def__init__(self,*args):QDialog.__init__(self,*args)self.ui=Ui_Dialog()self.ui.setupUi(self)#createconnectionself.connect(self.ui.pushButton,SIGNAL("clicked()"),self.run_command)defgetGeoCode(self,addr):geo_url='http://maps.google.com/maps/geo?'+urllib.urlencode({'q':addr})+'&output=csv&key='+google_keytry:g=urllib.urlopen(geo_url)ret=g.read().split(',')if(ret[0]!='200'):QMessageBox.warning(None,"Error",addr+"notfound",QMessageBox.Yes)else:self.showMap(ret[2],ret[3])excepturllib.HTTPError:QMessageBox.warning(None,"Error","Httperror",QMessageBox.Yes)defshowMap(self,lat,lang):stmap_url='http://maps.google.com/staticmap?center='+lat+','+lang+'&markers='+lat+','+lang+',red&zoom=14&size=512x512&maptype=mobile&key='+google_keyurllib.urlretrieve(stmap_url,"stmap.gif")image=QImage("stmap.gif")self.ui.imageLabel.setPixmap(QPixmap.fromImage(image))self.ui.imageLabel.adjustSize()defrun_command(self):addr=str(self.ui.le.text().toUtf8())self.getGeoCode(addr)if__name__=="__main__":main()Google静态地图的功能的发挥这只是一小部分,感兴趣的朋友还可以对程序进一步拓展,为应用加上地图缩放等级的调整,手动位置的调整,甚至可以加入静态地图上进行路径设置等功能。Google静态地图的使用,为地图图片的调用提供了简便快捷的途径,更多的应用和说明可以参考Google官方提供的StaticMapsAPIDeveloper’sGuide(http://code.google.com/apis/maps/documentation/staticmaps/),通过静态地图为自己的站点或应用添加更多有趣的内容。
本文档为【静态地图服务Google】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
个人认证用户
中式烹调师
暂无简介~
格式:pdf
大小:636KB
软件:PDF阅读器
页数:18
分类:交通与物流
上传时间:2022-09-21
浏览量:0