关于 4326、3857、4549、4490 的一些理解

0 阅读4分钟

最近在项目里反复踩坐标系的坑,有点烦,但也确实逼着自己把这几种常见的 EPSG 坐标系重新梳理了一遍。

一开始我以为只是“转换一下”的问题,后来发现,其实是我对它们的理解一直是碎片化的。

这篇就当是给自己做个记录。

1. 先想清楚一件事:坐标到底是什么

以前总是直接用,从来没认真想过。

现在回过头看,其实本质很简单:

地球是个椭球体,但程序处理的是平面 所以所有坐标系,本质都是一种“表达方式”

区别不在于“哪个更对”,而在于:

你现在用的是哪一种表达方式。

2. 4326 和 4490:看起来一样,其实不是一回事

image.png 这两个是我之前最容易混的。

  • 4326:WGS84(GPS 用的)
  • 4490:CGCS2000(国内标准)

它们的形式是一样的:经度,纬度

比如:[120.xxxx, 30.xxxx]

一开始我就觉得它们是同一个东西,只是名字不一样。

但实际上:

  • 底层参考椭球不同
  • 只是“数值接近”,不是“完全一致”

在小范围内确实没啥区别,但如果严格一点,是不能混用的。

不过说实话,在很多项目里大家还是混着用,这也是问题的来源之一。

3. 3857:地图显示用的坐标系

image.png 这个其实是我后来才真正理解的。

3857(Web Mercator)本质上不是“真实坐标”,而是:为了在屏幕上画地图而设计的坐标系

特点很明确:

  • 单位是米
  • 可以直接拿来画图
  • 所有互联网地图基本都用它

但它有个很关键的点:它是“变形的”

也就是说:

  • 它适合显示
  • 不适合做精确计算

所以:3857 更像是“展示层坐标系”。

4. 4549:真正让我踩坑的地方

如果说前面几个只是“理解问题”,那 4549 是实打实让我数据直接错位的东西。

4.1 它到底是什么

4549 是 CGCS2000 下的高斯投影(3度带),带中央经线 120°。

重点不在名字,而在这几个关键词:

  • 投影坐标系
  • 单位是米
  • 有“中央经线”

4.2 最关键的问题:中央经线

这个是我一开始完全没意识到的点。

同样一份数据,如果:

  • 实际是 117°中央经线
  • 你按 120°去解释

结果就是:整体偏移几十公里甚至上百公里

而且这种偏移是“看起来很正常,但就是对不上”的那种,很难第一时间怀疑到这里。

4.3 我项目里的真实情况

后来排查才发现:

  • 数据其实是 118.5° 的
  • 但数据库标的是类似 4549(120°)
  • 前端又在用另一套逻辑去转

结果就是:整条链路每一步都“有一点点错”

最后表现出来就是:全错

5. 这些问题为什么这么容易发生

现在回头看,其实原因很简单:

1)坐标系是“隐形信息”

不像字段、接口那样直观,

你不主动看 SRID,就根本不知道它是什么。

2)很多系统默认帮你“猜”

比如:

  • 前端自动转
  • 中间层做兼容
  • VTS 配 proj4

这些东西在“看起来正常”的时候,其实在掩盖问题。

3)大家习惯“先跑起来再说”

包括我自己也是:能显示就行

但坐标系这种东西:一开始不统一,后面只会越来越乱

6. 我现在给自己的几个原则

不算什么标准,就是踩坑之后给自己的提醒:

(1)必须搞清楚数据源坐标系

不是“猜”,不是“感觉像”,而是:确认原始数据到底是什么坐标系

(2)不要混用 4326 和 4490

哪怕它们很像,也尽量统一。

(3)涉及 4549,一定问中央经线

如果没人能说清楚:那这个数据就是不可信的。

(4)前端统一用 3857 渲染

后端再复杂,最终都转成一个标准再给前端。

(5)多看 SRID,而不是只看数值

ST_SRID(shape)

有时候问题不在数据,而在“你以为它是什么”。

7. 最后的一点感受

以前觉得 GIS 开发就是:地图 + 接口 + 渲染,

现在慢慢意识到:真正难的不是代码,而是这些“基础认知”。

坐标系、投影、数据来源,这些东西一旦理解不清楚:后面所有逻辑都是建立在错误基础上的,

而且最麻烦的是:它不会报错,只会悄悄让你结果不对。

这篇就先记到这。

以后如果再遇到“地图不对”的问题,希望自己第一反应不是去改代码,

而是先问一句:现在这一步,用的到底是什么坐标系。