Geometry与Geography区别?坐标系该选谁?

GIS基础理论
Dr.GIS
wowwwai GIS研习社 · 工具流程与项目排障

Geometry与Geography区别?坐标系该选谁? 这是很多 PostGIS、QGIS 和 WebGIS 初学者都会遇到的问题:同样是一份经纬度点线面数据,为什么有时用 geometry,有时又建议用 geography?为什么面积、距离一算就不对?本文用 GIS 实际工作流解释二者差异,并给出坐标系选择的判断方法。

Geometry与Geography区别 坐标系该选谁 PostGIS空间计算示意图
Geometry 与 Geography 的核心区别:一个主要按平面坐标计算,一个按地球椭球面计算。

引言:Geometry与Geography区别到底影响什么?

在 PostGIS 中,geometrygeography 都可以存储点、线、面,但它们的计算逻辑不同。简单说,geometry 更像“地图平面上的几何对象”,geography 更像“地球表面上的地理对象”。

这个区别会直接影响三个常见结果:

  • 距离计算结果是否是米。
  • 面积计算是否符合真实地表面积。
  • 空间查询和空间索引的性能是否可接受。

如果只是把经纬度数据导入数据库,然后直接执行 ST_DistanceST_Area,很容易得到看似正常但实际错误的结果。理解 Geometry与Geography区别,是正确选择坐标系和字段类型的第一步。

背景:为什么经纬度数据一算距离就容易出错?

很多 GIS 数据默认使用 WGS84,经常写作 EPSG:4326。它的坐标单位是“度”,不是“米”。例如一个点坐标为 POINT(116.39 39.90),这里的 116.39 和 39.90 分别代表经度和纬度。

问题在于:经纬度不是平面距离单位。1 度经度在赤道附近约等于 111 公里,但在高纬度地区会变短;1 度纬度也不是严格恒定的平面长度。因此,如果直接对 EPSG:4326geometry 执行距离或面积计算,结果单位通常是“度”或“平方度”,并不是业务上想要的米或平方米。

例如下面这个查询在语法上没有问题,但结果并不是米:

SELECT ST_Distance(
  ST_SetSRID(ST_MakePoint(116.39, 39.90), 4326),
  ST_SetSRID(ST_MakePoint(121.47, 31.23), 4326)
);

如果这两个点是 geometry 类型,PostGIS 会按坐标平面进行计算。由于坐标单位是度,输出结果也会以度为基础,而不是实际地表距离。

原理:Geometry 与 Geography 的计算模型

Geometry:按平面坐标系统计算

geometry 是 PostGIS 最常用的数据类型。它支持点、线、面、多部件对象等空间要素,并依赖 SRID 表示坐标参考系统。

使用 geometry 时,PostGIS 默认认为坐标已经处于一个可计算的平面坐标系统中。对于投影坐标系,例如 Web Mercator EPSG:3857、UTM 分带坐标系、国家或地方投影坐标系,距离和面积通常可以用米、平方米来解释。

但如果 geometry 使用的是 EPSG:4326 经纬度坐标,距离和面积计算就不能直接当作米和平方米使用。

Geography:按地球椭球面计算

geography 主要用于经纬度数据,通常使用 EPSG:4326。它会把对象放在地球椭球面上进行测地线计算,因此距离结果通常以米为单位,面积结果通常以平方米为单位。

例如,将经纬度点转换为 geography 后再计算距离:

SELECT ST_Distance(
  ST_SetSRID(ST_MakePoint(116.39, 39.90), 4326)::geography,
  ST_SetSRID(ST_MakePoint(121.47, 31.23), 4326)::geography
);

这时结果更接近真实地表距离,适合跨城市、跨省、跨国家的距离估算。

一句话判断

如果你的数据已经在合适的投影坐标系中,优先用 geometry;如果你的数据是全球经纬度,并且需要直接计算真实地表距离,考虑 geography。

步骤:坐标系该选谁?按这 5 步判断

第 1 步:确认数据当前坐标系

在 PostGIS 中,先检查字段类型和 SRID:

SELECT 
  GeometryType(geom) AS geom_type,
  ST_SRID(geom) AS srid
FROM your_table
LIMIT 5;

如果结果是 4326,说明通常是 WGS84 经纬度。注意,SRID 为 4326 不代表它不能用,只代表你不能把它当作米制平面坐标直接计算。

第 2 步:判断你的核心操作是什么

不同任务对 Geometry 与 Geography 的选择不同。可以按下面方式判断:

  • 只是存储、展示、叠加经纬度数据:geometry 通常足够。
  • 要在本地城市范围计算面积、缓冲区、距离:建议转换到本地投影坐标系后用 geometry
  • 要计算跨区域、跨国家的点到点距离:可以使用 geography
  • 要做大量空间分析、相交、裁剪、叠加:优先选择合适投影下的 geometry
  • 要做 WebGIS 展示:数据可存 geometry,前端按地图底图需要转换或输出。

第 3 步:本地分析优先选择投影坐标系

如果研究区域比较集中,例如一个城市、一个县、一个工程区,通常不建议直接用 geography 做全部分析。更稳妥的方法是选择适合该区域的投影坐标系,然后使用 geometry

例如,北京附近可以考虑合适的高斯克吕格分带、UTM 分带或项目指定的地方坐标系。具体坐标系应以数据生产单位、测绘标准或项目要求为准。

转换示例:

SELECT ST_Area(
  ST_Transform(geom, 32650)
) AS area_m2
FROM land_parcels
WHERE ST_SRID(geom) = 4326;

这里 32650 是 WGS 84 / UTM zone 50N 的 EPSG 编码,仅作为示例。实际项目中不要机械套用,应根据区域位置选择。

第 4 步:全球经纬度距离可使用 Geography

如果你的点数据分布很广,例如全国门店、全球港口、跨省物流节点,并且主要需求是“两个点之间距离多少米”,geography 会更方便。

SELECT 
  id,
  ST_Distance(
    geom::geography,
    ST_SetSRID(ST_MakePoint(116.39, 39.90), 4326)::geography
  ) AS distance_m
FROM stores
ORDER BY distance_m
LIMIT 10;

这个写法适合查询距离某个经纬度点最近的对象。但如果数据量大,应建立空间索引,并结合 ST_DWithin 进行范围过滤。

第 5 步:用结果单位验证是否选对

不要只看 SQL 能不能运行,还要看结果是否符合常识。常见验证方法包括:

  • 两个城市之间的距离是否接近地图软件上的距离量级。
  • 一个地块面积是否在合理平方米范围内,而不是极小的小数。
  • 缓冲区半径 1000 是否确实代表 1000 米。
  • QGIS 中加载结果后,位置是否与底图对齐。

常见坑:Geometry 与 Geography 选择错误的典型表现

坑 1:把 EPSG:4326 的 Geometry 面积当平方米

这是最常见错误。下面的结果通常不是平方米:

SELECT ST_Area(geom)
FROM districts;

如果 geomEPSG:4326geometry,面积单位更接近平方度,不能直接用于报表。应使用合适投影转换:

SELECT ST_Area(ST_Transform(geom, 32650)) AS area_m2
FROM districts;

或者在需要椭球面面积时使用:

SELECT ST_Area(geom::geography) AS area_m2
FROM districts;

坑 2:ST_SetSRID 和 ST_Transform 混用

ST_SetSRID 只是给几何对象“贴标签”,不会改变坐标值。ST_Transform 才是真正进行坐标转换。

错误理解示例:

SELECT ST_SetSRID(geom, 3857)
FROM roads;

这只是把原始坐标强行标成 EPSG:3857,如果原始数据实际是 EPSG:4326,位置会严重错乱。

正确转换应使用:

SELECT ST_Transform(geom, 3857)
FROM roads
WHERE ST_SRID(geom) = 4326;

坑 3:以为 Geography 适合所有空间分析

geography 对距离计算很方便,但并不是所有 PostGIS 函数都像 geometry 一样完整、灵活。复杂叠加、编辑、拓扑处理、大规模空间分析,通常还是 geometry 更常用。

坑 4:Web Mercator 直接算面积

EPSG:3857 常用于 Web 地图底图显示,例如 OpenStreetMap、部分在线瓦片服务。但它并不适合高精度面积计算,尤其在高纬度地区变形明显。

如果任务是制图展示,EPSG:3857 很方便;如果任务是统计面积,应选择更适合研究区的等面积投影或项目指定投影。

坑 5:空间索引没有按字段类型建立

geometrygeography 都可以建立 GiST 索引,但索引要建立在实际查询使用的表达式或字段上。

CREATE INDEX idx_stores_geom
ON stores
USING GIST (geom);

如果查询经常使用 geom::geography,可以考虑建立表达式索引:

CREATE INDEX idx_stores_geog
ON stores
USING GIST ((geom::geography));

实际是否需要表达式索引,要结合查询频率、数据量和执行计划判断。

方法比较:Geometry 与 Geography 怎么选

比较项 Geometry Geography
主要模型 平面几何模型 地球椭球面模型
常见坐标系 EPSG:4326、EPSG:3857、UTM、本地投影等 通常为 EPSG:4326 经纬度
距离单位 取决于坐标系单位 通常返回米
面积单位 取决于坐标系单位 通常返回平方米
适合场景 本地空间分析、叠加、缓冲区、制图处理 全球或大范围经纬度距离计算
性能特点 函数丰富,分析场景更常用 计算更复杂,部分场景性能成本更高
典型风险 经纬度直接算距离面积会错 不适合替代所有投影分析

如果你正在做一个城市级地块面积统计项目,优先考虑“合适投影坐标系 + geometry”。如果你正在做全国门店最近距离查询,并且数据是经纬度点,可以考虑“EPSG:4326 + geography”。

检查清单:坐标系该选谁的实用判断表

  • 数据是经纬度吗? 如果是 EPSG:4326,不要直接把 geometry 距离当米。
  • 研究区范围大吗? 全球或全国点到点距离可考虑 geography
  • 是否要算面积? 本地面积统计优先选择合适投影后使用 geometry
  • 是否要做缓冲区? 本地缓冲区建议投影到米制坐标系后再做。
  • 是否只是 Web 展示? 展示可用 Web 地图常见坐标流程,但分析不要直接依赖显示坐标。
  • 是否使用了 ST_SetSRID? 确认它只是设置 SRID,不是坐标转换。
  • 是否验证过结果单位? 用常识距离、已知面积或 QGIS 测量工具交叉检查。
  • 是否建立了索引? 大数据查询应为常用空间字段或表达式建立 GiST 索引。

FAQ:Geometry与Geography区别常见问题

Q1:PostGIS 中 geometry 和 geography 可以互相转换吗?

可以。在常见情况下,geometry 可以通过类型转换变成 geography,前提是它的坐标适合 geography 使用,通常应为 EPSG:4326

SELECT geom::geography
FROM places;

geography 转回 geometry 也可以:

SELECT geog::geometry
FROM places_geog;

Q2:为什么 geometry 的 ST_Distance 结果不是米?

因为 geometry 的单位取决于坐标系。如果 SRID 是 EPSG:4326,坐标单位是度,ST_Distance 的结果就不能直接解释为米。要得到米,可以转换到米制投影坐标系,或转为 geography 后计算。

Q3:QGIS 中看到图层坐标是 EPSG:4326,可以直接算面积吗?

不建议直接算。QGIS 中如果图层是经纬度坐标,面积计算要注意项目坐标系、椭球设置和字段计算器表达式。对于严肃面积统计,建议先将数据另存为合适的投影坐标系,再计算面积字段。

Q4:WebGIS 项目里应该存 geometry 还是 geography?

多数 WebGIS 项目存 geometry 更常见,尤其是涉及切片、空间查询、范围过滤、叠加分析时。前端展示可以输出 GeoJSON 或矢量瓦片。若核心需求是经纬度点的真实距离查询,可以在查询中使用 geography 或建立对应表达式索引。

Q5:EPSG:3857 能不能用来算距离和面积?

EPSG:3857 适合 Web 地图显示,但不适合高精度面积统计。距离在局部范围内可作为粗略参考,但严谨分析应选择适合研究区的投影坐标系,尤其是面积、工程量、规划统计等场景。

Q6:什么时候最推荐使用 geography?

当数据是 WGS84 经纬度,研究范围较大,并且主要任务是计算点到点距离、附近搜索、半径范围过滤时,geography 很实用。例如全国门店查询最近网点、港口之间距离估算、全球 POI 半径检索等。

结论:先看任务,再选 Geometry 或 Geography

Geometry与Geography区别并不是“谁更高级”,而是计算模型不同。geometry 适合在明确坐标系下做平面空间分析,尤其适合本地投影坐标系中的距离、面积、缓冲区和叠加处理;geography 适合直接对 WGS84 经纬度数据做地球表面距离和面积计算。

实际项目中,可以按这个原则选择:本地精细分析,选合适投影坐标系加 geometry;大范围经纬度距离查询,考虑 geography;Web 展示和空间分析混合场景,存储、索引、输出坐标要分开设计。

最后记住一个最实用的判断标准:只要你要计算距离、面积或缓冲区,就必须先问自己“当前坐标单位是什么”。这个问题回答清楚了,坐标系该选谁也就基本清楚了。