2011-02-24 54 views
7

我正在嘗試執行查找最接近current_user的記錄的訂單查詢。按距離排序 - PostGIS,GeoRuby,spatial_adapter

我知道兩點之間的距離是:current_location.euclidean_distance(@record.position)

我如何工作的這成爲了PostGIS(或active_record/spatial_adapter)查詢?

回答

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; 

/尼克拉斯

+0

我有我的位置在一個幫助方法current_location。你知道是否有可能將其插入到查詢中(rails)?例如:'.order('ST_Distance(items.position,#{current_location})')' – DanS 2011-02-25 08:34:22

+0

問題是我需要雙重quoates。 '.order(「#current_location」)' – DanS 2011-02-25 09:00:57

+1

'您的積分爲'wkt'後,在WHERE行中缺少一個支架 – DanS 2011-02-25 10:19:04

1

查看PostGIS中的ST_Distance文檔。

0

如果你不需要使用PostGIS的,地理套件這是否完美使用谷歌或雅虎(我只用谷歌),並在查詢中您可以通過距離,它的真棒排序..

+1

你是對的,但你是谷歌的請求限制限制爲他們的API。在這種情況下,它是2500請求/ 24小時 – dc10 2014-04-16 21:14:05

2

爲了總結這件事,有大家的幫助,我得到它的工作我如何想:

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

如果你真的想找到字面上的5個記錄最接近CURRENT_USER,考慮鄰域搜索,這是在PostGIS的2.0由KNN索引支持(見 '< - >' 運算符):

SELECT * FROM your_table ORDER BY your_table.geom < - > ST_Geomfromtext(您的點作爲高鐵總站,1000) LIMIT 5

你的,S.

5

萬一有人在鐵軌4 我使用rgeo寶石絆倒在這個問題上,這對我的作品

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

你應該添加回答你如何在Rails中定義'lonlat'/rgeo – Tilo 2014-08-24 22:38:47

+3

對於像我這樣的其他新手來說,知道'SRID'的值應該是一個指向普遍已知的ID的整數您用於計算距離的座標系統。您最可能正在尋找使用ID ** 4326 **的行星地球的[測地座標系統](https://en.wikipedia.org/wiki/World_Geodetic_System#WGS84)。 – sameers 2015-09-19 18:09:07