2013-03-08 111 views
2

我有一個控件,允許用戶輸入郵政編碼或在iframe中打開google地圖,然後單擊地圖選擇一個位置。我目前有這一切工作,並且iframe會將click/lat事件發回給父級。從經度/緯度獲取郵政編碼

我也有一個數據庫表設置與經緯度字段映射到郵政編碼。

但是,緯度/經度組合很可能永遠不會匹配我在數據庫中的條目。所以,我正在尋找匹配最接近的郵政編碼的最佳方式。

因爲用戶可以手動輸入郵政編碼,所以我並不完全擔心精度(即用戶點擊郵政編碼之間的邊界),但我希望它儘可能接近。我現在只需要擔心美國的位置。

我目前的解決方案的想法是提出一些寬容(.2?),並查詢db/long + - 容差。然後從結果集中選擇最接近的匹配項。

我很樂意聽到之前做過這個或者有比我提出的更好的解決方案的人的消息。我對使用服務不感興趣,因爲我擁有所有我需要的數據。

我對我提出的解決方案有一個擔憂,那就是確定一個好的容差是多少。這個項目是針對農村地區的,我不確定這些地區經緯度的分佈情況如何。

編輯:這是我的表結構: zip5 |城市|狀態| lat | lon |縣

zip5是緯度的主鍵

+0

請問您爲什麼要將緯度/經度轉換爲郵政編碼?一旦你有了經/緯度,你就有了通過它們的鄰近來找到其他實體的關鍵。有什麼郵政編碼讓你擁有一個經/緯度不會讓你? – Tim 2013-03-08 22:16:33

+0

@Tim根據我給出的設計規範,zip將顯示在html輸入中。我可以反駁它,但這看起來不應該那麼困難。 – Helto 2013-03-08 22:20:55

+0

如果您需要查找2組緯度/經度之間的距離,則可以輕鬆計算從給定的郵政編碼(緯度/經度)到文件中的距離... – keithhatfield 2013-03-08 22:27:52

回答

1

此問題的規範解決方案使用R樹。

+0

從閱讀我已經完成我同意你。不幸的是,我不確定我將如何爲所有郵政編碼創建邊界框。 – Helto 2013-03-08 23:33:19

+0

邊界框可以是任意大小的,它可以通過其左上角和右下角座標來定義。假設你製作了25 x 25英里的盒子。你會創建你的邊界框表。然後,您將迭代邊界框表,然後在嵌套循環中迭代您的郵政編碼表,並計算郵政編碼的質心是否落在框中。如果確實如此,則在鏈接表中創建一個邊界框 - 郵編鏈接。在runime中,計算點擊發生的邊界框,選擇其鏈接的拉鍊,並計算到每個拉鍊的距離,選擇最近的。 – Tim 2013-03-08 23:45:31

+0

謝謝,這是有道理的。希望我的拉鍊桌子的lat/lon字段是質心,這會更容易。 – Helto 2013-03-09 04:53:41

2

一分鐘(即1/60度)= 1 N.M.,或約6000的腳。因此5分鐘。緯度=約30,000英尺=約6法定英里。

經度朝向兩極縮小,但如果我們把美國大陸看作北緯36度左右,給予或拿走(我認同一點,但近似值應該足夠這個應用),然後一分鐘的經度〜1nm * cos 36〜6,000 * 0.81 = 4,850英尺。

由於郵政編碼(或至少第一組5位數字)代表郵局,在農村地區可能相距20-30英里,您可能會做得比使用大約1/2,或說10分鐘。緯度x 12分鐘。經度。那些方便分別爲1/6度和1/5度。

+0

謝謝你的深刻迴應。看起來這些價值觀很可能是一種體面的寬容。 – Helto 2013-03-08 23:08:46

1

您可能希望丟棄自己的數據庫查找並使用已經執行此操作的web服務,如GeoNames。有關更多信息,請參見SO問題Get zip code from latitude, longitude?。看起來它已經做了你想做的事,但沒有所有的計算和容差。

+0

我在我的問題中特別寫了我對服務不感興趣。我有我需要做的一切工作,我只需要能夠通過查詢過濾大部分數據。 – Helto 2013-03-08 23:10:14