Advertisement
Guest User

Untitled

a guest
Sep 22nd, 2017
59
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.81 KB | None | 0 0
  1. directions.calculate { (response, error) in
  2. if error != nil {
  3. return
  4. }
  5. if let route = response?.routes.first {
  6.  
  7. var coords = [CLLocationCoordinate2D]()
  8. let pointCount = route.polyline.pointCount
  9. let routeCoordinates = UnsafeMutablePointer<CLLocationCoordinate2D>.allocate(capacity: pointCount)
  10. route.polyline.getCoordinates(routeCoordinates, range: NSMakeRange(0, pointCount))
  11. for i in 0..<pointCount {
  12. coords.append(routeCoordinates[i])
  13. }
  14. free(routeCoordinates)
  15. for coord in coords {
  16.  
  17. let nextLocation = CLLocation(latitude: coord.latitude, longitude: coord.longitude)
  18.  
  19. self.annotationManager.addAnnotation(startLocation: currentLocation, endLocation: nextLocation, calloutString: NSUUID().uuidString)
  20.  
  21. }
  22.  
  23.  
  24. let metersPerNode: CLLocationDistance = 5
  25.  
  26. let distance = Turf.distance(along: coords)
  27.  
  28. for i in stride(from: 0, to: distance, by: metersPerNode) {
  29. if let nextCoord = Turf.coordinate(at: i, fromStartOf: coords) {
  30. let interpNextLoc = CLLocation(latitude: nextCoord.latitude, longitude: nextCoord.longitude)
  31. self.annotationManager.addAnnotation(startLocation: currentLocation, endLocation: interpNextLoc, calloutString: NSUUID().uuidString)
  32. }
  33. }
  34. }
  35.  
  36. }
  37.  
  38. func addAnnotation(startLocation: CLLocation, endLocation: CLLocation, calloutString: String?) {
  39. let origin = matrix_identity_float4x4
  40.  
  41. //distance and bearing between start and end
  42. let dist = Float(endLocation.distance(from: startLocation))
  43. let degrees = startLocation.bearingTo(endLocation: endLocation)
  44. let bearing = GLKMathDegreesToRadians(degrees)
  45.  
  46. //rotate start location by bearing of end location and extend it the desired distance
  47. let position = vector_float4(0.0, 0.0, -dist, 0.0)
  48. let translationMatrix = createTranslationMatrix(position)
  49. let rotationMatrix = rotationY(bearing)
  50. let transformMatrix = simd_mul(rotationMatrix, translationMatrix)
  51. let transform = simd_mul(origin, transformMatrix)
  52.  
  53. //create anchor
  54. let anchor = RoutesARAnchor(transform: transform)
  55.  
  56. anchor.calloutString = calloutString
  57. session.add(anchor: anchor)
  58. anchors.append(anchor)
  59. }
  60.  
  61. private func createTranslationMatrix(_ translation: vector_float4) -> matrix_float4x4 {
  62. var m: matrix_float4x4 = matrix_identity_float4x4
  63. m.columns.3 = translation
  64. return m
  65. }
  66.  
  67. private func rotationY(_ radians: Float) -> matrix_float4x4 {
  68. var m: matrix_float4x4 = matrix_identity_float4x4
  69.  
  70. m.columns.0.x = cos(radians)
  71. m.columns.0.z = -sin(radians)
  72.  
  73. m.columns.2.x = sin(radians)
  74. m.columns.2.z = cos(radians)
  75.  
  76. return simd_inverse(m)
  77. }
  78.  
  79. func bearingTo(endLocation: CLLocation) -> Float {
  80. var bearing: Float = 0.0
  81.  
  82. let latStart = GLKMathDegreesToRadians(Float(coordinate.latitude))
  83. let latEnd = GLKMathDegreesToRadians(Float(coordinate.longitude))
  84.  
  85. let lonStart = GLKMathDegreesToRadians(Float(endLocation.coordinate.latitude))
  86. let lonEnd = GLKMathDegreesToRadians(Float(endLocation.coordinate.longitude))
  87.  
  88. let lonDistance = lonEnd - lonStart
  89.  
  90. let y = sin(lonDistance) * cos(latEnd)
  91. let x = cos(latStart) * sin(latEnd) - sin(latStart) * cos(latEnd) * cos(lonDistance)
  92. let radianBearing = atan2(y, x)
  93.  
  94. bearing = GLKMathRadiansToDegrees(radianBearing)
  95.  
  96. return bearing
  97. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement