在我的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"}
我需要能够搜索/过滤具有属于给定搜索区域内的地理坐标的记录。我没有地理空间编程的经验,所以我希望有人可以在这里伸出援助之手。真的很感激!
我所关注的事情:
答案 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!