Postgis SQL-Abfragen

Tips und Tricks zu Postgis SQL-Abfragen

Tabellensynchronisation über gid (nur fehlende Records einfügen)

Es werden nur Records von einer temporären Tabelle eingefügt deren gids in der Mastertabelle noch nicht existieren:

INSERT INTO nest.gebaeude
  (SELECT * FROM nest.gebaeude_temp t
    WHERE not exists(SELECT 1 FROM nest.gebaeude g WHERE g.gid = t.gid))

Siehe auch: PostgreSQL Dokumentation über SQL Subqueries mit "Exists"

2 Tabellen mit identischer/ähnlicher Struktur vergleichen

SELECT strasse, hausnr, plz, ort FROM gebaeudeadressen_2014
EXCEPT
SELECT strasse, hausnr, plz, ort FROM gebaeudeadressen_2013
ORDER BY ort, strasse, hausnr;

Zeigt die Adressen wleche in der Tabelle gebaeudeadressen_2014 existieren, nicht aber in der Tabelle gebaeudeadressen_2013

String-Replace

UPDATE nest.liegenschaften
   SET kataster_nr=replace(kataster_nr,'-','');

Siehe auch: PostgreSQL Dokumentation über String Functions and Operators

Interlis-OID von gid Sequenz generieren - Nummer zu String Formattierung

SELECT 'ch11h8mwRSPP' || to_char(gid,'FM0000') AS oid FROM verkehr.rspp;

Bei obiger Abfrage wird eine Interlist OID generiert. Die ersten 8 Zeichen ist der Präfix für die Stadt Uster, der Postfix ist frei vergebbar, muss aber eindeutig sein. Man kann sie aus dem Organisations-Präfix, einem Themen Präfix und einer fortlaufenden Nummer generieren. PostgreSQL bietet Formattierungoptionen für führende Nullen wie im Beispiel.

Siehe auch: PostgreSQL Dokumentation über Data Type Formatting.

Konvertierung von Multi zu Single-Geometrien

am Beispiel von MultiLinestring zu Linestring

UPDATE hydrologie.grundwasser_isohypse_hochwasser_daten
  SET the_geom = (ST_Dump(the_geom)).geom;

ST_Dump ist eine Funktion die eine Geometrie nimmt und ein Set von Postgis geometry_dump Strukturen zurück gibt. Geometry_dump besteht aus 2 Eigenschaften: geom und path. Geom ist eine Geometrie und path ist ein multi-dimensionales, integer basiertes, Feld das den Index in der Multigeometrie oder GeometryCollection repräsentiert. Bei MultiGeometrien ist der Pfad eindimensional {1}, bei Single-Geometrien ist der Pfad ein leeres Feld, bei GeometryCollections gibt es potentiell mehrere Feld-Elemente. ST_Dump ist nützlich um MultiGeometrien in SingleGeometrien umzuwandeln.

Siehe auch: BostonGIS ST_Dump Snippet

Domäne im Nachhinein verändern

Domänen, in Kombination mit check constraints, sind praktisch um in QGIS automatisch die Auswahllisten zu generieren. Man kann sie zudem im Nachhinein ändern, ohne dass man die Domäne und abhängigen Objekte löschen muss.

Domäne erstellen

CREATE DOMAIN natur.naturschutzobjekt_objekttyp
  AS text
 DEFAULT 'Inventarobjekt'::text
 CONSTRAINT natur_naturschutzobjekt_objekttyp_check CHECK
   ((VALUE = ANY (ARRAY['Diverses'::text, 'Inventarobjekt'::text, 'Inventarergänzung'::text, 'Schutzobjekt'::text, 'Vertragsobjekt'::text, 'Zonenplan'::text])));

Domäne modifizieren

Dies geschieht in 2 Teilen: zuerst den check constraint mit "drop" löschen, danach einen neuen, modifizierten mit "add" erstellen:

ALTER DOMAIN natur.naturschutzobjekt_objekttyp
  DROP CONSTRAINT natur_naturschutzobjekt_objekttyp_check;


ALTER DOMAIN natur.naturschutzobjekt_objekttyp
 ADD CONSTRAINT natur_naturschutzobjekt_objekttyp_check CHECK
  ((VALUE = ANY (ARRAY['Inventarobjekt'::text, 'Schutzobjekt'::text, 'Vertragsobjekt'::text, 'Zonenplan'::text])));;

Konkave Hülle berechnen

Wird zum Beispiel beim Grünkataster verwendet.  Dabei werden Punkte, Linien und Flächen zusammengefasst, die konkave Hülle davon berechnet und danach noch ein Puffer darum generiert:

SELECT ga.gid, ga.id, ga.uster_nr,
ST_Buffer(
ST_ConcaveHull(
ST_Collect(Array(
SELECT ST_Union(the_geom) FROM natur.gruenanlage_flaechen gafl WHERE gafl.uster_nr = ga.uster_nr AND ST_IsValid(gafl.the_geom)
UNION
SELECT the_geom FROM natur.gruenanlage_punkte gapkt WHERE gapkt.uster_nr = ga.uster_nr
UNION
SELECT the_geom FROM natur.gruenanlage_linien galin WHERE galin.uster_nr = ga.uster_nr)
),0.97)
,4) AS the_geom
FROM natur.gruenanlage ga
GROUP BY ga.uster_nr, ga.gid, ga.id, ga.uster_nr
ORDER BY ga.gid ASC;

Achtung: bei der Zusammenfassung von Polygonen empfiehlt sich zuerst ein ST_Union. Da kommt es weniger zu Fehlern als wenn man es direkt an ST_ConcaveHull übergibt. Der Wert für die Konkavität ist zwischen 1 und 0. 1 wäre ident mit der konvexen Hülle, 0.99 bereits etwas konkav - je tiefer desto konkaver. ST_IsValid kann als Filter angewendet werden wenn sich invalide Geometrien in der Tabelle befinden (z.b. Flächen mit 2 Punkten oder Selbstüberschneidungen).

Artikelaktionen
Sitemap AGB Impressum