Vermeidung von Überlappungen beim Erstellen von neuen Datensätzen: Unterschied zwischen den Versionen

Aus kvwmap
Wechseln zu: Navigation, Suche
 
(2 dazwischenliegende Versionen des gleichen Benutzers werden nicht angezeigt)
Zeile 3: Zeile 3:
  
 
  CREATE OR REPLACE RULE avoid_overlap_insert AS
 
  CREATE OR REPLACE RULE avoid_overlap_insert AS
  ON INSERT TO frei_polygon
+
  ON INSERT TO ''tabelle''
 
  WHERE ( SELECT true AS bool
 
  WHERE ( SELECT true AS bool
         FROM frei_polygon
+
         FROM ''tabelle''
         WHERE st_overlaps(new.the_geom, frei_polygon.the_geom)
+
         WHERE st_overlaps(new.the_geom, ''tabelle''.the_geom)
 
         LIMIT 1)
 
         LIMIT 1)
 
  DO INSTEAD  SELECT 'Polygonüberlappung ist nicht erlaubt.';
 
  DO INSTEAD  SELECT 'Polygonüberlappung ist nicht erlaubt.';
Zeile 13: Zeile 13:
  
 
  CREATE OR REPLACE RULE avoid_overlap_update AS
 
  CREATE OR REPLACE RULE avoid_overlap_update AS
  ON UPDATE TO frei_polygon
+
  ON UPDATE TO ''tabelle''
 
  WHERE ( SELECT true AS bool
 
  WHERE ( SELECT true AS bool
         FROM frei_polygon
+
         FROM ''tabelle''
         WHERE st_overlaps(new.the_geom, frei_polygon.the_geom) AND NOT frei_polygon.the_geom = old.the_geom
+
         WHERE st_overlaps(new.the_geom, ''tabelle''.the_geom) AND NOT ''tabelle''.the_geom = old.the_geom
 
         LIMIT 1)
 
         LIMIT 1)
 
  DO INSTEAD  SELECT 'Polygonüberlappung ist nicht erlaubt.';
 
  DO INSTEAD  SELECT 'Polygonüberlappung ist nicht erlaubt.';
  
kvwmap wertet das Ergebnis dieses Überlappungstest allerdings erst in der aktuellen develop-Version, bzw. ab Version 1.12 korrekt aus.
+
Der Text, der statt des Inserts bzw. Updates am Ende ausgeben wird ist natürlich beliebig.
 +
kvwmap wertet das Ergebnis dieses Überlappungstests allerdings erst ab Version 1.12 korrekt aus und zeigt den Text als Hinweis an.

Aktuelle Version vom 16. August 2013, 13:57 Uhr

Wenn man verhindern möchte, dass in einem Layer Datensätze angelegt werden, deren Geometrie sich mit anderen Datensätzen überlappt, kann man das mit einer Regel in der PostgreSQL-DB tun. Die Regel hat folgende Form:

CREATE OR REPLACE RULE avoid_overlap_insert AS
ON INSERT TO tabelle
WHERE ( SELECT true AS bool
        FROM tabelle
        WHERE st_overlaps(new.the_geom, tabelle.the_geom)
        LIMIT 1)
DO INSTEAD  SELECT 'Polygonüberlappung ist nicht erlaubt.';

Soll dieser Test auch bei Änderung eines Datensatz erfolgen, muss eine entsprechende Regel für ON UPDATE erstellt werden. Diese hat fast die gleiche Form, außer dass die Bedingung für den Überlappungstest etwas anders ist, denn die neue Geometrie darf sich natürlich mit der alten Geometrie schneiden:

CREATE OR REPLACE RULE avoid_overlap_update AS
ON UPDATE TO tabelle
WHERE ( SELECT true AS bool
        FROM tabelle
        WHERE st_overlaps(new.the_geom, tabelle.the_geom) AND NOT tabelle.the_geom = old.the_geom
        LIMIT 1)
DO INSTEAD  SELECT 'Polygonüberlappung ist nicht erlaubt.';

Der Text, der statt des Inserts bzw. Updates am Ende ausgeben wird ist natürlich beliebig. kvwmap wertet das Ergebnis dieses Überlappungstests allerdings erst ab Version 1.12 korrekt aus und zeigt den Text als Hinweis an.