我正在尝试执行查找最接近current_user的记录的订单查询。
我知道两点之间的距离是:current_location.euclidean_distance(@record.position)
如何将其用于PostGIS(或active_record / spatial_adapter)查询?
答案 0 :(得分:14)
要获得最接近的5个:
SELECT * FROM your_table
ORDER BY ST_Distance(your_table.geom, ST_Geomfromtext(your point as wkt))
limit 5;
如果你有一个大数据集并且知道你不想进一步搜索,比如说1公里,那么查询将更有效率,如果你这样做:
SELECT * FROM your_table
WHERE ST_DWithin(your_table.geom, ST_Geomfromtext(your point as wkt, 1000)
ORDER BY ST_Distance(your_table.geom, ST_Geomfromtext(your point as wkt))
limit 5;
/尼克拉斯
答案 1 :(得分:6)
以防万一有人在rails 4中遇到这个问题。 我正在使用rgeo gem,这对我有用
scope :closest, ->(point) { order("ST_Distance(lonlat, ST_GeomFromText('# {point.as_text}', #{SRID}))").limit(5) }
答案 2 :(得分:2)
为了把它包起来,在每个人的帮助下,我都按照自己的方式工作:
order("ST_Distance(items.position, ST_GeomFromText('POINT (#{current_location.y} #{current_location.x})', #{SRID}))")
答案 3 :(得分:2)
如果你真的想要找到最接近current_user的5条记录,请考虑邻域搜索,这是PostGIS 2.0中KNN索引支持的(参见'< - >'运算符):
SELECT * FROM your_table ORDER BY your_table.geom <-> ST_Geomfromtext(your point as wkt, 1000) LIMIT 5
答案 4 :(得分:1)
查看PostGIS中的ST_Distance文档。
答案 5 :(得分:0)
如果您不需要使用PostGIS,geo-kit可以完美地使用谷歌或雅虎(我只使用谷歌),在你的查询中你可以按距离排序,它真棒..