GeoJson Stadtplan-Generator

vorhergehende Artikel in: Geo Java Komponenten
10.04.2021

Ich habe mich wieder einmal mit dem Generieren von Testdaten beschäfigt - dieses Mal sollte es eine Karte eines urbanen Gebietes, sozusagen ein Stadtplan sein.

Ich habe die Inspiration dafür aus dem letzten Mindfuck-Vortrag und aus diversen im Internet verfügbaren Veröffentlichungen bezogen.

Die Arbeiten, die ich dazu gefunden habe, würden heute ghern kolportierten Qualitätsansprüchen an wissenschaftliche Arbeiten nicht genügen: Die Informationen darin waren lückenhaft und nicht ausreichend, um die dargestellten Ergebnisse nachvollziehen zu können.

Ich musste also selbst kreativ werden. Auch ich werde hier das Verfahren nicht so detailliert darstellen, dass andere es nachprogrammieren könnten - allerdings habe ich auch kein Problem damit, den Quelltext bei Bedarf herauszugeben - vielleicht wird auch irgendwann ein Github-Repository oder wenigstens ein Gist daraus. Aktuell ist der Generator noch Work-in-Progress.

Ausgangspunkt der Generierung ist die Erzeugung eines Gitters - aktuell wird ein rechteckiges (quadratisches) und ein kreisförmiges (Wheel-and-spokes) Gitter unterstützt. Die Verbindungen der Knoten im Gitter stellen die Grundlage für die späteren Straßen im stasdtplan dar:

Screenshot Ausgangspunkt: Gitter

Anschließend werden die Gitterpunkte zufällig verschoben um dem ganzen einen "organischen" oder "gewachsenen" Eindruck zu geben:

Screenshot Gitterpunkte wurde zufällig verschoben

Anschließend werden einige Straßen enmtfernt, wobei jedoch immer darauf geachtet wird, dass das Straßennetz als Ganzes nicht in Teile zerfällt und jeder Knoten im Graphenm nach wie vor von jedem anderen aus erreichbar ist.

Daraufhin werden die Polygone im Gitter identifiziert und in einer internen Datenstruktur für die spätere Verwendung gespeichert. Die Polygone entsprechen den Häuserblocks im späteren Stadtplan:

Screenshot Polygone werden identifiziert und einige der Straßen werden entfernt

Nunmehr werden die Straßen in drei Kategorien unterteilt: Nebenstraßen, Hauptstraßen und Magistralen. Dies geschieht mittels eines Verfahrens, das ich direkt einer der angegebenen Arbeiten entnommen habe. Die Wichtigkeit der Straßen wird durch die Dicke der Linien in der Visualisierung dargestellt:

Screenshot Straßen werden in drei Klassen unterteilt

Diese Arbeit "begradigt" später die besonders wichtigen Straßen noch ein wenig - ein Arbeitsschritt, der in meiner Implementierung zwar vorgesehen, jedoch noch nicht implementiert wurde:

Screenshot Begradigung bedeutsamer Straßen - noch nicht implementiert

An dieser Stelle würden mehrere Polygone, die nun nicht mehr durch Straßen getrennt sind, zusammengefasst. Dadurch würden unter Umständen konkave Polygone entstehen. Deren Behandlung - beispielsweise durch Triangulation ist noch nicht implementiert, so dass solche Polygone entfernt werden. Dieser Schritt ist optional - wird er ausgeführt, sieht das Ergebnis beispielsweise so aus:

Screenshot optional: Entfernen weiterer Polygone

Anschließend werden die Polygone partitioniert, was dem "Errichten" von Gebäuden auf den einzelnen Häuserblocks entspricht:

Screenshot Partitionieren der Polygone - Errichten von Gebäuden

Daran schließt sich der vorerst letzte Schritt der Generierung an: die Straßen höherer Ordnung (Hauptstraßen und Magistralen) werden zu Straßenzügen zusammengefasst - in der Visualisierung erkennt man das an der gleichen Färbung von Straßenabschnitten:

Screenshot Zusammenfassung von Straßenabschnitten wichtiger Straßen

Hier noch kurz ein Beispiel für das Ergebnis des beschriebenen Vorgehens wenn ein rundes Gitter als Ausgangspunkt gewählt wurde:

Screenshot Ergebnis der Generierung mit einem runden Gitter als Ausgangspunkt

Das Ergebnis des Gererierungsprozesses kann anschließend als GeoJson exportiert und in diverse online verfügbare Werkzeuge zur Bearbeitung von Geodaten (Beispiele) importiert werden:

Screenshot Visualisierung eines entstandenen GeoJson-Datensatzes

Artikel, die hierher verlinken

Beliebige äußere Form für generierte Stadtpläne

25.07.2021

Ich habe den neulich vorgestellten Generator für beliebige Stadtpläne, der als Ausgabeformat unter anderem GeoJson unterstützt ein wenig erweitert

Generator für LDIF Dateien zum Test von Verzeichnisdiensten

15.07.2021

Ich hatte hier in letzter Zeit verschiedentlich auf einen Docker-Container hingewiesen, der es erlaubt, schnell einfache LDAP-Tests durchzuführen. Ich habe das Repository inzwischen geforkt und einige weitere Beispieldatensätze aus dem Internet eingefügt - das reichte mir aber noch nicht...

Alle Artikel rss Wochenübersicht Monatsübersicht Github Repositories Gitlab Repositories Mastodon Über mich home xmpp


Vor 5 Jahren hier im Blog

  • Certstream, InfluxDB, Grafana und Netflix

    16.04.2019

    Nachdem ich vor kurzem über mein erstes Spielen mit dem certstream berichtete, habe ich weitere Experimente gemacht und die Daten zur besseren Auswertung in eine InfluxDB gepackt, um sie mit Grafana untersuchen zu können.

    Weiterlesen...

Neueste Artikel

  • Die sQLshell ist nun cloudnative!

    Die sQLshell hat eine weitere Integration erfahren - obwohl ich eigentlich selber nicht viel dazu tun musste: Es existiert ein Projekt/Produkt namens steampipe, dessen Slogan ist select * from cloud; - Im Prinzip eine Wrapperschicht um diverse (laut Eigenwerbung mehr als 140) (cloud) data sources.

    Weiterlesen...
  • LinkCollections 2024 III

    Nach der letzten losen Zusammenstellung (für mich) interessanter Links aus den Tiefen des Internet von 2024 folgt hier gleich die nächste:

    Weiterlesen...
  • Funktionen mit mehreren Rückgabewerten in Java

    Da ich seit nunmehr einem Jahr bei meinem neeun Arbeitgeber beschäftigt und damit seit ungefähr derselben Zeit für Geld mit Python arbeite, haben sich gewisse Antipathien gegenüber Python vertieft (ich kann mit typlosen Sprachen einfach nicht umgehen) - aber auch einige meiner Gründe, Python zu lieben sind ebenso stärker geworden. Einer davon ist der Fakt, dass eine Methode in Python mehr als einen Wert zurückgeben kann.

    Weiterlesen...

Manche nennen es Blog, manche Web-Seite - ich schreibe hier hin und wieder über meine Erlebnisse, Rückschläge und Erleuchtungen bei meinen Hobbies.

Wer daran teilhaben und eventuell sogar davon profitieren möchte, muß damit leben, daß ich hin und wieder kleine Ausflüge in Bereiche mache, die nichts mit IT, Administration oder Softwareentwicklung zu tun haben.

Ich wünsche allen Lesern viel Spaß und hin und wieder einen kleinen AHA!-Effekt...

PS: Meine öffentlichen GitHub-Repositories findet man hier - meine öffentlichen GitLab-Repositories finden sich dagegen hier.