source: trunk/import/konv_batch.sh @ 354

Revision 354, 10.1 KB checked in by frank.jaeger, 5 years ago (diff)

Die Uebersichten (vereinfachte Geometrie) fuer Flur, Gemarkung und Gemeinde werden nicht mehr bei jeder Aktualisierung neu generiert. Dadurch wird das Post-Processing etwas beschleunigt.

RevLine 
[190]1#!/bin/bash
2## -------------------------------------------------
[354]3## DB-Server - Produktion                          -
[190]4## Konvertierung von ALKIS NAS-Format nach PostGIS -
5## NAS-Daten in einem Ordner konvertieren          -
6## Batch-Teil, Aufruf mit geprueften Parametern    -
7## -------------------------------------------------
8##
9## Ordner-Struktur:
10##   /mandant/
[354]11##           /01/*.xml.zip
12##           /02/*.xml.zip
[190]13##          usw.
14##           /temp/
15##   Auf der gleichen Ebene wie die Datenordner muss ein Ordner /temp/ existieren.
16##   Dort werden die NAS-Daten temporaer ausgepackt.
17##   Relativ zum mitgegebenen Parameter ist das: '../temp/'
18##   Parallel laufende Konvertierungen zum gleichen Mandanten
19##   wuerden hier durcheinander geraten. Vermeiden!
20##
21## Stand:
22##   2012-06-04 SQL-Skripte in deren Verzeichnis ausfuehren (Voraussetzung fuer \i Includes)
[314]23##   2014-01-31 F.J. krz: Import Eintrag erzeugen (nach Vorschlag Marvin Brandt, Unna)
[330]24##   2014-02-13 A.Emde WhereGroup: EinfÃŒhrung DBUSER, damit im Skript der Datenbankbenutzer angegeben werden kann
[328]25##   2014-06-18 F.J. DB-User nicht "postgres" (in $con).
26##                   Konverter ind Nacharbeiten sonst mit unterschiedlichem User.
27##                   Entfernen der historischen Objekte nach Konvertierung.
[338]28##   2014-09-23 F.J. krz: ZÀhlung der Funktionen in delete, dies in import-Tabelle eintragen (Metadaten)
[353]29##   2015-03-16 F.J. krz: "-nlt CONVERT_TO_LINEAR" ersetzt "ST_CurvePolygon" nÀherungsweise durch "ST_Polygon"
30##   2015-03-24 F.J. krz: export NAS_INDICATOR
[354]31##   2015-05-26 F.J. krz: Pfad auf Version 1.11 geÀndert (Parameter -append wird bei TRUNK 2.0 ignoriert)
32##                        Dazu "-nlt CONVERT_TO_LINEAR" vorÃŒbergehend deaktiviert (erst ab 2.0 notwendig)
33##                        gdal-Version in Import-Tabelle schreiben. Zwischenfrage vor Konvertierung.
34##                        DB-Dump vor Aktualisierungslauf, auf Nachfrage.
35##   2015-10-27 F.J. krz: Teile von "pp_laden.sql" ausgelegert nach "pp_gebiete.sql".
36##                        Dies wird bei Parameter "pp" (mit Post-Processing) nur beim Erstladen mit ausgefÃŒhrt.
37##                        Bei Aktualisierungen mÃŒssen die Gebiete (Übersichten) nicht jedes Mal neu generiert werden.
[328]38
[338]39## ToDo:
40## - Unterscheidung e/a noch sinnvoll? Immer "a" = Aktualisierung = -update ?
41## - PostProcessing: Aufruf Script, sonst redundant zu pflegen
42
[354]43# Speicher-Ort dieses Scriptes legt den Pfad fuer Logging fest
44  POSTNAS_HOME=$(dirname $0)
[190]45
[354]46# Konverterpfad.
47  # TRUNK-Version 2.0.0Beta1 (selbst gebaut)
48  # Dabei: "-nlt CONVERT_TO_LINEAR" verwenden
49# PATH=/opt/gdal-2.0/bin:$PATH
[190]50
[354]51  # Stabile-Version 1.11.2 (selbst gebaut)
52  # Dabei: "-nlt CONVERT_TO_LINEAR" NICHT verwenden
53  PATH=/opt/gdal-1.11/bin:$PATH
[190]54
[354]55# Konfiguration:
56  EPSG=25832
57  DBUSER=b600352
58
59  if [ $DBUSER == "" ]
60  then
61    echo "kein DBUSER gesetzt"
62  else
63    PGUSER=" -U ${DBUSER} "
64    OGRPGUSER=" user=${DBUSER}"
65  fi
[328]66 
[354]67  echo "
68 
[328]69**********************************************
70**   K o n v e r t i e r u n g     PostNAS  **
[354]71**********************************************
72 "
[330]73
[354]74# Aufruf-Parameter:
75  ORDNER=$1
76  DBNAME=$2
77  UPD=$3
78  PP=$4
79
80# Parameter plausibilisieren
[190]81if [ $ORDNER == "" ]
82then
83        echo "Parameter 1 'Ordner' ist leer"
84        exit 1
85fi
86if [ $DBNAME == "" ]
87then
88        echo "Parameter 2 'Datenbank' ist leer"
89        exit 2
90fi
[330]91
[190]92if [ $UPD == "a" ]
93then
94        verarb="NBA-Aktualisierung"
95        update=" -update "
96else
97        if [ $UPD == "e" ]
98        then
99                verarb="Erstladen"
100                update=""
101        else
102                echo "Parameter 3 'Aktualisierung' ist weder e noch a"
103                exit 3
104        fi
105fi
[330]106
[190]107if [ $PP == "nopp" ]
108then
[354]109        echo "KEIN Post-Processing nach dieser Konvertierung"
[190]110else
111        if [ $PP == "pp" ]
112        then
[354]113                echo "mit Post-Processing"
[190]114        else
115                echo "FEHLER: Parameter 4 'Post-Proscessing' ist weder 'nopp' noch 'pp'"
116                exit 4
117        fi
118fi
[328]119
[354]120# DB-Connection (User, Port, Datenbank-Name)
121  con="${PGUSER} -p 5432 -d ${DBNAME} "
122
123# Anzeige Historie
124  echo "vorangegangene Konvertierung:"
125  psql $con -c "SELECT id, datum, verzeichnis, importart FROM import ORDER BY id DESC LIMIT 1;"
126
127# Anzeige Parameter
128  echo "Datenbank: ${DBNAME}"
129  echo "DBUSER: ${DBUSER}"
130 #echo "PGUSER: ${PGUSER}"
131 #echo "OGRPGUSER: ${OGRPGUSER}"
132  echo "Ordner NAS-Daten: ${ORDNER}"
133  echo "Verarbeitungs-Modus: ${verarb}"
134  echo "POSTNAS_HOME: ${POSTNAS_HOME}"
135  echo "Programm-Version: `ogr2ogr --version` "
136
137# Kontrolle der Parameter
138  echo "
139  Abschließende Bestaetigung:"
140  until [ "$JEIN" = "j" -o "$JEIN" = "n" ]
141  do
142    echo "Mit diesen Parametern konvertieren?  -  j oder n"
143    read JEIN
144  done
145  if test $JEIN != "j"
146  then
147    echo " ####  Abbruch"
148    exit 1
149  fi
150
[190]151# Fehlerprotokoll:
[330]152  errprot=${POSTNAS_HOME}'/log/postnas_err_'$DBNAME'.prot'
153  echo "GDAL/PostNAS Konverter-Version:" >> $errprot
154  ogr2ogr --version >> $errprot
155
[354]156# Sicherung der Datenbank VOR der Aktualisierung
157  if [ $UPD == "a" ]
158  then
[328]159
[354]160    until [ "$DUMP" = "j" -o "$DUMP" = "n" ]
161    do
162      echo "Datenbank-Sicherung?  -  j oder n"
163      read DUMP
164    done
[328]165
[354]166    if test $DUMP = "j"
167    then
168      echo "DB Dump wird ausgefuehrt"
169      echo "Datenbank-Dump in /data/bkup/${DBNAME}_vor_update.sql.gz" >> $errprot
170      pg_dump -U ${DBUSER} -o -C ${DBNAME} | gzip > /data/bkup/${DBNAME}_vor_update.sql.gz
171      echo "DB Dump wurde ausgefuehrt"
172      sleep 1
173    fi
174  fi
[314]175
[354]176# Import Eintrag schreiben
177  # Urspruenglich wurde die Tabelle "import" fuer die Trigger-Steuerung benoetigt.
178  # Nun als Metadaten zur Datenbank-Historie nuetzlich.
179  echo "INSERT INTO import (datum, verzeichnis, importart, gdalvers)
180    VALUES ('"$(date '+%Y-%m-%d %H:%M:%S')"','"${ORDNER}"','"${verarb}"', '`ogr2ogr --version`');" | psql $con
[314]181
[354]182# Alte delete-Eintraege loeschen
183  # Beim Eintrag in die delete-Tabelle wird ein Trigger ausgeloest.
184  # Danach werden die Eintraege nicht mehr benoetigt.
185  echo "
186  Leeren der delete-Tabelle"
187  psql $con -c 'TRUNCATE table "delete";'
188
[190]189# Ordner abarbeiten
190  cd ${ORDNER}
191  rm ../temp/*.gfs
192  echo "Dateien in " ${ORDNER} " (ls) :"
193  ls
[353]194
[190]195  for zipfile in *.zip ; do
196    echo " "
197    rm ../temp/*.xml
198    echo "*********"
199   #echo "* Archiv: " $zipfile
200    unzip ${zipfile}  -d ../temp
201    # Es sollte nur ein XML-File in jedem ZIP-File stecken, aber es geht auch anders.
[353]202
[190]203    for nasdatei in ../temp/*.xml ; do
204      # echo "* Datei:  " $nasdatei
205      # Zwischenueberschrift im Fehlerprotokoll
206      echo "* Datei: " $nasdatei >> $errprot
[328]207
[190]208      # Umgebungsvariable setzen:
209        export GML_FIELDTYPES=ALWAYS_STRINGS    # PostNAS behandelt Zahlen wie Strings, PostgreSQL-Treiber macht daraus Zahlen
210        export OGR_SETFIELD_NUMERIC_WARNING=YES # Meldung abgeschnittene Zahlen?
[353]211        #       export OGR_SKIP=GML     # NAS-Daten auch mit "falschen Header" nicht wie GML konvertieren - NEIN!
212                                                                # http://lists.osgeo.org/pipermail/nas/2014-December/000740.html
[354]213       #export CPL_DEBUG=ON     # Meldung, wenn Attribute ueberschrieben werden
[353]214
215        # Headerkennungen die NAS-Daten identifizieren
216        export NAS_INDICATOR="NAS-Operationen.xsd;NAS-Operationen_optional.xsd;AAA-Fachschema.xsd;ASDKOM-NAS-Operationen_1_1_NRW.xsd"
217
[190]218      # PostNAS Konverter-Aufruf
[336]219      #   --config PG_USE_COPY YES
[354]220      #   -nlt CONVERT_TO_LINEAR  # ersetzt "ST_CurvePolygon" nÀherungsweise durch "ST_Polygon", ab Vers. 2.0
221   #  ogr2ogr -f "PostgreSQL" -append  ${update} -skipfailures  -nlt CONVERT_TO_LINEAR
222      ogr2ogr -f "PostgreSQL" -append  ${update} -skipfailures \
[317]223         PG:"dbname=${DBNAME} host=localhost port=5432 ${OGRPGUSER}" -a_srs EPSG:$EPSG ${nasdatei} 2>> $errprot
[190]224      nasresult=$?
[353]225
226      # Ergebnis in Logfile UND auf Konsole
[190]227      echo "* Resultat: " $nasresult " fuer " ${nasdatei} | tee -a $errprot
[353]228
229      # Farbige Anzeige des Ergebnis-Codes
230      if [ $nasresult == 0 ]
231      then
232        echo -e "\e[32m${nasdatei} verarbeitet\e[0m" # grÃŒn
233      else
[354]234        echo -e "\e[31m${nasdatei} fehlerhaft\e[0m"  # rot
[353]235      fi
236
[190]237    done # Ende Zipfile
[353]238
[190]239  done # Ende Ordner
240  rm ../temp/*.xml
[354]241  echo "
242  ** Ende Konvertierung Ordner ${ORDNER}"
[328]243
[338]244  # Durch EinfÃŒgen in Tabelle 'delete' werden Löschungen und Aktualisierungen anderer Tabellen getriggert
245  echo "** Die delete-Tabelle enthaelt so viele Zeilen:"
246  psql $con -c 'SELECT COUNT(featureid) AS delete_zeilen FROM "delete";'
247
248  echo "** aufgeteilt auf diese Funktionen:"
249  psql $con -c 'SELECT context, COUNT(featureid) AS anzahl FROM "delete" GROUP BY context ORDER BY context;'
250
[354]251  # Kontext-Funktionen zÀhlen und die Anzahl als Metadaten zum aktuellen Konvertierungslauf speichern
[338]252  psql $con -c "
253   UPDATE import SET anz_delete=(SELECT count(*) FROM \"delete\" WHERE context='delete')
254   WHERE id=(SELECT max(id) FROM import) AND verzeichnis='${ORDNER}' AND anz_delete IS NULL;
255   UPDATE import SET anz_update=(SELECT count(*) FROM \"delete\" WHERE context='update')
256   WHERE id=(SELECT max(id) FROM import) AND verzeichnis='${ORDNER}' AND anz_update IS NULL;
257   UPDATE import SET anz_replace=(SELECT count(*) FROM \"delete\" WHERE context='replace')
258   WHERE id=(SELECT max(id) FROM import) AND verzeichnis='${ORDNER}' AND anz_replace IS NULL;"
259
[190]260# Post-Processing / Nacharbeiten
261  if [ $PP == "nopp" ]
262  then
263    echo "** KEIN Post-Processing - Dies spaeter nachholen."
[354]264    # Dies kann sinnvoll sein, wenn mehrere kleine Aktualisierungen hintereinander auf einem grossen Bestand laufen.
[330]265    # Der Aufwand fÃŒr das Post-Processing ist dann nur bei der LETZTEN Aktualisierung notwendig.
[190]266  else
267    echo "** Post-Processing (Nacharbeiten zur Konvertierung)"
[294]268
[336]269    echo "** - Optimierte Nutzungsarten neu Laden (Script nutzungsart_laden.sql):"
[317]270    (cd $POSTNAS_HOME; psql $con -f nutzungsart_laden.sql)
[328]271 
[354]272        echo "** - Straßen-Namen neu Laden (Script pp_laden.sql):"
273        (cd $POSTNAS_HOME; psql $con -f pp_laden.sql)
274
275        if [ $UPD == "e" ]
276        then
277                # Erstladen: Gebiete erstmalig befuellen.
278                echo "** - Fluren, Gemarkungen, Gemeinden neu Laden (Script pp_gebiete.sql):"
279                (cd $POSTNAS_HOME; psql $con -f pp_gebiete.sql)
280        else
281                # Aktualisierung: Gebiete brauchen nicht bei jeder Aktualisierung neu generiert werden. Die aendern sich kaum.
282                echo "Die Uebersichten fÃŒr Flur, Gemarkung und Gemeinde werden nicht neu generiert. Bei Bedarf das SQL-Script pp_gebiete.sql ausfuehren."
283        fi
[328]284  fi
[294]285
286  echo "Das Fehler-Protokoll wurde ausgegeben in die Datei $errprot"
[354]287  echo "
288  ** ENDE PostNAS 0.8-Konvertierung  DB='$DBNAME'  Ordner='$ORDNER'
289  "
Note: See TracBrowser for help on using the repository browser.