我正在嘗試執行查找最接近current_user的記錄的訂單查詢。按距離排序 - PostGIS,GeoRuby,spatial_adapter
我知道兩點之間的距離是:current_location.euclidean_distance(@record.position)
我如何工作的這成爲了PostGIS(或active_record/spatial_adapter)查詢?
我正在嘗試執行查找最接近current_user的記錄的訂單查詢。按距離排序 - PostGIS,GeoRuby,spatial_adapter
我知道兩點之間的距離是:current_location.euclidean_distance(@record.position)
我如何工作的這成爲了PostGIS(或active_record/spatial_adapter)查詢?
要獲得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;
/尼克拉斯
查看PostGIS中的ST_Distance文檔。
如果你不需要使用PostGIS的,地理套件這是否完美使用谷歌或雅虎(我只用谷歌),並在查詢中您可以通過距離,它的真棒排序..
你是對的,但你是谷歌的請求限制限制爲他們的API。在這種情況下,它是2500請求/ 24小時 – dc10 2014-04-16 21:14:05
爲了總結這件事,有大家的幫助,我得到它的工作我如何想:
order("ST_Distance(items.position, ST_GeomFromText('POINT (#{current_location.y} #{current_location.x})', #{SRID}))")
如果你真的想找到字面上的5個記錄最接近CURRENT_USER,考慮鄰域搜索,這是在PostGIS的2.0由KNN索引支持(見 '< - >' 運算符):
SELECT * FROM your_table ORDER BY your_table.geom < - > ST_Geomfromtext(您的點作爲高鐵總站,1000) LIMIT 5
對你的,S.
萬一有人在鐵軌4 我使用rgeo寶石絆倒在這個問題上,這對我的作品
scope :closest, ->(point) { order("ST_Distance(lonlat, ST_GeomFromText('# {point.as_text}', #{SRID}))").limit(5) }
我有我的位置在一個幫助方法current_location。你知道是否有可能將其插入到查詢中(rails)?例如:'.order('ST_Distance(items.position,#{current_location})')' – DanS 2011-02-25 08:34:22
問題是我需要雙重quoates。 '.order(「#current_location」)' – DanS 2011-02-25 09:00:57
'您的積分爲'wkt'後,在WHERE行中缺少一個支架 – DanS 2011-02-25 10:19:04