2012-03-07 14 views
35

Jestem w stanie umieścić adnotacje na mojej MKMapView za pomocą szerokości i długości geograficznej, jednak moje źródło przychodzące, którego potrzebuję użyć lokalizacji, to używanie adresów ulic zamiast Lat i długo. np. 1234 zachód 1234 wschód, San Francisco, CA ...iOS - MKMapView adnotacja miejsca za pomocą adresu zamiast szerokości/długości

Czy to ma coś wspólnego z CLLocationManager?

Czy ktoś już próbował tego dokonać?

+0

Masz na myśli adres? Nie jestem pewien, co masz na myśli przez "1234 zachód 1234 na wschód". – QED

+0

Tak, według adresu. Mogę zdobyć państwo, miasto i adres. Jeśli to możliwe, chciałbym przekonwertować ten adres na Lat i Long. – Romes

Odpowiedz

73

Na podstawie doskonałych informacji, udało mi się osiągnąć to, czego szukałem za pomocą tego kodu.

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

Ustawienie regionu.center, jak pokazano, jest przestarzałe i ustawienie rozpiętości na 1/8 bieżącego zakresu nie zawsze ma sens. To byłoby prostsze: 'region MKCoordinateRegion = MKCoordinateRegionMakeWithDistance (placemark.coordinate, 5000, 5000);' (5000 jest w metrach). – Anna

+1

Zawsze używaj 'firstObject' zamiast' objectAtIndex: 0'' – Laszlo

+1

Tak jak na marginesie, 'if (oznaczenia miejsc && placemarks.count> 0)' jest zbędne, ponieważ 'placemarks.count' zwróci' 0', jeśli oznaczenia miejsc to 'nil '. Można go zastąpić przez 'if (placemarks.count> 0)'. – hhanesand

1

To nie jest możliwe. Ale możesz uzyskać wartość long/lat z adresu przy użyciu klasy CLGeocoder.

10

Co jesteś po nazywa geokodowanie lub wybiegające geokodowanie. Odwrotne geokodowanie to proces przekształcania pary lat/długiej na adres ulicy.

iOS5 udostępnia klasę CLGeocoder do geokodowania. MKPlacemark obsługuje reverse-goecoding w iOS> = 3.0. Dane oczywiście są bardzo duże, więc twoja aplikacja będzie na ogół potrzebować dostępu do sieci do tej funkcji.

Dobrym miejscem na rozpoczęcie jest Apple Location Awareness Programming Guide. Ponadto istnieje wiele pytań na ten temat na SO. https://stackoverflow.com/search?q=geocoding

Powodzenia!

7

Od iOS 7, placemark.region.center jest przestarzała. Teraz musi używać:

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

Można również odczytać firmy Apple Dokumentacja about this i here też.

7

wersja Swift

wersja
 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

refactored 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

Oto kolejna wersja ...

- Swift 2017 składnia

- Pokazuje PlaceName do punktu, na dole

- Wybierz dowolny rozmiar, powiedzmy 5 km, jako pokazany obszar

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


}