PostGIS修改SRID后距离计算值失真问题求助
问题分析与解决
你的问题不是PostGIS缓存了旧SRID,而是坐标系单位差异导致的长度计算逻辑错误:
- SRID 3857是Web墨卡托投影坐标系,单位是米,所以之前计算的50.323是实际长度(米);
- SRID 4326是WGS84地理坐标系,单位是度,直接用
ST_Length(geom)计算的是经纬度的度数差,数值自然极小。
解决步骤
确认当前几何列的SRID是否正确
执行以下SQL检查:SELECT ST_SRID(geom) FROM testtable LIMIT 1;如果返回4326,说明坐标系转换已经成功,无需修改几何列本身。
正确计算球面距离(米为单位)
针对4326的地理坐标系,需要用geography类型计算实际长度,执行:SELECT ST_Length(geom::geography) FROM testtable;这个计算会基于球面模型返回米为单位的长度,结果应该和之前3857下的数值接近(因为3857是近似投影,和球面计算会有微小误差)。
可选:永久转换为geography类型(如果常用球面计算)
如果你经常需要计算实际距离,可以把列类型改为geography,避免每次转换:ALTER TABLE testtable ALTER COLUMN geom TYPE geography(MULTILINESTRING, 4326) USING geom::geography;之后直接用
ST_Length(geom)就能得到米为单位的长度。
补充说明
你之前的转换语句其实有冗余:UpdateGeometrySRID会修改几何列的SRID元数据,但随后的ALTER COLUMN ... USING ST_Transform(ST_SetSRID(geom, 3857), 4326)已经完成了坐标系转换并设置了正确的SRID,所以UpdateGeometrySRID可以省略,不过这不影响最终结果。
内容的提问来源于stack exchange,提问作者WSA
相关产品推荐
相关产品推荐

