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 deGMSAddress
, desaprobandoGMSReverseGeocodeResult
.
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.