用于计算轴承w/Haversine功能的CLL位类别

Nic*_*ick 27 iphone core-location mapkit haversine cllocation

我正在尝试为CLLocation编写一个类别,以将轴承返回到另一个CLLocation.

我相信我对公式做错了(计算不是我的强项).返回的轴承始终关闭.

我一直在看这个问题并尝试应用被接受为正确答案的更改及其引用的网页:

计算两个CLLocationCoordinate2D之间的方位

http://www.movable-type.co.uk/scripts/latlong.html

谢谢你的任何指示.我已经尝试将其他问题的反馈结合起来,而我仍然没有得到任何东西.

谢谢

这是我的类别 -

----- CLLocation + Bearing.h

#import <Foundation/Foundation.h>
#import <CoreLocation/CoreLocation.h>


@interface CLLocation (Bearing)

-(double) bearingToLocation:(CLLocation *) destinationLocation;
-(NSString *) compassOrdinalToLocation:(CLLocation *) nwEndPoint;

@end
Run Code Online (Sandbox Code Playgroud)

--------- CLLocation + Bearing.m

#import "CLLocation+Bearing.h"

double DegreesToRadians(double degrees) {return degrees * M_PI / 180;};
double RadiansToDegrees(double radians) {return radians * 180/M_PI;};


@implementation CLLocation (Bearing)

-(double) bearingToLocation:(CLLocation *) destinationLocation {

 double lat1 = DegreesToRadians(self.coordinate.latitude);
 double lon1 = DegreesToRadians(self.coordinate.longitude);

 double lat2 = DegreesToRadians(destinationLocation.coordinate.latitude);
 double lon2 = DegreesToRadians(destinationLocation.coordinate.longitude);

 double dLon = lon2 - lon1;

 double y = sin(dLon) * cos(lat2);
 double x = cos(lat1) * sin(lat2) - sin(lat1) * cos(lat2) * cos(dLon);
 double radiansBearing = atan2(y, x);

 return RadiansToDegrees(radiansBearing);
}
Run Code Online (Sandbox Code Playgroud)

Cla*_*och 25

你的代码对我来说似乎很好.该计算没有错.您没有指定结果的距离,但您可以尝试将您的弧度/度数转换器调整为:

double DegreesToRadians(double degrees) {return degrees * M_PI / 180.0;};
double RadiansToDegrees(double radians) {return radians * 180.0/M_PI;};
Run Code Online (Sandbox Code Playgroud)

如果要获得负轴承,请2*M_PI在radiansBearing中添加最终结果(如果在转换为度数后再添加360).atan2将范围内的结果返回-M_PIM_PI(-180到180度),因此您可能希望将其转换为指南针轴承,使用类似下面的代码

if(radiansBearing < 0.0)
    radiansBearing += 2*M_PI;
Run Code Online (Sandbox Code Playgroud)

  • 非常感谢!我应该给出一些预期的和实际的结果,但无论如何你都发现了这个问题.我只是没有处理负度和转换为罗盘度.将180指定为浮点数的好点.现在一切都很完美. (2认同)

Fab*_*cci 6

这是一个开头的Swift类别的移植:

import Foundation
import CoreLocation
public extension CLLocation{

    func DegreesToRadians(_ degrees: Double ) -> Double {
        return degrees * M_PI / 180
    }

    func RadiansToDegrees(_ radians: Double) -> Double {
        return radians * 180 / M_PI
    }


    func bearingToLocationRadian(_ destinationLocation:CLLocation) -> Double {

        let lat1 = DegreesToRadians(self.coordinate.latitude)
        let lon1 = DegreesToRadians(self.coordinate.longitude)

        let lat2 = DegreesToRadians(destinationLocation.coordinate.latitude);
        let lon2 = DegreesToRadians(destinationLocation.coordinate.longitude);

        let dLon = lon2 - lon1

        let y = sin(dLon) * cos(lat2);
        let x = cos(lat1) * sin(lat2) - sin(lat1) * cos(lat2) * cos(dLon);
        let radiansBearing = atan2(y, x)

        return radiansBearing
    }

    func bearingToLocationDegrees(destinationLocation:CLLocation) -> Double{
        return   RadiansToDegrees(bearingToLocationRadian(destinationLocation))
    }
}
Run Code Online (Sandbox Code Playgroud)