Google Earth 嵌入Qt应用程序

  • 专业术语
  • 前提准备
  • 实现方案
  • 遇到问题

专业术语

COM组件:COM是Component Object Mode的缩写,是微软定义的接口标准,遵循该标准的小程序是COM组件,它可以是独立的可执行二进制程序,也可以是动态链接库等。
Google Earth:它是Google公司推出的一款桌面地图产品,二次开发可以基于基于Google EarthComAPI 和Google EarthWeb Plugin两种方式,本文介绍第一种方式。

前提准备

1,安装Google Earth客户端
Google Earth已经在新版本的客户端中将API接口进行了关闭,但是老版本还是可以继续使用的,本地采用的客户端版本是GoogleEarth_7.1.2.2041.exe(有需要的可以向我获取),不用修改任何参数,一直点击下一步即可完成软件安装;
打开客户端测试是否能够连接Google服务,正常显示地球画面(需要等待一段时间),如果一直显示黑屏,需要修改C:\Windows\System32\drivers\etc下的hosts文件增加Google服务器地址(来自BIGEMAP地图下载器),如下;

#############################################################
#
# (c) 2015 BM
#
# Date: 2020/03/19 09:58
#
# 将生成的 hosts 文件复制到 C:/Windows/System32/drivers/etc 目录中即可
#
# (可备份原 hosts 文件)
#
#############################################################
203.208.50.71 www.google.com
203.208.50.71 geoauth.google.com
203.208.50.71 support.google.com
203.208.50.71 accounts.google.com
203.208.50.71 apis.google.com
203.208.50.71 auth.keyhole.com
203.208.50.71 kh.google.com
203.208.50.71 kh.l.google.com
203.208.50.71 khm.google.com
203.208.50.71 khm.l.google.com
203.208.50.71 khm0.google.com
203.208.50.71 khm1.google.com
203.208.50.71 khm2.google.com
203.208.50.71 khm3.google.com
203.208.50.71 khmdb.google.com
203.208.50.71 khms.google.com
203.208.50.71 khms.l.google.com
203.208.50.71 khms0.google.com
203.208.50.71 khms1.google.com
203.208.50.71 khms2.google.com
203.208.50.71 khms3.google.com
203.208.50.71 mt.google.com
203.208.50.71 mt.l.google.com
203.208.50.71 mt0.google.com
203.208.50.71 mt1.google.com
203.208.50.71 mt2.google.com
203.208.50.71 mt3.google.com
203.208.50.71 mts.google.com
203.208.50.71 mts.l.google.com
203.208.50.71 mts0.google.com
203.208.50.71 mts1.google.com
203.208.50.71 mts2.google.com
203.208.50.71 mts3.google.com
203.208.50.71 mw1.google.com
203.208.50.71 mw2.google.com
203.208.50.71 lh0.ggpht.com
203.208.50.71 lh1.ggpht.com
203.208.50.71 lh2.ggpht.com
203.208.50.71 lh3.ggpht.com
203.208.50.71 lh4.ggpht.com
203.208.50.71 lh5.ggpht.com
203.208.50.71 lh6.ggpht.com
203.208.50.71 www.gstatic.com
203.208.50.71 ssl.gstatic.com
203.208.50.71 csi.gstatic.com
203.208.50.71 maps.gstatic.com
203.208.50.71 fonts.gstatic.com
203.208.50.71 mt0.google.cn
203.208.50.71 mt1.google.cn
203.208.50.71 mt2.google.cn
203.208.50.71 mt3.google.cn
#END

2,导入COM组件
COM组件导入有两种方法:通过导入类库的方法和Import的方式。
导入类库:在工程项目中,添加类,类型选择(TypeLib中的MFC类),选择来源自文件,输入文件路径(C:\Program Files (x86)\Google\Google Earth\client\googleearth.exe),可以将COM组件中的接口导入到指定类中,如下图(貌似只有MFC项目才能使用该方法);

Import方式导入:直接在代码中通过#import “.exe”的方式将COM组件接口导入,编译器(需要支持COM组件编程)编译的时候会生成一个.tlh文件和一个.tli,前一个是头文件件定义,后一个是函数实现,我们只需要在自己个工程中引用头文件即可,本文介绍的也是这种方式。(注意:第一次编译的时候先将第一个include包含注释掉,等Import指令生成tlh文件后再放开)

#include "googleearth.tlh"static const CLSID CLSID_ApplicationGE ={0x8097D7E9,0xDB9E,0x4AEF, {0x9B,0x28,0x61,0xD8,0x2A,0x1D,0xF7,0x84}};
static const CLSID IID_IApplicationGE ={0x2830837B,0xD4E8,0x48C6, {0xB6,0xEE,0x04,0x63,0x33,0x72,0xAB,0xE4}};//#import "C:\Program Files (x86)\Google\Google Earth\client\googleearth.exe" no_namespace

实现方案

1,创建COM对象,用指定的类标识符创建一个未初始化的对象;
2,获取Google Earth操作句柄,将其放到Qt应用程序的窗口中显示;
3,测试获取某个点的经纬度及海拔信息,相关代码及效果如下;

HRESULT hr;
hr = CoCreateInstance(CLSID_ApplicationGE,NULL,CLSCTX_LOCAL_SERVER,IID_IApplicationGE,(void**) &m_GEApp);
if(SUCCEEDED(hr))
{bool onlie = m_GEApp->IsInitialized();onlie = m_GEApp->IsOnline();m_GeMainHandle = (HWND)m_GEApp->GetMainHwnd();::SetWindowPos(m_GeMainHandle, HWND_BOTTOM, 0 , 0, 0, 0, SWP_NOSIZE|SWP_HIDEWINDOW);m_GEHandle =(HWND) m_GEApp->GetRenderHwnd();RECT rect;::GetWindowRect((HWND)this->winId(), &rect);m_GEParentHandle = ::GetParent(m_GEHandle);::SetParent(m_GEHandle, (HWND)this->winId());::SetWindowPos(m_GeMainHandle,HWND_BOTTOM,rect.left,rect.top,rect.right-rect.left,rect.bottom-rect.top+50,SWP_FRAMECHANGED);
}
// 设置相机参数
m_GEApp->SetCameraParams(dlatitude, dlongtitude, 0, RelativeToGroundAltitudeGE, 0, 0, 0, 5);
IPointOnTerrainGEPtr pointPtr = m_GEApp->GetPointOnTerrainFromScreenCoords(0, 0);
if (nullptr != pointPtr)
{height = pointPtr->GetAltitude();
}

实现效果

遇到问题

COM组件获取IApplicationGE对象时,提示组件未注册
Google并没有提供给用户独立的COM组件,而是在用户安装了Google Earth程序后,自动将自带的动态链接库注册到用户的操作系统上,此时就可以调用API了;
如果测试发现未注册成果,需要重新安装Google Earth客户端,或者在命令行进入到Google Earth安装目录下输入”googleearth.exe /RegServer”,注意命令行要用管理员身份运行,否则会报权限不足的错误。

Google Earth 嵌入Qt应用程序相关推荐

  1. 在QT中调用google earth并打开KML文件

    最近由于项目需求,需要在自己做的软件中调用卫星地球,笔者先后尝试了高德.百度和谷歌地球,最后选择了谷歌地球.原因在于高德地图的卫星地球模式清晰度完全不能满足使用要求:百度地图的清晰度虽然可以满足使用要 ...

  2. Linux下 Qt界面程序嵌入另一个Qt界面程序_Qt应用嵌入外部进程窗口

    项目工程的实现,想要使用多个程序进行实现,在里面存在一定的调用的过程:调查的情况如下 Qt界面程序嵌入另一个Qt界面程序[Linux] Qt界面程序嵌入另一个Qt界面程序[Linux]_ptc321的 ...

  3. Qt嵌入外部EXE程序,并显示在主界面中!

    一.获取程序句柄以及类 打开Visual Studio 进行查询 二.QT调用程序 H文件 #ifndef VISUAL_H #define VISUAL_H#include <QWidget& ...

  4. 让Qt应用程序跑在Android上

    Qt最大的优势就是跨平台,一次性开发的Qt应用程序,可以跑Windows.跑linux.跑MAC--如今移动平台android操作系统如此火爆,Qt当然不能放过对android的支持,对了,还有iph ...

  5. Google Earth 和MS Virtual Earth:虚拟地球简介

    自从Goal在98年提出数字地球(Digital Earth)之后,全球掀起了数字地球热,而随着Goal的竞选总统的失利和当时科学技术和硬件水平的限制,数字地球一直处于慢慢发展状态.其中它涉及到很多学 ...

  6. Google Earth的十个常用技巧应用

    2004年10月27日Google宣布收购了美国的一家卫星图像公司Keyhole公司,并于2005年6月推出了Google Earth系列软件.用户们可以通过下载一个Google Earth客户端软件 ...

  7. 易语言和python混合编程_Python脚本可以嵌入易语言程序吗 |

    易语言和python比哪个更好更容易 虽然我很支产,但我不说,易语言一无是处,它甚至不能称为一言,顶多算个IDE.python是一门脚本语言,功能还不错,但目前还不能编写手机软件.编程中出现乱码是非常 ...

  8. Google Earth网页版初探

    最近三维GIS界有个比较爆炸性的消息,嗯,没错,Google Earth Enterprise(谷歌地球企业版)宣告开源,47万行代码的大项目就此开放.(深深感觉谷歌就是要搞事情). 概括下GEE开源 ...

  9. (一)Google Earth Engine概述

    Google Earth Engine (GEE) 是由谷歌公司开发的众多应用之一.借助谷歌公司超强的服务器运算能力以及与 NASA 的合作关系,GEE 平台将Landsat.MODIS. Senti ...

  10. 三维地图之Google earth安装使用

    整理一些三维地图相关的技术,目前来看,三维地图都是用于展示的,其他的交互和更深层次的分析利用几乎没有. 毕竟Google Earth面世这么多年了,除了能看,好像也没有什么其他的用处. 一.什么是Go ...

最新文章

  1. 聊聊flink的InternalTimeServiceManager
  2. 使用babel编译es6
  3. (转)输入pipt提示:AttributeError: 'module' object has no attribute 'HTTPSConnection'
  4. 通过HTTP请求响应过程了解HTTP协议
  5. JSP中四种属性范围
  6. java条件运算符类型转换_Java运算符,条件表达式,类型转换
  7. jQuery分页插件
  8. 后处理编辑修改_Abaqus Python二次开发:内核脚本的快捷编辑方式
  9. 用“黑科技”产放心粮,种地竟然和想象中有点不一样
  10. 基于JAVA+Swing+MYSQL的在线考试系统
  11. JZOJ 3517. 空间航行
  12. win8文件共享服务器搭建,Win8系统开启公用文件夹共享的方法【图文】
  13. 超市系统服务器,超市收银系统 服务器 配置
  14. 有趣好玩恶搞的C语言程序,有趣搞笑的整人VBS小脚本(整菜鸟专用)
  15. 抖音运营详细教程,算法解读、平台规则、热门涨粉......丨国仁网络
  16. IOS学习笔记-加速度传感器(重力感应)-UIAccelerometer
  17. 基于matlab的手写体数字识别系统,基于matlab的手写体数字识别系统研究
  18. css3中-moz-、-ms-、-webkit-、-o-分别代表什么内核
  19. 浏览器主页被hao123等篡改解决方法
  20. Cross-scene Crowd Counting via Deep Convolutional Neural Networks2015论文笔记

热门文章

  1. 无聊的小知识--数据中心为啥要建在山区
  2. 未来世界的幸存者-阮一峰
  3. 3dmax烘焙贴图主要设置之Flatiron
  4. 西门子1200 PLC程序 通讯对象:PLC、CNC、机械手、RFID标签读写器、打标机、分布式远程IO模块、MES中控系统、AGV光通讯
  5. 在超市使用室内地图的5个好处
  6. 怎样才能从Java初级程序员成长为一名合格的架构师?
  7. 人工智能ai技术案例_AI在软件测试中的案例
  8. 人工智能应用案例——智能客服
  9. 建筑智能化资质升级需要的企业工程业绩
  10. MCS-51单片机寻址方式详解