2016-12-31 2 views
0

Ich hatte Mühe, CLLocationCoordinate2D Daten von Markern auf einer Google Maps zu CoreData zu speichern. Dies kann nicht direkt gemacht werden, aber ich habe eine Arbeit gefunden, wo ich die Koordinaten nehme, in CLLocationDegrees aufspalten, sie in einen String-Text umwandeln und speichern. Ich tue dies durch die folgende:Konvertieren String aus CoreData in CLLocationDegrees/CLLocationCoordinate2D

let marker = GMSMarker() 
    marker.position = CLLocationCoordinate2DMake(place.coordinate.latitude, place.coordinate.longitude) 

    let newPlaceLatitude = place.coordinate.latitude 
    print(newPlaceLatitude) 
    var latitudeText:String = "\(newPlaceLatitude)" 
    self.latitudeText = "\(newPlaceLatitude)" 
    let newPlaceLongitude = place.coordinate.longitude 
    print(newPlaceLongitude) 
    var longitudeText:String = "\(newPlaceLongitude)" 
self.longitudeText = "\(newPlaceLongitude)" 

Speichern in Coredata:

let appDelegate = UIApplication.shared.delegate as! AppDelegate 
    let context = appDelegate.persistentContainer.viewContext 
    let newPlace = NSEntityDescription.insertNewObject(forEntityName: 
    "StoredPlace", into: context) 
    newPlace.setValue(latitudeText, forKeyPath: "latitude") 
    newPlace.setValue(longitudeText, forKeyPath: "longitude") 

aber jetzt habe ich die Saite wieder in CLLocationCoordinates zu rekonstruieren bin zu kämpfen. Wie würde ich eine Zeichenfolge in CLLocationDegree/CLLocationCoordinate2D umwandeln? Dies ist angeblich ziemlich einfach, aber ich habe festgestellt, dass die folgende Methode funktioniert nicht:

let latitude: CLLocationDegrees = Double(latitudeText)! 
       let longitude: CLLocationDegrees = Double(longitudeText)! 
        let markers = GMSMarker() 
       print(latitude) 
       print(longitude) 
        markers.position = CLLocationCoordinate2D(latitude: latitude, longitude: longitude) 

andere Vorschläge, wie Zeichenfolge ändern zu koordinieren?

+1

Wahrscheinlich nicht verwandt, aber warum speichern Sie eine 'Double' als' String' es zurück zu konvertieren zu "verdoppeln"? Core Data unterstützt auch 'Double'. – vadian

+0

Was wurde daraus? – Adrian

+0

Der Grund, warum ich es nicht sofort als Double gespeichert habe, ist, dass ich immer Fehler bekam und es nicht umgehen konnte. Also dachte ich, diese Methode von Double zu String-String zu Double würde genauso gut funktionieren. Adrian I didn ' t verstehst du deine Antwort vollständig, also benutze die Methode, um die Zeichenkette in viewDidLoad zurück in double zu konvertieren, wenn du die Daten von coredata unter Verwendung von: if let lat = result.value (forKey: "latitude") als? NSString {Let Latitude = (lat als NSString) .DoubleValue} und das zum Rekonstruieren von Markern verwenden –

Antwort

-1

Sie müssen typecast Ihre Lat und lange in Dezimal-Werte, mehr vorzuziehen ist doppelt statt Float wegen Präzision Wert, die Stifte an perfekten Standorten fallen lassen können.

Art Casting in double als Schlüsselwort:

(yourCordinateString as NSString).doubleValue 

in float Werte Gießen:

(yourCordinateString as NSString).floatValue 
+0

Dies funktioniert ohne Fehler, aber etwas Seltsames passiert, wenn ich diese Methode mache. Die abgerufenen Werte werden als 0.0 ausgegeben, obwohl, wenn ich sie speichere und die Zeichenfolge drucke, der richtige Wert ist. Wenn ich jedoch nach der obigen Methode drucke, geht es auf 0.0, irgendeine Idee, warum das ist? –

+0

Wunder, können Sie zeigen, wie Sie diesen Code anwenden? – vaibhav

+0

Sicher, ich habe den Code auf das Ende meiner Frage oben gesetzt. Bitte guck dir das an. Ich implementiere diesen Code in der ViewDidLoad des Viewcontrollers, den ich meinen Kartencontainer habe.Der Druck (latitudeText) usw. funktioniert gut, aber der Druck (Breitengrad) erscheint als 0.0 im Terminal. Irgendwelche Gedanken darüber, was vor sich geht? –

1

CLLocation ‚s latitude und longitude Doppel- und so mit diesem Gedanken, könnte man erwägen latitude und longitude Eigenschaften, die Doppel auf Ihrem StoredPlace Objekt sind. Ich nannte die Eigenschaften coordinateX und coordinateY, so dass es leichter ist sich daran zu erinnern, dass es sich um benutzerdefinierte Koordinaten handelt, nicht um "Fabrik" -Eigenschaften.

Sie könnten eine Erweiterung in einer Datei StoredPlace + Extension.swift genannt erstellen, die wie folgt aussieht:

import CoreData 
import CoreLocation 

extension StoredPlace { 
    func location() -> CLLocation { 
     let location = CLLocation(latitude: self.coordinateX, longitude: self.coordinateY) 
     return location 
    } 
} 

Mit dieser Erweiterung können Sie dann die Koordinaten aus Ihrer Ergebnisse erhalten wie folgt: