我正在尝试为 CLLocation 编写一个类别,以将方位返回到另一个 CLLocation。
我相信我的公式做错了(微积分不是我的强项)。返回的轴承始终处于关闭状态。
我一直在研究这个问题并尝试应用被接受为正确答案的更改及其引用的网页:
计算两个 CLLocationCooperative2D 之间的方位角
http://www.movable-type.co.uk/scripts/latlong.html
感谢您的指点。我已经尝试合并其他问题的反馈,但我仍然没有得到任何东西。
Thanks
这是我的类别 -
----- CLLocation+Bearing.h
#import <Foundation/Foundation.h>
#import <CoreLocation/CoreLocation.h>
@interface CLLocation (Bearing)
-(double) bearingToLocation:(CLLocation *) destinationLocation;
-(NSString *) compassOrdinalToLocation:(CLLocation *) nwEndPoint;
@end
---------CL位置+方位.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);
}
你的代码对我来说似乎很好。算计并没有什么错。您没有指定结果有多远,但您可以尝试将弧度/度转换器调整为:
double DegreesToRadians(double degrees) {return degrees * M_PI / 180.0;};
double RadiansToDegrees(double radians) {return radians * 180.0/M_PI;};
如果您得到负轴承,请添加2*M_PI
以弧度为单位的最终结果(如果在转换为度数后执行此操作,则为 360)。 atan2 返回范围内的结果-M_PI
to M_PI
(-180 到 180 度),因此您可能需要使用类似以下代码的内容将其转换为罗盘方位
if(radiansBearing < 0.0)
radiansBearing += 2*M_PI;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)