将 CLLocationCoordinate2D(s) 的字符串转换为数组
Convert String of CLLocationCoordinate2D(s) into array
正在更新上一个问题以获得更好的解释。
var breadcrumbs: [CLLocationCoordinate2D] = []
var path: [CLLocationCoordinate2D] = []
每 10 秒调用一次,以将 CLLocationCoordinate2D 附加到数组。
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。我正在保存为字符串,因为如果不这样做,我会收到错误消息。
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 数据库参考中的坐标字符串。
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 数组。
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 中提取它或转换字符串有任何建议,请告诉我。如果您需要其他代码供参考,请告诉我。
所以我认为您最大的问题是您正在使用 String(describing:)。这将添加您看到的那些奇怪的 class 名称。您最好为 lat/long 提出自己的编码方法,然后对其进行反向编码以取回您的位置数据。所以像下面这样的方法是一个更好的方法。
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
}
我只是使用逗号和冒号进行编码,但您可以轻松使用其他内容。
正在更新上一个问题以获得更好的解释。
var breadcrumbs: [CLLocationCoordinate2D] = []
var path: [CLLocationCoordinate2D] = []
每 10 秒调用一次,以将 CLLocationCoordinate2D 附加到数组。
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。我正在保存为字符串,因为如果不这样做,我会收到错误消息。
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 数据库参考中的坐标字符串。
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 数组。
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 中提取它或转换字符串有任何建议,请告诉我。如果您需要其他代码供参考,请告诉我。
所以我认为您最大的问题是您正在使用 String(describing:)。这将添加您看到的那些奇怪的 class 名称。您最好为 lat/long 提出自己的编码方法,然后对其进行反向编码以取回您的位置数据。所以像下面这样的方法是一个更好的方法。
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
}
我只是使用逗号和冒号进行编码,但您可以轻松使用其他内容。