ios - 将 GMSMarker 移动 X 米偏转

标签 ios swift google-maps-sdk-ios

我正在使用适用于 iOS 的 Google Maps SDK。

我的项目需要能够沿着绘制在 map View 上的预定路径将当前位置标记移动 x 米。因此,我从 this question 中实现了以下方法(Koray Birand 的回答):

func distance(distance: Double, AwayFromCoordinate origin: CLLocationCoordinate2D, WithBearing bearing: Double) -> CLLocationCoordinate2D {
  let earthRadius = 6372797.6   // in meters

  let radianDistance = distance / earthRadius
  let radianBearing = bearing * M_PI / 180.0

  let latitude = origin.latitude * M_PI / 180
  let longitude = origin.longitude * M_PI / 180

  let lat2 = asin(sin(latitude) * cos(radianDistance) + cos(latitude) * sin(radianDistance) * cos(radianBearing))
  let lon2 = longitude + atan2(sin(radianBearing) * sin(radianDistance) * cos(latitude), cos(radianDistance) - sin(longitude) * sin(lat2))

  return CLLocationCoordinate2DMake(lat2 * 180 / M_PI, lon2 * 180 / M_PI)
}

所以如果我像下面这样调用上面的方法:

currentLocationMarker.position = distance(0.5, AwayFromCoordinate: currentLocationMarker.position, WithBearing: bearing)

这为我提供了一个距离当前位置 0.5 米的新位置。

但是有一个小问题,即使起点相同,运动也开始有点偏转,如下所示:

Path being drawn as deflected

我不明白为什么会发生这种偏转而不是直行。有什么想法吗?

最佳答案

我相信您从 this answer 得到了这个解决方案, 正确的? 如果是这样,请注意在计算 lon2 时您会:

let lon2 = longitude + atan2(sin(radianBearing) * sin(radianDistance) * cos(latitude), 
cos(radianDistance) - sin(longitude) * sin(lat2))

现在看一下原始答案的代码:

let lon2 = lon1 + atan2(sin(rbearing) * sin(distRadians) * cos(lat1), 
cos(distRadians) - sin(lat1) * sin(lat2))

注意最后一点:...- sin(lat1) * sin(lat2)) 在您的代码中使用一个纬度和一个经度代替纬度: ...- sin(经度) * sin(lat2))

所以正确的解决方案可能是:

let lon2 = longitude + atan2(sin(radianBearing) * sin(radianDistance) * cos(latitude), 
cos(radianDistance) - sin(latitude) * sin(lat2))

也许这就是问题的根源??

希望对你有帮助 =)

关于ios - 将 GMSMarker 移动 X 米偏转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36382149/

相关文章:

ios - 在 didUpdateLocations 中重绘方向路径

ios - 如何直接从 URL 在 swift 中打开 pdf 文件

swift - ARKit 中的 sceneView.pointOfView.transform 和 ARCamera.transform 有什么区别?

swift - 从 observeSingleEvent 返回两个数组

swift - 使用 NSFetchedResultsController 对描述符进行排序 - Swift

google-maps-sdk-ios - 为 iOS SDK 的 Google Maps 设置最大缩放级别 kGMSMaxZoomLevel

ios - GoogleMaps iOS SDK 1.5 版无响应

ios - 在谷歌地图中点击标记时如何防止相机移动?

ios - 当数据源和委托(delegate)与 View Controller 分离时,如何将 TableView 的单击项目发送到其他 View Controller

ios - Xcode7 Beta 6 - 对应用商店提交的 WatchKit 支持无效