QGIS, Postgis: o tipo de geometria não corresponde ao tipo de coluna

30

Estou tentando importar alguns shapefiles de polígono para o Postgis no QGIS via SPIT. Um deles não pode ser importado e retorna este erro:

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

Tentei alterar o atributo "Feature Class" nessa tabela no SPIT widnow, de MULTIPOLYGON para POLYGON, mas nada aconteceu.

Existe alguma maneira de fazer o Postgis aceitar os dois tipos (polígono e multipolígono)? Ou talvez de alguma forma eu possa converter a geometria do shapefile de polígono para multipolígono? Alguma ideia?

Eu tentei o Qgis 2.0.1 no Windows e o Qgis 2.3 no ArchLinux.

dmh126
fonte

Respostas:

14

O Spit não é mantido e não é mais recomendado. Eu sugiro usar a caixa de ferramentas de processamento e escolher o algoritmo "Importar para o PostGIS". Eu tive muito mais sorte usando essa rotina. Algumas coisas a serem observadas:

  • O parâmetro database (nome da conexão) deve corresponder ao nome da sua conexão com o banco de dados na caixa de diálogo "Adicionar camada PostGIS".
  • O esquema já deve existir - não será criado automaticamente
ndawson
fonte
Funciona perfeitamente. Obrigado. Também carreguei este shapefile com o DB Manager. Primeiro, eu carreguei outra camada com o Multipolygon pelo SPIT, depois a substituí pela camada POLYGON no DBM (camada / arquivo de importação). Isso também funciona.
precisa saber é o seguinte
O banco de dados não será exibido (mesmo que tem o mesmo nome no QGIS 2.10 no Windows)
Menelau Kotsollaris
19

Parece ser um problema conhecido que não será corrigido: consulte http://hub.qgis.org/issues/5328

Se você precisar de uma solução alternativa, tente alterar o tipo de coluna de geometria da sua tabela para uma 'geometria' genérica:

ALTER TABLE my_table ALTER COLUMN geom SET DATA TYPE geometry;

Depois de fazer a importação, você pode voltar para MultiPolygon:

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

Como alternativa, tente carregar seus dados usando ogr2ogr .

dbaston
fonte
votando com sua resposta @dbaston. é melhor que o meu. :)
sfletche
19

Eu uso ogr2ogr para automatizar a ingestão de shapefiles em um banco de dados PostGIS. Especificamente em relação à pergunta, use a opção:

-nlt PROMOTE_TO_MULTI

Isso forçará o ogr2ogr a promover geometrias POLYGON para MULTIPOLYGON, evitando o erro. Um exemplo muito simples:

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

Omiti os detalhes do host / autenticação do pgsql. Para agrupar vários shapefiles, você pode fazer algo como:

find ./ -name *.shp | xargs -n1 ogr2ogr <ogr2ogr args omitting the shapefile>
Roubar
fonte
Isso funciona e é mais fácil do que outras respostas. Merece votos positivos.
Joe Germuska
5

Embora tenha tentado resolvê-lo com o algoritmo "Importar para PostGis", não obtive êxito (meu banco de dados não estava aparecendo na lista - estou usando o QGIS 2.10).

Em vez disso, usei shp2pgsql , que era uma tarefa simples do prompt de comando, conforme descrito abaixo:

  • Abrir prompt de comando ( como administrador )
  • Vá para a pasta PostgreSQL / bin, que deve ser algo como isto: C:\Program Files\PostgreSQL\9.4\bin>
  • Simplesmente copie e cole seus .shparquivos neste diretório. (Copiei minha pasta inteira com meus .shparquivos.
  • No prompt de comando, digite o seguinte: shp2pgsql -s 4326 MyShpDir/MySHPFile.shp> MYSQLFile.sqlonde MyShpDirseu diretório, 4326 é o SRID do WGS84; portanto, se você estiver usando SSID diferente, altere MySHPFile.shpseu arquivo específico ( MYSQLFileserá criado automaticamente). Obviamente, faça isso para todos os arquivos que você deseja converter. Os arquivos serão salvos no seu diretório atual ( C:\Program Files\PostgreSQL\9.4\binno meu caso)

Em seguida, basta copiar e colar os arquivos SQL no seu banco de dados PLSQL.

Além disso, uma coisa interessante adicional shp2pgsqlé o fato de que você pode criar instantaneamente um índice em sua tabela, apenas adicionando o Iparâmetro no comando, assim:

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

Lucro! :)

Menelaos Kotsollaris
fonte
3

Sim, você pode dizer ao PostGIS para aceitar qualquer tipo de geometria (polígono, multipolígono, ponto, cadeia de linhas etc.) adicionando a seguinte restrição à sua tabela.

Para PostGIS 2.x (usando o tipo de geometria Geometry genérico)

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

Resposta anterior (para PostGIS 1.x usando restrições)

CONSTRAINT enforce_geometry_type CHECK (geometrytype(geom) = 'MULTIPOLYGON'::text OR geometrytype(geom) = 'POLYGON'::text OR geom IS NULL)
sfletche
fonte
Erro de sintaxe em ou perto de CONSTRAINT. Eu tentei SET CONSTRAINTS mas, em vez disso, recebi o mesmo erro perto de CHECK.
dmh126
qual versão do postgis você está usando?
precisa
Postgis 2.1 para PostgreSQL 9.3
dmh126
tente usar em enforce_geotype_geomvez de enforce_geometry_type. deixe-me saber se isso funciona e eu editarei minha resposta, se funcionar.
precisa
Isso não funciona. O mesmo erro.
dmh126
2

Tentei a solução do algoritmo 'Importar para o PostGIS', mas achei que isso também não funcionava. A solução mais fácil que encontrei foi acessar o banco de dados > DB Manager , navegar até o banco de dados e clicar no botão Importar camada / arquivo (seta para baixo) .

Brideau
fonte