我试图获得经度和纬度,从表格(具有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)}
我的模型有两个浮动属性:longitude
和latitude
。
答案 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)}
希望它可以帮助某人