View und Tabellen aus den OSM-Daten

Um Abfrageergebnisse permanent verfügbar zu haben, legt man Views (“Sichten”) auf die Abfrage an. Danach ist die View wie eine (nur lesbare) Datenbanktabelle nutzbar.

View für die Bundesländer in Österreich

Diese Abfrage hatten wir schon. Jetzt schreiben wir einfach den Befehl zum Anlegen der View davor:

CREATE VIEW osm_bundesländer_namen AS
SELECT DISTINCT name
FROM osm_austria_polygon
WHERE admin_level = '4'
  AND boundary='administrative'
  AND name NOT IN ('Bayern')
ORDER BY name

Diese Lösung funktioniert zwar mit den aktuellen Daten, ist aber noch nicht ganz befriedigend. Beim nächsten Update der Daten in OSM könnte statt Bayern ein Eintrag von einem anderen Land hineinrutschen. Oder jemand beschädigt versehentlich die OpenStreetMap-Daten eines Bundeslandes, das dann plötzlich nicht mehr in Österreich erscheint.

Außerdem muß diese (wahrscheinlich noch öfter benötigte) View viel mehr Daten lesen als es für die 9 Datensätze erforderlich wäre.

Beide Probleme können wir vermeiden, indem wir einen bekannt guten Zustand von wichtigen, sich nicht oft ändernden Daten statt der View in eine Tabelle schreiben. Das ist ganz einfach, statt CREATE VIEW … AS ruft man die Abfrage mit CREATE TABLE … auf:

Weiters sollte die Tabelle auch die Geodaten enthalten. Da Tirol aus mehreren nicht zusammenhängenden Teilen besteht, fügen wir diese mit Hilfe der Funktion ST_Collect zu einem Multipolygon zusammen.

CREATE table osm_bundesland AS
SELECT MIN(osm_id) AS id, name, ST_Collect(way) AS geo
FROM osm_austria_polygon
WHERE admin_level = '4'
  AND boundary='administrative'
  AND name NOT IN ('Bayern')
GROUP BY name
ORDER BY name;

Diese Tabelle läßt sich dann nach Belieben korrigieren, um weitere Daten erweitern, wenn wir sie brauchen, usw.

Views oder Tabellen mit Geodaten

Es ist immer sinnvoll, für eine Datenbank einen fixen Namen für die ID der Tabelle und das Geodaten-Feld festzulegen. Ich verwende hier id sowie geo. (“way” aus den OpenStreetMap-Tabellen ist ein bißchen verwirrend.)

Es ist in einer Geodatenbank notwendig, die Tabellen und Views mit Geodaten in die zentrale Liste aufzunehmen, z. B. damit die Frontends wissen, welches Feld sie als Geodaten verwenden sollen und welches die Datensätze eindeutig identifiziert.

Dafür bietet PostGIS eine leicht verwendbare Funktion, PopulateGeometryColumns. Damit können wir unsere Bundesland-Tabelle in der Datenbank bekannt machen.

SELECT Populate_Geometry_Columns('osm_bundesland'::regclass);

Der Name der Tabelle muß in einfachen Anführungszeichen stehen. ::regclass kennzeichnet den Text als Name einer Tabelle. Die Funktion erledigt dann alles weitere.

In geometry_columns sehen wir jetzt:

oid f_table_catalog f_table_schema f_table_name f_geometry_column coord_dimension srid type
115761   public osm_bundesland geo 2 3416 MULTIPOLYGON

Es hat also geklappt, unsere Tabelle ist jetzt als Geodaten-Tabelle bekannt.

Weiter: Geografische Funktionen