PostgreSQL-Probleme beim Bearbeiten von Punkten / Linien / Polygonen in QGIS

14

Ich habe ein Problem mit postgresql und QGIS:

  • Ich kann Punkte / Linien / Polygone und Füllfelder hinzufügen

Aber ich kann nicht:

  • Punkte / Linien / Polygone löschen
  • Punkte / Linien / Polygone ändern (Feld verschieben oder ändern)

Beispiel: dbname = 'Europe' host = localhost port = 5432 user = 'postgres' sslmode = disable key = 'tid' geschätzte Daten = true srid = 900913 type = Point table = "public". "planet_osm_point" (way) sql =

QGIS ist als Admin-Ebene mit der Datenbank verbunden. Mit pdAdmin III kann ich alles (erstellen, löschen, ändern ...)

Die postgresql-Datenbank wird mit osm2pgsql aus OSM importiert .

Auf einer anderen Ebene, wie z. B. .shp, habe ich dieses Problem nicht.

Irgendeine Idee ?

Config: Ubuntu 14.04 / Posgresql 9.4 / QGIS 2.10

Mathieu
quelle
Hallo Mathieu, kannst du die genaue Bedeutung von "Ich kann nicht" klären? Sind die Werkzeuge deaktiviert, schlägt das Speichern der Ebene fehl? Und das Wichtigste: Gibt es eine Fehlermeldung? Schauen Sie sich auch das Nachrichtenprotokollfeld auf der Registerkarte "Postgis" an.
Matthias Kuhn
Natürlich bin ich im Bearbeitungsmodus auf die betreffende Ebene (gelber Stift). Die Bearbeitungswerkzeuge sind alle grau, mit Ausnahme des Symbols zum Hinzufügen von Objekten. Die Nachricht, die ich bekomme, lautet: Service vor dem Kauf: Service vor dem Kauf
Mathieu
1
Fehlermeldung in Englisch: Anbieter unterstützt das Löschen nicht: Datenanbieter unterstützt das Löschen von Funktionen nicht
Mathieu
1
Bearbeiten des oberen Symbols: Alle grau, außer Feature
Mathieu
1
2015-08-08T12: 10: 22 1 Primärschlüssel ist CTID - Änderung vorhandener Features deaktiviert (Art; "öffentlich". "Planet_osm_point") 2015-08-08T12: 10: 23 1 Primärschlüssel ist CTID - Änderung vorhandener Features disabled (way; "public". "planet_osm_line") 2015-08-08T12: 10: 23 1 Feature-Typ oder srid für "public". "planet_osm_polygon" konnte nicht ermittelt werden oder wurde nicht angefordert.
Mathieu

Antworten:

13

Fest. Das Problem war, ist kein Primärschlüssel.

Führen Sie in pgAdmin diese Anforderung aus.

ALTER TABLE tableName ADD PRIMARY KEY (id);

Beispiel für die planet_osm_line-Tabelle und das Setzen der osm_id-Spalte als Primärschlüssel:

ALTER TABLE planet_osm_line ADD PRIMARY KEY (osm_id);

Bis osm_id ist einzigartig.

Mathieu
quelle
So macht man das!
DPSSpatial
Sie denken, ist richtig?
Mathieu
Ich glaube schon! Ich kann es bei der Arbeit testen und berichten, aber jetzt zu wissen, wie Sie die Daten importiert haben, ist Ihre Problemumgehung. Ein Problem ist jedoch, warum Sie diese Daten in QGIS lokal bearbeiten, anstatt sie direkt in einem OSM-Editor zu bearbeiten und zurückzusenden.
DPSSpatial
1
Über OSM: Wir müssen lediglich eine Ausgabekarte mit unseren Design- / Grafikspezifikationen erstellen und einige andere bezahlte Daten von Anbietern hinzufügen (es ist nicht möglich, diese öffentlich zu machen). QGIS ist dafür das perfekte Werkzeug. Mitmachen ist eine andere Sache, die wir rechtzeitig erledigen werden.
Mathieu
9

Die Lösung besteht darin, wie bereits erwähnt, einen Primärschlüssel zu erstellen.

Aber von osm2pgsqlNatur aus, garantiert nicht, dass das osm_ideinzigartig ist. Es kann mehrere Zeilen mit derselben osm_id erzeugen .

Um planet_osm_*Tabellen in QGIS zu bearbeiten , ist es beispielsweise ratsam, eine weitere ID-Spalte hinzuzufügen gid.

So fügen Sie eine eindeutige gidSpalte hinzu:

ALTER TABLE planet_osm_point ADD gid serial PRIMARY KEY;
ALTER TABLE planet_osm_line ADD gid serial PRIMARY KEY;
ALTER TABLE planet_osm_polygon ADD gid serial PRIMARY KEY;
ALTER TABLE planet_osm_roads ADD gid serial PRIMARY KEY;

QGIS hat Probleme, wenn die Geometriespalte nur GEOMETRIE ist. Einige Abfragen schlagen möglicherweise fehl. Ich fand es nützlich, die planet_osm_polygonGeometrie zu ändern MultiPolygonmit:

ALTER TABLE planet_osm_polygon
    ALTER COLUMN way TYPE geometry(MultiPolygon,3857) USING ST_Multi(way);
jgrocha
quelle
3

Ich denke, das ist ein Hauptproblem. Ihre Tabelle sollte eine haben und diese wird erkannt, wenn Sie die Tabelle über PGAdmin anzeigen.

Ich hatte das gleiche Problem, lud aber den Layer mit einem Primärschlüsselfeld namens ID (willkürlich) neu und alle meine Bearbeitungswerkzeuge sind jetzt in der Symbolleiste aktiv.

Mit SQL können Sie eine OID-Spalte des Datentyps 'serial' hinzufügen und mit der folgenden Anweisung einen Primärschlüssel erstellen:

ALTER TABLE schema."Tablename"

ADD ID serial NOT NULL

ALTER TABLE schema."Tablename" ADD PRIMARY KEY (id);

Über eine GUI können Sie Ihren Layer mit einem Primärschlüssel neu laden, der von der Datenbank und damit von PostGIS und QGIS erkannt wird:

  • DB Manager öffnen
  • Stellen Sie eine Verbindung zu Ihrer Datenbank her
  • wähle 'Ebene / Datei importieren'
  • Aktivieren Sie das Kontrollkästchen "Primärschlüssel" und geben Sie einen Namen für die Spalte "Primärschlüssel" ein, in der die eindeutigen IDs gespeichert werden, die die Bearbeitung ermöglichen:

Bildbeschreibung hier eingeben

Gehen Sie von dort zurück zu PGAdmin, stellen Sie eine Verbindung zu Ihrer Datenbank her und klicken Sie auf die Tabelle, die Sie gerade neu erstellt haben. Jetzt können Sie sehen, ob die OID-Spalte erkannt wird:

Bildbeschreibung hier eingeben

DPSSpatial
quelle
Unter PGAdmin kein Primärschlüssel. Wie lade ich die Ebene neu?
Mathieu
@Mathieu Ich würde das DBManager-Plugin in QGIS verwenden und auf die Option "Primärschlüssel" klicken und das Feld OBJECTID oder etwas Ähnliches benennen. Das sollte es Ihnen ermöglichen, bearbeitbare Funktionen zu haben ... Wenn Sie ein eindeutiges ID-Feld haben, das Sie als Primärschlüssel verwenden möchten, können Sie dies später jederzeit neu einstellen ...
DPSSpatial
Ich bin auf jeden Fall dumm, aber unter DBmanager habe ich nicht gefunden, wo der Primärschlüssel gesetzt werden soll. Eigentlich habe ich für "planetOSM polygon" (und andere) eine Warnung, die besagt, dass es keinen Primärschlüssel gibt.
Mathieu
ok - habe gerade meine Antwort aktualisiert, aber das ist die GUI-Methode ... lass es mich wissen, wenn das für dich funktioniert ...
DPSSpatial
Vielen Dank für das Verfahren, und jetzt verstehe ich, warum ich es nicht tun kann: Die Datenbank wird mit osm2pgsql direkt aus der Datei osm.pbf in postgis importiert. In Ihrer Prozedur befindet sich eine externe Datei, die geladen werden muss. In meinem Fall befindet sich die Datenbank bereits in Postgis und sagt keinen Primärschlüssel, wie in Ihrer Bildschirmaufnahme gezeigt. Gibt es also eine Möglichkeit - wenn die Datenbank bereits importiert wurde - unter pgsql einen Primärschlüssel zu generieren?
Mathieu