按最近的顺序排列 - PostGIS,GeoRuby,spatial_adapter

时间:2011-02-24 23:00:39

标签: ruby-on-rails gis postgis

我正在尝试执行查找最接近current_user的记录的订单查询。

我知道两点之间的距离是:current_location.euclidean_distance(@record.position)

如何将其用于PostGIS(或active_record / spatial_adapter)查询?

6 个答案:

答案 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可以完美地使用谷歌或雅虎(我只使用谷歌),在你的查询中你可以按距离排序,它真棒..