Search code examples
iosswiftcore-datacoordinatescllocation

Convert String from CoreData into CLLocationDegrees/ CLLocationCoordinate2D


I had been struggling to store CLLocationCoordinate2D data from markers on a google maps to CoreData. This cannot be done directly but I found a work around where I take the coordinates, split into CLLocationDegrees, convert it into a string text and store it. I do this by the following:

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

Storing into 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")

However now I am struggling to reconstruct the strings back into CLLocationCoordinates. How would I turn a string to a CLLocationDegree/CLLocationCoordinate2D ? This is supposedly pretty simple but I have found that the following method doesn't work:

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

any other suggestions about how to change string to coordinate?


Solution

  • You need to typecast your lat and long in decimal values, more preferable is double instead of float because of precision value which can drop pins at perfect locations.

    Type casting in double using as keyword:

    (yourCordinateString as NSString).doubleValue
    

    casting in float values:

    (yourCordinateString as NSString).floatValue