我的订单|我的收藏|我的商城|帮助中心|返回首页
虚拟现实新闻>VR>行业资讯>行业知识

基于Google Earth 的人机交互平台设计

文章来源:第三维度 作者: 发布时间:2012年03月10日 点击数: 字号:

    来源:第三维度
    作者:马俊,杨忠,杨成顺,徐玲玲

    摘要:分析了Google Earth(GE)的基本概况和应用前景,研究如何在C ++ 平台上对Google Earth 客户端进行二次开发。 通过软件编程,调用Windows API 函数和GE COM API 函数将GE 视图嵌入到开发平台界面中,实现地图定位、实时坐标获取和地理位置搜索功能,并结合Windows Hook(钩子) 机制,实现GE 视图放大缩小和绘制轨迹的功能,达到人机交互的目的,满足应用基本需求。 所设计的人机交互平台具有三维场景逼真、界面友好、功能丰富等特点。

    随着计算机和互联网的不断发展,地图逐渐从传统的绘图纸走向了互联网、个人电脑以及各种手持设备,并且逐渐智能化、全球一体化。 以GIS( geographicinformation system)、RS ( remote sensing) 和GPS(global positioning system) 为基础的3S 技术极大地丰富了地图的内容和表现形式,为现代地图提供了重要的数据源[1]。 GIS 是一个专门管理地理信息的计算机软件系统,广泛应用于资源调查、城市规划、邮电通讯、交通运输、灾害预测、商业金融等不同的领域[2-3],Google Earth(GE) 是现代地图的典型代表,提供了GIS 的大部分功能,从一定程度上推动了GIS 社会化的发展。

    GE 是2005 年Google 公司向全球推出的一款虚拟地球软件,它将卫星照片、航拍照片和GIS 数据整合在一个地球的三维模型上,采用C /S ( client /server)模式,通过GE 客户端向服务器发送请求,服务器响应并返回当前地图数据,以实现地图的加载,使用户非常方便游览世界的每个角落。 GE 的应用也逐渐趋于商业化,在石油、水利、房产、通信、电力、海事、物流、农业等行业都得到了广泛的应用,给人们的日常工作生活带来了极大的便利。

    无人器在执行任务时需要对其进行实时监测和控制,及时了解无人器的当前位置、周围环境和工作状态,利用Google Earth 的三维视图容易实现这些功能。 文中将探讨Google Earth 如何在C + + 平台中进行二次开发并实现GE 的定位、坐标实时获取、地理位置搜索和轨迹绘制的人机交互功能。具有功能强大、执行效率高、灵活等优点,但开发效率不高;C + + Builder 开发平台运用新式软件组件技术,能有效简化开发过程中各环节的复杂度,协助开发人员快速开发出功能丰富的应用程序[4].

    1 Google Earth COM API 分析

    GE 的二次开发对各行各业带来巨大的影响。它可以在不同的开发平台中完成不同的任务,如Visual C ++、C ++ Builder 等。 Visual C + + 开发平台软件为用户提供2 种扩展接口:一种是KML(keyhole markup language)文件形式,另一种是组件(COM) API 形式。 KML 文件是基于XML语法格式的文件[5],可以按照KML 语法在记事本中进行代码的编写,并以。 kml 格式进行保存,该文件可以由Google Earth 客户端对其进行解析,显示KML 文件内的地标信息。

    Google Earth COM API 允许第三方应用程序从GE 查询信息并能给GE 发送命令,应用程序通过IApplicationGE 类能查询当前的GE 视图、控制3D视图、使用KML 功能等等[6]。GE 类型库中主要有11 个类,在文中实现的功能中主要用到如表1[1]所示的7 个GE 类。

表1 Google Earth COM API 类库的类
基于Google Earth 的人机交互平台设计

    对Google Earth 进行二次开发的基本步骤如下:

    1)在PC 机上安装GE 客户端;

    2)在开发平台中利用Import Type Library 功能导入GE 类型库;

    3)启动GE 客户端;

    4)将GE 视图嵌入到窗口中;

    5)调用入口类的各成员函数,以实现各种不同的功能。

    2 平台设计

    该软件平台的设计主要实现Google Earth 的定位、坐标获取、搜索、视图放大缩小和绘制轨迹基本功能,在C + + 开发平台中实现这些功能首先要解决以下几个关键技术:

    1)GE 类变量的定义;

    2)GE 视图的嵌入;

    3)Hook 机制的实现。

    2.1 GE 类变量的定义

    在VC ++ 环境中,可以通过打开“Add Class”→“From a type library”进入“Import from Type Library”对话框添加googleearth。 exe 类型库,将需要用到的类导入应用程序中,并导入googleearth。 h 头文件,然后用其类名定义类变量。 在C + + Builder 环境中定义类变量时需要用类名IApplicationGEPtr 来定义。

    2.2 GE 视图的嵌入

    为了能在开发平台界面上达到与GE 交互的目的,需要将GE 视图嵌入到界面中,以便直接观看和控制Google Earth 的3D 视图。

    在运行程序时,首先要启动GE 客户端,启动GE 有2 种方式: 一种是采用Windows API 函数ShellExecute 运行外部GE 程序方式;另一种是采用GE 的API 函数方式。 文中采用第2 种方式实现。 在应用程序中只需调用IApplicationGE 类成员函数IsInitialized()便可启动GE。

    IApplicationGE 类中有2 个用于获取GE 窗口句柄的函数:一个是GetMainHwnd( ),用来获取GE主窗口句柄;另一个是GetRenderHwnd(),用来获取GE 视图窗口句柄,实现时使用WinAPI 函数SetParent()将GE 视图窗口导入panel 控件中,SetParent()函数原型声明如下:

    HWND SetParent(
    HWND hWndChild,    // handle of window whose
    parent is changing
    HWND hWndNewParent  // handle of new parent window
    );

    此函数执行后返回上一个父窗口句柄。   执行程序后,嵌入效果如图1 所示。

基于Google Earth 的人机交互平台设计
图1 GE 视图嵌入界面中

    2.3 GE 定位的实现

    该功能的实现主要用到IApplicationGE 类成员函数SetCameraParams( ),用它来设置视高、经纬度等相关信息,设计界面如图2 所示。

基于Google Earth 的人机交互平台设计
图2 经纬度设置对话框

    软件设计流程如图3 所示。

基于Google Earth 的人机交互平台设计
图3 GE 定位软件流程图

    在设计界面中输入经纬度,GE 视图中心会迅速移到该位置,实现地图定位功能。

    2.4 GE 坐标实时显示

    在应用中时常需要知道鼠标所在GE 视图位置的经纬度坐标,并在界面中实时显示,以便观察地图上任意点的地理位置。

    此功能的实现主要用到IPointOnTerrainGE 类来获取屏幕点的地理坐标,调用IApplicationGE 类成员函数GetPointOnTerrainFromScreenCoords 将GE坐标系中的坐标转化为地理坐标,调用该函数语法如下所示。

    IPointOnTerrainGE  GetPointOnTerrainFromScreenCoords ( doublescreen_ x,double screen _ y),该函数的返回值为 IPointOnTerrainGE 类型。 在转换之前需要将屏幕坐标值转换到GE 坐标系中,GE 坐标系如图4 所示。

基于Google Earth 的人机交互平台设计
图4GE 坐标系

    GE 坐标系是以GE 视图中点为原点(0,0),X轴从左到右逐渐增大,Y 轴是从上到下逐渐减小,而屏幕Y 坐标是从上到下逐渐增大的,所以对Y 轴的算法应该相反。 调用Windows API 函数GetWindow-Rect 得到GE 视图窗口四边所在的屏幕坐标值,然后计算视图窗口中心点的屏幕坐标(m,n),假设当前鼠标的屏幕坐标为(x,y),将此坐标转换为GE 视图的相对坐标,其转换公式为:

基于Google Earth 的人机交互平台设计

    式中:W 为GE 视图的左边窗到右边窗的宽度,H 为GE 视图的上边窗到下边窗的高度。

    将转换后的坐标( X,Y ) 值代入函数Get-PointOnTerrainFromScreenCoords 的形参中,便可得到鼠标所在GE 视图位置的经纬度以及海拔高度,伪码描述如下:

    void Get_Coords() {

    IPointOnTerrainGEPtr CursorPos;
    获取GE 视图窗口句柄;
    获取视图窗口四边的屏幕坐标;
    计算视图中心的屏幕坐标;
    获取鼠标当前位置;
    将鼠标当前屏幕坐标转换为GE 坐标系的坐标;
    CursorPos = 将GE 坐标系中的坐标转换为地理坐标;
    获取经纬度;
    }

    2.5 地理位置搜索

    地理位置搜索主要是利用GE 客户端的Search板面功能,主要用到ISearchControllerGE 类成员函数Search 来执行搜索,软件设计流程如图5 所示。

基于Google Earth 的人机交互平台设计
图5 地理位置搜索流程图

    运行程序后,输入需要搜索的地理位置,搜索后设计的界面中会显示搜索到一个或多个结果(GE主窗口Search 面板中也会显示搜索结果),并且GE视图将定位到第一个结果的位置,测试效果如图6所示。

基于Google Earth 的人机交互平台设计   
图6 搜索地理位置效果

    2.6 GE 视图放大缩小与轨迹的绘制

    Google Earth(GE) 视图嵌入到窗口后,鼠标滚轮有时会无法响应对地图的放大或缩小功能。 此时需要采用Windows Hook 技术对鼠标和键盘消息进行屏蔽并处理,完成GE 视图的放大缩小和绘制轨迹功能。

    2.6.1 Hook 机制的实现

    Windows 操作系统各部分之间的沟通都是通过消息传递机制实现的[7],在应用程序窗口下进行鼠标键盘操作时,操作系统会将鼠标键盘消息放到应用程序的消息队列中,等待应用程序调用,但这一过程应用程序只能调用操作系统处理的消息队列,如果需要对某个消息进行拦截屏蔽,则必须采用钩子(Hook)机制,Hook 是Windows 消息处理机制的一个平台,利用它可以非常方便地截获并处理应用程序与其他进程之间传递的消息,完成一些特殊的功能。

    Hook 机制实现的结构框图如图7 所示。

基于Google Earth 的人机交互平台设计
图7 Hook 实现结构框图

    应用程序通过调用SetWindowsHookEx 函数来安装一个钩子过程,如果要屏蔽鼠标或键盘消息,则需要定义相应的鼠标或键盘钩子过程。

    在钩子使用完毕后,为了不影响系统性能,需要调用UnhookWindowsHookEx 函数来卸载钩子,以释放其所占系统资源。

    2.6.2 功能实现

    在GE 视图内绘制轨迹,需要采用KML 文件的开发形式,利用读写字符串的方法在KML 文件内修改各类地标和轨迹信息,并加载到GE 中显示绘制的轨迹,视图的缩放与绘制轨迹功能均采用钩子技术来实现。

    在进程内实现钩子时只能屏蔽当前进程的主线程的鼠标消息和键盘消息,而GE 嵌入后在后台运行,无法屏蔽GE 的鼠标键盘消息,此时需要创建一个全局钩子屏蔽当前正在运行的所有进程的鼠标键盘消息,那么安装钩子过程必须放到动态链接库(DLL)中去实现[8-9]。

    具体实现方法如下:

    1)在DLL 文件内调用安装和卸载键盘钩子函数;

    2) 在键盘钩子过程函数中添加按键“D(Draw)”的消息响应函数,在鼠标钩子过程函数中添加滚轮的消息响应函数;

    3)在创建的。 def 文件中用EXPORTS 关键字指定该DLL 导出函数的名称;

    4)编译生成的DLL 文件放入应用程序的工程文件夹下;

    5)采用动态调用的方式,在应用程序中调用DLL文件中的安装鼠标和键盘钩子函数屏蔽键盘消息;

    6)操作系统监测按键“D”和鼠标滚轮的消息,如果有按键,则发送消息给应用程序,应用程序接收消息并处理相应函数;

    7)在按键“D”消息处理函数中获取当前鼠标所在GE 视图的经纬度值并添加到KML 文件中,在鼠标滚轮消息处理函数中设置GE 视高实现地图的缩放功能;

    8)加载KML 文件显示相应地标信息,并将各个地标用直线连接,显示轨迹;

    9)程序结束时卸载钩子并释放DLL 文件。程序运行效果如图8 所示。

基于Google Earth 的人机交互平台设计
图8 轨迹绘制效果图

    在人机交互界面中按顺序显示各个地标的经纬度信息、轨迹的颜色和粗细程度以及地标样式均可采用程序菜单的方式在KML 文件中进行设置。

    经过测试,只需知道某个位置的经纬度,便可通过地图定位功能Google Earth 视图窗口迅速将视图中心移到该目标位置,对于GE 坐标的实时显示,需要经过坐标转换,功能实现相对较麻烦,结果显示的数据与GE 视图上的经纬度一致,地理位置搜索的测试结果也表明了搜索位置的准确性,在探讨轨迹的绘制过程中验证了鼠标键盘钩子的安装、使用和卸载过程是正确的,并利用钩子技术实现了对GE视图的放大与缩小功能,达到C + + 开发平台与Google Earth 相互交互的目的。

    3 结束语

    Google Earth 作为一个软件,利用了地理信息系统等相关领域的知识和技术,信息量大,功能简单实用,并免费提供类库的接口,方便开发者研究并应用于各行各业。 Google Earth 的应用广泛不仅体现在COM 组件上,KML 文件的开发更加丰富,能绘制各种地标、轨迹、添加三维模型等丰富的地理信息,在各种无人器模型的导航仿真以及实时跟踪上具有非常重要的作用,同时全局钩子的应用也相当广泛,具有非常强大的功能,该技术已被广泛应用到各种软件中。

    参考文献:

   [1]江宽,龚小鹏. Google API 开发详解:Google Maps 与Google Earth 双剑合璧[M]. 北京: 电子工业出版社,2008.

   [2]曾江源. 浅谈“3S”技术[J]. 科技资讯,2009,26:6-8.

   [3]HALAOUI H F. Smart traffic systems: dynamic A* Trafficin GIS driving paths applications [C]/ /2009 WRI WorldCongress on Computer Science and Information Engineering.Los Angoles,USA,2009.

   [4]余明兴,吴明哲,黄世阳,等. Borland C + + Builder6 程序设计经典[M]. 北京:科学出版社,2004.

   [5]DU Yingjun,YU Chongchong,LIU Jie. A study of GIS developmentbased on KML and Google Earth[C]/ /Geoinformatics,2009 17th International Conference on. WashingtonDC,USA,2009.

   [6]Google. Google Earth COM API Documentation[EB/OL].[2009-09-12 ]. http: / /earth. google. com/comapi /index.html.

   [7]徐云剑. VC ++ 钩子机制在Windows 系统中的应用[J].中国科技信息,2006,(13): 146-147.

   [8]孙鑫,余安萍. VC ++ 深入详解[M]. 北京:电子工业出版社,2008.

   [9]MICHAELSEN E,JAEGER K. A google-earth based testbed for structural image-based UAV navigation[C]/ /200912th International Conference on Information Fusion. Seattle,USA,2009.

  • 暂无资料
  • 暂无资料
  • 暂无资料
  • 暂无资料
  • 暂无资料