Algoritmo para calcular cobertura + sobreposições de um conjunto de arcos

10

Eu tenho um shapefile contendo arcos representando o caminho percorrido por um caminhão que espalha fertilizantes em uma fazenda.

Digamos que eu saiba que a largura de propagação é de 30m, ou seja, o caminhão pode espalhar fertilizantes por 15m de cada lado do veículo.

Quero gerar um conjunto de polígonos, que mostrem:
1) A área total que recebeu fertilizante
2) As áreas de sobreposição, ou seja, onde duas passagens separadas estavam muito próximas umas das outras, de modo que algumas partes da fazenda recebessem o dobro da dose correta "de fertilizante.

Uma abordagem ingênua é apenas criar os polígonos de cobertura como buffers ao redor dos arcos. Isso funciona no caso especial em que as linhas de dispersão são distintas uma da outra. No entanto, o caminhão poderia viajar pela fazenda em uma espiral sempre decrescente e um buffer simples falharia em mostrar sobreposições onde duas passagens da espiral estavam muito próximas umas das outras (se a espiral fosse um único arco, eu terminaria com um único polígono sem partes sobrepostas).

Se for relevante, estou usando o TatukGIS VCL DK, mas estou realmente procurando por um algoritmo em vez de uma solução específica.

Alguns esclarecimentos em resposta à discussão até agora:

1) Não posso confiar nos dados vetoriais com metadados específicos (por exemplo, registros GPS ou taxa de propagação). Permito que o usuário escolha uma camada e especifique uma largura de dispersão, para que o relatório seja executado.

2) O objetivo do relatório é realmente mostrar ao usuário o quão "qualificado" o operador do veículo era, onde "qualificado" significa "alcançou a cobertura mais alta com a menor sobreposição".

3) Sinto-me mais à vontade em terras vetoriais do que em terras rasterizadas, portanto, prefiro soluções baseadas em vetores.

Obrigado,

Darren.

dbruning
fonte
1
Gostaria de saber se isso seria semelhante aos métodos que preveem a precipitação cumulativa com base nos caminhos de tempestade previstos.
Kirk Kuykendall 22/02

Respostas:

3

Talvez a solução mais simples seja dividir a geometria única em segmentos e armazenar em buffer esses segmentos individuais: em sua caixa espiral, você armazenaria cada arco em buffer e, em seguida, cruzaria os arcos individuais para obter uma contagem. Tome cuidado para evitar sobreposições falsas, não armazenando em buffer as extremidades dos segmentos, apenas à esquerda e à direita dos próprios segmentos.

Outra abordagem é sobrepor uma grade de polígono aos dados e, em cada célula da grade, armazenar em buffer cada segmento de linha que se cruza separadamente. Para ser preciso, você deseja colocar a célula da grade em análise, armazená-la em buffer, coletar os segmentos que se cruzam e armazená-los, executando sua análise na janela da célula original.

Qualquer uma dessas opções deve fornecer uma estimativa razoável de sobreposição, posso pensar em algumas abordagens mais precisas, mas elas exigiriam saber algo sobre os dados.

scw
fonte
Obrigado. Eu estava pensando na linha da sua primeira sugestão - dividindo a geometria em segmentos e protegendo-os. Acho que vou precisar tamponar as extremidades dos segmentos, para obter arestas arredondadas nos cantos. Pensando no caso em que começo com uma linha de ângulo reto - se não amortecer as pontas, terminarei com dois retângulos sobrepostos, com um quadrado faltando na parte externa do canto (difícil de expressar como texto!)
dbruning
Acho que vou precisar tamponar as extremidades dos segmentos, para obter arestas arredondadas nos cantos. Eu estava pensando em cruzar o buffer de cada segmento com o buffer do segmento anterior e depois acumular apenas as partes "novas" de cada buffer em um buffer mestre. A idéia é ignorar sobreposições com o segmento anterior, mas a sobreposição com segmentos mais antigos.
dbruning
2

Nenhuma solução, mas algumas entradas:

Esse problema parece semelhante ao problema de detecção de coalescência de linha na generalização de mapa . Isso acontece quando um estilo grande é aplicado em uma linha sinuosa (o símbolo se sobrepõe automaticamente):

insira a descrição da imagem aqui

Este documento, pp. 176 a 180 (em francês ... desculpe) fornece um algoritmo para detectar essas partes auto-interceptadas. O princípio é, como proposto por scw , usar um buffer lateral único de cada segmento composto por um segmento mais 0, 1 ou 2 arcos de círculo. O JTS contém uma implementação desse buffer de lado único que pode ser útil.

julien
fonte
Por que você está preocupado em detectar auto-interseções? E por que você propõe buffers de "lado único"? Nem parece pertinente para o problema.
whuber
O objetivo é detectar onde o caminhão espalha fertilizantes várias vezes, é aí que a área de propagação se intercepta.
23711 julien
2

Uma solução vetorial perderá uma variável potencialmente crítica : o tempo e, através dela, a taxa de propagação. Quando o trator se move mais rápido, menos fertilizante é espalhado por unidade de área e, quando se move mais devagar (desacelerando em uma curva e acelerando fora de um), espalha mais fertilizante por unidade de área. Além disso, se o trator estiver espalhando material ao girar, o material estará mais concentrado na parte interna da curva e menos concentrado na parte externa.

Os dados de tempo estariam disponíveis em um registro GPS do progresso do trator. As encostas (distância percorrida dividida pelo tempo decorrido) estimam as velocidades em todos os pontos. Alternativamente, pode-se (como aproximação) assumir uma velocidade constante no interior de um campo e uma velocidade mais lenta dentro de um buffer interno razoável dos limites do campo.

Uma representação raster pode lidar com esses problemas. Rasterize o caminho do trator. Isso define todas as células não cruzadas pelo trator para valores NoData (ou para zero). Se o trator se movesse a uma velocidade constante e padrão, seria suficiente colocar um valor constante em cada uma das células de dados. Agora, por exemplo, se o trator estivesse se movendo a duas vezes essa velocidade (presumivelmente), sua taxa de aplicação seria reduzida pela metade e isso pode ser representado pela metade do valor nas células.

Em geral, o valor para colocar em qualquer célula é a taxa de aplicação por unidade de área . Se o trator estiver espalhando uniformemente x Kg de fertilizante por segundo a 15 m de cada lado enquanto viaja a uma velocidade de y m / s, então está espalhando x / y Kg / s / [m / s] / (2 * 15 m) = x / (30 y ) Kg / m ^ 2 de fertilizante. Assim, x / (30 y ) é o valor a ser colocado em cada célula. x é dado ey é calculado a partir dos dados do GPS.

Auto-interseções não são problema em princípio. Se o caminho do trator se cruzar, adicione as contribuições sempre que recriar uma célula. Pode ser necessário algum processamento especial para isso, dependendo de como a grade está sendo criada e dos recursos do software GIS.

Depois de fazer essa preparação, o resto é rápido e fácil: uma soma focal dessa grade, usando uma vizinhança circular com 15 m de raio, encontra a quantidade acumulada espalhada por unidade de área em cada célula.

whuber
fonte
1
Com +1, parece que se você tivesse uma ferramenta que permitisse que um núcleo (representando o trator) se movesse ao longo de um caminho (em vez de ao longo de cada linha), esse problema seria mais gerenciável.
Kirk Kuykendall 22/02
@ Kirk Não há necessidade de seguir um caminho ou linhas ou o que quer que seja com um kernel. É importante apreciar a mudança de ponto de vista que acompanha uma soma focal: em vez de considerar o problema como um material de dispersão a partir de uma trajetória de pontos, considere o cálculo da quantidade de material acumulado em cada ponto do campo . Obviamente, é o mesmo problema com a mesma solução. A abordagem do kernel em movimento (e as abordagens de buffer propostas) têm o primeiro ponto de vista; a soma focal, a segunda. Mas a ferramenta de soma focal está disponível; um cálculo de kernel em movimento não é.
whuber
Acho que a abordagem raster que você descreve seria o melhor método se soubéssemos velocidade e taxa de spread. Infelizmente neste cenário em particular, também não conhecemos. Nosso usuário final pode escolher qualquer camada como entrada para este relatório de cobertura e não podemos confiar na geometria que possui metadados específicos.
dbruning
@dbruning Essa abordagem não parece exigir taxas conhecidas de velocidade / spread; apenas permite (+ o modelo mais preciso da realidade) se você os tiver. No entanto, também é necessário mais limiares de células + contagem para obter as métricas desejadas (cobertura total da área; área de sobreposição) fora do sistema, e também existem trocas de precisão.
Dan S.
@dbruning Se você não conhece a taxa de spread, receberá uma taxa de spread relativa. Se você não conhece a velocidade, ainda sabe (ou deve saber) como as pessoas dirigem os tratores e deve poder obter estimativas razoáveis ​​das velocidades relativas. Se você assumir velocidades constantes e taxas de propagação constantes, ainda obterá respostas razoáveis; eles concordam com as respostas baseadas em buffer em partes retas das rotas do trator; e é provável que sejam mais realistas nas porções curvas.
whuber
2

Não tenho 100% de certeza no protocolo StackExchange, por isso estou postando isso como resposta à minha pergunta. É a resposta que acabei usando de qualquer maneira.

O algoritmo básico é:
1. Divida qualquer geometria na camada em segmentos que não excedam a metade da largura da dispersão.
2. Para cada segmento:
- Crie um "buffer de rolagem" olhando para trás ao longo da forma e armazene em buffer todos os segmentos anteriores em que o comprimento cumulativo desses segmentos seja menor que a largura de propagação (raio do buffer = 1/2 largura de propagação)
- Criar um "buffer do próximo segmento" apenas do próximo segmento (raio do buffer = 1/2 largura de spread)
- Subtraia o "buffer de rolagem" do "buffer do próximo segmento" para obter o "novo buffer"
- junte-se a todos os "novos buffer" polígonos juntos para obter um único polígono por forma.

Essencialmente, isso permite que o motorista do veículo espalhador faça curvas em ângulo reto (ou mais largas) sem penalidade de sobreposição, mas se elas voltarem muito acentuadamente de forma a se espalharem pelo "terreno antigo", começamos a sobrepor-se.

Sobreposições em azul

O Spiral parece que eu quero:

espiral

dbruning
fonte