Peguei uma cópia do livro super-perverso 'Python Geospatial Development' de Erik Westra ( link da Amazon ), e estou trabalhando nisso. Atualmente, ele está me ensinando a carregar dados da costa GSHHS de um arquivo de forma em um banco de dados PostGIS, em preparação para a construção de um aplicativo da web geoespacial.
Meu problema é o seguinte: quando tento importar os dados GSHHS para o PostGIS, eles são rejeitados porque os polígonos da costa não são considerados 'válidos'. Especificamente, recebi uma mensagem de erro que descreveu alguns (mas não todos) dos polígonos da costa como sendo 'anéis não fechados'.
Entendo que esse erro está tentando me dizer que o primeiro e o último ponto do polígono não são os mesmos. No entanto, isso simplesmente não é verdade. Examinei a representação WKT de muitos polígonos e eles estão corretos. Eles definitivamente começam e terminam com o mesmo co-ordenada.
Os polígonos são extraídos dos shapefiles usando a biblioteca OGR e exportando cada recurso de polígono para o WKT. Tentei reconstituir o polígono via Shapely e experimentei o WKB, mas sem sucesso. Eu ter sido capaz de carregar os mesmos dados em PostGIS como uma tabela MULTIPOLYGON, usando o carregador shp2pgsql.
Fiquei me perguntando se alguém lá fora tinha:
(a) talvez tenha usado o mesmo livro, ficou preso no mesmo problema e tem a resposta para mim?
(b) encontrou um problema semelhante e encontrou uma solução?
(c) na falta disso, tem algum conselho de "melhores práticas" para garantir geometria válida antes de carregar no PostGIS?
ATUALIZAÇÃO: um colega sugeriu que o problema dos 'anéis não fechados' pode ser apenas um sintoma de outro problema. É possível que minha configuração do PostGIS / PostgreSQL tenha limites de tamanho (em transações de inserção, pacotes recebidos, seqüências de texto, etc.).
Como estou usando polígonos WKT muito longos como entrada, o PostGIS pode cortá-los muito cedo para permitir que cada polígono seja concluído. Vou testá-lo amanhã, mas parece provável. Minha inserção das fronteiras do país estava apenas aceitando alguns registros e não outros. De memória, as geometrias aceitas eram para pequenas nações insulares como Antígua (e provavelmente tinham representações curtas do WKT).
Portanto, isso pode acabar sendo mais um encadeamento de administrador de banco de dados PostGIS, em vez de um encadeamento de geometria inválido.
Respostas:
Analisei seus dados e o exemplo do livro. O problema é que existem três polígonos inválidos nos dados processados no livro:
GSHHS_l_L1.shp
ID = 92-W
ID = 486-W
GSHHS_l_L2.shp
ID = 7333-W
Como este é um exemplo, seria mais fácil excluir esses polígonos do conjunto de dados ou apenas adicionar uma instrução if no código
fonte