[53] | 1 |
|
---|
| 2 | -- ----------------------------------------------------------------
|
---|
| 3 | -- Vereinfachung der Geometrie mit der PostGIS-Function ST_Simplify
|
---|
| 4 | -- ----------------------------------------------------------------
|
---|
| 5 |
|
---|
| 6 | -- ALKIS / PostNAS 0.5
|
---|
| 7 |
|
---|
| 8 | -- "Tuning" der Anwendung durch Reduktion der Datenmenge.
|
---|
| 9 | -- "Unnötige" Zwischenpunkte in der Geometrie werden entfernt.
|
---|
| 10 | -- Für die Kartendarstellung hat das keine Qualitätseinbußen, weil die Toleranzwerte
|
---|
| 11 | -- weit unterhalb der Darstellungsgenauigkeit liegen.
|
---|
| 12 | -- Es kann aber Probleme geben bei Rechenoperationen mit den Flächen weil vorher "genau" übereinander
|
---|
| 13 | -- liegende Geometrien möglicherweise unterschiedlich reduziert werden.
|
---|
| 14 | -- Bei einem Objekt ist ein Zwischenpunkt vielleicht unnötig weil der Umring gerade weiter läuft.
|
---|
| 15 | -- Bei einem anderen Objekt zweigt der Umring aber ab, so das der Punkt nicht entfernt wird.
|
---|
| 16 | -- Dabei kann eine winzige Abweichung entstehen, die bei Verschneidungen zu etwas anderen Ergebnissen führt.
|
---|
| 17 | -- Die Abweichungen sind nur gering aber mathematisch gilt eben: "0.0 <> 0.000001".
|
---|
| 18 | -- Dies ist bei der Gestaltung von Anwendungen zu berücksichtigen.
|
---|
| 19 |
|
---|
| 20 |
|
---|
| 21 | -- Stand
|
---|
| 22 |
|
---|
| 23 | -- 2010-10-11
|
---|
| 24 | -- erstmalige Anwendung, Toleranz 2 mm
|
---|
| 25 |
|
---|
| 26 | -- 2010-10-11
|
---|
| 27 | -- Reduzierung auf 1 mm. Es sollen nur Zwischenpunkte "in der Geraden" entfernt werden.
|
---|
| 28 | -- Der Toleranzwert soll nur die Rundungsungenauigkeiten enthalten.
|
---|
| 29 | -- Es kann Probleme geben bei Verschneidung von Flächen. Die PostGIS-Function "st_intersects"
|
---|
| 30 | -- liefert auch Flächen, die sich am Rand berühren.
|
---|
| 31 | -- Wenn wirklich nur überlappende Flächen gewünscht sind, dann müssen diese mit
|
---|
| 32 | -- "st_area(st_intersection(a.geom,b.geom)) > 0"
|
---|
| 33 | -- heraus gefiltert werden.
|
---|
| 34 | -- Nach Anwendung dieses Simplify-Scriptes ist aber 0 nicht mehr 0. Es muss statt dessen mit
|
---|
| 35 | -- (etwas schwammigen) Grenzwerten gearbeitet werden.
|
---|
| 36 | -- Wenn z.B. die Ergebnis-Fläche sowieso auf eine Nachkommastelle gerundet wird, dann kann als Schwellwert
|
---|
| 37 | -- "st_area(st_intersection(a.geom,b.geom)) > 0.05"
|
---|
| 38 | -- verwendet werden. Es werden dann keine Flächen angezeigt, die gerundet als '0.0' angezeigt würden.
|
---|
| 39 | -- Im Zweifelsfall, z.B. wenn mit der Datenbank sehr viele Verschneidungen präzise berechnet werden solllen,
|
---|
| 40 | -- sollte dieses Script nicht verwendet werden.
|
---|
| 41 |
|
---|
| 42 |
|
---|
| 43 | -- 2010-11-10
|
---|
| 44 | -- neue Tabelle "nutzung"
|
---|
| 45 |
|
---|
| 46 |
|
---|
| 47 | -- Mengenanalyse siehe file "alkis_test_simplify.sql".
|
---|
| 48 |
|
---|
| 49 |
|
---|
| 50 | -- Daten im Geometriefeld optimieren:
|
---|
| 51 |
|
---|
| 52 | UPDATE "ap_lpo"
|
---|
| 53 | SET wkb_geometry = st_simplify(wkb_geometry, 0.001);
|
---|
| 54 |
|
---|
| 55 | UPDATE "ax_leitung"
|
---|
| 56 | SET wkb_geometry = st_simplify(wkb_geometry, 0.001);
|
---|
| 57 |
|
---|
| 58 | UPDATE "ax_transportanlage"
|
---|
| 59 | SET wkb_geometry = st_simplify(wkb_geometry, 0.001);
|
---|
| 60 |
|
---|
| 61 | UPDATE "ax_besondereflurstuecksgrenze"
|
---|
| 62 | SET wkb_geometry = st_simplify(wkb_geometry, 0.001);
|
---|
| 63 |
|
---|
| 64 | UPDATE "ax_wald"
|
---|
| 65 | SET wkb_geometry = st_simplify(wkb_geometry, 0.001);
|
---|
| 66 |
|
---|
| 67 | UPDATE "ax_gehoelz"
|
---|
| 68 | SET wkb_geometry = st_simplify(wkb_geometry, 0.001);
|
---|
| 69 |
|
---|
| 70 | UPDATE "ax_fliessgewaesser"
|
---|
| 71 | SET wkb_geometry = st_simplify(wkb_geometry, 0.001);
|
---|
| 72 |
|
---|
| 73 | UPDATE "ax_stehendesgewaesser"
|
---|
| 74 | SET wkb_geometry = st_simplify(wkb_geometry, 0.001);
|
---|
| 75 |
|
---|
| 76 | UPDATE "ax_wohnbauflaeche"
|
---|
| 77 | SET wkb_geometry = st_simplify(wkb_geometry, 0.001);
|
---|
| 78 |
|
---|
| 79 | UPDATE "ax_sportfreizeitunderholungsflaeche"
|
---|
| 80 | SET wkb_geometry = st_simplify(wkb_geometry, 0.001);
|
---|
| 81 |
|
---|
| 82 | UPDATE "ax_landwirtschaft"
|
---|
| 83 | SET wkb_geometry = st_simplify(wkb_geometry, 0.001);
|
---|
| 84 |
|
---|
| 85 | UPDATE "ax_strassenverkehr"
|
---|
| 86 | SET wkb_geometry = st_simplify(wkb_geometry, 0.001);
|
---|
| 87 |
|
---|
| 88 | UPDATE "ax_weg"
|
---|
| 89 | SET wkb_geometry = st_simplify(wkb_geometry, 0.001);
|
---|
| 90 |
|
---|
| 91 | UPDATE "ax_flaechegemischternutzung"
|
---|
| 92 | SET wkb_geometry = st_simplify(wkb_geometry, 0.001);
|
---|
| 93 |
|
---|
| 94 | UPDATE "ax_industrieundgewerbeflaeche"
|
---|
| 95 | SET wkb_geometry = st_simplify(wkb_geometry, 0.001);
|
---|
| 96 |
|
---|
| 97 | UPDATE "ax_flaechebesondererfunktionalerpraegung"
|
---|
| 98 | SET wkb_geometry = st_simplify(wkb_geometry, 0.001);
|
---|
| 99 |
|
---|
| 100 | UPDATE "ax_platz"
|
---|
| 101 | SET wkb_geometry = st_simplify(wkb_geometry, 0.001);
|
---|
| 102 |
|
---|
| 103 | UPDATE "ax_halde"
|
---|
| 104 | SET wkb_geometry = st_simplify(wkb_geometry, 0.001);
|
---|
| 105 |
|
---|
| 106 | UPDATE "ax_bergbaubetrieb"
|
---|
| 107 | SET wkb_geometry = st_simplify(wkb_geometry, 0.001);
|
---|
| 108 |
|
---|
| 109 | UPDATE "ax_tagebaugrubesteinbruch"
|
---|
| 110 | SET wkb_geometry = st_simplify(wkb_geometry, 0.001);
|
---|
| 111 |
|
---|
| 112 | UPDATE "ax_friedhof"
|
---|
| 113 | SET wkb_geometry = st_simplify(wkb_geometry, 0.001);
|
---|
| 114 |
|
---|
| 115 | UPDATE "ax_flugverkehr"
|
---|
| 116 | SET wkb_geometry = st_simplify(wkb_geometry, 0.001);
|
---|
| 117 |
|
---|
| 118 | UPDATE "ax_schiffsverkehr"
|
---|
| 119 | SET wkb_geometry = st_simplify(wkb_geometry, 0.001);
|
---|
| 120 |
|
---|
| 121 | UPDATE "ax_bahnverkehr"
|
---|
| 122 | SET wkb_geometry = st_simplify(wkb_geometry, 0.001);
|
---|
| 123 |
|
---|
| 124 | UPDATE "ax_hafenbecken"
|
---|
| 125 | SET wkb_geometry = st_simplify(wkb_geometry, 0.001);
|
---|
| 126 |
|
---|
| 127 | UPDATE "ax_heide"
|
---|
| 128 | SET wkb_geometry = st_simplify(wkb_geometry, 0.001);
|
---|
| 129 |
|
---|
| 130 | UPDATE "ax_moor"
|
---|
| 131 | SET wkb_geometry = st_simplify(wkb_geometry, 0.001);
|
---|
| 132 |
|
---|
| 133 | UPDATE "ax_sumpf"
|
---|
| 134 | SET wkb_geometry = st_simplify(wkb_geometry, 0.001);
|
---|
| 135 |
|
---|
| 136 | UPDATE "ax_unlandvegetationsloseflaeche"
|
---|
| 137 | SET wkb_geometry = st_simplify(wkb_geometry, 0.001);
|
---|
| 138 |
|
---|
| 139 | UPDATE "ax_besonderegebaeudelinie"
|
---|
| 140 | SET wkb_geometry = st_simplify(wkb_geometry, 0.001);
|
---|
| 141 |
|
---|
| 142 | UPDATE "ax_gebaeude"
|
---|
| 143 | SET wkb_geometry = st_simplify(wkb_geometry, 0.001);
|
---|
| 144 |
|
---|
| 145 | UPDATE "ax_bauteil"
|
---|
| 146 | SET wkb_geometry = st_simplify(wkb_geometry, 0.001);
|
---|
| 147 |
|
---|
| 148 | UPDATE "ax_bauwerkoderanlagefuersportfreizeitunderholung"
|
---|
| 149 | SET wkb_geometry = st_simplify(wkb_geometry, 0.001);
|
---|
| 150 |
|
---|
| 151 | UPDATE "ax_bauwerkimgewaesserbereich"
|
---|
| 152 | SET wkb_geometry = st_simplify(wkb_geometry, 0.001);
|
---|
| 153 |
|
---|
| 154 | UPDATE "ax_turm"
|
---|
| 155 | SET wkb_geometry = st_simplify(wkb_geometry, 0.001);
|
---|
| 156 |
|
---|
| 157 | UPDATE "ax_vorratsbehaelterspeicherbauwerk"
|
---|
| 158 | SET wkb_geometry = st_simplify(wkb_geometry, 0.001);
|
---|
| 159 |
|
---|
| 160 | UPDATE "ax_klassifizierungnachwasserrecht"
|
---|
| 161 | SET wkb_geometry = st_simplify(wkb_geometry, 0.001);
|
---|
| 162 |
|
---|
| 163 | UPDATE "ax_naturumweltoderbodenschutzrecht"
|
---|
| 164 | SET wkb_geometry = st_simplify(wkb_geometry, 0.001);
|
---|
| 165 |
|
---|
| 166 | UPDATE "ax_bewertung"
|
---|
| 167 | SET wkb_geometry = st_simplify(wkb_geometry, 0.001);
|
---|
| 168 |
|
---|
| 169 | UPDATE "ax_klassifizierungnachstrassenrecht"
|
---|
| 170 | SET wkb_geometry = st_simplify(wkb_geometry, 0.001);
|
---|
| 171 |
|
---|
| 172 | UPDATE "ax_schutzzone"
|
---|
| 173 | SET wkb_geometry = st_simplify(wkb_geometry, 0.001);
|
---|
| 174 |
|
---|
| 175 | UPDATE "ax_bodenschaetzung"
|
---|
| 176 | SET wkb_geometry = st_simplify(wkb_geometry, 0.001);
|
---|
| 177 |
|
---|
| 178 | UPDATE "ax_bauraumoderbodenordnungsrecht"
|
---|
| 179 | SET wkb_geometry = st_simplify(wkb_geometry, 0.001);
|
---|
| 180 |
|
---|
| 181 | UPDATE "ax_denkmalschutzrecht"
|
---|
| 182 | SET wkb_geometry = st_simplify(wkb_geometry, 0.001);
|
---|
| 183 |
|
---|
| 184 | UPDATE "ax_anderefestlegungnachwasserrecht"
|
---|
| 185 | SET wkb_geometry = st_simplify(wkb_geometry, 0.001);
|
---|
| 186 |
|
---|
| 187 |
|
---|
| 188 | -- Zusammen gefasste Nutzungarten
|
---|
| 189 | UPDATE "nutzung"
|
---|
| 190 | SET wkb_geometry = st_simplify(wkb_geometry, 0.001);
|
---|
| 191 |
|
---|
| 192 |
|
---|
| 193 | -- Vaccum der Datenbank ist notwendig um die gewonnen Reduzierung endgueltig zu erschließen.
|
---|
| 194 |
|
---|
| 195 |
|
---|
| 196 | -- Fuer weitere Fortfuehrungen (NBA-Verfahren) einen Trigger einrichten?
|
---|
| 197 |
|
---|
| 198 | -- Function zum Simplifizieren des Geometriefeldes:
|
---|
| 199 | -- CREATE OR REPLACE FUNCTION axsimlify()
|
---|
| 200 | -- RETURNS TRIGGER AS
|
---|
| 201 | -- $$
|
---|
| 202 | -- BEGIN
|
---|
| 203 | -- NEW.wkb_geometry := ST_Simplify(NEW.wkb_geometry, 0.001); -- Toleranz 1 Millimeter
|
---|
| 204 | -- RETURN NEW;
|
---|
| 205 | -- END;
|
---|
| 206 | -- $$
|
---|
| 207 | -- LANGUAGE 'plpgsql';
|
---|
| 208 |
|
---|
| 209 |
|
---|
| 210 | -- fuer alle Tabellen:
|
---|
| 211 |
|
---|
| 212 | -- CREATE TRIGGER axsimplify
|
---|
| 213 | -- BEFORE INSERT ON ax_wohnbauflaeche
|
---|
| 214 | -- FOR EACH ROW EXECUTE PROCEDURE axsimlify();
|
---|
| 215 |
|
---|
| 216 |
|
---|
| 217 | -- weitere. Liste wie oben ....
|
---|
| 218 |
|
---|
| 219 |
|
---|
| 220 | -- END -- |
---|