Eu tenho um shapefile decentemente detalhado com recursos de polígono / multipolígono (o arquivo tem cerca de 500mb). Na verdade, é um arquivo de forma do mundo inteiro, com os recursos representando as costas. Eu preciso dividir esses dados usando uma grade. Para ser claro, não quero 'classificar' os dados, mas, na verdade, cortar os polígonos em blocos. Sei que essa pergunta já foi feita antes, mas as soluções que encontrei não funcionaram para mim.
Eu tentei:
Usando o QGIS e cruzando o conteúdo do meu shapefile com uma grade vetorial - os resultados são terríveis. A maior parte da massa terrestre principal desaparece magicamente, embora pareça que pedaços menores de terra às vezes o fazem. Devo observar que esse método funciona muito bem com dados muito mais simples (ou seja, menos pontos)
Usando as ferramentas de interseção do OGR. Eu tentei através do ogr2ogr e até rodando minha própria ferramenta C ++. Ambos têm o mesmo problema que o QGIS. Eles também não apresentam esse problema para arquivos simples, mas falham nos mais complexos. Para referência, estou usando um shapefile da Austrália e da Nova Zelândia, com menos de 20mb de tamanho, e o QGIS e o OGR falham em 'gridificá-lo'.
Alguém sugeriu o uso do PostGIS em um ponto, pois ele possui uma função de interseção - mas o ST_Intersect do PostGIS usa o mesmo back-end do GEOS que o OGR. Na verdade, ambos chamam a mesma função, tanto quanto eu posso dizer, então não acho que o PostGIS traga resultados diferentes.
Eu estava procurando sugestões sobre o que mais eu poderia tentar. Preciso de um aplicativo ou kit de ferramentas robusto que possa dividir arquivos de forma altamente detalhados em blocos.
EDIT: Adicionando mais algumas informações
Em resposta a Simbamangu:
O shapefile é basicamente o litoral do OpenStreetMap. É uma versão mesclada do arquivo 'processing_p' (para que não seja dividida em blocos) que recebi por e-mail na lista de desenvolvedores. Observe que a divisão de ladrilhos (em pedaços de 100 km x 100 km com sobreposição) não é necessariamente o que eu quero - eu não quero sobreposição e quero a liberdade de escolher o tamanho da grade ou apenas usaria o processado_p padrão.
Por padrão, os dados da costa apresentam erros de geometria relatados pelo QGIS. Corrijo esses erros com uma pequena ferramenta que montei usando algum código que encontrei projetado para solucionar especificamente esse problema (reparando erros de geometria nos dados da costa: https://github.com/tudelft-gist/prepair ). A execução dos arquivos com esta ferramenta corrige praticamente todos os erros que o QGIS detecta. Eu só tento fazer o cruzamento depois de limpar os arquivos.
Exatamente o que fiz usando o QGIS: abra os dados para garantir que eles estejam bem no QGIS. Tente dividi-lo em ladrilhos, criando uma camada de ladrilhos usando a Grade de vetores com um espaçamento especificado e, em seguida, cruzando as duas camadas - não é possível. Tente usar um conjunto de dados menor - selecione os recursos na Oceania (Aus, NZ) para tentar um conjunto de dados menor - esse arquivo de forma tem um tamanho <20mb. Mais uma vez, tente dividi-lo, não funciona.
O que fiz com o OGR: ogr2ogr diretamente usando as opções '-spat' e '-clipsrc' com spat_extent. Também escrevi uma pequena ferramenta C ++ que funciona no WKT, então eu converto o shapefile em WKT usando ogr2ogr e, em seguida, alimento o arquivo de texto no meu aplicativo. Ele percorre o arquivo e chama o método Intersection () documentado aqui: http://www.gdal.org/ogr/classOGRGeometry.html . Eu acho que acaba fazendo exatamente a mesma coisa que usar ogr2ogr diretamente.
Em resposta a Brent:
- Faz. Tudo está em WGS84 Lat / Lon
- Eu pensaria que o oposto é verdadeiro - que, para um determinado conjunto de blocos de grade, levaria muito mais tempo para interceptar um multipolígono gigante em vez de um monte de recursos fragmentados que poderiam ser mais espacialmente localizados em cada bloco, mas isso é uma sugestão interessante - vou tentar e relatar de volta.
- Nenhum campo de atributo é mantido durante o processo, estou interessado apenas em geometria.
- Não tenho certeza, mas acho que você está dizendo que devo selecionar os polígonos que se sobrepõem a um determinado bloco de grade e, em seguida, executar a interseção. Isso é muito complicado manualmente com o QGIS. Minha ferramenta já faz isso em certa medida com uma caixa de seleção delimitadora. Há um pouco de velocidade, mas o resultado final ainda é ruim e não é visivelmente diferente.
- Esta não é uma opção. No momento, estou tentando dividir os dados para que sejam de 1 grau lat x 1 grau lon, e estou procurando uma metodologia geral / robusta que funcione com todos os casos. Tentei aumentar o tamanho da grade (ou seja, 10 x 10) para ver se eu obteria melhores resultados e não vejo correlação entre o tamanho da grade e a qualidade da saída.
Edição # 2:
Eu tentei brincar com isso mais e, em geral, parece que os resultados não são confiáveis, tanto usando o GEOS quanto com o QGIS (que usa fTools, não sei se, por sua vez, usa o GEOS novamente). Eu estava errado ao afirmar que o tamanho da grade não tem nada a ver com os resultados - quanto maior a grade, melhores os resultados (isso é bom saber, mas ainda não é uma solução). Aqui está uma captura de tela de uma grade realmente espaçada que funcionou principalmente, mas falhou parcialmente em um bloco:
A geometria está limpa - o QGIS mostra 0 erros com a ferramenta "Verificar validade". Não pretendo abordar esse problema passo a passo; verificar se certos recursos falharam ou não na interseção em um conjunto de dados tão grande quando não é visualmente aparente (e não será com blocos menores) não é prático.