【问题标题】:Best Geocoding Service for iPhone DevelopersiPhone 开发者的最佳地理编码服务
【发布时间】:2010-03-05 00:39:38
【问题描述】:

我制作了一个应用程序,该应用程序从 Web 服务获取一组地址,我想映射它们。我知道 Apple 在 MapKit 中忽略了这一点,只包括一个反向地理编码器。我想知道解决这个问题的最佳方法是什么。网络服务? Google Maps API(API 密钥如何工作?)? CloudMade?​​p>

您对哪种服务最快、最容易使用和最便宜(希望免费)有何看法?

【问题讨论】:

    标签: iphone cocoa-touch geocoding mkmapview


    【解决方案1】:

    有关将 API 密钥与 Google 地图地理编码服务 API 一起使用的最新文档。

    Get API Key

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

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

    【讨论】:

    • 非常感谢!我永远不会知道新版本出来了。我终于找到了一个好的解决方案。
    • 是否可以在一个请求中对多个地址进行地理编码?我有很多地方需要绘制地图,而且地方的数量可以攀升到 50 年代。在第十个左右之后,我不断收到“查询太多”的错误
    • 我不确定。我认为您需要探索有关多个请求的 Maps API。我很怀疑他们会接受随后的请求。但是,他们可能有一种接受多个地址的方法。我建议您联系 Google 解决您的问题。
    • 请注意,根据与 Google 的协议,您只能将 Geocoding API 与 Google Map 一起使用。由于现在是 Apple Maps,您将违反协议。
    • 这个答案写于 2010 年。那天没有苹果地图。
    【解决方案2】:

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

    GMaps 现在有一个基于 REST 的 geocoding API over HTTP(过去你必须使用他们的 JavaScript API,这在 iPhone 上是个痛点)。它可以返回 JSON,如果您需要额外的数据,使用 TouchJSON 解析很简单,或者如果您只需要纬度/经度,这将更容易。因此,您可以创建一个符合 MKAnnotation protocol 的对象,该对象将使用 NSURLConnection 或 ASIHTTPRequest 从 API 获取 JSON/CSV,对其进行解析,并将 Point 变量作为 coordinate 属性返回并构建您的MapView 根据需要。

    【讨论】:

    • 移动运营商并非完全如此,他们经常使用网关/代理,最终为成千上万的用户带来相同的 IP,这在我所在的高度拥挤的城市地区,法国巴黎,超过了 Google 的限制......下午 5 点左右,许多用户出现 503 错误......
    【解决方案3】:

    为此使用 Apple 地理编码 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.
             }
    }];
    

    【讨论】:

    • 感谢您的提示,我觉得使用 CLGeoCoder 而不是“第三方”谷歌地图方法更舒服!
    【解决方案4】:

    我使用“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
    
    }
    

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-11-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多