1.1 地球形状与空间参照系 (CRS)


1.1 地球形状与空间参照系 (CRS)

本节摘要:地球是不规则椭球,屏幕是平面,把曲面变平面要靠地图投影。本节讲坐标系(CRS)、投影、EPSG 编码——GIS 开发绕不开的坐标问题。

本节目标

阅读完本节,你应当能够:

  1. 区分地理坐标系和投影坐标系
  2. 理解地图投影的变形
  3. 用 EPSG 编码选对坐标系

概念脉络

一、地球不是球,是椭球

地球赤道略鼓、两极略扁,是不规则椭球。GIS 用参考椭球近似地球,不同椭球(如 WGS84、CGCS2000)参数略有差异。选哪个椭球决定坐标基准。

二、地理坐标系 vs 投影坐标系

  • 地理坐标系:用经纬度表示位置,单位是度。如 WGS84(EPSG:4326),GPS 用它。
  • 投影坐标系:把经纬度投影到平面,用米表示,单位是米。如 Web 墨卡托(EPSG:3857),Web 地图用它。

图 1-1 坐标系与投影

图 1-1 坐标系与投影

三、地图投影的变形

把球面变平面必然有变形——角度、面积、距离不能同时保真:

  • 等角投影(如墨卡托):保角度,面积变形大(高纬放大)
  • 等积投影(如阿尔伯斯):保面积,角度变形
  • 等距投影:保距离,其他变形

Web 地图普遍用 Web 墨卡托(EPSG:3857),保角度方便导航,但高纬面积放大(格陵兰看着和非洲一样大)。

四、EPSG 编码

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,别把度当米。

六、常用坐标系怎么选

实际项目里坐标系选择没有"唯一正确答案",但有一条经验顺序:

  1. 全球 Web 应用:底图统一用 EPSG:3857,业务数据入库时转成 3857 或保留 4326 二选一,前端展示时让框架自动转换。大多数开源地图框架默认就是 3857,不要和默认值对着干。
  2. 国内省市级项目:平面分析和制图优先用 CGCS2000 的高斯投影分带(如 EPSG:4491 起的带号系列)或 Albers 等积投影。数据成果要交政府平台时,坐标系通常被指定,照着要求做即可。
  3. 全球距离/面积量算:用 GEOGRAPHY 类型(球面计算)或先投影到当地合适的 UTM 分带。UTM 把全球按经度每 6 度分一个带,带内变形小,适合中等范围的测量。
  4. 历史数据兼容:老数据常是北京 54、西安 80 坐标系,带椭球基准差异,不能简单平移,需要七参数转换。这类数据在新项目里应尽快转到 CGCS2000。
常见 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 标签和数据实际值不一致比"没有坐标系"更难发现,数据验收时一定要抽样验证坐标值量级和位置。

九、易混淆概念辨析

  • 椭球(Ellipsoid)≠ 基准面(Datum):椭球描述几何形状,基准面还规定椭球中心与地球质心的关系。WGS84 和 CGCS2000 都用近似椭球,但实现定义不同,严格转换要参数。
  • 投影(Projection)≠ 坐标系(CRS):投影是"从椭球面到平面"的数学方法,坐标系是"方法 + 椭球 + 单位 + 参数"的完整组合。
  • EPSG 编码 ≠ 唯一的解:同一坐标系有多个 EPSG 编码(如 3857 还有 900913),工具兼容性优先选通用编码。

一节小结

  • 地理坐标系:经纬度(度),如 WGS84(EPSG:4326)。
  • 投影坐标系:平面米,如 Web 墨卡托(EPSG:3857)。
  • 投影变形:角度/面积/距离不能同时保真,墨卡托保角度,等积保面积。
  • EPSG 编码:数字唯一标识坐标系,开发明确用哪个。
  • 坐标转换ST_Transform/transform 转换,数据 SRID 和地图 CRS 要一致。

下一节讲空间数据模型——矢量(点线面)和栅格(像元)。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U