这应该像你所描述的那样工作。也许数据有问题?您能否提供带有多边形/点数据的小型复制品?
此外,此类问题的一个常见原因是 GIS 数据无效。您可以使用 PostGIS 检查多边形形状ST_IsValid
功能。如果数据无效,不同的工具可能会以不同的方式解释它,并且 GIS 数据的绘制方式可能与 PostGIS 认为该数据表示的内容不匹配,从而导致更多混乱。
这是一个简单的重现,显示它按照您期望的方式工作,仅在外部多边形的孔内有点st_within
内部多边形,而不是外部多边形:
select st_astext(point), name
from
(select
'outer' as name,
st_geomfromtext('polygon((0 0, 30 0, 30 30, 0 30, 0 0), (10 10, 20 10, 20 20, 10 20, 10 10))') g
union all
select
'inner' as name,
st_geomfromtext('polygon((10 10, 20 10, 20 20, 10 20, 10 10))') g
) shapes
cross join
(select st_geomfromtext('point(15 15)') point
union all
select st_geomfromtext('point(5 5)') point
) points
where st_within(point, g)
我的结果是
1 POINT(5 5) outer
2 POINT(15 15) inner