QT+Leaflet调用电子地图的实现方法
2020-09-16李恩宁杨双董晓宁梁山清葛红志
李恩宁 杨双 董晓宁 梁山清 葛红志
摘要:在人防、公共安全及应急救援等领域,客户的系统平台对于电子地图的使用要求是不能联网,致使单机版电子地图开发出现实现方法复杂、成本高等问题。在深入分析QT使用自带的QGIS类库和QT调用MapInfo插件的基础上,总结出一种简便、可复用和免费的实现方法。通过QT4.8图形化开发工具实现了电子地图软件系统具有的所有基本功能,包括地图加载、缩放、漫游及标记显示等,为今后做进一步研究奠定了基础。
关键词:QT;Leaflet;电子地图;单机版
中图分类号:TP18文献标志码:A文章编号:1008-1739(2020)14-58-4
0引言
近年来,地理信息系统[1-2]的应用日趋广泛,可以通过各种途径接触到电子地图[3-5],例如Google地图、Google Earth及百度地图等网页形式的电子地图。人防、公共安全、应急救援等多个领域的系统平台建设对电子地图的需求越来越多,而往往这些领域不能联网,需要单机运行。
目前市面上的超图等地图厂家,对于PC端电子地图的开发都是需要付费的,用户需要花大量费用购买一套地图开发库及地图数据,这对于客户来说,是一笔不小的开销。
在探究各种电子地图实现方法的基础上,提出使用QT[6]结合Leaflet实现PC端单机版电子地图的开发,主要包括地图的基本操作[7-8],如放大、缩小及平移等,地图显示目标位置及地图标注等功能,能够满足用户对于地图开发的常用功能需求。
1 Leaflet
Leaflet[9-11]是一个为建设移动设备友好的互动地图,而开发的开源的JavaScript库,是由Vladimir Agafonkin带领一个专业贡献者团队开发的,虽然代码仅有33 KB,但它具有开发在线地图的大部分功能。
Leaflet设计坚持简便、高性能和可用性好的理念,在所有主要桌面和移动平台能高效运作。在现代浏览器上会利用HTML5和CSS3的优势,同时也支持旧的浏览器访问,支持插件扩展,有一个友好、易于使用的API文档和一个简单的、可读的源代码,是开源轻量级的JavaScript地图库,支持WMS、WFS、PostGIS等多源空间数据格式,具有跨平台、易拓展及兼容性好等优势。
2 QT
QT[12]是1991年由QT Company开发的跨平台C++图形用户界面应用程序开发框架,既可用于开发GUI程序,也可用于开发非GUI程序,比如控制台工具和服务器。QT是面向对象的框架,使用特殊的代码生成扩展以及一些宏,提供了一个完整的GUI程序解决方案及上百个功能强大的窗口部件,支持可视化开发,并且易于使用,生成的代码简洁而优雅。
QGIS是开源的桌面地理信息系统软件,是基于QT平台使用C++开发出来的GIS软件,主要特点是支持多种GIS数据文件格式、集成或支持其他开源GIS。GRASS、PostGIS和MapServer支持從WMS和WFS服务器获取数据及通过插件支持功能扩展。QGIS的优点是开源、免费、轻巧、跨平台及支持多种数据格式与插件库,缺点是功能弱小、稳定性差。
QGIS+QT进行二次开发,环境的搭建非常复杂,需要到官网下载QGIS源码进行编译,下载过程漫长,并且会下载很多依赖的库,特别耗时,对于项目周期短、项目任务紧急的情况,显然这种技术方式不可取,即使下载下来,使用过程中还会有问题。
MapInfo[13-15]是个功能强大、操作简便的桌面地图信息系统,具有图形的输入与编辑、图形的查询与显示、数据库操作、空间分析和图形的输出等基本操作。不仅是一个可独立运行的软件系统,还可通过ActiveX组件方式集成到用户程序中,为用户程序提供电子地图显示和编辑功能。MapInfo的联机帮助只提到了如何使用VB/VC++集成MapInfo,并没有介绍QT中的使用方法。而且MapInfo的地图格式是MIF,虽然网上能够下载到,但是不全,而且不能保证是最新的,要得到最新的地图数据需要花钱购买。
3 QT+Leaflet开发设计
3.1环境搭建
第1步:从QT官网下载并安装qt-opensource-windowsx86-5.9.6.exe。在安装过程中,选择安装组件时,要选msvc2015 32-bit/msvc2015 64-bit;
第2步:下载Visual Studio 2015,并按照过程逐步安装;
第3步:从Leaflet官网下载最新的库;
第4步:运行QT,自动检测出来的构建套件为msvc2015-32bit,如果不是,则配置,如图1所示。
3.2设计实现
3.2.1 QT初始化编码实现
主要代码流程如下:
①在.pro文件中,加入webengine类:QT+=webengine;
②工程代码中编写与LeafletMenu.html通信类bridge,并在bridge.h中定义与LeafletMenu.html交互的信号和槽函数。
3.2.2 LeafletMenu.html脚本文件的初始化编码