ruby-on-rails - 给定点和多边形的集合,确定哪个点位于(或不在)哪个多边形中

标签 ruby-on-rails ruby postgis polygons

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

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

是否有更快或最佳的方法来执行此操作?

最佳答案

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

关于ruby-on-rails - 给定点和多边形的集合,确定哪个点位于(或不在)哪个多边形中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8412937/

相关文章:

ruby-on-rails - Vagrant -v 忽略 ffi -nokogiri 和 unf_ext 因为它的扩展没有构建

ruby-on-rails - $捆绑安装: Failed to build gem native extension

ruby - sinatra 和 http PUT

postgresql - 如何在 ubuntu 12.04LTS Precise 上的 postgresql-9.3 上添加 pgrouting

postgresql - pg_dump 不在 Linux 上为 postgis 使用 $libdir

ruby-on-rails - 使用 wicked_pdf gem 和 wkhtmltopdf 在 PDF 上显示图像标题

ruby-on-rails - Rails 应用程序和定位堆栈跟踪

javascript - Chrome/Firefox 中的 Ruby 时间转 JavaScript 日期

ruby - youtube_it gem找不到视频时如何处理404响应

python - 使用 PyQGIS 从 POSTGIS 数据库中获取表名