从DMS计算轴承

时间:2018-03-02 21:16:16

标签: swift coordinates

我有一些困难让这个工作。我尝试了很多不同的公式,总是得到相同的结果。 基于相同的数据(坐标),我可以计算距离。但不是轴承。 我没有想法和关键字来找到一个可行的公式。

谢谢大家的帮忙!

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
}

2 个答案:

答案 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)
    }