2008-09-22 112 views
12

我想實現一種方式來顯示存儲地址的列表,按照與給定地址的鄰近性進行排序。用於計算兩個地址之間距離的現有服務有哪些?

列表中的地址將存儲在數據庫表中。單獨的部分有單獨的字段(我們有郵政編碼,城市名稱等字段),所以它不僅僅是一個巨大的varchar。這些是用戶輸入的,並且由於系統的性質可能並不總是完整的(有些可能缺少郵政編碼,其他的可能只有城市和州)。

雖然這是用於Intranet應用程序,但使用外部資源(包括訪問互聯網Web服務等)沒有問題。我實際上更喜歡這樣做,除非自己做起來微不足道。如果Google或Yahoo!已經提供免費服務,我非常樂意檢查它。關鍵字必須是免費的,因爲我無權爲此功能在此項目上增加任何額外的成本,因爲它已經是一種獎勵「可以說」。

我在想這個很像很多磚&迫擊炮店做他們的「查找位置」功能。顯示在一個簡單的表格中適當排序並顯示距離(例如,英里)是很好的。顯示地圖mash-up更酷,但我絕對可以生活在遙遠的距離和我處理所有後續的顯示和排序。

簡單距離算法的問題是數據的性質。由於地址的全部或部分可能是未定義的,因此我沒有像緯度/長的座標那樣方便。另外,即使我需要郵政編碼,90%的地址也可能具有相同的五個郵政編碼。正如我們所知,任何需要超過7秒才能顯示在頁面上的延遲時間可能對於普通用戶來說太長而不能等待。如果這樣的假設服務支持一次發送一批地址而不是一次查詢一個地址,那就太棒了。儘管如此,我認爲地址列表不會超過50個。

回答

10

GoogleYahoo!都提供免費的地理編碼服務。您可以使用Haversine formulaimplemented in .NET or SQL)計算距離。這兩種服務都可以讓你進行部分搜索(僅限郵政編碼,僅限城市),並會告訴你他們搜索結果的精確度(這樣即使沒有有意義的信息,你也可以排除地點,儘管Yahoo!提供的信息比Google更精確)。

+0

我一定會研究這一點。我們已經在同一系統的另一部分內鏈接到Yahoo!映射以提供任意輸入地址的位置信息。但在那種情況下,我不需要任何種類的接近... – 2008-09-22 18:02:25

+0

請告訴您使用了哪種解決方案...以便其他人也可以從中受益...我也有類似的問題... http:///stackoverflow.com/questions/7426710/how-to-find-the-distance-between-two-zipcodes-using-java-code – aProgrammer 2011-09-16 07:33:47

1

難道你不能只使用谷歌地圖API來獲取距離和排序他們在你身邊?

http://code.google.com/apis/maps/

+0

訂閱服務由於這是非公共/內聯網,我需要使用Google Maps API Premier,這是非免費的。 – 2009-06-08 21:00:05

0

我建議調查谷歌地圖API。

它需要你有一個外部連接(爲了將數據分流到一個Web服務中,它可以正常工作),但它提供了你需要的東西,也就是通過詢問2點和從中獲得距離。

API reference of the directions API

0

有一件事我們已經在我公司做的是欺騙,並使用郵政編碼(郵政編碼區域的大致中心)的緯度/經度。這不是完美的,但它足夠接近那些在n英里的y類型搜索中找到我的x。 當地址清理服務無法識別地址時,這特別有用。

在某些時候,我遇到了一個免費的郵政編碼到緯度/經度查找表,以用於這種近似。對不起,我沒有鏈接到這個了。

+0

如果不是因爲他們的名單中的幾乎所有地點都位於少量的郵政編碼內(即所有地區在同一城市地區),這將是一個不錯的主意,因此這將不準確足夠我不認爲。但可能仍然值得研究... – 2008-09-22 17:59:11

4

由於使用條款的限制,Google Maps API對您來說並不好。然而,雅虎提供了一個REST服務來將地址轉換成長/長座標,然後您可以使用它來計算距離。它的here

+0

+1提及Google的苛刻條款和條件..... – aProgrammer 2011-09-23 06:02:03

0

其他人已經在Daft Logic(編輯:打字錯誤)完成了。他們使用Google Maps API和Great-circle formula。我不認爲這很難實施。

更新:實際上,您只需從您最喜歡的提供商獲取座標,然後使用您的代碼進行計算。當用戶提供他們的位置時,您可以預先加載商店的座標 - 您甚至可以將其用於驗證。然後,在提出請求時,您只能查找客戶的位置。

2

要求他們輸入郵政編碼,然後創建一個將郵政編碼映射到緯度/經度對(或在線查找)的數據庫表。我不知道你是如何工作的,但在這裏,郵政編碼可以具體到幾米,所以應該足夠精確。然後用這個方法來計算兩個郵政編碼之間的距離:

public static double distance(double lat1, double lon1, double lat2, double lon2, char unit) 
{ 
    double theta = lon1 - lon2; 
    double dist = Math.Sin(deg2rad(lat1)) * Math.Sin(deg2rad(lat2)) + 
    Math.Cos(deg2rad(lat1)) * Math.Cos(deg2rad(lat2)) * Math.Cos(deg2rad(theta)); 
    dist = Math.Acos(dist); 
    dist = rad2deg(dist); 
    dist = dist * 60 * 1.1515; 
    if (unit == 'K') 
    { 
    dist = dist * 1.609344; 
    } 
    else if (unit == 'N') 
    { 
    dist = dist * 0.8684; 
    } 
    return (dist); 
} 

private static double deg2rad(double deg) 
{ 
    return (deg * Math.PI/180.0); 
} 

private static double rad2deg(double rad) 
{ 
    return (rad/Math.PI * 180.0); 
} 

使用自己的代碼在地理編碼服務的好處是,你可以那麼做了一堆更有趣的計算對數據以及存儲的東西一起在你的分貝。

相關問題