Cómo revertir la geocodificación de una ubicación

Cuando se mantiene presionado el mapa, las coordenadas del gesto se envían al servicio de geocodificación inversa. Si se realiza correctamente, se agrega al mapa un marcador con una ventana de información que contiene el resultado.

Comenzar

Antes de probar el código de muestra, debes configurar tu entorno de desarrollo. Para obtener más información, consulta Muestras de código del SDK de Maps para iOS.

Consulta el código

Swift

import GoogleMaps
import UIKit

// Sample code for GeoCoder service.
class GeocoderViewController: UIViewController {

  private lazy var mapView: GMSMapView = {
    let camera = GMSCameraPosition(latitude: -33.868, longitude: 151.2086, zoom: 12)
    return GMSMapView(frame: .zero, camera: camera)
  }()

  private lazy var geocoder = GMSGeocoder()

  override func loadView() {
    view = mapView
    mapView.delegate = self
  }
}

extension GeocoderViewController: GMSMapViewDelegate {
  func mapView(_ mapView: GMSMapView, didLongPressAt coordinate: CLLocationCoordinate2D) {
    // On a long press, reverse geocode this location.
    geocoder.reverseGeocodeCoordinate(coordinate) { response, error in
      guard let address = response?.firstResult() else {
        let errorMessage = error.map { String(describing: $0) } ?? "<no error>"
        print(
          "Could not reverse geocode point (\(coordinate.latitude), \(coordinate.longitude)): \(errorMessage)"
        )
        return
      }
      print("Geocoder result: \(address)")
      let marker = GMSMarker(position: address.coordinate)
      marker.appearAnimation = .pop
      marker.map = mapView

      guard let lines = address.lines, let title = lines.first else { return }
      marker.title = title
      if lines.count > 1 {
        marker.snippet = lines[1]
      }
    }
  }
}
      

Objective-C

#import "GoogleMapsDemos/Samples/GeocoderViewController.h"

#import <GoogleMaps/GoogleMaps.h>

@implementation GeocoderViewController {
  GMSMapView *_mapView;
  GMSGeocoder *_geocoder;
}

- (void)viewDidLoad {
  [super viewDidLoad];
  GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude:-33.868
                                                          longitude:151.2086
                                                               zoom:12];

  _mapView = [GMSMapView mapWithFrame:CGRectZero camera:camera];
  _mapView.delegate = self;

  _geocoder = [[GMSGeocoder alloc] init];

  self.view = _mapView;
}

- (void)mapView:(GMSMapView *)mapView didLongPressAtCoordinate:(CLLocationCoordinate2D)coordinate {
  // On a long press, reverse geocode this location.
  __weak __typeof__(self) weakSelf = self;
  GMSReverseGeocodeCallback handler = ^(GMSReverseGeocodeResponse *response, NSError *error) {
    [weakSelf handleResponse:response coordinate:coordinate error:error];
  };
  [_geocoder reverseGeocodeCoordinate:coordinate completionHandler:handler];
}

- (void)handleResponse:(nullable GMSReverseGeocodeResponse *)response
            coordinate:(CLLocationCoordinate2D)coordinate
                 error:(nullable NSError *)error {
  GMSAddress *address = response.firstResult;
  if (address) {
    NSLog(@"Geocoder result: %@", address);

    GMSMarker *marker = [GMSMarker markerWithPosition:address.coordinate];
    NSArray<NSString *> *lines = [address lines];

    marker.title = [lines firstObject];
    if (lines.count > 1) {
      marker.snippet = [lines objectAtIndex:1];
    }

    marker.appearAnimation = kGMSMarkerAnimationPop;
    marker.map = _mapView;
  } else {
    NSLog(@"Could not reverse geocode point (%f,%f): %@", coordinate.latitude, coordinate.longitude,
          error);
  }
}

@end
      

Ejecuta la app de ejemplo completa de forma local

La app de ejemplo del SDK de Maps para iOS está disponible como archivo de descarga en GitHub. Sigue estos pasos para instalar y probar la app de ejemplo del SDK de Maps para iOS.

  1. Ejecuta git clone https://github.com/googlemaps-samples/maps-sdk-for-ios-samples.git para clonar el repositorio de muestras en un directorio local.
  2. Abre una ventana de terminal, navega al directorio en el que clonaste los archivos de muestra y desplázate hacia abajo hasta el directorio GoogleMaps:

    Swift

    cd maps-sdk-for-ios-samples-main/GoogleMaps-Swift
    pod install
    open GoogleMapsSwiftDemos.xcworkspace

    Objective-C

    cd maps-sdk-for-ios-samples-main/GoogleMaps
    pod install
    open GoogleMapsDemos.xcworkspace
  3. En Xcode, presiona el botón de compilación para compilar la app con el esquema actual. La compilación produce un error y te solicita ingresar tu clave de API en el archivo SDKConstants.swift para Swift o en el archivo SDKDemoAPIKey.h para Objective-C.
  4. Si aún no tienes una clave de API, sigue las instrucciones para configurar un proyecto en la consola de Google Cloud y obtener una clave de API. Cuando configures la clave en la consola de Cloud, puedes restringir la clave al identificador del paquete de la app de ejemplo para garantizar que solo tu app pueda usarla. El identificador de paquete predeterminado de la app de ejemplos de SDK es com.example.GoogleMapsDemos.
  5. Edita el archivo SDKConstants.swift para Swift o el archivo SDKDemoAPIKey.h para Objective-C y pega tu clave de API en la definición de la constante apiKey o kAPIKey. Por ejemplo:

    Swift

    static let apiKey = "YOUR_API_KEY"

    Objective-C

    static NSString *const kAPIKey = @"YOUR_API_KEY";
  6. En el archivo SDKConstants.swift (Swift) o SDKDemoAPIKey.h (Objective-C), quita la siguiente línea, ya que se usa para registrar el problema definido por el usuario:

    Swift

    #error (Register for API Key and insert here. Then delete this line.)

    Objective-C

    #error Register for API Key and insert here.
  7. Compila y ejecuta el proyecto. Aparece la ventana del simulador de iOS, en la que se muestra una lista de demostraciones del SDK de Maps.
  8. Selecciona una de las opciones que se muestran para experimentar con una función del SDK de Maps para iOS.
  9. Si se te solicita permitir que GoogleMapsDemos acceda a tu ubicación, selecciona Permitir.