GoogleEarthCOMAPI1.APIClassesHerearetheclasses,structs,unionsandinterfaceswithbriefdescriptions:2.IApplicationGE接口是GoogleEarthAPI开发中最重要的一个接口,通过该接口可以控制GoogleEarth程序的开启、关闭、获取地图窗口的句柄、操作主窗体句柄,还可以进行获取地图视场照相机对象、获取GoogleEarth版本号、转换坐标等一系列复杂操作。它是基于GoogleEarthAPI程序开发的基础。2.1初始化打开GoogleEarth程序,首先要登录远程的Google地图服务器,GoogleEarth会在本地与服务器之间打开一个会话通道,然后等待十多秒钟之后,才能看见蓝黑色的地球。通常情况下,进行GoogleEarthAPI的二次开发时,自己的程序也需要走这些步骤。如何才能得知GoogleEarth已经注册好呢?Google的API中提供了几个反馈GoogleEarth是否已经登录到服务器上注册完毕的函数,通过这些函数,可以在GoogleEarth初始化之后执行自己的业务代码,操作GoogleEarth完成相应动作。而没判断是否初始化结束就直接操作GoogleEarth,可能会导致错误。这些与初始化相关的设置共有4个:IsInitialized、IsOnline、Login、Logout。2.2视场相机设置IApplicationGE接口提供了一个获得视场照相机的对象的方法GetCamera和SetCamera。SetCameraParams为调整当前GoogleEarth的视场焦点的各个参数,无须重新定义照相对象:1.ApplicationGEClassappGE=newApplicationGEClass();2.……3.privatevoidSetCamParm()4.{5.doubletmplat,tmplng,tmpalt,tmprange,tmptilt,tmpAzimuth,tmpSpeed;6.tmplat=32.0;//焦点纬度7.tmplng=118.0;//焦点经度8.tmpalt=0;//焦点高度9.tmprange=500;//视场范围10.tmptilt=45;//镜头倾角11.tmpAzimuth=0;//镜头方位角12.tmpSpeed=4;//相机移动速度13.appGE.SetCameraParams(tmplat,tmplng,tmpalt,(AltitudeModeGE)1,tmprange,tmptilt,tmpAzimuth,tmpSpeed);14.}2.3截屏设置GoogleEarth有个很有用的功能,按【Ctrl+Alt+S】组合键,可以保存当前地图的截图照片,默认是JPG格式的彩色图片。IApplicationGE接口也提供了一个SavaScreenShot方法,可以获得当前地图窗口内容的灰度图片,是黑白的。SaveScreenShot为当前地图视场范围截屏,保存成黑白效果的图片。保存的黑白照片可以定义清晰程度。2.4加载KML操作API中也提供了两个功能类似的方法--OpenKMLFile和LoadKMLData,这两个方法都可以向GoogleEarth加载KML文件,都能操作KMZ文件,但是各自略有不同。OpenKMLFile加载的是KML文件路径,LoadKMLData是KML文件内容。2.5地理要素操作获取GoogleEarth中加载的地理要素,可以采用GetFeatureByName方法,该方法通过要素名称确定要素对象,请参考IFeatureGE的name属性。2.5.1GetFeatureByName定义为按照要素的名称得到地图要素对象,返回值类型为IFeatureGE对象。其方程式如下:代码:1.ApplicationGEClassappGE=newApplicationGEClass();2.……3.///summary4.///设置某要素是否可见5.////summary6.///paramname=f_name要素名称/param7.privatevoidsetFeatureVisibility(stringf_name)8.{9.FeatureGEi_f=appGE.GetFeatureByName(f_name);10.if(i_f!=null)11.{12.i_f.Visibility=1;13.}14.}myFeature取到的是IFeatureGE对象,而不是对象名称,所以后面的代码可以直接针对myFeature进行操作,如设置是否可视。2.5.2others还有GetFeatureByHref、SetFeatureView等等2.6要素的气泡信息窗口操作地图窗口内的地理要素,绝大多数会拥有一个标记(Placemark),特别是点状要素。单击这个标记,会弹出一个信息气泡窗口,这个窗口里可以包含各种各样的信息,如图片、文字、表格、超链接等。这些信息可以通过KML定义要素的时候设置。IApplicationGE接口提供了显示和隐藏气泡窗口的两个方法,分别是ShowDescriptionBalloon和HideDescriptionBalloons。2.7屏幕坐标和地理坐标的转换问题GoogleEarth虽然谈不上是个GIS软件,但是也提供了一个初级的坐标转换方法GetPointOnTerrainFromScreenCoords,它可以把屏幕的四角及中心点转换成地理坐标。GetPointOnTerrainFromScreenCoords为取得地面上某一点的屏幕坐标。GoogleEarth很有意思,只提供了单向的屏幕坐标到地理坐标的装换。在这里screen_x和screen_y的取值都是在-1~+1的,屏幕坐标的取值如图所示。C#实例代码:1.ApplicationGEClassappGE=newApplicationGEClass();2.……3.privatevoidGetCoordinateFromScreen()4.{5.PointOnTerrainGEpt=appGE.GetPointOnTerrainFromScreenCoords(0.0,0.0);6.if(pt!=null)7.{8.doublem_lat=pt.Latitude;9.doublem_lng=pt.Longitude;10.MessageBox.Show(m_lng.ToString()+,+m_lat.ToString());11.}12.}下面是将googleearth放到一个panel当中的一个例子,显示出的当前坐标和googleEarth上显示的地理坐标是相符的。代码如下:Pointpoint=this.panel1.PointToClient(e.Location);//如果鼠标击点位置在控件内部,则说明鼠标点击了GoogleEarth视图if(this.panel1.ClientRectangle.Contains(point)){doubleratex=(double)point.X/this.panel1.Width*2-1;doubleratey=(double)(this.panel1.Height-point.Y)/this.panel1.Height*2-1;}//再将ratex和ratey两个点带入TerrainFromScreenCoords函数2.8要素文件夹操作GetMyPlaces、GetTemporaryPlaces、GetLayersDatabases2.9窗口句柄操作如果要开发一个包含GoogleEarth的程序,获得主窗口的句柄是必要的。例如,通过代码控制GoogleEarth主窗口的大小和状态这种需求。2.9.1GetMainHwnd定义:取得GoogleEarth程序主窗口的句柄。方程式:functionGetMainHwnd:SYSUINT;safecall;。C#实例代码:1.ApplicationGEClassappGE=newApplicationGEClass();2.……3.privateIntPtrgetGEHandle()4.{5.try6.{7.intGEMainWinHandle=appGE.GetMainHwnd();8.returnnewIntPtr(GEMainWinHandle);9.}10.finally{}11.}在获取了GoogleEarth的主窗口之后,有时候还需要对地图窗口进行操作,如需要移动地图窗口到用户自己的程序上。这个时候就需要获得地图窗口句柄,然后调用Windows的API来移动和设置地图窗口句柄的父窗口,通过GetRenderHwnd可以获取地图窗口的句柄。2.9.2GetRenderHwnd定义:返回GoogleEarth的地图窗口。方程式:functionGetRenderHwnd:SYSUINT;safecall;。C#实例代码:1.ApplicationGEClassappGE=newApplicationGEClass();2.……3.privatevoidbutton1_Click(objectsender,EventArgse)4.{5.try6.{7.intGEMapHandle=appGE.GetRenderHwnd();8.IntPtrmapPtr=newIntPtr(GEMapHandle);9.Apilibs.SetParent(mapPtr,plmap.Handle);10.}11.finally{}12.}在C#中调用Windows的API有点麻烦,需要引入User32.dll动态链接库,利用DllImport方法可以做到:1.[DllImport(User32.dll)]2.publicstaticexternIntPtrSetParent(IntPtrhWndChild,IntPtrhWndNewParent);关于User32.dll里面的函数,详见附录A.调用代码:ApplicationGEClassappGE=newApplicationGEClass();privatevoidbutton1_Click(objectsender,EventArgse){if(appGE.IsOnline()!=0){//{MessageBox.Show(已经登录);}//else{MessageBox.Show(尚未登录);}try{intGEMapHandle=appGE.GetRenderHwnd();IntPtrmapPtr=newIntPtr(GEMapHandle);ShowGE.SetParent(mapPtr,panel1.Handle);}finally{}}}publicclassShowGE{[DllImport(User32.dll)]publicstaticexternIntPtrSetParent(IntPtrhWndChild,IntPtrhWndNewParent);}结果如下所示:问题:1需要开启GoogleEarth软件,2没有转动放大缩小那些操作界面。2.10IApplicationGE属性2.10.1GoogleEarth版本2.10.2读取地图数据流进度1)StreamingProgressPercentage定义:反映GoogleEarth获取当前地图数据流的进度。使用方式:读(Get)。值类型:Integer。方程式:propertyStreamingProgressPercentage:IntegerreadGet_StreamingProgressPercentage;。C#实例代码:1.ApplicationGEClassappGE=newApplicationGEClass();2.……3.privatedoublegetDownloadStream