点位于多多边形内时ST_CONTAINS返回false的技术问题
问题排查与解决建议
验证坐标转换准确性
- 单独提取转换后的点坐标,和QGIS中显示的点位置对比,确认
ST_Transform是否正确将4326坐标系的点转换到多多边形的非标准SRID下:SELECT ST_AsText(ST_Transform(geom_of_point, srid_of_multipolygon)) AS transformed_point, ST_AsText(ST_PointN(ST_ExteriorRing(ST_GeometryN(geom_of_multipolygon, 1)), 1)) AS polygon_sample_point; - 如果转换后的点坐标和QGIS视觉位置不符,说明非标准SRID的空间参考定义可能存在问题,需要检查PostGIS中
spatial_ref_sys表内该SRID的参数是否与QGIS使用的一致。
- 单独提取转换后的点坐标,和QGIS中显示的点位置对比,确认
检查多多边形拓扑有效性
- 非标准SRID的几何体可能存在拓扑错误(如自相交、环方向异常),导致
ST_Contains判断失效:SELECT ST_IsValid(geom_of_multipolygon) AS is_valid, ST_IsValidReason(geom_of_multipolygon) AS invalid_reason; - 若几何体无效,使用
ST_MakeValid修复后再测试:SELECT ST_Contains(ST_MakeValid(geom_of_multipolygon), ST_Transform(geom_of_point, srid_of_multipolygon));
- 非标准SRID的几何体可能存在拓扑错误(如自相交、环方向异常),导致
测试点与单个子多边形的包含关系
- 多多边形由多个子多边形组成,可能存在单个子多边形包含点但整体判断异常的情况,逐个测试子多边形:
SELECT i, ST_Contains(ST_GeometryN(geom_of_multipolygon, i), ST_Transform(geom_of_point, srid_of_multipolygon)) FROM generate_series(1, ST_NumGeometries(geom_of_multipolygon)) AS i;
- 多多边形由多个子多边形组成,可能存在单个子多边形包含点但整体判断异常的情况,逐个测试子多边形:
排查坐标精度边界问题
- 转换后的点可能刚好落在多边形边界上,
ST_Contains不包含边界(边界属于ST_Covers的判断范畴),可改用ST_Covers测试:SELECT ST_Covers(geom_of_multipolygon, ST_Transform(geom_of_point, srid_of_multipolygon)); - 也可以给点添加微小缓冲后再判断:
SELECT ST_Contains(geom_of_multipolygon, ST_Buffer(ST_Transform(geom_of_point, srid_of_multipolygon), 0.0001));
- 转换后的点可能刚好落在多边形边界上,
内容的提问来源于stack exchange,提问作者Danylo
相关产品推荐
相关产品推荐

