Mehr

Verwenden von qgis zum Aufteilen von Geometrie in Postgis: So fügen Sie eine eindeutige ID hinzu und kopieren Originaldaten in verknüpfte Tabellen

Verwenden von qgis zum Aufteilen von Geometrie in Postgis: So fügen Sie eine eindeutige ID hinzu und kopieren Originaldaten in verknüpfte Tabellen


Wir haben eine Postgis-Datenbank eingerichtet, um alle unsere alten Shapefiles zu verwalten.

Es gibt eine Tabelle, die die Geometrie und einige grundlegende Informationen enthält. Es gibt mehrere Tabellen, die damit in einer 1:m-Beziehung verknüpft sind.

Wir möchten die Geometrie bereinigen (einrasten, teilen, verschieben usw.). Dafür verwenden wir QGIS als Desktop-Anwendung. Solange wir keine Geometrie aufteilen, gibt es kein Problem in der Datenbank.

Beim Teilen einer Geometrie erstellen Sie ein neues Feature in der Basistabelle. Dieser muss eine neue eindeutige ID erhalten. Alle ursprünglich verknüpften Features in den anderen Tabellen müssen mit dieser neuen eindeutigen ID als Referenz dupliziert werden.

Auf manuelle Weise könnte ich tun

INSERT INTO weg_bron ("weg_id", "bron_id", "bronnummer1", "bronnummer2") AUSWÄHLEN , "bron_id", "bronnummer1", "bronnummer2" FROM weg_bron WO weg_id = ;

Was ist die Problemumgehung, um dies (halb) automatisch zu tun, während Sie mit dem Aufteilungswerkzeug in QGIS arbeiten?

--- einige weitere Informationen zu den Tabellen ---

Die Basistabelle heißt 'weg':

CREATE TABLE weg ( id serial NOT NULL, naam text, geometriegeometrie(LineString,31370) NOT NULL, lengte integer, deelgemeente_id integer, verharding_id charaktervariierend(2), categorie_id charaktervariierend(3), juridisch_statuut_id smallint, Breed_id smallint, toegankelijkheid boolean , beschrijving_toegankelijkheid text, zichtbaar boolean, trage_weg boolean, opmerkingen text, eigenaar_id integer, inventariseerder_id integer, inventarisatiedatum date, aanmaakdatum timestamp with time zone NOT NULL DEFAULT now(), aanpadatum timestamp with time zone now Np (Ich würde) )

Eine der verlinkten Tabellen heißt 'weg_bron':

CREATE TABLE weg_bron ( weg_id integer NOT NULL, bron_id integer NOT NULL, bronnummer1 Zeichen variieren(25), bronnummer2 Zeichen variieren(25), aanmaakdatum timestamp with time zone NOT NULL DEFAULT now(), aanpadatum timestamp with time zone NOT NULL DEFAULT now( ), opmerking text, CONSTRAINT weg_bron_pkey PRIMARY KEY (weg_id, bron_id), CONSTRAINT weg_bron_bron_id_fkey FOREIGN KEY (bron_id) REFERENCES bron (id) MATCH SIMPLE ON UPDATE KEINE AKTION BEI DELETE CASCADE, CONSTRAINT weg_bron_E_id_fkey (weg) EINFACH BEIM AKTUALISIEREN KEINE AKTION BEIM LÖSCHEN VON CASCADE

Wenn ich Ihr Problem richtig verstanden habe, habe ich eine Lösung, bei der Sie jedoch für jede Bearbeitungssitzung in zwei separaten Schritten arbeiten müssen:

  1. Nehmen Sie alle Ihre Änderungen am Weg-Tisch vor
  2. Führen Sie ein Skript aus, das weg_bron entsprechend aktualisiert

Ersteinrichtung

Sie müssen weg eine Spalte hinzufügen, nennen wir sie "old_id" vom gleichen Typ wie der Primärschlüssel der Tabelle. Aktualisieren Sie dann die Tabelle als

SET old_id=id

Da diese Spalte im Gegensatz zu "id" keine eindeutige Einschränkung hat, wird dieser "old_id"-Wert jedes Mal beibehalten, wenn Sie ein Polygon teilen.


1. Bearbeiten Sie den Weg-Tisch

Führen Sie Ihre Editiersitzung einfach wie gewohnt durch (denken Sie vorerst nicht an weitere Ratschläge :P)


2.Skript zum Aktualisieren von weg_bron

Nach jeder Bearbeitungssitzung müssen Sie ein Skript ausführen, das die duplizierten Einträge, die Sie in "weg_bron" benötigen, entsprechend den Zeilen in "weg" einfügt, wobei id <> old_id ist.

Auch nachdem das INSERT erfolgreich war, müssen Sie die "weg"-Tabelle erneut aktualisieren, damit old_id=id und der Layer für eine neue Bearbeitungssitzung bereit ist.

Hier ist ein Stub, der funktionieren sollte:

INSERT INTO weg_bron ("weg_id", "bron_id", "bronnummer1", "bronnummer2") AUSWÄHLEN weg.id, weg_bron."bron_id", weg_bron."bronnummer1", weg_bron."bronnummer2" FROM weg_bron LINKS JOIN weg ON weg. old_id=weg_bron.weg_id UND weg.id<>weg.old_id; UPDATE weg SET old_id=id;

Genießen & wiederholen

Seien Sie jedoch vorsichtig, wenn Sie das Skript in Bezug auf Ihren Bearbeitungsprozess ausführen. Dies ist die globale Idee und erfordert möglicherweise einige fehlersichere Tests, bevor Sie mit der Produktion beginnen.


Schau das Video: Visualizing 2D Geology with QGIS