Geodaten aller Gemeinden in Deutschland als kostenloser JSON-Download (Software)

Martin Vogel ⌂ @, Dortmund / Bochum, Sat, 17.02.2018, 13:54 (vor 2462 Tagen)

Die beiden Softwareentwickler Adrian Stabiszewski und Felix Ebert aus dem Raum Heilbronn betreiben die Website OpenDataLab, auf der sich jedermann Umrisse und Daten zu allen Gemeinden, Kreisen und Bundesländern in Deutschland herunterladen kann. Als Datenformat verwenden sie das mit Python besonders einfach auszuwertende GeoJSON-Format. Zusatzdaten aus Wikipedia und Destatis, wie beispielsweise Einwohnerzahlen, KFZ-Kennzeichen, Steuereinnahmen oder Geburtenrate machen die Website zu einer Fundgrube für eigene Projekte.

http://opendatalab.de/projects/geojson-utilities/

Den Quelltext ihres Geodatensammlers stellen die Entwickler auf GitHub zur Verfügung: https://github.com/opendatalab-de/simple-geodata-selector

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

Bücher:
CAD mit BricsCAD
Bauinformatik mit Python

Tags:
Daten, Vermessung, GIS

Bedeutung deutscher KFZ-Kennzeichen (volkstümliche Interpretation)

Martin Vogel ⌂ @, Dortmund / Bochum, Sat, 17.02.2018, 17:13 (vor 2461 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

Bücher:
CAD mit BricsCAD
Bauinformatik mit Python

Tags:
Python, Daten, Vermessung, GIS

RSS-Feed dieser Diskussion
powered by my little forum