geocoder ios mkmapview geocoding core-location cllocationmanager

geocoder - iOS-anotación de lugar MKMapView usando dirección en lugar de lat/long



geocoder swift (7)

Puedo colocar anotaciones en mi MKMapView utilizando la latitud y la longitud, sin embargo, mi información entrante para la que necesito usar la ubicación es usar direcciones de calles en lugar de Lat y Long. por ejemplo, 1234 al este de 1234 este, San Francisco, CA ...

¿Esto tiene algo que ver con el CLLocationManager ?

¿Alguien ha intentado esto antes?


Aquí hay otra versión ...

- Sintaxis de Swift 2017

- Muestra un nombre de lugar para el punto, en la parte inferior

- Elija cualquier tamaño, digamos 5 km, como el área mostrada

func map() { let 5km:CLLocationDistance = 5000 let a= "100 smith avenue some town 90210 SD" let g = CLGeocoder() g.geocodeAddressString(a) { [weak self] placemarks, error in if let p = placemarks?.first, let l = placemark.location { let p = MKPlacemark(coordinate: l.coordinate, addressDictionary: nil) let cr = MKCoordinateRegionMakeWithDistance(l.coordinate, 5km, 5km) let options = [ MKLaunchOptionsMapCenterKey: NSValue(mkCoordinate: cr.center), MKLaunchOptionsMapSpanKey: NSValue(mkCoordinateSpan: cr.span) ] let m = MKMapItem(placemark: p) m.name = "Your House" m.openInMaps(launchOptions: options) } } }


Basado en la excelente información de psoft , pude lograr lo que estaba buscando con este código.

NSString *location = @"some address, state, and zip"; CLGeocoder *geocoder = [[CLGeocoder alloc] init]; [geocoder geocodeAddressString:location completionHandler:^(NSArray* placemarks, NSError* error){ if (placemarks && placemarks.count > 0) { CLPlacemark *topResult = [placemarks objectAtIndex:0]; MKPlacemark *placemark = [[MKPlacemark alloc] initWithPlacemark:topResult]; MKCoordinateRegion region = self.mapView.region; region.center = placemark.region.center; region.span.longitudeDelta /= 8.0; region.span.latitudeDelta /= 8.0; [self.mapView setRegion:region animated:YES]; [self.mapView addAnnotation:placemark]; } } ];


Desde iOS 7, placemark.region.center está en desuso. Ahora necesita usar:

region.center = [(CLCircularRegion *)placemark.region center];

También puede leer la documentación de Apple sobre esto y here también.


Eso no es posible. Pero puede obtener el largo / lat desde una dirección utilizando la clase CLGeocoder .


Lo que está buscando se llama geocodificación o geocodificación hacia adelante . La geocodificación inversa es el proceso de conversión de un par latitud / longitud a la dirección de la calle.

iOS5 proporciona la clase CLGeocoder para la geocodificación. MKPlacemark admite la codificación inversa en iOS> = 3.0. Los datos involucrados, por supuesto, son muy grandes, por lo que su aplicación generalmente necesitará acceso a la red a la funcionalidad.

Un buen lugar para comenzar es la Guía de programación de concientización de ubicación de Apple. Además, hay MUCHAS preguntas sobre esto aquí en SO. https://.com/search?q=geocoding

¡Buena suerte!


Versión Swift

let location = self.txtLocation.text; let geocoder:CLGeocoder = CLGeocoder(); geocoder.geocodeAddressString(location!) { (placemarks: [CLPlacemark]?, error: NSError?) -> Void in if placemarks?.count > 0 { let topResult:CLPlacemark = placemarks![0]; let placemark: MKPlacemark = MKPlacemark(placemark: topResult); var region: MKCoordinateRegion = self.mkMapView.region; region.center = (placemark.location?.coordinate)!; region.span.longitudeDelta /= 8.0; region.span.latitudeDelta /= 8.0; self.mkMapView.setRegion(region, animated: true); self.mkMapView.addAnnotation(placemark); } }


Versión Swift Refactorizada:

let location = "some address, state, and zip" let geocoder = CLGeocoder() geocoder.geocodeAddressString(location) { [weak self] placemarks, error in if let placemark = placemarks?.first, let location = placemark.location { let mark = MKPlacemark(placemark: placemark) if var region = self?.mapView.region { region.center = location.coordinate region.span.longitudeDelta /= 8.0 region.span.latitudeDelta /= 8.0 self?.mapView.setRegion(region, animated: true) self?.mapView.addAnnotation(mark) } } }