我有一些困难让这个工作。我尝试了很多不同的公式,总是得到相同的结果。 基于相同的数据(坐标),我可以计算距离。但不是轴承。 我没有想法和关键字来找到一个可行的公式。
谢谢大家的帮忙!
let fLat = d2r(degrees: lat)
let fLng = d2r(degrees: long)
let tLat = d2r(degrees: lat2)
let tLng = d2r(degrees: long2)
let a = CGFloat(sin(fLng - tLng) * cos(tLat))
let b = CGFloat(cos(fLat) * sin(tLat) - sin(fLat) * cos(tLat) * cos(fLng-tLng))
let bearing = atan2(a,b)
func d2r(degrees : Double) -> Double {
return degrees * Double.pi / 180.0
}
答案 0 :(得分:0)
鉴于评论中的示例,您似乎只是遇到了一个符号错误:
CYWG = N 49 54 6 W097 14 4,CYYQ = N58 44 4 W094 03 9,我应该有 标题为11度真。
let lat = 49.0 + 54.0 / 60.0 + 6.0 / 3600.0
let long = -(97.0 + 14.0 / 60.0 + 4.0 / 3600.0)
let lat2 = 58.0 + 44.0 / 60.0 + 4.0 / 3600.0
let long2 = -(94.0 + 3.0 / 60.0 + 9.0 / 3600.0)
let fLat = d2r(degrees: lat)
let fLng = d2r(degrees: long)
let tLat = d2r(degrees: lat2)
let tLng = d2r(degrees: long2)
let a = sin(fLng - tLng) * cos(tLat)
let b = cos(fLat) * sin(tLat) - sin(fLat) * cos(tLat) * cos(fLng - tLng)
let bearing = atan2(a,b)
bearing * 180.0 / Double.pi // -10.58473709161037
所以你的代码答案是〜-11。检查我自己的Vincenty's formula实现,我得到准确的方位角
let (d, az, raz) = vincentyInverse(p1, to: p2, ellipsoid: .wgs84)
az.toDegrees // 10.61078843895496
所以你的公式看起来好像是你从fLng中减去了tLng而不是反之亦然。在fLng - tLng
中使用tLng - fLng
取代#import <Foundation/Foundation.h>
@import AppKit;
int exists(NSURL *url) {
NSLog(@"path %@", url.path);
NSLog(@"ref %@", url.absoluteString);
NSError *error;
BOOL value = [url checkResourceIsReachableAndReturnError:&error];
if(error!=nil) {
NSLog(@"File not reachable: %@", error);
}
NSLog(@"exists == %@", value ? @"YES" : @"NO");
return value? 1: 0;
}
int main(int argc, const char * argv[]) {
@autoreleasepool {
NSString *path = @"./test.txt";
NSURL *pathUrl = [NSURL fileURLWithPath:path];
NSURL *refUrl = pathUrl.fileReferenceURL;
[[NSFileManager defaultManager] createFileAtPath:refUrl.path contents:nil attributes:nil];
exists(pathUrl); // yes
exists(refUrl); // yes
// this second call must update the file
[[NSFileManager defaultManager] createFileAtPath:refUrl.path contents:nil attributes:nil];
exists(pathUrl); // yes
exists(refUrl); // no. refUrl.path is nil, and the file cannot be reached
refUrl = pathUrl.fileReferenceURL;
exists(refUrl); // yes, since it's a new file reference
}
return 0;
}
可以得到10.58作为答案。
当然,如果你想要精确的轴承,你应该使用Vincenty或Robbins或其他考虑到地球非球形图形的公式 - 你使用的公式只在完美的球体上准确...
答案 1 :(得分:0)
非常感谢Grimxn。我非常喜欢这个。我也能回答我的上一个问题。
if bearing < 0 {
HeadingHolder = (bearing * 180.0 / Double.pi) + 360
}else{
HeadingHolder = (bearing * 180.0 / Double.pi)
}