2017-02-03 1 views
0

J'essaie de comprendre comment inverser le géocodage CLLocation stocké dans CloudKit. J'ai l'emplacement stocké dans un enregistrement et je sais qu'il stocke comme latitude et longitude. Here's my record. The latitude and longitude appear I just took them out for now. Cependant, je veux être en mesure de rendre l'emplacement lisible par l'utilisateur, donc AKA inverse le géocode, pour obtenir le ville et l'état. Et j'ai regardé ici jusqu'à présent, mais rien sur le géocodage inverse de l'emplacement que je peux stocker dans CloudKit.Comment inverser la latitude et la longitude du géocodage à partir d'un emplacement stocké dans CloudKit? - Swift 3

Voici mon modèle:

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

J'ai aussi un fichier LocationManager ainsi:

Répondre

0

Apple propose une méthode intégrée dans la classe de base Localisation CLGeocoder. Here are the docs. En cas de succès, le gestionnaire de complétion vous donnera accès à un tableau de CLPlacemark, de sorte que vous pouvez en saisir un et accéder à tous les éléments lisibles par l'utilisateur dont vous avez besoin. Les noms des variables sont assez génériques pour couvrir les emplacements partout dans le monde, donc vous devrez creuser un peu pour trouver exactement ce dont vous avez besoin. Check the docs sur CLPlacemark pour des détails précis sur les variables à votre disposition. Dans votre cas particulier, vous aurez besoin de locality et administrativeArea pour la ville et l'état, respectivement.

utilisation serait quelque chose comme ceci:

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

merci cool! Deviner. –