QGis: Nicht befahrene Straßen ermitteln

Motivation/Ziel

Vor einiger Zeit bin ich auf die Seite wandrer.earth gestoßen. Die Seite beschreibt sich selbst so:

Wandrer.earth ist ein Erkundungsspiel, bei dem du gewinnst, indem du an Orte gehst, an denen du noch nie zuvor gewesen bist.

In der Praxis läuft das so ab, dass man seine Fahrradtouren oder Wanderungen aufgezeichnet, zu Strava hochlädt und sie auf Wandrer auswertet. Ziel ist es, in der Umgebung möglichst viel Straßen abzufahren bzw. abzulaufen und sich mit anderen, die dasselbe machen zu vergleichen. Wandrer bietet dazu Unterstützung bei der Planung von Touren an, auf denen man möglichst noch nicht erkundetet Gegenden aufsucht.

Da ich meine mit dem Fahrrad gefahrenen Strecken zwar aufzeichne, aber nicht zu Strava hochlade, habe ich nach einer anderen Möglichkeit gesucht, die noch nicht befahrene Straßen in meiner Umgebung zu ermitteln und zu visualisieren. Wie bei anderen ähnlich gelagerten Auswertungen boten sich dafür zwei Ansätze an: automatisiert mit GDAL/OGR-Tools oder eher manuell mit QGis. Hier beschreibe ich die Vorgehensweise mit QGis, ohne dabei zu sehr in die Details zu gehen.

Vorgehensweise

Benötigte Daten:

  • GPX-Dateien mit den Tracks der gefahrenen Strecken.
  • Grenzpolygon des zu betrachtenden Gebiets, z.B. Stadt- oder Landkreisgrenze, in einem für QGis geeigneten Format.
  • Straßen in diesem Gebiet in einem für QGis geeigneten Geoformat.

Vorgehensweise:

  • Mit QGis wird ein Puffer um die GPX-Tracks erstellt, der so groß ist, dass er die OSM-Wege der befahrenen Straße abdeckt.
  • Die Straßen werden auf das Gebiet außerhalb des Puffers beschnitten

Grenzpolygon erstellen

Wenn bereits eine Geodatei mit dem Grenzpolygon vorhanden ist, genügt es dieses in einen Layer zu laden. Andernfalls kann das Polygon mit Hilfe des QGis-Plugins QuickOSM erstellt werden. Für eine Stadt- oder Landkreisgrenze eignet sich dafür diese Overpass-Abfrage:

  [out:xml][timeout:90];
  rel["boundary"="administrative"]["de:amtlicher_gemeindeschluessel"~"09775135|08421000"];
  (._;>;);
  out body;

Von den erzeugten Layern wird nur der Polygon-Layer für die weitere Bearbeitung benötigt. Der Layer wird nachfolgend als Grenzpolygon bezeichnet.

Straßen von OpenStreetMap laden

Die Straßen können von OpenStreetMap herunter geladen werden. Dies geschieht ebenfalls mit QuickOSM und einer Overpass-Abfrage wie dieser:

  area["de:amtlicher_gemeindeschluessel"~"09775135|08421000"]->.a;
  way(area.a)["highway"]["name"]->.w;
  way.w[highway~"footway|service|steps"]->.p;
  way.w[highway="footway"][bicycle~"^yes|^designated"]->.f;
  (way.w[access~"^private|^no"];
   way.w[vehicle~"^private|^no"];
   way.w[bicycle="no"];)->.a;
  (.w; - .p;);
  (._; - .a;);
  (._; .f;);
  (._; >;);
  out geom;

Das Ergebnis dieser Abfrage wird im Layer Straßen abgelegt.

GPX-Tracks in einen Layer laden und zuschneiden

QGIS kann nicht mehrere GPS-Dateien in einen Layer laden. Zwar gibt es Erweiterungen wie den Batch GPS Importer, die genau das versprechen – unter Debian scheitert die Nutzung jedoch oft an fehlenden Abhängigkeiten (Fehler ModuleNotFoundError: No module named 'PyQt5.QtWebKit').

Eine Alternative bietet die Erweiterung GPS Segment Importer. Diese kann mehrere GPX-Dateien auf einmal importieren, legt aber für jeden GPX-Track einen eigenen Layer an. Zudem werden die Tracks in einzelne Segmente unterteilt – jeweils ein Segment zwischen zwei benachbarten Trackpunkten. Das führt zwar zu einer großen Anzahl an Segmenten, die jedoch danach beim Erstellen des Puffers wieder zusammengeführt werden.

Workflow

  1. Zusammenführen: Mit dem Werkzeug „Vektorlayer zusammenführen“ lassen sich die einzelnen Tracklayer zu einem einzigen Layer kombinieren.
  2. Zuschneiden: Anschließend kann der resultierende Layer mit dem Werkzeug „Zuschneiden“ auf das Grenzpolygon beschränkt werden.

Puffer um die Tracks erstellen

Mit dem Werkzeug „Puffer“ lässt sich ein Puffer um die importierten Tracks erzeugen. Der Abstand wird in Grad angegeben. Ein Wert von 0,0001 hat sich in der Praxis bewährt. Die Option „Ergebnis auflösen“ sorgt dafür, dass die einzelnen Puffer zu einem einzigen Multipolygon vereinigt werden.

Tracks (rot) mit Puffer (blau)

Tracks (rot) mit Puffer (blau)

Straßen auf Abschnitte außerhalb des Trackpuffers beschneiden

Standardansatz mit dem Werkzeug „Differenz“

Das Werkzeug „Differenz“ extrahiert aus einem Layer (z. B. Straßen) alle Objekte, die nicht im Überlagerungslayer (Puffer) liegen. Objekte, die den Puffer schneiden, werden aufgeteilt – der außerhalb liegende Teil landet im Ergebnis-Layer. Das Ergebnis sind also genau die Wegsegmente, die mehr als den Pufferabstand von einem der Tracks entfernt sind.

Nachteil: Das Werkzeug „Differenz“ ist extrem langsam.

Optimierungen:

  • Die Geometrie des Puffers mit „Vereinfachen“ vereinfachen.
  • Mit „Räumlichen Index erzeugen“ einen Spatial Index für den Layer anlegen.

Schnellerer Alternativansatz

Deutlich bessere Performance erreicht man mit diesem Workflow:

  1. Trackpuffer aus dem Grenzpolygon ausschneiden (Werkzeug „Differenz“).
  2. Straßen auf das resultierende Multipolygon zuschneiden (Werkzeug „Zuschneiden“).

Vorteile:

  • Geht erheblich schneller.
  • Liefert das gleiche Ergebnis wie der Standardansatz.

Grenzpolygon nach dem Ausschneiden des Puffers (grün)

Grenzpolygon nach dem Ausschneiden des Puffers (grün)

Nicht befahrene Straßen (blau)

Nicht befahrene Straßen (blau)

Ergebnis bei der Planung nutzen

Wie man den Layer mit den fehlenden Straßen für die Planung von Ausfahrten nutzt, hängt von dem verwendeten Tool und dem Aufwand, den man treiben möchte, ab. Ich habe den Layer im GPKG-Format gespeichert und nutze GeoServer, um daraus Kartenkacheln zu erzeugen und im lokalen Netz zu verteilen. Damit kann ich die fehlenden Straßen als Overlay in Tools wie QMapShack oder bikerouter.de nutzen.

Nicht befahrene Straßen als Bikerouter-Overlay

Nicht befahrene Straßen als Bikerouter-Overlay