假设我有一个接受邮政编码作为参数的Web服务API,但我只能访问GPS坐标(纬度,经度)。如何动态查找坐标所属的zipcode? p>
我正在iPhone上做这项工作,所以希望在我在文档中忽略的CoreLocation API中有一个简单的方法。
答案 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/