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

时间:2011-12-07 09:23:21

标签: ruby-on-rails ruby postgis polygons

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

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

有更快或更好的方法吗?

1 个答案:

答案 0 :(得分: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'

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