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.
Falls jemand mit dem Programm oder den Daten herumspielen möchte, hier sind sie: ZIP-Archiv
Das Programm benötigt wegen der verwendeten f-Strings mindestens die Python-Version 3.6.
#!/usr/bin/env python3 import json import csv from tkinter import Tk, Canvas, Text from random import randint # Deutschlandkarte mit Anzeige der KFZ-Kennzeichen aller Kreise, Landkreise, # kreisfreien Städte und Kreisstädte sowie der angeblichen Volksmund- # Interpretationen dieser Kennzeichen. # # Info: https://bauforum.wirklichewelt.de/index.php?nr=11591 # def Zufallsfarben(Grundton): # Erzeugt zufällige Farben im Grundton des Bundeslandes. a, b = 100, 130 # Intervall der Zufallsstreuung der Bezirksfarbe c = 255-b # Einfluss des Bundeslandes auf die Farbe # Füllfarbe rf = randint(a, b)+c*int(Grundton[1:3], 16)//256 gf = randint(a, b)+c*int(Grundton[3:5], 16)//256 bf = randint(a, b)+c*int(Grundton[5:7], 16)//256 # Randfarbe wie Füllfarbe, nur dunkler rr = rf//2 gr = gf//2 br = bf//2 return (f"#{rf:02x}{gf:02x}{bf:02x}", f"#{rr:02x}{gr:02x}{br:02x}") class Bezirk: # Alle Informationen zu einem Bezirkspolygon def __init__(self, cid, B, Flächenfarbe, Randfarbe): # Canvas-ID der Bezirksfläche self.cid = cid # Informationen aus der Bezirkliste self.name = B["Name"] self.typ = B["Typ"] self.kfz = sorted(B["Kennzeichen"]) self.land = Bundesland[B["Bundesland"]][0] # Füllfarbe self.flächenfarbe = Flächenfarbe # Randfarbe self.randfarbe = Randfarbe # Wenn die Maus auf die Fläche kommt C.tag_bind(self.cid, "<Enter>", self.hervorhebung) # Wenn die Maus die Fläche wieder verlässt C.tag_bind(self.cid, "<Leave>", self.entfernehervorhebung) def hervorhebung(self, event=None): # Fläche rot einfärben, Rand dicker zeichnen C.itemconfig(self.cid, outline="red", fill="red", width=7) # Informationen im Textfenster ausgeben self.info() def entfernehervorhebung(self, event=None): # Ursprüngliche Flächenfarbe und Randstärke wiederherstellen C.itemconfig(self.cid, outline=self.randfarbe, fill=self.flächenfarbe, width=1) def info(self): # Informationen über den hervorgehobenen Bezirk ausgeben: # Textbereich löschen T.delete(1.0, "end") # Überschrift T.insert("end", f"n{self.typ} {self.name} in {self.land}n", "h1") # Liste der Kennzeichen und ihrer angeblichen Bedeutungen for k in self.kfz: T.insert("end", f"n{k} ({Kennzeichen[k]})n", "h2") if k in Interpretation: Ints = ("“n- „".join(sorted(Interpretation[k], key=lambda x: x.lower()))) T.insert("end", f"- „{Ints}“n") def canvaskoord(Polygon): # Umrechnung der Geokoordinaten auf das quadratische Canvas-Fenster return [(80*(x-5.5), Größe-100*(y-47.2)) for x, y in Polygon] # Umriss der BRD als Liste von Geokoordinaten with open("deutschland.json") as f: Deutschlandumriss = json.load(f) # Die „Bezirkliste“ ist eine Liste von Dictionarys mit Informationen über # Landkreise, Kreise und kreisfreie Städte in Deutschland. # # Koordinaten: entweder Liste mit Geokoordinaten (Ost, Nord) der Bezirksgrenzen # oder Liste solcher Listen für nicht zusammenhängende Flächen # # Name: Name des Bezirks # # Typ: Kreis, Landkreis oder kreisfreie Stadt # # Kennzeichen: Liste mit KFZ-Kennzeichen des Bezirks (einige Einträge sind # möglicherweise nicht korrekt, bitte überprüfen!) # # Bundesland: Kennzahl von "01" bis "16" with open("bezirke.json") as f: Bezirkliste = json.load(f) # Namen und Grundfarben der 16 Bundesländer; die fünf Farben sind # so gewählt, dass benachbarte Länder nicht dieselbe Farbe haben. with open("laender.csv") as f: Bundesland = {k: v for k, *v in csv.reader(f, delimiter="t")} # Liste der Ortskennzeichen with open("kfz.csv") as f: Kennzeichen = {k: v for k, v in csv.reader(f, delimiter="t")} # Liste mehr oder weniger geistreicher Interpretationen der Ortskennzeichen. # Verwendete Quellen: # https://www.chefkoch.de/forum/2,31,46569/Kfz-Zeichen-und-Ihre-ganz-spezielle-Deutung-aber-nicht-beleidigt-sein-Ck-users-danke.html # https://blog.jannewap.ws/2009/04/05/kfz-kennzeichen-fiese-interpretationen-gibt-es-uberall/ # https://www.meine-auto.info/ratgeber/kfz-kennzeichen/autokennzeichen-mal-anders.html # http://www.spiegel.de/auto/fahrkultur/auto-kennzeichen-kennen-sie-die-witzigsten-kuerzel-a-1192622.html # … sowie individuelle Einsendungen von Ortskundigen with open("kfzint.csv") as f: Interpretation = {k: v for k, *v in csv.reader(f, delimiter="t")} # GUI-Hauptfenster F = Tk() F.title("Deutschlands Kennzeichen") # Die Zeichenfläche/Canvas Größe = 800 C = Canvas(width=Größe, height=Größe, background="white", bd=0, highlightthickness=0) C.pack(side="left") # Infofenster rechts neben der Karte T = Text(width=40, wrap="word", font="sans 11", bd=0, highlightthickness=0) T.pack(fill="both", expand=True) # Erste Zeile des Infofensters hervorheben T.tag_config("h1", font="sans 12 bold") # Kennzeichen hervorheben T.tag_config("h2", font="sans 11 bold") # Gesamtumriss zeichnen for Polygon in Deutschlandumriss: C.create_polygon(canvaskoord(Polygon), fill="", outline="black", width=7) # Liste mit Bezirk-Objekten zusammenstellen: Bezirke = [] for B in Bezirkliste: # passende Farben aussuchen fläche, rand = Zufallsfarben(Bundesland[B["Bundesland"]][1]) # Liste der Polygone holen K = B["Koordinaten"] # Ist die Polygonliste nur eine Punkteliste? if type(K[0][0]) == float: # nochmal einpacken, Punkteliste wird zur Polygonliste K = [K] # für alle Polygone in der Polygonliste for Polygon in K: # Polygon zeichnen und Canvas-ID merken cid = C.create_polygon(canvaskoord(Polygon), fill=fläche, outline=rand, width=1) # Bezirk-Objekt anlegen Bezirke.append(Bezirk(cid, B, fläche, rand)) # Kreisfreie Städte und Stadtkreise dürfen nicht von den sie # umschließenden Kreisen und Landkreisen überdeckt werden und # werden deshalb in den Vordergrund gehoben: for B in Bezirke: if "Stadt" in B.typ: C.tag_raise(B.cid) F.mainloop()
--
Dipl.-Ing. Martin Vogel
Leiter des Bauforums
Bücher:
CAD mit BricsCAD
Bauinformatik mit Python
Tags:
Python, Daten, Vermessung, GIS