2017-01-23 33 views
0

我有一個GpsLocation型號,該型號具有latitude,longituderadius屬性。根據動態半徑在另一個附近尋找gps位置

我想根據它的經緯度和半徑找到一個GpsLocation。

因此,讓我說我在位置[52,4],我想找到一個具有這些確切座標或距離爲radius米的GpsLocation實例。

我正在使用geocoder寶石,但near函數不能完成這項工作。另外嘗試猴子修補附近的功能,所以我可以使用數據庫列而不是查詢內的變量,但仍然沒有運氣,有一些機制,在提供半徑參數時將緯度/長度轉換爲一個範圍。

任何幫助表示讚賞

回答

1

計算球體上的兩點之間的距離可以用Haversine formula來完成。有一個名爲haversine的寶石可以提供幫助。或者,如果您使用的是PostgreSQL,則還有earthdistance模塊。

但是,你可能會發現放鬆你的「接近」定義有點容易,因爲處理圈子可能會令人討厭。相反,請考慮使用正方形或矩形。

假設你在10英里內定義「near」。如果您將它視爲給定點緯度和經度的正負因子,那麼您可以執行一個簡單的查詢來一次查找所有附近點,而不是一系列Haversine計算。您的查詢可能如下所示:

# Only accurate in the U.S. 
MILES_PER_LATITUDE = 69.0 
MILES_PER_LONGITUDE = 55.0 

min_latitude = thisLocation.latitude - (10.0/MILES_PER_LATITUDE) 
max_latitude = thisLocation.latitude + (10.0/MILES_PER_LATITUDE) 
min_longitude = thisLocation.longitude - (10.0/MILES_PER_LONGITUDE) 
max_longitude = thisLocation.longitude + (10.0/MILES_PER_LONGITUDE) 

nearby_points = GpsLocation.where(latitude: min_latitude..max_latitude).where(longitude: min_longitude..max_longitude)