2012-03-07 11 views
35

Sono in grado di inserire annotazioni sul mio MKMapView utilizzando latitudine e longitudine, tuttavia, il mio feed in arrivo che ho bisogno di utilizzare la posizione per sta usando gli indirizzi stradali invece di Lat e Long. ad esempio 1234 ovest 1234 est, San Francisco, CA ...iOS - MKMapView annotazione luogo utilizzando l'indirizzo anziché lat/long

Questo avrebbe a che fare con lo CLLocationManager?

Qualcuno ha tentato questo prima?

+0

Intendi l'indirizzo? Non sono sicuro di cosa intendi con "1234 ovest 1234 est". – QED

+0

Sì, per indirizzo. Posso ottenere lo stato, la città e l'indirizzo. Se possibile, mi piacerebbe convertire quell'indirizzo in Lat e Long. – Romes

risposta

73

Basato su psoft 's eccellente informazione, sono stato in grado di ottenere quello che stavo cercando con questo codice.

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

L'impostazione di region.center come mostrato è deprecata e l'impostazione dell'ampie su 1/8 dello span corrente non ha sempre senso. Questo sarebbe più semplice: 'MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance (placemark.coordinate, 5000, 5000);' (il 5000 è in metri). – Anna

+1

Usa sempre 'firstObject' invece di' objectAtIndex: 0' – Laszlo

+1

Come nota a margine, 'if (segnaposti && placemarks.count> 0)' è ridondante come 'placemarks.count' restituirà '0' se i segnaposto sono' nil '. Può essere sostituito con 'if (placemarks.count> 0)'. – hhanesand

1

Questo non è possibile. Ma puoi ottenere il long/lat da un indirizzo usando la classe CLGeocoder.

10

Quello che cercate è chiamato geocoding o geocoding in avanti. Il geocoding inverso è il processo di conversione di una coppia lat/long in un indirizzo.

iOS5 fornisce la classe CLGeocoder per il geocoding. MKPlacemark supporta reverse-goecoding in iOS> = 3.0. I dati coinvolti sono ovviamente molto grandi, quindi la tua app in genere avrà bisogno di accedere alla funzionalità.

Un buon punto di partenza è Apple Location Awareness Programming Guide. Inoltre, ci sono molte domande su questo qui su SO. https://stackoverflow.com/search?q=geocoding

Buona fortuna!

7

Da iOS 7, placemark.region.center è obsoleto. Ora ha bisogno di usare:

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

Si può anche leggere di Apple Documentazione about this e here troppo.

7

versione Swift

versione
 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

refactoring Swift:

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

Ecco un'altra versione ...

- Swift 2017 sintassi

- Mostra un toponimo per il punto, in basso

- Scegli una dimensione qualsiasi, ad esempio 5 km, come l'area indicata

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


} 
Problemi correlati