Divida um shapefile complexo em uma grade

11

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:

  1. Faz. Tudo está em WGS84 Lat / Lon
  2. 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.
  3. Nenhum campo de atributo é mantido durante o processo, estou interessado apenas em geometria.
  4. 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.
  5. 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:

insira a descrição da imagem aqui

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.

Pris
fonte
Onde você conseguiu o shapefile do mundo ou da Austrália? Eu suspeitaria que a geometria desse arquivo possa ter alguns problemas (tente Vector | Ferramentas de geometria | Verifique a validade da geometria no QGIS). Acabei de tentar uma interseção em um shapefile menor do mundo e blocos de 5 graus e funciona perfeitamente no QGIS.
Simbamangu
1
Tentei isso com a costa australiana de 100 mil da Geoscience Australia (20 MB) e blocos de 4 graus, também funciona bem (QGIS 1.7.4, OSX 10.7). Você poderia descrever com mais detalhes seus dados e o que fez?
Simbamangu
Obrigado por todas as informações extras. Eu suspeito que há algo de estranho nos dados do OSM; tente com o conjunto de dados que mencionei e veja se obtém melhores resultados. Eu me lembro de ter experimentado alguma estranheza com os dados do lago OSM no passado, tentarei procurar.
Simbamangu
Você poderia compartilhar o conjunto de dados ou mesmo parte dele (como no exemplo acima)?
Simbamangu 17/05/12

Respostas:

7

Acabei de criar minhas próprias ferramentas para fazer isso.

Eu usei a biblioteca Clipper ( http://www.angusj.com/delphi/clipper.php ) junto com o OGR para dividir meus dados configurados. Algo a se notar é que a realização de interseções ingenuamente com essa biblioteca leva muito tempo, então, em vez disso, usei uma abordagem de quadtree ... ou seja, divida em quatro células da grade, divida cada uma delas em mais quatro, etc, até obter a resolução desejada. A lib funciona muito bem, eu anexei uma captura de tela mostrando os resultados no hemisfério oriental:

insira a descrição da imagem aqui

O resultado acima levou cerca de 4,5 horas em um processador de 1,33 GHz.

Aqui estão as ferramentas no caso de alguém encontrar um problema semelhante no futuro. Observe que eles foram hackeados com provas de conceitos e você provavelmente não deve usá-los diretamente (pode servir como um bom ponto de partida para algo):

https://github.com/preet/scratch/tree/master/gis/polytoolkit

https://github.com/preet/scratch/tree/master/gis/shapefiles/shptk

Pris
fonte
O código vinculado não está mais disponível :-(
Shaun McDonald
Mudei o repositório para github.com/preet/scratch/tree/master/gis/polytoolkit . Dependendo do que exatamente você está tentando realizar, você pode achar github.com/preet/scratch/tree/master/gis/shapefiles/shptk mais útil.
Pris
O posterior é mais útil. Agora encontrei um método que usa o PostGIS, mas estaria interessado em descobrir se isso era mais rápido. Você tem um leia-me para compilar e instalar?
Shaun McDonald
Você poderia editar sua resposta para corrigir o link? Obrigado
Afr
4

Definitivamente, parece que você tem problemas de geometria. É improvável que seja capaz de produzir resultados limpos de um arquivo de entrada sujo, independentemente do software usado, a menos que você resolva primeiro os problemas de geometria. Depois de resolver os problemas de geometria, tente o seguinte se ainda estiver com problemas:

1) Verifique se o conjunto de dados da grade tem a mesma projeção que o conjunto de dados do polígono mundial. Caso contrário, recrie-o na projeção adequada.

2) Converta todos os recursos em peça única - muito mais fácil de processar

3) Remova todos os campos estranhos mantendo apenas o campo id, que permitirá que você junte seus atributos novamente após a interseção ter sido executada - novamente muito mais fácil de processar

4) Em vez de cruzar todo o conjunto de dados da grade com o conjunto de dados do polígono mundial, tente fazer um loop sobre os polígonos da grade, selecionando os polígonos que se cruzam no conjunto de dados do mundo e executando um clipe com base no polígono da grade. Isso permitirá que você isole qualquer problema e, no final, poderá mesclar os resultados para atingir seu objetivo original.

5) Tente usar polígonos de grade maiores.

Brent Edwards
fonte
+1 Realmente interessante - quanto isso afeta a velocidade do geoprocessamento se você mantiver o campo de ID ou multipartes nos dados?
Simbamangu
1
Na verdade, nunca tentei quantificar as diferenças. Só posso falar por experiência própria onde as operações de geoprocesso falharam e esse é o tipo de coisa que ajudou a resolver o problema.
Brent Edwards
Não consegui (2) trabalhar. A seleção de recursos e a tentativa de mesclá-los usando o QGIS parece bloquear o meu sistema - talvez ainda esteja processando coisas, mas a esse ritmo não é prático: deixei meu sistema ligado durante a noite com o QGIS ainda tentando mesclar alguns recursos no conjunto de dados e ainda estava indo para ele de manhã.
Pris
1
Não deve haver nenhuma fusão envolvida. O objetivo é explodir recursos de várias partes. Por exemplo, na captura de tela do bloco com falha, o objetivo é explodir todos os seus registros contendo polígonos agrupados e espacialmente separados, como os recursos da ilha ao longo da costa do BC e do Alasca, em registros de polígonos separados em uma única peça. Isso pode ser alcançado no QGIS usando a ferramenta "Multipart to singleparts" no menu Vector> Geometry Tools.
Brent Edwards
Depois de converter o recurso de peça única, você deve validar novamente sua geometria, apenas para ter certeza de que tudo está limpo.
Brent Edwards
0

Outra abordagem pode ter sido tentar uma conversão de vetor para varredura para criar um conjunto de dados de pontos e, em seguida, usar o conjunto de dados de pontos como base para escrever algum código para criar seus blocos.

Ian Allan
fonte