2013-10-14 26 views
0

我有一個帶geocoder gem的rails 3應用程序。當用戶在我的網站上創建一個帳戶時,他給我他的地址。使用地理編碼器,我將他的lat和他的lng存儲在我的數據庫中,這樣我就可以將他放在Google地圖中。靠近用戶排序

當用戶進行搜索時,他必須找到最接近他的用戶。

就目前而言,我計算半徑與地理編碼器發現用戶在它:

bounds_calc = Geocoder::Calculations.bounding_box(center, radius, units: :km) 
users = User.where('? < addresses.lat AND addresses.lat < ?', bounds_calc[0], bounds_calc[2]).where('? < addresses.lng AND addresses.lng < ?', bounds_calc[1], bounds_calc[3]) 

我想要做的是排序users從最接近最遠。有沒有簡單的方法來做到這一點?

+1

也許這個寶石可以幫助你:https://github.com/geokit/geokit-rails。 – JoJoS

+0

我認爲,如果你使用User.near,結果將自動按距離排序... – sailor

+0

你計算一個*邊界框*並選擇該框內的用戶。 – Stefan

回答

0

我發現怎麼我的用戶的數組排序地理編碼:

results = results.sort_by { |x| Geocoder::Calculations.distance_between([x.latitude, x.longitude], [loc.first, loc.second]) } 

我做了我的讀碼彼得·戈爾茨坦的答案,所以我不知道,如果他的答案之前的作品。 我喜歡我的解決方案,因爲它可以在任何數組上調用,而不是在地理編碼實例上調用的其他數組。

但是,我不知道哪種解決方案最快。

+0

我不太瞭解你的解決方案,因爲它似乎沒有解決原始問題。這裏寫的解決方案(i)要求首先將用戶列表放在內存中,這會破壞使用PostGis的目的,並且(ii)不會施加任何類型的邊界框,這大概是在結果數組正在建設。使用nearbys可以在一個請求中解決所有這些問題。 –

0

假設你有一個地理編碼的用戶實例,你應該能夠在地理編碼實例上使用'nearbys'方法。因此,對於用戶,你應該能夠編寫

user.nearbys(radius_in_miles) 

其中radius_in_miles是英里邊界圓的半徑。默認排序距離最遠。