Postgres空间查询报错,未知ESPG转ESPG 4326的坐标系识别问题
PostGIS拓扑异常坐标系识别与修复方案
报错原文:
psycopg2.errors.InternalError_: lwgeom_intersection: GEOS Error: TopologyException: Input geom 1 is invalid: Self-intersection at or near point 676597.26377722982 3673373.5709498846 at 676597.26377722982 3673373.5709498846
坐标系识别步骤
- 校验表空间字段元数据
执行SQL查询对应表的空间字段登记SRID:
绝大多数该类问题都是导入数据时SRID配置错误:元数据登记为EPSG:4326,但实际存储的是投影坐标系的米级坐标值。SELECT srid FROM geometry_columns WHERE f_table_name = '你报错涉及的表名' AND f_geometry_column = '空间字段名'; - 匹配投影坐标系特征
报错给出的坐标东向为6位数值、北向为7位数值,单位为米,符合全球通用的UTM投影坐标系的数值特征:- 北向值为3开头的7位数,说明是北半球区域
- 东向值67万左右,说明位于对应UTM带的中央经线东侧约170公里
结合你数据的实际所属地域,即可圈定候选UTM带对应的SRID(北半球UTM带的SRID规则为326+带号,比如UTM 49N对应SRID 32649)。
- 验证候选坐标系
执行SQL将报错坐标按候选SRID转4326,验证转换后的经纬度是否匹配数据实际范围:
转换结果符合你数据的地域范围,即为正确的源坐标系。SELECT ST_Transform(ST_SetSRID(ST_MakePoint(676597.26, 3673373.57), 候选SRID), 4326);
问题修复步骤
- 修正空间字段的SRID定义:
ALTER TABLE 你的表名 ALTER COLUMN geom TYPE geometry(Geometry, 正确SRID) USING ST_SetSRID(geom, 正确SRID); - 修复几何自交异常:
UPDATE 你的表名 SET geom = ST_MakeValid(geom) WHERE NOT ST_IsValid(geom);
操作完成后重新执行空间查询即可。
内容的提问来源于stack exchange,提问作者CNIDog
相关产品推荐
相关产品推荐

