【问题标题】:Filter Rails records to within geo-polygonal area using latitude/longitude使用纬度/经度将 Rails 记录过滤到地理多边形区域内
【发布时间】:2016-02-03 20:36:35
【问题描述】:

在我的 Rails 应用程序中,我有搜索区域,它们是地理多边形(使用 Google Maps API 创建)。一旦在地图上绘制,搜索区域的坐标就会作为散列数组保存到记录中。它看起来像这样:

SearchArea.last.geo
=> [{"lat"=>"48.425555463221066", "lng"=>"-123.3793830871582"}, {"lat"=>"48.41336528699442", "lng"=>"-123.37800979614258"}, {"lat"=>"48.41006090395106", "lng"=>"-123.31672668457031"}, {"lat"=>"48.44696663691928", "lng"=>"-123.32067489624023"}]

我还有一些位置记录,它们的坐标保存为哈希,如下所示:

Location.last.geo
=> {"lat"=>"28.8138124", "lng"=>"-96.9977682"}

我需要能够搜索/过滤地理坐标位于给定搜索区域内的记录。我没有地理空间编程的经验,所以我希望有人可以在这里伸出援手。将不胜感激!

我看过的东西:

  • 我知道 Google Maps API 有一个 Geometry Library。不幸的是,这是客户端。
  • 我找到this的答案,引出了this的文章,不过是用C写的。
  • 2009 年的This article 有一些看起来应该可以工作的代码,但我不确定如何使用纬度/经度坐标来实现它。
  • This wiki page 有很多不同语言的 Ray-casting 实现,但同样,我不知道如何在 Ruby/Rails 中实现它。

【问题讨论】:

标签: ruby-on-rails ruby google-maps geospatial raycasting


【解决方案1】:

Nate 在上面的 cmets 中建议使用 PostGis,所以我同意了。

我最终使用this tutorial 在我的 Rails 应用上安装 PostGis,并在 2016 年进行了一些小改动:

  • 说添加require 'active_record/connection_adapters/postgis_adapter/railtie' 的行实际上应该是require 'active_record/connection_adapters/postgis_adapter'
  • 创建地理表列的语法已从t.point :latlon, :geographic => true 更改为t.geography "latlon", limit: {:srid=>4326, :type=>"point", :geographic=>true}
  • 基于this issue我还添加了以下初始化器:

    RGeo::ActiveRecord::SpatialFactoryStore.instance.tap do |config|
      config.default = RGeo::Geographic.spherical_factory(srid: 4326)
    end
    

本教程的其余部分是一个很好的参考,从安装 gems 到更新数据库配置。

然后我可以使用Point 创建一个位置:

Location.last.geo = "POINT(-123.366 48.428)"

以及使用Polygon 搜索的多边形区域:

SearchArea.last.geo = "POLYGON((-123.382 48.426, -123.353 48.402, -123.314 48.423, -123.332 48.443, -123.382 48.426))"

最后是查询;就是这么简单!

sa = SearchArea.last
Location.where("ST_Intersects(geo, '#{sa.geo}')")

谢谢你的建议,内特!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-30
    • 2012-03-21
    • 1970-01-01
    • 1970-01-01
    • 2012-08-24
    • 2018-12-20
    • 2010-11-07
    相关资源
    最近更新 更多