Dies sind die Abenteuer der Raumschiff Enterprise, das unterwegs ist, um fremde Welten zu entdecken, unbekannte Lebensformen und neue Zivilisationen. Die Enterprise dringt dorthin vor, wo vorher noch kein Mensch gewesen ist.

PVLv00.py 6.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. # Funktion: Berechnet die Entfernung zwischen zwei Orten in Deutschland
  2. # Autoren: Vinzent Reiss, Nils Dohndorf
  3. # Datum: 08.06.2017 Version: 1.0
  4. #
  5. # verwendete Module
  6. import sys as System
  7. import re as Regular
  8. import math
  9. import logging
  10. #
  11. # globale Variablen
  12. datei = "DE.tab"
  13. radius = 6371.0
  14. logging.basicConfig(level=logging.INFO)
  15. _name_ = "main"
  16. logger = logging.getLogger(_name_)
  17. #
  18. # Funktionen
  19. #
  20. # konvertiert einen beliebigen string in einen aus blossen Zahlen bestehenden
  21. def toint(string):
  22. _name_ = "toint"
  23. logger = logging.getLogger(_name_)
  24. logger.info("Start eliminating non number characters...")
  25. ziffern = ["0","1","2","3","4","5","6","7","8","9"]
  26. tmp = ""
  27. for i in range(len(string)):
  28. if string[i] in ziffern:
  29. tmp += string[i]
  30. logger.info("finished")
  31. if len(tmp) == 0:
  32. return "0"
  33. return tmp
  34. # liest die einzelnwn Zeilen der Tabellen ein
  35. def tabelleeinlesen():
  36. _name_ = "tabelleeinlesen"
  37. logger = logging.getLogger(_name_)
  38. logger.info("Start reading file...")
  39. tmptabelle = []
  40. lesen = open(datei)
  41. while True:
  42. tmp = lesen.readline()
  43. if not tmp: break
  44. if tmp[0] == "#": continue
  45. zeile = tmp.split("\t")
  46. tmptabelle.append(zeile)
  47. lesen.close()
  48. logger.info("finished")
  49. return tmptabelle
  50. # ermitteln aus einer in Zeilenform gegebenen Tabelle die nte Spalte
  51. def spalteermitteln(tmptabelle,spalte):
  52. _name_ = "spalteermitteln"
  53. logger = logging.getLogger(_name_)
  54. logger.info("Determining columns...")
  55. tmpspalte = []
  56. logger.info("finished")
  57. for i in range(len(tmptabelle)):
  58. tmpspalte.append(tmptabelle[i][spalte])
  59. return tmpspalte
  60. # eliminiert nicht benoetigte, also redundante, oder ungeeignete Eintraege
  61. def tabellenreduzieren(namen,latituden,longituden,plz):
  62. _name_ = "tabellenreduzieren"
  63. logger = logging.getLogger(_name_)
  64. logger.info("Start eliminating redundant entries... This can take a while...")
  65. tmpnamen = []
  66. tmplatituden = []
  67. tmplongituden = []
  68. tmpplz = []
  69. for i in range(len(namen)):
  70. if (latituden[i] <> "") and (longituden[i] <> "") and (plz[i] <> ""):
  71. tmpnamen.append(namen[i])
  72. tmplatituden.append(latituden[i])
  73. tmplongituden.append(longituden[i])
  74. tmpplz.append(plz[i])
  75. logger.info("finished")
  76. return (tmpnamen,tmplatituden,tmplongituden,tmpplz)
  77. # erstellt eine Liste passender Orte, zu einem Suchbegriff
  78. def ortssuche(namen):
  79. _name_ = "ortssuche"
  80. logger = logging.getLogger(_name_)
  81. logger.info("Start creating array of fitting entires main database...")
  82. name = raw_input().lower()
  83. treffer = []
  84. for i in range(len(name)):
  85. treffer.append([])
  86. suchwortlaenge = 1
  87. while suchwortlaenge <= len(name):
  88. for i in range(len(namen)):
  89. if Regular.search(name[0:suchwortlaenge],namen[i].lower()):
  90. treffer[suchwortlaenge-1].append(i)
  91. if treffer[suchwortlaenge-1] == []:
  92. break
  93. suchwortlaenge += 1
  94. logger.info("finished")
  95. return treffer[suchwortlaenge-2]
  96. # wandelt Polarkoordinaten in Kartesische um
  97. def koordinatenberechnung(lat,long):
  98. _name_ ="koordinatenberechnung"
  99. logger = logging.getLogger(_name_)
  100. logger.info("Start converting coordinates...")
  101. x = radius*math.cos(long)*math.cos(lat)
  102. y = radius*math.sin(long)*math.cos(lat)
  103. z = radius*math.sin(lat)
  104. logger.info("finished")
  105. return (x,y,z)
  106. # berechnet den Winkel zwischen zwei dreidimensionalen Vektoren
  107. def winkelberechnung(x1,y1,z1,x2,y2,z2):
  108. _name_ = "winkelberechnung"
  109. logger = logging.getLogger(_name_)
  110. logger.info("Start calculating angle between two vectors...")
  111. skalarprodukt = x1*x2+y1*y2+z1*z2
  112. betrag1 = math.sqrt(x1*x1+y1*y1+z1*z1)
  113. betrag2 = math.sqrt(x2*x2+y2*y2+z2*z2)
  114. logger.info("finished")
  115. return math.acos(skalarprodukt/(betrag1*betrag2))
  116. # ermittelt die Entfernung zweier Punkte auf einem Kreis
  117. def distanzrechnung(startlat,startlong,endlat,endlong):
  118. _name_ = "distanzrechnung"
  119. logger = logging.getLogger(_name_)
  120. logger.info("Start calculating distance...")
  121. (xstart,ystart,zstart) = koordinatenberechnung(startlat,startlong)
  122. (xend,yend,zend) = koordinatenberechnung(endlat,endlong)
  123. kreiswinkel = winkelberechnung(xstart,ystart,zstart,xend,yend,zend)
  124. logger.info("finished")
  125. return radius*kreiswinkel
  126. # gibt Liste mit Vorschlaegen aus
  127. def ortsliste(vorschlaege, namen, plz):
  128. _name_ = "ortsliste"
  129. logger = logging.getLogger(_name_)
  130. logger.info("Present search results...")
  131. zaehler = 0
  132. antwort = ""
  133. System.stdout.write("\f")
  134. for i in vorschlaege:
  135. zaehler += 1
  136. System.stdout.write("\t%d. Vorschlag: %-32s, PLZ: %8s\n" % (zaehler,namen[i],plz[i]))
  137. if (zaehler%16) == 0:
  138. System.stdout.write("\tIst der gesuchte Ort unter den gelisteten? ")
  139. antwort = raw_input().lower()
  140. if antwort[0] == "j":
  141. logger.info("finished")
  142. break
  143. System.stdout.write("\tEs stehen noch %d Antworten zur Verfuegung. Willst du sie sehen? " % (len(vorschlaege)-zaehler))
  144. antwort = raw_input().lower()
  145. if antwort[0] == "j":
  146. System.stdout.write("\f")
  147. continue
  148. System.stdout.write("\tSchade.\n")
  149. logger.info("Program interrupted.")
  150. System.exit()
  151. #
  152. # Hauptprogramm
  153. System.stdout.write("\tBitte haben Sie etwas Geduld, waehrend die Daten verarbeitet werden...\n")
  154. tabelle = tabelleeinlesen()
  155. namen = spalteermitteln(tabelle,3)
  156. latituden = spalteermitteln(tabelle,4)
  157. longituden = spalteermitteln(tabelle,5)
  158. plz = spalteermitteln(tabelle,7)
  159. (namen,latituden,longituden,plz) = tabellenreduzieren(namen,latituden,longituden,plz)
  160. tabelle = []
  161. System.stdout.write("\f")
  162. System.stdout.write("\tDer Name des 1. Ortes lautet? ")
  163. vorschlaege = ortssuche(namen)
  164. antwort = ""
  165. ortsliste(vorschlaege, namen, plz)
  166. System.stdout.write("\tWelcher der Vorschlaege soll fuer die Berechnung der Entfernung verwendet werden? ")
  167. antwort = int(toint(raw_input()))-1
  168. startort = namen[vorschlaege[antwort]]
  169. logger.info("Calculation startlatitude and -longitude...")
  170. startlatitude = float(latituden[vorschlaege[antwort]])*(2*math.pi/360)
  171. startlongitude = float(longituden[vorschlaege[antwort]])*(2*math.pi/360)
  172. System.stdout.write("\f")
  173. System.stdout.write("\tDer Name des 2. Ortes lautet? ")
  174. vorschlaege = ortssuche(namen)
  175. antwort = ""
  176. ortsliste(vorschlaege, namen, plz)
  177. System.stdout.write("\tWelcher der Vorschlaege soll fuer die Entfernungsrechnung verwendet werden? ")
  178. antwort = int(toint(raw_input()))-1
  179. endort = namen[vorschlaege[antwort]]
  180. logger.info("Calculating endlatitude and -longitude")
  181. endlatitude = float(latituden[vorschlaege[antwort]])*(2*math.pi/360)
  182. endlongitude = float(longituden[vorschlaege[antwort]])*(2*math.pi/360)
  183. entfernung = distanzrechnung(startlatitude,startlongitude,endlatitude,endlongitude)
  184. System.stdout.write("\tDie Entfernung zwischen %s und %s betraegt %.2f km.\n" % (startort,endort,entfernung))