2012-03-07 17 views
35

MKMapView benim enlem ve boylamı kullanarak ek açıklamaları yerleştirebiliyorum, ancak benim konumumda olması gereken yerine adresleri kullanmam gerekiyor. Lat ve Uzun. ör. 1234 batı 1234 doğu, San Francisco, CA ...iOS - MKMapView yerine yer ismini kullanarak yerine kullanıyorum

Bu, CLLocationManager ile ilgili bir sorun mu var?

Bunu daha önce deneyen var mı?

+0

Bunu mu demek? "1234 batı 1234 doğu" ile ne demek istediğinden emin değilim. – QED

+0

Evet, sokak adresi ile. Eyaleti, şehri ve adresi alabilirim. Mümkünse, bu sokak adresini Lat ve Long'a dönüştürmek istiyorum. – Romes

cevap

73

psoft 'un mükemmel bilgilerine dayanarak, bu kodla aradığım şeyi başardım.

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

Gösterilen şekilde region.center öğesinin ayarlanması onaylanmaz ve açıklığın geçerli aralığın 1/8'ine ayarlanması her zaman mantıklı olmaz. Bu daha basit olurdu: 'MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance (placemark.coordinate, 5000, 5000);' (5000 metredir). – Anna

+1

Her zaman 'objectAtIndex yerine 0 firstObject 'kullanın: 0' – Laszlo

+1

Sadece bir yan not olarak, 'placemark && placemarks.count> 0)' placemark' nil ise 'placemarks.count' dönecektir 'gereksizdir '. 'If (placemarks.count> 0) 'ile değiştirilebilir. – hhanesand

1

Bu mümkün değil. Ancak bir adresinden uzun/lat edinme CLGeocoder sınıfını kullanarak edinebilirsiniz.

10

Ardından, coğrafi kodlama veya ileri coğrafi kodlama. Ters-coğrafi kodlama, lat/long çiftinin sokak adresine dönüştürülmesi işlemidir.

iOS5, coğrafi kodlama için CLGeocoder sınıfını sağlar. MKPlacemark, iOS> = 3.0'da reverse-gococoding özelliğini destekler. Elbetteki veriler çok büyüktür, bu nedenle uygulamanız genellikle işlevsellik için ağ erişimine ihtiyaç duyacaktır.

Başlamak için iyi bir yer Apple'ın Location Awareness Programming Guide. Ayrıca, bu konuda SO burada çok soru var. https://stackoverflow.com/search?q=geocoding

İyi şanslar!

7

IOS 7, placemark.region.center kaldırıldı. Şimdi kullanması gerekir: Ayrıca Apple Belgeleri about this ve here çok okuyabilir

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

.

7

Swift sürüm

 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 sürümü:

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

İşte başka versiyonu ...

- Swift 2017 sözdizimi

- noktası için bir PlaceName gösterir aşağı doğru

- Gösterilen en büyük yeri seçin, 5 km, gösterilen alanda

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


}