O multipolígono PostGIS, quando convertido em shapefile, não corresponde à geometria de origem

8

Estou tentando converter um registro MULTIPOLYGON do PostGIS (v2.2.2) para o shapefile via QGIS (v2.18.9), mas a geometria da fonte e o shapefile resultante não coincidem conforme exibido nas imagens abaixo (a camada vermelha é a fonte e a camada verde é o shapefile resultante). Eu obtenho o mesmo resultado se eu realizar a conversão via ogr2ogr do GDAL v2.0.0. Essa conversão leva cerca de 40 minutos para ser concluída.

Se eu despejar a geometria de origem no POLYGON e executar a conversão, o shapefile resultante está correto e a conversão é muito mais rápida (7 segundos + 17 segundos para despejo). Mas, em vez de cinco recursos, agora eu termino com 305188.

Os registros MULTIPOLYGON de origem são criados por ST_Union nas células adjacentes, se isso importa.

Estou esquecendo de algo? Existe uma maneira de realizar a conversão correta? Alguém pode explicar por que isso está acontecendo?

Geometria de origem Fonte do PostGIS

Arquivo de forma exportado com furos preenchidos marcados por setas Shapefile exportado


Eu tenho mais detalhes:

O pgsql2shp produz o mesmo shapefile resultante, como o QGIS ou ogr2ogr.

@dbaston - cortei a maioria dos dados e deixei a parte ao redor da área apresentada nas imagens acima (em torno de ('PONTO (-89,45 29,99)', 4326)). Eu converti esta pequena amostra e obtive o mesmo resultado. Se você ou alguém quiser tentar a conversão na mesma amostra, pode obter o despejo aqui:

Exemplo de backup de dados do PostgreSQL v9.5

Após 31 horas, o ST_IsValid retornou true em todas as geometrias do conjunto de dados completo. Obtive o mesmo resultado para a amostra menor disponível no link acima. No entanto, verifique a validade no QGIS para o mesmo conjunto de dados menor retornado:

ring 1 of polygon 712 not in exterior ring  
ring 2 of polygon 712 not in exterior ring  
ring 3 of polygon 712 not in exterior...

Como é que existe uma diferença na verificação de validade no PostGIS e QGIS?

Para verificar mais adiante, removi todas as partes do polígono, exceto a marcada em azul na imagem acima. Eu verifiquei o seu formato WKT e parece bom. E agora a conversão para shapefile com apenas esse recurso estava correta.

Isto faz algum sentido? Eu verifiquei mais conjuntos de dados criados por ST_Union nas células adjacentes e descobri que o mesmo problema existe lá também ao converter para shapefile. Os mesmos dados convertidos em GeoJSON produzem o resultado correto.

MULTIPOLYGON foi criado a partir da geometria POLYGON com a seguinte expressão:

st_multi(st_union(st_buffer(geom,0)))
Dejan Stojanovic
fonte
1
Pode haver erros de topologia nos dados de origem. Como os dados estão no PostGIS, você pode verificar as geometrias com ST_IsValid e ST_IsValidReason ou corrigi-las com ST_MakeValid.
user30184
Desculpe por não comentar aqui, mas ainda não tenho o privilégio. Eu queria saber como você conseguiu: "Eu obtenho o mesmo resultado se eu realizar a conversão via ogr2ogr do GDAL v2.0.0" Você poderia ser mais específico .. código? Você já tentou o pgsql2shp?
28717 Martinyt
Obrigado. Estou executando isso agora, mas está demorando muito tempo para verificar a validade da geometria. Eu responderei quando a verificação for concluída.
Dejan Stojanovic 10/10
2
Eu já vi esse comportamento antes em geometrias complexas (válidas) com anéis aninhados dentro de furos. Eles podem ser tratados por ambos ogr2ogre de maneira pgsql2shpdiferente, mas vi casos que surpreendem cada um deles. Se você puder reduzir o problema a uma entrada menor, seria útil como um relatório de erro.
dbaston
Eu converti sua amostra para GeoPackage e o resultado é o mesmo que o Postgis. Você realmente precisa usar o formato shapefile? Captura de tela . GeoPackage é muito melhor :-)
jgrocha

Respostas:

1

Parece ser um bug no QGIS (incluído o 2.18.16) ao renderizar os multipolígonos de um SHP. Se você abrir o SHP no ArcMap - esse problema não ocorre. Ou, se você exportar seus multipolígonos para SQLite - esse problema também não acontece. Espero que alguém da equipe do QGIS veja essa pergunta.

SHP usando o ArcMap 10 SQLite usando QGIS 2.18.16

Ralph Tee
fonte