Postgis - ST_within 没有做我想做的事。如何在空心区域中找到一个点?

bla*_*ake 2 postgresql postgis geospatial leaflet

请参阅丝网印刷。

我在 Postgis 中运行了一个空间查询,以返回地图上的点所在的选区(区域)。该查询使用ST_within该点位于多边形内的函数。

正如您从打印中看到的,该点实际上并不在 York Outer 的多边形区域“内”,尽管从技术上讲您可能会说它在其中“内部”,或者至少 Postgis 是这么认为的。重点实际上在于约克中心。

我确信 Postgis 实际上会返回两者,但由于我只从游标中获取第一条记录,这就是我所看到的。

一个点一次只能位于一个选区,并且此查询返回了错误的选区,或者更确切地说,我向数据库提出了错误的问题。

我应该使用哪个函数来确保我始终返回正确的区域,该区域可能具有中空内部或形状奇怪?

ST_within 允许非重叠点

谢谢

菲尔

Mic*_*tin 5

这应该像你所描述的那样工作。也许数据有问题?您能否提供带有多边形/点数据的小型复制品?

此外,此类问题的一个常见原因是 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)
Run Code Online (Sandbox Code Playgroud)

我的结果是

1   POINT(5 5)     outer
2   POINT(15 15)   inner
Run Code Online (Sandbox Code Playgroud)