web-dev-qa-db-fra.com

Comment obtenir un pays, un état, une ville de reverseGeocodeCoordinate?

GMSReverseGeocodeResponse contient

- (GMSReverseGeocodeResult *)firstResult;

dont la définition est comme:

@interface GMSReverseGeocodeResult : NSObject<NSCopying>

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

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

@end

Existe-t-il un moyen d'obtenir le pays, le code de pays ISO, l'état (administrative_area_1 ou correspondant) à partir de ces deux chaînes (valable pour tous les pays et toutes les adresses)? 

NOTE: j'ai essayé d'exécuter ce morceau de code

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

Mais pour une raison quelconque, le gestionnaire n'a jamais été appelé. J'ai ajouté la clé d'application et ajouté l'identifiant de l'ensemble iOS à la clé d'application. Aucune erreur n'est imprimée dans la console. Je veux dire par là que je ne suis pas au courant du contenu des lignes.

23
user2101384

Le moyen le plus simple consiste à mettre à niveau vers la version 1.7 du SDK Google Maps pour iOS (publié en février 2014).
Du notes de publication :

GMSGeocoder fournit désormais des adresses structurées via GMSAddress, rendant obsolète GMSReverseGeocodeResult.

À partir de Référence de la classe GMSAddress , vous pouvez trouver ces propriétés :

coordinate
Emplacement ou kLocationCoordinate2DInvalid si inconnu.

thoroughfare
Numéro de rue et nom. 

locality
Localité ou ville. 

subLocality
Subdivision de localité, district ou parc. 

administrativeArea
Région/Etat/Zone administrative. 

postalCode
Code postal/Zip. 

country
Le nom du pays 

lines
Un tableau de NSString contenant des lignes formatées de l'adresse.

Pas de code pays ISO cependant.
Notez également que certaines propriétés peuvent renvoyer nil.

Voici un exemple complet:

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

et sa sortie:

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

Vous pouvez également envisager d'utiliser géocodage inversé dans la API de géocodage de Google ( exemple ).

34
Pang

Répondre en Swift

Utilisation du SDK iOS de Google Maps (vous ne pouvez actuellement pas spécifier la langue dans laquelle vous voulez renvoyer les résultats avec la version 1.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)")
    }
}

Utilisation de l’API de géocodage inversé Google V3 (vous pouvez actuellement spécifier la langue dans laquelle les résultats doivent être renvoyés):

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

}

J'espère que cet extrait de code et cette explication aideront les futurs lecteurs.

17
King-Wizard

Dans Swift 4.0, la fonction obtient CLLocation et retourne l'adresse postale

  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