#Entfernungen berechnen
#Python 2.7
#Author Gunnar Egenolff
#letzte Bearbeitung 16.5.19
import re
import math as m
debug = 0
#2x fuer Start und Ziel

    #Eingabe Ort
x1 = []
x2 = []

def EINGABE(SZ, x):
    
    eingabe = raw_input(SZ)
    s = list(eingabe)
    
    if debug == 1: print "Eingabe als Liste: ", (s)
    laenge = len(s)
    if debug == 1: print "Anzahl der Listenelemente / Laenge der Eingabe: ", (laenge)

    #Umwandlung Ortsname in Suchbegriff mit Toleranz

    
    i = 0
    while i <= laenge - 1: #legt Liste mit regulaeren Ausdruecken an
        if debug == 1: print "Position des ersetzten Buchstaben: ", s[i]
        t = s[:] #Originalliste soll erhalten bleiben, gearbeitet wird mit modifizierter Liste
        t.insert(i,".?.?") #je ein Buchstabe wird durch Punkt ersetzt
        del t[i+1]
        mod = "".join(t)
        x.append("\t" + mod + "\s") #stellt sicher, dass Name nicht Teil eines laengeren Namens
        if debug == 1: print "geaenderte Liste: ", t
        if debug == 1: print "originale Liste: ", s
        if debug == 1: print "Liste der Suchbegriffe: ", x
    
        i = i + 1
   
    #zeilenweises Auslesen der Ortedatei, Abgleich mit Suchbegriff

    linenr = 0
    j = 0
    k = 1
    brt = []
    lag = []
    ort = []
    schonmalgesehen = []
    while j <= len(x) - 1: #fragt nacheinander alle Versionen des Ortsnamens ab
        linenr = 0
        input = open("DE.tab")
        Suchbegriff = str(x[j])
        while True: # liest Datenbank zeilenweise aus
            line = input.readline()
            if not line: break
            linenr += 1
            if re.search(Suchbegriff, line) and not linenr in schonmalgesehen: #findet Ortsname
                Liste = line.split("\t")
                print k, Liste[7], Liste[3], Liste[4], Liste[5] #Ausgabe Plz, Ortsname, Breite, Laenge
                ort.append(Liste[3])
                brt.append(Liste[4])
                lag.append(Liste[5])
                k += 1
                schonmalgesehen.append(linenr)
                if debug == 2: print schonmalgesehen
                if debug == 2: print lon, lat
        if debug == 1: print "Suchbegriff: ", str(x[j])
        j+=1
        line = True

    #Aufforderung zur Auswahl
    auswahl = 1000
    while auswahl - 1 > len(lag):
        while True:
            try:  
                auswahl = raw_input("Bitte geben Sie die Nummer des gewuenschten Orts ein: ")
                auswahl = int(auswahl)
                break
            except ValueError:
                print "Bitte natuerliche Zahl eingeben!"
    Ort = ort [auswahl - 1]
    Laengengrad = lag [auswahl - 1]
    Breitengrad = brt [auswahl - 1]
    Koordinaten = []
    Koordinaten.append(Laengengrad)
    Koordinaten.append(Breitengrad)
    Koordinaten.append(Ort)
    return Koordinaten
  
K1 = EINGABE("Start eingeben: ", x1)

L1 = m.radians(float(K1[0]))
B1 = m.radians(float(K1[1]))
O1 = K1[2]
#print lon1
K2 = EINGABE("Ziel eingeben: ", x2)
L2 = m.radians(float(K2[0]))
B2 = m.radians(float(K2[1]))
O2 = K2[2]

#Berechnung der Entfernung
if debug == 3: print "laenge1", L1, K1[0]
if debug == 3: print "breite1", B1, K1[1]
if debug == 3: print "laenge2", L2, K2[0]
if debug == 3: print "breite2", B2, K2[1]

distanz = 6371.0 * m.acos( m.cos(B1) * m.cos(B2) * m.cos(L2 - L1) + m.sin(B1) * m.sin(B2) )
print "Die Entfernung zwischen", O1,"und", O2,"betraegt: ", distanz, "km."
