QGIS, Postgis: il tipo di geometria non corrisponde al tipo di colonna


30

Sto cercando di importare alcuni shapefile poligonali su Postgis in QGIS tramite SPIT. Uno di questi non può essere importato e restituisce questo errore:

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

Ho provato a cambiare l'attributo "Classe caratteristica" in quella tabella nel widnow SPIT, da MULTIPOLYGON a POLYGON, ma non è successo nulla.

Esiste un modo per far sì che Postgis accetti entrambi i tipi (poligono e multipoligono)? O forse in qualche modo posso convertire la geometria dello shapefile da poligono a multipoligono? Qualche idea?

Ho provato Qgis 2.0.1 in Windows e Qgis 2.3 in ArchLinux.

Risposte:


14

Lo sputo non è mantenuto e non è più raccomandato. Suggerirei di utilizzare la casella degli strumenti di elaborazione e di scegliere l'algoritmo "Importa in PostGIS". Ho avuto molta più fortuna usando quella routine. Alcune cose da notare:

  • Il parametro database (nome connessione) deve corrispondere a quello che hai chiamato la connessione al database dalla finestra di dialogo "Aggiungi livello PostGIS".
  • Lo schema deve già esistere: non verrà creato automaticamente

Funziona perfettamente. Grazie. Inoltre ho caricato questo shapefile con DB Manager. Prima ho caricato un altro livello con Multipolygon di SPIT, quindi l'ho sovrascritto con il livello POLYGON in DBM (Importa livello / file). Funziona anche
dmh126,

Il database non verrà visualizzato (anche se ha lo stesso nome in QGIS 2.10 su Windows)
Menelaos Kotsollaris

19

Questo sembra essere un problema noto che non verrà risolto: vedi http://hub.qgis.org/issues/5328

Se hai bisogno di una soluzione alternativa, prova a cambiare il tipo di colonna della geometria della tabella in una "geometria" generica:

ALTER TABLE my_table ALTER COLUMN geom SET DATA TYPE geometry;

Dopo aver effettuato l'importazione, è possibile tornare a MultiPolygon:

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

In alternativa, prova a caricare i tuoi dati usando ogr2ogr .


votando la tua risposta @dbaston. è meglio del mio. :)
sfletche,

19

Uso ogr2ogr per automatizzare l'inserimento di shapefile in un database PostGIS. In particolare per quanto riguarda la domanda, utilizzare l'opzione:

-nlt PROMOTE_TO_MULTI

Ciò costringerà ogr2ogr a promuovere le geometrie POLYGON su MULTIPOLYGON, evitando l'errore. Un esempio molto semplice:

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

Ho omesso i dettagli host / auth di pgsql. Per raggruppare più shapefile potresti fare qualcosa del tipo:

find ./ -name *.shp | xargs -n1 ogr2ogr <ogr2ogr args omitting the shapefile>

Funziona ed è più facile di altre risposte. Merita voti positivi.
Joe Germuska,

5

Anche se ho provato a risolverlo con l'algoritmo "Importa in PostGis", non ci sono riuscito (il mio database non compariva nell'elenco - sto usando QGIS 2.10).

Invece, ho usato shp2pgsql , che era una semplice attività del prompt dei comandi come descritto di seguito:

  • Apri prompt dei comandi ( come amministratore )
  • Vai alla cartella PostgreSQL / bin che dovrebbe assomigliare a questa: C:\Program Files\PostgreSQL\9.4\bin>
  • Basta copiare e incollare i .shpfile in questa directory. (Ho copiato la mia intera cartella con i miei .shpfile.
  • Al prompt dei comandi digitare quanto segue: shp2pgsql -s 4326 MyShpDir/MySHPFile.shp> MYSQLFile.sqldove MyShpDirla directory, 4326 è SRID di WGS84, quindi modificare se si utilizza un SSID diverso, MySHPFile.shpil file specifico ( MYSQLFileverrà creato automaticamente). Ovviamente fallo per tutti i file che vuoi convertire. I file verranno salvati nella directory corrente ( C:\Program Files\PostgreSQL\9.4\binnel mio caso)

Quindi copia e incolla semplicemente i file SQL nel tuo database PLSQL.

Inoltre, un'altra cosa interessante shp2pgsqlè il fatto che puoi creare immediatamente un indice nella tua tabella semplicemente aggiungendo il Iparametro nel comando, in questo modo:

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

Profitto! :)


3

Sì, puoi dire a PostGIS di accettare qualsiasi tipo di geometria (poligono, multipoligono, punto, linestring, ecc.) Aggiungendo il seguente vincolo alla tabella.

Per PostGIS 2.x (utilizzando il tipemod Geometry generico)

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

Risposta precedente (per PostGIS 1.x utilizzando i vincoli)

CONSTRAINT enforce_geometry_type CHECK (geometrytype(geom) = 'MULTIPOLYGON'::text OR geometrytype(geom) = 'POLYGON'::text OR geom IS NULL)

Errore di sintassi presso o vicino a VINCITORE. Ho provato SET VINCOLI ma invece ho avuto lo stesso errore vicino a CHECK.
dmh126,

quale versione di postgis stai usando?
sfletche,

Postgis 2.1 per PostgreSQL 9.3
dmh126

prova a usare enforce_geotype_geompiuttosto che enforce_geometry_type. fatemi sapere se funziona, e modificherò la mia risposta in caso affermativo.
sfletche,

Non funziona Lo stesso errore.
dmh126,

2

Ho provato la soluzione dell'algoritmo "Importa in PostGIS" ma ho scoperto che neanche quello funzionava. La soluzione più semplice che ho trovato è stata andare su Database > Gestione DB , passare al database e fare clic sul pulsante Importa livello / file (la freccia giù) .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.