Wie vermeide ich doppelte GIDs beim Kopieren von Features von einer PostGIS-Ebene auf eine andere?

11

Wenn ich neue Elemente (Features) in eine andere Postgres-Ebene eingebe, kann ich dies auf zwei Arten tun:

  1. Zeichnen neuer Elemente (mit 'Feature hinzufügen'), die ich selten oder selten mache
  2. Kopieren (oder Ausschneiden) einiger Elemente aus einer anderen Postgre-Ebene (Quellenebene) und Einfügen in die Zielebene, was ich häufig mache

Im ersten Beispiel von Änderungen zu speichern funktioniert normal , da diese Schicht wird gid aus postgre Datenbanksequenz * nextval ( ‚layer_name_gid_seq‘ :: regclass) *

Im zweiten Beispiel ist beim Speichern von Änderungen ein Fehler aufgetreten, da beim Kopieren des Elements von der Quellenebene in die Zielebene qg die GID des Elements von der Quellenebene kopiert wird. Beim Versuch, Änderungen zu speichern, wird dieser Fehler zurückgegeben:

Änderungen an Layer „Cjevovodi“ konnten nicht festgeschrieben werden.
Fehler: FEHLER : 1 Feature (s) nicht hinzugefügt.
Anbieterfehler:
PostGIS-Fehler beim Hinzufügen von Funktionen: FEHLER: Doppelter Schlüsselwert verletzt eindeutige Einschränkung "cjevovodi_okill_pkey"
DETAIL: Schlüssel (gid) = (5) ist bereits vorhanden.

Ich habe versucht, * nextval ('layer_name_gid_seq' :: regclass) * in Feld gid zu kopieren, aber diese Sequenz kann nicht in Feld gid eingefügt werden, da das Feld als numerisch definiert ist.

Kennt jemand eine einfache Möglichkeit, Elemente aus der Quellenebene (mit vorhandener GID) zu kopieren und eine neue GID zuzuweisen?

Vielen Dank!

hapa
quelle
Welche Version von QGIS und Plattform verwenden Sie? Ich verwende QGIS 2.0 in Windows 7 und habe anscheinend keine Probleme beim Kopieren und Einfügen zwischen Postigs-Ebenen.
Alexandre Neto
Haben Sie jemals eine Lösung für dieses Problem gefunden? Ich stoße auf genau das gleiche Problem. Ich möchte nicht, dass in PostgreSQL ein Trigger eingerichtet wird, wenn QGIS keine Standardwerte abruft, wenn neue Funktionen durch Kopieren anderer erstellt werden.
Holen Sie sich Spatial

Antworten:

4

Ich kann dies in QGIS 2.2 Windows, c3a2817, nicht reproduzieren.

Wenn sich andere Versionen anders verhalten oder dieses Problem weiterhin besteht, können Sie wahrscheinlich einen PostgreSQL-Trigger für die Tabelle einrichten, um dies zu umgehen:

Verwenden Sie diese Beispieltabelle:

CREATE TABLE testing (gid serial PRIMARY KEY, geom geometry(Polygon, 4326));

Hier ist eine Triggerfunktion, die gidbei Bedarf eine neue zuweist:

CREATE OR REPLACE FUNCTION testing_insert_trigger()
RETURNS trigger AS
$$
BEGIN
IF EXISTS (SELECT 1 FROM testing WHERE gid = NEW.gid) THEN
    NEW.gid := nextval('testing_gid_seq'::regclass);
END IF;
RETURN NEW;
END;
$$ language 'plpgsql';

Die Funktion an die Tabelle binden ...

CREATE TRIGGER testing_insert 
BEFORE INSERT ON testing
FOR EACH ROW EXECUTE PROCEDURE testing_insert_trigger();

Dadurch werden automatisch neue IDs zugewiesen, sofern diese gidbereits vorhanden sind. Beispielsweise dupliziert die folgende Abfrage jetzt alle Daten in der Tabelle, anstatt fehlzuschlagen:

INSERT INTO testing (SELECT * FROM testing);

Natürlich kann dieser Ansatz die Absicht Ihres Primärschlüssels gefährden. Gehen Sie daher vorsichtig damit um.

dbaston
quelle
0

Wählen Sie Features aus der Quellenebene aus und speichern Sie die ausgewählten (Speichern ausgewählt als ...) im Shapefile. Fügen Sie ein gespeichertes Shapefile in das QGIS-Projekt ein und öffnen Sie die Attributtabelle. Löschen Sie dann das Feld "gid" und speichern Sie das Shapefile. Wählen Sie Features in Shapefile aus und kopieren Sie sie in Ihre Arbeitsebene.

räumliche Eile
quelle
Vielen Dank für Ihre Antwort, aber ich versuche, einen einfacheren Weg zu finden.
Hapa
1
Wenn Sie eine Tabelle wie gid serial, int i haben, können Sie einfach i einfügen und Sie erhalten gid automatisch. Ich habe eine entfernte Erinnerung, dass es möglicherweise in QGIS ist, aber ich kann mich nicht erinnern, wie es geht
Simplexio