web-dev-qa-db-fra.com

Python: calculer le roulement entre deux lat / longs

Je tente de calculer le roulement entre deux lat/longs.

Je n'ai pas de question concernant la fonction/la formule en soi,

fourni:

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

le problème est que le résultat n'est pas ce qui est attendu.

L'utilisation prévue de la fonction renvoie le roulement entre deux paires de lat/longues dans une liste (très longue) à I.e.

    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]

Le résultat du roulement modifie ensuite l'orientation de la vue de la parcelle où la roulement peut assumer une valeur dans la plage [-180, 180]. Idéalement, le résultat apparaîtrait de telle sorte que la ligne formée entre Lat1, LNG1 et Lat2, LNG2 soit parfaitement "verticale" dans la parcelle (les annotations LAT/LON sont activées dans une parcelle), voir ci-dessous

enter image description here

enter image description here

J'espère que quelqu'un pourrait être capable de déduire le problème de la roulement renvoyé de la fonction et de ce que devrait être le roulement attendu. Quelques instances ci-dessous:

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

Heureux de fournir des informations supplémentaires, merci d'avance pour toute aide.

6
Sterling Butters

Vous pouvez essayer ce nouveau package appelé Turfpy qui est un portage de 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/

1
Omkar Mestry

Le code de recherche du roulement est bien. Mais vous devez juste ajouter des maths.Dradians lors de la recherche de X et Y.

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
0
aliff danial