将指南针的航向计算到特定坐标而不是北

Posted

技术标签:

【中文标题】将指南针的航向计算到特定坐标而不是北【英文标题】:Calculating heading of compass to a specific coordinate instead of to north 【发布时间】:2012-11-28 08:17:28 【问题描述】:

我无法正确使用此算法。我正在尝试制作一个指向某个位置的指南针,而不仅仅是指向,比如说,北方。出了点问题。我花了很多时间试图弄清楚这一点,但我就是找不到。有什么想法吗?

- (void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading

double distanceEast = (location.longitude > 0 && otherLocation.longitude < 0) ? 180 - location.longitude + otherLocation.longitude - -180: otherLocation.longitude - location.longitude;

    if (distanceEast < 0) 
        distanceEast += 360;
    

    double distanceWest = (location.longitude < 0 && otherLocation.longitude > 0) ? -180 - location.longitude - 180 - otherLocation.longitude : location.longitude - otherLocation.longitude;

    if (distanceWest < 0) 
        distanceWest += 360;
    

    float latitudinalDifference = (otherLocation.latitude - location.latitude);
    float longitudinalDifference = fmin(distanceEast,distanceWest);

    float arcTan = atan(longitudinalDifference / latitudinalDifference);

        float oldRadian = (-manager.heading.trueHeading *M_PI /180.0f)+arcTan+M_PI;
        float newRadian = (-newHeading.trueHeading *M_PI /180.0f)+arcTan+M_PI;

        CABasicAnimation *animation;
        animation=[CABasicAnimation animationWithKeyPath:@"transform.rotation"];
        animation.fromValue = [NSNumber numberWithFloat:oldRadian];
        animation.toValue = [NSNumber numberWithFloat:newRadian];
        animation.duration = 0.5f;
        directionsArrow.layer.anchorPoint = CGPointMake(0.5, 0.5);

        [directionsArrow.layer addAnimation:animation forKey:@"rotationCompass"];
        directionsArrow.transform = CGAffineTransformMakeRotation(newRadian);

【问题讨论】:

您介意发布您的整个固定方法吗?我想在自己的应用程序中执行此操作。 【参考方案1】:
double lon = location.longitude - otherLocation.longitude;
double y = sin(lon) * cos(otherLocation.latitude);
double x = cos(location.latitude) * sin(otherLocation.latitude) - sin(location.latitude) * cos(otherLocation.latitude) * cos(lon);
double angle = atan2(y, x);

angle 是两个位置之间的方位。

【讨论】:

我不确定这如何解决问题。您能否详细说明对代码的具体更改?我也想做同样的事情。 @AaronBratcher 这基本上是 rob 在他的回答中提出的。 xy 是墨卡托坐标。使用atan2 计算角度(以弧度为单位)。【参考方案2】:

“Map Coordinates Systems” in the Location Awareness Programming Guide 说:“具体来说,在墨卡托地图投影上,在地图上任意两点之间绘制的直线会产生可用于地球表面实际导航的航向。”这让我认为您应该将地图坐标转换为地图点 (MKMapPointForCoordinate) 并在地图点之间的差异上调用 atan。 (实际上,你应该使用atan2,而不是atan。)你试过了吗?

【讨论】:

谢谢,我试试看!

以上是关于将指南针的航向计算到特定坐标而不是北的主要内容,如果未能解决你的问题,请参考以下文章

Android Compass 指向我的位置而不是北

Android Compass指向我的位置而不是北

将 Arduino 指南针信号转换为可用航向

使用指南针指向位置

有没有一种简单的方法可以在 phonegap 中获得手机的指南针航向精度?

iPhone 3.0 指南针:如何获取航向?