2017-04-10 3 views
4

Je ne sais pas ce que le diable est mal à cela, mais je ne peux pas le comprendre du tout ...Python - Obtenez la distance totale de Longtitude GPS et latitude

J'ai donc ce code:

from model.Formulas import Formulas 

f = open("coords_data.txt", "r") 
line1 = f.readline() 
line2 = f.readline() 

orig = line1.split(';') 
dest = line2.split(';') 

origin = (orig[0] + ", " + orig[1].strip("\n")) 
destination = (dest[0] + ", " + dest[1].strip("\n")) 

print("Orig: " + str(origin)) 
print("Dest: " + str(destination)) 

total_dist = Formulas.calculateDistance(str(origin), str(destination)) 

# Formulas.calculateDistance() 

Et puis le code d'importation est la suivante:

import math 

class Formulas: 
    # 3959 # radius of the great circle in miles...some algorithms use 3956 
    # 6371 # radius in kilometers...some algorithms use 6367 
    # 3959 * 5280 # radius in feet 
    # 6371 * 1000 # radius in meters 
    @staticmethod 
    def calculateDistance(origin, destination, rounding=0): 
     lat1, lon1 = origin 
     lat2, lon2 = destination 
     radius = 6371 # km 

     dlat = math.radians(lat2 - lat1) 
     dlon = math.radians(lon2 - lon1) 
     a = math.sin(dlat/2) * math.sin(dlat/2) + math.cos(math.radians(lat1)) * math.cos(math.radians(lat2)) * math.sin(dlon/2) * math.sin(dlon/2) 
     c = 2 * math.atan2(math.sqrt(a), math.sqrt(1 - a)) 
     d = radius * c 
     return round(d, rounding) 

alors maintenant, je veux obtenir à partir d'une grande liste (5057 lignes) de coordonnées pour avoir la distance totale exacte. Il faut donc compter toutes les différences entre les distances et renvoyer un grand nombre (par exemple 150 km).

L'erreur que je reçois est:

ValueError: too many values to unpack (expected 2)

Les coordonnées du fichier ressemble à ceci:

5114.8268;00457.9847 
5114.8271;00457.9845 
5114.8271;00457.9845 
5114.8271;00457.9845 
5114.8270;00457.9846 
5114.8271;00457.9846 
5114.8272;00457.9847 
5114.8272;00457.9847 
5114.8274;00457.9843 
5114.8272;00457.9846 
5114.8274;00457.9843 
5114.8277;00457.9837 
5114.8287;00457.9835 
5114.8274;00457.9843 
5114.8288;00457.9831 
5114.8287;00457.9835 
5114.8286;00457.9813 
5114.8274;00457.9843 
5114.8287;00457.9815 
5114.8286;00457.9813 
5114.8270;00457.9846 
5114.8286;00457.9813 
5114.8355;00457.9784 
5114.8292;00457.9814 
5114.8274;00457.9843 
5114.8376;00457.9776 
5114.8395;00457.9769 

Il est maintenant dans un fichier, mais ces données seront stockées dans une base de données.

Comment puis-je résoudre ce problème? Et comment devrais-je me débarrasser de l'erreur?

+0

Quelle erreur? pourriez-vous donner quelques exemples simples d'intrants/extrants par rapport aux extrants attendus. – Scheme

+0

Mis à jour. Désolé, j'ai oublié de placer l'erreur. – Robin

Répondre

3

Formulas.calculateDistance() attend tuples des flotteurs:

Essayez ceci:

line1 = "5114.8268;00457.9847" 
line2 = "5114.8271;00457.9845" 

def strip_line(line_str): 
    x, y = line_str.split(';') 
    return float(x), float(y.strip()) 

total_dist = Formulas.calculateDistance(
    strip_line(line1), strip_line(line2)) 

La fonction strip_line() utilise la même logique de base que vous utilisez, mais enveloppe la place logique dans une fonction, et surtout , garde les valeurs comme des flottants.

+0

a répondu il y a 24 sec. Merde, mon éditeur a été lent à démarrer. – Scheme

+0

Okej, Alors ça marche, mais comment puis-je boucler toutes les valeurs? Donc cela fonctionnera toujours et me donnera la bonne distance? – Robin