Berechnung der Distanz Luftlinie zweier Orte in Deutschland in km.

pvl.py 11KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. #########################################################################
  2. # Beschreibung: Berechnung der Distanz Luftlinie zweier Orte #
  3. # in Deutschland in km. #
  4. # #
  5. # Erstellt von: Francine Theil, Kristin Weber, Willi Schlegel #
  6. # Datum: 10.06.2017 #
  7. # #
  8. #########################################################################
  9. #--------------------------------------------------------------
  10. # benoetigte module importieren
  11. import re # modul fuer regulaere ausdruecke
  12. import sys # modul fuer systemoperationen
  13. import math as m # modul fuer mathematische berechnungen
  14. import logging # modul fuer protokolierungen
  15. #--------------------------------------------------------------
  16. # verwendung von logging
  17. # das log-file wird als log.txt im hauptverzeichnis abgelegt
  18. deb=logging.basicConfig(filename="log.txt", level=logging.DEBUG,
  19. format="%(asctime)s: %(levelname)s: %(message)s ") #debug logging
  20. err=logging.basicConfig(filename="log.txt", level=logging.ERROR,
  21. format="%(asktime)s: %(levelname)s: %(message)s ") #error logging
  22. inf=logging.basicConfig(filename="log.txt", level=logging.INFO,
  23. format="%(asktime)s: $(levelname)s: %(message)s ") #info logging
  24. #-------------------------------------------------------------
  25. # menue erstellen ab diesem punkt beginnt die anwendung
  26. def menu(): #funktion als menue
  27. logging.info("Die Anwendung wurde ordnungsgemaess gestartet") #wenn die anwendung gestarten werden konnte, erfolgt ein logging
  28. print " "
  29. wahl = raw_input("Berechnung beginnen? [y/n] ") #abfrage ob die berechnug durchgefuehrt werden soll
  30. print " "
  31. if wahl == "y": #bei der eingabe eines y wird die funktion ort1() ausgefuehrt
  32. ort1()
  33. elif wahl == "n": #bei der eingabe eines n wird die anwendung beendet
  34. logging.info("Die Anwendung wurde ordnungsgemaess beendet") #logging ausgeben
  35. sys.exit()
  36. else: #falls eine falsche eingabe erfolgt wird ein error logging erzeugt
  37. logging.error("Die Anwendung konnte nicht gestartet werden") #und die funktion menu wird erneut ausgefuehrt
  38. menu()
  39. #--------------------------------------------------------------
  40. # funktion (menue) fuer die eingabe des ersten ortes
  41. def ort1(): #funktion fuer die eingabe des ersten ortes
  42. eingabe1=raw_input("Ersten Ort eingeben: ") #eingabe des ersten ortes
  43. datei=open("DE.tab") #datei oeffnen
  44. tmp = [] #datei temporaer gespeichert
  45. print " "
  46. for line in datei: #zeilenweise auslesen der datei
  47. if re.findall(eingabe1, line): #weiter wenn die eingabe mit dem ort in der datei ubereinstimmen
  48. logging.info("Der erste eingegebene Ort wurde gefunden") #logging als info wenn ort in der datei gefunden wurde
  49. a=line.split("\t") #eichenketten der gelesenen zeilen aufteilen
  50. print a[3] #dritte zeichenkette/spalte ausgeben
  51. tmp.append(a) #auflisten der gefundenen ergebnisse
  52. logging.debug(a) #logging als debug vermerken
  53. datei.close() #datei schliessen
  54. print " "
  55. nr = int(raw_input("Welcher Vorschlag soll verwendet werden? ")) #auswahl der vorgeschlagenen staedte
  56. print " "
  57. ort2(tmp[nr]) #weiter zur funktion -ort2- inkl. globale variablen
  58. #---------------------------------------------------------------
  59. def ort2(a): #funktion fuer die eingabe des zweiten ortes $
  60. eingabe2=raw_input("Zweiten Ort eingeben: ") #eingabe des zweiten ortes
  61. datei=open("DE.tab") #datei oeffnen
  62. tmp = [] #datei temporaer gespeichert
  63. print " "
  64. for line in datei: #zeilenweise auslesen aus der datei
  65. if re.findall(eingabe2, line): #weiter wenn die eingabe mit dem ort in der datei ubereinstimmen
  66. b=line.split("\t") #gelesene zeilen aufteilen (rstrip) und die position 7 bis 15 ([]) m$
  67. print b[3] #dritte zeichenkette/spalte ausgeben
  68. tmp.append(b) #auflisten der gefundenen ergebnisse
  69. logging.debug(b) #logging als debug ausgeben
  70. datei.close() #datei schliessen
  71. print " "
  72. nr = int(raw_input("Welcher Vorschlag soll verwendet werden? ")) #Abfrage, welcher Vorschlag verwendet werden soll
  73. print " "
  74. koordinaten(a,tmp[nr]) #
  75. #--------------------------------------------------------------
  76. # longitude und latidude beider orte definieren
  77. def koordinaten(a,b): #funktion fuer das auslesen der koordinaten des ersten ortes
  78. lat=a[4] #latitude des ersten ortes aus der liste extrahieren
  79. long=a[5] #longitude des ersten ortes aus der liste extrahieren
  80. koordinaten2(lat, long, b) #zur funktion -koordinaten2- uebergehen
  81. def koordinaten2(x1, y1, b): #funktion fuer da auslesen der koordinaten des zweiten ortes
  82. logging.debug("Die Koordinaten fuer den ersten Ort konnten ermittelt werden") #logging ausgeben
  83. lat = b[4] #latitude des zweiten ortes aus der liste extrahieren
  84. long = b[5] #longtude des zweiten ortes aus der liste extrahieren
  85. ausgabe(x1, y1, lat, long) #weiter zur funktion -ausgabe-
  86. def ausgabe(x1, y1, x2, y2): #funktioon zur ausgabe der extrahierten koordinaten
  87. logging.debug("Die Koordinaten fuer den zweiten Ort konnten ermittelt werden") #logging ausgeben
  88. print " "
  89. print "{}{}".format("Die X-Koordinate des ersten Ortes lautet: ", y1)
  90. print "{}{}".format("Die Y-Koordinate des ersten Ortes lautet: ", x1)
  91. print " "
  92. print "{}{}".format("Die X-Koordinaten des zweiten Ortes lautet: ", y2)
  93. print "{}{}".format("Die Y-Koordinaten des zweiten Ortes lautet: ", x2)
  94. print " "
  95. #--------------------------------------------------------------
  96. # funktion zur berechnung der distanz beider eingegebenen orte
  97. r = 6371.0 #angabe des radius der erde
  98. lat1=float(x1)*2*m.pi/360 #latitude des ersten ortes in bogenmass umrechnen
  99. lat2=float(x2)*2*m.pi/360 #latitude des zweiten ortes in bogenmass umrechnen
  100. long1=float(y1)*2*m.pi/360 #longtude des ersten ortes in bogenmass umrechnen
  101. long2=float(y2)*2*m.pi/360 #longtude des zweiten ortes in bogenmass umrechnen
  102. x1 = float(r*m.cos(long1)*m.cos(lat1)) #x koordinaten des ersten ortes berechnen
  103. y1 = float(r*m.sin(long1)*m.cos(lat1)) #y koordinaten des ersten ortes berechnen
  104. z1 = float(r*m.sin(lat1)) #z koordinaten des ersten ortes berechnen
  105. x2 = float(r*m.cos(long2)*m.cos(lat2)) #x koordinaten des zweiten ortes berechnen
  106. y2 = float(r*m.sin(long2)*m.cos(lat2)) #y koordinaten des zweiten ortes berechnen
  107. z2 = float(r*m.sin(lat2)) #z koordinaten des zweiten ortes berechnen
  108. skalarprod = x1*x2+y1*y2+z1*z2 #skalarprodukt der koordinaten bilden
  109. Betrag1 = m.sqrt(x1*x1+y1*y1+z1*z1) #betrag des ersten ortes bilden
  110. Betrag2 = m.sqrt(x2*x2+y2*y2+z2*z2) #betrag des zweiten ortes bilden
  111. tmp=m.acos(skalarprod/(Betrag1*Betrag2)) #arcuskosinus bilden
  112. ergebnis = tmp * r #ergebnis der entfernung beider orte
  113. ergebnis = round(ergebnis) #aufgerundetes ergebnis der entfernung beider orte
  114. print "{} {} {}".format("Die Orte sind ", ergebnis, "Km voneinander entfernt") #ausgabe der berechnung
  115. print " "
  116. logging.debug("Die Distanz konnte berechnet werden") #logging ausgeben
  117. menu() #zurueck zum menu
  118. #---------------------------------------------------------------
  119. # menue zur erneuten abfrage der berechnung
  120. menu() #funktion schliessen - zurueck zum menu - als "schleife"