将CLLocationCoordinate2D的字符串转换为数组 [英] Convert String of CLLocationCoordinate2D(s) into array

查看:268
本文介绍了将CLLocationCoordinate2D的字符串转换为数组的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

更新上一个问题以获得更好的解释.

Updating previous question for better explanation.

var breadcrumbs: [CLLocationCoordinate2D] = []
var path: [CLLocationCoordinate2D] = []

每10秒钟调用一次,以将CLLocationCoordinate2D附加到数组.

This is called every 10 seconds to append a CLLocationCoordinate2D to the array.

func addBreadcrumb(){
    let speed = (locationmanager.location?.speed)!
    let speedRounded = speed.roundTo(places: 4)
    let crumbCoordinate = locationmanager.location?.coordinate

    breadcrumbs.append(crumbCoordinate!)
    tripSpeeds.append(speedRounded)
}

一旦用户完成了行程,他们便会点击一个按钮,并调用以下功能.这会将数据输入到Firebase中.我将另存为字符串,否则将收到错误消息.

Once the user is done with their trip they tap a button and the following function is called. This gets the data in to firebase. I am saving as Strings as I get an error if done otherwise.

func submitTripPath(){
    let tripID: String? = tripUID
    let tripPath = String(describing: breadcrumbs) //This may be the problem
    let speeds = String(describing: tripSpeeds)

    var ref: FIRDatabaseReference!
    ref = FIRDatabase.database().reference()
    let tripRef = ref.child("TripPaths").child(tripID!)
    let tripDictionary = ["routePath" : tripPath, "routeSpeed" : speeds] as [String : Any]
    tripRef.updateChildValues(tripDictionary) { (err, ref) in
        if err != nil {
            print(err!)
            return
        }
    }
}

在另一个屏幕中,我成功地在Firebase数据库参考中拉出了坐标字符串.

In another screen I successfully pull out the String of Coordinates in a Firebase Database Reference.

let routePath = dict["routePath"] as! String //This may also be an issue
//output looks like this
"[__C.CLLocationCoordinate2D(latitude: 37.337728550000001, longitude: -122.02796406), __C.CLLocationCoordinate2D(latitude: 37.337716899999997, longitude: -122.02835139), __C.CLLocationCoordinate2D(latitude: 37.337694319999997, longitude: -122.0287719)]"

我希望能够将其用作CLLocationCoordinate2D中的数组以使用以下内容绘制折线. 我无法将此字符串转换为可用的CLLocationCoordinate2D数组.

I want to be able to use this as an array from CLLocationCoordinate2D to draw a polyline using the following. I am having trouble converting this string to a usable array of CLLocationCoordinate2D.

    if (path.count > 1) {
        let sourceIndex = path.count - 1
        let destinationIndex = path.count - 2

        let c1 = path[sourceIndex]
        let c2 = path[destinationIndex]

        var a = [c1, c2]
        let polyline = MKPolyline(coordinates: &a, count: a.count)
        mapContainerView.add(polyline)
    }

如果您有关于下注保存原始数组,从Firebase提取数组或转换字符串的建议,请告诉我.如果您需要其他代码作为参考,请告诉我.

If you have a suggestion on betting saving the original array, pulling it from Firebase, or converting the string please let me know. If you need other code for reference, please let me know.

推荐答案

所以我认为您最大的问题是您正在使用String(describing :).这将添加您看到的那些奇怪的类名称.您最好提出自己的经/纬度编码方法,然后对其进行反向编码以获取位置数据.因此,类似以下内容的方法将是一种bette方法.

So I think your biggest problem is going to be that you are using String(describing:). This is going to add those weird class names that you are seeing. You are better off coming up with your own encoding method for lat/long and then reverse encoding it to get back your location data. So something like the following would be a bette approach.

func submitTripPath(){
    let tripID: String? = tripUID
    let tripPath = encodeCoordinates(coords: breadcrumbs)
    let speeds = String(describing: tripSpeeds)

    var ref: FIRDatabaseReference!
    ref = FIRDatabase.database().reference()
    let tripRef = ref.child("TripPaths").child(tripID!)
    let tripDictionary = ["routePath" : tripPath, "routeSpeed" : speeds] as [String : Any]
    tripRef.updateChildValues(tripDictionary) { (err, ref) in
        if err != nil {
            print(err!)
            return
        }
    }
}

func encodeCoordinates(coords: [CLLocationCoordinate2D]) -> String {
    let flattenedCoords: [String] = coords.map { coord -> String in "\(coord.latitude):\(coord.longitude)" }
    let encodedString: String = flattenedCoords.joined(separator: ",")
    return encodedString
}

func decodeCoordinates(encodedString: String) -> [CLLocationCoordinate2D] {
    let flattenedCoords: [String] = encodedString.components(separatedBy: ",")
    let coords: [CLLocationCoordinate2D] = flattenedCoords.map { coord -> CLLocationCoordinate2D in
        let split = coord.components(separatedBy: ":")
        if split.count == 2 {
            let latitude: Double = Double(split[0]) ?? 0
            let longitude: Double = Double(split[1]) ?? 0
            return CLLocationCoordinate2D(latitude: latitude, longitude: longitude)
        } else {
            return CLLocationCoordinate2D()
        }
    }
    return coords
}

我只是使用逗号和冒号进行编码,但您可以轻松使用其他名称.

I just used commas and colons for my encoding but you can easily use something else.

这篇关于将CLLocationCoordinate2D的字符串转换为数组的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆