给定点和多边形的集合,确定哪个点位于哪个多边形(或不是)

sri*_*man 5 ruby postgis ruby-on-rails polygons

我的问题几乎与类似.但就我而言,多边形不一定相互接触/重叠.它们遍布整个空间.

我有一大堆这样的多边形.同样,我有很多积分.我目前正在运行一个RoR模块,一次取1个点并一次检查相对于1个多边形的交点.数据库是PostGIS.表现很慢.

有没有更快或最佳的方式这样做?

Twe*_*fth 1

可以作为一个选择语句来完成,但为了性能......查看多边形上的要点索引。为了简单起见,假设我有一个带有多边形字段(几何数据类型)和点字段(几何数据类型)的表。如果要在多边形列表中创建点列表,请执行交叉连接,以便比较每个多边形和每个点。

select *
from t1 inner join t2 on 1=1
where st_contains(t1.poly,t2.point) = 't'
Run Code Online (Sandbox Code Playgroud)

(修改为包括表连接示例。我使用交叉连接,这意味着每个多边形都将连接到每个点并进行比较。如果我们谈论的是大型记录集,请使用这些 GIS 树索引)

我目前正在这样做是为了在几百个多边形内定位几百万个点。如果您有重叠的多边形,这将为位于 2 个或更多多边形中的每个点返回多行。

您的点存储的数据类型可能会失败。如果它们位于几何字段中,则效果会很好。如果您使用文本值,则需要使用 st.geomfromtext 语句将字符转换为点。这看起来更像是:

st_contains(poly, st_geomfromtext('POINT('||lon||' ' ||lat ||')')) = 't'
Run Code Online (Sandbox Code Playgroud)

我使用了纬度/经度示例...这里唯一需要注意的是 geomfromtext 要求您使用 || 创建点 从您的字段创建字符串。如果您需要有关 st_geomfromtext 概念的帮助,请告诉我。