2010-02-16 83 views
1

我有一個包含物理地址和地理編碼的約60家商店的列表。我想創建一個簡單的界面,用戶可以輸入一個郵政編碼,城市和州,甚至街道地址,並按照輸入的地址的順序排列列表。據我所知,這是網站的一個非常常見的功能。按地點查找店鋪

我的計劃是使用Google Maps API來查找輸入位置的地理編碼,並使用畢達哥拉斯定理計算每個位置的距離並按距離對列表進行排序並返回結果(或可能結果集的前5個......)。

這是正確的方法嗎?有沒有更好的方法或內置Google Maps API的功能?由於這是常見的事情,我會想象已經有很多方面進行過嘗試和測試,可能有幾個正確的答案。我只是在尋找一些建議,如果我正在以這種正確的方式進行討論。

謝謝。

回答

2

畢達哥拉斯定理是不夠的。地球的曲線如此。它需要一點歐幾里德幾何。該formula和一個簡單的實現尋找地球上兩點之間的距離 - 正如鳥飛,而不是實際的旅行距離 - 是(在PHP):

// pass the latitudes and longitudes in as degrees 
function getDistance($lat1,$long1,$lat2,$long2) 
{ 
    $r = 3963.1; //3963.1 statute miles; 3443.9 nautical miles; 6378 km 
    $pi = pi(); 

    // convert the degrees to radians 
    $lat1 = $lat1*($pi/180); 
    $lat2 = $lat2*($pi/180); 
    $long1 = $long1*($pi/180); 
    $long2 = $long2*($pi/180); 

    $ret = (acos(cos($lat1)*cos($long1)*cos($lat2)*cos($long2) + cos($lat1)*sin($long1)*cos($lat2)*sin($long2) + sin($lat1)*sin($lat2)) * $r) ; 
    return $ret; 
} 

你可以在你的代碼包含一個版本的這一點。另外這裏是一個可能的(未經測試的)函數,它是我用於MySQL的另一個函數的衍生物。

DELIMITER $$ 

DROP FUNCTION IF EXISTS `FindDist` $$ 
CREATE FUNCTION `FindDist` (lt1 DOUBLE,lg1 DOUBLE,lt2 DOUBLE,lg2 DOUBLE) RETURNS DOUBLE 
DETERMINISTIC 
BEGIN 
    DECLARE dist,eradius DOUBLE; 

    SET eradius=3963.1; 
    SET dist=Acos(Cos(lt1) * Cos(lg1) * Cos(lt2) * Cos(lg2) + Cos(lt1) * Sin(lg1) * Cos(lt2) * Sin(lg2) + Sin(lt1) * Sin(lt2)) * eradius; 
    RETURN dist; 
END $$ 

DELIMITER ; 
1

當我在研究類似的東西時,我發現此鏈接。它使用.NET,但是這些原則適用於任何語言/框架。

Store Locator: Help customers find you with Google Maps

的解決方案的主要部分是使用Haversine Formul一個尋找指定爲經度和緯度的兩個點之間的距離。有上述文章在這裏鏈接到該式的C#實現:

Distance between locations using latitude and longitude (CodeProject)

多一點亂翻透露:

Calculate Distance Between Two Points on a Globe in 9 Different Languages