【问题标题】:How to get GMSAddress from PlaceID or GMSPlace如何从 PlaceID 或 GMSPlace 获取 GMSAddress
【发布时间】:2016-10-06 05:36:39
【问题描述】:

我正在使用适用于 iOS 的 Google Places API 的自动完成功能,它会返回 placeID。如何从 placeID 获取 GMSAddress?我目前使用lookupPlaceID获取GMSPlace,然后使用reverseGeocodeCoordinate从GMSPlace中的坐标获取GMSAddress。但它请求 Google API 3 次:AutoComplete、lookupPlaceID、reverseGeocodeCoordinate。

有没有办法直接从 PlaceID 或 GMSPlace 获取 GMSAddress?

【问题讨论】:

  • 来自GMSAddress 文档,它说GMSAddressreverse geocode request 的结果,包含一个人类可读的地址。所以你必须做一个reverseGeocodeCoordinate 才能得到GMSAddress。所以你不能避免使用AutoCompletelookupPlacesID 然后reverseGeocoderCoordinate
  • @ztan 明白了。谢谢
  • 此解决方案可能遇到的问题是GMSPlacename 属性可能与GMSAddressthoroughfare 属性不同,即使coordinate 正是一样。

标签: ios google-maps


【解决方案1】:

这是适用于 iOS 的 Google Maps SDK 1.1.0 的一个错误。见here

正如文档所述 hereaddress 属性应在 GMSPlace 实例上公开 GMSAddress

我刚刚切换到使用 REST API。为 API 编写一个快速包装器并完全放弃 Google SDK 并不算太糟糕。如果你正在使用 Alamofire ping 我,我也许可以分享我写的内容。

【讨论】:

  • 你是对的。文档中有address属性,但SDK中实际上没有返回。
  • 我真的希望 Google 会在 1.10.2 中添加该修复程序...在无法访问地址的情况下获取地点详细信息...希望下一个版本将很快发布。
  • 请大家给这个问题加注星标,这样它就可以从谷歌得到更多的关注。 code.google.com/p/gmaps-api-issues/issues/detail?id=8121
  • Google Maps SDK for iOS version: 1.10.19729.0 今天仍然存在问题。他们甚至在文档中删除了address 属性。虽然,GMSPlace 上有一个addressComponents 属性,但没有暴露,所以你只能通过[place valueForKey:@"addressComponents"] 访问它,这根本不安全!在这里查看我的评论:code.google.com/p/gmaps-api-issues/issues/detail?id=8121#c8。希望这个问题很快得到解决!
  • 我是那个写错误报告的人,但它仍然是一个问题。我一直在使用 REST API 来获取 placeId 的 JSON 表示,然后使用它来创建 iOS 对象。 https://maps.googleapis.com/maps/api/place/details/json?placeid='id'
【解决方案2】:

我可以在一个 API 调用中从placedID 中获取地址,代码如下:

GMSPlacesClient *placesClient = [[GMSPlacesClient alloc] init];

[placesClient lookUpPlaceID:result.placeID callback:^(GMSPlace *place, NSError *error) {
    if (error != nil) {
        NSLog(@"Place Details error %@", [error localizedDescription]);
        return;
    }
    if (place != nil) {
        NSString *locality = @"";
        for (GMSAddressComponent *add in place.addressComponents) {
            //locality
              NSLog(@"%@",add.type);
              NSLog(@"%@",add.name);
//type will be street_name, locality, admin_area, country,
//name will hold the corresponding value   
        }

    } else {
        NSLog(@"No place details for %@", result.placeID);
    }

}];

【讨论】:

    【解决方案3】:

    现在,对于这个版本的 SDK (1.10.5),下面的代码是否安全(足够)?未来 6 个月内这种情况发生的概率有多大?

    NSArray* dic = [place valueForKey:@"addressComponents"];
    
    for (int i=0;i<[dic count];i++) {
        if ([[[dic objectAtIndex:i] valueForKey:@"type"] isEqualToString:@"street_number"]) {
        NSLog(@"street_number: %@",[[dic objectAtIndex:i] valueForKey:@"name"]);
    }
    

    【讨论】:

    • 如果您确保不会意外更新 SDK(例如,在没有明确定义 SDK 版本的情况下运行 pod install),那么是的,这在不崩溃方面是安全的。但是,您无法确定 addressComponents 包含什么内容,并且您最终可能没有正确的数据。我目前遇到了同样的问题,并且更喜欢问题中描述的方法。
    猜你喜欢
    • 1970-01-01
    • 2016-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多