google地图学习手册.docx_第1页
google地图学习手册.docx_第2页
google地图学习手册.docx_第3页
google地图学习手册.docx_第4页
google地图学习手册.docx_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

/article/58.htm这里的Google Earth API(本文的Google Earth API和最新Google Earth API概念不同,前者是windows 程序以COM接口开发,目前的Google Earth API是通过Google Earth 插件在浏览器理开发的API函数,本文主要是讲windows 程序以COM接口开发)不同于GoogleMAP API:大家可能对于GoogleMAP API有一些印象了而且网上对于GoogleMAP API的应用也有很多比如/那么什么是GoogleEarth API呢?GoogleEarth API能作什么呢?下面我就结合我编的一些东西讲讲GoogleEarth API Google Earth API Keyhole 1.0 Type Library当你要使用GoogleEarth API时首先要在工程里引用他,以VB为例,在“工程”菜单中选择“引用”,如果你已经安装了GoogleEarth,那么引用栏里会有“Keyhole 1.0 Type Library ”而它是定位于GoogleEarth的主程序的。引用完毕后,打开对象浏览器,你就可以看到GoogleEarth API的类和函数及属性了!GoogleEarth API有4个类,每个类下面有多个函数及属性 下面将我常用的函数的说明写到下面:Class KHFeatureProperty hasView As Long 只读 暂时还不知道什么意思,没用过,哪位高手能给个解释Property visibility As Long 地标的可视选项Class KHInterface Property autopilotSpeed As Double GE的自动飞行速度Function currentView(terrain As Long) As KHViewInfo GE的当前视图Property currentViewExtents As KHViewExtents 只读Function getFeatureByName(name As String) As KHFeatureFunction getPointOnTerrainFromScreenCoords(screen_x As Double, screen_y As Double) As Double() Sub LoadKml(kmlData As String) 导入KML字符串,不支持中文Sub OpenFile(fileName As String) 打开地标文件Sub QuitApplication() 退出程序Sub SaveScreenShot(fileName As String, quality As Long) 保存截图Sub setFeatureView(feature As KHFeature, speed As Double)Sub SetRenderWindowSize(width As Long, height As Long)Sub setView(view As KHViewInfo, terrain As Long, speed As Double) 用KHViewInfo设置视角范围 Sub setViewParams(lat As Double, lon As Double, range As Double, _ tilt As Double, azimuth As Double, terrain As Long, speed As Double)用数值设置视角范围 Property streamingProgressPercentage As Long 只读 数据传输进度百分比Class KHViewExtentsproperty east As Double 只读Property north As Double 只读Property south As Double 只读Property west As Double 只读Class KHViewInfo Property azimuth As Double 方位角Property latitude As Double 纬度Property longitude As Double 经度Property range As Double 范围Property tilt As Double 倾角利用这些函数,可以对GE进行部分 控制,实现一些小的功能,比如在我的地标管理器中就利用了GoogleEarth API实现了地标的隐藏与显示。 Google公司已经将Google COM API开放,这样我们就可以通过开放的API来对GoogleEarth进行操作了,比如控制当前视图的高度、中心经纬度,保存当前图片等等。下面是Google COM API的网址:/comapi/那么,VC程序员如何使用这些API来控制GoogleEarth呢?下面我们编写一个简单的程序来说明对Google COM API的使用。源代码下载点击下载此文件 首先用VC建立一个基于Dialog的工程(这个不用教了吧?),工程名为ControlGe,工程建好后,下面就是把Google提供的类添加到工程里边来。Ctrl+W,打开类向导页面,点击“Add Class”按键,选择“From a type library”,然后到安装GoogleEarth的目录下,找到googleearth.exe文件,点击“打开”按键。这时会弹出一个框来确认产生Google的类,直接点击“OK”键,这是会生成两个文件加入的工程中:googleearth.h和googleearth.cpp,里面就是我们想要的类了。GoogleEarth的类已经生成了,那我们如何来用它们呢?各位看客不用着急,我们一步步来。首先,我们得调用一下:CoInitialize(NULL);初始化一下COM库了,这个函数可以在ControlGe.cpp文件中的InitInstance()函数里面调用。然后呢,我们再在ControlGeDlg.h中定义一个类成员变量:IApplicationGE m_geApplication;顺便说一下,IApplicationGE可是Google COM API最主要的一个接口了,从它提供的操作数量就可以看得出来。好了,离成功不远了,控制的变量也定义了,下面就开始用它来控制GE吧。那么我们如何将刚定义的变量取得对GE的控制权呢?费话少说,首先在ControlGeDlg.cpp文件中定义一个变量:static const CLSID CLSID_ApplicationGE = 0x8097D7E9,0xDB9E,0x4AEF, 0x9B,0x28,0x61,0xD8,0x2A,0x1D,0xF7,0x84;然后在OnInitDialog()中加入以下代码:m_geApplication.CreateDispatch(CLSID_ApplicationGE);呵呵,现在GE就归你操控了!我们试着做个简单的操作吧,添加一个按键,然后添加按键的点击处理函数,在函数中加入以下代码:CString strFileName;static char BASED_CODE szFilter = jpg Files (*.jpg)|All Files (*.*)|*.*|;CFileDialog dlgFile(FALSE, jpg, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, szFilter, this);if (dlgFile.DoModal() = IDOK)CWaitCursor wait;strFileName = dlgFile.GetPathName();m_geApplication.SaveScreenShot(strFileName, 100);试试看,这是将当前GE的地图给保存成一个jpg格式的图片,只可惜只能保存成黑白图片,google还是给自己留了一手的。可能上面的代码运行会有些问题,也许是你的GE版本太低了,也许是你的Google COM未注册,注册一下就可以了,Google对注册的说明:If, for some reason, the Google Earth COM API needs to be registered again, you can execute GoogleEarth.exe with /RegServer as a command line argument. For instance, assuming GoogleEarth.exe is located in C:Program FilesGoogleGoogle Earth, the following command line would register Google Earths COM API: C:Program FilesGoogleGoogle Earthgoogleearth.exe /RegServer To unregister Google Earths COM API, execute the following command: C:Program FilesGoogleGoogle Earthgoogleearth.exe /UnregServer好了,我们下面就可以对照Google COM API的文档来试一试对GE的控制操作了。下面我再来演示一下如何把视图切换到指定地方,添加如下代码:ICameraInfoGE geCamera;geCamera.AttachDispatch(m_geApplication.GetCamera(TRUE);geCamera.SetRange(800);geCamera.SetFocusPointLongitude(113.972522);geCamera.SetFocusPointLatitude(22.561294);m_geApplication.SetCamera(geCamera, 1.5);执行以上代码后,GE就会将视图切换到。嘿嘿,到俺家了。OK,我要下班回家了,就写到这儿吧,其它功能大家对照着google的文档再试试,要是谁知道上传附件的方法,麻烦告诉我一下,我把上面示例的代码上传上来。去年,水手版主给大家介绍过GE的API,详贴见这里,本贴对 KHInterface 就不做过多说明了:/Announce/Announce.asp?BoardID=100&ID=21506从GE API的官网上看,现在这些API已经更新了,原来大家使用的 KHInterface 这个主类,现在已经基本被 ApplicationGE 这个主类给取代了。GE API的官网:/comapi/index.html以VB.Net为例(下同),使用GE的API还是很简单的,在你打开的项目中,选择 项目-添加引用,然后找到 GoogleEarth.exe 选择添加,就会在你的 Debug 目录下生成一个 Interop.EARTHLib.dll 。你还可以通过 视图-对象浏览器 来查看它的组成情况。主要有以下五个类:ApplicationGE 主类,基本操作都在这里,比 KHInterface 更非丰富,但少了两个重要的函数,CurrentView(当前的视角),SetView(设置视角,比如打开GE时可以定位到指定的视角)FeatureGE KML的标签类FeatureCollectionGE 标签集类,是 FeatureGE 集合。ViewExtentsGE (只读)边界集类,可以获得当前屏幕内四个边的经纬度值。CaremaInfoGE 拷屏类,但目前没啥大用,黑白照片。此外还有几个比较重要的类:AnimationControllerGE 针对TimeStamp时间轴的,可以播放、暂停等。PointOnTerrainGE 根据屏幕的点获得的经纬高度值就放在这个类里,可以看作一个数组。SearchControllerGE 查询GE内置地址库的查询类(不是查KML文件的)其他的还有,大家可以一起研究一下。介绍失误的地方,请大家及时指正。程序调用:1、Imports EARTHLib需要在 Public Class Form 之前声明引入。2、Public khapp As EARTHLib.ApplicationGE在 Form 内定义,本人一般定义为全局,方便使用。3、khapp = New ApplicationGE在按钮事件内首先要赋值为 New,每次都需要,否则容易出问题。如果找不到,返回值是 IsNothing()=True,其他的类也相同,为防止程序出错,找不到时可用 IsNothin进行判断处理。4、为防止出现错误,可以用 Try 进行错误截取,使用 ex.tostring 获得错误信息,然后在 Catch 后面 return 。下面开始介绍 FeatureGE 类的函数、方法或者值:Function GetChildren() As EARTHLib.FeatureCollectionGE 标签的包含的子标签,返回值定义到 FeatureCollectionGE 中(多个)Function GetParent() As EARTHLib.FeatureGE 标签的父标签(单个)ReadOnly Property HasView() As Integer 终于搞清楚这是什么了,其实就是 ,如果没有这个属性,HasView =0,有就是1。没有时GE是不会自动导航到你指定的地标,即使你已经找到了它,在这种情况下,至今没找到好方法通过API导航到已找到的地标。这是本人觉得Google最可恶的地方,其实在GE中,不管你有没有 ,无论你是 目录 还是 地标,它都会以最合理的方式包含其中的所有地标。大家大概没多少人习惯加上这个 ,所以在调用时就会出现有时成功,有时不成功,让人恼火不已。ReadOnly Property Highlighted() As Integer 和 Highlight 加亮ReadOnly Property Name() As String 标签的Name值ReadOnly Property TimeInterval() As EARTHLib.TimeIntervalGE 没仔细研究,大概跟定时有关系Property Visibility() As Integer 比较有用的值,对应于KML中的 ,0不显示,1显示。ApplicationGE 主类:Property AutoPilotSpeed() As Double 从一个地标转到另一个地标时的速度,从0-5,默认只有 0.119Property ElevationExaggeration() As Double 和GetPointOnTerrainFromScreenCoords有关Function GetFeatureByHref(ByVal href As String) As EARTHLib.FeatureGE 就是 ,这个id的值test就是Href,String= 包含路径的文件名#test(跟网页里查tag的方法相同),具有唯一性,但估计没多少人喜欢写这个id,所以还是好看不好用。也没测试出来没有的情况下GE是如何保证唯一的。Function GetFeatureByName(ByVal Name As String) As EARTHLib.FeatureGE 目前只能用这个,但这个又不具有唯一性,如果两个名称相同,永远只能找到第一个。这是GE的第二个可恶之处,这么方便的功能,如果放到 FeatureCollectionGE 里,那该多好啊,就可以继续查询下一个了。Function GetHighlightedFeature() As EARTHLib.FeatureGE 没发现什么用途Function GetLayersDatabases() As EARTHLib.FeatureCollectionGE 获得GE左下角的数据库,这次总算放到标签集里去了Function GetMainHwnd() As Integer 和 Function GetRenderHwnd() As Integer ,前一个是主程序的句柄号,后一个是 GE视窗 的句柄号。Google挺好玩的,连这个都老老实实地告诉大家了,连Spy+都省了,呵呵。Function GetTemporaryPlaces() As EARTHLib.FeatureGE GE临时目录,可以通过 GetChildren() 继续查找打开文件的名字等。Function GetMyPlaces() As EARTHLib.FeatureGE GE里我的目录,用途同上。Function GetPointOnTerrainFromScreenCoords(ByVal screen_x As Double, ByVal screen_y As Double) As EARTHLib.PointOnTerrainGE 给出屏幕的点X,Y坐标,转成经纬高三个坐标值,ElevationExaggeration为0时高度为0,为1时高度为实际值。更正计算公式,终于可以得到准确的X、Y点坐标了,跟地图下面标的一模一样了:X、Y代表装GE的控件的本地坐标(相对坐标),不是屏幕的绝对坐标,可以通过 PointToClint 函数获得装GE控件的X、Y坐标,然后转换成GE要求的平面坐标系的坐标值,和屏幕坐标值相比,Y轴的算法是相反的,也就是说,GE的坐标系,是以GE地球界面的中间点为原点(0,0),X轴从-1到+1,Y轴从-1到+1,公式转换如下:( X - W

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论