2014-10-06 18 views
5

Mam lokalizację na długość/szerokość geograficzną, którą chcę przekonwertować na nazwę lokalizacji String w Swift. Jaki jest najlepszy sposób na zrobienie tego? uważam, że najlepiej jest użyć funkcji reverseGeocodeLocation, ale nie do końca pewna, jak to zrobić. To, co mam tak daleko:Konwersja współrzędnych GPS na nazwę/adres miasta w Swift

func locationManager(manager: CLLocationManager!, didUpdateLocations locations: [AnyObject]!) { 
    if (locationFixAchieved == false) { 
     locationFixAchieved = true 
     var locationArray = locations as NSArray 
     var locationObj = locationArray.lastObject as CLLocation 
     var coord = locationObj.coordinate 
     var latitude = coord.latitude 
     var longitude = coord.longitude 

     getCurrentWeatherData("\(longitude)", latitude: "\(latitude)") 
     reverseGeocodeLocation(location:coord, completionHandler: { (<#[AnyObject]!#>, <#NSError!#>) -> Void in 
      <#code#> 
     }) 

    } 
} 

func reverseGeocodeLocation(location: CLLocation!, completionHandler: CLGeocodeCompletionHandler!){ 

} 
+0

dołączony do tego, co już próbowali. Myślę, że muszę użyć funkcji reverseGeocodeLocation, ale nie wiem, jak to zrobić –

Odpowiedz

11

Musisz napisać kod tak:

geocoder.reverseGeocodeLocation(currentLocation, completionHandler: { 
      placemarks, error in 

       if error == nil && placemarks.count > 0 { 
        self.placeMark = placemarks.last as? CLPlacemark 
        self.adressLabel.text = "\(self.placeMark!.thoroughfare)\n\(self.placeMark!.postalCode) \(self.placeMark!.locality)\n\(self.placeMark!.country)" 
        self.manager.stopUpdatingLocation() 
       } 
      }) 
+1

Po prostu dodałbym, że intead dołączania wszystkich komponentów oznaczeń miejsca, możesz po prostu użyć: self.adressLabel.text = ABCreateStringWithAddressDictionary (self.placemark.addressDictionary !, false) dla <= iOS 8 ze struktury AdressBookUI i CNPostaAddressFormatter ze struktury Kontakty dla> iOS 9.0 –

+0

Ah dzięki, nie wiedziałem o tym! – Ben

4

sprawdź tę odpowiedź.

func getAddressFromGeocodeCoordinate(coordinate: CLLocationCoordinate2D) { 
    let geocoder = GMSGeocoder() 
    geocoder.reverseGeocodeCoordinate(coordinate) { response , error in 

     //Add this line 
     if let address = response!.firstResult() { 
     let lines = address.lines! as [String] 
     print(lines) 

     } 
    } 
    } 
0

Swift Code, aby uzyskać adres z oznaczeniem miejsca, ładnie sformatowany

let address = ABCreateStringWithAddressDictionary(placemark.addressDictionary!, false).componentsSeparatedByString("\n").joinWithSeparator(", ") 

print(address!) 
3

Używam Swift 3/XCode 8

użyłem Benjamin Herzog's answer ale wpadłem na pewne błędy kompilacji powiązanych do opcjonalnego i castingu.

Podczas przepisywania, postanowiłem zamknąć go w funkcji i uogólnić, aby można go było łatwo podłączyć w dowolnym miejscu.

import CoreLocation 

func getPlacemark(forLocation location: CLLocation, completionHandler: @escaping (CLPlacemark?, String?) ->()) { 
    let geocoder = CLGeocoder() 

    geocoder.reverseGeocodeLocation(location, completionHandler: { 
     placemarks, error in 

     if let err = error { 
      completionHandler(nil, err.localizedDescription) 
     } else if let placemarkArray = placemarks { 
      if let placemark = placemarkArray.first { 
       completionHandler(placemark, nil) 
      } else { 
       completionHandler(nil, "Placemark was nil") 
      } 
     } else { 
      completionHandler(nil, "Unknown error") 
     } 
    }) 

} 

Używanie go:

getPlacemark(forLocation: originLocation) { 
    (originPlacemark, error) in 
     if let err = error { 
      print(err) 
     } else if let placemark = originPlacemark { 
      // Do something with the placemark 
     } 
    }) 
} 
+0

Dobry jeden człowiek !! Twoje zdrowie –