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

25

Estoy intentando importar algunos shapefiles poligonales 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)

He intentado cambiar el atributo "Clase de entidad" en esa tabla en SPIT widnow, de MULTIPOLYGON a POLYGON, pero no sucedió 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 de shapefile de polígono a multipolígono? ¿Alguna idea?

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

    
pregunta dmh126 30.04.2014 - 15:46

6 respuestas

13

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

  • El parámetro de la base de datos (nombre de la conexión) debe coincidir con lo que ha denominado la conexión de su base de datos desde el cuadro de diálogo "Agregar capa PostGIS".
  • El esquema ya debe existir, no se creará automáticamente
respondido por el ndawson 01.05.2014 - 00:43
17

Este parece ser un problema conocido que no se solucionará: consulte enlace

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;

Una vez que hayas realizado la importación, puedes volver a MultiPolygon :

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

Alternativamente, intente cargar sus datos utilizando ogr2ogr .

    
respondido por el dbaston 30.04.2014 - 18:17
13

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

-nlt PROMOTE_TO_MULTI

Esto forzará 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 pgsql host / auth details. Para agrupar varios shapefiles puedes hacer algo como:

find ./ -name *.shp | xargs -n1 ogr2ogr <ogr2ogr args omitting the shapefile>
    
respondido por el Rob 01.10.2015 - 05:12
5

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

En vez de eso, usé shp2pgsql , que fue una tarea sencilla del símbolo del sistema como se describe a continuación:

  • Abre el símbolo del sistema ( como administrador )
  • Vaya a la carpeta PostgreSQL / bin, que debería verse así: C:\Program Files\PostgreSQL.4\bin>
  • Simplemente copie & pega tus archivos .shp en este directorio. (Copié toda la carpeta con mis archivos .shp .
  • En el símbolo del sistema, escriba lo siguiente: shp2pgsql -s 4326 MyShpDir/MySHPFile.shp> MYSQLFile.sql donde MyShpDir su directorio, 4326 es el SRID de WGS84, así que cambie Si está utilizando un SSID diferente, MySHPFile.shp su archivo particular ( MYSQLFile se creará automáticamente). Obviamente, haz esto para todos los archivos que quieras convertir. Los archivos se guardarán en su directorio actual ( C:\Program Files\PostgreSQL.4\bin en mi caso)

Luego simplemente copia & pega los archivos SQL en tu base de datos PLSQL.

Además, una cosa interesante adicional sobre shp2pgsql es el hecho de que puedes crear instantáneamente un index en su tabla simplemente agregando el parámetro I en el comando, de esta manera:

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

Beneficio! :)

    
respondido por el Menelaos Kotsollaris 16.09.2015 - 22:21
3

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

Para PostGIS 2.x (usando typemod genérico de geometría)

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)
    
respondido por el sfletche 30.04.2014 - 16:53
2

Probé la solución del algoritmo 'Importar en PostGIS' pero encontré que eso tampoco funcionó. La solución más fácil que encontré fue ir a Base de datos > DB Manager , navegue hasta su base de datos y haga clic en el botón Importar capa / archivo (la flecha hacia abajo) .

    
respondido por el Brideau 10.11.2015 - 05:02

Lea otras preguntas en las etiquetas