The Haversine formula

在我們設計App時,有時候我們會需要獲得使用者的地理位置資訊
然後用使用者目前的經緯度座標,計算離使用者地點最近的幾個地點
這時候如果你的資料庫中有存放一些地點的座標資料
那我們就可以使用所謂的Haversine公式,來算出地球上使用者與這些地點座標之間的距離


(簡單的解釋一下每個符號的意義:d是距離,r是弧度,φ是經度,λ是緯度)
然後假設我們資料庫中有一個資料表(table)
且資料表中的每個欄位記錄了每個地點的名稱(name)與座標(lat, lon),例如
table
name
lat
lon
name_1
latitude_1
longitude_1
name_2
latitude_2
longitude_2
...
...
...

接著我們可以將上面的公式轉換一下並且假設我們現在的座標在(23, 120)
在資料庫中就可以用這個語法來查詢
SELECT
     name,
     ( 6371 * acos( cos( radians( 23 ) ) * cos( radians( lat ) ) * cos( radians( lon ) 
     - radians( 120 ) ) + sin( radians( 23 ) ) * sin( radians( lat ) ) ) ) AS distance
FROM
     table
ORDER BY
     distance   
結果就會顯示這些地點的名稱與使用者之間的距離(公里),並且已經依照遠近排序
其中用到的acos()、cos()、sin()、radians()等函數,在MySQL中都可以直接使用

Reference


Haversine formula - Wikipedia, the free encyclopedia
Creating a Store Locator with PHP, MySQL & Google Maps - Google Maps API — Google Developers

沒有留言:

張貼留言