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
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.
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)
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