web-dev-qa-db-de.com

Wie erhält man Land, Bundesland oder Stadt von reverseGeocodeCoordinate?

GMSReverseGeocodeResponse enthält

- (GMSReverseGeocodeResult *)firstResult;

deren Definition ist wie:

@interface GMSReverseGeocodeResult : NSObject<NSCopying>

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

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

@end

Gibt es eine Möglichkeit, das Land, den ISO-Ländercode und den Staat (administrative_area_1 oder entsprechende) aus diesen beiden Zeichenfolgen zu erhalten (gültig für alle Länder und alle Adressen )? 

HINWEIS: Ich habe versucht, diesen Code auszuführen

[[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 ) ;
 } ] ;

Aber aus irgendeinem Grund wurde der Handler nie gerufen. Ich habe den App-Schlüssel hinzugefügt und auch die iOS-Bundle-ID zum App-Schlüssel hinzugefügt. In der Konsole wird kein Fehler ausgegeben. Damit meine ich, dass mir der Inhalt der Zeilen nicht bewusst ist.

23
user2101384

Der einfachste Weg ist das Upgrade auf Version 1.7 des Google Maps-SDK für iOS (veröffentlicht im Februar 2014).
Aus den Versionshinweisen :

GMSGeocoder bietet jetzt strukturierte Adressen über GMSAddress an, wobei GMSReverseGeocodeResult verworfen wird.

In GMSAddress Klassenreferenz finden Sie diese Eigenschaften :

coordinate
Ort oder kLocationCoordinate2DInvalid, falls unbekannt.

thoroughfare
Straßennummer und Name. 

locality
Ort oder Stadt 

subLocality
Unterteilung von Ort, Bezirk oder Park. 

administrativeArea
Region/Bundesland/Verwaltungsgebiet. 

postalCode
Postleitzahl (PLZ) 

country
Der landname 

lines
Ein Array von NSString, das formatierte Zeilen der Adresse enthält.

Kein ISO-Ländercode.
Beachten Sie auch, dass einige Eigenschaften nil zurückgeben können.

Hier ist ein vollständiges Beispiel:

[[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);
    }
}];

und seine Ausgabe:

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"
)

Alternativ können Sie auch Reverse Geocoding in der The Google Geocoding API ( example ) verwenden.

34
Pang

Antwort in Swift

Bei Verwendung von Google Maps iOS SDK (derzeit wird V1.9.2 verwendet, können Sie keine Sprache angeben, in der Ergebnisse zurückgegeben werden sollen):

@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)")
    }
}

Verwenden der Google Reverse Geocoding API V3 (derzeit können Sie angeben die Sprache angeben, in der Ergebnisse zurückgegeben werden):

@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")
        }
    )

}

Ich hoffe, dieses Code-Snippet und diese Erklärung helfen zukünftigen Lesern.

17
King-Wizard

In Swift 4.0 erhält die Funktion CLLocation und Postadresse

  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 ""
    }
0
Mujahid Latif