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

15

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

我正在iPhone上完成这项工作,希望在文档中忽略了的CoreLocation API中有一种简单的方法可以实现。


我怀疑你在CoreLocation中找不到它,但值得一试...看看是否有趣。 - hhafez
5个回答

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函数和关于邮政编码数据库的信息。

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

编辑:这里有来自谷歌的一个很好的解释,用于计算距离。它使用MySQL和PHP,但是在此处查找最近点的SQL也很有用。使用SQL查询可能比使用getDistanceFrom函数更快。

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

查找到与37, -122坐标在半径25英里范围内的最近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。


这只会给你最近的邮政编码区域中心的距离,它不会告诉你坐标实际上在哪个邮政编码中,正如OP所请求的那样。 - user4815162342
我downvote了这个,因为邮政编码每个月都会添加和删除。如果你真的关心邮政编码查找的准确性,你应该购买邮政编码数据的订阅,并每隔几个月更新你的数据集。你的QA流程应该特别注意哪些邮政编码被删除,因为你可能想要更新相关数据以引用替换那些被删除的邮政编码的邮政编码。 - Mark Stosberg

6

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


如果我们在提到MapKit框架,需要记住它使用Google Maps API,这要求您遵守Google的服务条款。 - jottos

0

0
这种查找被称为“反向地理定位”。
你需要做的第一件事是将CLocation对象中的lat/lng数据转换为度数...
在locationManager函数中(当您收到位置更新时调用)...
代码:
[lat stringWithFormat:@"%+.6f", myLocation.coordinate.latitude];
[lng stringWithFormat:@"%+.6f", myLocation.coordinate.longitude];

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


0

美国人口普查局制作了一个数据库——Tiger数据库。我相信有可能通过经纬度查找邮政编码。

我敢打赌,如果你搜索Tiger zipcode,你可能会找到一些东西。例如这里。看起来CPAN上有一个Perl模块可以实现这个功能,所以这并不是不可能的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接