题
说我有一个接受邮政编码作为参数的web服务API,但是我只有坐标访问GPS(纬度,经度)。我怎样才能动态查找该坐标所属的邮政编码到?
我做对iPhone这项工作,所以希望有一个简单的方法给我俯瞰文档中的CoreLocation的API内做到这一点。
解决方案
我想尝试在3.0 SDK检查出的反向地理编码的文档,如果我是你。我不能说那里的东西,但你可能会,比方说,发现反向地理返回地标,然后如果你在SDK中查找该地标时,你可能会发现,它有一个邮政编码属性。谁知道?
其他提示
这个页面提供在美国所有邮政编码的数据库(在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和信息有关拉链数据库一个半正矢函数。
http://www.jaimerios.com/?p=39
编辑:继承人从谷歌有关计算距离的很好的解释。它使用MySQL和PHP,但寻找最近的点SQL这里也是有用的。它可能会更快使用SQL,而不是getDistanceFrom功能来查询。
http://code.google.com/support/的bin / answer.py?回答= 87134&主题= 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。
这样查找被称为“反向地理定位。”
您需要做的是从CLocation对象纬度/经度数据转换为度...的第一件事
在的LocationManager功能(一次收到的位置更新被称为)....
代码:
[lat stringWithFormat:@"%+.6f", myLocation.coordinate.latitude];
[lng stringWithFormat:@"%+.6f", myLocation.coordinate.longitude];
从那里,你发送的纬度和经度字符串到后端web服务,如“GeoNames.org”或谷歌地图API ......,你可以得到最近的城市或街道地址。
谷歌提供了一个免费的反向地理编码服务。可以直接使用它,或尝试Temboo SDK它提供多语言方便访问,包括目标C(与代码样品)。
查核 https://www.temboo.com/library/Library /谷歌/地址解析/ GeocodeByCoordinates /