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

问题描述 投票:7回答:6

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

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

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

ruby-on-rails gis postgis
6个回答
14
投票

要获得最接近的5个:

SELECT * FROM your_table 
ORDER BY ST_Distance(your_table.geom, ST_Geomfromtext(your point as wkt)) 
limit 5;

如果您有一个大数据集,并且知道您不想进一步搜索,比如1 km,那么如果您执行以下操作,查询将更有效:

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;

/尼克拉斯


6
投票

以防万一有人在rails 4中偶然发现这个问题。我正在使用rgeo gem,这对我有用

scope :closest, ->(point) { order("ST_Distance(lonlat, ST_GeomFromText('#    {point.as_text}', #{SRID}))").limit(5) }

2
投票

为了把它包起来,在每个人的帮助下我都按照我想要的方式工作:

order("ST_Distance(items.position, ST_GeomFromText('POINT (#{current_location.y} #{current_location.x})', #{SRID}))")

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


1
投票

查看PostGIS中的ST_Distance文档。


0
投票

如果您不需要使用PostGIS,geo-kit可以完美地使用谷歌或雅虎(我只使用谷歌),在你的查询中你可以按距离排序,它真棒..

© www.soinside.com 2019 - 2024. All rights reserved.