Changeset 354 for trunk/import


Ignore:
Timestamp:
10/27/15 13:04:07 (8 years ago)
Author:
frank.jaeger
Message:

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

Location:
trunk/import
Files:
1 added
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/import/alkis_PostNAS_schema.sql

    r353 r354  
    6262-- 2014-10-14 FJ "ax_wirtschaftlicheeinheit.anlass" von integer zu character. Sonst Trigger-Fehler bei "delete". 
    6363 
    64 -- 2015-02-18 FJ "ax_gelaendekante.wkb_geometry" von 'LINESTRING' nach 'GEOMETRY'  
     64-- 2015-02-18 FJ "ax_gelaendekante.wkb_geometry" von 'LINESTRING' nach 'GEOMETRY' 
     65 
     66-- 2015-05-26 FJ Spalte "gdalvers" in Tabelle "import" 
    6567 
    6668--  Dies Schema kann NICHT mehr mit der gdal-Version 1.9 verwendet werden. 
     
    109111  verzeichnis text, 
    110112  importart text, 
     113  gdalvers text, 
    111114  anz_delete integer, 
    112115  anz_update integer, 
     
    114117  CONSTRAINT import_pk PRIMARY KEY (id) 
    115118); 
     119 
     120-- Spalte nachtragen: 
     121-- ALTER TABLE import ADD COLUMN gdalvers text; 
    116122 
    117123CREATE UNIQUE INDEX import_id ON import USING btree (id); 
     
    122128COMMENT ON COLUMN import.verzeichnis IS 'Ort von dem die NAS-Dateien verarbeitet wurden.'; 
    123129COMMENT ON COLUMN import.importart   IS 'Modus des Konverter-Laufes: e="Erstladen" oder a="NBA-Aktualisierung"'; 
     130COMMENT ON COLUMN import.gdalvers    IS 'GDAL-Programmversion mit der der Import erfolgte.'; 
    124131 
    125132COMMENT ON COLUMN import.anz_delete  IS 'Anzahl von delete-Funktionen in der delete-Tabelle nach Ende eines Konvertierungs-Laufes'; 
  • trunk/import/konv_batch.sh

    r353 r354  
    11#!/bin/bash 
    22## ------------------------------------------------- 
     3## DB-Server - Produktion                          - 
    34## Konvertierung von ALKIS NAS-Format nach PostGIS - 
    45## NAS-Daten in einem Ordner konvertieren          - 
     
    89## Ordner-Struktur: 
    910##   /mandant/ 
    10 ##           /0001/*.xml.zip 
    11 ##           /0002/*.xml.zip 
     11##           /01/*.xml.zip 
     12##           /02/*.xml.zip 
    1213##          usw. 
    1314##           /temp/ 
     
    1920## 
    2021## 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  
    2622##   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) 
    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. 
    3223##   2014-01-31 F.J. krz: Import Eintrag erzeugen (nach Vorschlag Marvin Brandt, Unna) 
    3324##   2014-02-13 A.Emde WhereGroup: EinfÃŒhrung DBUSER, damit im Skript der Datenbankbenutzer angegeben werden kann 
    34 ##   2014-05-12 F.J. krz: Unterschiedliche Pfade in Test (TRUNK) und Produktion (Rel. 1.11.0) 
    3525##   2014-06-18 F.J. DB-User nicht "postgres" (in $con).  
    3626##                   Konverter ind Nacharbeiten sonst mit unterschiedlichem User. 
    37 ##                   Abgleich Test/Prod-Version. 
    3827##                   Entfernen der historischen Objekte nach Konvertierung. 
    39 ##   2014-09-09 F.J. krz: Parameter "--config PG_USE_COPY YES" zur Beschleunigung. Ausgabe import-Tabelle. 
    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 
    4228##   2014-09-23 F.J. krz: ZÀhlung der Funktionen in delete, dies in import-Tabelle eintragen (Metadaten) 
    43 ##   2015-02-17 F.J. krz: OGR_SKIP=GML ? 
    4429##   2015-03-16 F.J. krz: "-nlt CONVERT_TO_LINEAR" ersetzt "ST_CurvePolygon" nÀherungsweise durch "ST_Polygon" 
    4530##   2015-03-24 F.J. krz: export NAS_INDICATOR 
     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.  
    4638 
    4739## ToDo:  
    48 ## - Vor der Konvertierung: Sicherung der DB als SQL-Dump 
    4940## - Unterscheidung e/a noch sinnvoll? Immer "a" = Aktualisierung = -update ? 
    5041## - PostProcessing: Aufruf Script, sonst redundant zu pflegen 
    5142 
    52 POSTNAS_HOME=$(dirname $0) 
    53  
    54 # Konverterpfad. TRUNK-Version (immer letzter Stand der Entwicklung) 
    55 PATH=/opt/gdal-2.0/bin:$PATH 
    56 EPSG=25832 
    57 DBUSER=b600352 
    58  
    59 if [ $DBUSER == "" ] 
    60 then 
    61   echo "kein DBUSER gesetzt" 
    62 else 
    63   PGUSER=" -U ${DBUSER} " 
    64 fi 
    65  
    66 if [ $DBUSER == "" ] 
    67 then 
    68   echo "kein DBUSER gesetzt" 
    69 else 
    70   OGRPGUSER=" user=${DBUSER}" 
    71 fi 
     43# Speicher-Ort dieses Scriptes legt den Pfad fuer Logging fest 
     44  POSTNAS_HOME=$(dirname $0) 
     45 
     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 
     50 
     51  # Stabile-Version 1.11.2 (selbst gebaut) 
     52  # Dabei: "-nlt CONVERT_TO_LINEAR" NICHT verwenden 
     53  PATH=/opt/gdal-1.11/bin:$PATH 
     54 
     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 
    7266  
    73 echo "  
     67  echo "  
     68  
    7469********************************************** 
    7570**   K o n v e r t i e r u n g     PostNAS  ** 
    76 **********************************************" 
    77 ## Parameter: 
    78 ORDNER=$1 
    79 DBNAME=$2 
    80 UPD=$3 
    81 PP=$4 
    82  
     71********************************************** 
     72 " 
     73 
     74# Aufruf-Parameter: 
     75  ORDNER=$1 
     76  DBNAME=$2 
     77  UPD=$3 
     78  PP=$4 
     79 
     80# Parameter plausibilisieren 
    8381if [ $ORDNER == "" ] 
    8482then 
     
    109107if [ $PP == "nopp" ] 
    110108then 
    111         echo "KEIN Post-Processing nach dieser Konvertierung." 
     109        echo "KEIN Post-Processing nach dieser Konvertierung" 
    112110else 
    113111        if [ $PP == "pp" ] 
    114112        then 
    115                 echo "normales Post-Processing." 
     113                echo "mit Post-Processing" 
    116114        else 
    117115                echo "FEHLER: Parameter 4 'Post-Proscessing' ist weder 'nopp' noch 'pp'" 
     
    120118fi 
    121119 
     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 
    122151# Fehlerprotokoll: 
    123152  errprot=${POSTNAS_HOME}'/log/postnas_err_'$DBNAME'.prot' 
    124  
    125153  echo "GDAL/PostNAS Konverter-Version:" >> $errprot 
    126154  ogr2ogr --version >> $errprot 
    127155 
    128 # DB-Connection 
    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}" 
    137  
    138   # noch alte delete-Eintraege? 
    139   echo "Leeren der delete-Tabelle" 
     156# Sicherung der Datenbank VOR der Aktualisierung 
     157  if [ $UPD == "a" ] 
     158  then 
     159 
     160    until [ "$DUMP" = "j" -o "$DUMP" = "n" ] 
     161    do 
     162      echo "Datenbank-Sicherung?  -  j oder n" 
     163      read DUMP 
     164    done 
     165 
     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 
     175 
     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 
     181 
     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" 
    140187  psql $con -c 'TRUNCATE table "delete";' 
    141188 
    142   #echo "Bisherige Konvertierungen (Import-Tabelle):" 
    143   #psql $con -c "SELECT * FROM import ORDER by id;" 
    144  
    145 # Import Eintrag erzeugen 
    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 
    148  
    149189# Ordner abarbeiten 
    150  
    151190  cd ${ORDNER} 
    152191  rm ../temp/*.gfs 
     
    172211        #       export OGR_SKIP=GML     # NAS-Daten auch mit "falschen Header" nicht wie GML konvertieren - NEIN! 
    173212                                                                # http://lists.osgeo.org/pipermail/nas/2014-December/000740.html 
    174        #export CPL_DEBUG=ON                     # Meldung, wenn Attribute ueberschrieben werden 
     213       #export CPL_DEBUG=ON     # Meldung, wenn Attribute ueberschrieben werden 
    175214 
    176215        # Headerkennungen die NAS-Daten identifizieren 
     
    179218      # PostNAS Konverter-Aufruf 
    180219      #   --config PG_USE_COPY YES 
    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 \ 
     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 \ 
    183223         PG:"dbname=${DBNAME} host=localhost port=5432 ${OGRPGUSER}" -a_srs EPSG:$EPSG ${nasdatei} 2>> $errprot 
    184224      nasresult=$? 
     
    192232        echo -e "\e[32m${nasdatei} verarbeitet\e[0m" # grÃŒn 
    193233      else 
    194         echo -e "\e[31m${nasdatei} fehlerhaft\e[0m" # rot 
     234        echo -e "\e[31m${nasdatei} fehlerhaft\e[0m"  # rot 
    195235      fi 
    196236 
     
    199239  done # Ende Ordner 
    200240  rm ../temp/*.xml 
    201   echo " " 
    202   echo "** Ende Konvertierung Ordner ${ORDNER}" 
     241  echo "  
     242  ** Ende Konvertierung Ordner ${ORDNER}" 
    203243 
    204244  # Durch EinfÃŒgen in Tabelle 'delete' werden Löschungen und Aktualisierungen anderer Tabellen getriggert 
     
    209249  psql $con -c 'SELECT context, COUNT(featureid) AS anzahl FROM "delete" GROUP BY context ORDER BY context;'  
    210250 
    211   # Kontext-Funktionen zÀhlen und dei Anzahl als Metadaten zum aktuellen Konvertierungslauf speichern 
     251  # Kontext-Funktionen zÀhlen und die Anzahl als Metadaten zum aktuellen Konvertierungslauf speichern 
    212252  psql $con -c " 
    213253   UPDATE import SET anz_delete=(SELECT count(*) FROM \"delete\" WHERE context='delete')  
     
    222262  then 
    223263    echo "** KEIN Post-Processing - Dies spaeter nachholen." 
    224     # Dies kann sinnvoll sein, wenn mehrere kleine Aktualisierungen hintereinander auf einem grossen Bestand laufen 
     264    # Dies kann sinnvoll sein, wenn mehrere kleine Aktualisierungen hintereinander auf einem grossen Bestand laufen. 
    225265    # Der Aufwand fÃŒr das Post-Processing ist dann nur bei der LETZTEN Aktualisierung notwendig. 
    226266  else 
     
    230270    (cd $POSTNAS_HOME; psql $con -f nutzungsart_laden.sql) 
    231271  
    232     echo "** - Fluren, Gemarkungen, Gemeinden und Straßen-Namen neu Laden (Script pp_laden.sql):" 
    233     (cd $POSTNAS_HOME; psql $con -f pp_laden.sql) 
     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 
    234284  fi 
    235285 
    236286  echo "Das Fehler-Protokoll wurde ausgegeben in die Datei $errprot" 
    237   echo "** ENDE PostNAS 0.8-Konvertierung  DB='$DBNAME'  Ordner='$ORDNER' " 
     287  echo " 
     288  ** ENDE PostNAS 0.8-Konvertierung  DB='$DBNAME'  Ordner='$ORDNER' 
     289  " 
  • trunk/import/pp_laden.sql

    r351 r354  
    22-- ALKIS PostNAS 0.8 
    33 
    4 -- Post Processing (pp_) Teil 2: Laden der Tabellen 
     4-- Post Processing (pp_) Teil 2 A: Laden der Tabellen 
    55 
    66-- Stand  
     
    2525--  2014-12-17 Neue Spalte "gemeinde" in Tabelle "pp_flur", dient der Filterung im WMS-Layer "Gebiete" 
    2626--  2015-01-08 Mehrfach-Versuche der Geometrie-Zusammenfassung mit wachsender Puffergröße. 
     27--  2015-10-27 Die Erzeugung der vereinfachten Geometrie von Gemeinde, Gemarkung und Flur 
     28--             wird ausgegliedert in das Script "pp_gebiete.sql". 
     29--             Dies Script sollte nach jeder Aktualisierung der Datebnek laufen. 
     30--             Die Erzeugung neuer Übersichten der Gebiete ist nur gelegendlich notwendig. 
    2731 
    2832 
     
    5357 
    5458TRUNCATE pp_flurstueck_nr;  -- effektiver als DELETE 
    55  
    56 /*  
    57 -- Alte Version ÃŒber "alkis_beziehungen" 
    58 -- AusfÃŒhrung: mittlere Stadt: ca. 4 - 18 Sec. 
    59  
    60 -- 1:1 umgestellt (UNION) unter Verwendeung der neuen Relationenspalten 
    61  
    62 INSERT INTO pp_flurstueck_nr 
    63           ( fsgml, fsnum, the_geom ) 
    64     SELECT f.gml_id, 
    65            f.zaehler::text || COALESCE ('/' || f.nenner::text, '') AS fsnum, 
    66            p.wkb_geometry  -- manuelle Position des Textes 
    67       FROM ax_flurstueck  f  
    68       JOIN ap_pto         p 
    69         ON f.gml_id = ANY(p.dientzurdarstellungvon) 
    70      WHERE f.endet IS NULL AND p.endet IS NULL -- AND p."art" = 'ZAE_NEN' 
    71    UNION  
    72     SELECT f.gml_id, 
    73            f.zaehler::text || COALESCE ('/' || f.nenner::text, '') AS fsnum, 
    74            ST_PointOnSurface(f.wkb_geometry) AS wkb_geometry  -- Flaechenmitte als Position des Textes 
    75       FROM ax_flurstueck  f  
    76       LEFT JOIN ap_pto    p 
    77         ON f.gml_id = ANY(p.dientzurdarstellungvon)  -- kein PrÀsentationsobjekt vorhanden 
    78      WHERE p.gml_id is NULL AND f.endet IS NULL ; 
    79 */ 
    8059 
    8160-- Ersatz: FÃŒllen in 3 Schritten 
     
    179158DELETE FROM pp_strassenname_l WHERE schriftinhalt IS NULL; 
    180159 
    181  
    182 -- Tabellen fuer die Zuordnung vom Gemarkungen zu Gemeinden 
    183 -- ======================================================== 
    184  
    185 -- FÃŒr die Regelung der Zugriffsberechtigung einer Gemeindeverwaltung auf die  
    186 -- FlurstÃŒcke in ihrem Gebiet braucht man die Information, in welcher Gemeinde eine Gemarkung liegt. 
    187 -- 'ax_gemeinde' und 'ax_gemarkung' haben aber im ALKIS keinerlei Beziehung zueinander - kaum zu glauben! 
    188 -- Nur ÃŒber die Auswertung der FlurstÃŒcke kann man die Zuordnung ermitteln. 
    189 -- Da nicht stÀndig mit 'SELECT DISTINCT' sÀmtliche FlurstÃŒcke durchsucht werden können,  
    190 -- muss diese Information als (redundante) Tabelle nach dem Laden zwischengespeichert werden.  
    191  
    192  
    193 -- G E M A R K U N G 
    194  
    195 TRUNCATE pp_gemarkung; 
    196 -- Vorkommende Paarungen Gemarkung <-> Gemeinde in ax_Flurstueck 
    197 INSERT INTO pp_gemarkung 
    198   (               land, regierungsbezirk, kreis, gemeinde, gemarkung       ) 
    199   SELECT DISTINCT land, regierungsbezirk, kreis, gemeinde, gemarkungsnummer 
    200   FROM            ax_flurstueck 
    201   WHERE           endet IS NULL 
    202   ORDER BY        land, regierungsbezirk, kreis, gemeinde, gemarkungsnummer ; 
    203  
    204 -- Namen der Gemarkung dazu als Optimierung bei der Auskunft  
    205 UPDATE pp_gemarkung a 
    206    SET gemarkungsname = 
    207    ( SELECT b.bezeichnung  
    208      FROM    ax_gemarkung b 
    209      WHERE a.land=b.land  
    210        AND a.gemarkung=b.gemarkungsnummer 
    211        AND b.endet IS NULL 
    212    ); 
    213  
    214  
    215 -- G E M E I N D E 
    216  
    217 TRUNCATE pp_gemeinde; 
    218 -- Vorkommende Gemeinden aus den Gemarkungen 
    219 INSERT INTO pp_gemeinde 
    220   (               land, regierungsbezirk, kreis, gemeinde) 
    221   SELECT DISTINCT land, regierungsbezirk, kreis, gemeinde 
    222   FROM            pp_gemarkung 
    223   ORDER BY        land, regierungsbezirk, kreis, gemeinde; 
    224  
    225 -- Namen der Gemeinde dazu als Optimierung bei der Auskunft  
    226 UPDATE pp_gemeinde a 
    227    SET gemeindename = 
    228    ( SELECT b.bezeichnung  
    229      FROM    ax_gemeinde b 
    230      WHERE a.land=b.land  
    231        AND a.regierungsbezirk=b.regierungsbezirk  
    232        AND a.kreis=b.kreis 
    233        AND a.gemeinde=b.gemeinde 
    234        AND b.endet IS NULL 
    235    ); 
    236  
    237  
    238 -- Geometrien der FlurstÃŒcke schrittweise zu groesseren Einheiten zusammen fassen 
    239 -- ============================================================================== 
    240 -- http://postgis.net/docs/manual-1.5/ST_Union.html (Aggregate version) 
    241 -- http://postgis.net/docs/manual-1.5/ST_Collect.html 
    242  
    243 -- Wenn ein Gebiet durch geometrische Filter im NBA-Verfahren ausgegeben wurde, dann gibt es  
    244 -- Randstreifen, die zu Pseudo-Fluren zusammen gefasst werden.  
    245 -- Diese werden fÃŒr den WMS durch einen View ausgefiltert, der nur eine Gemeinde darstellt. 
    246  
    247 -- AusfÃŒhrungszeit: 1 mittlere Stadt mit ca. 14.000 FlurstÃŒcken > 100 Sek 
    248  
    249 TRUNCATE pp_flur; 
    250  
    251 INSERT INTO pp_flur (land, regierungsbezirk, kreis, gemeinde, gemarkung, flurnummer, anz_fs, the_geom ) 
    252    SELECT  f.land, f.regierungsbezirk, f.kreis, f.gemeinde, f.gemarkungsnummer as gemarkung, f.flurnummer,  
    253            count(gml_id) as anz_fs, 
    254            ST_Multi(st_union(st_buffer(f.wkb_geometry,0.06))) AS the_geom -- Zugabe um ZwischenrÀume zu vermeiden 
    255      FROM  ax_flurstueck f 
    256      WHERE f.endet IS NULL AND NOT f.wkb_geometry IS NULL 
    257   GROUP BY f.land, f.regierungsbezirk, f.kreis, f.gemeinde, f.gemarkungsnummer, f.flurnummer; 
    258  
    259 -- Vereinfachte Geometrie der Flur fÃŒr die Darstelung im WMS in einem kleinen Maßstab 
    260 UPDATE pp_flur      SET simple_geom = st_simplify(the_geom, 0.5); 
    261  
    262  
    263 -- Fluren zu Gemarkungen zusammen fassen 
    264 -- ------------------------------------- 
    265  
    266 -- FlÀchen vereinigen 
    267 UPDATE pp_gemarkung a 
    268   SET the_geom =  
    269    ( SELECT ST_Multi(ST_Union(ST_Buffer(b.the_geom,0.15))) AS the_geom -- Puffer/Zugabe um Löcher zu vermeiden 
    270        FROM pp_flur b 
    271       WHERE a.land      = b.land  
    272         AND a.gemarkung = b.gemarkung 
    273    ); 
    274 -- Hierbei können Exceptions auftreten wobei das Geometriefeld einzelner Gemarkungen leer bleibt. 
    275 -- Die Ursache ist unklar. 
    276 --  TopologyException: found non-noded intersection between LINESTRING 
    277  
    278 -- Praktische Lösung: 
    279 -- Bei den Gemarkungen, die nichts abbekommen haben, mit schrittweise groesserem Buffer noch mal versuchen. 
    280 UPDATE pp_gemarkung a 
    281   SET the_geom =  
    282    ( SELECT ST_Multi(ST_Union(ST_Buffer(b.the_geom,0.20))) AS the_geom -- Puffer vergroessert 
    283        FROM pp_flur b 
    284       WHERE a.land      = b.land  
    285         AND a.gemarkung = b.gemarkung 
    286    ) WHERE the_geom IS NULL; 
    287  
    288 UPDATE pp_gemarkung a 
    289   SET the_geom =  
    290    ( SELECT ST_Multi(ST_Union(ST_Buffer(b.the_geom,0.30))) AS the_geom -- Puffer vergroessert 
    291        FROM pp_flur b 
    292       WHERE a.land      = b.land  
    293         AND a.gemarkung = b.gemarkung 
    294    ) WHERE the_geom IS NULL; 
    295  
    296 /* Guggst du (auf leeren Geometry-Typ achten: 
    297  
    298    SELECT gemarkungsname, geometrytype(the_geom) AS typ,  
    299      st_isvalid(the_geom) AS vali, st_asewkt(the_geom) AS ewkt 
    300    FROM pp_gemarkung; 
    301  
    302 */ 
    303  
    304 -- Die Fluren in der Gemarkung zaehlen 
    305 UPDATE pp_gemarkung a 
    306   SET anz_flur =  
    307    ( SELECT count(flurnummer) AS anz_flur  
    308      FROM    pp_flur b 
    309      WHERE a.land      = b.land  
    310        AND a.gemarkung = b.gemarkung 
    311    ); -- Gemarkungsnummer ist je BundesLand eindeutig 
    312  
    313  
    314 -- Vereinfachte Geometrie der Gemarkung fÃŒr die Darstellung im WMS in einem kleinen Maßstab 
    315 -- Gemarkung (Wirkung siehe pp_gemarkung_analyse) 
    316 UPDATE pp_gemarkung SET simple_geom = st_simplify(the_geom, 2.2);  
    317  
    318  
    319 -- Gemarkungen zu Gemeinden zusammen fassen 
    320 -- ---------------------------------------- 
    321  
    322 -- FlÀchen vereinigen 
    323 UPDATE pp_gemeinde a 
    324   SET the_geom =  
    325    ( SELECT st_multi(st_union(st_buffer(b.the_geom,0.2))) AS the_geom -- noch mal Zugabe 
    326      FROM    pp_gemarkung b 
    327      WHERE a.land     = b.land  
    328        AND a.gemeinde = b.gemeinde 
    329    ); 
    330 -- Hierbei können Exceptions auftreten wobei das Geometriefeld einzelner Gemarkungen leer bleibt. 
    331 -- Die Ursache ist unklar. 
    332  
    333 -- Praktische Lösung: 
    334 -- weitere Versuche mit mehr Puffer, wenn Exception auftrat 
    335 UPDATE pp_gemeinde a 
    336   SET the_geom =  
    337    ( SELECT st_multi(st_union(st_buffer(b.the_geom,0.3))) AS the_geom -- MEHR Zugabe 
    338      FROM    pp_gemarkung b 
    339      WHERE a.land     = b.land  
    340        AND a.gemeinde = b.gemeinde 
    341    ) WHERE the_geom IS NULL; 
    342  
    343 UPDATE pp_gemeinde a 
    344   SET the_geom =  
    345    ( SELECT st_multi(st_union(st_buffer(b.the_geom,0.4))) AS the_geom -- noch MEHR Zugabe 
    346      FROM    pp_gemarkung b 
    347      WHERE a.land     = b.land  
    348        AND a.gemeinde = b.gemeinde 
    349    ) WHERE the_geom IS NULL; 
    350  
    351  
    352 -- Vereinfachte Geometrie der Gemeinde fÃŒr die Darstellung im WMS in einem kleinen Maßstab 
    353 -- Gemeinde (Wirkung siehe pp_gemeinde_analyse) 
    354 UPDATE pp_gemeinde  SET simple_geom = st_simplify(the_geom, 5.0);  
    355  
    356 -- Gemarkungen in der Gemeinde zÀhlen 
    357 UPDATE pp_gemeinde a 
    358   SET anz_gemarkg =  
    359    ( SELECT count(gemarkung) AS anz_gemarkg  
    360      FROM    pp_gemarkung b 
    361      WHERE a.land     = b.land  
    362        AND a.gemeinde = b.gemeinde 
    363    ); 
    364  
    365  
    366160-- Tabelle fuer die Zuordnung vom EigentÃŒmern zu Gemeinden 
    367161-- ======================================================= 
Note: See TracChangeset for help on using the changeset viewer.