使用RoR和postGIS

时间:2016-01-04 14:52:35

标签: ruby-on-rails postgis

我试图获得经度和纬度,从表格(具有lon和lat属性)返回1英里范围内的所有记录。 我在想我应该用ST_Dwithin和ST_MakePoint做些什么,但不知道如何使用它。

这就是我现在所拥有的:

def get_nearby(longitude, latitude)
  Device.where(ST_DWithin(ST_MakePoint(longitude, latitude, 1.60934)))
end

[UPDATE] 所以,我的最终功能是:

  scope :nearby_devices, ->(lon,lan) { where(
    <<-SQL,
      ST_DWithin(
        ST_SetSRID(ST_MakePoint(longitude,latitude), 4326),
        ST_SetSRID(ST_MakePoint(?, ?), 4326),
        1.60934
      )
    SQL
  lon,lan)}

我的模型有两个浮动属性:longitudelatitude

2 个答案:

答案 0 :(得分:0)

ST_DWithin的参数为geometry, geometry, distance,因此您处于正确的轨道上。假设Device有一个名为coordinates的纬度/经度列,则需要make a point的正确类型(可能是WGS 84)并将其与coordinates进行比较。

Device.where(
  <<-SQL,
    ST_DWithin(
      coordinates,
      ST_SetSRID(ST_MakePoint(?, ?), 4326),
      1.60934
    )
  SQL
  longitude, latitude
)

答案 1 :(得分:0)

我在这里发布最终版本:这个解决方案让我以米为单位测量距离:

scope :nearby_devices, ->(lon, lat) {
    Device.where( "ST_Distance_Sphere(ST_SetSRID(ST_MakePoint(longitude,latitude), 4326),
      ST_SetSRID(ST_MakePoint(?, ?), 4326)) <= 1609 ", lon, lat)}

希望它可以帮助某人