GLE-Postgis-Jagdkataster: Unterschied zwischen den Versionen
Aus kvwmap
(→Abgerundete EJB) |
|||
| Zeile 39: | Zeile 39: | ||
USING gist | USING gist | ||
(the_geom); | (the_geom); | ||
| + | |||
| + | CREATE OR REPLACE FUNCTION jagdkataster.jagdbezirke_abrunden() | ||
| + | RETURNS trigger AS | ||
| + | $BODY$DECLARE | ||
| + | |||
| + | -- Regeln für die Subtraktion/Addition der Abrundungsteilflächen: | ||
| + | -- Abzug = 'atf' (Abtrennflächen) | ||
| + | -- Zuordnung = 'jbe', 'agf', 'jbf' (Enklaven, Angliederungsflächen, jagdbezirksfreie) | ||
| + | -- Sonderfall: Abtrennflächen durch Verzicht ('atv') ergeben immer zusätzliche separate Objekte | ||
| + | count_abtrennung INTEGER; | ||
| + | count_verzicht INTEGER; | ||
| + | count_zuordnung INTEGER; | ||
| + | |||
| + | BEGIN | ||
| + | |||
| + | IF (TG_OP = 'UPDATE') THEN | ||
| + | IF NEW.art = 'ajb' THEN | ||
| + | |||
| + | NEW.art = 'ejb'; -- Der EJB in Abrundung bleibt EJB in Abrundung, | ||
| + | NEW.status='t'; -- wird aber historisch | ||
| + | |||
| + | SELECT count(b.art) INTO count_abtrennung FROM jagdkataster.jagdbezirke b WHERE b.art = 'atf' AND b.jb_zuordnung=NEW.id; | ||
| + | SELECT count(b.art) INTO count_verzicht FROM jagdkataster.jagdbezirke b WHERE b.art = 'atv' AND b.jb_zuordnung=NEW.id; | ||
| + | SELECT count(b.art) INTO count_zuordnung FROM jagdkataster.jagdbezirke b WHERE b.art in ('jbe','agf','jbf') AND b.jb_zuordnung=NEW.id; | ||
| + | |||
| + | INSERT INTO jagdkataster.jagdbezirke_abgerundet | ||
| + | SELECT id, NULL, name, concode, conname, 'f', NULL, NULL, cast(now() as date), | ||
| + | case | ||
| + | when count_abtrennung = 0 | ||
| + | then | ||
| + | case | ||
| + | when count_zuordnung = 0 | ||
| + | then -- Wenn es keine Abzugsflächen gibt und keine anderen Zuordnungsflächen: AJB = EJB | ||
| + | st_multi(a.the_geom) | ||
| + | else -- Wenn es keine Abzugsflächen gibt, aber Zuordnungsflächen: AJB = EJB + Zuordnung | ||
| + | st_multi((st_union(a.the_geom,(select st_union(b.the_geom) FROM jagdkataster.jagdbezirke b WHERE b.art in ('jbe','agf','jbf') AND b.jb_zuordnung=a.id)))) | ||
| + | end | ||
| + | else | ||
| + | case | ||
| + | when count_zuordnung = 0 | ||
| + | then -- Wenn es Abzugsflächen gibt aber keine anderen Zuordnungsflächen: AJB = EJB - Abzug | ||
| + | st_multi(st_difference( | ||
| + | a.the_geom, | ||
| + | (select st_union(b.the_geom) FROM jagdkataster.jagdbezirke b WHERE b.art = 'atf' AND b.jb_zuordnung=a.id)) | ||
| + | ) | ||
| + | |||
| + | else -- Wenn es Abzugsflächen gibt und Zuordnungsflächen: AJB = EJB + Zuordnung - Abzug | ||
| + | st_multi((st_difference( | ||
| + | (select st_union(a.the_geom,(select st_union(b.the_geom) FROM jagdkataster.jagdbezirke b WHERE b.art in ('jbe','agf','jbf') AND b.jb_zuordnung=a.id))), | ||
| + | (select st_union(b.the_geom) FROM jagdkataster.jagdbezirke b WHERE b.art = 'atf' AND b.jb_zuordnung=a.id)))) | ||
| + | end | ||
| + | end | ||
| + | FROM jagdkataster.jagdbezirke a WHERE a.id = NEW.id; | ||
| + | |||
| + | -- Wenn der EJB in Abrundung auf "Verzicht" gesetzt wurde, wird ein zweiter - deckungsgleicher - abgerundeter EJB mit Verzicht angelegt | ||
| + | IF NEW.verzicht = 't' THEN | ||
| + | |||
| + | INSERT INTO jagdkataster.jagdbezirke_abgerundet | ||
| + | SELECT id, NULL, name, NULL, NULL, 't', NULL, NULL, cast(now() as date), the_geom | ||
| + | FROM jagdkataster.jagdbezirke_abgerundet WHERE id = NEW.id; | ||
| + | |||
| + | END IF; | ||
| + | |||
| + | -- Wenn Verzicht-Flächen vorhanden sind, aber nicht den gesamten EJB überdecken, werden diese in die abgerundeten EJB übernommen | ||
| + | IF count_verzicht > 0 THEN | ||
| + | |||
| + | INSERT INTO jagdkataster.jagdbezirke_abgerundet | ||
| + | (SELECT jb_zuordnung, NULL, (SELECT name FROM jagdkataster.jagdbezirke b where b.id = NEW.id), NULL, NULL, 't', NULL, NULL, cast(now() as date), st_multi(a.the_geom) | ||
| + | FROM jagdkataster.jagdbezirke a WHERE a.jb_zuordnung = NEW.id AND art = 'atv'); | ||
| + | |||
| + | END IF; | ||
| + | |||
| + | UPDATE jagdkataster.jagdbezirke_abgerundet set flaeche = round(cast(st_area(the_geom)/10000 as numeric),1) where id = NEW.id; | ||
| + | |||
| + | END IF; | ||
| + | RETURN NEW; | ||
| + | END IF; | ||
| + | |||
| + | RETURN NULL; | ||
| + | END;$BODY$ | ||
| + | LANGUAGE plpgsql VOLATILE | ||
| + | COST 100; | ||
| + | |||
| + | CREATE TRIGGER ejb_bereinigen | ||
| + | AFTER INSERT | ||
| + | ON jagdkataster.jagdbezirke_abgerundet | ||
| + | FOR EACH ROW | ||
| + | EXECUTE PROCEDURE jagdkataster.ejb_bereinigen(); | ||
</nowiki> | </nowiki> | ||
Version vom 29. Februar 2016, 11:11 Uhr
EJB Verdachtsflächen
CREATE TABLE alkis.lkvr_ejb_verdachtsflaechen
(
eigentuemer text,
flaeche double precision
)
WITH (
OIDS=TRUE
);
SELECT AddGeometryColumn('alkis', 'lkvr_ejb_verdachtsflaechen','the_geom',25833,'MULTIPOLYGON', 2);
CREATE INDEX ixlkvrejbverd_the_geom_gist
ON alkis.lkvr_ejb_verdachtsflaechen
USING gist
(the_geom);
Abgerundete EJB
CREATE TABLE jagdkataster.jagdbezirke_abgerundet
(
id character varying(10) NOT NULL,
flaeche numeric,
name character varying(50),
concode character varying(5),
conname character varying(40),
verzicht boolean,
datum_beschluss date,
datum_bestandskraft date,
datum_erfassung date
)
WITH (
OIDS=TRUE
);
SELECT AddGeometryColumn('jagdkataster', 'jagdbezirke_abgerundet','the_geom',25833,'MULTIPOLYGON', 2);
CREATE INDEX jagdbezirke_abgerundet_the_geom_gist
ON jagdkataster.jagdbezirke_abgerundet
USING gist
(the_geom);
CREATE OR REPLACE FUNCTION jagdkataster.jagdbezirke_abrunden()
RETURNS trigger AS
$BODY$DECLARE
-- Regeln für die Subtraktion/Addition der Abrundungsteilflächen:
-- Abzug = 'atf' (Abtrennflächen)
-- Zuordnung = 'jbe', 'agf', 'jbf' (Enklaven, Angliederungsflächen, jagdbezirksfreie)
-- Sonderfall: Abtrennflächen durch Verzicht ('atv') ergeben immer zusätzliche separate Objekte
count_abtrennung INTEGER;
count_verzicht INTEGER;
count_zuordnung INTEGER;
BEGIN
IF (TG_OP = 'UPDATE') THEN
IF NEW.art = 'ajb' THEN
NEW.art = 'ejb'; -- Der EJB in Abrundung bleibt EJB in Abrundung,
NEW.status='t'; -- wird aber historisch
SELECT count(b.art) INTO count_abtrennung FROM jagdkataster.jagdbezirke b WHERE b.art = 'atf' AND b.jb_zuordnung=NEW.id;
SELECT count(b.art) INTO count_verzicht FROM jagdkataster.jagdbezirke b WHERE b.art = 'atv' AND b.jb_zuordnung=NEW.id;
SELECT count(b.art) INTO count_zuordnung FROM jagdkataster.jagdbezirke b WHERE b.art in ('jbe','agf','jbf') AND b.jb_zuordnung=NEW.id;
INSERT INTO jagdkataster.jagdbezirke_abgerundet
SELECT id, NULL, name, concode, conname, 'f', NULL, NULL, cast(now() as date),
case
when count_abtrennung = 0
then
case
when count_zuordnung = 0
then -- Wenn es keine Abzugsflächen gibt und keine anderen Zuordnungsflächen: AJB = EJB
st_multi(a.the_geom)
else -- Wenn es keine Abzugsflächen gibt, aber Zuordnungsflächen: AJB = EJB + Zuordnung
st_multi((st_union(a.the_geom,(select st_union(b.the_geom) FROM jagdkataster.jagdbezirke b WHERE b.art in ('jbe','agf','jbf') AND b.jb_zuordnung=a.id))))
end
else
case
when count_zuordnung = 0
then -- Wenn es Abzugsflächen gibt aber keine anderen Zuordnungsflächen: AJB = EJB - Abzug
st_multi(st_difference(
a.the_geom,
(select st_union(b.the_geom) FROM jagdkataster.jagdbezirke b WHERE b.art = 'atf' AND b.jb_zuordnung=a.id))
)
else -- Wenn es Abzugsflächen gibt und Zuordnungsflächen: AJB = EJB + Zuordnung - Abzug
st_multi((st_difference(
(select st_union(a.the_geom,(select st_union(b.the_geom) FROM jagdkataster.jagdbezirke b WHERE b.art in ('jbe','agf','jbf') AND b.jb_zuordnung=a.id))),
(select st_union(b.the_geom) FROM jagdkataster.jagdbezirke b WHERE b.art = 'atf' AND b.jb_zuordnung=a.id))))
end
end
FROM jagdkataster.jagdbezirke a WHERE a.id = NEW.id;
-- Wenn der EJB in Abrundung auf "Verzicht" gesetzt wurde, wird ein zweiter - deckungsgleicher - abgerundeter EJB mit Verzicht angelegt
IF NEW.verzicht = 't' THEN
INSERT INTO jagdkataster.jagdbezirke_abgerundet
SELECT id, NULL, name, NULL, NULL, 't', NULL, NULL, cast(now() as date), the_geom
FROM jagdkataster.jagdbezirke_abgerundet WHERE id = NEW.id;
END IF;
-- Wenn Verzicht-Flächen vorhanden sind, aber nicht den gesamten EJB überdecken, werden diese in die abgerundeten EJB übernommen
IF count_verzicht > 0 THEN
INSERT INTO jagdkataster.jagdbezirke_abgerundet
(SELECT jb_zuordnung, NULL, (SELECT name FROM jagdkataster.jagdbezirke b where b.id = NEW.id), NULL, NULL, 't', NULL, NULL, cast(now() as date), st_multi(a.the_geom)
FROM jagdkataster.jagdbezirke a WHERE a.jb_zuordnung = NEW.id AND art = 'atv');
END IF;
UPDATE jagdkataster.jagdbezirke_abgerundet set flaeche = round(cast(st_area(the_geom)/10000 as numeric),1) where id = NEW.id;
END IF;
RETURN NEW;
END IF;
RETURN NULL;
END;$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
CREATE TRIGGER ejb_bereinigen
AFTER INSERT
ON jagdkataster.jagdbezirke_abgerundet
FOR EACH ROW
EXECUTE PROCEDURE jagdkataster.ejb_bereinigen();