QGIS-Tipp: Flussbreiten ermitteln, aber wie? Update.

Nach dem erstaunlichen Echo* auf meinen vorgestrigen Beitrag „QGIS-Tipp: Flussbreiten ermitteln, aber wie?“ [1] hier nun noch die angekündigte Ergänzung. Am eigentlichen Algorithmus ändert sich gar nichts, der bleibt wie beschrieben. Um jedoch noch bessere Ergebnisse zu erhalten, macht es Sinn, sich noch mal die Generierung des Fluss-Mittellinie genauer anzuschauen. Ziel war es, bessere Mittellinien zu erzeugen, also am besten aus den Uferlinien direkt und nicht aus einem Datenbestand anderer Herkunft und Erfassungsgenauigkeit. Die gesuchte Funktion ist die „Centerline“. Ich habe etliche Funktionen in verschiedenen Plugins getestet, die meisten schlugen aber leider fehl, ob es an mir lag oder meinen Daten …, ich weiß nicht. Erfolg hatte ich mit der „Skeleton“-Funktion im Plugin „BecaGIS“ [2] angewendet auf das Gewässer-Polygon. Kleine „Faserstücke“ an den Rändern wurden mittels Selektion (z. B. $length < 40 eleminiert). Die Erzeugung dieser Mittellinie ist dem Schritt 1 zuzuordnen.

Die so verbesserte Mittellinie führt marginal zu besseren Ergebnissen, die Senkrechten auf der Mittellinie stehen mitunter etwas rechtwinkliger zu den Uferlinien (vgl. Screenshot 6).

Screenshot 1: Berechnung der Mittellinie mit der „Skeleton“-Funktion. Die kleinen „Faserstücke“ (Gelb) an den Rändern wurden mittels Selektion (z. B. $length < 40 eleminiert). Übrig blieb die neue Mittellinie (Rot)
Screenshot 2: Unterschiedliche Fluss-Mittellinien aus OSM (Blau) und berechnet aus den Ufergrenzen mit der „Skeleton“-Funktion (Grün)
Screenshot 3: Ergebnis für die OSM-Variante (Blau)
Screenshot 4: Ergebnis für die „Skeleton“-Variante (Grün)
Screenshot 5: Ergebnisse für beide Varianten OSM-(Blau) und „Skeleton“ (Grün) mit marginal besseren Ergebnissen bei „Skeleton“
Screenshot 6: Die Senkrechten auf der Mittellinie stehen bei „Skeleton“ (Grün) etwas rechtwinkliger zu den Uferlinien

Hinweis:
Ein wichtiger Tipp nach der Verlässlichkeit der Uferlinien wurde noch in Kommentar 3 in [1] gegeben, also welchen Ursprung haben diese und was verbirgt sich wirklich dahinter. Ist es das mittlere Wasser, quasi der Durchschnitt z. B. im Jahr oder das Ergebnis einer Vermessung zu einem zufälligem Datum oder …

Und hier das Ganze noch mal als Galerie zum Blättern:

* … innerhalb von ca. 48h:
– im Twitter ca. 9453Aufrufe, 28 Retweets, 146 Likes, 30 neue Follower :-)
– FaceBook: 166Likes, 50x geteilt

[1] … https://geoobserver.wordpress.com/2023/03/27/qgis-tipp-flussbreiten-ermitteln-aber-wie/
[2] … https://plugins.qgis.org/plugins/becagis/

QGIS-Tipp: Flussbreiten ermitteln, aber wie?

Bitte beachtet auch das Update zu diesem Beitrag [5].

Vor kurzem gab es in den Kommentaren des Beitrages „QGIS-Tipp: Länge und Breite eines Polygons?“ [1] die Frage nach der Ermittlung von Flussbreiten. Angepingt durch diese Frage habe ich mich mal mit einer Lösung beschäftigt und bin in [2] und [3] fündig geworden, um dann gleich mal folgendes Kochbuch für QGIS am Beispiel der Saale in Halle (Saale) zu schreiben:

Schritt 1: Die nötigen Ausgangsdaten besorgen, hier die Uferlinien (entnommen aus der Digitalen Stadtgrundkarte der Stadt Halle) und Fluss-Geometrien (entnommen aus den OSM-Daten mittels Overpass Turbo Export gesucht nach „river“) – diese werden als annähernde Mittellinien des Flusses angenommen. Es muss übrigens nicht die exakte Mittellinie sein, aber, je mittiger, desto besser, weil der rechte Winkel zum Ufer insbesondere in Kurven besser erreicht wird.

Schritt 2: Flussmitte „Auflösen“ (dissolve), um einen durchgehenden Linienzug zu generieren und somit nur einen Start-Punkt für die Stützstellen-Interpolation in Schritt 4 zu haben

Schritt 3: Glätten Flussmitte-Mittellinie mit der Funktion „Glatt“ (smooth), ich habe mit vier Iterationen getestet

Schritt 4: Punkte alle 100m auf Mittellinie mittels „Punkte entlang einer Geometrie“ erzeugen

Schritt 5: Senkrechte Geometrien auf Punkten berechnen mittels „Geometrie nach Ausdruck“ mit einer Weite, die größer als angenommene maximale Breite (hier 80m) ist, hier mit dem Ausdruck aus [3].

extend(
   make_line(
      $geometry,
       project (
          $geometry, 
          80, 
          radians("angle"-90))
        ),
   80,
   0
)

Schritt 6: „Zuschneiden“ an Ufergrenzen (Clip) und
Schritt 7: Symbolisieren mit Pfeilen und Bemaßung

Optional dann Schritt 8: Freuen, nach Verbesserungen suchen und ggf. ein QGIS-Model draus machen oder am Besten einfach mal ein vollkommen dynamisches Modell mit dem Geometrie-Generator erzeugen, also quasi OnTheFly-Generieren ohne Zwischenthemen? Und vielleicht kann man noch nach [4] die Mittellinie des Flusses optimieren? Ich werde es testen.

Und weiter geht es noch mit der Analyse, hier die breiteste Stelle der Saale in Halle am Wehr in Trotha:

. . . und die Prüfung der Ergebnisse mit dem Messwerkzeug – sogar an den Inseln funktioniert es perfekt. Hier gerundete 32m + 57m = 89m:

Und hier das Ganze noch mal als Galerie zum Blättern:

Mein Projekt als Demo „QGIS_WidthOfTheRiver.zip“ zum Download (17,1 MByte)

[1] … https://geoobserver.wordpress.com/2023/03/24/qgis-tipp-lange-und-breite-eines-polygons/#comments
[2] … https://gis.stackexchange.com/questions/425459/calculating-width-of-unusually-shaped-polygon-in-qgis
[3] … https://gis.stackexchange.com/questions/380361/creating-perpendicular-lines-on-line-using-qgis
[4] … https://geoobserver.wordpress.com/2021/09/22/qgis-tipp-mittellinie-zwischen-zwei-anderen-linien/
[5] … https://geoobserver.wordpress.com/2023/03/30/qgis-tipp-flussbreiten-ermitteln-aber-wie-update/

Released: Graphhopper 7.0

Am 14. März veröffentlichte die Graphhopper-Community in ihrem Blogeintrag „GraphHopper Routing Engine 7.0 Released“ [1] die neue Version 7.0 des bekannten freien Routing-Systems.

Screenshot: Blogeintrag mit der Graphhopper 7.0 Ankündigung (Quelle [1])

Die wichtigsten Neuerungen betreffen:

  • Verbesserte Umsetzung von Abbiegebeschränkungen
  • Anpassbares Routing
  • Benutzerdefinierte Bereiche
  • und … viele andere Verbesserungen und Bugfixes

Eine detaillierte Liste der Neuerungen findet Ihr auf GitHub [2]

[1] … https://www.graphhopper.com/blog/2023/03/14/graphhopper-routing-engine-7-0-released/
[2] … https://github.com/graphhopper/graphhopper/releases/tag/7.0

(py)QGIS-Tipp: Löschen doppelter Geometrien

Ihr kennt möglicherweise schon die QGIS-Videos auf dem Youtube-Kanal von pyQGIS [1] (@PyQgis). Großartiges Material, z. T. komplexe Inhalte, aber immer einfach erklärt. Einige davon werde ich hier mit freundlicher Genehmigung als Beitrag bringen, seid gespannt! Nach dem „Herz für Chemnitz“ [2] kommt heute „Doppelte Geometrien löschen“ mit Python und QGIS-Bordmitteln [3]. Danke pyQGIS alias Ivo Partschefeld!

[1] … https://www.youtube.com/@pyqgis
[2] … https://geoobserver.wordpress.com/2022/10/20/driveaheart-challenge-ein-herz-fur-deine-stadt-mit-qgis/
[3] … https://www.youtube.com/watch?v=x13Hu7I-RNQ
[4] … https://twitter.com/PyQgis/status/1620490264103251968

QGIS-Tipp: Das „Spatial Filter“ Plugin

Von @cartocalypse.tif (@WhereGroup_com) kam Ende 2022 per Tweet [1] der Hinweis zu einem neuen QGIS-Plugin, dem „Spatial Filter“ [2] oder „Räumlicher Filter“ im QGIS-Plugin-Repository [3]. Ein wunderbares Tool, um mal „auf die Schnelle“ durch mehrere Layer via Polygon (frisch digitalisiert oder per selektierter Objekte eines vorhandenen Layers) die Objekte aller im Projekt eingebundenen Layer zu selektieren. Als räumliche Optionen stehen „schneidet“. „innerhalb“ und „schneidet nicht“ zur Verfügung. In der Auswahl werden per Default alle Layer des Projektes genutzt, per Optionen können jedoch auch Layer ausgeschlossen werden. Ich hab’s getestet: Einfach, selbsterklärend, sinnvoll, MUST HAVE!. Danke Wheregroup, danke @cartocalypse.tif!

Animation: Mein Test für die Optionen „schneidet“. „innerhalb“ und „schneidet nicht“

Hier der Original-Tweet [1]:

[1] … https://twitter.com/cartocalypse/status/1605174977749213184
[2] … https://github.com/WhereGroup/spatial_filter
[3] … https://plugins.qgis.org/plugins/spatial_filter/

QGIS-Tipp: Objekte nach Abstand einfärben

Screenshot: MeinTestprojekt [2], das Zentrum bei der Pauluskirche (Einfärbung nach Abstand siehe Beschreibung)

Innerhalb der #30DayMapChallenge hat eurojam eine coole Visualisierung veröffentlicht, nämlich abhängig von der Entfernung zu einem Punkt die Objekte einzufärben. Ich habe versucht, es nachzuvollziehen und … es klappt. Für alle, die diesbezüglich ein bisschen Hilfe brauchen, hier das Ganze mal etwas untersetzter. Ich habe die Gebäude des OSM-Projektes, hier der Layer „osm_buildings_test_2398“ genutzt, dazu einen Layer „center“ mit der Spalte „name“ und dem Eintrag „Test“. Dann lautet der adaptierte und entscheidende String für die Füllfarbe:

color_hsv(scale_linear(distance( geometry(get_feature('center','name','Test')),$geometry),0,1000,100,0), 100, 100)

Aus dem Layer „center“ wird also in der Spalte „name“ der Eintrag „Test“ gesucht. Zu dessen Geometrie (get_feature)wird die Entfernung (distance) zur aktuellen Gebäude-Geometrie ($geometry) des Datensatzes der Gebäude ermittelt und entsprechend dem aktuellen Abstand eingefärbt (colore_hsv) über einen linearen Farbverlauf (scale_linear). So einfach … Alles klar? Schaut Euch die Syntax der Funktionen get_feature, distance, scale_linear und color_hsv an, es wird klarer, versprochen ;-)
Um es einfacher nachvollziehen zu können, könnt Ihr gern mein Testprojekt [2] nutzen.

Animation: Vier Center-Standorte und das eingefärbte Ergebnis

Danke eurojam, hier der Original-Tweet [1]:

[1] … https://twitter.com/27aea577f17d4c4/status/1591081607108390913
[2] … https://www.geoObserver.de/Download/QGIS_Center_Building_Demo1.zip

QGIS-Tipp: Spatial SQL

Screenshot: Tweet mit dem Spatial SQL Spickzettel von Mo Sarwat (Quelle [3])

Wer mit GIS (hier QGIS) arbeitet, kommt bei Datenabfragen irgendwann nicht mehr um SQL und räumliche SQL-Abfragen herum. Einfache Hilfsmittel zum Einstieg findet Ihr z. B. in den Vortragsfolien von Martin Werner [1] und in den Spatial SQL Spickzettel von Mo Sarwat (@MoSarwat) [2], [3]. Viel Spaß beim Ausprobieren.

[1] … https://www.martinwerner.de/teaching/geoinf/files/lecture_04.pdf
[2] … https://twitter.com/MoSarwat/status/1571910560471732225
[3] … https://twitter.com/MoSarwat/status/1571973081111105536

QGIS-Tipp: Extraktion gemeinsamer Grenzen und einseitiger Puffer

Wer wissen möchte, wie man „eine gemeinsame Grenze zwischen benachbarten Verwaltungsregionen extrahiert und eine Pufferzone auf jeder Seite entlang der Grenze berechnet“, sollte sich das QGIS-Video „Extracting Shared Border and One-Sided Buffers in QGIS“ [1] von Ujaval Gandhi (@spatialthoughts) anschauen.

Hier der Original-Tweet [2]:

[1] … https://www.youtube.com/watch?v=YRcrxB3zNhw
[2] … https://twitter.com/spatialthoughts/status/1544609803691266048

QGIS-Tipp: Straßenbreiten automatisch berechnen?

Neulich las ich im Tweet [1] von Ujaval Gandhi (@spatialthoughts) einen interessanten Ansatz, wie man die Straßenbreite bei Straßenpolygonen mit QGIS berechnen/schätzen kann? Beim seinen Tests mit einigen Dummy-Daten kam er auf einen relativ einfachen Ausdruck:

average_road_width = 2 * $area / $perimeter

Er bat darum, diesen Ausdruck mal an realen Daten zu testen, ich habe es mit ein paar realen Straßen im halleschen Paulusviertel gemacht, hier die Ergebnisse. Aus meiner Sicht, trifft der Ansatz erstaunlich gut, die realen Straßenbreiten sind meist etwas größer, der Unterschied ist aber eher klein. Hinweis: Bei Unterbrechungen der Straßen wird der Wert verfälscht, weil sich dadurch der Umfang vergrößert, also besser immer den gesamten Straßenzug betrachten.
Wenn man das Ganze dann mal mit einen großen Menge von Straßen durchführt, die Differenzen und deren Durchschnitt ermittelt, lohnt sich ggf. auch noch ein Korrekturfaktor, m. E. irgendwo zwischen 0.95 … 1.05?

Screenshot: Mein Test – grün: berechnete Breiten, schwarz: gemessene Breiten

Hier der Original-Tweet [1], weitere Lösungsmöglichkeiten findet Ihr in den Antworten im Tweet:

[1] … https://twitter.com/spatialthoughts/status/1534224294016090113

QGIS-Tipp: Zusammengefasstes Umringspolygon

via @totofiandaca #qgis #switch2qgis #geometrygenerator #gistribe #fossgis #foss4g #opensource #spatial #mapping #geospatial #gis #geo #geoObserver

Manchmal sind diese einfachen Dinge! Wie Ihr das zusammengefasste Umringspolygon eines Flächenthemas einfach mit dem Geoemtriegenerator erzeugt und Euch somit einen so oft eingefügten zweiten Layer spart, zeigt Euch Totò Fiandaca (@totofiandaca) in seinen Tweets [1], [2]. Danke Totò!

buffer(collect($geometry),0)

[1] … https://twitter.com/totofiandaca/status/1535230932885680129
[2] … https://twitter.com/totofiandaca/status/1535688403471179776