使用纬度/经度

时间:2016-02-03 20:36:35

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

在我的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中实现它。

1 个答案:

答案 0 :(得分:2)

Nate在上面的评论中建议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
    

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

然后我就可以使用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}')")

感谢你的建议,Nate!