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.
fonte
Respostas:
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.
fonte
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):
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.
fonte
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.
fonte
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.
O Spiral parece que eu quero:
fonte