给定一组点和多边形,确定哪个点位于哪个多边形内(或不在)。

5
我的问题与这个几乎相似。但在我的情况下,多边形不一定彼此接触或重叠。它们存在于整个空间中。
我有一个大量的这样的多边形集合。同样,我也有一个巨大的点集合。我目前运行一个RoR模块,每次处理一个点,并针对一个多边形检查交集。数据库是PostGIS。性能非常慢。
有更快或更优的方法吗?

有趣的问题。比这里经常循环的常规内容更具挑战性。 - d11wtq
这些多边形是规则的还是不规则的? - d11wtq
1个回答

1

可以使用一个SELECT语句完成,但为了提高性能...请考虑在多边形上创建GIST索引。为简单起见,假设我有一个带有多边形字段(geom数据类型)和点字段(geom数据类型)的表。如果您正在对多边形列表中的点列表进行操作,请执行交叉连接,以便比较每个多边形和每个点。

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

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

我目前正在执行此操作,以在几百个多边形中定位几百万个点。如果有重叠的多边形,则对于每个位于2个或更多多边形中的点,将返回多行。

可能会因数据类型而失败。如果它们在geom字段中,它将正常运行。如果您使用文本值,则需要使用st.geomfromtext语句将字符转换为点。这将看起来更像:

st_contains(poly, st_geomfromtext('POINT('||lon||' ' ||lat ||')')) = 't'

我使用了一个纬度/经度的例子...这里需要注意的唯一一件事是geomfromtext要求你使用||创建点,以从你的字段创建字符串。如果您需要在st_geomfromtext概念方面需要帮助,请告诉我。


在我的情况下,多边形和点位于不同的表中。将这些表连接起来仍然是一个好的解决方案吗? - sridharraman
没错,连接操作可以正常工作。我已经为您修改了答案。 - Twelfth
我正在使用几何类型存储点和多边形。让我尝试这个连接并查看性能如何。谢谢。 - sridharraman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接