全球中文玩家俱乐部 Chinese players club of the Global .

侠外游戏论坛

 找回密码
 立即注册
快捷导航
搜索
视听
视听
图片
图片
段子
段子
小说
小说
查看: 371|回复: 3
打印 上一主题 下一主题
收起左侧

[闲聊页游] [谷歌地图官网]google地图学习手册

[复制链接]

3202

主题

7529

帖子

4万

积分

ミ侠外护法ミ

Rank: 7Rank: 7Rank: 7

  • 威望
    0 点
    银子
    20325 两
    武功
    15121 阶
    元宝
    0 锭
    精华
    0
  • 跳转到指定楼层
    俺是撸主
    发表于 2021-1-2 05:43:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

    马上注册,结交更多侠客,享用更多功能,让你轻松玩转侠外论坛。

    您需要 登录 才可以下载或查看,没有帐号?立即注册

    x


    这里的 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 KHFeature Property 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 KHFeature Function getPointOnTerrainFromScreenCoords(screen_x As Double, screen_y As Double) As Double() Sub LoadKml(kmlData As String) 持中文 Sub OpenFile(fileName As String) Sub QuitApplication() 打开地标文件 退出程序 导入 KML 字符串,不支 只读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 KHViewExtents property 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 的网址: 那么,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 中定义一个类成员变量: IApplicationGEm_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 就归你操控了!我们试着做个简单的操作吧,添加一个按键,然后添加按键的点击处 理函数,在函数中加入以下代码: CStringstrFileName; static char BASED_CODE szFilter[] = "jpg Files (*.jpg)|All Files (*.*)|*.*||"; CFileDialogdlgFile(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 还是给自己留了一手的。

    以上内容就是[谷歌地图官网]google地图学习手册的相关内容介绍,喜欢侠外游戏论坛的朋友可以关注我们。
                  1234下一页
    这里是你的个性签名位置,可在“设置”-“个人信息”-“个人签名”处修改。
    沙花按摩
     楼主| 发表于 2021-1-2 05:44:00 | 只看该作者
    可能上面的代码运行会有些问题,也许是你的 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 Files\Google\Google Earth, the following command line would register Google Earth's COM API:"C:\Program Files\Google\Google Earth\googleearth.exe" /RegServerTo unregister Google Earth's COM API, execute the following command:"C:\Program Files\Google\Google Earth\googleearth.exe" /UnregServer好了,我们下面就可以对照 Google COM API 的文档来试一试对 GE 的控制操作了。
    下面我再来演示一下如何 把视图切换到指定地方,添加如下代码: ICameraInfoGEgeCamera;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 就不做过多说明了: ;ID= 21506 从 GE API 的官网上看,现在这些 API 已经更新了,原来大家使用的 KHInterface 这个主类,现在已经基本被 ApplicationGE 这个主类 给取代了。



    GE API 的官网:  以 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(ByValhref As String) As EARTHLib.FeatureGE 就是 , 这个 id 的值 test 就是 Href, String= 包含路径的文件名#test(跟网页里查 tag 的方法相同),具有唯一 性,但估计没多少人喜欢写这个 id,所以还是好看不好用。

    以上内容就是[谷歌地图官网]google地图学习手册的相关内容介绍,喜欢侠外游戏论坛的朋友可以关注我们。
                  上一页1234下一页
    这里是你的个性签名位置,可在“设置”-“个人信息”-“个人签名”处修改。
    回复 支持 反对

    使用道具 举报

    板凳捶腿
     楼主| 发表于 2021-1-2 05:44:35 | 只看该作者



    也没测 试出来没有的情况下 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(ByValscreen_x As Double, ByValscreen_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 - Width/2 ) / Width * 2( Hight/2 - Y ) / Hight * 2注: Y 均是从 0 开始计算, X、 然后到 Width 或者 Hight -1 为最大值。
    (原来是从以前地方借来的, 发现是错误的: 到 1 计算公式大概是: -1 (X-Width/2)/Width (Y-Hight/2)/Hight)Sub HideDescriptionBalloons() 和 Sub ShowDescriptionBalloon(ByVal feature As EARTHLib.FeatureGE) 打开/隐藏地标描述,一般和下面 的SetFeatureView 配合使用。Function IsInitialized() As Integer 是否初始化Function IsOnline() As Integer 是否连上 GESub Logout() 和 Sub Login() 登陆或者退出,不会提示关闭前存盘临时文件(好象其他地方有参数 可以设置,忘了)。GE 的第三个可恶之处:临时文件没办法清除, 只能设置 Visibility=0,但如果有名称重叠的话,那你就只能找到 第一个地标。如果你要彻底清除,就只能先采用个土方法,先退出再 登陆。Sub LoadKmlData(ByRefkmlData As String) 比较有用的功能,导入完整的 KML 字符串,必须包含从



    Sub OpenKmlFile(ByValfileName As String, ByValsuppressMessages As Integer) 最有用的功能了, 导入 KML/KMZ 文件。 后面的参数含义是: 1 指不提示,0 提示。就是说如果这个文件已经导入的话,0 的时候就会弹出个对话框,问你是否重新导入。Sub SaveScreenShot(ByValfileName As String, ByVal quality As Integer) 给个文件名,存黑白照片ReadOnly Property SearchController() As EARTHLib.SearchControllerGE 查 GE 内置数据库用的Sub SetFeatureView(ByVal feature As EARTHLib.FeatureGE, ByVal speed As Double) 将前面用 GetFeatureByName/Href 找到的地址进行导航,转到这个地标。前面已经介绍了,需要两个判 断,一个是 Isnothing,True 就不要转;一个是 HasView,0 就不要 转,否则会出错。
    ReadOnly Property StreamingProgressPercentage() As Integer 程序运转的百分比,一般得到的时候都是 100%了。ReadOnly Property TourController() As EARTHLib.TourControllerGE 大概跟 Tour 有关的控制ReadOnly Property VersionAppType() As EARTHLib.AppTypeGEGE版本:EnterpriseClientGE = 0, ProGE = 1, PlusGE = 2, FreeGE =5, UnknownGE = 0xFF ,咱们都是 5ReadOnly Property VersionBuild() As Integer 版本号 4.0.2693 中的 2693,和下面两个一起可以拼成一个完整的版本号。 ReadOnly Property VersionMajor() As Integer 和 ReadOnly Property VersionMinor() As Integer 比如 4.0.2693 前一个指版本 号的 4,后一个指 0 ReadOnly Property ViewExtents() As EARTHLib.ViewExtentsGE 比 较有用的一个功能, 获得四个边的经纬度值。

    以上内容就是[谷歌地图官网]google地图学习手册的相关内容介绍,喜欢侠外游戏论坛的朋友可以关注我们。
                  上一页1234下一页
    这里是你的个性签名位置,可在“设置”-“个人信息”-“个人签名”处修改。
    回复 支持 反对

    使用道具 举报

    地板擦鞋
     楼主| 发表于 2021-1-2 05:45:08 | 只看该作者
    coarse approximation a of what is visible in the 3D view of a Google Earth application (原话),比较粗糙,比当前的边框要大一点点,不知为何。主要就 这些了。当然,进入每个功能后,还有许多详细的功能,有待于大家 继续发掘了。 纠正一下: CameraInfoGE 这个类很有用,第一贴重大失误啊。 继续介绍 CameraInfoGE 如下(均可以 获得值 和 设定值 ): 1、 FocusPointLongitude、 FocusPointLatitude、 FocusPointAltitude, 记录经度、纬度、高度数据2、 FocusPointAltitudeMode, 目前只有 1 (默认) 2 两种取值, 和 分别对应 KML 格式介绍中的 relativeToGround 和 absolute , KML 格式中的默认 clampToGround 似乎没有值对应,曾试过 0 或者 3,均出现错误。 3、Range 高度 (0---8 万公里) 4、Tilt 倾斜度,以垂直为 0,最大为 90 度,即地面的切线为最大 值。
    5、Azimuth 方位角 (-180---180) #如何获得当前视角: ApplicationGE.GetCamera B)B 取值 True/False 或者 1/0 也可以, ( True 更精确。#如何定义视角: 根据自己的需要,分别定义 1、2、3、4、5,一般其他不变,只变高 度就可以实现高度的自由转换。#如何定位到确定的视角(或者恢复 到 已储存的视角) ApplicationGE.SetCamera(CameraInfoGE,速度) 将前面获得的当 前视角或者经过定义的视角赋值给 CameraInfoGE ,即可驱动 GE 转 移到该视角。速度取值 0--5,GE 默认 0.119。*高级应用: 1、结合 GetCamera 、和 SetCamera ,定义好几个转换地点,并合理调整其中的角度、高度、速度等相应 值,再加上时间延迟功能,完全可以做出符合自己要求的 Tour 效果,这时候再结合屏幕拷贝软件,就可以制作出相当棒的演 示效果。用 C#控制 GE 的源程序GE API C#开发的源码,发贴共享,供高手开发参考 网址  MWrapper/ 发一段,其它自己下载吧 using System; using System.Collections.Generic; using System.Text; using System.IO;using GoogleEarthCOMWrapper; using EARTHLib;namespace TestGoogleEarthCOMWrapper { class Program { static void Main(string[] args) {try { // Create the API Wrapper...this also inits it. GoogleEarthAPIgeAPI = new GoogleEarthAPI();// Run some examples// Get Version info about your GoogleEarth Client int major = geAPI.VersionMajor; int minor = geAPI.VersionMinor; int build = geAPI.VersionBuild; string appType = geAPI.VersionAppType.ToString(); Console.WriteLine("Version = " + major + "." + minor + "." + build + " " + appType);// Open a local Kml File string fileName = AppDomain.CurrentDomain.BaseDirectory + "\\test.kmz"; Console.WriteLine("\nCallingOpenKmlFile(" + fileName +", true)..."); geAPI.OpenKmlFile(fileName, true);// Get the Camera info CameraInfoGEClass cam = geAPI.GetCamera(false); Console.WriteLine("\nCamera Info:"); Console.WriteLine("\tAzimuth " + cam.Azimuth); Console.WriteLine("\tFocusPointAltitude " + cam.FocusPointAltitude); Console.WriteLine("\tFocusPointAltitudeMode " + cam.FocusPointAltitudeMode); Console.WriteLine("\tFocusPointLatitude " + cam.FocusPointLatitude); Console.WriteLine("\tFocusPointLongitude " + cam.FocusPointLongitude);// Get the ViewExtents ViewExtentsGEClassve = geAPI.ViewExtents; Console.WriteLine("\nView Extents"); Console.WriteLine("\tNorth " + ve.North); Console.WriteLine("\tSouth " + ve.South); Console.WriteLine("\tEast " + ve.East);Console.WriteLine("\tWest " + ve.West);// Get the lat/lon/alt at screen coord (100, 100) GeoPointgp = geAPI.GetPointOnTerrainFromScreenCoords(100, 100);Console.WriteLine("\nGetPointOnTerrainFromScreenCoords(100, 100) = "); Console.WriteLine("\t(" + gp.Lat + ", " + gp.Lon + ", " + gp.AltMeters + ")");// Get the My Places Feature FeatureGEClass fc = geAPI.GetMyPlaces(); if (fc != null) { foreach (FeatureGEfcge in fc.GetChildren()) { fcge.Highlight(); Console.WriteLine("Feature " + fcge.Name + " highlighted");if (fcge.Name.Equals("Sage")) { fcge.Visibility = 1; } } }// Load some kml via a string //FeatureGE sage = geAPI.GetFeatureByName("Sage"); //sage.Highlight(); //sage.Visibility = 1; string doc = ReadKml("test1.kml"); geAPI.LoadKmlData(doc); } catch (Exception e) { // If you close the GE Client before one of the API methods executes, you would get // an ApplicationUninitializedException for example. There are other exceptions as well.Console.WriteLine(e.Message + "\n" + e.StackTrace); } Console.WriteLine("Press any key to exit..."); Console.ReadLine(); }static string ReadKml(string fileName) { StreamReadersr = new StreamReader(fileName); string doc = sr.ReadToEnd(); return doc; } } }GetPointOnTerrainFromScreenCoords(100, 100);这个命令错了,我在介绍 GE API 的贴子里专门有介绍, 它的取值范围是从-1 到 1, 屏幕坐标-->GE 坐标 的转换公式我也提供了,目前可获得的坐标与 GE 的一模一样,证明公式是正确的。LoadKmlData 能不用尽量不要用,每次生成一个文件,无法清除,宁 愿用重载同一个临时文件的方法。GetCamera 最好用 True 参数(或者 1 也行),按照 GE API 的说明,获得的地址更精确。其他无意见,挺好的。 来自:  d7da2a.html

    以上内容就是[谷歌地图官网]google地图学习手册的相关内容介绍,喜欢侠外游戏论坛的朋友可以关注我们。
                  上一页234
    这里是你的个性签名位置,可在“设置”-“个人信息”-“个人签名”处修改。
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则


    发布主题 上个主题 下个主题 快速回复 收藏帖子 返回列表 搜索

    联系我们|Archiver|手机版|小黑屋|侠外网 ( 豫ICP备13018943号-1 )

    GMT+8, 2024-11-15 12:16 , Processed in 0.046126 second(s), 19 queries , Gzip On, Memcache On.

    Copyright © 2001-2023 侠外游戏论坛 Powered by !Zucsud X3.5

    Support By A mysterious team , A great team ! Email:

    快速回复 返回顶部 返回列表