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

时间:2019-02-25 20:07:57

标签: python function latitude-longitude plotly-dash

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

我对功能/公式本身没有疑问,

提供:

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之间形成的线在图中完全“垂直”(在图中切换了经纬度注释),请参见下文

http://localhost/project_exhibition/admin.php

enter image description here

我希望有人可以从函数返回的方位以及预期方位应该是什么来推断问题。以下是一些实例:

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

很高兴提供其他信息,在此先感谢您提供的所有帮助。

5 个答案:

答案 0 :(得分:2)

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

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

在此示例中,fwd_azimuth是您所追求的方位,而back_azimuth是反向方位(朝相反的方向)。

我在这里使用了WGS84,因此您需要替换为正确的坐标系,并且需要重写以确保经纬度是geodesic.inv()的正确坐标类型。但是,使用经过充分测试的现有地理空间库可能会节省大量时间。

答案 1 :(得分:0)

最终更改了功能:

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

答案 2 :(得分:0)

对于上述J. Taylor和Ethan的回答,我没有足够的声誉积分进行评论,但是我发现他们的解决方案使lat / lng绕错了方向。

我的工作解决方案使用:

geodesic = pyproj.Geod(ellps='WGS84')
lat1,lng1 = 51.508039, -0.128069 # Trafalgar Square
lat2,lng2 = 55.9411289, -3.3454205 # Edinburgh
fwd_azimuth,back_azimuth,distance = geodesic.inv(lng1, lat1, lng2, lat2)

fwd_azimuth = -22.00度

答案 3 :(得分:0)

您可以尝试这个名为Turfpy的新程序包,它是turf.js在python中的移植。

from turfpy import measurement
from geojson import Point, Feature
start = Feature(geometry=Point((-75.343, 39.984)))
end = Feature(geometry=Point((-75.534, 39.123)))
measurement.bearing(start,end)

https://pypi.org/project/turfpy/

答案 4 :(得分:0)

找到轴承的代码很好。但是,只需在查找X和Y时添加math.radians。

def get_bearing(lat1, long1, lat2, long2):
    dLon = (long2 - long1)
    x = math.cos(math.radians(lat2)) * math.sin(math.radians(dLon))
    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))
    brng = arctan2(x,y)
    brng = degrees(brng)

    return brng