2012-03-07 6 views
35

Puedo colocar anotaciones en mi MKMapView usando latitud y longitud, sin embargo, mi fuente de entrada para la que necesito usar la ubicación usa direcciones de calles en lugar de Lat y Long. por ejemplo, 1234 al este de 1234 este, San Francisco, CA ...iOS - Anotación de lugar de MKMapView usando dirección en lugar de lat/long

¿Esto tiene algo que ver con el CLLocationManager?

¿Alguien ha intentado esto antes?

+0

¿Se refiere a la dirección? No estoy seguro de lo que quieres decir con "1234 west 1234 east". – QED

+0

Sí, por la dirección de la calle. Puedo obtener el estado, la ciudad y la dirección. Si es posible, me gustaría convertir esa dirección en Lat y Long. – Romes

Respuesta

73

Basado en psoft excelente información, 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]; 
        } 
       } 
      ]; 
+7

Establecer la región.centro como se muestra está en desuso y establecer el tramo a 1/8 del tramo actual no siempre tendrá sentido. Esto sería más simple: 'MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance (placemark.coordinate, 5000, 5000);' (el 5000 está en metros). – Anna

+1

Siempre use 'firstObject' en lugar de' objectAtIndex: 0' – Laszlo

+1

Al igual que una nota al margen, 'if (marcas de posición && placemarks.count> 0)' es redundante ya que 'placemarks.count' devolverá' 0' si las marcas de posición son 'nil '. Se puede reemplazar con 'if (placemarks.count> 0)'. – hhanesand

1

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

10

lo que está buscando se llama geocodificación o con visión de geocodificación. 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 geocodificar. 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 el Location Awareness Programming Guide de Apple. Además, hay MUCHAS preguntas sobre esto aquí en SO. https://stackoverflow.com/search?q=geocoding

¡Buena suerte!

7

Desde iOS 7, placemark.region.center está en desuso. Ahora tiene que utilizar:

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

También puede leer de Apple Documentación about this y here también.

7

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

      } 
     } 
9

refactorizado Swift versión:

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

Aquí está otra versión ...

- Swift 2017 sintaxis

- Muestra una placename 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) 
     } 
    } 


} 
Cuestiones relacionadas