Ruby on rails 按最近的顺序排列-PostGIS、Georguby、spatial_适配器

Ruby on rails 按最近的顺序排列-PostGIS、Georguby、spatial_适配器,ruby-on-rails,gis,postgis,Ruby On Rails,Gis,Postgis,我正在尝试执行订单查询,以查找最接近当前用户的记录 我知道两点之间的距离是:当前位置_distance@record.position 如何将其应用到PostGIS或active_record/spatial适配器查询中?查看PostGIS中的ST_Distance文档。如果您不需要使用PostGIS,geo kit可以使用google或yahoo完美实现这一点。我只使用过google,在您的查询中,您可以按距离排序,这太棒了。要获得最接近的5个: SELECT * FROM your_tabl

我正在尝试执行订单查询,以查找最接近当前用户的记录

我知道两点之间的距离是:当前位置_distance@record.position


如何将其应用到PostGIS或active_record/spatial适配器查询中?

查看PostGIS中的ST_Distance文档。

如果您不需要使用PostGIS,geo kit可以使用google或yahoo完美实现这一点。我只使用过google,在您的查询中,您可以按距离排序,这太棒了。

要获得最接近的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;

/Nicklas

总结一下,在大家的帮助下,我已经让它按照我想要的方式工作:

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

如果您真的想找到最接近CurrnTyx用户的5条记录,请考虑PASGIS 2中KNN索引所支持的邻域搜索,请参阅运算符:


从您的表顺序中按您的表选择*。geom ST_geomfromtext您的点为wkt,1000 LIMIT 5

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

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

我在助手方法中的位置为当前位置。您知道是否可以将其插入到查询轨道中吗?类似于:。订单'ST_distance items.position,{current_location}的问题是我需要两个配额。ordercurrent_Location在“your point as wkt”后面的WHERE行中缺少一个括号为什么要将其作为wkt传递?对于像我这样的其他新手,知道ST_Distance调用中的项指的是具有地理编码元素的DB表的名称可能会有所帮助。你是对的,但你受到google对其API的请求限制。在这种情况下,它是2500 request/24 hrs您应该在答案中添加如何在Rails/rgeof中定义lonlat或其他像我这样的新手,了解SRID的值应该是一个整数可能会有所帮助,该整数指向用于计算距离的坐标系的通用ID。你很可能想使用地球的ID 4326。