QtLocation和自定义插件实现基础地图和地图上航线绘制见上篇文章
说明:这里在线地图与离线地图都是使用的bing
地图缓存
首先要知道缓存的区域,一般使用当前地图显示的区域或者自己框一个区域。
可以根据左下角和右上角的屏幕坐标获取相应的经纬度,这样就确定了矩形范围。
Map组件屏幕坐标转经纬度方法
通过经纬度范围和缩放级别遍历地图的所有瓦片
lonToTileX
通过经度计算出瓦片的横坐标(X坐标)
lon + 180.0
:把经度从 -180 到 180 的范围转换成 0 到 360 的范围。/ 360.0
:把经度映射到 0 到 1 之间。1 << zoomLevel
:通过1 << zoomLevel
来计算该缩放级别下总的瓦片数量。2 的zoomLevel
次方,表示当前缩放级别的瓦片网格大小。
latToTileY
通过纬度计算出瓦片的纵坐标(Y坐标)
lat * M_PI / 180.0
:把纬度从度转换为弧度。log(tan(latRad) + 1.0 / cos(latRad)) / M_PI
:这个公式是根据投影变换计算纬度的网格坐标。它来源于 Web Mercator 投影,它将地球表面上的点映射到平面上。- 最后通过
(1 << zoomLevel)
来调整瓦片网格大小。
这里根据待下载瓦片路径拼接url地址请求网络下载
下载请求返回后,根据瓦片路径保存到本地即可
加载离线地图
当用鼠标在Map组件上进行地图缩放或者平移需要加载地图时,就会触发QGeoTiledMapReply *getTileImage(const QGeoTileSpec &spec)函数
把请求网络的拼接改为查找本地文件路径的拼接
读取瓦片数据后给地图加载新的瓦片数据。