本节摘要:地球是不规则椭球,屏幕是平面,把曲面变平面要靠地图投影。本节讲坐标系(CRS)、投影、EPSG 编码——GIS 开发绕不开的坐标问题。
阅读完本节,你应当能够:
地球赤道略鼓、两极略扁,是不规则椭球。GIS 用参考椭球近似地球,不同椭球(如 WGS84、CGCS2000)参数略有差异。选哪个椭球决定坐标基准。

把球面变平面必然有变形——角度、面积、距离不能同时保真:
Web 地图普遍用 Web 墨卡托(EPSG:3857),保角度方便导航,但高纬面积放大(格陵兰看着和非洲一样大)。
EPSG 是坐标系的标准编码,用数字唯一标识:
| EPSG | 名称 | 用途 |
|---|---|---|
| 4326 | WGS84 | GPS、全球地理坐标(度) |
| 3857 | Web 墨卡托 | Web 地图(米) |
| 4490 | CGCS2000 | 中国国家坐标系 |
| 32650 | UTM 50N | 东经 120-126 度带投影 |
开发时一定明确用哪个 EPSG,混用会出错(如把 4326 的经纬度当 3857 的米用)。
不同坐标系间要转换,包括投影转换和基准面转换:
-- PostGIS 坐标转换 SELECT ST_AsText(ST_Transform(ST_SetSRID(ST_Point(116.4, 39.9), 4326), 3857)); -- 4326 经纬度转 3857 Web 墨卡托米
// OpenLayers 坐标转换 import {transform} from 'ol/proj'; const meterCoord = transform([116.4, 39.9], 'EPSG:4326', 'EPSG:3857');
⚠️ 常见坑:数据坐标系和地图坐标系不一致——点显示在错误位置。开发时一定确认数据 SRID 和地图 CRS 一致,不一致先 transform。
💡 关键直觉:地理坐标系用经纬度(度),投影坐标系用米。Web 地图用 EPSG:3857,数据常用 EPSG:4326。混用要 transform,别把度当米。
实际项目里坐标系选择没有"唯一正确答案",但有一条经验顺序:
| 常见 EPSG | 类型 | 典型用途 |
|---|---|---|
| 4326 | 地理坐标(度) | GPS 原始数据、GeoJSON |
| 3857 | Web 墨卡托(米) | Web 地图底图 |
| 4490 | CGCS2000 地理坐标 | 国家测绘成果 |
| 4491 起系列 | CGCS2000 高斯带 | 大比例尺制图 |
| 326xx / 327xx | WGS84 UTM 分带 | 全球测量、军事 |
不同环节用不同的工具做转换,原理一致,接口不同:
-- PostGIS:把整个表的坐标系改对(数据本身是 4326 度,标签写错成 3857 时用) UPDATE table_name SET geom = ST_SetSRID(geom, 4326); -- 真正做投影转换:4326 度 转 3857 米 ALTER TABLE table_name ALTER COLUMN geom TYPE GEOMETRY(Point, 3857) USING ST_Transform(geom, 3857);
# Python 用 pyproj 做坐标转换 from pyproj import Transformer transformer = Transformer.from_crs("EPSG:4326", "EPSG:3857", always_xy=True) x, y = transformer.transform(116.4, 39.9) print(x, y) # 输出 Web 墨卡托米制坐标
// 前端 proj4js 做单点转换 proj4.defs('EPSG:3857', '+proj=merc +a=6378137 +b=6378137 +lat_ts=0 +lon_0=0 +x_0=0 +y_0=0 +k=1 +units=m +no_defs'); const [x, y] = proj4('EPSG:4326', 'EPSG:3857', [116.4, 39.9]);
转换不是免费的:每一次投影变换都可能引入微小误差,反复来回转会累积误差。工程上应该定一条"数据流转规范":源头统一一个坐标系,入库一次转换,之后全程保持一致,不要每个模块各转一次。
某市不动产系统上线后,用户反馈"小区边界整体向西偏了约 100 米"。排查过程很典型:先看前端底图是 3857,再看业务数据表标注的 SRID 也是 3857,看起来没问题;但随机抽一个点对比后发现,数据坐标值其实是 4326 的度数值(约 116、39),却被当成 3857 的米值渲染,3857 下 116 米对应的经度差约 0.001 度,加上比例关系最终偏出上百米。修复方式是在入库时对这批数据执行 ST_SetSRID 把标签纠正为 4326,再 ST_Transform 到 3857。这个案例说明:SRID 标签和数据实际值不一致比"没有坐标系"更难发现,数据验收时一定要抽样验证坐标值量级和位置。
ST_Transform/transform 转换,数据 SRID 和地图 CRS 要一致。下一节讲空间数据模型——矢量(点线面)和栅格(像元)。