2009-05-28 95 views
15

假設我有一個接受郵編作爲參數的web服務API,但我只能訪問GPS座標(經度,緯度)。我如何動態查找座標所屬的郵編?如何從GPS座標查找郵編?

我正在iPhone上做這項工作,所以希望有一個簡單的方法可以在CoreLocation API中完成,我在文檔中忽略了這一點。

+0

我懷疑你會發現它在CoreLocation,但它是值得一試...這將是有趣的,看看它是否 – hhafez 2009-05-28 01:51:46

回答

6

我想嘗試檢查3.0 SDK中反向地理編碼器的文檔,如果我是你的話。我不能說有什麼,但是你可能會發現,反向地理編碼返回placeMark,然後如果你在SDK中查找placeMark,你可能會發現它有一個postcode屬性。誰知道?

0

這種查找稱爲「反向地理定位」。

你需要做的第一件事就是從CLocation對象度轉換爲緯度/經度數據...

中的LocationManager功能

(一旦你獲得一個位置更新被稱爲)....

代碼:

[lat stringWithFormat:@"%+.6f", myLocation.coordinate.latitude]; 
[lng stringWithFormat:@"%+.6f", myLocation.coordinate.longitude]; 

從那裏您發送緯度和經度字符串到後端web服務,如「GeoNames.org」或谷歌地圖API ......,你可以得到最近的城市或街道地址。

0

有一個數據庫由美國人口普查 - 老虎數據庫。我相信有一個可能性來查找郵政編碼拉特/長。

我會打賭,如果你搜索Tiger zipcode你可能會發現一些東西。例如,請參見here。看起來CPAN上有一個Perl模塊可以實現這一點,所以它不應該是不可能的。

15

此頁面提供美國所有郵政編碼的數據庫(包含csv)及其經緯度。 ​​3210

該文件是500k解壓。以下是頭幾行數據:

"35004", "AL", " 33.606379", " -86.50249", "Moody", "Alabama" 
"35005", "AL", " 33.592585", " -86.95969", "Adamsville", "Alabama" 
"35006", "AL", " 33.451714", " -87.23957", "Adger", "Alabama" 

將此數據轉儲到本地數據庫中。使用Haversine公式來比較你的座標和數據庫中的座標以找到最近的點。 CoreLocation有一個你也可以使用的getDistanceFrom函數。

- (CLLocationDistance)getDistanceFrom:(const CLLocation *)location 

此頁面在c中具有Haversine功能和有關zips數據庫的信息。

http://www.jaimerios.com/?p=39

編輯:從谷歌有關計算距離繼承人很好的解釋。它使用MySQL和PHP,但用於查找最近點的SQL在這裏也很有用。使用SQL查詢可能會更快,而不是getDistanceFrom函數。

http://code.google.com/support/bin/answer.py?answer=87134&topic=11364

尋找最近的20個地點是25英里到37半徑內,-122座標:

SELECT id, (3959 * acos(cos(radians(37)) 
* cos(radians(lat)) * cos(radians(lng) - radians(-122)) 
+ sin(radians(37)) * sin(radians(lat)))) 
AS distance FROM markers HAVING distance < 25 
ORDER BY distance LIMIT 0 , 20; 

要按公里而非英里搜尋,換成6371 3959。

+0

這隻會給你的最接近中心的距離一個郵政編碼區域,它不會告訴你座標實際在哪個郵政編碼,因爲OP要求。 – user4815162342 2012-04-24 04:24:22

+0

我降低了這一點,因爲每個月都會添加和刪除郵政編碼。如果您認真對待郵政編碼查詢的準確性,您應該購買郵政編碼數據的訂閱,並每隔幾個月爲您的數據集重新整理一下。您的質量檢查過程應特別包括注意哪些郵編已被*刪除*,因爲您可能需要更新相關數據以引用正在替換被刪除郵件的郵編。 – 2012-11-19 21:00:37