【问题标题】:Given collection of points and polygons, determine which point lies in which polygon (or not)给定点和多边形的集合,确定哪个点位于哪个多边形中(或不在哪个多边形中)
【发布时间】:2012-01-14 19:46:27
【问题描述】:

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

我有一大堆这样的多边形。同样,我有很多点。我目前正在运行一个 RoR 模块,它一次需要 1 个点,并一次检查相对于 1 个多边形的交集。数据库是 PostGIS。性能很慢。

有没有更快或最佳的方法来做到这一点?

【问题讨论】:

  • 有趣的问题。在这里以恒定的周期击败通常的东西。
  • 多边形是规则的还是不规则的?

标签: ruby-on-rails ruby postgis polygons


【解决方案1】:

可以作为一个选择语句来完成,但为了性能....查看多边形上的要点索引。为简单起见,假设我有一个包含多边形字段(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 概念的帮助,请告诉我。

【讨论】:

  • 在我的例子中,多边形和点在不同的表中。表的连接仍然是一个好的解决方案吗?
  • 是的,加入会正常工作。为你修改了我的答案
  • 我将点存储在几何类型中。多边形也是。让我试试这个加入,看看性能如何。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-05
  • 1970-01-01
  • 2020-12-03
  • 1970-01-01
相关资源
最近更新 更多