从iPhone进行前向地理编码

14

鉴于目前的MapKit未提供正向地理编码功能,请问有人可以帮忙解决如何使用搜索栏来返回用户输入地址的纬度和经度坐标吗?如果有人能提供示例代码,那就太好了。

7个回答

32

2
随着iOS6的推出,这可能是唯一可用的解决方案(除了可能是Yahoo),因为我怀疑谷歌不会喜欢你在苹果地图上叠加谷歌地理编码数据... - Kendall Helmstetter Gelner
@KendallHelmstetterGelner 我认为谷歌可能会没问题,但苹果呢?也许不行。 - DataGraham
1
这是由于Google的服务条款所限制的。在非Google地图上,无法显示Google地理编码数据。而苹果则不关心你从哪里获取覆盖在地图上的数据。现在苹果已经不再使用Google地图数据,因此你可以自由使用MapKit。 - Kendall Helmstetter Gelner

26

需要更新为新的Google地理编码API(例如,现在不需要API密钥)。除此之外,工作得非常出色。感谢@Merrimack。http://code.google.com/apis/maps/documentation/geocoding/ - DenTheMan
感谢DenTheMan的回复,不过该API支持V2和V3(最新版本无需API密钥)。自第一版发布以来就一直如此。 - Merrimack
链接失效 - 404未找到 - Pang

15

我创建了SVGeocoder,这是一个简单的iOS正、反地理编码类。它也使用了Google Geocoding API,并返回一个MKPlacemark对象。

以下是如何对地址字符串进行地理编码:

NSString *addressString = @"3245 St-Denis, Montreal"
SVGeocoder *geocodeRequest = [[SVGeocoder alloc] initWithAddress:addressString];
[geocodeRequest setDelegate:self];
[geocodeRequest startAsynchronous];

你可以这样对一个CLLocationCoordinate2D对象进行反向地理编码:

CLLocationCoordinate2D coordinate = CLLocationCoordinate2DMake(45.54181, -73.62928);
SVGeocoder *rGeocoderRequest = [[SVGeocoder alloc] initWithCoordinate:coordinate];
[rGeocoderRequest setDelegate:self];
[rGeocoderRequest startAsynchronous];

SVGeocoderDelegate提供了这两个方法:

- (void)geocoder:(SVGeocoder *)geocoder didFindPlacemark:(MKPlacemark *)placemark;
- (void)geocoder:(SVGeocoder *)geocoder didFailWithError:(NSError *)error;

1
用户注意事项:如果您使用Google地理编码API,则必须在地图上显示结果。 - DenTheMan
代码很棒,但是为什么在SVGeocoder中导入AddressBook框架? - lu yuan
@luyuan 因为MKPlacemark要求它用于地址组件(我想在iOS 5中已经不是这种情况了)。 - samvermette
@samvermette 感谢您的回复 :) 是的,我正在使用IOS 5。 - lu yuan
4
对于iOS开发者现在完全没用了:来自Google TOS: "注意:地理编码API只能与Google地图一起使用" https://developers.google.com/maps/documentation/geocoding/#Limits - Kendall Helmstetter Gelner
它对我非常有效...我没有使用谷歌地图! - aveschini

3

我在 GitHub 上使用 iOS5 CoreLocation 框架中的 CLGeocoder 进行了一些关于正向和反向地理编码的小工作,希望对你有所帮助。

https://github.com/Mangesh20/geocoding

2

这里还有一个框架:https://github.com/tylerhall/CoreGeoLocation

来自文档的评论: 一个基于Objective-C的地理编码器和反向地理编码器,主要包装了Yahoo的地理编码服务或Google的Geo APIs。


用户注意事项:如果您使用Google地理编码API,则必须在地图上显示结果。Yahoo似乎没有这个限制。 - DenTheMan
2
你必须在谷歌地图上展示结果。这是一个重要区别。 - Kendall Helmstetter Gelner

2
这是关于当前版本MapKit已知的问题。提交一个错误报告并重复 #6628720,以便他们将修复它作为优先事项。
同时,可以使用Google Maps的前向地理编码API,通过Yahoo PlacemakerCloudmade进行操作。

1

在MapKit中没有这样的功能。你最好的选择是调用第三方网络服务。谷歌有一些API可以实现这个功能,雅虎也有类似的服务。但两者都有商业使用限制,所以请仔细阅读协议。


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