假设我有一个网络服务API,它接受邮政编码作为参数,但我只能访问GPS坐标(纬度、经度)。 我应该如何动态查找该坐标所属的邮政编码?
我正在iPhone上完成这项工作,希望在文档中忽略了的CoreLocation API中有一种简单的方法可以实现。
本页面提供了一个包含美国所有邮政编码及其经纬度信息的数据库(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"
- (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。
如果我是你,我会查看3.0 SDK中的反向地理编码器文档。我不能确定那里有什么内容,但是你可能会发现反向地理编码器返回一个placeMark,然后如果你在SDK中查找该placeMark,你可能会发现它有一个postcode属性。谁知道呢?
[lat stringWithFormat:@"%+.6f", myLocation.coordinate.latitude];
[lng stringWithFormat:@"%+.6f", myLocation.coordinate.longitude];
从那里,您可以将lat和lng字符串发送到后端Web服务,例如“GeoNames.org”或Google Maps API...然后您可以获取最近的城市或街道地址。
美国人口普查局制作了一个数据库——Tiger数据库。我相信有可能通过经纬度查找邮政编码。
我敢打赌,如果你搜索Tiger zipcode,你可能会找到一些东西。例如这里。看起来CPAN上有一个Perl模块可以实现这个功能,所以这并不是不可能的。