2010-11-16 37 views
9

我有一個位置(緯度&經度)。如何獲得我的位置10英里範圍內的部分或全部郵編的列表?給定座標,我如何獲得10英里半徑範圍內的所有郵編?

該解決方案可以是對衆所周知的Web服務(谷歌地圖,bing地圖等)或本地數據庫解決方案(客戶端具有sql server 2005)或算法的調用。

我已經看到了similar question,但所有的答案都與使用SQL Server 2008地理功能有關,這些功能對我來說是無法使用的。

+2

你想在哪個國家找到郵政編碼? – Pedery 2010-11-16 02:06:57

+0

@Pedery。 A – AngryHacker 2010-11-16 05:35:46

回答

5

首先,您需要一個包含所有郵編及其對應緯度和經度的數據庫。在澳大利亞,這些數字只有幾千(而且信息很容易獲得),但是我認爲這在美國可能是一項更加困難的任務。其次,考慮到你知道你在哪裏,並且你知道你正在尋找的半徑,你可以查找該半徑範圍內的所有郵編。簡單的東西用PHP編寫的將是如下:(道歉它不是在C#)

function distanceFromTo($latitude1,$longitude1,$latitude2,$longitude2,$km){ 
    $latitude1 = deg2rad($latitude1); 
    $longitude1 = deg2rad($longitude1); 
    $latitude2 = deg2rad($latitude2); 
    $longitude2 = deg2rad($longitude2); 
    $delta_latitude = $latitude2 - $latitude1; 
    $delta_longitude = $longitude2 - $longitude1; 
    $temp = pow(sin($delta_latitude/2.0),2) + cos($latitude1) * cos($latitude2) * pow(sin($delta_longitude/2.0),2); 
    $earth_radius = 3956; 
    $distance = $earth_radius * 2 * atan2(sqrt($temp),sqrt(1-$temp)); 
    if ($km) 
    $distance = $distance * 1.609344; 
    return $distance; 
} 
+0

的美國AngryHacker:Luke發佈了我提到的Haversine公式的PHP實現。 – winwaed 2010-11-16 03:16:52

5

大多數搜索與質心一起工作。爲了在10英里範圍內使用部分郵編,您將不得不購買郵編多邊形(*)的數據庫。然後實現一個算法,檢查10英里半徑內的頂點的郵政編碼。爲了正確完成,你需要使用Haversine公式來進行距離測量。藉助一些聰明的數據結構,您可以顯着縮小搜索空間。同樣,通過存儲並初步比較zipcoe範圍(北,西,東,南),可以大大加快搜索速度。

(*)注意:技術上zipcodes不是多邊形!我知道我們都是這樣想的,但實際上他們是數據點(街道地址)的集合,這就是USPS真正使用它們的方式。這意味着郵編可以包含其他郵編;郵編可以由多個「多邊形」組成;和郵編可以重疊其他郵編。這些情況大多不應該是一個問題,但您必須處理可定義爲多個多邊形的郵政編碼。

9

開始與包含郵編和其相應的緯度和經度座標郵政編碼數據庫:

http://www.zipcodedownload.com/Products/Product/Z5Commercial/Standard/Overview/

要獲得緯度和經度之間的距離,您需要一個很好的距離公式。這個網站有幾個變化:

http://www.meridianworlddata.com/distance-calculation/

的「大圓距離」的公式是有點極端。這一次的作品不夠好,從我的經驗:

sqrt(x * x + y * y) 

where x = 69.1 * (lat2 - lat1) 
and y = 69.1 * (lon2 - lon1) * cos(lat1/57.3) 

那麼您的SQL查詢會是這個樣子:

select zd.ZipCode 
from ZipData zd 
where 
    sqrt(
     square(69.1 * (zd.Latitude - @Latitude)) + 
     square(69.1 * (zd.Longitude - @Longitude) * cos(@Latitude/57.3)) 
    ) < @Distance 

祝你好運!

+2

這實際上是一個很好的答案......所有的距離都在四分之一英里內,我認爲......+1 – 2012-04-27 19:13:27

+0

偉大的答案+1 - 你能告訴我數學從哪裏來?十進制數字代表什麼? – 2014-03-13 13:22:37

+0

到meridianworld.com的鏈接不再有效,所以我將其更新爲緩存版本。我相信神奇數字來自距離近似,計算球體表面的距離。這裏有更準確的公式,但對於您的基本「商店定位器」場景,這個對我來說效果很好。 – dana 2014-03-13 15:56:13

相關問題