2017-05-24 5 views
0

に変換してください。説明のために前の質問を更新してください。CLLocationCoordinate2Dの文字列を配列

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

これは、CLLocationCoordinate2Dを配列に追加するために10秒ごとに呼び出されます。

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からそれを引っ張って、または文字列の変換の提案があれば。参考のために他のコードが必要な場合は、私にお知らせください。

+0

[迅速なCLLocationCoordinate2Dへの文字列の変換]の可能な複製(https://stackoverflow.com/questions/28417512/convert-string-to-collocationcoordinate2d-in-swift) – shallowThought

+0

これは重複しているとは思わない私はCLLocationCoordiante2Dの文字列を1つの文字列に持っていますが、それぞれの文字列ではありません。これはlat/lngを引き出すことができます。私はすでに個々の注釈でそれをやっています。あなたが私の質問にその答えを適用する方法を見たら、さらに説明できますか? –

+0

最初の文字列はどのように作成されましたか?まず、より良いエンコーディング方法を考え出す方がよいでしょう。 – rmaddy

答えて

3

だから私はあなたの最大の問題はあなたがStringを使っていることになると思うと思います。これはあなたが見ているそれらの奇妙なクラス名を追加するつもりです。緯度/経度の独自のエンコーディング方法を思いついてから、エンコーディングを逆にして位置データを取得する方が良いでしょう。だから次のようなものがベットのアプローチになります。

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 
} 

エンコードにカンマとコロンを使用しましたが、他のものを簡単に使用できます。

+0

これを実装することを覚えておきたいことは、私のサンプルコードではほとんどエラーチェックを行わなかったことです。特にデコードでは、デコードが常に空のinitだけでなく、有効なCLLocationCoordiante2Dを返すようにしたいかもしれません。 –

+0

これは面白そうです。それは、データベースにデータを取得して、うまく動作しますが、decodeCoordinatesを使用していても、次のエラーが表示されているので動作していません。 'String'型の値を期待される引数型 'NSCoder' routePath "]として! firebase参照内の文字列。それをNSCoderとして引き出すこともできません。 –

+1

次のように 'let routePath:String = dict [" routePath "]を! String path = decodeCoordinates(encodedString:routePath) ' –