Suite

Utilisation de Python pour calculer la distance entre les coordonnées (lat/long) à l'aide de la formule haversine et imprimer les résultats dans .csv

Utilisation de Python pour calculer la distance entre les coordonnées (lat/long) à l'aide de la formule haversine et imprimer les résultats dans .csv


J'ai un fichier .csv avec 3 colonnes. La première colonne est intitulée Distance et elle est vide. Les deuxième et troisième colonnes sont intitulées Longitude et Latitude qui contiennent des coordonnées, par exemple :

Distance,Longitude,Latitude

,-77.60483,40.31117

,-77.58167,40.3045

,-77.52883,40.24917

,-77.508,40.14917

,-77.49617,40.13117

J'ai écrit un script qui calcule la distance entre les deux points en utilisant la formule haversine (voir ci-dessous), mais je dois entrer manuellement les coordonnées, ce qui n'est pas souhaitable :

import math lat1 = 40.31117 long1 = -77.60483 lat2 = 40.3045 long2 = -77.58167 def distance_on_unit_sphere(lat1, long1, lat2, long2): # Convertit lat & long en coordonnées sphériques en radians. degrés_en_radians = math.pi/180.0 # phi = 90 - latitude phi1 = (90.0 - lat1)*degrees_to_radians phi2 = (90.0 - lat2)*degrees_to_radians # theta = longitude theta1 = long1*degrees_to_radians theta2 = long2*degrees_to_radians # Calculer la distance sphérique à partir de coordonnées sphériques. # Pour deux emplacements en coordonnées sphériques : # (1, theta, phi) et (1, theta', phi')cosinus( arc length ) = # sin phi sin phi' cos(theta-theta') + cos phi cos phi ' distance = rho * longueur de l'arc cos = (math.sin(phi1)*math.sin(phi2)*math.cos(theta1 - theta2) + math.cos(phi1)*math.cos(phi2)) arc = math .acos(cos)*6371 #rayon de la terre en km retour arc print distance_on_unit_sphere(lat1,long1,lat2,long2)

Mon objectif est de remplir la colonne de distance vide à l'aide de Python en calculant la distance entre le 1er emplacement (-77.60483,40.31117) et le 2ème emplacement (-77.58167,40.3045), puis d'imprimer cette valeur dans la colonne Distance, puis de calculer la distance entre le 2ème (-77,58167,40,3045) et le 3ème point (-77,52883,40.24917), puis imprimez cette valeur en dessous de la valeur précédemment calculée dans la colonne Distance et ainsi de suite pour les coordonnées suivantes. J'ai besoin d'aide ou d'un exemple pour saisir le fichier .csv, exécuter la formule haversine, puis écrire le résultat à l'emplacement approprié dans un fichier .csv de sortie.


Si j'ai bien compris, ce code devrait faire ce que vous recherchez. Utilisation de votre entrée

Distance, Longitude, Latitude ,-77.60483,40.31117 ,-77.58167,40.3045 ,-77.52883.40.24917 ,-77.508,40.14917 ,-77.49617,40.13117

Je produis cette sortie. J'ai supposé que vous vouliez que les distances avancent - c'est-à-dire que la ligne 2 a sa distance définie sur la distance jusqu'au point suivant (ligne 3). La dernière ligne est définie sur 0 car il n'y a pas de ligne suivante à mesurer.

Distance,Longitude,Latitude 2.0992,-77.6048,40.3112 7.6122,-77.5817,40.3045 11.2593,-77.5288,40.2492 2.2399,-77.5080,40.1492 0.0000,-77.4962,40.1312

Conservez votre code existant et ajoutez cet extrait. La bibliothèque csv permet de travailler facilement et facilement avec des fichiers CSV.

J'utilise aussi un deque. Il s'agit d'une structure de données FIFO (premier entré, premier sorti). Je l'utilise pour garder une file d'attente de points. Une fois que cela a deux entrées, je calcule la distance entre les deux points, je l'écris, puis je supprime le point le plus ancien.

import csv import collections filein = open("test.csv","rU") # mode universel de nouvelle ligne fileout = open("output.csv","w") fileout.write("Distance,Longitude,Latitude
") csvrdr = csv.reader(filein, delimiter=",") linecount = 0 # utilise un deque. une fois que cela atteint 2 entrées, calculez la distance # puis supprimez l'entrée la plus ancienne todo = collections.deque() pour la ligne dans csvrdr : if linecount > 0 : # skip header _, longitude, latitude = line # _ signifie ignorer longitude = float (longitude) latitude = float(latitude) todo.append((longitude, latitude)) if len(todo)==2 : # a obtenu deux points, calcule la distance et supprime le plus ancien oldlon, oldlat = todo.popleft() distance = distance_on_unit_sphere(latitude, longitude, oldlat, oldlon) fileout.write("%2.4f,%2.4f,%2.4f
" % (distance, oldlon, oldlat)) linecount += 1 # a obtenu une entrée dans deque, spit cela avec 0 assert(len(todo)==1) oldlon, oldlat = todo.popleft() fileout.write("%2.4f,%2.4f,%2.4f
" % (0.0, oldlon, oldlat) ) fileout.close() filein.close()

Voir la vidéo: Programmeerimine täiesti algajatele: muutuja kasutamine