刚装好QGIS,把第一份shp或者GPS点位拖进去,再叠上一层底图,正准备感受"我学会了"的快乐,结果定睛一看:数据飘到了马路对面三五百米,有的干脆整条街平移,严重的直接掉进河里。多数人的第一反应是三选一:数据坏了、软件坏了、或者我坏了。然后重装、重下、换数据源,折腾半天,偏移纹丝不动。
先给结论:绝大多数情况下,这不是bug,是坐标系没对上。这是几乎所有GIS新手都会撞上的第一个坑,社区里至今还在持续讨论:有人问百度坐标怎么转,有人问高德路网为什么偏移。知乎知乎这篇文章把国内真正在用的四套坐标系、三类偏移症状和对应修法一次讲清,看完再决定要不要重装。

先认清国内真正在用的四套坐标系
国内的地图数据,基本绕不开这四套:
WGS84:GPS的原生坐标系。手机定位的原始点位、OSM开放数据、国际地图服务,用的都是它。
GCJ-02:俗称"火星坐标系"。官方要求中国所有的地图使用GCJ-02坐标系,而从其他坐标系到GCJ-02坐标系的转换算法是保密的。知乎偏移量因地点而异,一般和实际坐标有0到几百米的偏移,而且是非线性加偏,没有统一修正值。知乎
BD-09:百度在GCJ02坐标系上又进行了一次偏移,形成了百度09坐标系,所以百度数据等于"加密了两次"。知乎
CGCS2000:国家2000大地坐标系,天地图用它。它和WGS84差异在厘米级,日常可以近似看作一套。
最反常识的一点在这里:QGIS不是有"动态投影"(on-the-fly projection),图层坐标系不一样也能自动对齐吗?为什么偏偏这时候不灵?
因为动态投影解决的是"同一个地点、两套标准坐标系之间的描述差异",两者之间有严格的数学变换。而火星坐标不是标准坐标系——它没有EPSG编码,偏移是按非线性规则揉进数值里的。有人把卫星地图和官方的GCJ-02地图叠在一起核对,发现两者的偏差是非线性的,想找一个固定换算公式都做不到。知乎于是两个图层各自都画得端端正正,位置却差出几百米。这时候改投影、换椭球体都没用,必须做坐标转换。
偏移不止一种长相:先对症状,再下药
新手的偏移看着都叫"对不上",其实至少分三类,处理方式完全不同。先对号入座:
第一类:偏得离谱。 数据落到赤道、海里,或者整块飞到几千公里外。这通常不是加密偏移,而是坐标系本身配错了——比如把以米为单位的投影坐标当成了经纬度,或者数据丢了.prj文件,QGIS只能瞎猜。
第二类:整体偏几百米,方向一致。 路网、楼栋、POI整整齐齐往同一个方向挪。这是最经典的火星坐标偏移:你的数据是WGS84、底图是GCJ-02,或者反过来。
第三类:位置大致对,形状不对。 图形被压扁、拉长、拧着。这是投影参数问题,常见于论文和规划资料,尤其是西安80、北京54这类带带号的老坐标系。
四个高频场景,逐个给修法
场景一:GPS点、OSM数据,叠高德/腾讯底图。
你的数据是WGS84,底图是GCJ-02,天生对不上。两条路:第一条,换底图——用OSM、天地图这类无偏移底图,问题直接消失;第二条,转数据——在QGIS插件管理器里安装GeoHey Toolbox插件,搜索框输入geohey就能找到,把数据坐标系从WGS84转成GCJ-02,再叠到高德底图上就对齐了。知乎知乎不过要注意两个坑:现在的GeoHey Toolbox只提供"加偏",也就是WGS84转GCJ-02/BD-09,不再提供反向转WGS84的功能;而且纠偏本身存在误差,转完如果还差个一两米,属于正常现象,别强迫症。知乎
场景二:数据是从百度系拿的。
百度地图用的是BD09坐标系,在GCJ02基础上二次加密,直接叠到WGS84数据上,位置会偏移数百米。知乎所以百度数据转WGS84要两步走:先从BD-09转到GCJ-02,再从GCJ-02转到WGS84。不想折腾插件的话,用coordTransform_py、gcoord这类Python库写个脚本逐点转换,或者找支持三套坐标系互转的在线批量工具,都能完成。知乎
场景三:GPS点叠天地图。
这是最省心的一组。天地图用CGCS2000,和WGS84差不到一米,有偏移困扰的网友实测,用天地图做底图就不会出现这个问题。知乎操作路径:装TianDiTu Tools插件,在插件设置里填入天地图官网申请的key,再在底图菜单里选影像或矢量加载,一次搞定。小红书哔哩哔哩菜单里有个细节值得留意:部分省级底图选项直接标着"有偏移",说明这些源本身就是GCJ-02,选了就要按场景一的逻辑处理。


场景四:论文、规划数据(西安80、北京54、投影坐标)。
第一件事不是转换,而是打开.prj,确认数据声明的坐标系。这一步最容易栽的坑是"带号":看X坐标值,如果以37/38/39等两位数开头(大于3600000),说明带了带号,应该用4525系列;如果X在几十万的量级,说明没带带号,用4546系列。知乎选错了,数据会整体落到错误的投影带里。
坐标系确认之后,再用重投影工具转到项目统一的目标坐标系。不同来源的shp想叠加统一,前提都是先明确底图和数据分别是什么坐标系。知乎
三个防坑习惯,下次不再栽
收数据先问一句来源和坐标系。 对方答"不知道"也没关系,至少你知道这份数据要先校验再用。
发现偏移,先看QGIS窗口右下角的CRS和图层属性,而不是先怀疑软件或重下数据。绝大多数偏移问题,在这两个地方都能找到线索。
用已知地物校验。 一个你确定位置的地标——校门、地铁口、自己家公司。偏几百米且方向一致,先想火星坐标;偏得离谱,先想坐标系设错。
顺带说下换底图的入口:除了浏览器面板里手动加XYZ Tiles源,Web菜单下还有QuickMapServices这类插件,一次能接入一大批底图服务商,连谷歌地图这类常用源都能直接调出来。小红书入口越多,越要清楚自己当前用的是哪一家、它是哪套坐标系。

最后
这篇文章能救的是"坐标系不匹配导致的偏移",救不了"数据源本身就偏"——有些商业底图和历史资料,偏移是刻在数据里的,遇到这种只能换源或者手动配准。
如果你还踩过别的坐标系坑,或者有更好用的转换插件,评论区补充一下——下一个对着地图抓瞎的人,可能就被你这条评论救了。