2013-01-15 80 views
2

我最近說過在GPS地圖上工作。我有一個經緯度列表的數據庫。當用戶訪問我的Web應用程序時,我想要顯示用戶點距離1km或指定半徑的位置。 我使用MySQL查詢顯示距離用戶緯度和經度1km半徑最近的地方

SELECT * FROM地點試圖
WHERE(MINLATITUDE和MAXLATITUDE之間的緯度)
和(MINLONGITUDE和MAXLONGITUDE之間的經度)

,但它顯示lat和MIN和MAX之間經度,能有人告訴我如何顯示經緯度,只有距用戶點1公里範圍內。
謝謝。

+0

這個問題看起來類似於這個stackoverflow討論:http://stackoverflow.com/questions/3168904/sql-query-to-query-nearby-points-of-interest-based-on-lat-long-sqlite – jeffmurphy

+0

@jeffmurphy感謝您的發佈。我該如何計算接近度,我的數據庫中的所有經緯度都是預先存儲的。看起來我應該運行一個查詢,以便通過檢查每條記錄來計算鄰近度,在db中我有超過10000條記錄。你能建議最好的方法嗎? – user1677685

+0

@jeffmurphy我已經計算出使用Haversine公式計算lat/long之間的距離。儘管如此,我仍然無法找到更快速計算距離的方法,現在我正在運行我的算法來調用DB中需要很長時間的每條記錄。你能爲我提出任何解決方案嗎? – user1677685

回答

1

對於1公里左右的距離,Haversine是矯枉過正。使用更簡單的Equirectangular投影來熟悉x和y。請記住,lat和lon以下的公式是IN RADIANS。距離d以km爲單位,因爲地球的半徑(R)以km爲單位。經緯度以弧度表示(是的,我再說一遍)。與Haversine相比,這消除了幾個trig函數,這會使查詢更快。現在

var R = 6371; // radius of the earth in km 
var x = (lon2-lon1) * Math.cos((lat1+lat2)/2); 
var y = (lat2-lat1); 
var d = Math.sqrt(x*x + y*y) * R; // distance in km 

,這是一個Web應用程序,所以我會認爲聖誕老人(北極),並在南極站的人不會使用你的應用程序。有了這個假設,你可以在經度上組織你的經緯度點。因此,如果某人的最低緯度是-76.1,那麼您知道數據庫中小於-78度的經度比1公里遠。你也知道大於-74度的經度也很不錯。這將減少您需要檢查數據庫的點數。

+0

當我使用你的公式時,我得到的結果是錯誤的。通過使用haversine公式,輸出是正確的,並且感謝您關於搜索座標的解釋。 – user1677685

+0

每個點都在做Haversine嗎?您需要先對數據進行排序,然後將以上公式應用於其餘點。沒有必要使用Haversine來計算從紐約到中國的距離。你知道這已經超過1公里。上面的公式是有效的(http://www.movable-type.co.uk/scripts/latlong.html)。沒有看到你的一些代碼很難說。 – TreyA

+0

你是對的我不需要使用haversine進一步的距離,但我需要找到一個區域的距離(例如:point1 -34.9281,138.60132和point2 -34.9281,138.61932)在我的數據庫中會有更多這樣的。我必須只顯示哪些在1公里內 – user1677685

相關問題