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.
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 viaGMSAddress
, rendant obsolèteGMSReverseGeocodeResult
.
À partir de Référence de la classe GMSAddress
, vous pouvez trouver ces propriétés :
coordinate
Emplacement oukLocationCoordinate2DInvalid
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 deNSString
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 ).
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.
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 ""
}