QGIS, Postgis: le type de géométrie ne correspond pas au type de colonne

30

J'essaie d'importer des fichiers de formes polygonales dans Postgis dans QGIS via SPIT. L'un d'eux ne peut pas être importé et renvoie cette erreur:

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

J'ai essayé de changer l'attribut "Feature Class" dans cette table dans widnow SPIT, de MULTIPOLYGON à POLYGON, mais rien ne s'est produit.

Existe-t-il un moyen pour que Postgis accepte les deux types (polygone et multipolygone)? Ou peut-être que je peux convertir la géométrie du fichier de formes du polygone en multipolygone? Des idées?

J'ai essayé Qgis 2.0.1 sous Windows et Qgis 2.3 sous ArchLinux.

dmh126
la source

Réponses:

14

Spit n'est pas entretenu et n'est plus recommandé. Je suggère d'utiliser la boîte à outils de traitement et de choisir l'algorithme "Importer dans PostGIS". J'ai eu beaucoup plus de chance en utilisant cette routine. Quelques points à noter:

  • Le paramètre de la base de données (nom de la connexion) doit correspondre à ce que vous avez nommé votre connexion à la base de données dans la boîte de dialogue "Ajouter une couche PostGIS".
  • Le schéma doit déjà exister - il ne sera pas créé automatiquement
ndawson
la source
Cela fonctionne parfaitement. Merci. J'ai également chargé ce fichier de formes avec DB Manager. J'avais d'abord chargé une autre couche avec Multipolygon by SPIT, puis je l'ai écrasée avec une couche POLYGON dans DBM (Importer couche / fichier). Ça marche aussi.
dmh126
La base de données ne s'affichera pas (même si elle porte le même nom dans QGIS 2.10 sous Windows)
Menelaos Kotsollaris
19

Cela semble être un problème connu qui ne sera pas résolu: voir http://hub.qgis.org/issues/5328

Si vous avez besoin d'une solution de contournement, essayez de changer le type de colonne de géométrie de votre table en une «géométrie» générique:

ALTER TABLE my_table ALTER COLUMN geom SET DATA TYPE geometry;

Après avoir effectué votre importation, vous pouvez revenir à MultiPolygon:

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

Vous pouvez également essayer de charger vos données à l'aide de ogr2ogr .

dbaston
la source
voter pour votre réponse @dbaston. c'est mieux que le mien. :)
sfletche
19

J'utilise ogr2ogr pour automatiser l'ingestion de fichiers de formes dans une base de données PostGIS. En ce qui concerne spécifiquement la question, utilisez l'option:

-nlt PROMOTE_TO_MULTI

Cela forcera ogr2ogr à promouvoir les géométries POLYGON en MULTIPOLYGON, en évitant l'erreur. Un exemple très simple:

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

J'ai omis les détails de l'hôte / auth pgsql. Pour regrouper plusieurs fichiers de formes, vous pouvez faire quelque chose comme:

find ./ -name *.shp | xargs -n1 ogr2ogr <ogr2ogr args omitting the shapefile>
Rob
la source
Cela fonctionne et est plus facile que les autres réponses. Cela mérite des votes positifs.
Joe Germuska
5

Bien que j'aie essayé de le résoudre avec l'algorithme "Importer vers PostGis", je n'ai pas réussi (ma base de données n'apparaissait pas sur la liste - j'utilise QGIS 2.10).

Au lieu de cela, j'ai utilisé shp2pgsql , qui était une tâche d'invite de commandes simple, comme décrit ci-dessous:

  • Ouvrir l'invite de commandes (en tant qu'administrateur )
  • Accédez au dossier PostgreSQL / bin qui devrait ressembler à ceci: C:\Program Files\PostgreSQL\9.4\bin>
  • Copiez et collez simplement vos .shpfichiers dans ce répertoire. (J'ai copié tout mon dossier avec mes .shpfichiers.
  • À l'invite de commandes, tapez ce qui suit: shp2pgsql -s 4326 MyShpDir/MySHPFile.shp> MYSQLFile.sqlMyShpDirvotre répertoire, 4326 est le SRID de WGS84, changez donc si vous utilisez un SSID différent, MySHPFile.shpvotre fichier particulier ( MYSQLFilesera créé automatiquement). Évidemment, faites cela pour tous les fichiers que vous souhaitez convertir. Les fichiers seront enregistrés dans votre répertoire actuel ( C:\Program Files\PostgreSQL\9.4\bindans mon cas)

Ensuite, copiez et collez simplement les fichiers SQL dans votre base de données PLSQL.

De plus, une autre chose intéressante shp2pgsqlest le fait que vous pouvez créer instantanément un index dans votre table en ajoutant simplement le Iparamètre dans la commande, comme ceci:

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

Profit! :)

Menelaos Kotsollaris
la source
3

Oui, vous pouvez indiquer à PostGIS d'accepter tout type de géométrie (polygone, multipolygone, point, chaîne de lignes, etc.) en ajoutant la contrainte suivante à votre table.

Pour PostGIS 2.x (en utilisant le type de modèle Geometry générique)

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

Réponse précédente (pour PostGIS 1.x utilisant des contraintes)

CONSTRAINT enforce_geometry_type CHECK (geometrytype(geom) = 'MULTIPOLYGON'::text OR geometrytype(geom) = 'POLYGON'::text OR geom IS NULL)
sfletche
la source
Erreur de syntaxe à ou près de CONSTRAINT. J'ai essayé SET CONSTRAINTS mais au lieu de cela, j'ai eu la même erreur près de CHECK.
dmh126
quelle version de postgis utilisez-vous?
sfletche
Postgis 2.1 pour PostgreSQL 9.3
dmh126
essayez d'utiliser enforce_geotype_geomplutôt que enforce_geometry_type. faites-moi savoir si cela fonctionne, et je modifierai ma réponse si c'est le cas.
sfletche
Ça ne marche pas. La même erreur.
dmh126
2

J'ai essayé la solution d'algorithme «Importer dans PostGIS» mais j'ai constaté que cela ne fonctionnait pas non plus. La solution la plus simple que j'ai trouvée était d'aller dans Base de données > Gestionnaire de bases de données, accédez à votre base de données et cliquez sur le bouton Importer la couche / le fichier (la flèche vers le bas) .

Brideau
la source