2012-02-05 58 views
1

如果我有一個表地理編碼 - 獲得位置

id, location, latitude, longitude 

,我將有一個位置代碼:(13.779242,100.472915)爲例。

!有兩個問題:我應該使用什麼字段類型的經緯度?雙?或者可能是空間的東西?但是對於計算距離來說更是如此?

不管怎樣,我想找到的位置(或者一個最準確的) 我在想輕鬆,如果我只想做這2個查詢:

Select * from location_table WHERE latitude > 13.779242 AND longitude > 100.472915." LIMIT 1"; // return as row 1 
Select * from location_table WHERE latitude < 13.779242 AND longitude < 100.472915." LIMIT 1"; // return as row2 

然後做一個比較

$lat_dis_1 = $row1->latitude - 13.779242; 
$lat_dis_2 = 13.779242 - $row2->latitude; 

if ($lat_dis_1 > $lat_dis_2) { 
// row2 was closer 
} else { 
//row1 closer 
} 

和經度相同...或者我只是想在這裏過於simpel?

+0

我有一個很難理解你的問題。你是否試圖找到2個位置中的哪個更靠近第三個位置? – thenetimp 2012-02-05 12:11:38

+0

不,我想查找經緯度的位置。但是給定的項目可能並不像db中那樣精確,所以需要找到最接近的地方。 – renevdkooi 2012-02-05 12:13:11

+0

雖然我不知道具體的答案,但我知道你可以用一個SQL查詢來做到這一點,然後返回第一行。我做了類似的商店定位器,這一切都在SQL中。 – thenetimp 2012-02-05 12:18:00

回答

1

你必須要考慮的第一件事是一圈的距離增加而不是正方形,這意味着只是比較經度和緯度分別可特別是在較長距離的情況下,會導致錯誤的結果。 下面是一個公式,它解釋瞭如何能相對平緩地計算兩點之間的真實距離的基本思想:http://www.purplemath.com/modules/distform.htm

另外一點,當你越過日線,在2點可以是地理上幾公里APPART,但只使用這種方法會出現半個地球的距離是。

還有一個問題,就是你期望從這一點上得到什麼樣的表現與準確性相比。如果精度不是那麼重要,但速度是,那麼使用簡單的平方比較會更有效率。另一種可能性是將這兩種技術結合起來。

第一種技術是(沒有測試:))的樣品:

SELECT SQRT(POW(latitude-[INPUT LATITUDE], 2)+POW(longitude-[INPUT LONGITUDE])) as dist, * FROM location_table ORDER BY dist ASC LIMIT 1 
相關問題