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

引言:Geometry与Geography区别到底影响什么?
在 PostGIS 中,geometry 和 geography 都可以存储点、线、面,但它们的计算逻辑不同。简单说,geometry 更像“地图平面上的几何对象”,geography 更像“地球表面上的地理对象”。
这个区别会直接影响三个常见结果:
- 距离计算结果是否是米。
- 面积计算是否符合真实地表面积。
- 空间查询和空间索引的性能是否可接受。
如果只是把经纬度数据导入数据库,然后直接执行 ST_Distance 或 ST_Area,很容易得到看似正常但实际错误的结果。理解 Geometry与Geography区别,是正确选择坐标系和字段类型的第一步。
背景:为什么经纬度数据一算距离就容易出错?
很多 GIS 数据默认使用 WGS84,经常写作 EPSG:4326。它的坐标单位是“度”,不是“米”。例如一个点坐标为 POINT(116.39 39.90),这里的 116.39 和 39.90 分别代表经度和纬度。
问题在于:经纬度不是平面距离单位。1 度经度在赤道附近约等于 111 公里,但在高纬度地区会变短;1 度纬度也不是严格恒定的平面长度。因此,如果直接对 EPSG:4326 的 geometry 执行距离或面积计算,结果单位通常是“度”或“平方度”,并不是业务上想要的米或平方米。
例如下面这个查询在语法上没有问题,但结果并不是米:
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;
如果 geom 是 EPSG:4326 的 geometry,面积单位更接近平方度,不能直接用于报表。应使用合适投影转换:
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:空间索引没有按字段类型建立
geometry 和 geography 都可以建立 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 展示和空间分析混合场景,存储、索引、输出坐标要分开设计。
最后记住一个最实用的判断标准:只要你要计算距离、面积或缓冲区,就必须先问自己“当前坐标单位是什么”。这个问题回答清楚了,坐标系该选谁也就基本清楚了。