基于Qt的离线地图实现原理简介

离线地图通常基于离线瓦片,瓦片一般地为将地球表面按Web墨卡托投影为平面坐标系后世界地图上的切片。

Web墨卡托投影为网络地图常用的一种将空间地理坐标系统转换为平面坐标系统的投影方式。由荷兰地图学家墨卡托(Mercator)在1569年拟定,它假设地球被围在一个中空的圆柱里,其赤道与圆柱相接触,然后再假设地球中心有一盏灯,把球面上的图形投影到圆柱体上,再把圆柱体展开,这就是一幅标准纬线为零度(即赤道)的墨卡托投影绘制出的世界地图。

如图1所示。

基于Qt的离线地图实现原理简介_第1张图片

Web墨卡托投影后的世界地图

Web墨卡托投影平面坐标以赤道与本初子午线交点为坐标原点,x轴分别向右增长,范围为(-2003508.3427892, 2003508.3427892)( 2003508.3427892为赤道半周长);y轴向上增长,其投影角限制为85.051128°,因此y轴范围为刚好也为(-2003508.3427892, 2003508.3427892)。Web墨卡托投影平面坐标与WGS-84空间地理坐标可通过相关公式相互转换。

瓦片通常为256×256像素的图片文件(一般为png或jpg格式)。瓦片文件可通过网络下载为本地离线文件,以下为Google地图的一个街道图瓦片的网址及下载离线瓦片文件:

http://mt2.google.cn/vt/lyrs=m@167000000&hl=zh-CN&gl=cn&x=420&y=193&z=9&s=Galil

基于Qt的离线地图实现原理简介_第2张图片

图2 离线瓦片

 

离线地图正是由众多离线瓦片拼接而成。这些瓦片在平面坐标系统中以行列组织。在地图最小缩放比例时,整个地球显示为一张瓦片,如图3:

基于Qt的离线地图实现原理简介_第3张图片

图3 最小比例尺离线瓦片

 

每增加一个缩放级别瓦片数量会增加4倍。如图4所示。基于Qt的离线地图实现原理简介_第4张图片

图4 地图缩放时瓦片分割

瓦片组织和瓦片索引与Web墨卡托平面坐标系的映射关系,各地图类型都不相同。以Google地图为例, 瓦片索引用三个参数表示(x,y,z),x表示瓦片在Web墨卡托平面坐标系中的所在列,y表示所在行,而z表示地图缩放级别。x、y零点在地图左上角,分别向右向下增长。

 

基于Qt实现

离线工程实现基于Qt应用程序开发框架提供的“基于项的图形视图”。地图基础图层中的每一个瓦片表示为QGraphicsPixmapItem图形项,通过设置图形项在场景中位置来实现瓦片的拼接,从而展现一幅完整的地图。

对于离线瓦片文件的加载可通过两种方式实现:同步并行加载和异步多线程加载。

同步并行加载基于QtCocurrent并行计算框架。同步并行加载的优点是运行平台计算性能足够时能为用户提供极佳的地图漫游和缩放体验;缺点也相当明显,当运行平台计算性能不足时漫游和缩放可能出现卡顿。

异步多线程加载基于线程池+任务队列实现。运行平台计算性能没有过高的要求,不会出现界面卡顿现象;缺点是地图漫游和缩放时,可能出现轻微闪烁影响用户体验。

以上仅为个人浅见,欢迎大家一起探讨。

你可能感兴趣的:(技术探讨)