Saltar al contenido

¿Cómo obtener país, estado, ciudad de reverseGeocodeCoordinate?

Es importante interpretar el código bien antes de adaptarlo a tu proyecto y si tquieres aportar algo puedes compartirlo con nosotros.

Solución:

La forma más sencilla es actualizar a la versión 1.7 del SDK de Google Maps para iOS (lanzado en febrero de 2014).
De las notas de la versión:

GMSGeocoder ahora proporciona direcciones estructuradas a través de GMSAddress, desaprobando GMSReverseGeocodeResult.

De GMSAddress Class Reference, puede encontrar estas propiedades:

coordinate

Ubicación, o kLocationCoordinate2DInvalid si se desconoce.

thoroughfare

Número y nombre de la calle.

locality

Localidad o ciudad.

subLocality

Subdivisión de localidad, distrito o parque.

administrativeArea

Región / Estado / Área administrativa.

postalCode

Código postal.

country

El nombre del país.

lines

Un array de NSString que contiene líneas formateadas de la dirección.

Sin embargo, no hay código de país ISO.
También tenga en cuenta que algunas propiedades pueden regresar nil.

Aquí tienes un ejemplo completo:

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

y su salida:

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

Alternativamente, puede considerar usar la codificación geográfica inversa en la API de codificación geográfica de Google (ejemplo).

Responde en Rápido

Usando Google Maps iOS SDK (actualmente usando la V1.9.2 no puede especificar el idioma en el que devolver los resultados):

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

Usando la API de codificación geográfica inversa de Google V3 (actualmente puede especificar el idioma en el que devolver los resultados):

@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:nn(responseObject)nn")
                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")
        
    )


Espero que este fragmento de código y esta explicación ayuden a los futuros lectores.

Versión Swift 5 para direcciones en Estados Unidos:

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


Si estás contento con lo expuesto, eres capaz de dejar un escrito acerca de qué te ha gustado de esta sección.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *