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
    );
 
