source: trunk/import/konv_batch.sh @ 353

Revision 353, 8.8 KB checked in by frank.jaeger, 5 years ago (diff)

kleine Verbesserungen am Post-Processing

RevLine 
[190]1#!/bin/bash
2## -------------------------------------------------
3## Konvertierung von ALKIS NAS-Format nach PostGIS -
4## NAS-Daten in einem Ordner konvertieren          -
5## Batch-Teil, Aufruf mit geprueften Parametern    -
6## -------------------------------------------------
7##
8## Ordner-Struktur:
9##   /mandant/
10##           /0001/*.xml.zip
11##           /0002/*.xml.zip
12##          usw.
13##           /temp/
14##   Auf der gleichen Ebene wie die Datenordner muss ein Ordner /temp/ existieren.
15##   Dort werden die NAS-Daten temporaer ausgepackt.
16##   Relativ zum mitgegebenen Parameter ist das: '../temp/'
17##   Parallel laufende Konvertierungen zum gleichen Mandanten
18##   wuerden hier durcheinander geraten. Vermeiden!
19##
20## Stand:
21##   2012-02-10 Umbennung nach 0.7
22##   2012-02-17 Optimierung
23##   2012-02-28 Neuer Parameter 4 um Post-Prozessing zu unterdruecken
24##   2012-04-25 Durch GDAL Patch #5444 werden die Loeschungen als Trigger auf Tabelle 'delete' verarbeitet
25##   2012-05-18 Umzug neue GDI, GDAL-Trunk unter Pfad
26##   2012-06-04 SQL-Skripte in deren Verzeichnis ausfuehren (Voraussetzung fuer \i Includes)
27##   2012-10-30 Umgebungsvariable setzen, delete-Tabelle am Ende fuer Analyse gefuellt lassen.
28##              Test als 0.7a mit gepatchter gdal-Version (noch 2.0dev)
[330]29##   2013-10-16 F.J. krz: Neues Script "pp_praesentation_action.sql" fÃŒr Reparatur der
30##              PrÀsentationsobjekte Straßenname im Post-Processing
31##   2013-10-24 F.J. krz: Zwischenlösung "praesentation_action.sql" wieder deaktiviert.
[314]32##   2014-01-31 F.J. krz: Import Eintrag erzeugen (nach Vorschlag Marvin Brandt, Unna)
[330]33##   2014-02-13 A.Emde WhereGroup: EinfÃŒhrung DBUSER, damit im Skript der Datenbankbenutzer angegeben werden kann
[328]34##   2014-05-12 F.J. krz: Unterschiedliche Pfade in Test (TRUNK) und Produktion (Rel. 1.11.0)
35##   2014-06-18 F.J. DB-User nicht "postgres" (in $con).
36##                   Konverter ind Nacharbeiten sonst mit unterschiedlichem User.
[330]37##                   Abgleich Test/Prod-Version.
[328]38##                   Entfernen der historischen Objekte nach Konvertierung.
[330]39##   2014-09-09 F.J. krz: Parameter "--config PG_USE_COPY YES" zur Beschleunigung. Ausgabe import-Tabelle.
[331]40##   2014-09-11 F.J. krz: Eintrag in import-Tabelle repariert.
41##                   Keine Abfrage des Symlinks auf kill/hist. Enstscheidend ist die aktuelle DB, nicht der Symlink
[338]42##   2014-09-23 F.J. krz: ZÀhlung der Funktionen in delete, dies in import-Tabelle eintragen (Metadaten)
[353]43##   2015-02-17 F.J. krz: OGR_SKIP=GML ?
44##   2015-03-16 F.J. krz: "-nlt CONVERT_TO_LINEAR" ersetzt "ST_CurvePolygon" nÀherungsweise durch "ST_Polygon"
45##   2015-03-24 F.J. krz: export NAS_INDICATOR
[328]46
[338]47## ToDo:
[353]48## - Vor der Konvertierung: Sicherung der DB als SQL-Dump
[338]49## - Unterscheidung e/a noch sinnvoll? Immer "a" = Aktualisierung = -update ?
50## - PostProcessing: Aufruf Script, sonst redundant zu pflegen
51
[330]52POSTNAS_HOME=$(dirname $0)
[190]53
[330]54# Konverterpfad. TRUNK-Version (immer letzter Stand der Entwicklung)
55PATH=/opt/gdal-2.0/bin:$PATH
[190]56EPSG=25832
[328]57DBUSER=b600352
[190]58
[317]59if [ $DBUSER == "" ]
60then
[318]61  echo "kein DBUSER gesetzt"
[317]62else
[318]63  PGUSER=" -U ${DBUSER} "
[317]64fi
[190]65
[317]66if [ $DBUSER == "" ]
67then
[318]68  echo "kein DBUSER gesetzt"
69else
[317]70  OGRPGUSER=" user=${DBUSER}"
71fi
[328]72 
73echo "
74**********************************************
75**   K o n v e r t i e r u n g     PostNAS  **
[330]76**********************************************"
[190]77## Parameter:
78ORDNER=$1
79DBNAME=$2
80UPD=$3
81PP=$4
[330]82
[190]83if [ $ORDNER == "" ]
84then
85        echo "Parameter 1 'Ordner' ist leer"
86        exit 1
87fi
88if [ $DBNAME == "" ]
89then
90        echo "Parameter 2 'Datenbank' ist leer"
91        exit 2
92fi
[330]93
[190]94if [ $UPD == "a" ]
95then
96        verarb="NBA-Aktualisierung"
97        update=" -update "
98else
99        if [ $UPD == "e" ]
100        then
101                verarb="Erstladen"
102                update=""
103        else
104                echo "Parameter 3 'Aktualisierung' ist weder e noch a"
105                exit 3
106        fi
107fi
[330]108
[190]109if [ $PP == "nopp" ]
110then
111        echo "KEIN Post-Processing nach dieser Konvertierung."
112else
113        if [ $PP == "pp" ]
114        then
115                echo "normales Post-Processing."
116        else
117                echo "FEHLER: Parameter 4 'Post-Proscessing' ist weder 'nopp' noch 'pp'"
118                exit 4
119        fi
120fi
[328]121
[190]122# Fehlerprotokoll:
[330]123  errprot=${POSTNAS_HOME}'/log/postnas_err_'$DBNAME'.prot'
[328]124
[330]125  echo "GDAL/PostNAS Konverter-Version:" >> $errprot
126  ogr2ogr --version >> $errprot
127
[190]128# DB-Connection
[330]129  con="${PGUSER} -p 5432 -d ${DBNAME} "
130  echo "Datenbank-Name . . = ${DBNAME}"
131  echo "DBUSER ${DBUSER}"
132  echo "PGUSER ${PGUSER}"
133  echo "OGRPGUSER ${OGRPGUSER}"
134  echo "Ordner NAS-Daten . = ${ORDNER}"
135  echo "Verarbeitungs-Modus= ${verarb}"
136  echo "POSTNAS_HOME ${POSTNAS_HOME}"
[328]137
[330]138  # noch alte delete-Eintraege?
139  echo "Leeren der delete-Tabelle"
140  psql $con -c 'TRUNCATE table "delete";'
[328]141
[338]142  #echo "Bisherige Konvertierungen (Import-Tabelle):"
143  #psql $con -c "SELECT * FROM import ORDER by id;"
[314]144
145# Import Eintrag erzeugen
[331]146# UrsprÌnglich fÌr Trigger-Steuerung benötigt. Nun als Metadaten nÌtzlich.
147  echo "INSERT INTO import (datum,verzeichnis,importart) VALUES ('"$(date '+%Y-%m-%d %H:%M:%S')"','"${ORDNER}"','"${verarb}"');" | psql $con
[314]148
[190]149# Ordner abarbeiten
[328]150
[190]151  cd ${ORDNER}
152  rm ../temp/*.gfs
153  echo "Dateien in " ${ORDNER} " (ls) :"
154  ls
[353]155
[190]156  for zipfile in *.zip ; do
157    echo " "
158    rm ../temp/*.xml
159    echo "*********"
160   #echo "* Archiv: " $zipfile
161    unzip ${zipfile}  -d ../temp
162    # Es sollte nur ein XML-File in jedem ZIP-File stecken, aber es geht auch anders.
[353]163
[190]164    for nasdatei in ../temp/*.xml ; do
165      # echo "* Datei:  " $nasdatei
166      # Zwischenueberschrift im Fehlerprotokoll
167      echo "* Datei: " $nasdatei >> $errprot
[328]168
[190]169      # Umgebungsvariable setzen:
170        export GML_FIELDTYPES=ALWAYS_STRINGS    # PostNAS behandelt Zahlen wie Strings, PostgreSQL-Treiber macht daraus Zahlen
171        export OGR_SETFIELD_NUMERIC_WARNING=YES # Meldung abgeschnittene Zahlen?
[353]172        #       export OGR_SKIP=GML     # NAS-Daten auch mit "falschen Header" nicht wie GML konvertieren - NEIN!
173                                                                # http://lists.osgeo.org/pipermail/nas/2014-December/000740.html
[190]174       #export CPL_DEBUG=ON                     # Meldung, wenn Attribute ueberschrieben werden
[353]175
176        # Headerkennungen die NAS-Daten identifizieren
177        export NAS_INDICATOR="NAS-Operationen.xsd;NAS-Operationen_optional.xsd;AAA-Fachschema.xsd;ASDKOM-NAS-Operationen_1_1_NRW.xsd"
178
[190]179      # PostNAS Konverter-Aufruf
[336]180      #   --config PG_USE_COPY YES
[353]181      #   -nlt CONVERT_TO_LINEAR  # 2015-03-16 ersetzt "ST_CurvePolygon" nÀherungsweise durch "ST_Polygon"
182      ogr2ogr -f "PostgreSQL" -append  ${update} -skipfailures  -nlt CONVERT_TO_LINEAR \
[317]183         PG:"dbname=${DBNAME} host=localhost port=5432 ${OGRPGUSER}" -a_srs EPSG:$EPSG ${nasdatei} 2>> $errprot
[190]184      nasresult=$?
[353]185
186      # Ergebnis in Logfile UND auf Konsole
[190]187      echo "* Resultat: " $nasresult " fuer " ${nasdatei} | tee -a $errprot
[353]188
189      # Farbige Anzeige des Ergebnis-Codes
190      if [ $nasresult == 0 ]
191      then
192        echo -e "\e[32m${nasdatei} verarbeitet\e[0m" # grÃŒn
193      else
194        echo -e "\e[31m${nasdatei} fehlerhaft\e[0m" # rot
195      fi
196
[190]197    done # Ende Zipfile
[353]198
[190]199  done # Ende Ordner
200  rm ../temp/*.xml
201  echo " "
[330]202  echo "** Ende Konvertierung Ordner ${ORDNER}"
[328]203
[338]204  # Durch EinfÃŒgen in Tabelle 'delete' werden Löschungen und Aktualisierungen anderer Tabellen getriggert
205  echo "** Die delete-Tabelle enthaelt so viele Zeilen:"
206  psql $con -c 'SELECT COUNT(featureid) AS delete_zeilen FROM "delete";'
207
208  echo "** aufgeteilt auf diese Funktionen:"
209  psql $con -c 'SELECT context, COUNT(featureid) AS anzahl FROM "delete" GROUP BY context ORDER BY context;'
210
211  # Kontext-Funktionen zÀhlen und dei Anzahl als Metadaten zum aktuellen Konvertierungslauf speichern
212  psql $con -c "
213   UPDATE import SET anz_delete=(SELECT count(*) FROM \"delete\" WHERE context='delete')
214   WHERE id=(SELECT max(id) FROM import) AND verzeichnis='${ORDNER}' AND anz_delete IS NULL;
215   UPDATE import SET anz_update=(SELECT count(*) FROM \"delete\" WHERE context='update')
216   WHERE id=(SELECT max(id) FROM import) AND verzeichnis='${ORDNER}' AND anz_update IS NULL;
217   UPDATE import SET anz_replace=(SELECT count(*) FROM \"delete\" WHERE context='replace')
218   WHERE id=(SELECT max(id) FROM import) AND verzeichnis='${ORDNER}' AND anz_replace IS NULL;"
219
[190]220# Post-Processing / Nacharbeiten
221  if [ $PP == "nopp" ]
222  then
223    echo "** KEIN Post-Processing - Dies spaeter nachholen."
224    # Dies kann sinnvoll sein, wenn mehrere kleine Aktualisierungen hintereinander auf einem grossen Bestand laufen
[330]225    # Der Aufwand fÃŒr das Post-Processing ist dann nur bei der LETZTEN Aktualisierung notwendig.
[190]226  else
227    echo "** Post-Processing (Nacharbeiten zur Konvertierung)"
[294]228
[336]229    echo "** - Optimierte Nutzungsarten neu Laden (Script nutzungsart_laden.sql):"
[317]230    (cd $POSTNAS_HOME; psql $con -f nutzungsart_laden.sql)
[328]231 
[336]232    echo "** - Fluren, Gemarkungen, Gemeinden und Straßen-Namen neu Laden (Script pp_laden.sql):"
[317]233    (cd $POSTNAS_HOME; psql $con -f pp_laden.sql)
[328]234  fi
[294]235
236  echo "Das Fehler-Protokoll wurde ausgegeben in die Datei $errprot"
[353]237  echo "** ENDE PostNAS 0.8-Konvertierung  DB='$DBNAME'  Ordner='$ORDNER' "
Note: See TracBrowser for help on using the repository browser.