Bedeutung deutscher KFZ-Kennzeichen (volkstümliche Interpretation) (Software)

Martin Vogel ⌂ @, Dortmund / Bochum, Samstag, 17. Februar 2018, 17:13 (vor 98 Tagen) @ Martin Vogel

Man kann mit den Geodaten zwar auch sinnvolle Dinge anstellen, aber ich hatte letztlich eine Webseite mit volkstümlichen Interpretationen von KFZ-Kennzeichen gesehen und wollte den Quatsch unbedingt mal in Python umsetzen.

[image]

Falls jemand mit dem Programm oder den Daten herumspielen möchte, hier sind sie: [image]ZIP-Archiv
Das Programm benötigt wegen der verwendeten f-Strings mindestens die Python-Version 3.6.

  1. #!/usr/bin/env python3
  2.  
  3. import json
  4. import csv
  5. from tkinter import Tk, Canvas, Text
  6. from random import randint
  7.  
  8. # Deutschlandkarte mit Anzeige der KFZ-Kennzeichen aller Kreise, Landkreise,
  9. # kreisfreien Städte und Kreisstädte sowie der angeblichen Volksmund-
  10. # Interpretationen dieser Kennzeichen.
  11. #
  12. # Info: https://bauforum.wirklichewelt.de/index.php?nr=11591
  13. #
  14.  
  15.  
  16. def Zufallsfarben(Grundton):
  17. # Erzeugt zufällige Farben im Grundton des Bundeslandes.
  18. a, b = 100, 130 # Intervall der Zufallsstreuung der Bezirksfarbe
  19. c = 255-b # Einfluss des Bundeslandes auf die Farbe
  20. # Füllfarbe
  21. rf = randint(a, b)+c*int(Grundton[1:3], 16)//256
  22. gf = randint(a, b)+c*int(Grundton[3:5], 16)//256
  23. bf = randint(a, b)+c*int(Grundton[5:7], 16)//256
  24. # Randfarbe wie Füllfarbe, nur dunkler
  25. rr = rf//2
  26. gr = gf//2
  27. br = bf//2
  28. return (f"#{rf:02x}{gf:02x}{bf:02x}",
  29. f"#{rr:02x}{gr:02x}{br:02x}")
  30.  
  31.  
  32. class Bezirk:
  33. # Alle Informationen zu einem Bezirkspolygon
  34. def __init__(self, cid, B, Flächenfarbe, Randfarbe):
  35. # Canvas-ID der Bezirksfläche
  36. self.cid = cid
  37. # Informationen aus der Bezirkliste
  38. self.name = B["Name"]
  39. self.typ = B["Typ"]
  40. self.kfz = sorted(B["Kennzeichen"])
  41. self.land = Bundesland[B["Bundesland"]][0]
  42. # Füllfarbe
  43. self.flächenfarbe = Flächenfarbe
  44. # Randfarbe
  45. self.randfarbe = Randfarbe
  46. # Wenn die Maus auf die Fläche kommt
  47. C.tag_bind(self.cid, "<Enter>", self.hervorhebung)
  48. # Wenn die Maus die Fläche wieder verlässt
  49. C.tag_bind(self.cid, "<Leave>", self.entfernehervorhebung)
  50.  
  51. def hervorhebung(self, event=None):
  52. # Fläche rot einfärben, Rand dicker zeichnen
  53. C.itemconfig(self.cid, outline="red", fill="red", width=7)
  54. # Informationen im Textfenster ausgeben
  55. self.info()
  56.  
  57. def entfernehervorhebung(self, event=None):
  58. # Ursprüngliche Flächenfarbe und Randstärke wiederherstellen
  59. C.itemconfig(self.cid, outline=self.randfarbe,
  60. fill=self.flächenfarbe, width=1)
  61.  
  62. def info(self):
  63. # Informationen über den hervorgehobenen Bezirk ausgeben:
  64. # Textbereich löschen
  65. T.delete(1.0, "end")
  66. # Überschrift
  67. T.insert("end", f"n{self.typ} {self.name} in {self.land}n", "h1")
  68.  
  69. # Liste der Kennzeichen und ihrer angeblichen Bedeutungen
  70. for k in self.kfz:
  71. T.insert("end", f"n{k} ({Kennzeichen[k]})n", "h2")
  72. if k in Interpretation:
  73. Ints = ("“n- „".join(sorted(Interpretation[k],
  74. key=lambda x: x.lower())))
  75. T.insert("end", f"- „{Ints}“n")
  76.  
  77.  
  78. def canvaskoord(Polygon):
  79. # Umrechnung der Geokoordinaten auf das quadratische Canvas-Fenster
  80. return [(80*(x-5.5), Größe-100*(y-47.2)) for x, y in Polygon]
  81.  
  82.  
  83. # Umriss der BRD als Liste von Geokoordinaten
  84.  
  85. with open("deutschland.json") as f:
  86. Deutschlandumriss = json.load(f)
  87.  
  88. # Die „Bezirkliste“ ist eine Liste von Dictionarys mit Informationen über
  89. # Landkreise, Kreise und kreisfreie Städte in Deutschland.
  90. #
  91. # Koordinaten: entweder Liste mit Geokoordinaten (Ost, Nord) der Bezirksgrenzen
  92. # oder Liste solcher Listen für nicht zusammenhängende Flächen
  93. #
  94. # Name: Name des Bezirks
  95. #
  96. # Typ: Kreis, Landkreis oder kreisfreie Stadt
  97. #
  98. # Kennzeichen: Liste mit KFZ-Kennzeichen des Bezirks (einige Einträge sind
  99. # möglicherweise nicht korrekt, bitte überprüfen!)
  100. #
  101. # Bundesland: Kennzahl von "01" bis "16"
  102.  
  103. with open("bezirke.json") as f:
  104. Bezirkliste = json.load(f)
  105.  
  106. # Namen und Grundfarben der 16 Bundesländer; die fünf Farben sind
  107. # so gewählt, dass benachbarte Länder nicht dieselbe Farbe haben.
  108.  
  109. with open("laender.csv") as f:
  110. Bundesland = {k: v for k, *v in csv.reader(f, delimiter="t")}
  111.  
  112. # Liste der Ortskennzeichen
  113.  
  114. with open("kfz.csv") as f:
  115. Kennzeichen = {k: v for k, v in csv.reader(f, delimiter="t")}
  116.  
  117. # Liste mehr oder weniger geistreicher Interpretationen der Ortskennzeichen.
  118. # Verwendete Quellen:
  119. # https://www.chefkoch.de/forum/2,31,46569/Kfz-Zeichen-und-Ihre-ganz-spezielle-Deutung-aber-nicht-beleidigt-sein-Ck-users-danke.html
  120. # https://blog.jannewap.ws/2009/04/05/kfz-kennzeichen-fiese-interpretationen-gibt-es-uberall/
  121. # https://www.meine-auto.info/ratgeber/kfz-kennzeichen/autokennzeichen-mal-anders.html
  122. # http://www.spiegel.de/auto/fahrkultur/auto-kennzeichen-kennen-sie-die-witzigsten-kuerzel-a-1192622.html
  123. # … sowie individuelle Einsendungen von Ortskundigen
  124.  
  125. with open("kfzint.csv") as f:
  126. Interpretation = {k: v for k, *v in csv.reader(f, delimiter="t")}
  127.  
  128. # GUI-Hauptfenster
  129. F = Tk()
  130. F.title("Deutschlands Kennzeichen")
  131.  
  132. # Die Zeichenfläche/Canvas
  133. Größe = 800
  134. C = Canvas(width=Größe, height=Größe, background="white",
  135. bd=0, highlightthickness=0)
  136. C.pack(side="left")
  137.  
  138. # Infofenster rechts neben der Karte
  139. T = Text(width=40, wrap="word", font="sans 11", bd=0, highlightthickness=0)
  140. T.pack(fill="both", expand=True)
  141.  
  142. # Erste Zeile des Infofensters hervorheben
  143. T.tag_config("h1", font="sans 12 bold")
  144.  
  145. # Kennzeichen hervorheben
  146. T.tag_config("h2", font="sans 11 bold")
  147.  
  148. # Gesamtumriss zeichnen
  149. for Polygon in Deutschlandumriss:
  150. C.create_polygon(canvaskoord(Polygon), fill="", outline="black", width=7)
  151.  
  152. # Liste mit Bezirk-Objekten zusammenstellen:
  153. Bezirke = []
  154. for B in Bezirkliste:
  155.  
  156. # passende Farben aussuchen
  157. fläche, rand = Zufallsfarben(Bundesland[B["Bundesland"]][1])
  158.  
  159. # Liste der Polygone holen
  160. K = B["Koordinaten"]
  161.  
  162. # Ist die Polygonliste nur eine Punkteliste?
  163. if type(K[0][0]) == float:
  164.  
  165. # nochmal einpacken, Punkteliste wird zur Polygonliste
  166. K = [K]
  167.  
  168. # für alle Polygone in der Polygonliste
  169. for Polygon in K:
  170.  
  171. # Polygon zeichnen und Canvas-ID merken
  172. cid = C.create_polygon(canvaskoord(Polygon),
  173. fill=fläche, outline=rand, width=1)
  174.  
  175. # Bezirk-Objekt anlegen
  176. Bezirke.append(Bezirk(cid, B, fläche, rand))
  177.  
  178. # Kreisfreie Städte und Stadtkreise dürfen nicht von den sie
  179. # umschließenden Kreisen und Landkreisen überdeckt werden und
  180. # werden deshalb in den Vordergrund gehoben:
  181. for B in Bezirke:
  182. if "Stadt" in B.typ:
  183. C.tag_raise(B.cid)
  184.  
  185. F.mainloop()

--
Dipl.-Ing. Martin Vogel
Leiter des Bauforums

Heute schon programmiert? Einführung in Python 3 (PDF)

Tags:
Python, Daten, Vermessung, GIS



gesamter Thread:

 RSS-Feed dieser Diskussion

powered by my little forum