编程实现GPS手持机点位数据批量输入
2020-06-08赵振华曲为贵刘仕刚刘钧沅孔祥栋
赵振华 曲为贵 刘仕刚 刘钧沅 孔祥栋
(天津华北地质勘查总院 天津 300170)
0 前言
利用GPS手持机进行地质、物探、化探进行测点测网的实际定位已成为地质工作的基本做法,在进行大面积测量工作时,大量的测点坐标信息要输入到GPS手持机中,而MapSource软件本身又没有提供批量输入测点坐标的方法,如果采用人工输入既不能提高工作效率也不能保证数据的准确无误,前人已总结出一套利用MapSource 的交换格式文件GPX实现批量输入的方法[1-2],但还有一定的局限性,本文从另外一个途径实现了更加灵活的方式来进行GPS测点数据的批量输入,也为从软件底层对手持GPS的开发提供了一种方式。本文的整体思路是,首先获取MapSource 与GPS 手持机设备之间的通信方式及数据包格式,然后加载winUSB 驱动,最后通过编写程序利用已有的数据格式对GPS手持机实现测点数据的批量输入。
1 MapSource的通信方法及数据包格式
GPSmap60CSx 该型设备为使用较为广泛的GPS设备,本文以该设备为研究对象,MapSource 为防止个人对GPS 内部存储的数据属性进行修改,其并没有提供软件接口实现对测点数据的批量输入方式,Bus Hound 软件是由美国Perisoft 公司研制的一种专用于PC 机各种总线数据包监视和控制的开发工具软件[3],利用该软件监控MapSource 驱动程序与GPS⁃map60CSx设备通信的数据包。
具体做法为在MapSource 航点属性界面先输入001(X:0,Y:0,H:0)的航点信息,同时打开Bus Hound软件选择要监控的设备并进行捕获操作,这时在MapSource选择软件界面选择发送到设备按钮,等待数据传送完毕后,Bus Hound软件界面就会出现需要的信息,重复上述过程输入002(X:10,Y:10,H:10)得到需要的信息。
通过对比航点属性信息可以得到名称属性、X坐标、Y坐标和高程等信息在MapSource 软件传输数据包中的位置。在MapSource 航点属性输入界面还包含有深度、温度等其它属性信息,通过上述方法也可一一获取。
2 WinUSB驱动加载
WinUSB 是微软公司提供的基于Windows 系统的USB 类设备驱动工具,其架构由内核模式驱动程序(Winusb.sys)和公开WinUSB 功能的用户模式动态链接库(Winusb.dll)组成。使用这些功能,可以通过用户模式软件管理USB 设备[4],Winusb.lib 和Winusb.dll提供应用程序层面的API接口函数。
安装设备驱动程序需要提供INF文件,微软公司提供了WinUSB.inf 文件模板,经过简单修改就能应用到大部分的WinUSB类设备,主要是将设备的厂商识别码(VID)和产品识别码(PID)加入到INF 文件中。相关操作和介绍可以参考微软的MSDN。
3 编写应用程序写入数据
由于地球曲率的影响,地理坐标并不能满足地勘单位在施工时的需求,将地球上的点位坐标化算到平面称之为地图投影。地图投影的方法有很多,我国目前多采用高斯投影—克吕格投影。为实现目前我国常用北京54和西安80坐标点位的批量输入,需要将地理坐标(B,L,H)转换为平面直角坐标系下的北京54 或西安80,实现该过程的方法为,首先利用简化莫洛金斯基模型[5-7],将DX、DY、DZ、DA、DF转换为DB和DL,然后将结果带入高斯正算公式,最后得到需要的北京54或西安80坐标,将该过程代码化以备后用。相关公式如下。
式(1)为简化莫洛金斯基模型公式。
式(2)为高斯投影正算公式。
由于要用到Winusb 作为设备的驱动程序,考虑到兼容的问题需要用C、C++、Visual C++等语言进行应用程序编写。程序要包含Winusb.h、SetupAPI.h头文件,关联Winusb.lib、SetupAPI.Lib 库文件。微软在NT4.0 后的操作系统里都提供了很多以Setup⁃DiXXXXX 开头的函数,该系列函数提供了读取设备信息和与设备通信的方法。SetupAPI.Lib 库文件包含了SetupDiXXXXX 开头的函数。程序的主要过程为应用SetupDiGetClassDevs、SetupDiDestroyDeviceIn⁃foList、SetupDiEnumDeviceInterfaces、SetupDiGetInter⁃faceDeviceDetail 等系列函数查找和定位到GPS⁃map60CSx 设备,通过CreateFile 函数获得设备句柄,然后利用WinUsb_Initialize、WinUsb_QueryDeviceIn⁃formation、WinUsb_QueryPipe、WinUsb_QueryInterfac⁃eSettings 等系列函数获取设备通信方式。在此就不罗列上述函数的使用方法,有意者可参见MSDN,最后通过WinUsb_WritePipe 函数对包装好的数据包写入GPSmap60CSx设备。
为验证代码是否可行,选择与GPSmap60CSx 设备同公司产品LEGEND H 进行实验操作,在记事本中依次编辑航点1、航点2、……航点12,随机输入以度为单位的坐标,运行代码后会在LEGEND H 手持机中看到相关航点信息。
4 结论
本文结合地质、物探、化探工作中的实际问题,提出了另外一种实现GPS 数据批量写入的方式,实现了相关的代码,这种方式相对于GPX 交换文件形式更加灵活,能同时修改多种相关属性等优点。