非常“简单”的问题:给定两个CLLocationCoordinate2D,如何从第一个到第二个获取方位角(以弧度表示)?我对此进行了大量研究和研究,包括一般性问题和特定于Objective-C/Cocoa Touch/iOS的问题。

这是我的实现:

- (float) getHeadingForDirectionFromCoordinate:(CLLocationCoordinate2D)fromLoc toCoordinate:(CLLocationCoordinate2D)toLoc
{
    float fLat = fromLoc.latitude;
    float fLng = fromLoc.longitude;
    float tLat = toLoc.latitude;
    float tLng = toLoc.longitude;

    return atan2(sin(fLng-tLng)*cos(tLat), cos(fLat)*sin(tLat)-sin(fLat)*cos(tLat)*cos(fLng-tLng));
}

但是,此方法不会为我返回一致的结果。如果方位角靠近正北或正南,似乎很好,但是,其他任何方向似乎都返回不一致的数据,例如:

从50.405018,8.437500

至51.339802、12.403340

我的方法返回:5.918441弧度

应该是1.18660576弧度

(请参阅http://www.movable-type.co.uk/scripts/latlong.htmlhttp://www.movable-type.co.uk/scripts/latlong-map.html?lat1=50.405018&long1=8.437500&lat2=51.339802&long2=12.403340)

我已经两次和三次检查了公式是否正确。我还抽查了一些值,例如上面的示例,其中一些正确,一些错误。我玩过各种模数或返回值的边界,也没有运气。

有任何想法吗?我的代码有问题吗?也许我误解了数学函数的工作原理?

最佳答案

您的数学是正确的,但以下情况除外:

  • 在对它们应用任何sin()或cos()之前,请确保将fLat,fLon,tLat和tLon转换为弧度。除以180.0,再乘以PI。
  • 输入tLng和fLng之间的增量作为tLng-fLng,而不是相反。请注意,此差异在表达式中出现了两次。

  • 有了这些更改,我得到了具有 double 数学和问题中的值的1.18660677830947弧度。

    10-07 15:06