OpenStreetMap als Fallbeispiel einer Datenanalyse
OpenSchoolMaps.ch — Freie Lernmaterialien zu freien Geodaten und Karten
Stefan Keller, Rapperswil, Juni 2026
Dies ist ein Workshop-Tutorial (ein digitales Lernobjekt) für Interessierte im Fach Informatik (Data Engineering inklusive Sekundarstufe II/Maturand:innen) mit eigenständigen Lerneinheiten, das dafür konzipiert ist, den selbstgesteuerten Lernprozess zu unterstützen. Dabei geht es um das Modellieren, Abfragen und Prüfen von Geodaten in einem Quartier am Beispiel von Street Art, Restaurants und Trottoirs aus OpenStreetMap. Die Bearbeitungsdauer beträgt ca. 3 Stunden.
Graffiti als Street Art mit Strassen-Restaurant. (Quelle: Generated by AI / Gemini)
Einleitung
OpenStreetMap (OSM) ist das "Wikipedia der Geodaten" – eine frei verfügbare, kollaborativ erstellte Weltkarte. Mit über sieben Millionen registrierten Nutzer:innen bildet sie das Fundament für fast alle gängigen Navigationsanwendungen wie Garmin, Apple Maps oder Komoot. Allein in der Schweiz tragen täglich über 100 Personen Informationen zu Strassen, Gebäuden, Restaurants und Tausenden weiteren Objekten bei.
Doch was auf der Karte wie ein nahtloses System erscheint, ist technisch gesehen eine komplexe Herausforderung der Datenanalyse. Angenommen, wir wollen ein eigenes Projekt starten und Street Art im Quartier kartieren: Wie speichern wir solch vielfältige reale Objekte in einer Datenbank? Wie stellen wir präzise Abfragen, und woran erkennen wir, ob die Daten vollständig sind?
Hier setzt unser Workshop an. Die Leitfrage lautet: Wie gut sind Street Art, Restaurants und Trottoirs im Quartier in OSM tatsächlich erfasst?
Um diese Frage zu beantworten, tauchen wir in das Thema Data Engineering ein. Wir ergründen, wie reale Gegebenheiten in OSM modelliert werden, wie daraus eine nutzbare Datenstruktur entsteht und wie wir diese mittels SQL abfragen und kritisch auf Qualität prüfen.
Nach dem Workshop sind die Teilnehmenden in der Lage, Geodaten aus OpenStreetMap souverän zu modellieren, mit SQL zu extrahieren und ihre Qualität zu bewerten.
OpenStreetMap als passendes Fallbeispiel
OSM ist kein gewöhnliches Datenbanksystem. Es verwendet ein flexibles Modell, bei dem die Bedeutung eines Objekts nicht durch feste Tabellenspalten definiert wird, sondern durch freie Schlüssel-Wert-Paare. Schlüssel-Wert-Paare werden Tags genannt. Das macht OSM zu einem interessanten Fallbeispiel für die Datenanalyse, weil es grundlegende Fragen der Datenverwaltung aufwirft:
-
Wie bildet man ein flexibles, semi-strukturiertes Schema in ein strukturiertes Schema einer Datenbank ab?
-
Wie schreibt man SQL-Abfragen auf einem solchen Datenmodell?
-
Was ist Datenqualität, und wie lässt sie sich automatisiert prüfen?
Voraussetzungen
-
Grundlagen Datenbanken: Konzept von Tabellen, Spalten, Primärschlüssel
-
Grundlagen SQL:
SELECT,FROM,WHERE, einfache Filterung -
Grundlagen OSM: Verständnis, was OpenStreetMap ist (kurze Demo oder dieses Tutorial genügt)
-
Grundlagen Geovisualisierung: Kartenerstellung z.B. mit DataWrapper, uMap oder QGIS
|
Der rote Faden
Dieser Kurs hat folgenden Ablauf: Wir starten bei der realen Welt und arbeiten uns Schritt für Schritt bis zur automatisierten Qualitätsprüfung und Visualisierung vor.
Realwelt → OSM-Objekt → Tags & Geometrie → Strukturiertes Modell → SQL-Abfrage → Qualitätsprüfung → Visualisierung
Die Kernidee: Reale Objekte fallen nicht automatisch in saubere Tabellen. Erst durch bewusste Modellierungsentscheidungen entstehen aus flexiblen Tags und Geometrien abfragbare Datenbankstrukturen.
Für jeden Schritt gibt es eine Lerneinheit, die jeweils offene Aufgabenstellungen enthalten, teilweise gefolgt von einem Tipp.
Wichtige Konzepte
-
Entität: Ein Street-Art-Objekt, ein Restaurant, ein Trottoirabschnitt
-
Attribut:
name,amenity,tourism,cuisine,opening_hours,surface -
Geometrie: Punkt (
Node), Linie (Way), Fläche (geschlossenerWay) -
Schema-on-read: Ansatz, bei dem die Bedeutung eines Objekts nicht durch feste Tabellenspalten, sondern durch die Interpretation der Tags beim Lesen bestimmt wird
-
Normalisierung: Tags als eigene Key-Value-Tabelle statt vieler leerer Spalten
-
Semi-strukturierte Daten: Tags als
jsonb-Feld in PostgreSQL/PostGIS -
SQL-Abfrage:
WHERE tags→>'amenity' = 'restaurant' -
Datenqualität: Fehlende Tags, Dubletten, uneinheitliche Modellierung
Overpass API
In diesem Tutorial verwenden wir die Overpass-Schnittstelle. Dabei unterscheiden wir folgende vier:
-
Overpass API: Eine Schnittstelle (API), mit der man gezielt OpenStreetMap-Daten abfragen kann, ohne den riesigen OSM-Datensatz zuerst herunterladen zu müssen. (dev.overpass-api.de)
-
Overpass Turbo: Eine Webseite, auf der man Overpass-Abfragen schreiben, testen und die Ergebnisse direkt auf einer Karte sehen kann. (overpass-turbo.eu)
-
Overpass QL: Die Abfragesprache, mit der man der Overpass API mitteilt, welche OSM-Objekte man sucht, zum Beispiel Restaurants, Wege oder Gebäude.
-
Postpass: Ein ähnlicher Dienst wie Overpass API, aber mit SQL als Abfragesprache. (postpass.geofabrik.de)
Für alle Abfragen in diesem Workshop verwenden wir overpass-turbo.eu. Overpass Turbo ist eine webbasierte Oberfläche zum Abfragen von OSM-Daten. Normalerweise werden dort Abfragen in der Overpass Query Language (Overpass QL) geschrieben. Die Daten werden regelmässig aus OSM importiert.
Wir nutzen hier statt Overpass QL den Postpass-Server, der es erlaubt, SQL zu schreiben.
|
Um Postpass besser kennenzulernen, gibt es neben der offiziellen Postpass-Homepage auch ein OpenSchoolMaps-Tutorial zu "OpenStreetMap-Daten extrahieren mit SQL und Postpass". |
Das Untersuchungsgebiet: Seefeld (Zürich)
Als Beispiel-Bounding-Box verwenden wir das Quartier Seefeld in Zürich. In Spatial SQL wird diese Bounding Box wie folgt als Geometrie ausgedrückt:
ST_MakeEnvelope(8.5469, 47.3492, 8.5721, 47.3599, 4326)
Die vier Argumente folgen der Standard-Syntax (xmin, ymin, xmax, ymax), was in diesem Fall der Reihenfolge (MinLon, MinLat, MaxLon, MaxLat) entspricht (lat/lon bezeichnet Breitengrad und Längengrad, wobei die Breitengrade "die horizontalen Linien" auf dem Globus sind).
Die Zahl 4326 ist der SRID-Code (Spatial Reference ID) für das Koordinatensystem WGS 84, das von GPS und OSM verwendet wird. Für andere Quartiere können die Koordinaten entsprechend angepasst werden.
|
Wenn ihr den Kartenausschnitt in overpass-turbo auf das gewünschte Gebiet eingestellt habt, kann |
Lerneinheit 1 – Von der Realwelt zum OSM-Objekt
Dauer: ca. 30 Minuten
Lernziele
-
Den Unterschied zwischen einem realen Objekt und seiner digitalen Repräsentation erklären können.
-
Die OSM-Elemente Punkt (
Node), Linie (Way) und Fläche (WayoderRelation) kennen. -
Für ein gegebenes Realweltobjekt den passenden OSM-Typ und typische Tags bestimmen.
-
Erkennen, warum mehrere Modellierungsoptionen für dasselbe Objekt zu Datenqualitätsproblemen wie Dubletten führen können.
Entitäten in der realen Welt
Bevor wir über Datenbanken sprechen können, müssen wir klären, was wir eigentlich erfassen wollen. In einem Quartier gibt es unzählige Dinge: Wandmalereien, Restaurants, Strassen, Bäume, Briefkästen. In der Datenbanksprache nennt man solche eindeutig abgrenzbaren Dinge Entitäten.
Eine Entität ist ein eindeutig identifizierbares Objekt der realen Welt, das uns interessiert und über das wir Daten speichern wollen. Beispiel: ein Wandbild an der Hausfassade an der Seefeldstrasse in Zürich.
Ein Attribut ist eine Eigenschaft dieser Entität. Beispiel: Das Wandbild hat einen Titel, einen Standort und einen bekannten Künstler. Jede Entität ist einmalig und wird durch eine eindeutige ID unterschieden – auch wenn zwei Kunstwerke identische Attribute hätten.
Von der Entität zum OSM-Objekt
OSM kennt drei Grundtypen für die Geometrie eines Objekts: Punkte, Linien und Flächen. Die Wahl hängt davon ab, wie gross und wie ausgedehnt das Objekt in der Realität ist.
| Realweltobjekt | OSM-Typ | Begründung |
|---|---|---|
Street Art |
Node (Punkt) |
Kleines, punktförmiges Objekt ohne relevante Ausdehnung auf der Karte |
Restaurant |
Node (Punkt) |
Wenn Gebäudeumrisse nicht relevant sind oder in Einkaufszentren oder Hotels mit mehreren Restaurants |
Restaurant (mit Gebäude) |
Way oder Relation (Fläche) |
Flächen-Grundriss des Gebäudes |
Trottoir (an Strassenachse angehängt) |
Tag an einem Way |
Strassenachse mit |
Trottoir (Objekt mit eigener Geometrie) |
Way (Linie) |
Ein separat erfasster Gehweg neben der Strasse |
Restaurants sind in OSM also entweder als Punkt oder als Fläche erfasst – das müssen wir bei der Abfrage beachten. Es kann aber auch dazu führen, dass Restaurants doppelt erfasst werden, ein typisches Datenqualitätsproblem, das wir in Lerneinheit 5 untersuchen.
Aufgaben
Öffnet openstreetmap.org und navigiert zum Seefeld oder zu einem euch bekannten Quartier.
-
Findet je ein Beispiel für ein Street-Art-Objekt (
tourism=artwork), ein Restaurant (amenity=restaurant) und ein Trottoir (footway=sidewalkodersidewalk=*). -
Klickt auf das Objekt und notiert, welchen OSM-Typ es hat (
Node/Way). -
Welche Attribute (
Tags) sind angegeben? Welche fehlen eurer Meinung nach?
|
Mit dem Werkzeug Abfragen (Fragezeichen-Icon) auf openstreetmap.org lässt sich direkt auf ein Objekt klicken und dessen vollständige Tag-Liste ansehen – ohne den iD-Editor öffnen zu müssen. |
Lerneinheit 2 – OSM-Tags und Schema-on-read
Dauer: ca. 30 Minuten
Lernziele
-
Das Prinzip von Schema-on-write und Schema-on-read erklären und anhand von OSM illustrieren
-
Die Tag-Struktur
key=valuein OSM verstehen und gebräuchliche Tags benennen -
Die Konsequenzen flexibler Tagging-Systeme für Abfragen und Datenqualität einschätzen
Wie OSM Objekte beschreibt: Tags
In OSM wird jedes Objekt über Tags beschrieben – einfache Schlüssel-Wert-Paare der Form key=value. Ein Street-Art-Objekt könnte zum Beispiel – nebst der Lage – folgende Tags tragen:
tourism = artwork name = Seefeld-Mural artwork_type = mural artist_name = unbekannt start_date = 2021
Es gibt keine Pflicht, bestimmte Tags zu setzen – ausser dem Haupttag, der das Objekt grundsätzlich klassifiziert (hier: tourism=artwork). Alle weiteren Tags sind optional (Nebentags) und hängen davon ab, ob jemand die Zeit und das Wissen hatte, sie einzutragen.
Schema-on-write und Schema-on-read
In einer klassischen relationalen Datenbank legt man das Schema vor der Dateneingabe fest: Man definiert Tabellen und Spalten, und jede Zeile muss sich an diese Struktur halten. Das nennt man Schema-on-write.
OSM hingegen folgt dem Prinzip Schema-on-read: Es gibt kein fixes Spaltenschema. Die Bedeutung eines Objekts ergibt sich erst beim Lesen – durch die Interpretation der Tags. Das macht OSM extrem flexibel, aber auch weniger konsistent.
| Merkmal | Schema-on-write (klassisch) | Schema-on-read (OSM-Stil) |
|---|---|---|
Schema |
Vor dem Einfügen definiert |
Beim Lesen interpretiert |
Flexibilität |
Gering – feste Spalten |
Hoch – beliebige Tags |
Konsistenz |
Garantiert durch die Datenbank |
Abhängig von den Kartierenden |
Abfragen |
Direkt auf Spalten |
Auf Schlüssel in einem Tags-Feld |
Fehlende Werte |
NULL in einer Spalte |
Tag fehlt vollständig |
Ein wichtiger Unterschied: Wenn ein Street-Art-Objekt kein Tag artist_name trägt, bedeutet das nicht, dass der Künstler unbekannt ist. Es bedeutet: Diese Information wurde noch nicht erfasst. Bei Datenqualitätsanalysen ist dieser Unterschied entscheidend.
Typische Tags unserer drei Objekte
| Objekt | Geometrie | Typische Tags | Häufig fehlend |
|---|---|---|---|
Street Art |
Punkt |
|
|
Restaurant |
Punkt oder Fläche |
|
|
Trottoir (Linie) |
Linie |
|
|
Trottoir (Attribut) |
Attribut an Strasse |
|
Detaileigenschaften fehlen ganz |
Street Art sind Kunstwerke an Hausfassaden, "Kunst am Bau", und gehören zur zeitgenössischen Kunst (vgl. Zürich: https://www.zuerich.com/de/kunst-kultur/kunst-im-oeffentlichen-raum/street-art). Sie sind eine spezielle Form von Kunst im öffentlichen Raum.
|
Kunst im öffentlichen Raum sind Werke wie Skulpturen, Wandbilder oder Installationen, die sichtbar und frei zugänglich an Orten wie Plätzen, Strassen, Parks oder an Gebäuden stehen (vgl. z.B. Zürich: https://www.zuerich.com/de/kunst-kultur/kunst-im-oeffentlichen-raum). Falls es keine Street Art in eurem Quartier gibt, können auch andere Kunstwerke untersucht werden. |
Aufgaben
Untersucht auf openstreetmap.org mehrere Restaurants im Seefeld oder in einem anderen Quartier:
-
Welche Tags tragen diese Restaurants? Erstellt eine Tabelle mit den gefundenen Keys.
-
Wie viele der gefundenen Restaurants haben einen
cuisine-Tag? Wie viele habenopening_hours? -
Diskutiert: Warum gibt es so grosse Unterschiede in der Tag-Vollständigkeit?
|
Das OSM-Wiki unter wiki.openstreetmap.org/wiki/Map_features listet alle gängigen Tags mit Beschreibungen und Beispielen – ideal als Referenz beim Vergleich verschiedener Objekte. |
Lerneinheit 3 – Strukturiertes Modell ableiten
Dauer: ca. 40 Minuten
Lernziele
-
Verstehen, warum OSM-Rohdaten nicht direkt für analytische SQL-Abfragen geeignet sind
-
Drei Modellierungsansätze vergleichen: breite Tabelle, normalisiert und Hybridmodell mit JSONB
-
Das Hybridmodell konzeptionell aufbauen und begründen
-
Den Begriff Normalisierung an einem konkreten Beispiel erklären
Das Problem: OSM-Rohdaten sind nicht direkt in GIS analysierbar
OSM-Rohdaten liegen im XML- oder PBF-Format vor und bestehen aus Nodes, Ways und Relations mit beliebig vielen Tags. Dieses Format eignet sich schlecht für analytische Fragen wie "Welche Restaurants ohne cuisine-Tag gibt es im Seefeld?".
Wir brauchen deshalb einen Datenbank-Transfer: Die OSM-Daten werden in eine relationale Datenbank importiert, wo wir sie mit SQL abfragen können. Genau das macht Postpass: Es importiert laufend aktuelle OSM-Daten in eine Datenbank (PostgreSQL/PostGIS) und macht sie über SQL zugänglich. Tags werden dabei als jsonb-Feld gespeichert.
Drei Modellierungsansätze
Wie bilden wir die flexiblen OSM-Tags auf eine strukturierte Datenbank ab? In technischen Worten: Wie ist die Schema-Abbildung?
OSM speichert alles in drei Elementtypen (Node, Way, Relation) mit beliebigen Tags. Eine GIS-Tabelle erwartet aber feste Spalten und einen klaren Geometrietyp. Die Schema-Abbildung muss unter anderem drei Fragen beantworten:
-
Welche Tabelle? — Das Haupt-Tag (
amenity=restaurant,highway=residential) bestimmt, wohin das Element gehört. -
Welche Geometrie? — Aus der Elementart und dem Kontext wird abgeleitet: Punkt, Linie oder Fläche. Manchmal ist es nötig, Elemente, die als Fläche erfasst sind, Punkten zuzuordnen – insbesondere bei Points of Interest (POI).
-
Welche Spalten? — Aus den vielen Sekundärtags werden nur die relevanten als Spalten übernommen; der Rest wird weggeworfen oder in einer JSON-Spalte aufbewahrt.
Es gibt mindestens drei grundsätzliche Ansätze. Postpass hat sich für Ansatz 3 (Hybridmodell) entschieden. Wer diese Diskussion abkürzen möchte, kann direkt zu Ansatz 3 und dann zu Lerneinheit 4 springen.
Ansatz 1: Breite Tabelle
Jeder mögliche Key wird zur eigenen Spalte:
feature(osm_id, osm_type, geom, amenity, tourism, name, cuisine,
opening_hours, website, phone, artwork_type, artist_name,
surface, width, ...)
Vorteil: Die Schema-Abbildung ist automatisch. Nachteil: Die meisten Felder sind NULL. Ein Street-Art-Objekt braucht keine cuisine-Spalte; ein Restaurant hat keinen artwork_type-Wert. Mit Tausenden möglicher OSM-Tags wäre die Tabelle absurd breit und kaum wartbar.
Dieser Ansatz ist nicht zu empfehlen – kann aber manchmal nicht vermieden werden. Das Problem sieht man anschaulich, wenn man Werkzeuge nutzt, die GeoJSON visualisieren – wie z.B. geojson.io – und von der JSON-Darstellung zur Tabellen-Darstellung wechselt.
Ansatz 2: Normalisierte Tabellen nach Themen
Es werden Entitätsklassen gebildet, mit denen die Welt strukturiert werden soll. Jeder Tabelle werden OSM-Elemente mit ausgewählten Tags zugeordnet.
building_polygon (
feature_id VARCHAR(20) PRIMARY KEY, -- z.B. N1234567890
osm_type TEXT, -- 'way', 'relation'
osm_id BIGINT,
name TEXT, -- direkt aus Tags extrahiert
category TEXT, -- z.B. Gebäude, Schule, Behörde
geom GEOMETRY(POLYGON)
)
street_line (
feature_id VARCHAR(20) PRIMARY KEY, -- z.B. N1234567890
osm_type TEXT, -- 'way'
osm_id BIGINT,
name TEXT, -- direkt aus Tags extrahiert
category TEXT, -- z.B. Fussweg, Strasse, Autobahn
geom GEOMETRY(LINESTRING)
)
poi_point (
feature_id VARCHAR(20) PRIMARY KEY, -- z.B. N1234567890
osm_type TEXT, -- 'node'
osm_id BIGINT,
name TEXT, -- direkt aus Tags extrahiert
opening_hours TEXT, -- gemäss OH spec. im Wiki
main_category TEXT, -- z.B. food
sub_category TEXT, -- aus Tag-Aggregationen zusammengestellt
geom GEOMETRY(POINT)
)
poi_polygon (
feature_id VARCHAR(20) PRIMARY KEY, -- z.B. N1234567890
osm_type TEXT, -- 'way', 'relation'
osm_id BIGINT,
name TEXT, -- direkt aus Tags extrahiert
main_category TEXT, -- z.B. food
sub_category TEXT, -- aus Tag-Aggregationen zusammengestellt
geom GEOMETRY(POLYGON)
)
... etc.
Vorteil: Keine NULL-Werte, korrekt normalisiert. Nachteil: Schema-Abbildung mit Informationsverlust, da nicht alle Tags und Werte abgebildet werden. Aufwändige Schema-Abbildung und wiederkehrende Anpassungen: Wann lohnt sich eine eigenständige Tabelle? Was gehört in main_category, was in sub_category – angesichts der grossen Menge an POI-Klassen?
Dieser Ansatz wurde z.B. im Projekt "Layercake" bzw. "OpenStreetMap Data in Layered GIS Format" der Firma Geofabrik gewählt. Die Postpass-SQL-Abfragen lassen sich gut an diese Datenmodelle anpassen, wobei die Tabellennamen angepasst werden müssen und alle →>-Operatoren durch normale Attribute mit dem =-Zeichen ersetzt werden müssen.
Ansatz 3: Hybridmodell
Ein Kompromiss: Die wichtigsten Attribute werden als eigene Spalten extrahiert, alle übrigen Tags als jsonb-Feld gespeichert.
geometrycollection_feature (
osm_type TEXT, -- 'node', 'way', 'relation'
osm_id BIGINT,
geom GEOMETRY, -- Koordinaten (PostGIS)
name TEXT, -- direkt aus Tags extrahiert
tags JSONB -- alle weiteren Tags als JSON-Objekt
)
Wir nennen die Tabelle geometrycollection_feature, da die Geometrie-Spalte alle drei Typen (Punkt, Linie, Fläche) aufnehmen kann.
Vorteil: Flexibel und vollständig – keine Tags gehen verloren, und häufig benötigte Felder wie name sind direkt abfragbar. Durch den JSONB-Typ lässt sich dennoch gezielt auf einzelne Tags zugreifen. Nachteil: SQL-Abfragen auf JSONB sind weniger intuitiv als auf normale Spalten, und die Datenqualität hängt weiterhin von den Kartierenden ab – die Datenbank erzwingt keine Konsistenz.
JSONB ist ein Datentyp in PostgreSQL für JSON-Daten in binärer, indizierbarer Form. Im Gegensatz zu einer reinen Textspalte kann PostgreSQL damit direkt auf einzelne JSON-Schlüssel zugreifen. Der Operator →>'key' liefert den Wert eines Schlüssels als Text. Der Operator ? 'key' prüft, ob ein Schlüssel überhaupt vorhanden ist.
Bei Postpass wurde dieser Ansatz gewählt, mit einigen Optimierungen (z.B. werden Node, Way, Relation mit N, W, R abgekürzt) und dadurch, dass aus der einzigen Tabelle geometrycollection_feature drei Tabellen verwendet werden mit dem entsprechenden Geometrie-Typ (point, linestring, polygon) im Tabellennamen. Das vollständige Schema von Postpass findet sich im Repository.
Aufgaben
Ihr habt soeben drei verschiedene Arten kennengelernt, OSM-Daten in einer Datenbank zu speichern. Ziel dieser Aufgabe ist es, die Ansätze anhand eines konkreten Beispiels zu vergleichen und zu beurteilen.
Ausgangssituation: Im Quartier Seefeld gibt es ein Restaurant mit folgenden OSM-Tags:
amenity = restaurant name = Kronenhalle cuisine = swiss opening_hours = Mo-Sa 12:00-24:00 website = https://kronenhalle.com phone = +41 44 251 66 69
-
Ansatz 1 – Breite Tabelle: Skizziert, wie dieser Datensatz in einer breiten Tabelle aussehen würde. Nehmt an, die Tabelle hat ausserdem die Spalten
tourism,artwork_type,artist_name,surface,width. Welche Felder wärenNULL? Was passiert, wenn ein neues Restaurant mit dem Tagwheelchair=yeshinzukommt? -
Ansatz 2 – Normalisierte Tabellen: In welche Tabelle aus dem Beispiel oben (
building_polygon,street_line,poi_pointoderpoi_polygon) würde das Restaurant einsortiert? Welche Tags gehen dabei verloren? -
Ansatz 3 – Hybridmodell: Zeigt, wie der Eintrag in der Tabelle
geometrycollection_featureaussehen würde. Schreibt dazu denname-Wert als direkte Spalte und die restlichen Tags als JSONB-Objekt. Wie würde eine SQL-Abfrage lauten, die alle Restaurants mit Küchenangabe (cuisine) sucht? -
Diskussion: Welcher Ansatz eignet sich am besten für den Workshop, und warum? Nennt je einen Vor- und einen Nachteil des Hybridmodells aus eurer eigenen Perspektive.
|
Das vollständige Postpass-Schema ist unter github.com/woodpeck/postpass-ops einsehbar – dort zeigt sich genau, welche Spalten und Views verfügbar sind, bevor wir eigene Abfragen entwerfen. |
Lerneinheit 4 – SQL-Abfragen formulieren
Dauer: ca. 35 Minuten
Lernziele
-
SQL-Abfragen auf Postpass-Views schreiben, die JSONB-Tags und Geometriefilter verwenden
-
Den JSONB-Operator
→>'key'und den Existenz-Operator? 'key'anwenden -
Abfragen auf overpass-turbo.eu mit der Postpass-Kopfzeile ausführen
|
Zur Erinnerung: Dieses Tutorial setzt voraus, dass man SQL-Grundlagen kennt. Für diejenigen, die SQL kennenlernen möchten, gibt es einen Hinweis im Kapitel Voraussetzungen oben. |
Aufbau einer Postpass-SQL-Abfrage auf overpass-turbo.eu
Postpass stellt unter anderem folgende Tabellen und Views (vorbereitete, kombinierte Tabellen) bereit:
-
postpass_point– Alle Objekte vom Typ Node (Punkte) -
postpass_line– Alle Objekte vom Typ Way, die Linien sind -
postpass_polygon– Alle Objekte vom Typ Way oder Relation, die Flächen sind -
postpass_pointpolygon– View der Vereinigung von Punkten und Flächen, nützlich z.B. für POIs wie Restaurants
Das vollständige Postpass-Schema findet sich unter diesem Link.
Postpass-Abfragen werden durch eine Kopfzeile eingeleitet, die den SQL-Server festlegt. Dann folgt die eigentliche SQL-Abfrage – ohne Strichpunkt am Schluss, wie es oft üblich ist.
{{data:sql,server=https://postpass.geofabrik.de/api/0.2/}}
SELECT ...
FROM ...
WHERE ...
Die Kopfzeile {{data:sql,server=…}} muss immer auf der ersten Zeile stehen. Sie ist eine Anweisung an overpass-turbo, die nachfolgende SQL-Abfrage an den Postpass-Server weiterzuleiten.
Abfrage 1: Street Art im Seefeld finden
{{data:sql,server=https://postpass.geofabrik.de/api/0.2/}}
SELECT
osm_id,
tags->>'name' AS name,
tags->>'artwork_type' AS artwork_type,
tags->>'artist_name' AS artist_name,
geom
FROM postpass_point
WHERE tags->>'tourism' = 'artwork'
AND geom && ST_MakeEnvelope(8.5469, 47.3492, 8.5721, 47.3599, 4326)
Der Operator && in PostGIS prüft, ob sich zwei Geometrien in ihren Bounding Boxes überlappen. Er ist sehr schnell, weil PostGIS dafür einen räumlichen Index verwendet. ST_MakeEnvelope(west, süd, ost, nord, srid) erstellt ein Rechteck aus den vier Eckkoordinaten.
Wenn der Tag name bei einem Objekt fehlt, liefert tags→>'name' den Wert NULL zurück – kein Fehler, sondern fehlende Information.
Abfrage 2: Restaurants mit Name und Küche
Restaurants kommen in OSM sowohl als Punkte als auch als Flächen vor. Deshalb verwenden wir den View postpass_pointpolygon, der beide vereint.
{{data:sql,server=https://postpass.geofabrik.de/api/0.2/}}
SELECT
osm_id,
osm_type, -- 'node' oder 'way' – zeigt Punkt vs. Fläche
tags->>'name' AS name,
tags->>'cuisine' AS cuisine,
geom
FROM postpass_pointpolygon
WHERE tags->>'amenity' = 'restaurant'
AND geom && ST_MakeEnvelope(8.5469, 47.3492, 8.5721, 47.3599, 4326)
Die Spalte osm_type zeigt, ob ein Restaurant als Node ('node') oder als Flächenway ('way') erfasst wurde. Kommen beide für dasselbe Gebäude vor, liegt eine Dublette vor.
Abfrage 3: Gehwege und Trottoirs
Trottoirs können auf zwei Arten in OSM modelliert sein: als eigene Linie mit footway=sidewalk oder als Attribut sidewalk=* an der Strasse selbst. Beide Varianten sollte die Abfrage erfassen.
{{data:sql,server=https://postpass.geofabrik.de/api/0.2/}}
SELECT
osm_id,
tags->>'footway' AS footway_typ,
tags->>'sidewalk' AS sidewalk_attribut,
tags->>'surface' AS belag,
geom
FROM postpass_line
WHERE geom && ST_MakeEnvelope(8.5469, 47.3492, 8.5721, 47.3599, 4326)
AND (
tags->>'footway' = 'sidewalk' -- eigene Trottoir-Linie
OR tags ? 'sidewalk' -- Strasse mit sidewalk-Attribut
OR tags->>'highway' = 'footway' -- allgemeiner Fussweg
)
Der Operator ? 'key' gibt TRUE zurück, wenn der JSON-Schlüssel im Tags-Objekt vorhanden ist – unabhängig davon, welchen Wert er hat. Das ist nützlich, wenn wir nur wissen wollen, ob eine Information erfasst wurde.
Aufgaben
Schreibt auf overpass-turbo.eu eine eigene Postpass-SQL-Abfrage, die folgende Frage beantwortet: Welche Restaurants im Seefeld haben sowohl einen Namen als auch eine angegebene Küche (cuisine)?
Vorlage:
{{data:sql,server=https://postpass.geofabrik.de/api/0.2/}}
SELECT osm_id, tags->>'name' AS name, tags->>'cuisine' AS cuisine, geom
FROM postpass_pointpolygon
WHERE tags->>'amenity' = 'restaurant'
AND ... -- ergänzt hier die Bedingung für 'name' und 'cuisine'
AND geom && ST_MakeEnvelope(8.5469, 47.3492, 8.5721, 47.3599, 4326)
ORDER BY name
Bonusfrage: Wie viele Restaurants liefert eure Abfrage zurück? Vergleicht das Ergebnis mit der Gesamtzahl aller Restaurants aus Abfrage 2.
|
Beim Aufbau komplexer SQL-Abfragen hilft es, Filter schrittweise einzufügen: erst alle Objekte des gewünschten Typs abfragen, dann sukzessive Bedingungen ergänzen. So lässt sich bei unerwarteten Ergebnissen schnell eingrenzen, welche Bedingung das Problem verursacht. |
Lerneinheit 5 – Qualitätsprüfung als Datenbankanwendung
Dauer: ca. 35 Minuten
Lernziele
-
Datenqualität als analytische Frage formulieren und mit SQL operationalisieren
-
Qualitätskriterien wie Vollständigkeit, Konsistenz und Dubletten an OSM-Daten anwenden
-
Einen strukturierten Qualitätsbericht für ein reales Quartier erstellen
Was ist Datenqualität?
Datenqualität beschreibt, wie gut Daten ihren beabsichtigten Zweck erfüllen. Wir unterscheiden vier Dimensionen:
-
Vollständigkeit: Sind alle relevanten Objekte erfasst? Fehlen wichtige Attribute wie
nameodercuisine? -
Konsistenz: Werden gleiche Dinge gleich modelliert? Ist das Trottoir als eigene Linie oder nur als Attribut erfasst?
-
Aktualität: Sind die Daten aktuell? Ein Restaurant mit
opening_hoursvon 2015 kann längst falsch sein. -
Redundanz / Dubletten: Gibt es dasselbe Objekt mehrfach? Zum Beispiel einmal als Punkt und einmal als Fläche?
Prüfung 1: Restaurants ohne Namen
{{data:sql,server=https://postpass.geofabrik.de/api/0.2/}}
SELECT osm_type, osm_id, tags, geom
FROM postpass_pointpolygon
WHERE tags->>'amenity' = 'restaurant'
AND NOT tags ? 'name'
AND geom && ST_MakeEnvelope(8.5469, 47.3492, 8.5721, 47.3599, 4326)
NOT tags ? 'name' ist wahr, wenn der Schlüssel name im Tags-Objekt fehlt. Das ist ein strikter Vollständigkeitscheck: Kein leerer String, kein NULL – der Key existiert schlicht nicht.
Prüfung 2: Restaurants ohne Küchenangabe
{{data:sql,server=https://postpass.geofabrik.de/api/0.2/}}
SELECT osm_id, tags->>'name' AS name, tags, geom
FROM postpass_pointpolygon
WHERE tags->>'amenity' = 'restaurant'
AND NOT tags ? 'cuisine'
AND geom && ST_MakeEnvelope(8.5469, 47.3492, 8.5721, 47.3599, 4326)
Prüfung 3: Trottoir-Abdeckung und -Konsistenz
{{data:sql,server=https://postpass.geofabrik.de/api/0.2/}}
SELECT
osm_id,
tags->>'footway' AS footway,
tags->>'highway' AS highway,
tags->>'sidewalk' AS sidewalk,
tags->>'surface' AS belag,
geom
FROM postpass_line
WHERE geom && ST_MakeEnvelope(8.5469, 47.3492, 8.5721, 47.3599, 4326)
AND (
tags->>'footway' = 'sidewalk'
OR tags ? 'sidewalk'
OR tags->>'highway' = 'footway'
)
Aus dem Ergebnis lässt sich ablesen, wie viele Trottoirs als eigene Linien modelliert sind und wie viele nur als Attribut an einer Strasse hängen. Diese Inkonsistenz erschwert Auswertungen erheblich, weil man beide Varianten immer parallel mitdenken muss.
Prüfung 4: Qualitätsübersicht mit Aggregation
{{data:sql,server=https://postpass.geofabrik.de/api/0.2/}}
SELECT
kategorie,
COUNT(*) AS total,
COUNT(*) FILTER (WHERE mit_name) AS mit_name,
COUNT(*) FILTER (WHERE NOT mit_name) AS ohne_name
FROM (
SELECT
'Street Art' AS kategorie,
tags ? 'name' AS mit_name
FROM postpass_point
WHERE tags->>'tourism' = 'artwork'
AND geom && ST_MakeEnvelope(8.5469, 47.3492, 8.5721, 47.3599, 4326)
UNION ALL
SELECT
tags->>'amenity' AS kategorie,
tags ? 'name' AS mit_name
FROM postpass_pointpolygon
WHERE tags->>'amenity' IN ('restaurant', 'cafe')
AND geom && ST_MakeEnvelope(8.5469, 47.3492, 8.5721, 47.3599, 4326)
) sub
GROUP BY kategorie
ORDER BY total DESC
COUNT(*) FILTER (WHERE …) ist eine PostgreSQL-Kurzschreibweise für eine bedingte Zählung: Es wird nur gezählt, wenn die Bedingung wahr ist. Das Ergebnis gibt auf einen Blick einen Qualitätsüberblick über alle Kategorien.
Vorlage: Qualitätsbericht Quartier
Am Ende dieser Einheit erstellt ihr einen strukturierten Qualitätsbericht. Füllt die folgende Vorlage mit den Ergebnissen eurer Abfragen aus und präsentiert eure Ergebnisse in fünf Minuten der Klasse.
Gebiet: [Quartier / Ort] Abfragedatum: [Datum]
-
Street Art
Anzahl gefundener Objekte: ___ Objekte ohne `name`: ___ (___%) Objekte ohne `artwork_type`: ___ (___%) Objekte ohne `artist_name`: ___ (___%)
-
Restaurants
Anzahl als Punkte: ___ als Flächen: ___ Ohne `name`: ___ Ohne `cuisine`: ___ Ohne `opening_hours`: ___
-
Trottoirs und Gehwege
Als eigene Linien erfasst: ___ Als Strassenattribut erfasst: ___ Ohne `surface`: ___ Beobachtete Inkonsistenzen: ___
-
Hauptprobleme (kurze Beschreibung der grössten Lücken)
-
Verbesserungsvorschläge (was würdet ihr in OSM ergänzen, und warum?)
Abschlussaufgabe
Führt die vier Qualitätsprüfungen für ein Quartier eurer Wahl durch. Passt dazu die ST_MakeEnvelope-Koordinaten entsprechend an. Beantwortet in eurer Präsentation:
-
Wie vollständig sind die Daten in eurem Quartier?
-
Welches Objekt ist am schlechtesten erfasst? Warum könnte das so sein?
-
Was würdet ihr als Nächstes in OSM verbessern?
|
Fehlende Tags sind nicht immer gleichbedeutend mit unbekannten Informationen – manchmal wurden sie schlicht noch nicht erfasst. Beim Interpretieren der Qualitätszahlen lohnt es sich, diesen Unterschied zu berücksichtigen und gezielt nachzuschauen, ob ein Objekt in der Realität tatsächlich keine Angabe trägt. |
Lerneinheit 6 – Visualisieren (optional)
Dauer: ca. 30 Minuten
Lernziele
-
Abfrageergebnisse aus Postpass/overpass-turbo als GeoJSON oder CSV exportieren
-
Geodaten in einem geeigneten Werkzeug visualisieren und kartografisch darstellen
|
Zur Erinnerung: Dieses Tutorial setzt voraus, dass man Grundlagen der Geovisualisierung kennt. Für diejenigen, die Grundlagen der Geovisualisierung kennenlernen möchten, gibt es einen Hinweis im Kapitel Voraussetzungen oben. |
Daten exportieren
overpass-turbo bietet nach einer erfolgreichen Abfrage verschiedene Exportmöglichkeiten. Über den Button Export oben links lässt sich das Ergebnis als GeoJSON herunterladen. GeoJSON ist ein offenes Format für geografische Daten, das von den meisten Visualisierungswerkzeugen unterstützt wird.
Für tabellarische Auswertungen (z.B. Qualitätsberichte) können die Ergebnisse aus der Tabellenansicht von overpass-turbo als CSV kopiert oder direkt in eine Tabellenkalkulation übertragen werden.
Visualisieren mit uMap
uMap ist ein kostenloses Online-Werkzeug zum Erstellen von Karten auf Basis von OSM. Es erlaubt den direkten Import von GeoJSON-Dateien.
Vorgehensweise:
-
Führt eine Postpass-Abfrage auf overpass-turbo.eu aus (z.B. alle Street-Art-Objekte im Seefeld).
-
Exportiert das Ergebnis als GeoJSON (Export → GeoJSON).
-
Öffnet umap.openstreetmap.fr und erstellt eine neue Karte.
-
Importiert die GeoJSON-Datei über Daten importieren.
-
Passt Farben, Symbole und Popups nach Bedarf an.
Visualisieren mit QGIS (alternativ)
QGIS ist ein kostenloses Desktop-GIS-Programm für komplexere Visualisierungen und räumliche Analysen.
-
Öffnet QGIS und wählt Layer → Layer hinzufügen → Vektorlayer.
-
Ladet die exportierte GeoJSON-Datei.
-
Über Layereigenschaften → Darstellung können Symbole und Farben angepasst werden.
-
Mit dem Drucklayout lässt sich eine druckfertige Karte erstellen.
Aufgaben
Visualisiert die Ergebnisse aus Lerneinheit 5 auf einer Karte:
-
Exportiert alle Street-Art-Objekte im Seefeld als GeoJSON.
-
Importiert die Daten in uMap oder QGIS.
-
Färbt die Objekte nach einem Qualitätsmerkmal ein (z.B. grün = hat
artist_name, rot = fehltartist_name). -
Welche räumlichen Muster erkennt ihr? Gibt es Strassenzüge oder Quartierteile, die besser oder schlechter erfasst sind?
|
Für eine erste Exploration genügen geojson.io oder uMap völlig. QGIS lohnt sich, wenn Symbole nach mehreren Attributen gleichzeitig gesteuert oder druckfertige Karten erstellt werden sollen. |
Abschluss: Was haben wir gelernt und wie geht es weiter?
Was wir gelernt haben
In diesem Workshop haben wir OpenStreetMap nicht nur als Karte, sondern als Datenbank kennengelernt. Wir haben gesehen, wie reale Objekte – Street Art, Restaurants, Trottoirs – als Nodes, Ways und Tags modelliert werden, und warum diese flexible Struktur sowohl eine Stärke als auch eine Herausforderung ist. Mit SQL und Postpass konnten wir gezielt Abfragen stellen, Qualitätsprobleme aufdecken und die Ergebnisse visualisieren.
Die wichtigsten Erkenntnisse: Daten entstehen nicht einfach – sie werden von Menschen erfasst, und das sieht man ihnen an. Vollständigkeit, Konsistenz und Aktualität sind keine Selbstverständlichkeit, sondern das Ergebnis kollektiver Arbeit. Und: Mit den richtigen Werkzeugen lassen sich auch grosse, unstrukturierte Datensätze systematisch analysieren.
Wie geht es weiter?
Bei Street Art bzw. Kunst im öffentlichen Raum, die in OSM erfasst ist, wäre es schön, wenn man zu den Objekten auch Fotos und Bilder verwalten kann. In OSM selbst werden keine Bilder gespeichert, aber OSM kann auf Bilder verweisen. Solche Bilder können zum Beispiel mit der Commons App in Wikimedia Commons hochgeladen werden, sofern die Urheberrechte und Lizenzen dies erlauben. In OSM kann man danach mit dem Tag wikimedia_commons=* auf die passende Commons-Kategorie oder Datei verlinken, zum Beispiel wikimedia_commons=Category:Street art in Zürich oder wikimedia_commons=File:Beispielbild.jpg. Für einzelne direkte Bild-URLs wird zusätzlich häufig image=_ verwendet (wiki.openstreetmap.org).
Wer selbst zur Verbesserung der OSM-Daten beitragen möchte, kann an einem Mapathon teilnehmen. Bei einem Mapathon arbeiten Gruppen gemeinsam daran, ein bestimmtes Gebiet in OSM zu vervollständigen – zum Beispiel fehlende Street-Art-Objekte, Restaurants ohne cuisine-Tag oder Trottoirs ohne Belagsangabe zu ergänzen. Mapathons werden regelmässig von lokalen OSM-Communities, Hochschulen und NGOs organisiert.
Ein guter Einstieg ist die Webseite openstreetmap.org/about, wo lokale Gruppen und Veranstaltungen aufgelistet sind wie zum Beispiel die OSM.ch. Wer lieber im eigenen Quartier kartieren möchte, kann direkt den im OSM.org eingebauten Editor (iD-Editor) nutzen oder zum Beispiel die mobile App StreetComplete (Android) oder die mobile Webapp MapComplete verwenden, die beide gezielte Aufgaben zum Ergänzen fehlender Tags anbieten.
Weitere Tutorials und Lernmaterialien
LearnOSM (learnosm.org) ist das offizielle Lernportal der OSM-Community und erklärt Schritt für Schritt, wie man Daten erfasst, den JOSM-Editor bedient und an Mapping-Projekten teilnimmt.
Das OSM-Wiki (wiki.openstreetmap.org) ist die umfassendste Referenz für alle Tagging-Konventionen und eignet sich, um nachzuschauen, wie ein bestimmtes Objekt korrekt erfasst wird.
OpenSchoolMaps (openschoolmaps.ch) bietet eine Sammlung von Unterrichtsmaterialien rund um OSM und Geodaten, speziell für den Schulunterricht aufbereitet. Die Themen reichen von der einfachen Kartennutzung von OpenStreetMap über die Datenanalyse mit QGIS bis zu weiteren Informatikthemen.
Auf OpenSchoolMaps gibt es ein spezielles Tutorial für das OpenStreetMap-Daten extrahieren mit SQL und Postpass. Und es lohnt sich ein Blick auf die Postpass-Beispielsammlung im OSM-Wiki (wiki.openstreetmap.org/wiki/Postpass/Examples).
Glossar
- Bounding Box
-
Ein rechteckiger geografischer Ausschnitt, definiert durch minimale und maximale Längen- und Breitengrade. Wird unter anderem in PostGIS-Abfragen verwendet, um Ergebnisse auf ein bestimmtes Gebiet einzuschränken. In PostGIS erzeugt
ST_MakeEnvelope(west, süd, ost, nord, 4326)eine solche Bounding Box als Geometrie. - Entität
-
Ein eindeutig identifizierbares, abgrenzbares Objekt der realen Welt, über das Daten gespeichert werden sollen. Beispiele: ein bestimmtes Street-Art-Objekt, ein konkretes Restaurant.
- JSONB
-
Ein Datentyp in PostgreSQL für JSON-Daten in binärer, indizierbarer Form. Ermöglicht effiziente Abfragen auf einzelne Schlüssel mit dem Operator
→>'key'(liefert den Wert als Text) und Existenzprüfungen mit? 'key'(prüft, ob ein Schlüssel vorhanden ist). - Node / Way / Relation
-
Die drei Grundobjekttypen in OpenStreetMap. Ein Node ist ein Punkt mit Koordinaten. Ein Way ist eine geordnete Liste von Nodes und kann eine offene Linie oder eine geschlossene Fläche bilden. Eine Relation gruppiert mehrere Objekte mit einer definierten Rolle (z.B. eine Busroute oder ein Stadtquartier).
- Normalisierung
-
Ein Prinzip des Datenbankdesigns, bei dem redundante Daten eliminiert werden, indem zusammengehörende Informationen in separate Tabellen ausgelagert werden. Ziel: keine unnötigen Wiederholungen und konsistente Daten ohne Anomalien bei Änderungen.
- PostGIS
-
Eine Erweiterung für PostgreSQL, die räumliche Datentypen und Funktionen bereitstellt. Ermöglicht das Speichern und Abfragen von Koordinaten, Linien und Flächen direkt in SQL.
- Postpass
-
Ein Dienst von Geofabrik, der aktuelle OSM-Daten in eine PostgreSQL/PostGIS-Datenbank importiert und über eine SQL-Schnittstelle zugänglich macht. Auf overpass-turbo.eu wird Postpass durch die Kopfzeile
{{data:sql,server=https://postpass.geofabrik.de/api/0.2/}}aktiviert. - Schema-on-read
-
Ein Designprinzip, bei dem die Struktur der Daten nicht vor dem Einfügen definiert wird, sondern erst beim Lesen interpretiert wird. OSM-Tags folgen diesem Prinzip: Ein Node mit
amenity=restaurantwird zum Restaurant durch Interpretation, nicht durch seine Tabellenspalte. - Schema-on-write
-
Das klassische Prinzip relationaler Datenbanken: Die Tabellenstruktur (Schema) wird vor der Dateneingabe definiert, und alle Einträge müssen sich daran halten.
- SRID
-
Spatial Reference ID – eine Zahl, die ein Koordinatensystem eindeutig identifiziert. Der SRID 4326 steht für WGS 84, das Koordinatensystem von GPS und OpenStreetMap, das Längen- und Breitengrade in Dezimalgrad verwendet.
- Tag
-
Ein Schlüssel-Wert-Paar in OpenStreetMap der Form
key=value, das die Eigenschaften eines Objekts beschreibt. Beispiele:amenity=restaurant,name=Kronenhalle,tourism=artwork. Alle Tags zusammen ergeben das vollständige Profil eines OSM-Objekts.
Noch Fragen? Wende dich an OpenStreetMap Schweiz oder Stefan Keller!
Frei verwendbar unter CC0 1.0