Dado vários polígonos que se sobrepõem de várias maneiras, eu gostaria de exportar desses recursos todos os polígonos que não se sobrepõem aos outros, iterativamente.
O produto seria um número de recursos sem sobreposição que, quando somados, compõem o original.
Os produtos poderiam então ser usados como entrada para as Estatísticas Zonais, e isso seria muito mais rápido do que repetir as Estatísticas Zonais sobre cada polígono.
Eu tenho tentado codificar isso no ArcPy sem sucesso.
O código para fazer isso já existe?
arcpy
algorithm
overlapping-features
ndimhypervol
fonte
fonte
Respostas:
Este é um problema de coloração gráfica .
Lembre-se de que a coloração de um gráfico é uma atribuição de uma cor aos vértices de um gráfico, de modo que nenhum dois vértices que compartilham uma aresta também tenham a mesma cor. Especificamente, os vértices (abstratos) do gráfico são os polígonos. Dois vértices são conectados a uma aresta (não direcionada) sempre que se cruzam (como polígonos). Se tomarmos alguma solução para o problema - que é uma sequência de (digamos, k ) coleções separadas dos polígonos - e atribuirmos uma cor única a cada coleção da sequência, obteremos uma coloração k do gráfico . É desejável encontrar um pequeno k .
Esse problema é bastante difícil e permanece sem solução para gráficos arbitrários. Considere uma solução aproximada que seja simples de codificar. Um algoritmo seqüencial deve fazer. O algoritmo de Galês-Powell é uma solução gananciosa baseada em uma ordem decrescente dos vértices por grau. Traduzido para o idioma dos polígonos originais, primeiro classifique os polígonos em ordem decrescente do número de outros polígonos sobrepostos. Trabalhando em ordem, dê ao primeiro polígono uma cor inicial. Em cada etapa sucessiva, tente colorir o próximo polígono com uma cor existente: ou seja, escolha uma cor que não sejajá usado por qualquer um dos vizinhos desse polígono. (Existem várias maneiras de escolher entre as cores disponíveis; tente a que foi menos usada ou escolha uma aleatoriamente.) Se o próximo polígono não puder ser colorido com uma cor existente, crie uma nova cor e pinte-a com ela.
Depois de obter uma coloração com um pequeno número de cores, execute as estatísticas zonais cor por cor: por construção, você garante que nenhum polígono de uma determinada cor se sobreponha.
Aqui está um exemplo de código
R
. (O código Python não seria muito diferente.) Primeiro, descrevemos sobreposições entre os sete polígonos mostrados.Ou seja, os polígonos 1 e 2 se sobrepõem, e os polígonos 2 e 3, 3 e 4, ..., 1 e 7.
Classifique os vértices por grau descendente:
Um algoritmo de coloração sequencial (bruto) usa a cor disponível mais antiga ainda não usada por qualquer polígono sobreposto:
Inicialize as estruturas de dados (
colors
ecolor.next
) e aplique o algoritmo:Divida os polígonos em grupos de acordo com a cor:
A saída neste exemplo usa quatro cores:
Ele particionou os polígonos em quatro grupos não sobrepostos. Nesse caso, a solução não é ótima ({{3,6,5}, {2,4}, {1,7}} são três cores para este gráfico). Em geral, a solução que obtém não deve ser tão ruim assim.
fonte
A metodologia recomendada pelo #whuber me inspirou a tomar uma nova direção, e aqui está minha solução arqueada, em duas funções. O primeiro, chamado countOverlaps, cria dois campos, "overlaps" e "ovlpCount", para gravar para cada poli que polys se sobrepõem a ele e quantas sobreposições ocorreram. A segunda função, explodeOverlaps, cria um terceiro campo, "expl", que fornece um número inteiro exclusivo para cada grupo de polys não sobrepostas. O usuário pode exportar novos fc com base nesse campo. O processo está dividido em duas funções, porque acho que a ferramenta countOverlaps pode ser útil por si só. Por favor, desculpe a negligência do código (e a convenção de nomenclatura descuidada), pois é bastante preliminar, mas funciona. Verifique também se o "idName" campo representa um campo com IDs exclusivos (testados apenas com IDs inteiros). Obrigado whuber por me fornecer a estrutura necessária para abordar este problema!
fonte
countOverlaps
corresponde às duas linhasnbrhoods <- sapply(vertices, neighbors); degrees <- sapply(nbrhoods, length)
do meu código:degrees
é a contagem de sobreposições. É claro que seu código é mais longo porque reflete a maior parte da análise GIS que é dada como certa em minha solução: a saber, que você primeiro identifica quais polígonos se sobrepõem e que, no final, usa a solução para gerar conjuntos de dados de polígonos. Seria uma boa idéia encapsular os cálculos teóricos dos grafos; portanto, se você encontrar um algoritmo de coloração melhor, será fácilJá faz um tempo, mas eu usei esse código para meu próprio aplicativo e ele está funcionando muito bem - obrigado. Reescrevi parte dele para atualizá-lo, aplicá-lo às linhas (com tolerância) e acelerar significativamente (abaixo - estou executando-o em 50 milhões de buffers que se cruzam e leva apenas algumas horas).
fonte
Nesse caso, geralmente uso o seguinte método:
Acredito que o resultado será o desejado e você pode até contar o número de sobreposições. Não sei se, em termos de desempenho, será melhor para você ou não.
fonte