source: trunk/data/konvert/postnas_0.6/atkis_rp_rendering/processing/flaechen.sh @ 147

Revision 114, 8.2 KB checked in by tobias.dick, 12 years ago (diff)

Initiale Dateien um per PostNAS importierte ATKIS Daten für ein Online Rendering aufzubereiten. Die Scripte erzeugen pro darzustellender Objektart bis zu 6 Generalisierungsstufen. Die Parameter können in den Shellscripten angepasst werden. Die Visualisierung kann z.B. über den Mapserver erfolgen. Der Bildaufbau sollte in jeder Stufe unter einer Sekunde benötigen. Die Laufzeit der Scripte beträgt auf einem single core 2.0GHz Prozessor ca 2.5 Stunden.

  • Property svn:executable set to *
Line 
1#!/bin/bash
2
3source psql.conf
4
5####################################################################
6#                                       ab hier nichts mehr Àndern
7#                               do not change anything below this line.
8####################################################################
9
10# Kommandozeilen-Variante
11# @params
12# Tabellenparameter::
13# $1= einzulesende Tabelle
14table_input=$1
15# $2= auszugebende Tabelle
16table_output=$2
17# $3= in welcher Spalte wird die Widmung vorgehalten? (kann NULL-Werte enthalten)
18column_label=$3
19# Generalisierungsparameter:
20# $4= Mindestgröße fÃŒr Außenpolygone
21minArea_outer=$4
22# $5= Mindestgröße fÃŒr Innenpolygono
23minArea_inner=$5
24# $6= SimplifyDistance fÃŒr Außenpolygone
25simplDist_outer=$6
26# $7= SimplifyDistance fÃŒr Innenpolygone
27simplDist_inner=$7
28# $8= RasterCellsize fÃŒr Perimter-Verschneidungen (siehe Doku)
29rasterCellsize=$8
30##
31##
32##
33# @ToDo: "Input at hoc"-Variante (read "Geben Sie den Tabellennamen der Eingabedaten ein:" table_input, ...)
34# @ToDo: Automatisierte Variante mit cat betroffene.txt
35
36
37force=false
38if [ $9 ]; then
39        if [ $9 == 'true' ] || [ $9 == 1 ]; then
40                force=true
41                echo "batch mode mit 'force' gesetzt."
42        fi
43fi
44
45# Testen, ob Variablen gesetzt sind
46
47if [ ! $table_input ]; then
48        error="${error}Keine Angabe zur Eingabetabelle gemacht!\r\n"
49fi
50if [ ! $table_output ]; then
51        error="${error}Keine Angabe zur Ausgabetabelle gemacht!\r\n"
52fi
53if [ ! $column_label ]; then
54        error="${error}Keine Angabe zur Spalte 'Widmung' gemacht!\r\n"
55fi
56if [ ! $minArea_outer ]; then
57        error="${error}Keine Angabe zur Mindestgröße der Außenpolygone!\r\n"
58fi
59if [ ! $minArea_inner ]; then
60        error="${error}Keine Angabe zur Mindestgröße der Innenpolygone!\r\n"
61fi
62if [ ! $simplDist_outer ]; then
63        error="${error}Keine Angabe zur Simplify-Distance fÃŒr die Außenpolygone!\r\n"
64fi
65if [ ! $simplDist_inner ]; then
66        error="${error}Keine Angabe zur Simplify-Distance fÃŒr die Innenpolygone!\r\n"
67fi
68if [ ! $RasterCellsize ]; then
69        error="${error}Keine Angabe zur Zellgröße (in km) fÃŒr die Verschneidung!\r\n"
70fi
71
72if [ $# -lt 9 ]; then
73        echo "Aufruf mit inkorrekter Anzahl an Parametern:"
74        echo -e $error #@ ToDo
75        exit 0
76fi
77
78# Festlegen der Datenbank-Verbindung
79echo "Teste PostGIS-Verbindung zu $dbname auf $dbuser@$dbhost:$dbport:"
80if [ $dbpass == false ]; then
81        CONN="psql --user=$dbuser $dbname --host=$dbhost --port=$dbport -w"
82else   
83        CONN="psql --user=$dbuser $dbname --host=$dbhost --port=$dbport --password=$dbpass"
84fi
85
86# Testen, ob die Eingangstabelle exisitiert
87QUERY="${CONN} -c 'SELECT true FROM $table_input LIMIT 1 OFFSET 0' --quiet"
88
89if eval $QUERY &> /dev/null;
90then
91        echo "Verbindung erfolgreich hergestellt, Eingabetabelle existiert."
92else # Kein Abruf von Tabelle möglich - DB-Konfig falsch oder Tabelle nicht existent
93        QUERY="${CONN} -c 'SELECT false' --quiet"
94        if eval $QUERY &> /dev/null;
95        then
96                echo "Fehler: Eingabetabelle $table_input existiert nicht."
97        else
98                echo "Fehler: Verbindung zum Server konnte nicht hergestellt werden!"
99                echo "Bitte Verbindungseinstellungen ÃŒberprÃŒfen."
100        fi
101        exit 0
102fi
103
104
105# Testen, ob die Ausgabetabelle bereits exisitiert - Abfrage: Überschreiben oder Abbruch?
106QUERY="${CONN} -c 'SELECT true FROM $table_output LIMIT 1 OFFSET 0' --quiet"
107
108if eval $QUERY &> /dev/null;
109then
110        echo "Ausgabetabelle existiert bereits!"
111       
112        response=false
113        if [ $force == true ]; then
114                response=true
115                QUERY="${CONN} -c 'DROP TABLE $table_output' --quiet"
116                eval $QUERY &> /dev/null;
117                echo "Tabelle $table_output gelöscht."
118        fi
119
120        while [ $response = false ]; do
121                read -p "[L]ösche Tabelle oder [A]bbruch: " var
122                if [ "$var" = 'L' ]; then
123                        response=true
124                        QUERY="${CONN} -c 'DROP TABLE $table_output' --quiet"
125                        eval $QUERY &> /dev/null;
126                        echo "Tabelle $table_output gelöscht."
127                elif [ "$var" = 'A' ]; then
128                        response=true
129                        echo "Abbruch durch Benutzer."
130                        exit 0
131                fi
132        done
133else # Kein Abruf von Tabelle möglich - DB-Konfig falsch oder Tabelle nicht existent
134        QUERY="${CONN} -c 'SELECT false' --quiet"
135        if eval $QUERY &> /dev/null;
136        then
137                echo "Alle Vorbereitungen zum Prozessieren sind abgeschlossen."
138        else
139                echo "Fehler: Verbindung zum Server konnte nicht hergestellt werden!"
140                echo "Bitte Verbindungseinstellungen ÃŒberprÃŒfen."
141        fi
142fi
143
144# NÀchstes "Fenster"
145if [ $force != true ]; then
146        read -p "DrÃŒcken Sie eine beliebige Taste zum Fortfahren: " > /dev/null
147        echo '##            ATKIS-Generalisierung :: Wrapper            ##'
148fi;
149
150if [ $dbpass == false ]; then
151        CONN="psql --user=$dbuser $dbname --host=$dbhost --port=$dbport -w"
152else   
153        CONN="psql --user=$dbuser $dbname --host=$dbhost --port=$dbport --password=$dbpass"
154fi
155
156################################# GENERALISIERUNG per se #################################
157
158time $CONN -c "DROP TABLE IF EXISTS temp0;
159        SELECT path[1] AS path, ST_MakePolygon(ST_ExteriorRing(geom)) AS wkb_geometry, $3::text
160        INTO temp0
161        FROM (
162                SELECT (ST_DumpRings( wkb_geometry )).*, $3
163                FROM $1
164        ) AS t1;
165        CREATE INDEX temp0_geomidx ON temp0 USING GIST ( wkb_geometry );
166        DROP SEQUENCE IF EXISTS temp0_geomid_seq;
167        CREATE SEQUENCE temp0_geomid_seq;
168        ALTER TABLE temp0 ADD COLUMN geomid INTEGER;
169        UPDATE temp0 SET geomid = nextval('temp0_geomid_seq');
170        ALTER TABLE temp0 ALTER COLUMN geomid SET DEFAULT nextval('temp0_geomid_seq');
171        --
172        DELETE FROM temp0 WHERE path = 0 AND ST_Area( wkb_geometry ) < $4; --
173        DELETE FROM temp0 WHERE path <> 0 AND ST_Area( wkb_geometry ) < $5; --
174        UPDATE temp0 SET wkb_geometry = ST_Buffer(
175                                                                                        ST_Buffer(
176                                                                                                        ST_SimplifyPreserveTopology( wkb_geometry, $6 )
177                                                                                        , SQRT( $6 ) )
178                                                                        , SQRT( $6 ) *-1 )
179        WHERE path = 0;
180        UPDATE temp0 SET wkb_geometry = ST_Buffer(
181                                                                                        ST_Buffer(
182                                                                                                        ST_SimplifyPreserveTopology( wkb_geometry, $7 )
183                                                                                        , SQRT( $7 ) )
184                                                                        , SQRT( $7 ) *-1 )
185        WHERE path <> 0;
186        INSERT INTO temp0
187        (wkb_geometry, path, $3)
188        SELECT
189                ST_Buffer(      ST_Buffer( wkb_geometry , 1.5 ), -1.5 ) AS wkb_geometry,
190                path, $3
191        FROM temp0
192        WHERE NOT ST_IsValid( wkb_geometry );
193        DELETE FROM temp0 WHERE NOT ST_IsValid( wkb_geometry );";
194
195
196time $CONN -c "ALTER TABLE temp0 ADD COLUMN relate VARCHAR;
197        UPDATE temp0 AS t SET relate = 'intersects'
198        WHERE EXISTS (
199                SELECT 1
200                        FROM map_landesflaeche_g0 AS rlp
201                        WHERE rlp.wkb_geometry && t.wkb_geometry
202                        GROUP BY t.wkb_geometry
203                        HAVING ST_Overlaps( ST_Union(rlp.wkb_geometry), t.wkb_geometry )
204        );
205        INSERT INTO temp0
206        (relate, wkb_geometry, path, $3)
207        SELECT 'clipped' AS relate, proc.wkb_geometry, path, $3
208        FROM (
209                SELECT path, $3, (ST_Dump(wkb_geometry)).geom AS wkb_geometry
210                FROM (
211                        SELECT ST_Intersection( lyr, rlp) AS wkb_geometry, path, $3
212                        FROM
213                        (
214                                SELECT path, $3, relate, wkb_geometry AS lyr FROM temp0
215                        ) AS w,
216                        (
217                                SELECT wkb_geometry AS rlp FROM map_landesflaeche
218                        ) AS l
219                        WHERE w.relate = 'intersects'
220                ) AS wrapper
221        ) AS proc;
222
223        DELETE FROM temp0 WHERE relate = 'intersects' OR ST_GeometryType( wkb_geometry ) IN ('ST_Point', 'ST_LineString');
224
225        INSERT INTO temp0
226        (relate, wkb_geometry, path, $3 )
227        SELECT relate, (ST_Dump( wkb_geometry )).geom AS wkb_geometry, path, $3
228        FROM temp0
229        WHERE ST_GeometryType( wkb_geometry ) = 'ST_MultiPolygon';
230        DELETE FROM temp0 WHERE ST_GeometryType( wkb_geometry ) = 'ST_MultiPolygon';
231        DROP TABLE IF EXISTS $2;
232
233                SELECT ST_MakePolygon( ST_ExteriorRing(o.wkb_geometry) , ST_Accum(ST_ExteriorRing(i.wkb_geometry)) ) AS wkb_geometry, o.$3
234                INTO $2
235                FROM temp0 AS o
236                INNER JOIN temp0 AS i
237                ON ST_Contains(o.wkb_geometry, i.wkb_geometry)
238                WHERE o.path = 0 AND NOT (o.wkb_geometry ~= i.wkb_geometry)
239                GROUP BY o.wkb_geometry, o.$3
240        UNION ALL
241                SELECT
242                t0.wkb_geometry, $3
243                FROM temp0 AS t0
244                WHERE NOT EXISTS( SELECT 1 FROM temp0 AS t1 WHERE ST_Contains(t0.wkb_geometry, t1.wkb_geometry) AND NOT (t0.wkb_geometry ~= t1.wkb_geometry) ) AND t0.path = 0;
245        DROP TABLE temp0;
246        CREATE INDEX $2_gidx ON $2 USING GIST ( wkb_geometry );
247        DROP SEQUENCE IF EXISTS $2_gid_seq;
248        CREATE SEQUENCE $2_gid_seq;
249        ALTER TABLE $2 ADD COLUMN gid INTEGER;
250        UPDATE $2 SET gid = nextval('$2_gid_seq');
251        ALTER TABLE $2 ALTER COLUMN gid SET DEFAULT nextval('$2_gid_seq');
252        UPDATE $2 SET wkb_geometry = ST_Buffer(ST_Buffer( wkb_geometry, 1), -1) WHERE NOT ST_IsValid( wkb_geometry );
253        UPDATE $2 SET wkb_geometry = (ST_Dump( wkb_geometry )).geom WHERE ST_GeometryType( wkb_geometry ) = 'ST_MultiPolygon';
254        REINDEX TABLE $2; "
Note: See TracBrowser for help on using the repository browser.