Problème
Je voudrais savoir comment obtenir la distance et le relèvement entre 2 points GPS . J'ai fait des recherches sur la formule haversine. Quelqu'un m'a dit que je pouvais aussi trouver le roulement en utilisant les mêmes données.
Éditer
Tout fonctionne bien mais le roulement ne fonctionne pas encore tout à fait correctement. Le roulement est négatif mais doit être compris entre 0 et 360 degrés. Les données définies doivent faire le relèvement horizontal 96.02166666666666
et sont:
Start point: 53.32055555555556 , -1.7297222222222221
Bearing: 96.02166666666666
Distance: 2 km
Destination point: 53.31861111111111, -1.6997222222222223
Final bearing: 96.04555555555555
Voici mon nouveau code:
from math import *
Aaltitude = 2000
Oppsite = 20000
lat1 = 53.32055555555556
lat2 = 53.31861111111111
lon1 = -1.7297222222222221
lon2 = -1.6997222222222223
lon1, lat1, lon2, lat2 = map(radians, [lon1, lat1, lon2, lat2])
dlon = lon2 - lon1
dlat = lat2 - lat1
a = sin(dlat/2)**2 + cos(lat1) * cos(lat2) * sin(dlon/2)**2
c = 2 * atan2(sqrt(a), sqrt(1-a))
Base = 6371 * c
Bearing =atan2(cos(lat1)*sin(lat2)-sin(lat1)*cos(lat2)*cos(lon2-lon1), sin(lon2-lon1)*cos(lat2))
Bearing = degrees(Bearing)
print ""
print ""
print "--------------------"
print "Horizontal Distance:"
print Base
print "--------------------"
print "Bearing:"
print Bearing
print "--------------------"
Base2 = Base * 1000
distance = Base * 2 + Oppsite * 2 / 2
Caltitude = Oppsite - Aaltitude
a = Oppsite/Base
b = atan(a)
c = degrees(b)
distance = distance / 1000
print "The degree of vertical angle is:"
print c
print "--------------------"
print "The distance between the Balloon GPS and the Antenna GPS is:"
print distance
print "--------------------"
atan2(sqrt(a), sqrt(1-a))
est le même queasin(sqrt(a))
Réponses:
Voici une version Python:
la source
import math
vous devez spécifiermath.pi
,math.sin
etc. Avecfrom math import *
vous obtenez un accès direct à tout le contenu du module. Découvrez les «espaces de noms» dans un didacticiel python (comme docs.python.org/tutorial/modules.html )La plupart de ces réponses «arrondissent» le rayon de la terre. Si vous les comparez à d'autres calculateurs de distance (tels que la géopie), ces fonctions seront désactivées.
Cela fonctionne bien:
la source
Il existe également une implémentation vectorisée , qui permet d'utiliser 4 tableaux numpy au lieu de valeurs scalaires pour les coordonnées:
la source
Le calcul du relèvement est incorrect, vous devez permuter les entrées vers atan2.
Cela vous donnera le bon roulement.
la source
haversine formula
la première fois que j'entends cela, merci.Vous pouvez essayer ce qui suit:
la source
Voici une implémentation vectorisée numpy de la formule Haversine donnée par @Michael Dunn, qui donne une amélioration de 10 à 50 fois par rapport aux grands vecteurs.
la source
Vous pouvez résoudre le problème du roulement négatif en ajoutant 360 °. Malheureusement, cela peut entraîner des roulements supérieurs à 360 ° pour les roulements positifs. C'est un bon candidat pour l'opérateur modulo, donc dans l'ensemble, vous devez ajouter la ligne
à la fin de votre méthode.
la source
Le Y dans atan2 est, par défaut, le premier paramètre. Voici la documentation . Vous devrez changer vos entrées pour obtenir le bon angle de relèvement.
la source
Reportez-vous à ce lien: /gis/84885/whats-the-difference-between-vincenty-and-great-circle-distance-calculations
cela donne en fait deux façons d'obtenir la distance. Ce sont Haversine et Vincentys. De mes recherches, j'ai appris que Vincentys est relativement précis. Utilisez également l'instruction import pour effectuer l'implémentation.
la source
Voici deux fonctions pour calculer la distance et le relèvement, qui sont basées sur le code des messages précédents et https://gist.github.com/jeromer/2005586 (type de tuple ajouté pour les points géographiques au format lat, lon pour les deux fonctions pour plus de clarté ). J'ai testé les deux fonctions et elles semblent bien fonctionner.
la source