GoogleEarth二次开发(资料一)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
GoogleEarth二次开发难点和技巧
一、基本步骤
1、安装GoogleEarth程序
2、对GoogleEarth activex控件进行注册(googleearth.exe /regserver)
3、在开发环境中引用googleearth activex
二、开发方式
针对GE的开发有两种方式,一种是基于GE的com API,一种是基于KML。基于Com API的开发方式主要用来控制GE的视角、实现动画效果,而基于KML的开发方式主要用来生成地理要素,实现数据的动态更新等。在实际应用中,需要结合这两种开发方式,这样才能得到比较理想的效果。
1、基于ComAPI的开发
GE 公布的API目前是1.0a版,数量比较少,所能实现的功能也不多,在实际开发中主要用来加载KML数据、控制视角和实现动画播放。
A、加载KML数据
IApplicationGE. OpenKmlFile(kmlFilePath),加载指定的kml文件到GE中;
IApplicationGE.LoadKmlData(kmlData),加载kml文本流到GE中
B、控制视角
IApplicationGE. SetCamera(ICameraInfoGE,double ),设置GE当前的视角,第一个参数为视角参数,第二个参数为当前视角飞到这个视角的速度(取值范围为0--5);
IApplicationGE .SetFeatureView(IFeatureGE,double),从当前视角飞到指定要素处的视角,第一个参数为指定的要素,这个要素的视角由KML中的
GE中实现动画效果有两种方法,第一种是通过KML中的
ITourControllerGE. PlayOrPause ()播放某个父要素下的子要素,或暂停播放
2、基于KML的开发
GE实际上就是一个浏览器,被浏览的数据是KML,KML和GML、SVG等表示矢量图形的标准类似,不过他所描述的是三维的数据结构,可以认为KML是基于XML的一种三维矢量图形标准。
KML的结构组成可以参考(/apis/kml/documentation/kml_tags_beta1.html),从其结构图中可以看出,KML描述地物的方式和通用的GIS相类似,主要由要素、样式、视角、动画等部分组成。下面我说明KML中几个比较有难度的技术。
A、LOD技术
LOD(Level Of Detail)地图分级加载技术,利用LOD技术可以在PC机上浏览海量的影像地图数据。有GIS平台使用经验的都知道,我们可以设置某个图层在某个比例尺范围之内显示,小于或者超过这个范围则不显示。LOD技术非常类似,比如说,在视角高度很大的时候,我只加载1:5000W的影像数据,在视角高度很小的时候,我只加载1:1000的数据,这样的话,视角高度越低,我们所能看到的地物越详细。
在KML中用来实现LOD技术的是
B、动态数据更新技术
在GPS车辆监控系统中,需要对实时数据进行更新。利用KML中的
C、动画播放技术
KML中的< TimeSpan >或者
KML中的几何对象都包含三个属性:longitude、latitude、altitude,利用基本的几何图形(如点、线、面),加上高程数据,我们可以构建一些简单的三维图形。如果需要构建复杂的三维模型,可以借助三维建模工具,如3D max,google sketch,AutoCAD,然后将得到的三维模型转成dae格式即可,这样就可以直接在GE中调用这些三维模型了(利用
三、几个技巧
1、如何将GE的地图控件引用到自定义的窗体中?
在一般情况下,我们针对GE的开发都只能基于GE程序本身来进行,所有的操作都必须在GE本身的框架上进行,不能将GE的地图控件像一般可拖放的控件来操作。怎么解决这个问题呢,这里要用到一下Win API,将GE中的地图部分hook过来。
this._GEMainHandler = (IntPtr)this._googleEarth.GetMainHwnd();//获取GE程序的句柄SetWindowPos((int)this._GEMainHandler, HWND_BOTTOM, 0, 0, 0, 0, SWP_NOSIZE +
SWP_HIDEWINDOW);//将GE窗体移到屏幕可视范围之外,使之不可见
this._GEHrender = (IntPtr)_googleEarth.GetRenderHwnd();//获取GE的地图控件的句柄
this._GEParentHrender = GetParent(this._GEHrender);//获取GE地图控件的父控件的句柄
PostMessage((int)this._GEParentHrender, WM_HIDE, 0, 0);//发送消息到地图控件的父控件,使之不可见
SetParent(this._GEHrender, customControl.Handle);//将GE地图控件的父控件设置为我们指定的控件
使用上面的代码,我们就可以将GE中的地图控件抢夺到我们自己的winform中。(参考utilities\GEHandler.cs)
2、如何为GE提供动态数据?
为GE提供动态数据,需要用到上面介绍的KML动态数据更新技术。在这里提供一个比较好的解决方案,架构动态数据提供服务器。这有点类似于B/S架构,browser就是GE,Server就是我们要架设的服务器,Server提供的是动态的符合KML规范的数据,GE间隔一定时间去服务器上获取一下数据。
3、如何得到GE中的指定要素?
当我们需要对某个要素进行操作时,首先必须得到这个要素。当KML文件被加载进入GE中后,这个文件也被当作一个要素看待,文件中的这个几何图形、图片、链接等都被当成这个要素的子要素看待。在GE中获取某个要素只有两个途径:通过要素名称和通过要素的链接地址
GetFeatureByName(name)通过要素名称来得到要素
GetFeatureByHref(href)通过链接地址来得到要素(得到的是从链接地址中代表的内容)
一、基本步骤