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 |