Python:计算两个纬度/经度之间的方位角

新手上路,请多包涵

我正在尝试计算两个纬度/经度之间的方位。

我对函数/公式本身没有疑问,

假如:

 def get_bearing(lat1, long1, lat2, long2):
    dLon = (long2 - long1)

    y = math.sin(dLon) * math.cos(lat2)
    x = math.cos(lat1) * math.sin(lat2) - math.sin(lat1) * math.cos(lat2) * math.cos(dLon)

    brng = math.atan2(y, x)

    brng = np.rad2deg(brng)

    return brng

问题是结果不是预期的。

该函数的预期用途返回(非常长的)列表中两个纬度/经度对之间的方位,即

    lat1 = path[int(len(path) * location / 1000)][0]
    lat2 = path[int(len(path) * location / 1000) + 1][0]
    lng1 = path[int(len(path) * location / 1000)][1]
    lng2 = path[int(len(path) * location / 1000) + 1][1]

然后,方位角结果会改变绘图的视图方向,其中方位角可以采用 [-180, 180] 范围内的值。理想情况下,结果将显示为 lat1、lng1 和 lat2、lng2 之间形成的线在图中完全“垂直”(lat/lon 注释在图中切换), 见下文

在此处输入图像描述

在此处输入图像描述

我希望有人能够从函数返回的轴承中推断出问题以及预期的轴承应该是什么。下面举几个例子:

 Current Location: 30.07134 -97.23076
Next in path: 30.0709 -97.22907
Calculated Bearing: 88.39967863143139
Expected Bearing: ~-70.67

Current Location: 29.91581 -96.85068
Next in path: 29.91556 -96.85021
Calculated Bearing: 118.9170342272798
Expected Bearing: ~122.67

Current Location: 29.69419 -96.53487
Next in path: 29.69432 -96.53466
Calculated Bearing 141.0271357781952
Expected Bearing: ~56

Current Location: 29.77357 -96.07924
Next in path: 29.77349 -96.07876
Calculated Bearing 165.24612555483893
Expected Bearing: ~104

很高兴提供更多信息,在此先感谢您提供的任何/所有帮助。

原文由 Sterling Butters 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.4k
2 个回答

最终改变了功能:

 from geographiclib.geodesic import Geodesic
...
def get_bearing(lat1, lat2, long1, long2):
    brng = Geodesic.WGS84.Inverse(lat1, long1, lat2, long2)['azi1']
    return brng

原文由 Sterling Butters 发布,翻译遵循 CC BY-SA 4.0 许可协议

您是否考虑过使用 pyproj 进行计算而不是自己滚动?:

 import pyproj
geodesic = pyproj.Geod(ellps='WGS84')
fwd_azimuth,back_azimuth,distance = geodesic.inv(long1, lat1, long2, lat2)

在此示例中, fwd_azimuth 是您之后的方向, back_azimuth 是反向方向(相反方向)。

我在这里使用了 WGS84,所以您需要用正确的坐标系替换,并且需要重写以确保纬度/经度是 geodesic.inv() 的正确坐标类型。但是使用经过良好测试的现有地理空间库可能会为您省去很多麻烦。

原文由 J. Taylor 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题