最近由于项目需求,需要在自己做的软件中调用卫星地球,笔者先后尝试了高德、百度和谷歌地球,最后选择了谷歌地球。原因在于高德地图的卫星地球模式清晰度完全不能满足使用要求;百度地图的清晰度虽然可以满足使用要求,但清晰度也不如google earth,且百度地图的调用方法是将其网页嵌入自己的软件界面中,对于我这个不熟悉javascript的人来说难度较大;所以我选择google earth,清晰度最高,学习资料也多,与本项目合作的公司也用的是google earth,美中不足的是用google earth得翻墙。

由于笔者软件是在QT平台上编写的,下面来说说在QT中调用google earth的方法,环境是win10+QT5.9.9+Google earth pro 7.3.2.5776。

现有博客也有不少讲如何在QT中调用google earth的,如博客1和博客2。本人也是主要参考这两篇博客编写程序,但这两篇博客有较多坑没有说到,导致我在实际搬砖中仍举步维艰,所以在此我主要说一下写代码中遇到的坑。

首先是google earth版本的选择,在网上的大部分博客中都选择了GoogleEarth_7.1.2.2041,但我在安装这个软件之后,不知什么原因,并不能正常运行(在已用翻墙软件的情况下),所以我最后选择了Google earth pro 7.3.2.5776,那为什么这个版本就行我到现在也不清楚,而最新版的Google earth pro 7.3.3.7699就不行,可能是调用接口没开放的原因吧,如果大家想要Google earth pro 7.3.2.5776的安装包,联系我就好(文末QQ)。

代码编写我是直接复制了博客2的,并在其基础上多加了些注释和打开kml文件的功能。

google.h

#ifndef GOOGLE_H
#define GOOGLE_H#include <QMainWindow>
#include <guiddef.h>
//#include "windows.h"
#include "googleearth.tlh"#import "C:\Program Files (x86)\Google\Google Earth\client\googleearth.exe" no_namespacestatic 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}};namespace Ui {
class Google;
}class Google : public QMainWindow
{Q_OBJECTpublic:explicit Google(QWidget *parent = 0);~Google();static void KillProcess(const QString& strProcName);void StartGE(void);private slots:void on_actOpenKML_triggered();  //打开KML文件private:IApplicationGE* m_GEApp;HWND m_GEParentHandle;//GE视图父窗口句柄HWND m_GEHandle;    //GE视图区窗口句柄HWND m_GeMainHandle;//GE主窗体句柄Ui::Google *ui;
};#endif // GOOGLE_H

google.c

#include "google.h"
#include "ui_google.h"
#include "windows.h"
#include "windef.h"
#include "tchar.h"Google::Google(QWidget *parent) :QMainWindow(parent),ui(new Ui::Google)
{ui->setupUi(this);//试图清除其他事先运行的GEthis->KillProcess("Google Earth");this->KillProcess("GoogleEarth");this->KillProcess("GoogleCrashHandler");StartGE();
}Google::~Google()
{PostMessage(m_GeMainHandle, WM_QUIT, 0, 0);  //结束google earth进程delete ui;
}void Google::KillProcess(const QString &strProcName)
{DWORD dwProcID;HANDLE hProcess;TCHAR wProcName[260];int Len = strProcName.toWCharArray(wProcName);wProcName[Len] = _T('\0');HWND h = FindWindow(0,wProcName);if(h){GetWindowThreadProcessId(h,&dwProcID);hProcess = OpenProcess(PROCESS_TERMINATE,JOB_OBJECT_ASSIGN_PROCESS,dwProcID);TerminateProcess(hProcess,0);}
}void Google::StartGE()
{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();//隐藏启动的GE::SetWindowPos(m_GeMainHandle, HWND_BOTTOM, 0 , 0, 0, 0, SWP_NOSIZE|SWP_HIDEWINDOW);m_GEHandle =(HWND) m_GEApp->GetRenderHwnd();//截获GE的视图区RECT rect;::GetWindowRect((HWND)this->winId(), &rect);//取得当前视图窗口客户区大小m_GEParentHandle = ::GetParent(m_GEHandle);//保存GE视图区旧的父窗体句柄::SetParent(m_GEHandle, (HWND)ui->GE_Widget->winId());//截获GE视图::SetWindowPos(m_GeMainHandle,HWND_BOTTOM,rect.left,rect.top,rect.right-rect.left+650,rect.bottom-rect.top+150,SWP_FRAMECHANGED);//显示GE}
}//打开KML文件
void Google::on_actOpenKML_triggered()
{QString fileName = QFileDialog::getOpenFileName(this,QString("Open KML file"), ".",QString("KML File(*.kml *.kmz)"));if (!fileName.isEmpty()){string filename = fileName.toStdString();m_GEApp->OpenKmlFile(_bstr_t(filename.c_str()),1);}
}

值得说一下的是文中这句代码决定了你将谷歌地球的界面放在你的QT哪个窗口中,比如这里放的是ui->GE_Widget;

::SetParent(m_GEHandle, (HWND)ui->GE_Widget->winId());

而下面这句话是来设置google earth界面的大小的;

::SetWindowPos(m_GeMainHandle,HWND_BOTTOM,rect.left,rect.top,rect.right-rect.left+650,rect.bottom-rect.top+150,SWP_FRAMECHANGED);

在打开KML文件时,要注意由下面这句代码将文件名转为_bstr_t形式,不然打不开KML文件;

_bstr_t(filename.c_str())

最后大家记得用下面这句代码结束google earth进程,不然你下次运行程序很可能无法调用google earth。

PostMessage(m_GeMainHandle, WM_QUIT, 0, 0);

总结一下,我在做的时候很多时间都耗费在google earth版本的选择上,因为真的试了很多,同样的代码就是调用不起来,而版本Google earth pro 7.3.2.5776就行,真的是个玄学,还有就是我在运行程序的时候翻墙软件一直开着,不然google earth不能用。

贴两个运行程序的界面图,如下所示:

刚运行时:

打开KML文件后:

没错,我是做输电线路的,哈哈,图中的Q1,Q2等标记和连线就是读取KML文件后自动标记上去的。

欢迎各位大佬与我交流哈。

在QT中调用google earth并打开KML文件相关推荐

  1. python读取google earth导出的kml文件内的经纬度信息

     首先利用google earth,描出河段中心线,并导出kml文件  提取kml内的经纬度信息 import kml2geojson as k2g import geopandas as gpd i ...

  2. Qt中调用OpenCV函数库时Crashed问题的解决。

    这几天想在虚拟机上搭建Ubuntu的开发环境,包括了Matlab和QT(C++)的开发工具安装等,同时由于做图像处理,所以还必须要安装FFMPEG和OpenCV库.下面就讲讲我们安装时出现qt中调用O ...

  3. 如何在Qt中调用activeX插件

    如何在Qt中调用ocx插件,介绍可用的两种方法. 先说第一种方法: 使用QAxObject,设置插件的classid后就可以调用插件的方法了. QAxObject *flash = new QAxOb ...

  4. qt中调用matlab生成的动态库

    前言: 前面已经实现了在vc中调用matlab生成的动态库,请参考:vc中调用matlab生成的动态库 现在在前面已经生成好的matlab动态库的基础上,在qt中调用matlab生成的动态库.生成ma ...

  5. Qt中调用Python,实现基础功能、绘图、界面实现和图片爬虫

    Qt中调用Python,实现基础功能.绘图.界面实现和图片爬虫

  6. qt中调用sdk包流程、方法、注意事项详细说明

    qt是以c++为基础语言的编程工具,如果想调用其他语言已经写好的接口,比如java.或者是用java语言导出的jar包,要用到jni技术. JNI是Java Native Interface的缩写,它 ...

  7. 10显示不支持导入dwg文件_Global Mapper中80坐标系高程DEM与kml文件叠加实例

    概述 在GIS行业中,有很多经常用到的软件,比如CAD.ArcGIS.Erdas和ENVI等大型专业软件,也会常用到像Global Mapper这样的"迷你"软件,这里,我们以80 ...

  8. tif 高程_Global Mapper中80坐标系高程DEM与kml文件叠加实例

    概述 在GIS行业中,有很多经常用到的软件,比如CAD.ArcGIS.Erdas和ENVI等大型专业软件,也会常用到像Global Mapper这样的"迷你"软件,这里,我们以80 ...

  9. 【Qt】Qt中调用python接口

    在Qt程序中调用python函数从步骤 1.在pro中添加python的头文件路径和库 INCLUDEPATH += /usr/include/python3.4 LIBS += -L /usr/li ...

最新文章

  1. oracle time格式化比较,ORACLE DATE和TIMESTAMP数据类型的比较(二) (转)
  2. OO真经——关于面向对象的哲学体系及科学体系的探讨(上)
  3. 2021-05-27Series(三):Series和ndarray对比学习 转
  4. 和封神一起“深挖”Spark
  5. jquery点击元素之外触发事件
  6. 随机信号通过带通滤波器
  7. javascript包装对象
  8. UML类图的6大关系
  9. 漫步线性代数十一—— 四个基本子空间
  10. Eclipse之java虚拟机初始化失败问题已解决
  11. 计算机视觉深度学习实战三:频域分析及其变换
  12. 阿里系多个产品线宕机,包括1688、淘宝、天猫、淘宝直播、闲鱼……
  13. 20200619每日一句
  14. 【软件设计师考试】《软件设计师教程》(一)
  15. 国美在线php面试题,国美电器面试经验
  16. Excel列宽在哪里设置?Excel怎么设置行高和列宽
  17. 计算机伦理学理论分析三大思想,人工道德能动性的三种反驳进路及其价值
  18. web开发设为首页、添加到收藏夹实现方法
  19. 想要成为大牛应该做到以下几点
  20. CentOS7 配置搭建安装LNMP

热门文章

  1. Facebook Surround360 学习笔记--(2)算法原理
  2. 黄少华接任施振荣就任宏碁董事长
  3. 英语不好,能不能学会编程?
  4. 最全中文3DMAX四边形散布插件QuadScatter使用教程
  5. 修道士野人问题的python求解
  6. 视频怎么消除人声?一款视频去人声软件,轻松去除视频人声
  7. 爬虫正则匹配固定长度的数字
  8. 2018年浏览器横向比较
  9. 数据结构大作业-班级考勤管理系统
  10. Power BI学习笔记