面向iPhone开发人员的最佳地理编码服务

时间:2010-03-05 00:39:39

标签: iphone cocoa-touch geocoding mkmapview

我创建了一个应用程序,它从Web服务获取一组地址,我想映射它们。我知道Apple在MapKit中留下了这个,包括只有一个反向Geocoder。我想知道解决这个问题的最佳方法是什么。网络服务? Google Maps API(API密钥如何工作?)? CloudMade?

您对哪种服务最快,最易用,最便宜(希望免费)有什么看法?

5 个答案:

答案 0 :(得分:5)

IANAL,但如果您正在构建的应用程序是免费的,那么我相信您可以免费使用Google Maps API。它每天仅限于15,000个地理编码请求,但根据文档,这与IP绑定,而不是API密钥。您可以获得API密钥immediately - 无需批准。 (如果您的应用无法免费使用,则必须注册Google Maps Premier。)

GMaps现在有一个基于REST的geocoding API over HTTP(以前你必须使用他们的JavaScript API,这对iPhone很痛苦)。它可以返回JSON,如果你需要额外的数据,可以使用TouchJSON进行解析,如果你需要的话只需要lat / lon,这将更容易解析。因此,您可以创建一个符合MKAnnotation protocol的对象,该对象将使用NSURLConnection或ASIHTTPRequest从API获取JSON / CSV,解析它,并将Point变量作为{{1}返回根据需要构建MapView。

答案 1 :(得分:5)

有关使用Google Maps Geocoding服务API的API密钥使用的最新文档。

Get API Key

可以在页面底部参考,您可以使用通用的无限制API密钥在任何平台上进行测试。

至于iOS,我认为我们可以按照适用于iOS的Google Maps SDK文档进行操作。

答案 2 :(得分:4)

使用Apple Geocoding API

http://developer.apple.com/library/ios/#documentation/userexperience/conceptual/LocationAwarenessPG/UsingGeocoders/UsingGeocoders.html

“CLGeocoder类提供了在坐标(指定为纬度和经度)与该坐标的用户友好表示之间进行转换的服务。坐标的用户友好表示通常包括街道,城市,州,与给定位置相对应的国家信息,但也可能包含相关的兴趣点,地标或其他识别信息。地理编码器对象是与基于网络的服务一起查找地标信息的单击对象。其指定的坐标值。

要使用地理编码器对象,请创建它并调用其正向或反向地理编码方法之一来开始请求。反向地理编码请求采用纬度和经度值并找到用户可读的地址。前向地理编码请求采用用户可读的地址并找到相应的纬度和经度值。前向地理编码请求还可以返回关于指定位置的附加信息,例如在该位置处的兴趣点或建筑物。对于这两种类型的请求,将使用CLPlacemark对象返回结果。在前向地理编码请求的情况下,如果提供的信息产生了多个可能的位置,则可以返回多个地标对象。“

CLGeoCoder geocoder = [[CLGeocoder alloc] init];
[geocoder geocodeAddressString:@"1 Infinite Loop"
     completionHandler:^(NSArray* placemarks, NSError* error){
         for (CLPlacemark* aPlacemark in placemarks)
         {
             // Process the placemark.
         }
}];

答案 3 :(得分:1)

我使用“Restful WebService”使用谷歌地图进行反向地理编码,一旦我得到坐标,我将它们存储在SQLite中供以后参考。该服务返回一个JSON字符串,我稍后将在iPhone中进行解析。

类似的东西:

// Initialize call to REST Webservice
- (void) initCall
{
    // Service
    RESTClient *client = [[[RESTClient alloc] initWithDelegate:self] autorelease];
    NSString *serviceHost = @"http://www.site.com/service/maps";
    [client get:serviceHost];
    [serviceHost release];
}

- (void)RESTRequestDidSucceed:(RESTClient*)sender
{

        // Search
   NSString *data = [[[NSString alloc] init] autorelease];
   data = [[NSString alloc] initWithData:sender.receivedData encoding:NSUTF8StringEncoding];

   // Now you have the DATA in and NSString which you can pass as an argument to a method
   // something like

}

答案 4 :(得分:0)

根据谷歌和雅虎的说法,他们各自的地理编码服务不允许“存储以备将来使用”。除非我误解,否则您无法将查询结果存储到任何形式的数据库中。否则,谷歌真的很容易(现在每天有50,000个请求)。