QGIS, Postgis: Der Geometrietyp stimmt nicht mit dem Spaltentyp überein

30

Ich versuche, einige Polygon-Shapefiles über SPIT nach Postgis in QGIS zu importieren. Einer von ihnen kann nicht importiert werden und gibt diesen Fehler zurück:

ERROR: Geometry type (Polygon) does not match column type (MultiPolygon)

Ich habe versucht, das Attribut "Feature Class" in dieser Tabelle in SPIT widnow von MULTIPOLYGON in POLYGON zu ändern, aber es ist nichts passiert.

Gibt es eine Möglichkeit, Postgis zu veranlassen, beide Typen (Polygon und Multipolygon) zu akzeptieren? Oder kann ich vielleicht irgendwie Shapefile-Geometrie von Polygon in Multipolygon konvertieren? Irgendwelche Ideen?

Ich habe Qgis 2.0.1 in Windows und Qgis 2.3 in ArchLinux ausprobiert.

dmh126
quelle

Antworten:

14

Spucke ist nicht mehr gewartet und nicht mehr zu empfehlen. Ich würde vorschlagen, die Verarbeitungs-Toolbox zu verwenden und den "Import in PostGIS" -Algorithmus zu wählen. Ich hatte viel mehr Glück mit dieser Routine. Ein paar Dinge zu beachten:

  • Der Datenbankparameter (Verbindungsname) muss mit dem übereinstimmen, den Sie im Dialogfeld "PostGIS-Ebene hinzufügen" als Datenbankverbindung angegeben haben.
  • Das Schema muss bereits vorhanden sein - es wird nicht automatisch erstellt
ndawson
quelle
Das funktioniert einwandfrei. Vielen Dank. Auch dieses Shapefile habe ich mit DB Manager geladen. Zuerst hatte ich eine andere Ebene mit Multipolygon von SPIT geladen, dann überschrieb ich sie mit der POLYGON-Ebene in DBM (Ebene / Datei importieren). Es funktioniert auch
DMH126
Die Datenbank wird nicht
angezeigt
19

Dies scheint ein bekanntes Problem zu sein, das nicht behoben werden kann: siehe http://hub.qgis.org/issues/5328

Wenn Sie eine Problemumgehung benötigen, versuchen Sie, den Geometriespaltentyp Ihrer Tabelle in eine generische "Geometrie" zu ändern:

ALTER TABLE my_table ALTER COLUMN geom SET DATA TYPE geometry;

Nachdem Sie den Import abgeschlossen haben, können Sie zurückkehren zu MultiPolygon:

ALTER TABLE my_table ALTER COLUMN geom 
    SET DATA TYPE geometry(MultiPolygon) USING ST_Multi(geom);

Versuchen Sie alternativ, Ihre Daten mit ogr2ogr zu laden .

dbaston
quelle
stimmen Sie Ihre Antwort @dbaston. es ist besser als meins. :)
sfletche
19

Ich benutze ogr2ogr, um das Einlesen von Shapefiles in eine PostGIS-Datenbank zu automatisieren. Verwenden Sie im Hinblick auf die Frage die Option:

-nlt PROMOTE_TO_MULTI

Dadurch wird ogr2ogr gezwungen, POLYGON-Geometrien in MULTIPOLYGON umzuwandeln, wodurch der Fehler vermieden wird. Ein sehr einfaches Beispiel:

ogr2ogr -f "PostgreSQL" PG:"dbname='<my_db>'" -nlt PROMOTE_TO_MULTI <shapefile>

Ich habe Pgsql Host / Auth Details ausgelassen. Um mehrere Shapefiles zu stapeln, können Sie Folgendes tun:

find ./ -name *.shp | xargs -n1 ogr2ogr <ogr2ogr args omitting the shapefile>
rauben
quelle
Dies funktioniert und ist einfacher als andere Antworten. Es verdient Aufwertungen.
Joe Germuska
5

Obwohl ich versucht habe, es mit dem "Import to PostGis" -Algorithmus zu lösen, hatte ich keinen Erfolg (meine Datenbank wurde nicht in der Liste angezeigt - ich verwende QGIS 2.10).

Stattdessen habe ich shp2pgsql verwendet , eine einfache Eingabeaufforderung, wie unten beschrieben:

  • Öffnen Sie die Eingabeaufforderung ( als Administrator )
  • Gehen Sie zum PostgreSQL / bin-Ordner, der ungefähr so ​​aussehen sollte: C:\Program Files\PostgreSQL\9.4\bin>
  • Kopieren Sie einfach Ihre .shpDateien und fügen Sie sie in dieses Verzeichnis ein. (Ich habe meinen gesamten Ordner mit meinen .shpDateien kopiert .
  • Geben Sie an der Eingabeaufforderung Folgendes ein: 4326 ist die SRID von WGS84 shp2pgsql -s 4326 MyShpDir/MySHPFile.shp> MYSQLFile.sqlin MyShpDirIhrem Verzeichnis. Ändern Sie daher bei Verwendung einer anderen SSID Ihre bestimmte Datei ( wird automatisch erstellt). Tun Sie dies natürlich für alle Dateien, die Sie konvertieren möchten. Die Dateien werden in Ihrem aktuellen Verzeichnis gespeichert ( in meinem Fall)MySHPFile.shpMYSQLFileC:\Program Files\PostgreSQL\9.4\bin

Dann kopieren Sie einfach die SQL-Dateien in Ihre PLSQL-Datenbank.

Darüber hinaus ist eine weitere coole Sache shp2pgsql, dass Sie sofort einen Index in Ihrer Tabelle erstellen können, indem Sie einfach den IParameter im Befehl hinzufügen , wie folgt :

shp2pgsql -s 4326 -I MyShpDir/MySHPFile.shp> MYSQLFile.sql

Profitieren! :)

Menelaos Kotsollaris
quelle
3

Ja, Sie können PostGIS anweisen, jeden Geometrietyp (Polygon, Multipolygon, Punkt, Linienfolge usw.) zu akzeptieren, indem Sie der Tabelle die folgende Einschränkung hinzufügen.

Für PostGIS 2.x (unter Verwendung des generischen Geometrie-Typemods)

ALTER TABLE my_table ALTER COLUMN geom TYPE geometry(Geometry,4326);

Vorherige Antwort (für PostGIS 1.x mit Einschränkungen)

CONSTRAINT enforce_geometry_type CHECK (geometrytype(geom) = 'MULTIPOLYGON'::text OR geometrytype(geom) = 'POLYGON'::text OR geom IS NULL)
sfletche
quelle
Syntaxfehler bei oder in der Nähe von CONSTRAINT. Ich habe SET CONSTRAINTS ausprobiert, aber stattdessen habe ich den gleichen Fehler in der Nähe von CHECK erhalten.
dmh126
Welche Version von Postgis verwenden Sie?
sfletche
Postgis 2.1 für PostgreSQL 9.3
dmh126
versuche es enforce_geotype_geomlieber mit als enforce_geometry_type. Lassen Sie mich wissen, ob das funktioniert, und ich bearbeite meine Antwort, wenn dies der Fall ist.
sfletche
Es funktioniert nicht Der selbe Fehler.
dmh126
2

Ich habe versucht, den PostGIS-Algorithmus zu importieren, aber auch das hat nicht funktioniert. Die einfachste Lösung, die ich gefunden habe, war, zu Datenbank > DB Manager zu wechseln, zu Ihrer Datenbank zu navigieren und auf die Schaltfläche Layer / Datei importieren (Abwärtspfeil) zu klicken .

Brideau
quelle