ruby-on-rails - 使用 PostGIS 和 Rails 查找边界框内的所有项目

标签 ruby-on-rails postgresql gis postgis

我有一个 Rails 模型,它使用 PostGIS POINT 类型来存储位置的坐标。如何查询边界框内包含的所有位置?边界框来自 Google map ,如下所示:

/locations?within=40.766159%2C-73.989786%2C40.772781%2C-73.979905&per_page=500

然后在我的模型中我有一个范围来处理这个,但无法弄清楚如何正确查询:

scope :within, ->(box_string) {
    sw = box_string.split(",")[0..1].reverse.map {|c| c.to_f}
    ne = box_string.split(",")[2..3].reverse.map {|c| c.to_f}
    box = "BOX3D(#{sw[0]} #{sw[1]}, #{ne[0]} #{ne[1]})"
    where( ***WHAT DO I DO HERE?*** )
  }

最佳答案

使用 rgeo gem:

gem 文件:

gem 'rgeo'

模型.rb:

def self.within_box(sw_lat, sw_lon, ne_lat, ne_lon)
  factory = RGeo::Geographic.spherical_factory
  sw = factory.point(sw_lon, sw_lat)
  ne = factory.point(ne_lon, ne_lat)
  window = RGeo::Cartesian::BoundingBox.create_from_points(sw, ne).to_geometry
  where("your_point_column && ?", window)
end

请注意,工厂 point 方法的参数顺序是 (lon, lat)。

您可能需要使用包含 rgeo 的 activerecord-postgis-adapter gem。

关于ruby-on-rails - 使用 PostGIS 和 Rails 查找边界框内的所有项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14287260/

相关文章:

r - 寻找允许选择/识别与源多边形共享线段的多边形的功能

php - 将 Lat/Long 空间扩展插入 MySQL

javascript - 查看传单 geojson 时出现扭曲

mysql - Ruby on Rails - 来自 ActiveRecord 的 MySQL 中的 UTF8 编码问题

ruby-on-rails - 如何在 Ruby on Rails 中获取人类可读的类名?

html - 使用 capybara 选择页面上的删除销毁链接

css - 在 rails 中预加载 SASS/CSS 背景图像

sql - 用于传输表数据的 psql COPY 命令是否正确?

postgresql - 如何替换postgresql函数体?

sql - Postgres : How to join multiple tables?