Suite

Calculer la distance entre les points de latitude et de longitude en utilisant python


J'ai une base de données de 2000 points, qui est au format CSV contenant la latitude et la longitude. Je veux trouver la distance entre tous ces points, puis afficher ces points sur une carte en utilisant pyQGIS; J'ai vu un exemple utilisant Fiona mais je veux le faire dans pyQGIS.

J'ai utilisé le code suivant :

def offset(iterable): prev = None for elem in iterable: yield prev, elem prev = elem import csv import math def haversine(lon1, lat1, lon2, lat2): """ Calcule la distance orthodromique entre deux points sur le terre (spécifiée en degrés décimaux). Source : http://gis.stackexchange.com/a/56589/15183 """ # convertir les degrés décimaux en radians lon1, lat1, lon2, lat2 = map(math.radians, [lon1 , lat1, lon2, lat2]) # formule haversine dlon = lon2 - lon1 dlat = lat2 - lat1 a = math.sin(dlat/2)**2 + math.cos(lat1) * math.cos(lat2) * math .sin(dlon/2)**2 c = 2 * math.asin(math.sqrt(a)) km = 6367 * c renvoie km avec open('1.csv', 'rb') comme f1: reader1 = csv.reader(f1) header1 = reader1.next() avec open('2.csv', 'rb') comme f2 : reader2 = csv.reader(f2) header2 = reader2.next() pour row1 dans offset(header1 ): pour row2 dans offset(header2): floats1 = map(float, row1[1:]) floats2 = map(float, row2[1:]) print(floats1) print(floats2) print haversine(floats1[1], flotteurs1[0], flotteurs2[1], flotteurs2[0])

Affichage de l'erreur :

Traceback (appel le plus récent en dernier) : Fichier "", ligne 13, dans  IndexError : index de la liste hors limites

Mon fichier .csv contient les données suivantes avec environ 2000 points de données :

ID LAT LONG 1 12.953578 77.592453 2 12.953511 77.592445 3 12.953145 77.593147 4 12.951835 77.594612

pseudocode pour votre problème serait:

pour point1 en csv : pour point2 en csv : distance = haversine(point1, point2)

où haversine est défini comme (de par exemple /a/56589/15183) :

def haversine(lon1, lat1, lon2, lat2) : """ Calcule la distance orthodromique entre deux points sur la terre (spécifiée en degrés décimaux). Source : /a/56589/15183 """ # convertit les degrés décimaux en radians lon1, lat1, lon2, lat2 = map(math.radians, [lon1, lat1, lon2, lat2]) # formule haversine dlon = lon2 - lon1 dlat = lat2 - lat1 a = math.sin(dlat/2)**2 + math.cos(lat1) * math.cos(lat2) * math.sin(dlon/2)**2 c = 2 * math.asin(math.sqrt(a)) km = 6367 * c aller-retour km

… donc le code complet serait :

import csv import math def haversine(lon1, lat1, lon2, lat2) : """ Calcule la distance orthodromique entre deux points sur la terre (spécifiée en degrés décimaux). Source : /a/56589/15183 """ # convertir degrés décimaux en radians lon1, lat1, lon2, lat2 = map(math.radians, [lon1, lat1, lon2, lat2]) # formule haversine dlon = lon2 - lon1 dlat = lat2 - lat1 a = math.sin(dlat/2 )**2 + math.cos(lat1) * math.cos(lat2) * math.sin(dlon/2)**2 c = 2 * math.asin(math.sqrt(a)) km = 6367 * c renvoie km avec open('1.csv', 'rb') comme f1: reader1 = csv.reader(f1, delimiter=";", quoting=csv.QUOTE_NONE) header1 = reader1.next() avec open('2 .csv', 'rb') en tant que f2 : reader2 = csv.reader(f2, delimiter=";", quoting=csv.QUOTE_NONE) header2 = reader2.next() pour la ligne1 dans le lecteur1 : pour la ligne2 dans le lecteur2 : floats1 = map(float, row1[1:]) floats2 = map(float, row2[1:]) print(floats1) print(floats2) print haversine(floats1[1],floats1[0],floats2[1],floats2[ 0])

avec les deux fichiers 1.csv :

nom;lat;lon NYC;40.58;-74.03

et 2.csv :

nom;lat;lon Le Cap;-33.90;18.46

… le résultat vérifié par rapport à http://www.movable-type.co.uk/scripts/latlong.html semble correct.


Calculer la distance entre les points de latitude et de longitude en utilisant python - Systèmes d'Information Géographique

Compte tenu de la latitude et de la longitude en degrés, trouvez la distance entre deux points sur la terre.

Source de l'image : Wikipédia
Exemples:

Le problème peut être résolu en utilisant la formule Haversine :

La distance orthodromique ou la orthodromique La distance est la distance la plus courte entre deux points sur une sphère (ou la surface de la Terre). Pour utiliser cette méthode, nous devons avoir les coordonnées du point A et du point B. La méthode des grands cercles est préférée aux autres méthodes.
Tout d'abord, convertissez les valeurs de latitude et de longitude des degrés décimaux en radians. Pour cela, divisez les valeurs de longitude et de latitude des deux points par 180/pi. La valeur de pi est 22/7. La valeur de 180/pi est d'environ 57,29577951. Si nous voulons calculer la distance entre deux endroits en miles, utilisez la valeur 3 963, qui est le rayon de la Terre. Si nous voulons calculer la distance entre deux endroits en kilomètres, utilisez la valeur 6, 378,8, qui est le rayon de la Terre.

Trouvez la valeur de la latitude en radians :
Valeur de la latitude en radians, lat = Latitude / (180/pi) OU
Valeur de la latitude en radians, lat = Latitude / 57,29577951
Trouvez la valeur de la longitude en radians :
Valeur de la longitude en radians, long = Longitude / (180/pi) OU
Valeur de la longitude en radians, long = Longitude / 57,29577951

Obtenez les coordonnées du point A en termes de latitude et de longitude. Utilisez la méthode de conversion ci-dessus pour convertir les valeurs de latitude et de longitude en radians. Je l'appellerai lat1 et long1. Faites de même pour les coordonnées du point B et obtenez lat2 et long2.
Maintenant, pour obtenir la distance entre le point A et le point B, utilisez la formule suivante :

Distance, d = 3963,0 * arccos[(sin(lat1) * sin(lat2)) + cos(lat1) * cos(lat2) * cos(long2 – long1)]

La distance obtenue, d, est en miles. Si vous voulez que votre valeur soit en unités de kilomètres, multipliez d par 1,609344.
d en kilomètres = 1,609344 * d en miles
Ainsi, vous pouvez avoir la distance la plus courte entre deux endroits sur Terre en utilisant l'approche de la distance orthodromique.


4 réponses 4

Vous avez 4 ou 5 ou 6 problèmes :

(1) end_lat = math.radians(end_long) devrait être end_lat = math.radians(end_lat)

(2) il vous manque des choses comme quelqu'un l'a déjà mentionné, très probablement parce que

(3) votre code est illisible (ligne beaucoup trop longue, parenthèses redondantes, 17 instances inutiles de "math.")

(4) vous n'avez pas remarqué la remarque dans l'article Wikipedia sur l'utilisation d'atan2()

(5) Vous avez peut-être échangé la latitude et la longitude lors de la saisie de vos coordonnées

(6) delta(latitude) est calculé inutilement il n'apparaît pas dans la formule


PL-SQL – Calcul de la distance entre deux points géographiques (basé sur les coordonnées)

Ceci est la première contribution de ce blog à la communauté PL-SQL, en fait c'est un hommage à mon grand ami Itagyba Abondanza Kuhlman, auteur de ce code source, veuillez visiter son blog à http://blog.iak.com.br/

Il y a beaucoup de curiosités sur Oracle Database World, sa spécialité. Il fait partie de ces personnes qui sont venues sur cette planète avec la mission d'aider l'humanité à évoluer, de développer la pensée critique, l'amitié, de penser à des choses jamais pensées auparavant, laissant partout où il va une traînée de bons sentiments. Merci Gyba.

Le but de ce code est de calculer la distance (en Kilomètres) entre deux points géographiques en utilisant les mathématiques, en particulier la trigonométrie.

Partagez ceci :

Comme ça:


Formule Haversine :

L'angle au centre Haversine peut être calculé, entre deux points avec r comme rayon de la terre, comme la distance entre deux points, est latitude de deux points et est longitude de deux points respectivement, comme :

Loi de Haversine :

Pour dériver la loi de Haversine, il faut commencer le calcul avec la loi sphérique du cosinus, c'est-à-dire cos a = cos b * cos c + sin b * sin c * cos A

On peut dériver la formule de Haversine pour calculer la distance entre deux comme :

a = sin²(ΔlatDifference/2) + cos(lat1).cos(lt2).sin²(ΔlonDifference/2)
c = 2.atan2(√a, √(1−a))
d = R.c

latDifférence = lat1 – lat2 (différence de latitude)

lonDifférence = lon1 – lon2 (différence de longitude)

R est le rayon de la terre, c'est-à-dire 6371 KM ou 3961 milles

et est la distance calculée entre deux points.

Voici l'exemple de résultat fourni par Haversine Formula :

Prenons une latitude-longitude pour la distance de calcul,
NEBRASKA, États-Unis (Latitude : 41.507483, longitude : -99.436554) et
KANSAS, États-Unis (Latitude : 38.504048, Longitude : -98.315949)

Calculez la distance avec la formule écrite ci-dessus. Votre réponse serait 347,3 km (kilomètre). L'instantané montre le même résultat avec la carte ci-dessous.

  • Vous pouvez également trouver l'outil pour calculer la distance entre deux points sur terre et l'afficher sur la carte Google.
  • Consultez également le didacticiel pour savoir comment créer votre propre carte Google de personnalisation.
  • Vous pouvez également vérifier le code JavaScript pour la formule Haversine.

Si vous rencontrez des problèmes dans la compréhension de la formule Haversine ou si vous obtenez une erreur dans le résultat commentez ci-dessous. De plus, si vous avez des informations plus pertinentes à ce sujet, partagez-les avec nous en écrivant ci-dessous.


Calculer la distance entre les points GPS en Python

Lorsque vous travaillez avec le GPS, il est parfois utile de calculer les distances entre les points. Mais la simple distance euclidienne ne le coupe pas puisque nous avons affaire à une sphère, ou à un sphéroïde aplati pour être exact. Nous devons donc examiner les distances géodésiques.

Il existe différentes manières de traiter ce problème de calcul. Par exemple, il y a la distance du grand cercle, qui est la distance la plus courte entre deux points à la surface d'une sphère. Une autre façon similaire de mesurer les distances consiste à utiliser la formule Haversine, qui prend l'équation

commencer a = hav(Deltavarphi) + cos(varphi_1) cdot cos(varphi_2) cdot hav(Deltalambda) end

et prend ceci pour calculer la distance géodésique

où la latitude est (varphi), la longitude est notée (lambda) et (R) correspond au rayon moyen de la Terre en kilomètres ( 6371 ). Nous pouvons prendre cette formule maintenant et la traduire en Python

Il est important de noter que nous devons prendre les radians des valeurs de longitude et de latitude. Nous pouvons utiliser cette fonction maintenant et appliquer des distances à différentes villes. Disons que nous voulons calculer les distances de Londres à d'autres villes.

Cela nous donne déjà un résultat apparemment précis, mais comparons-le à une autre méthode.

Vous pouvez également utiliser geopy pour mesurer des distances. Ce package a de nombreuses méthodes différentes pour calculer les distances, mais il utilise les formules de Vincenty par défaut, ce qui est un moyen plus exact de calculer les distances sur terre car il prend en compte le fait que la terre est, comme mentionné précédemment, un sphéroïde aplati. Les formules de Vincenty sont bien décrites dans cet article.

Comme vous pouvez le voir, il y a une différence entre les valeurs, d'autant plus que nous travaillons avec de très grandes distances, ce qui renforce la distorsion de notre Terre en forme de sphéroïde.

Il existe également le package Python pyproj, qui offre des interfaces Python à PROJ.4. C'est un excellent package pour travailler avec des projections cartographiques, mais vous y trouverez également la classe Geod qui propose divers calculs géodésiques. Pour calculer la distance entre deux points, nous utilisons la fonction inv, qui calcule une transformation inverse et renvoie les azimuts et la distance avant et arrière.

Sur une note géographique, l'azimut avant est la direction qui est définie comme un angle horizontal mesuré dans le sens des aiguilles d'une montre à partir d'une ligne de base nord et un azimut arrière est la direction opposée à l'azimut avant. Vous pouvez utiliser ces informations par exemple pour naviguer sur l'océan si c'est ce que vous avez l'intention de faire.


Merci pour le super site.
Quelle erreur est générée dans le calcul du relèvement en raison de l'utilisation d'un rayon moyen de la Terre ? Pour des coordonnées séparées de 500 miles au maximum, la formule Haversine est-elle la meilleure ?
Merci,
Gary

Un câble sous-marin sera prolongé entre deux villes I et J situées des deux côtés d'une mer et ayant les coordonnées géodésiques suivantes : I (34°55´N, 56°10´E) J (33°56´N, 130 °48´E) R = 3671 km.
i) La longueur minimale du câble en kilomètres. 5
ii) La direction ou l'azimut qui doit être prolongé de ce câble à partir du point I.


Voir la vidéo: Calcul de longueurs sur la Terre, latitude et longitude. enseignement scientifique (Octobre 2021).