Blog

Wie schreibe ich eine eigene Aggregationsfunktion

aggregate_fkt.png (61.64 KB)
 
Wie schreibe ich eine eigene Aggregationsfunktion? Das beschreibe ich an Hand eines Beispiels mit gesnappten Linien.
Zunächst braucht man eine Funktion, die zwei Argumente aufnimmt. Arg1 ist der Wert, der jeweils an die nächste Iteration übergeben wird. Im ersten Gang ist dessen Wert NULL. Das muss behandelt werden, damit die Funktion nicht am Ende auch NULL zurückliefert. Hier über eine IF Anweisung abgefangen. Im ersten Durchgang liefert die Funktion den Wert von Arg2. Arg2 enthält den Wert der jeweiligen Zeile. Wenn also zwei Werte übergeben wurden, wird der Wert von arg2 auf das in arg1 übergebene gesnappt und das Ergebnis mit arg1 aggregiert zurückgeliefert.

CREATE OR REPLACE FUNCTION gdi_st_snap( internal_geom geometry, next_geom geometry ) RETURNS geometry LANGUAGE 'plpgsql' COST 100 VOLATILE AS $BODY$ BEGIN IF internal_geom IS NULL THEN RETURN next_geom; ELSE RETURN ST_Union(internal_geom, ST_Snap(next_geom, internal_geom, 1)); END IF; END $BODY$;

Die Aggregationsfunktion ruft die oben beschriebene Funktion auf.
DROP AGGREGATE IF EXISTS ST_Snap_Agg(geometry); CREATE AGGREGATE ST_Snap_Agg(geometry) ( SFUNC = gdi_st_snap, STYPE = geometry );

So kann man die Aggregationsfunktion aufrufen.
SELECT st_length(ST_Snap_Agg(geom_5650)) FROM radrouten.radrouten WHERE id_routenkategorie = 1

 Datensatz auswählen
Blog: alle auswählen
ausgewählte Datensätze:
  • als Diagramm ausgeben