如何从reverseGeocodeCoordinate中获取国家、州和城市信息?

24

GMSReverseGeocodeResponse 包含

- (GMSReverseGeocodeResult *)firstResult;

其定义类似于:

@interface GMSReverseGeocodeResult : NSObject<NSCopying>

/** Returns the first line of the address. */
- (NSString *)addressLine1;

/** Returns the second line of the address. */
- (NSString *)addressLine2;

@end

有没有办法从这两个字符串中获取国家、ISO国家代码、州(administrative_area_1或对应的州)?该方法适用于所有国家所有地址

注意:我尝试执行了这段代码

[[GMSGeocoder geocoder] reverseGeocodeCoordinate:CLLocationCoordinate2DMake(40.4375, -3.6818) completionHandler:^(GMSReverseGeocodeResponse *resp, NSError *error)
 {
    NSLog( @"Error is %@", error) ;
    NSLog( @"%@" , resp.firstResult.addressLine1 ) ;
    NSLog( @"%@" , resp.firstResult.addressLine2 ) ;
 } ] ;

但出于某些原因,处理程序从未被调用。我确实添加了应用程序密钥,还将iOS捆绑标识添加到了应用程序密钥中。控制台中未打印错误。我的意思是我不知道这些行的内容。


我在Google Maps iOS SDK中打开了一个请求:http://code.google.com/p/gmaps-api-issues/issues/detail?id=4974 - user2101384
GMSGeocoder现在通过GMSAddress提供结构化地址,弃用了GMSReverseGeocodeResult。”- Google Maps SDK for iOS Release Notes, Version 1.7, February 2014. - Pang
是的,这个问题被谷歌修复了(将近一年后)。我只是不知道如何关闭这个问题。 - user2101384
4个回答

39

最简单的方法是将Google Maps SDK for iOS升级到版本1.7(于2014年2月发布)。
发行说明中可以看到:

GMSGeocoder现在通过GMSAddress提供结构化地址,废弃了GMSReverseGeocodeResult

GMSAddress类参考中,您可以找到这些属性

coordinate
地理位置,如果未知则为kLocationCoordinate2DInvalid

thoroughfare
街道号码和名称。

locality
市或城市。

subLocality
地方分区、行政区或公园的下辖地区。

administrativeArea
地区/州/行政区。

postalCode
邮政编码/邮政编码。

country
国家名称。

lines
包含格式化地址行的NSString数组。

没有ISO国家代码。
还要注意,某些属性可能会返回nil

以下是完整示例:

[[GMSGeocoder geocoder] reverseGeocodeCoordinate:CLLocationCoordinate2DMake(40.4375, -3.6818) completionHandler:^(GMSReverseGeocodeResponse* response, NSError* error) {
    NSLog(@"reverse geocoding results:");
    for(GMSAddress* addressObj in [response results])
    {
        NSLog(@"coordinate.latitude=%f", addressObj.coordinate.latitude);
        NSLog(@"coordinate.longitude=%f", addressObj.coordinate.longitude);
        NSLog(@"thoroughfare=%@", addressObj.thoroughfare);
        NSLog(@"locality=%@", addressObj.locality);
        NSLog(@"subLocality=%@", addressObj.subLocality);
        NSLog(@"administrativeArea=%@", addressObj.administrativeArea);
        NSLog(@"postalCode=%@", addressObj.postalCode);
        NSLog(@"country=%@", addressObj.country);
        NSLog(@"lines=%@", addressObj.lines);
    }
}];

以及它的输出:

coordinate.latitude=40.437500
coordinate.longitude=-3.681800
thoroughfare=(null)
locality=(null)
subLocality=(null)
administrativeArea=Community of Madrid
postalCode=(null)
country=Spain
lines=(
    "",
    "Community of Madrid, Spain"
)

或者,您可以考虑在Google Geocoding API中使用反向地理编码示例)。


19

使用Google Maps iOS SDK(目前使用的版本为V1.9.2),无法指定返回结果的语言:

@IBAction func googleMapsiOSSDKReverseGeocoding(sender: UIButton) {
    let aGMSGeocoder: GMSGeocoder = GMSGeocoder()
    aGMSGeocoder.reverseGeocodeCoordinate(CLLocationCoordinate2DMake(self.latitude, self.longitude)) {
        (let gmsReverseGeocodeResponse: GMSReverseGeocodeResponse!, let error: NSError!) -> Void in

        let gmsAddress: GMSAddress = gmsReverseGeocodeResponse.firstResult()
        print("\ncoordinate.latitude=\(gmsAddress.coordinate.latitude)")
        print("coordinate.longitude=\(gmsAddress.coordinate.longitude)")
        print("thoroughfare=\(gmsAddress.thoroughfare)")
        print("locality=\(gmsAddress.locality)")
        print("subLocality=\(gmsAddress.subLocality)")
        print("administrativeArea=\(gmsAddress.administrativeArea)")
        print("postalCode=\(gmsAddress.postalCode)")
        print("country=\(gmsAddress.country)")
        print("lines=\(gmsAddress.lines)")
    }
}

使用谷歌逆地理编码API V3(目前可以指定要返回结果的语言):

@IBAction func googleMapsWebServiceGeocodingAPI(sender: UIButton) {
    self.callGoogleReverseGeocodingWebservice(self.currentUserLocation())
}

// #1 - Get the current user's location (latitude, longitude).
private func currentUserLocation() -> CLLocationCoordinate2D {
    // returns current user's location. 
}

// #2 - Call Google Reverse Geocoding Web Service using AFNetworking.
private func callGoogleReverseGeocodingWebservice(let userLocation: CLLocationCoordinate2D) {
    let url = "https://maps.googleapis.com/maps/api/geocode/json?latlng=\(userLocation.latitude),\(userLocation.longitude)&key=\(self.googleMapsiOSAPIKey)&language=\(self.googleReverseGeocodingWebserviceOutputLanguageCode)&result_type=country"

    AFHTTPRequestOperationManager().GET(
        url,
        parameters: nil,
        success: { (operation: AFHTTPRequestOperation!, responseObject: AnyObject!) in
            println("GET user's country request succeeded !!!\n")

            // The goal here was only for me to get the user's iso country code + 
            // the user's Country in english language.
            if let responseObject: AnyObject = responseObject {
                println("responseObject:\n\n\(responseObject)\n\n")
                let rootDictionary = responseObject as! NSDictionary
                if let results = rootDictionary["results"] as? NSArray {
                    if let firstResult = results[0] as? NSDictionary {
                        if let addressComponents = firstResult["address_components"] as? NSArray {
                            if let firstAddressComponent = addressComponents[0] as? NSDictionary {
                                if let longName = firstAddressComponent["long_name"] as? String {
                                    println("long_name: \(longName)")
                                }
                                if let shortName = firstAddressComponent["short_name"] as? String {
                                    println("short_name: \(shortName)")
                                }
                            }
                        }
                    }
                }
            }
        },
        failure: { (operation: AFHTTPRequestOperation!, error: NSError!) in
            println("Error GET user's country request: \(error.localizedDescription)\n")
            println("Error GET user's country request: \(operation.responseString)\n")
        }
    )

}

我希望这段代码片段和解释能够帮助未来的读者。


4

针对美国地址的Swift 5版本:

import Foundation
import GoogleMaps

extension GMSAddress {

    var formattedAddress: String {
        let addressComponents = [
            thoroughfare,        // One Infinite Loop
            locality,            // Cupertino
            administrativeArea,  // California
            postalCode           // 95014
        ]
        return addressComponents
            .compactMap { $0 }
            .joined(separator: ", ")
    }

}

0
在Swift 4.0中,该函数接收CLLocation并返回邮政地址。
  func geocodeCoordinates(location : CLLocation)->String{
         var postalAddress  = ""
        let geocoder = GMSGeocoder()
        geocoder.reverseGeocodeCoordinate(location.coordinate, completionHandler: {response,error in
            if let gmsAddress = response!.firstResult(){
                for line in  gmsAddress.lines! {
                    postalAddress += line + " "
                }
               return postalAddress
            }
        })
        return ""
    }

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