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

Dan*_*anS 7 gis postgis ruby-on-rails

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

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

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

Nic*_*vén 14

要获得最接近的5个:

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

如果您有一个大数据集,并且知道您不想进一步搜索,比如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;
Run Code Online (Sandbox Code Playgroud)

/尼克拉斯


dc1*_*c10 6

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

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

  • 对于像我这样的其他新手,知道`SRID`的值应该是一个整数,指向用于计算距离的坐标系的通用已知ID可能会有所帮助.您可能希望使用地球的[Geodesic坐标系](https://en.wikipedia.org/wiki/World_Geodetic_System#WGS84),ID为4426**. (3认同)