2011-06-08 89 views
1

我有一個數據庫,其中一個字段是郵政編碼,有一系列條目(不超過10個數千)。一定範圍內的郵政編碼

我期待創建一個腳本,當給定一個郵政編碼和英里半徑(如50英里,100英里),我可以找到所有在該範圍內的條目。

我在網上看到許多文章和腳本,允許一個人這樣做,但他們通常會通過包含一個他們自己的較重的數據庫來做到這一點。

有沒有辦法使用簡單的計算,而不需要數據庫?

注意:準確性沒有什麼大不了的。如果它在進入50英里時運行60英里,那就很好。

編輯

我注意到有很多是涉及如何讓郵政編碼中/ LON,然而,僅數據庫已存儲緯度郵政編碼答案,所以我可以假設這包括追溯獲取/存儲每次進入數據庫的緯度/經度也是如此?

+0

可能http://code.google.com/apis/maps/documentation/geocoding/可以幫助您「僅計算一次」+1 – 2011-06-08 12:18:49

回答

1

號郵政編碼也隨着certain logic at a high level,但沒有算法郵政編碼和位置之間的映射(即,郵政編碼是轉讓給一個地點,而不是計算的一個位置 - 這個過程是由郵政當局(美國的USPS)監督,但它總是會考慮非地理因素,例如。人口密度;因此不可能從一個位置計算郵政編碼,反之亦然)。

那麼,你需要那個「大數據庫」告訴你哪個ZIP代碼屬於哪個位置;一旦你有了位置,你就可以像往常一樣計算哪些條目在半徑內。

(你可以查詢Web服務,但只是隱藏在雲中的數據庫 - 在某些時候,有人有以檢查90210在於物理)

+0

某些高級邏輯實際上是我希望利用的。同樣,只要合理,準確性並不是什麼大問題。 – steveo225 2011-06-08 12:35:31

+0

@ steveo225:然後查看維基百科鏈接上的地圖。不過,我認爲你可以從中得到比這個郵政編碼在加利福尼亞某處更準確的結果。 – Piskvor 2011-06-08 13:05:06

+0

我看到了,我希望有一些與北,東,南,西有關的邏輯,但它並不是如此。謝謝美國郵政 – steveo225 2011-06-08 13:15:16

0

您需要將主要的東西翻譯成地理座標(即經緯度對)。一旦你有了,你可以看看this presentation,它詳細解釋瞭如何通過距離給定座標進行搜索。

2

如果精度不是問題,你可以畫出中心的經度和緯度郵政編碼或中心的粗略估計。然後,您可以使用列出的公式 here來計算每個中心之間的距離。如圖所示,沒有必要使用馬錢鹼配方here,這是非常準確的,這是你不需要的。三角函數和反三角函數耗費大量計算資源,並且是浪費。每次查詢距離,使MySQL運行通過這樣一個複雜的公式,每個郵政編碼只是浪費資源。

如果您必須每天多次這樣做,它可能會更快(空間vs速度權衡此處),以存儲每個郵政編碼之間的距離。這種存儲表中的條目總數是您擁有的郵政編碼數量的平方。每次運行成千上萬的郵政編碼,以計算消耗大量的計算能力,更不用說對最終用戶來說更慢。

而且,類似的問題已經被問過這裏之前,請看看在這個問題上接受的答案,它適用於您的情況:Calculate distance between zip codes and users

+0

+1。此外,Haversine將需要很長的距離;但對於100英里半徑來說,彎曲和平坦表面之間的差異實際上是微不足道的。 – Piskvor 2011-06-08 13:08:03

+0

+1我同意。儘可能預先計算肯定會有助於提高性能。我想我會根據Piskvor提供的數據使用混合方法,但這會加速熱區計算。謝謝 – steveo225 2011-06-08 13:32:33

0

一種選擇是使用谷歌地圖API找到你的位置經緯度。然後,您必須在數據庫中爲每個郵政編碼添加經緯度,然後編寫一個腳本以便從那裏計算出來。

1

在這種情況下可能適用也可能不適用的另一種選擇是在尋找半徑時使用縣。對於我工作過的大多數項目,用戶都知道他們的縣,並且熟悉它。你可以買一個縣以20到40美元的價格壓縮數據庫(和城市/州/等)。這是可以在許多不同的項目中重複使用的東西。它不一定能夠提供完成10/25/50/100英里半徑的確切能力,但可能允許您根據請求的郵政編碼,在我所在地區的風格的半徑查找中執行

相關問題