Index: trunk/data/konvert/postnas_0.7/konv_batch.sh
===================================================================
--- trunk/data/konvert/postnas_0.7/konv_batch.sh	(revision 178)
+++ trunk/data/konvert/postnas_0.7/konv_batch.sh	(revision 183)
@@ -1,3 +1,3 @@
-#!/bin/bash
+﻿#!/bin/bash
 ## -------------------------------------------------
 ## Konvertierung von ALKIS NAS-Format nach PosGIS  -
@@ -23,13 +23,14 @@
 ##   2012-02-28 Neuer Parameter 4 um Post-Prozessing zu unterdrücken
 ##   2012-04-25 Durch GDAL Patch #5444 werden die Löschungen als Trigger auf Tabelle 'delete' verarbeitet
+##   2012-05-18 Umzug neue GDI, GDAL-Trunk unter Pfad 
+##   2012-10-30 Umgebungsvariable setzen, delete-Tabelle am Ende für Analyse gefüllt lassen.
+##              Test als 0.7a mit gepatchter gdal-Version (noch 2.0dev)
 ##
-## ToDo: Option "-skipfailures" nach Test entfernen ?
-##
-## Konverter:   /opt/gdal-1.9.1/bin/ = GDAL 1.9-DEV / PostNAS 0.7
+## Konverter:   /opt/gdal-2.0/bin/ = GDAL 2.0-DEV / PostNAS 0.7
 ## Koordinaten: EPSG:25832  UTM, Zone 32
 ##              -a_srs EPSG:25832   - bleibt im UTM-System (korrigierte Werte)
 ##
 echo "**************************************************"
-echo "**   K o n v e r t i e r u n g     PostNAS 0.7  **"
+echo "**   K o n v e r t i e r u n g     PostNAS 0.7a **"
 echo "**************************************************"
 ## Parameter:
@@ -75,5 +76,5 @@
 fi
 # Fehlerprotokoll:
-  errprot='/data/konvert/postnas_0.7/log/postnas_err_'$DBNAME'.prot'
+  errprot='/data/konvert/postnas_0.7a/log/postnas_err_'$DBNAME'.prot'
 #
 # DB-Connection
@@ -83,5 +84,6 @@
   echo "Verarbeitungs-Modus= ${verarb}"
   echo " "
-# Alte delete-Eintraege in DB?
+# noch alte delete-Eintraege in DB?
+  echo "Leeren der delete-Tabelle"
   echo 'TRUNCATE table "delete";' | psql $con 
 #
@@ -104,10 +106,18 @@
       echo "* Datei: " $nasdatei >> $errprot
       #
+      # Umgebungsvariable setzen:
+        export GML_FIELDTYPES=ALWAYS_STRINGS    # PostNAS behandelt Zahlen wie Strings, PostgreSQL-Treiber macht daraus Zahlen
+        export OGR_SETFIELD_NUMERIC_WARNING=YES # Meldung abgeschnittene Zahlen?
+       #export CPL_DEBUG=ON                     # Meldung, wenn Attribute überschrieben werden
+      #
       # PostNAS Konverter-Aufruf
       #
-      /opt/gdal-1.9.1/bin/ogr2ogr -f "PostgreSQL" -append  ${update} -skipfailures \
+      # -skipfailures    #
+      # -overwrite       #
+      /opt/gdal-2.0/bin/ogr2ogr -f "PostgreSQL" -append  ${update} -skipfailures  \
          PG:"dbname=${DBNAME} host=localhost port=5432" -a_srs EPSG:25832 ${nasdatei} 2>> $errprot
       nasresult=$?
       echo "* Resultat: " $nasresult " fuer " ${nasdatei}
+	  echo "* Resultat: " $nasresult " fuer " ${nasdatei}  >> $errprot
     done # Ende Zipfile
   done # Ende Ordner
@@ -126,21 +136,26 @@
     echo "** Post-Processing (Nacharbeiten zur Konvertierung)"
     echo "** - Optimierte Nutzungsarten neu Laden:"
-    psql -p 5432 -d ${DBNAME} < /data/konvert/postnas_0.7/nutzungsart_laden.sql
+    psql -p 5432 -d ${DBNAME} < /data/konvert/postnas_0.7a/nutzungsart_laden.sql
     ##
     echo "** - Fluren / Gemarkungen / Gemeinden neu Laden:"
-    psql -p 5432 -d ${DBNAME} < /data/konvert/postnas_0.7/pp_laden.sql
+    psql -p 5432 -d ${DBNAME} < /data/konvert/postnas_0.7a/pp_laden.sql
   fi
 # Durch Einfuegen in Tabelle 'delete' werden Loeschungen anderer Tabellen getriggert
   echo "** delete-Tabelle enthält:"
   echo 'SELECT COUNT(featureid) AS delete_zeilen FROM "delete";' | psql $con
-  echo "   delete-Tabelle loeschen:"
-  echo 'TRUNCATE table "delete";' | psql $con
+ #echo "   delete-Tabelle loeschen:"
+ #echo 'TRUNCATE table "delete";' | psql $con
+ # Fuer Analyse-Zwecke sollten die Delete-Eintraege erhalten bleiben bis zum naechsten Lauf.
+ # TRUNCATE erfolgt VOR der Konnvertierung.
 #
 # Wenn die Datenbank MIT Historie angelegt wurde, man diese aber gar nicht braucht,
 # dann hinterher aufräumen der historischen Objekte 
-  echo "** geendete Objekte entfernen:"
+ #echo "** geendete Objekte entfernen:"
 # Function :
-  echo 'SELECT alkis_delete_all_endet();' | psql $con
+ #echo 'SELECT alkis_delete_all_endet();' | psql $con
+ #echo "  ... geendete Objekte entfernen wurde fuer Test dektiviert."
+ #echo "  Bitte manuell ausfuehren:  SELECT alkis_delete_all_endet(); "
 #
-  echo "Das Fehler-Protokoll wurde ausgegeben in die Datei\n$errprot"
+  echo "Das Fehler-Protokoll wurde ausgegeben in die Datei $errprot"
+ #echo "HINWEIS: -skipfailures  fuer Produktion wieder einschalten."
 #
Index: trunk/data/konvert/postnas_0.7/sichten.sql
===================================================================
--- trunk/data/konvert/postnas_0.7/sichten.sql	(revision 178)
+++ trunk/data/konvert/postnas_0.7/sichten.sql	(revision 183)
@@ -8,5 +8,5 @@
 --  2012-04-17 flstnr_ohne_position
 --  2012-04-24 pauschal Filter 'endet IS NULL' um historische Objekte auszublenden
-
+--  2012-10-29 Redundanzen in Beziehungen suchen (entstehen durch replace)
 
 --  -----------------------------------------
@@ -740,4 +740,42 @@
 ;
 
+CREATE OR REPLACE VIEW beziehungen_redundant 
+AS
+SELECT *
+ FROM alkis_beziehungen AS bezalt
+ WHERE EXISTS
+       (SELECT ogc_fid
+         FROM alkis_beziehungen AS bezneu
+        WHERE bezalt.beziehung_von = bezneu.beziehung_von
+          AND bezalt.beziehung_zu  = bezneu.beziehung_zu
+          AND bezalt.beziehungsart = bezneu.beziehungsart
+          AND bezalt.ogc_fid       < bezneu.ogc_fid
+        );
+
+COMMENT ON VIEW beziehungen_redundant IS 'alkis_beziehungen zu denen es eine identische neue Version gibt.';
+
+
+CREATE OR REPLACE VIEW beziehungen_redundant_in_delete
+AS
+SELECT *
+ FROM alkis_beziehungen AS bezalt
+ WHERE EXISTS
+       (SELECT ogc_fid
+         FROM alkis_beziehungen AS bezneu
+        WHERE bezalt.beziehung_von = bezneu.beziehung_von
+          AND bezalt.beziehung_zu  = bezneu.beziehung_zu
+          AND bezalt.beziehungsart = bezneu.beziehungsart
+          AND bezalt.ogc_fid       < bezneu.ogc_fid
+        )
+     -- mit dem Zusatz nur die Faelle aus dem letzten Durchlauf,
+     -- die aktuell noch in der Delet-Tabelle stehen
+     AND EXISTS
+        (SELECT ogc_fid
+         FROM delete
+         WHERE bezalt.beziehung_von = substr(featureid, 1, 16)
+            OR bezalt.beziehung_zu  = substr(featureid, 1, 16)
+        );
+
+COMMENT ON VIEW beziehungen_redundant_in_delete IS 'alkis_beziehungen zu denen es eine identische neue Version gibt und wo das Objekt noch in der delete-Tabelle vorkommt.';
+
 -- END --
-
Index: trunk/data/konvert/postnas_0.7/alkis_PostNAS_0.7_schema.sql
===================================================================
--- trunk/data/konvert/postnas_0.7/alkis_PostNAS_0.7_schema.sql	(revision 178)
+++ trunk/data/konvert/postnas_0.7/alkis_PostNAS_0.7_schema.sql	(revision 183)
@@ -38,7 +38,11 @@
 --                Typ 'GEOMETRY' bei Tabellen: AX_WegPfadSteig, AX_UntergeordnetesGewaesser
 
+-- 2012-10-31 FJ  Trigger fuer NAS-Replace-Saetze repariert: 
+--                siehe: FUNCTION delete_feature_kill() 
+--                ax_historischesflurstueck.buchungsart ist Text nicht integer.
+
 --  VERSIONS-NUMMER:
 
---  Dies Schema kann nicht mehr mit der installierbaren gdal-Version 1.9 verwendet werden.
+--  Dies Schema kann NICHT mehr mit der installierbaren gdal-Version 1.9 verwendet werden.
 --  Derzeit muss ogr2ogr (gdal) aus den Quellen compiliert werden, die o.g. Patch enthalten.
 --  WeiterfÃŒhrung dieses Zweiges als PostNAS 0.7
@@ -267,15 +271,13 @@
 		END IF;
 
+		-- Das beginn-Datum des neuen Objektes ermitteln, der Satz ist kurz zuvor eingefuegt worden
+
+		-- Variante 1 funktioniert, wenn gml_id auch einen Timestamp enthaelt
 		sql := 'SELECT beginnt FROM ' || NEW.typename || ' WHERE identifier=''urn:adv:oid:' || NEW.replacedBy || '''';
 		-- RAISE NOTICE 'SQL: %', sql; 
-		
-		-- FEHLER: identifier enthÃ€lt nur gml_id, aber nicht den Timestamp dahinter
-		--         Daher wird das zu ersetzende Obejkt nicht gefunden
-		
 		EXECUTE sql INTO endete;
 
-/*
 		IF endete IS NULL AND length(NEW.replacedBy)>16 THEN
-			RAISE NOTICE '%: Nachfolger % nicht gefunden - versuche ''%''', NEW.featureid, substr(NEW.replacedBy, 1, 16);
+			RAISE NOTICE '%: Nachfolger % nicht gefunden - versuche ''%''', NEW.featureid, NEW.replacedBy, substr(NEW.replacedBy, 1, 16);
 			sql := 'SELECT beginnt FROM ' || NEW.typename
 			    || ' WHERE gml_id=''' || substr(NEW.replacedBy, 1, 16) || ''''
@@ -284,5 +286,4 @@
 			EXECUTE sql INTO endete;
 		END IF;
- */
 
 		IF endete IS NULL THEN
@@ -296,14 +297,15 @@
 		END IF;
 
-		-- RAISE NOTICE '%: Nachfolgeobjekt beginnt um %.', NEW.featureid, endete;
+		RAISE NOTICE '%: Nachfolgeobjekt beginnt um %.', NEW.featureid, endete;
 	ELSE
 		RAISE EXCEPTION '%: UngÃŒltiger Kontext % (''delete'' oder ''replace'' erwartet).', NEW.featureid, NEW.context;
 	END IF;
 
+	-- mit dem zuvor ermittelten Beginn-Datum des replace-Objektes das alte Objekt historisieren
 	sql := 'UPDATE ' || NEW.typename
 		|| ' SET endet=''' || endete || ''''
 		|| ' WHERE (identifier=''urn:adv:oid:' || NEW.featureid || ''' OR identifier=''urn:adv:oid:' || gml_id || ''')'
 		|| ' AND endet IS NULL';
-	-- RAISE NOTICE 'SQL: %', sql; 
+		RAISE NOTICE 'SQL: %', sql; 
 	EXECUTE sql;
 	GET DIAGNOSTICS n = ROW_COUNT;
@@ -328,7 +330,10 @@
 -- historische Objekte werden sofort gelÃ¶scht.
 -- Siehe Mail W. Jacobs vom 23.03.2012 in PostNAS-Mailingliste
+-- geaendert krz FJ 2012-10-31
 CREATE OR REPLACE FUNCTION delete_feature_kill() RETURNS TRIGGER AS $$
 DECLARE
 	query TEXT;
+	begsql TEXT;
+	aktbeg TEXT;
 	gml_id TEXT;
 BEGIN
@@ -342,14 +347,55 @@
 
 	IF NEW.context='delete' THEN
-		query := 'DELETE FROM ' || NEW.typename || ' WHERE gml_id = ''' || gml_id || '''';
+		-- ersatzloses Loeschen eines Objektes
+
+		-- Tabelle der Objekt-Art
+		query := 'DELETE FROM ' || NEW.typename 
+			|| ' WHERE gml_id = ''' || gml_id || '''';
 		EXECUTE query;
 
-		query := 'DELETE FROM alkis_beziehungen WHERE beziehung_von = ''' || gml_id || ''' OR beziehung_zu = ''' || gml_id || '''';
+		-- Tabelle alkis_beziehungen
+		query := 'DELETE FROM alkis_beziehungen WHERE beziehung_von = ''' || gml_id 
+			|| ''' OR beziehung_zu = ''' || gml_id || '''';
 		EXECUTE query;
+		RAISE NOTICE 'LÃ¶sche gml_id % in % und Beziehungen', gml_id, NEW.typename;
+
 	ELSE
-		-- replace
-		query := 'DELETE FROM ' || NEW.typename || ' WHERE gml_id = ''' || gml_id || '''';
+		-- Ersetzen eines Objektes
+		-- In der objekt-Tabelle sind bereits 2 Objekte vorhanden (alt und neu).
+		-- Die 2 DatensÃ€tze unterscheiden sich nur in ogc_fid und beginnt
+
+		-- beginnt-Wert des aktuellen Objektes ermitteln 
+		-- RAISE NOTICE 'Suche beginnt von neuem gml_id % ', substr(NEW.replacedBy, 1, 16);
+		begsql := 'SELECT max(beginnt) FROM ' || NEW.typename || ' WHERE gml_id = ''' || substr(NEW.replacedBy, 1, 16) || ''' AND endet IS NULL';
+		EXECUTE begsql INTO aktbeg;
+
+		-- Nur alte Objekte entfernen
+		query := 'DELETE FROM ' || NEW.typename 
+			|| ' WHERE gml_id = ''' || gml_id || ''' AND beginnt < ''' || aktbeg || '''';
 		EXECUTE query;
-		-- alkis_beziehungen bleibt so
+
+		-- Tabelle alkis_beziehungen
+		IF gml_id = substr(NEW.replacedBy, 1, 16) THEN -- gml_id gleich
+			-- Beziehungen des Objektes wurden redundant noch einmal eingetragen
+			-- ToDo:         HIER sofort die Redundanzen zum aktuellen Objekt beseitigen.
+			-- Work-Arround: Nach der Konvertierung werden im Post-Processing 
+			--               ALLE Redundanzen mit einem SQL-Statemant beseitigt.
+		--	RAISE NOTICE 'Ersetze gleiche gml_id % in %', gml_id, NEW.typename;
+
+		-- ENTWURF ungetestet:
+		--query := 'DELETE FROM alkis_beziehungen AS bezalt 
+		--	WHERE (bezalt.beziehung_von = ' || gml_id || ' OR bezalt.beziehung_zu = ' || gml_id ||')
+		--	AND EXISTS (SELECT ogc_fid FROM alkis_beziehungen AS bezneu 
+		--		WHERE bezalt.beziehung_von = bezneu.beziehung_von 
+		--		AND bezalt.beziehung_zu = bezneu.beziehung_zu
+		--		AND bezalt.beziehungsart = bezneu.beziehungsart
+		--		AND bezalt.ogc_fid < bezneu.ogc_fid);'
+		--EXECUTE query;
+
+		ELSE
+			-- replace mit ungleicher gml_id
+			-- Falls dies vorkommt, die Function erweitern
+			RAISE EXCEPTION '%: neue gml_id % bei Replace in %. alkis_beziehungen muss aktualisiert werden!', gml_id, NEW.replacedBy, NEW.typename;
+		END IF;
 	END IF;
 
@@ -361,5 +407,4 @@
 -- Im Trigger 'delete_feature_trigger' muss eine dieser beiden Functions (_hist oder _kill) verlinkt werden, 
 -- je nachdem ob nur aktuelle oder auch historische Objekte in der Datenbank gefÃŒhrt werden sollen.
-
 
 -- Wenn die Datenbank MIT Historie angelegt wurde, aber eigentlich stÃ¶rt die nur.
@@ -377,5 +422,5 @@
 	LOOP
 		EXECUTE 'DELETE FROM ' || c.table_name || ' WHERE NOT endet IS NULL';
-		RAISE NOTICE 'LÃ¶sche ended in: %', c.table_name;
+		-- RAISE NOTICE 'LÃ¶sche ended in: %', c.table_name;
 	END LOOP;
 END;
@@ -383,6 +428,6 @@
 
 
--- Alle Tabellen lÃ¶schen
--- SELECT alkis_drop();
+-- Alle Tabellen lÃ¶schen:
+--  SELECT alkis_drop();
 
 
@@ -844,5 +889,6 @@
 	nachfolgerflurstueckskennzeichen	varchar[],
 	blattart			integer,
-	buchungsart			integer,
+	--buchungsart			integer,  -- Aenderung krz FJ 2012-10-31: Meldung aus Konverter
+	buchungsart			varchar,
 	buchungsblattkennzeichen	double precision,
 	bezirk				integer,
@@ -1283,4 +1329,19 @@
 --  beziehtSichAufFlurstueck  --> AX_Flurstueck
 
+
+-- BEGIN - Nur fuer Test-Zwecke
+ CREATE OR REPLACE FUNCTION info_flurstueck() RETURNS TRIGGER AS $$
+ BEGIN
+ 	RAISE NOTICE 'Insert Flurstueck %', NEW.gml_id;
+ 	RETURN NEW;
+ END;
+ $$ LANGUAGE plpgsql;
+
+-- CREATE TRIGGER neues_fs_trigger
+--        BEFORE INSERT ON ax_flurstueck 
+--        FOR EACH ROW 
+--           EXECUTE PROCEDURE info_flurstueck();
+
+-- ENDE - Nur fuer Test-Zwecke
 
 
Index: trunk/data/konvert/postnas_0.7/pp_laden.sql
===================================================================
--- trunk/data/konvert/postnas_0.7/pp_laden.sql	(revision 178)
+++ trunk/data/konvert/postnas_0.7/pp_laden.sql	(revision 183)
@@ -10,5 +10,7 @@
 --  2012-04-17 Flurstuecksnummern auf Standardposition
 --  2012-04-24 Generell Filter 'endet IS NULL' um historische Objekte auszublenden
-
+--  2012-04-25 Abstürze und Fehler (durch kaputte Geometrie?) beim Zusammenfassen der Flächen
+--             Mehr buffer, mehr simplify?
+--  2012-10-29 Redundanzen aus alkis_beziehungen beseitigen, die nach NAS replace auftreten
 
 -- ============================
@@ -20,5 +22,5 @@
 -- Antwortzeiten in WMS, WFS, Buchauskunft oder Navigation (Suche) verursachen.
 
--- Im Rahmen eines "Post-Processing" werden diese Daten nach jeder Konvertierung (NBA-Aktialisierung) 
+-- Im Rahmen eines "Post-Processing" werden diese Daten nach jeder Konvertierung (NBA-Aktualisierung) 
 -- einmal komplett aufbereitet. Die benötigten Informationen stehen somit den Anwendungen mundgerecht zur Verfügung.
 
@@ -27,9 +29,63 @@
 -- Die Ausführung dieses Scriptes auf einer Datenbank für eine 80T-Einwohner-Stadt dauert ca.: 500 Sek. !
 
-
-
--- ===========================
--- Flurstuecksnummern-Position
--- ===========================
+SET client_encoding = 'UTF-8';
+
+
+-- ============================================================================
+-- Redundanzen aus alkis_beziehungen beseitigen, die nach NAS replace auftreten
+-- ============================================================================
+-- Work arround: alle Redundazen nach einem Lauf entfernen.
+-- Besser wäre: sofort im Trigger bei replace entfernen.
+-- Siehe Schema in FUNCTION delete_feature_kill
+
+DELETE 
+  FROM alkis_beziehungen AS bezalt        -- Beziehung Alt
+ WHERE EXISTS
+       (SELECT ogc_fid
+         FROM alkis_beziehungen AS bezneu -- Beziehung Neu
+        WHERE bezalt.beziehung_von = bezneu.beziehung_von
+          AND bezalt.beziehung_zu  = bezneu.beziehung_zu
+          AND bezalt.beziehungsart = bezneu.beziehungsart
+          AND bezalt.ogc_fid       < bezneu.ogc_fid
+        );
+-- Denkbar ist eine Variante für den Trigger, die zusätzlich
+-- auf eine bestimmte gml_id filtert.
+-- Damit wäre die DB schon während der Konvertierung konsistenter.
+
+
+-- SELECT *
+--  FROM alkis_beziehungen AS bezalt
+--  WHERE EXISTS
+--        (SELECT ogc_fid
+--          FROM alkis_beziehungen AS bezneu
+--         WHERE bezalt.beziehung_von = bezneu.beziehung_von
+--           AND bezalt.beziehung_zu  = bezneu.beziehung_zu
+--           AND bezalt.beziehungsart = bezneu.beziehungsart
+--           AND bezalt.ogc_fid       < bezneu.ogc_fid
+--         );
+
+-- SELECT *
+--  FROM alkis_beziehungen AS bezalt
+--  WHERE EXISTS
+--        (SELECT ogc_fid
+--          FROM alkis_beziehungen AS bezneu
+--         WHERE bezalt.beziehung_von = bezneu.beziehung_von
+--           AND bezalt.beziehung_zu  = bezneu.beziehung_zu
+--           AND bezalt.beziehungsart = bezneu.beziehungsart
+--           AND bezalt.ogc_fid       < bezneu.ogc_fid
+--         )
+--      -- mit dem Zusatz nur die Faelle aus dem letzten Durchlauf,
+--      -- die aktuell noch in der Delet-Tabelle stehen
+--      AND EXISTS
+--         (SELECT ogc_fid
+--          FROM delete
+--          WHERE bezalt.beziehung_von = substr(featureid, 1, 16)
+--             OR bezalt.beziehung_zu  = substr(featureid, 1, 16)
+--         );
+
+
+-- =================================
+-- Flurstuecksnummern-Label-Position
+-- =================================
 
 -- ersetzt den View "s_flurstueck_nr" für WMS-Layer "ag_t_flurstueck"
@@ -73,12 +129,7 @@
 
 
-SET client_encoding = 'UTF-8';
-
-
--- Alles auf Anfang!
-  DELETE FROM pp_gemeinde;
-  DELETE FROM pp_gemarkung;
-  DELETE FROM pp_flur;
-
+-- G E M A R K U N G
+
+DELETE FROM pp_gemarkung;
 
 -- Vorkommende Paarungen Gemarkung <-> Gemeinde in ax_Flurstueck
@@ -91,5 +142,20 @@
 ;
 
--- daraus: Vorkommende Gemeinden
+-- Namen der Gemarkung dazu als Optimierung bei der Auskunft 
+UPDATE pp_gemarkung a
+   SET gemarkungsname =
+   ( SELECT b.bezeichnung 
+     FROM    ax_gemarkung b
+     WHERE a.land=b.land 
+       AND a.gemarkung=b.gemarkungsnummer
+       AND b.endet IS NULL
+   );
+
+
+-- G E M E I N D E
+
+DELETE FROM pp_gemeinde;
+
+-- Vorkommende Gemeinden aus den gemarkungen
 INSERT INTO pp_gemeinde
   (               land, regierungsbezirk, kreis, gemeinde)
@@ -98,4 +164,5 @@
   ORDER BY        land, regierungsbezirk, kreis, gemeinde 
 ;
+
 
 -- Namen der Gemeinde dazu als Optimierung bei der Auskunft 
@@ -111,14 +178,4 @@
    );
 
--- Namen der Gemarkung dazu als Optimierung bei der Auskunft 
-UPDATE pp_gemarkung a
-   SET gemarkungsname =
-   ( SELECT b.bezeichnung 
-     FROM    ax_gemarkung b
-     WHERE a.land=b.land 
-       AND a.gemarkung=b.gemarkungsnummer
-       AND b.endet IS NULL
-   );
-
 
 -- ==============================================================================
@@ -126,30 +183,45 @@
 -- ==============================================================================
 
--- Dies macht nur Sinn, wenn der Inhalt der Datenbenk einen ganzen Katasterbezirk enthält.
+-- Dies macht nur Sinn, wenn der Inhalt der Datenbank einen ganzen Katasterbezirk enthält.
 -- Wenn ein Gebiet durch geometrische Filter im NBA ausgegeben wurde, dann gibt es Randstreifen, 
 -- die zu Pseudo-Fluren zusammen gefasst werden. Fachlich falsch!
 
+-- Ausführungszeit: 1 mittlere Stadt mit ca. 14.000 Flurstücken > 100 Sek
+
 -- ToDo:
---   TopologyException: found non-noded intersection between   ...
 --   Nur "geprüfte Flurstücke" verwenden?  Filter?
+
+--   070: TopologyException: found non-noded intersection between   ...
+
+
+DELETE FROM pp_flur;
 
 INSERT INTO pp_flur (land, regierungsbezirk, kreis, gemarkung, flurnummer, anz_fs, the_geom )
    SELECT  f.land, f.regierungsbezirk, f.kreis, f.gemarkungsnummer as gemarkung, f.flurnummer, 
            count(gml_id) as anz_fs,
-           multi(st_union(st_buffer(f.wkb_geometry,0))) AS the_geom 
+           multi(st_union(st_buffer(f.wkb_geometry,0.05))) AS the_geom -- 5 cm Zugabe um Zwischenräume zu vermeiden
      FROM  ax_flurstueck f
      WHERE f.endet IS NULL
   GROUP BY f.land, f.regierungsbezirk, f.kreis, f.gemarkungsnummer, f.flurnummer;
 
+-- Geometrie vereinfachen, auf 1 Meter glätten
+UPDATE pp_flur SET simple_geom = simplify(the_geom, 1.0);
+
 
 -- Fluren zu Gemarkungen zusammen fassen
 -- -------------------------------------
 
--- Flächen vereinigen
+-- FEHLER: 290 Absturz PG! Bei Verwendung der ungebufferten präzisen Geometrie.  
+-- bufferOriginalPrecision failed (TopologyException: unable to assign hole to a shell), trying with reduced precision
+-- UPDATE: ../../source/headers/geos/noding/SegmentString.h:175: void geos::noding::SegmentString::testInvariant() const: Zusicherung »pts->size() > 1« nicht erfüllt.
+
+
+-- Flächen vereinigen (aus der bereits vereinfachten Geometrie)
 UPDATE pp_gemarkung a
   SET the_geom = 
-   ( SELECT multi(st_union(st_buffer(b.the_geom,0))) AS the_geom 
+   ( SELECT multi(st_union(st_buffer(b.simple_geom,0.1))) AS the_geom -- noch mal 10 cm Zugabe
      FROM    pp_flur b
-     WHERE a.land=b.land AND a.gemarkung=b.gemarkung
+     WHERE a.land      = b.land 
+       AND a.gemarkung = b.gemarkung
    );
 
@@ -159,5 +231,6 @@
    ( SELECT count(flurnummer) AS anz_flur 
      FROM    pp_flur b
-     WHERE a.land=b.land AND a.gemarkung=b.gemarkung
+     WHERE a.land      = b.land 
+       AND a.gemarkung = b.gemarkung
    ); -- Gemarkungsnummer ist je BundesLand eindeutig
 
@@ -169,10 +242,11 @@
 -- ----------------------------------------
 
--- Flächen vereinigen
+-- Flächen vereinigen (aus der bereits vereinfachten Geometrie)
 UPDATE pp_gemeinde a
   SET the_geom = 
-   ( SELECT multi(st_union(st_buffer(b.the_geom,0))) AS the_geom 
+   ( SELECT multi(st_union(st_buffer(b.simple_geom,0.1))) AS the_geom -- noch mal Zugabe 10 cm
      FROM    pp_gemarkung b
-     WHERE a.land=b.land AND a.gemeinde=b.gemeinde
+     WHERE a.land     = b.land 
+       AND a.gemeinde = b.gemeinde
    );
 
@@ -182,5 +256,6 @@
    ( SELECT count(gemarkung) AS anz_gemarkg 
      FROM    pp_gemarkung b
-     WHERE a.land=b.land AND a.gemeinde=b.gemeinde
+     WHERE a.land     = b.land 
+       AND a.gemeinde = b.gemeinde
    );
 
