基于Qt的轻量级电子地图的设计与实现
2021-04-25梅荣月
梅荣月
摘要:提出并实现了一种基于Qt的轻量级电子地图。该地图在墨卡托投影坐标系下,使用当前流行的地图瓦片技术,利用nginx搭建地图瓦片服务器,满足企业轻量级应用业务开发需求,具有跨平台、功能丰富、效率高等特性,具有良好的移植性、维护性和扩展性。
关键词:电子地图;地图瓦片;墨卡托投影;Qt;Nginx
中图分类号:TP311 文献标识码:A
文章编号:1009-3044(2021)09-0076-02
开放科学(资源服务)标识码(OSID):
1 背景
随着社会和科技的发展,地理信息系统(GIS)在社会信息化的进程中起到了不可或缺的作用。地理信息系统作为人口、资源与环境问题的公共展示平台,在国家推动信息化和现代化的过程中起到非常重要的作用[4]。地理信息系统以其跨行业、多功能的优势,不断开拓新的应用领域,广泛应用于教育、医疗、自动驾驶、建筑等行业。为了满足自动化办公需求,企业在业务开发中对地理信息系统的需求日益增加。当前流行的Arc GIS平台以及开源的Geo Server平台对计算机的硬件配置要求非常高,而在轻量级业务开发中,由于成本问题,大型商用GIS平台都不适用。所以轻量级的电子地图在小型业务开发中具有广阔的应用场景。
2 概述
众所周知地球是一个三维的椭圆球体,人们平时使用的地图都是在一个二维平面上,将三维的经纬度信息(即球面坐标信息)转换成二维的平面坐标信息的过程就称为投影。本文中的电子地图使用的是墨卡托(Mercator) 投影[3],墨卡托投影具有等角特性,在当今的导航产业中发挥着重要的作用。
投影完成后,椭圆的地球就变成了一幅正方形的平面地图。在投影的过程中存在不可避免的误差,本文中的电子地图纬度表示范围为(-85.09—85.09),但这并不影响正常的使用。由于地球上的元素信息太多太多,一张图片肯定不能涵盖全部信息,本文中的电子地图使用了当前流行的地图瓦片技术,地图瓦片按层级存储在地图瓦片服务器中。在第0级的时候,世界地图用1张256 × 256像素的图片就可以表示,地图上只有一些宏观的地理信息;在第1级的时候,世界地图用4张256 × 256像素的图片表示,地图上的地理信息更丰富一些;依次类推,在第n级的时候,世界地图用
本文的电子地图使用的地图瓦片是从Google地图瓦片服务器上下载下来的,具体的瓦片地址如下:http://mt2.google.cn/vt/lyrs=m@167000000&hl=zh-CN&gl=cn&x=420&y=193&z=9&s=Galil。其中mt2.google.cn表示Google地图瓦片服务器地址,替换为mt1.google.cn依然有效,为减轻服务器负载,提高网络访问效率,Google提供多台瓦片服务器;lyrs表示的是瓦片类型,具体含义如下,m:路线图,t:地形图,p:带标签的地形图,s:卫星图,y:带标签的卫星图,h:标签层(路名,地名等);x表示瓦片的横向索引,起始位置在最左边,数值为0,向右+1递增;y表示瓦片的纵向索引,起始位置在最上面,数值为0,向下+1递增;z表示地图的级别,最高一级为0,向下+1递增[1]。为方便瓦片地图的拼接,本文将地图瓦片以x_y_z.png格式命名,分类型按层级保存在服务器上,将同一层级的地图瓦片存储在同一个文件夹中。
3 设计
3.1 架构设计
为了满足电子地图的跨平台需求,本文选择具有跨平台特性的开发库Qt。Qt 是一个1991年由Qt Company开发的跨平台C++图形用户界面应用程序开发框架,具有优良的跨平台特性、良好的封装机制、丰富的API以及大量的开发文档[5]。为了满足电子地图的可移植性和可维护性需求,本文使用nginx搭建图片服务器。nginx 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名[6]。
本文的电子地图可以分为服务器和客户端两部分,客户端使用Qt开发,封装成库,可以在应用软件开发中直接调用,服务器使用nginx配置图片服务器,存储地图瓦片,客户端和服务器之间的通信使用HTTP协议,Qt提供了QNetworkAccessManager类。服务器和客户端独立设计、独立实现,可以使本文的电子地图具有良好的维护性和移植性。
3.2 功能設计
本文中的电子地图功能丰富,交互性强,实现了地图显示、地图缩放、地图漫游和地图标绘等功能。地图显示功能:根据用户的个性化选择,显示用户需要的地图,支持多种类型的地图(例如:路线图、地形图、卫星图等);缩放功能:本文在图片服务器上存储了多个层级的地图瓦片,可以根据用户的需求显示对应层级的地图,地图层级的变换就是地图的缩放,放大地图时用户可以看到更多的细节,缩小地图时,用户可以看到更广阔的范围;漫游功能:在比例尺不变的情况下,用户通过拖曳等操作对地图内容进行选择,调整地图的表达区域,在屏幕上形成一张新的地图;标绘功能:为了增强人机交互体验,本文中的电子地图提供了辅助标绘接口,用户可以使用这些接口在地图上绘制点、线、多边形、矢量图、图片和文字等信息。
从业务逻辑出发,本文的电子地图分为地图层、事件层和标绘层。地图层负责显示各种类型的地图,如路线图、地形图和卫星图等;事件层负责处理鼠标事件(如点击、移动、滚轮等)和键盘事件(如上、下、左、右和Enter等),电子地图在事件层捕捉事件,在地图层做出对应的操作,如滚动鼠标滚轮,放大或缩小地图比例尺;标绘层是本文的电子地图对外提供的接口,用户可根据自身需求调用相应接口在地图上绘制需要显示的信息。
4 实现
Qt的2D绘图功能非常强大,使用Qt提供的绘图引擎可以直接在设备屏幕或图片上绘制图形,本文中的电子地图就是先将地图瓦片绘制在QPixmap之上,然后通过引擎显示在屏幕上,用这种方式用户可以很方便地将当前地图保存为本地图片。本文中的电子地图基于Qt的绘图系统实现了地图层和标绘层的各项功能,基于Qt的事件处理机制实现了事件层的各项功能。
4.1 地图层
为了在客户端得到一幅完整的地图,本文需要将服务器中的一张张256 × 256像素的地图瓦片拼接起来,而实现上述功能,最重要的就是完成屏幕像素与墨卡托投影坐标系下地理经纬度之间的相互转换。在此基础上,只要知道地图中心点的经纬度、屏幕像素大小和地图层级,就可以拼接出一幅完整的地图。
式(1)和式(2)中已知一个点的经纬度和地图层级,计算该点所在地图瓦片的索引值,其中longitude为已知的经度,latitude为已知的纬度,zoom为当前地图层级,tileX为当前层级下所求地图瓦片的横向索引,tileY为当前层级下所求地图瓦片的纵向索引。根据上述两个公式,已知屏幕中心点经纬度和地图层级,可以计算出屏幕中心点所在的瓦片索引,再根据显示设备的屏幕大小计算出铺满整个屏幕所需要的所有瓦片的起始索引和结束索引,遍历就可以将得到的地图瓦片拼接成一幅完整的地图。利用式(1)和式(2)也可以实现地图缩放功能,地图缩放时,屏幕中心点的经纬度不变,地图层级发生变化,根据当前层级重新计算地图瓦片的起始索引和结束索引,遍历就可以得到缩放后的地图。
4.2 事件层
根据式(1)和式(2)拼接出的地图只是一幅静态的地图,并不能满足用户地图漫游需求。本文利用Qt的事件机制,重写了鼠标事件和键盘事件,实现了地图缩放和地图漫游功能。在地图进行缩放或漫游时,一个点在地图上的像素值是相对的,跟屏幕的大小相关,而它的经纬度是绝对的,和屏幕的大小无关。为了保证地图显示的正确性,需要将点在屏幕上的像素值转换为点在地图上的经纬度。
式(3)和式(4)中,已知一個点的地图瓦片索引值和该点在瓦片上的相对像素值以及地图层级,计算该点的经纬度,其中longitude为所求的经度,latitude为所求的纬度,zoom为当前地图层级,tileX为当前层级下的地图瓦片的横向索引,tileY为当前层级下的地图瓦片的竖向索引,pixelX为该点在当前瓦片上的横向像素值,pixelY为该点在当前瓦片上的竖向像素值。通过上述公式就可以将鼠标拖动造成的像素变化转换为中心点的经纬度变化,再依据4.1中的式(1)和式(2)就可以得到一张新的地图,这样就实现了地图漫游功能。
4.3 标绘层
为了实现信息表达的多样性,本文中的电子地图在地图层和事件层的基础上实现了标绘层。利用标绘层,用户可以在地图上绘制点、线、面、矢量图和文字等多种类型的信息。线、面和矢量图等信息所占用的像素大小与地图标尺息息相关,它们会随着地图标尺的变化而变化,这时就需要知道地图的地面分辨率。地面分辨率是一个像素(pixel)代表的地面尺寸(米),单位为米/像素[2]。
式(5)中已知地图层级以及当前层级下屏幕中心点的纬度,计算当前层级地图的地面分辨率,其中D为常量,是墨卡托投影下地球周长的一半,值为20037508.3427892,zoom为地图层级,centerLatitude为屏幕中心点的纬度,resolution为地面分辨率。
利用屏幕像素与经纬度之间的转换公式和地面分辨率就可以在地图上绘制各种复杂的标绘信息。本文中的电子地图对外提供了点、线、面、矢量图和文字等接口,用户也可根据自身的信息表达需求自定义标绘内容。在智慧哨兵项目中,利用标绘层实现了摄像头、警戒区和影响区域等绘制。
4.4 瓦片服务器
由于地图瓦片的数量多,占用的磁盘空间大,为了使电子地图具有更好的移植性和维护性,本文使用了nginx创建图片服务器。在一台装有Linux RedHat7.6系统的服务器上安装nginx1.18.0,配置nginx.conf文件,修改root路径为地图瓦片存储的根目录,通过ftp将地图瓦片上传到服务器。以本文为例,图片服务器创建成功后,带标签卫星图第七层横向索引102纵向索引48的瓦片url地址为192.168.1.100/map/y/7/7_102_48.png,在客户端使用该url地址就可以访问此瓦片。
5 结束语
本文设计并实现了一种基于Qt的轻量级电子地图,具有跨平台、功能丰富和效率高等特性,兼顾了可移植性、可维护性和可扩展性,对现行的大型地理信息系统具有良好的补充作用。本文中的电子地图在多个轻量级的应用开发中表现良好,能够很好地满足用户的需求。
参考文献:
[1] 崔金红,王旭.Google地图算法研究及实现[J].计算机科学,2007,34(11):193-195.
[2] 胡水平,岳淑英,张求喜.谷歌地图卫星影像数据获取关键技术研究[J].测绘与空间地理信息,2018,41(10):79-81,85.
[3] 任留成,杨晓梅,赵忠明.空间墨卡托投影研究[J].测绘学报,2003,32(1):78-81.
[4] 龙毅,温永宁,盛业华.电子地图学[M].北京:科学出版社,2006.
[5] 布兰切特,萨默菲尔德.C++ GUI Qt4编程:C++ GUI programming with Qt 4[M]. 闫锋欣,曾泉人, 张志强,等译.北京:电子工业出版社,2008.
[6] Reese W.Nginx:the high-performance web server and reverse proxy[EB/OL].[2020-08-20].https://www.linuxjournal.com/article/10108.
【通联编辑:谢媛媛】