计算方位的差异



我正试图计算正北(38.16418244422394, -38.933453981070926)的海洋(lat, long)点之间的方位

我阅读了这篇文章和这篇文章,看到了许多不同的建议。

使用geographiclib,我得到了一个值-38.806138500542176。然而手动计算,我得到了297.9944573116836。为什么我得到两个不同的答案?哪一个是正确的?

最小示例:

import math
from geographiclib.geodesic import Geodesic
def get_bearing(lat1,lon1,lat2,lon2):
dLon = lon2 - lon1
y = math.sin(dLon) * math.cos(lat2)
x = math.cos(lat1)*math.sin(lat2) - math.sin(lat1)*math.cos(lat2)*math.cos(dLon)
brng = np.rad2deg(math.atan2(y, x))
if brng < 0: brng+= 360
return brng
def get_bearing_geodesic(lat1, lon1, lat2, lon2):
Geodesic.WGS84.Inverse(lat1, lon1, lat2, lon2)
return Geodesic.WGS84.Inverse(lat1, lon1, lat2, lon2)['azi1']
true_north_lat = 0
true_north_lon = 0
oil_rig_lat = 38.16418244422394
oil_rig_lon = -38.933453981070926
print("Manually: {}".format(get_bearing(true_north_lat, true_north_lon, oil_rig_lat, oil_rig_lon)))
print("Geodesic: {}".format(get_bearing_geodesic(true_north_lat, true_north_lon, oil_rig_lat, oil_rig_lon)))

哪个是正确答案?为什么它们不同?哪个答案产生了从正北到石油钻井平台的角度(以度为单位(?

math.sinmath.cos以弧度为自变量。将手动功能更改为(最后返回度数(:

def get_bearing(lat1,lon1,lat2,lon2):
dLon = lon2 - lon1
y = math.cos(math.radians(lat1)) * math.sin(math.radians(lat2)) - math.sin(math.radians(lat1)) * math.cos(math.radians(lat2)) * math.cos(math.radians(dLon))
x = math.cos(math.radians(lat2)) * math.sin(math.radians(dLon))
brng = math.degrees(math.atan2(x, y))
if brng < 0: brng+= 360
return brng
>>> get_bearing(true_north_lat, true_north_lon, oil_rig_lat, oil_rig_lon)
321.3540270387211

最新更新