前言
一直以来,QGIS 中高德在线地图瓦片的纠偏似乎很难实现,原因在于其使用了 GCJ02 坐标系(官方称地形图非线性保密处理算法,俗称火星坐标系、国测局坐标)。此加密是非线性的,如图 1 (By @OpenQGIS)所示,加密算法会造成 100-700 米不等的偏移,因此不能通过对瓦片进行简单的平移缩放来实现纠偏。

图1 火星坐标加偏可视化 @OpenQGIS
奥维可通过设置坐标系为“墨卡托中国”来使用 GCJ02 坐标系的瓦片,一些 Webgis 项目,通过算出 GCJ02 坐标系瓦片四个角的经纬度,然后放置到正确的位置上来实现瓦片的纠偏。然而在 QGIS 中做不到这种对瓦片的精细控制,因此难以实现在线瓦片地图的纠偏,倒是矢量数据,QGIS 有插件可以很方便的转化坐标系。
实现 GCJ02 纠偏的 WEB 项目
纠偏实现
既然难以改变 QGIS 客户端,那么将瓦片重新裁切,可以实现纠偏吗?以高德矢量瓦片X=13523 Y=6531 Z=14 为例, 瓦片 A 范围内实际显示的为 GCJ02 坐标系下的内容,而正确的内容要将其对应的 WGS 坐标系范围求出,即瓦片 B 范围。瓦片 B 覆盖了四张瓦片,将这四张瓦片拼合,然后根据范围,从拼合后的图中裁剪出正确范围,得到 WGS 瓦片。

图2 GCJ02瓦片纠偏实现示意图
纠偏效果
根据上面的原理,很容易用 Python 实现这样一个服务器,将 GCJ02 坐标系的瓦片地图重切为 WGS84 坐标系。图 3 为天地图与纠偏后的高德矢量地图卷帘对比图,图 4 为谷歌卫星影像叠加高德路网,可以看出纠偏后的效果还是不错的 😊。

图3 天地图与纠偏后的高德矢量地图卷帘对比

图4 谷歌卫星影像叠加高德路网
QGIS 插件
为了方便在 QGIS 中使用,写了一个 QGIS 插件(https://github.com/liuxspro/amap-rectify ),在后台启动纠偏服务器(fastapi+uvicorn)。
插件安装前有几个 python 依赖需要安装一下,可在 QGIS 中通过在 Python 控制台执行下面的命令安装(注意 pip 前面的!):
!pip install httpx fastapi pillow uvicorn或者在 OSGeo4W Shell 中执行:
pip install httpx fastapi pillow uvicorn如果安装缓慢,或者网络错误,请自行更新 pip 镜像。
插件使用方式:先点击菜单栏AMAP菜单中的启动服务器,然后可添加纠偏后的高德地图。

图5 QGIS 插件
小节
这两天的研究表明 WCJ02 坐标系的瓦片是可以重切为 WGS84 坐标系瓦片,以达到纠偏的目的。虽然是纠偏,但是代码中却只用到了WGS2GCJ来加密坐标。百度地图瓦片应该也可按此方法重切。