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