2017-02-03 3 views
0

Ich versuche herauszufinden, wie Geocode ein CLLocation in CloudKit gespeicherten umgekehrt. Ich habe den Standort in einem Datensatz gespeichert und ich weiß, dass es als Breiten- und Längengrad speichert. Here's my record. The latitude and longitude appear I just took them out for now. Allerdings möchte ich in der Lage sein, den Standort benutzerlesbar zu machen, so AKA Reverse Geocode es, um die Stadt und Staat zu bekommen. Und ich habe hier schon mal nachgeschaut, aber nichts auf der Rückseite geocodiert, den Speicherort kann ich in CloudKit speichern.Wie wird der geografische Längen- und Breitengrad von dem in CloudKit gespeicherten Ort umgekehrt? - Swift 3

Hier ist mein Modell:

class Peek: CloudKitSyncable { 

    static let kType = "Peek" 
    static let kPhotoData = "photoData" 
    static let kTimeStamp = "timestamp" 
    static let kTitle = "title" 
    static let kText = "text" 
    static let kLocation = "location" 
    static let kCity = "city" 

    let title: String 
    let text: String 
    let photoData: Data? 
    let timestamp: Date 
    var location: CLLocation 
    var comments: [Comment] 
    var photo: UIImage? { 

     guard let photoData = self.photoData else { return nil } 
     return UIImage(data: photoData) 
    } 

    init(title: String, timestamp: Date = Date(), text: String, photoData: Data?, comments: [Comment] = [], location: CLLocation) { 
     self.title = title 
     self.timestamp = timestamp 
     self.text = text 
     self.photoData = photoData 
     self.comments = comments 
     self.location = location 
    } 

    var recordType: String { 
     return Peek.kType 
    } 

    var cloudKitRecordID: CKRecordID? 

    convenience required init?(record: CKRecord) { 

     guard let timestamp = record.creationDate, 
      let photoAsset = record[Peek.kPhotoData] as? CKAsset, 
      let title = record[Peek.kTitle] as? String, 
      let text = record[Peek.kText] as? String, 
     let location = record[Peek.kLocation] as? CLLocation else { return nil } 
     let photoData = try? Data(contentsOf: photoAsset.fileURL) 
     self.init(title: title, timestamp: timestamp, text: text, photoData: photoData, location: location) 
     cloudKitRecordID = record.recordID 
    } 

    fileprivate var temporaryPhotoURL: URL { 
     let temporaryDirectory = NSTemporaryDirectory() 
     let temporaryDirectoryURL = URL(fileURLWithPath: temporaryDirectory) 
     let fileURL = temporaryDirectoryURL.appendingPathComponent(UUID().uuidString).appendingPathExtension("jpg") 

     try? photoData?.write(to: fileURL, options: .atomic) 

     return fileURL 
    } 

} 
extension CKRecord { 

    convenience init(_ peek: Peek) { 
     let recordID = CKRecordID(recordName: UUID().uuidString) 
     self.init(recordType: peek.recordType, recordID: recordID) 

     self[Peek.kTitle] = peek.title as String? as CKRecordValue? 
     self[Peek.kText] = peek.text as String? as CKRecordValue? 
     self[Peek.kTimeStamp] = peek.timestamp as CKRecordValue? 
     self[Peek.kLocation] = peek.location as CKRecordValue? 
     self[Peek.kPhotoData] = CKAsset(fileURL: peek.temporaryPhotoURL) 
    } 
} 

Ich habe auch eine Locationmanager Datei auch:

Antwort

0

Apple ein Verfahren in Core-Location der CLGeocoder Klasse gebaut bietet. Here are the docs. Wenn dies erfolgreich ist, wird Ihnen der Completion-Handler Zugriff auf ein Array von CLPlacemark geben, so dass Sie eines davon greifen und auf die von Ihnen benötigten lesbaren Elemente zugreifen können. Die Namen der Variablen sind ziemlich allgemein gehalten, um Orte auf der ganzen Welt abzudecken, also müssen Sie ein wenig nachgraben, um genau das zu finden, was Sie brauchen. Check the docs auf CLPlacemark für genaue Details zu den Variablen, die für Sie verfügbar sind. In Ihrem speziellen Fall benötigen Sie locality und administrativeArea für Stadt und Staat.

Verwendung wäre so etwas wie dieses:

let geocoder = CLGeocoder() 
geocoder.reverseGeocodeLocation(location) { (placemarks, error) in 
    guard let placemarks = placemarks, let placemark = placemarks.first else { return } 
    if let city = placemark.locality, let state = placemark.administrativeArea { 
    //Set your labels or whatever 
    } 
} 
+0

Cooler Dank! Herausgefunden. –

Verwandte Themen