pvl2gunnar.py 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. #Entfernungen berechnen
  2. #Python 2.7
  3. #Author Gunnar Egenolff
  4. #letzte Bearbeitung 22.5.19
  5. import re
  6. import math as m
  7. debug = 0
  8. def EINGABE(startoderziel):#Funktion fuer Eingabe
  9. eingabe = raw_input(startoderziel)#Eingabeaufforderung
  10. eingabealsliste = list(eingabe)#Umwandlung der Eingabe in Liste
  11. laenge = len(eingabealsliste)#Laenge der Liste
  12. if debug == 1: print "Eingabe als Liste: ", (eingabealsliste)
  13. if debug == 1: print "Anzahl der Listenelemente / Laenge der Eingabe: ", (laenge)
  14. return eingabealsliste
  15. def SUCHBEGRIFF(eingabealsliste, suchbegriffealsliste):#Funktion zur Erstellung der regulaeren Ausdruecke
  16. laenge = len(eingabealsliste)#Laenge der Liste
  17. i = 0#Zaehlvariable fuer Schleife
  18. while i <= laenge - 1: #legt Liste mit regulaeren Ausdruecken an
  19. if debug == 1: print "Ersetzter Buchstabe: ", eingabealsliste[i]
  20. t = eingabealsliste[:] #Originalliste soll erhalten bleiben, gearbeitet wird mit modifizierter Liste
  21. t.insert(i,".?.?") #je ein Buchstabe wird durch 2x Punkt Fragezeichen ersetzt. So koennen an dieser Stelle bis zu 2 beliebige Zeichen vorkommen.
  22. del t[i+1]#ersetzter Buchstabe wird geloescht
  23. mod = "".join(t)#regulaerer Ausdruck als String
  24. suchbegriffealsliste.append("\t" + mod + "\s") #Whitespaces stellen sicher, dass Suchbegriff nicht Teil eines laengeren Namens
  25. if debug == 1: print "geaenderte Liste: ", t
  26. if debug == 1: print "originale Liste: ", eingabealsliste
  27. if debug == 1: print "Liste der Suchbegriffe: ", suchbegriffealsliste
  28. i = i + 1
  29. return suchbegriffealsliste
  30. def AUSLESE(x):#Funktion fuer zeilenweises Auslesen der Ortedatei, Abgleich mit Suchbegriff
  31. j = 0#Zaehlvariable fuer Liste mit regulaeren Ausdruecken
  32. k = 1#Nummer fuer Trefferanzeige
  33. brt = []#Liste fuer Breitengrade
  34. lag = []#Liste fuer Laengengrade
  35. ort = []#Liste fuer Ortsnamen
  36. schonmalgesehen = []#Liste fuer Treffer, verhindert Mehrfachtreffer
  37. while j <= len(x) - 1: #fragt nacheinander alle Versionen des Ortsnamens ab
  38. linenr = 0#Startwert und Reset fuer Zaehlvariable fuer Dateizeilen
  39. detab = open("DE.tab")#oeffnet Datei
  40. Suchbegriff = str(x[j])
  41. while True: # liest Datenbank zeilenweise aus
  42. line = detab.readline()
  43. if not line: break
  44. linenr += 1
  45. if re.search(Suchbegriff, line) and not linenr in schonmalgesehen: #findet Ortsname, Abgleich mit Trefferliste
  46. Liste = line.split("\t")#wandelt Dateizeile in Liste um
  47. print k, Liste[7], Liste[3], Liste[4], Liste[5] #Ausgabe Nummer, Plz, Ortsname, Breite, Laenge
  48. ort.append(Liste[3])#Trefferlisten
  49. brt.append(Liste[4])
  50. lag.append(Liste[5])
  51. k += 1
  52. schonmalgesehen.append(linenr)
  53. if debug == 2: print schonmalgesehen
  54. if debug == 2: print lon, lat
  55. if debug == 1: print "Suchbegriff: ", str(x[j])
  56. j+=1
  57. line = True
  58. detab.close()
  59. vorschlag = [ort, brt, lag]#Zusammenfassung der Trefferlisten fuer return
  60. return vorschlag
  61. def AUSWAHL(vorschlag):#Funktion fuer Aufforderung zur Auswahl eines Treffers
  62. auswahl = 1000#Startwert fuer Abbruchbedingung
  63. while auswahl - 1 > len(vorschlag[1]):#Eingabefehler abfangen
  64. while True:
  65. try:
  66. auswahl = raw_input("Bitte geben Sie die Nummer des gewuenschten Orts ein: ")
  67. auswahl = int(auswahl)
  68. break
  69. except ValueError:
  70. print "Bitte natuerliche Zahl eingeben!"
  71. Orte = vorschlag[0]#zweistufiges Verfahren zur Isolierung der Werte fuer Ortsname und Koordinaten
  72. Ort = Orte[auswahl - 1]#umgeht Syntaxprobleme bei vorschlag[0[auswahl - 1]]
  73. Laengengrade = vorschlag[1]
  74. Laengengrad = Laengengrade [auswahl - 1]
  75. Breitengrade = vorschlag[2]
  76. Breitengrad = Breitengrade [auswahl - 1]
  77. Koordinaten = []#Zusammenfassung von Ortsname und Koordinaten in Liste fuer return
  78. Koordinaten.append(Laengengrad)
  79. Koordinaten.append(Breitengrad)
  80. Koordinaten.append(Ort)
  81. return Koordinaten
  82. #Start
  83. suchbegriffealsliste1 = []
  84. suchbegriffealsliste2 = []
  85. treffer1 = []
  86. treffer2 = []
  87. while len(treffer1) == 0:#1. Schleife fuer Start, erneute Suche wenn Suche ohne Treffer
  88. eingabealsliste1 = EINGABE("Start eingeben: ")#Funktionen GROSS geschrieben
  89. suchbegriffealsliste1 = SUCHBEGRIFF(eingabealsliste1, suchbegriffealsliste1)
  90. vorschlag1 = AUSLESE(suchbegriffealsliste1)
  91. treffer1 = vorschlag1 [0]#Abbruchbedingung fuer Schleife
  92. if len(treffer1) == 0:
  93. print "Nichts gefunden :("
  94. Koordinaten1 = AUSWAHL(vorschlag1)
  95. L1 = m.radians(float(Koordinaten1[0]))#Koordinaten in Bogenmass umwandeln
  96. B1 = m.radians(float(Koordinaten1[1]))
  97. O1 = Koordinaten1[2]#Ortsname fuer Ausgabe
  98. while len(treffer2) == 0:#2. Schleife fuer Ziel
  99. eingabealsliste2 = EINGABE("Ziel eingeben: ")
  100. suchbegriffealsliste2 = SUCHBEGRIFF(eingabealsliste2, suchbegriffealsliste2)
  101. vorschlag2 = AUSLESE(suchbegriffealsliste2)
  102. treffer2 = vorschlag2 [0]
  103. if len(treffer2) == 0:
  104. print "Nichts gefunden :("
  105. Koordinaten2 = AUSWAHL(vorschlag2)
  106. L2 = m.radians(float(Koordinaten2[0]))
  107. B2 = m.radians(float(Koordinaten2[1]))
  108. O2 = Koordinaten2[2]
  109. #Berechnung der Entfernung
  110. distanz = 6371.0 * m.acos( m.cos(B1) * m.cos(B2) * m.cos(L2 - L1) + m.sin(B1) * m.sin(B2) )
  111. print "Die Entfernung zwischen", O1,"und", O2,"betraegt: ", distanz, "km."