如何从GPS坐标查找邮政编码?

时间:2009-05-28 01:40:32

标签: iphone gps zipcode

假设我有一个接受邮政编码作为参数的Web服务API,但我只能访问GPS坐标(纬度,经度)。如何动态查找坐标所属的zipcode?

我正在iPhone上做这项工作,所以希望在我在文档中忽略的CoreLocation API中有一个简单的方法。

5 个答案:

答案 0 :(得分:15)

此页面提供了美国所有邮政编码的数据库(csv)及其纬度和经度。 http://zips.sourceforge.net/

该文件已解压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

编辑:以下是Google对计算距离的一个很好的解释。它使用MySQL和PHP,但用于查找最近点的SQL在这里也很有用。使用SQL查询可能更快,而不是使用getDistanceFrom函数。

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

找到半径25英里范围内距离37,-122坐标最近的20个位置:

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; 

要以公里而不是里程搜索,请将3959替换为6371。

答案 1 :(得分:6)

如果我是你,我会尝试在3.0 SDK中查看反向地理编码器的文档。我不能说那里有什么,但你可能会发现反向地理编码返回一个placeMark,然后如果你在SDK中查找placeMark,你可能会发现它有一个邮政编码属性。谁知道?

答案 2 :(得分:0)

这种查找称为“反向地理位置”。

您需要做的第一件事是将来自CLocation对象的lat / lng数据转换为度......

位置管理器功能中的

(一旦收到位置更新就会调用)....

代码:

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

从那里你将lat和lng字符串发送到后端网络服务,如“GeoNames.org”或Google Maps API ......你可以获得最近的城市或街道地址。

答案 3 :(得分:0)

美国人口普查 - Tiger数据库生成了一个数据库。我相信有可能在lat / long下查找zipcode。

我敢打赌,如果你搜索Tiger zipcode,你可能会找到一些东西。例如,请参阅here。看来CPAN上有一个Perl模块可以做到这一点,所以这不应该是不可能的。

答案 4 :(得分:0)

Google提供免费的反向地理编码服务。您可以直接使用它,或者尝试使用Temboo SDK,它提供多种语言的便捷访问,包括Objective C(带代码示例)。

查看https://www.temboo.com/library/Library/Google/Geocoding/GeocodeByCoordinates/