QGIS, Postgis: el tipo de geometría no coincide con el tipo de columna

30

Estoy tratando de importar algunos archivos de forma de polígono a Postgis en QGIS a través de SPIT. Uno de ellos no se puede importar y devuelve este error:

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

Traté de cambiar el atributo "Clase de entidad" en esa tabla en SPIT widnow, de MULTIPOLYGON a POLYGON, pero no pasó nada.

¿Hay alguna forma de hacer que Postgis acepte ambos tipos (polígono y multipolígono)? ¿O tal vez de alguna manera puedo convertir la geometría del archivo de forma de polígono a multipolígono? ¿Algunas ideas?

He probado Qgis 2.0.1 en Windows y Qgis 2.3 en ArchLinux.

dmh126
fuente

Respuestas:

14

La saliva no se mantiene y ya no se recomienda. Sugeriría usar la caja de herramientas de procesamiento y elegir el algoritmo "Importar a PostGIS". He tenido mucha más suerte usando esa rutina. Algunas cosas a tener en cuenta:

  • El parámetro de la base de datos (nombre de la conexión) debe coincidir con el nombre de la conexión de la base de datos desde el cuadro de diálogo "Agregar capa PostGIS".
  • El esquema ya debe existir; no se creará automáticamente
ndawson
fuente
Funciona perfectamente Gracias. También cargué este archivo de forma con DB Manager. Primero cargué otra capa con Multipolygon by SPIT, luego la sobrescribí con la capa POLYGON en DBM (Importar capa / archivo). Funciona tambien
dmh126
La base de datos no se mostrará (incluso si tiene el mismo nombre en QGIS 2.10 en Windows)
Menelaos Kotsollaris
19

Este parece ser un problema conocido que no se solucionará: consulte http://hub.qgis.org/issues/5328

Si necesita una solución alternativa, intente cambiar el tipo de columna de geometría de su tabla a una 'geometría' genérica:

ALTER TABLE my_table ALTER COLUMN geom SET DATA TYPE geometry;

Después de que haya importado, puede volver a MultiPolygon:

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

Alternativamente, intente cargar sus datos usando ogr2ogr .

dbaston
fuente
votando tu respuesta @dbaston. Es mejor que el mío. :)
sfletche
19

Utilizo ogr2ogr para automatizar la ingesta de archivos de forma en una base de datos PostGIS. Específicamente con respecto a la pregunta, use la opción:

-nlt PROMOTE_TO_MULTI

Esto obligará a ogr2ogr a promover las geometrías POLYGON a MULTIPOLYGON, evitando el error. Un ejemplo muy simple:

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

He omitido los detalles de host / autenticación pgsql. Para agrupar múltiples archivos de forma, puede hacer algo como:

find ./ -name *.shp | xargs -n1 ogr2ogr <ogr2ogr args omitting the shapefile>
Robar
fuente
Esto funciona y es más fácil que otras respuestas. Se merece votos a favor.
Joe Germuska
5

Aunque intenté resolverlo con el algoritmo "Importar a PostGis", no tuve éxito (mi base de datos no aparecía en la lista, estoy usando QGIS 2.10).

En cambio, usé shp2pgsql , que era una tarea simple del símbolo del sistema como se describe a continuación:

  • Abrir símbolo del sistema ( como administrador )
  • Vaya a la carpeta PostgreSQL / bin que debería verse así: C:\Program Files\PostgreSQL\9.4\bin>
  • Simplemente copie y pegue sus .shparchivos en este directorio. (Copié toda mi carpeta con mis .shparchivos.
  • En el símbolo del sistema, escriba lo siguiente: shp2pgsql -s 4326 MyShpDir/MySHPFile.shp> MYSQLFile.sqldonde MyShpDirsu directorio, 4326 es el SRID de WGS84, cambie si está usando un SSID diferente, MySHPFile.shpsu archivo particular ( MYSQLFilese creará automáticamente). Obviamente, haga esto para todos los archivos que desea convertir. Los archivos se guardarán en su directorio actual ( C:\Program Files\PostgreSQL\9.4\binen mi caso)

Luego, simplemente copie y pegue los archivos SQL en su base de datos PLSQL.

Además, una cosa interesante adicional shp2pgsqles el hecho de que puede crear instantáneamente un índice en su tabla simplemente agregando el Iparámetro en el comando, así:

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

¡Lucro! :)

Menelaos Kotsollaris
fuente
3

Sí, puede decirle a PostGIS que acepte cualquier tipo de geometría (polígono, multipolígono, punto, cadena lineal, etc.) agregando la siguiente restricción a su tabla.

Para PostGIS 2.x (usando Geometry typemod genérico)

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

Respuesta anterior (para PostGIS 1.x usando restricciones)

CONSTRAINT enforce_geometry_type CHECK (geometrytype(geom) = 'MULTIPOLYGON'::text OR geometrytype(geom) = 'POLYGON'::text OR geom IS NULL)
sfletche
fuente
Error de sintaxis en o cerca de CONSTRAINT. Intenté SET CONSTRAINTS pero en cambio obtuve el mismo error cerca de CHECK.
dmh126
¿Qué versión de postgis estás usando?
sfletche
Postgis 2.1 para PostgreSQL 9.3
dmh126
intente usar en enforce_geotype_geomlugar de enforce_geometry_type. avíseme si eso funciona, y editaré mi respuesta si es así.
sfletche
No funciona El mismo error
dmh126
2

Intenté la solución del algoritmo 'Importar en PostGIS' pero descubrí que tampoco funcionaba. La solución más fácil que encontré fue ir a Base de datos > Administrador de bases de datos , navegar a su base de datos y hacer clic en el botón Importar capa / archivo (la flecha hacia abajo) .

Brideau
fuente