44 lines
1.0 KiB
PL/PgSQL
44 lines
1.0 KiB
PL/PgSQL
CREATE OR REPLACE FUNCTION _cdb_final_union_adjacent( joined_geoms geometry[] )
|
|
RETURNS geometry[] AS $$
|
|
BEGIN
|
|
RETURN joined_geoms;
|
|
END
|
|
$$ LANGUAGE plpgsql;
|
|
|
|
|
|
CREATE OR REPLACE FUNCTION _cdb_state_update_union_adjacent(clusters geometry[], new_geom geometry)
|
|
RETURNS geometry[] AS $$
|
|
DECLARE
|
|
joins geometry[] :='{}';
|
|
unjoined geometry[] :='{}';
|
|
i integer;
|
|
combined geometry;
|
|
BEGIN
|
|
joins := (select array_agg(g)
|
|
from unnest(clusters) a(g)
|
|
where ST_TOUCHES(g, new_geom));
|
|
|
|
unjoined := (select array_agg(g)
|
|
from unnest(clusters) a(g)
|
|
where ST_TOUCHES(g, new_geom) = false);
|
|
|
|
IF array_length(joins, 1) > 0 THEN
|
|
joins := array_append(joins, new_geom);
|
|
combined := ST_UNION(joins);
|
|
ELSE
|
|
combined := new_geom;
|
|
END IF;
|
|
|
|
unjoined := array_append(unjoined, combined);
|
|
RETURN unjoined;
|
|
END
|
|
$$
|
|
LANGUAGE plpgsql;
|
|
|
|
CREATE AGGREGATE cdb_union_adjacent(geometry)(
|
|
SFUNC=_cdb_state_update_union_adjacent,
|
|
STYPE=geometry[],
|
|
FINALFUNC=_cdb_final_union_adjacent,
|
|
INITCOND='{}'
|
|
);
|