我正在使用Google Maps SDK for iOS。
我的项目需要能够沿着绘制到地图视图的预定路径将当前位置标记移动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米的新位置。
然而,即使起点相同,运动也会开始稍微向下偏转:
我无法弄清楚为什么会发生这样的偏转而不是直截了当。有什么想法吗?
答案 0 :(得分:1)
我相信你从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(longitude) * sin(lat2))
所以可能正确的解决方案是:
let lon2 = longitude + atan2(sin(radianBearing) * sin(radianDistance) * cos(latitude),
cos(radianDistance) - sin(latitude) * sin(lat2))
也许这就是问题的根源?
我希望它有帮助=)