我正在使用RoR和PostGIS来存储位置数据。 我正在尝试使用圆形存储估计的位置(例如,带有半径的中心点)。
我尝试过类似的东西,但它不起作用:
@location = Location.new(:place_id => place.id,
:circle => %{ST_Buffer(ST_MakePoint(#{latitude}, #{longitude})::geography, #{accuracy})})
我也尝试过使用RGeo并且它是工厂但不确定如何正确使用它。
任何帮助将不胜感激。 感谢。
编辑1: 我取得了一些进展。
factory = RGeo::Cartesian.factory
center_point = factory.point(latitude, longitude)
circle = center_point.buffer(accuracy)
@location = Location.new(:place_id => place.id,
:circle => circle)
但是 - 现在它抛出以下异常:
can't cast RGeo::Cartesian::Polygon Impl to string
再次,任何帮助将不胜感激。
答案 0 :(得分:1)
看起来circle
表中名为locations
的列是文本列而不是几何列。架构是什么样的?
您可能也想设置SRID。
circle = RGeo::Cartesian.factory.point(0, 0).buffer(20)
@location = Location.new(:place_id => place.id, :circle => circle)
@locaiton.save
另一个,可能更好的选择是只存储具有一定距离的位置的确切位置和查询。您可以使用距离运算符(http://postgis.net/docs/manual-2.1/geometry_distance_centroid.html)或重叠运算符(http://postgis.net/docs/manual-2.1/geometry_overlaps.html)。