
-- ----------------------------------------------------------------
-- Vereinfachung der Geometrie mit der PostGIS-Function ST_Simplify
-- ----------------------------------------------------------------

-- ALKIS / PostNAS 0.5

-- "Tuning" der Anwendung durch Reduktion der Datenmenge.
-- "Unnötige" Zwischenpunkte in der Geometrie werden entfernt.
-- Für die Kartendarstellung hat das keine Qualitätseinbußen, weil die Toleranzwerte 
-- weit unterhalb der Darstellungsgenauigkeit liegen.
-- Es kann aber Probleme geben bei Rechenoperationen mit den Flächen weil vorher "genau" übereinander
-- liegende Geometrien möglicherweise unterschiedlich reduziert werden.
-- Bei einem Objekt ist ein Zwischenpunkt vielleicht unnötig weil der Umring gerade weiter läuft.
-- Bei einem anderen Objekt zweigt der Umring aber ab, so das der Punkt nicht entfernt wird.
-- Dabei kann eine winzige Abweichung entstehen, die bei Verschneidungen zu etwas anderen Ergebnissen führt.
-- Die Abweichungen sind nur gering aber mathematisch gilt eben:  "0.0 <> 0.000001".
-- Dies ist bei der Gestaltung von Anwendungen zu berücksichtigen.


-- Stand

-- 2010-10-11 
--  erstmalige Anwendung, Toleranz 2 mm

-- 2010-10-11 
--  Reduzierung auf 1 mm. Es sollen nur Zwischenpunkte "in der Geraden" entfernt werden.
--  Der Toleranzwert soll nur die Rundungsungenauigkeiten enthalten.
--  Es kann Probleme geben bei Verschneidung von Flächen. Die PostGIS-Function "st_intersects"
--  liefert auch Flächen, die sich am Rand berühren.
--  Wenn wirklich nur überlappende Flächen gewünscht sind, dann müssen diese mit 
--     "st_area(st_intersection(a.geom,b.geom)) > 0" 
--  heraus gefiltert werden.
--  Nach Anwendung dieses Simplify-Scriptes ist aber 0 nicht mehr 0. Es muss statt dessen mit 
--  (etwas schwammigen) Grenzwerten gearbeitet werden.
--  Wenn z.B. die Ergebnis-Fläche sowieso auf eine Nachkommastelle gerundet wird, dann kann als Schwellwert 
--     "st_area(st_intersection(a.geom,b.geom)) > 0.05" 
--  verwendet werden. Es werden dann keine Flächen angezeigt, die gerundet als '0.0' angezeigt würden.
--  Im Zweifelsfall, z.B. wenn mit der Datenbank sehr viele Verschneidungen präzise berechnet werden solllen,
--  sollte dieses Script nicht verwendet werden.


-- 2010-11-10
--  neue Tabelle "nutzung"


-- Mengenanalyse siehe file "alkis_test_simplify.sql".


-- Daten im Geometriefeld optimieren:

UPDATE "ap_lpo"
SET    wkb_geometry = st_simplify(wkb_geometry, 0.001);

UPDATE "ax_leitung"
SET    wkb_geometry = st_simplify(wkb_geometry, 0.001);

UPDATE "ax_transportanlage"
SET    wkb_geometry = st_simplify(wkb_geometry, 0.001);

UPDATE "ax_besondereflurstuecksgrenze"
SET    wkb_geometry = st_simplify(wkb_geometry, 0.001);

UPDATE "ax_wald"
SET    wkb_geometry = st_simplify(wkb_geometry, 0.001);

UPDATE "ax_gehoelz"
SET    wkb_geometry = st_simplify(wkb_geometry, 0.001);

UPDATE "ax_fliessgewaesser"
SET    wkb_geometry = st_simplify(wkb_geometry, 0.001);

UPDATE "ax_stehendesgewaesser"
SET    wkb_geometry = st_simplify(wkb_geometry, 0.001);

UPDATE "ax_wohnbauflaeche"
SET    wkb_geometry = st_simplify(wkb_geometry, 0.001);

UPDATE "ax_sportfreizeitunderholungsflaeche"
SET    wkb_geometry = st_simplify(wkb_geometry, 0.001);

UPDATE "ax_landwirtschaft"
SET    wkb_geometry = st_simplify(wkb_geometry, 0.001);

UPDATE "ax_strassenverkehr"
SET    wkb_geometry = st_simplify(wkb_geometry, 0.001);

UPDATE "ax_weg"
SET    wkb_geometry = st_simplify(wkb_geometry, 0.001);

UPDATE "ax_flaechegemischternutzung"
SET    wkb_geometry = st_simplify(wkb_geometry, 0.001);

UPDATE "ax_industrieundgewerbeflaeche"
SET    wkb_geometry = st_simplify(wkb_geometry, 0.001);

UPDATE "ax_flaechebesondererfunktionalerpraegung"
SET    wkb_geometry = st_simplify(wkb_geometry, 0.001);

UPDATE "ax_platz"
SET    wkb_geometry = st_simplify(wkb_geometry, 0.001);

UPDATE "ax_halde"
SET    wkb_geometry = st_simplify(wkb_geometry, 0.001);

UPDATE "ax_bergbaubetrieb"
SET    wkb_geometry = st_simplify(wkb_geometry, 0.001);

UPDATE "ax_tagebaugrubesteinbruch"
SET    wkb_geometry = st_simplify(wkb_geometry, 0.001);

UPDATE "ax_friedhof"
SET    wkb_geometry = st_simplify(wkb_geometry, 0.001);

UPDATE "ax_flugverkehr"
SET    wkb_geometry = st_simplify(wkb_geometry, 0.001);

UPDATE "ax_schiffsverkehr"
SET    wkb_geometry = st_simplify(wkb_geometry, 0.001);

UPDATE "ax_bahnverkehr"
SET    wkb_geometry = st_simplify(wkb_geometry, 0.001);

UPDATE "ax_hafenbecken"
SET    wkb_geometry = st_simplify(wkb_geometry, 0.001);

UPDATE "ax_heide"
SET    wkb_geometry = st_simplify(wkb_geometry, 0.001);

UPDATE "ax_moor"
SET    wkb_geometry = st_simplify(wkb_geometry, 0.001);

UPDATE "ax_sumpf"
SET    wkb_geometry = st_simplify(wkb_geometry, 0.001);

UPDATE "ax_unlandvegetationsloseflaeche"
SET    wkb_geometry = st_simplify(wkb_geometry, 0.001);

UPDATE "ax_besonderegebaeudelinie"
SET    wkb_geometry = st_simplify(wkb_geometry, 0.001);

UPDATE "ax_gebaeude"
SET    wkb_geometry = st_simplify(wkb_geometry, 0.001);

UPDATE "ax_bauteil"
SET    wkb_geometry = st_simplify(wkb_geometry, 0.001);

UPDATE "ax_bauwerkoderanlagefuersportfreizeitunderholung"
SET    wkb_geometry = st_simplify(wkb_geometry, 0.001);

UPDATE "ax_bauwerkimgewaesserbereich"
SET    wkb_geometry = st_simplify(wkb_geometry, 0.001);

UPDATE "ax_turm"
SET    wkb_geometry = st_simplify(wkb_geometry, 0.001);

UPDATE "ax_vorratsbehaelterspeicherbauwerk"
SET    wkb_geometry = st_simplify(wkb_geometry, 0.001);

UPDATE "ax_klassifizierungnachwasserrecht"
SET    wkb_geometry = st_simplify(wkb_geometry, 0.001);

UPDATE "ax_naturumweltoderbodenschutzrecht"
SET    wkb_geometry = st_simplify(wkb_geometry, 0.001);

UPDATE "ax_bewertung"
SET    wkb_geometry = st_simplify(wkb_geometry, 0.001);

UPDATE "ax_klassifizierungnachstrassenrecht"
SET    wkb_geometry = st_simplify(wkb_geometry, 0.001);

UPDATE "ax_schutzzone"
SET    wkb_geometry = st_simplify(wkb_geometry, 0.001);

UPDATE "ax_bodenschaetzung"
SET    wkb_geometry = st_simplify(wkb_geometry, 0.001);

UPDATE "ax_bauraumoderbodenordnungsrecht"
SET    wkb_geometry = st_simplify(wkb_geometry, 0.001);

UPDATE "ax_denkmalschutzrecht"
SET    wkb_geometry = st_simplify(wkb_geometry, 0.001);

UPDATE "ax_anderefestlegungnachwasserrecht"
SET    wkb_geometry = st_simplify(wkb_geometry, 0.001);


-- Zusammen gefasste Nutzungarten
UPDATE "nutzung"
SET    wkb_geometry = st_simplify(wkb_geometry, 0.001);


-- Vaccum der Datenbank ist notwendig um die gewonnen Reduzierung endgueltig zu erschließen.


-- Fuer weitere Fortfuehrungen (NBA-Verfahren) einen Trigger einrichten?

-- Function zum Simplifizieren des Geometriefeldes:
--    CREATE OR REPLACE FUNCTION axsimlify()
--      RETURNS TRIGGER AS
--    $$
--    BEGIN
--      NEW.wkb_geometry := ST_Simplify(NEW.wkb_geometry, 0.001); -- Toleranz 1 Millimeter
--      RETURN NEW;
--    END;
--    $$
--    LANGUAGE 'plpgsql';


-- fuer alle Tabellen:

--    CREATE TRIGGER axsimplify
--      BEFORE INSERT ON ax_wohnbauflaeche
--      FOR EACH ROW EXECUTE PROCEDURE axsimlify();


-- weitere. Liste wie oben ....


-- END --