Algoritmo per calcolare la copertura + sovrapposizioni da una serie di archi


10

Ho un file di forma contenente archi che rappresentano il percorso percorso da un camion che sparge fertilizzante in una fattoria.

Diciamo che so che la larghezza di spargimento è di 30 m, cioè il camion può spargere fertilizzante a 15 m su entrambi i lati del veicolo.

Voglio generare una serie di poligoni, che mostrano:
1) L'area totale che ha ricevuto il fertilizzante
2) Le aree di sovrapposizione, ovvero dove due passaggi separati erano troppo vicini tra loro, in modo che alcune parti dell'azienda agricola ricevessero il doppio della "dose corretta" "di fertilizzante.

Un approccio ingenuo è semplicemente creare i poligoni di copertura come buffer attorno agli archi. Questo funziona nel caso speciale in cui le linee di diffusione sono distinte tra loro. Tuttavia, il camion potrebbe concepibilmente viaggiare intorno alla fattoria in una spirale in costante diminuzione e un semplice buffer non riuscirebbe a mostrare le sovrapposizioni in cui due passaggi della spirale erano troppo vicini tra loro (se la spirale fosse un arco singolo, finirei con un singolo poligono senza parti sovrapposte).

Se è pertinente, sto usando TatukGIS VCL DK, ma sto davvero cercando un algoritmo piuttosto che una soluzione specifica.

Alcuni chiarimenti in risposta alla discussione finora:

1) Non posso fare affidamento sul fatto che i dati vettoriali abbiano metadati particolari (ad es. Registri GPS o velocità di diffusione). Autorizzo l'utente a scegliere un livello e specificare una larghezza di diffusione, quindi viene eseguito il rapporto.

2) Lo scopo del rapporto è davvero quello di mostrare all'utente quanto "abile" era l'operatore del veicolo, dove "abile" significa "raggiungere la massima copertura con la minima sovrapposizione".

3) Mi sento più a mio agio nella terra vettoriale rispetto alla terra raster, quindi preferirò soluzioni basate su vettori.

Grazie,

Darren.


1
Mi chiedo se questo sarebbe simile ai metodi che prevedono precipitazioni cumulative basate su percorsi di tempesta previsti.
Kirk Kuykendall,

Risposte:


3

Forse la soluzione più semplice è quella di scomporre la singola geometria in segmenti e bufferizzare quei singoli segmenti: nel tuo caso a spirale, devi bufferizzare ogni arco, quindi intersecare i singoli archi per ottenere un conteggio. Fare attenzione a evitare false sovrapposizioni non tamponando le estremità dei segmenti, ma solo a sinistra ea destra dei segmenti stessi.

Un altro approccio è quello di sovrapporre una griglia poligonale ai dati, quindi all'interno di ciascuna cella della griglia, bufferizzare separatamente ogni segmento di linea intersecante. Per essere precisi in questo, dovresti prendere la cella della griglia sotto analisi, bufferizzarla, quindi raccogliere i segmenti che si intersecano e bufferizzare quelli, eseguendo l'analisi all'interno della finestra della cella originale.

Entrambe queste opzioni dovrebbero fornirti una stima ragionevole della sovrapposizione, posso pensare ad alcuni approcci più accurati ma richiederebbero di conoscere qualcosa sui dati.


Grazie. Stavo pensando secondo le linee del tuo primo suggerimento: suddividere la geometria in segmenti e tamponarli. Penso che dovrò bufferizzare anche le estremità dei segmenti, in modo da ottenere bordi arrotondati agli angoli. Pensando al caso in cui comincio con una linea ad angolo retto - se non aggiusto le estremità, finirò con due rettangoli sovrapposti con un quadrato mancante all'esterno dell'angolo (difficile da esprimere come testo!)
dbruning

Penso che dovrò bufferizzare anche le estremità dei segmenti, in modo da ottenere bordi arrotondati agli angoli. Stavo inoltre pensando di intersecare il buffer per ciascun segmento con il buffer per il segmento precedente e quindi accumulare solo le "nuove" parti di ciascun buffer in un buffer principale. L'idea è di ignorare le sovrapposizioni con il segmento precedente ma il pickup si sovrappone con i segmenti più vecchi.
datazione del

2

Nessuna soluzione, ma alcuni input:

Questo problema sembra simile al problema del rilevamento della coalescenza di linea nella generalizzazione delle mappe . Succede quando uno stile grande viene applicato su una linea sinuosa (il simbolo si sovrappone):

inserisci qui la descrizione dell'immagine

Questo documento pagg. Da 176 a 180 (in francese ... scusa) fornisce un algoritmo per rilevare tali parti autointersecanti. Il principio è, come proposto da scw , di utilizzare un singolo buffer laterale di ciascun segmento composto da un segmento più 0, 1 o 2 archi circolari. JTS contiene un'implementazione di questo buffer lato singolo che può essere utile.


Perché sei preoccupato di rilevare autointersezioni? E perché proponi buffer "single side"? Nessuno dei due sembra germano al problema.
whuber

Lo scopo è rilevare dove il camion sparge il fertilizzante più volte, ovvero dove l'area di spargimento si interseca automaticamente.
luglio

2

Una soluzione vettoriale perderà una variabile potenzialmente critica : il tempo e, attraverso di essa, il tasso di diffusione. Quando il trattore si muove più velocemente, si distribuisce meno fertilizzante per unità di superficie e quando si muove più lentamente (rallentando in una curva e accelerando di una) si diffonderà più fertilizzante per unità di superficie. Inoltre, se il trattore sta spargendo materiale mentre gira, il materiale sarà più concentrato verso l'interno della svolta e meno concentrato verso l'esterno.

I dati temporali sarebbero disponibili in una registrazione GPS dello stato di avanzamento del trattore. Le pendenze (distanza percorsa divisa per il tempo trascorso) stimeranno le velocità in ogni punto. In alternativa, si potrebbe (come approssimazione) assumere una velocità costante all'interno di un campo e una velocità più lenta all'interno di un ragionevole buffer interno del limite del campo.

Una rappresentazione raster può gestire questi problemi. Rasterizza il percorso del trattore. Questo imposta tutte le celle non attraversate dal trattore su valori NoData (o su zero). Se il trattore dovesse spostarsi a una velocità standard e costante, sarebbe sufficiente inserire un valore costante in ciascuna delle celle dati. Ora, ad esempio, se il trattore si muovesse al doppio di questa velocità, (presumibilmente) il suo tasso di applicazione si dimezzerebbe, e ciò può essere rappresentato dimezzando il valore nelle celle.

In generale, il valore da inserire in qualsiasi cella è il tasso di applicazione per unità di area . Se il trattore sta distribuendo uniformemente x Kg di fertilizzante al secondo a 15 m su ciascun lato mentre viaggia a una velocità di y m / sec, allora si sta diffondendo x / y Kg / sec / [m / sec] / (2 * 15 m) = x / (30 y ) Kg / m ^ 2 fertilizzante. Pertanto, x / (30 y ) è il valore da inserire in ciascuna cella. Viene dato x e y viene calcolato dai dati GPS.

Le autointersezioni non sono in linea di principio un problema . Se il percorso del trattore si incrocia da solo, aggiungi i contributi ogni volta che attraversa una cella. A tale scopo potrebbe essere necessario un trattamento speciale, a seconda di come viene creata la griglia e delle capacità del software GIS.

Dopo aver fatto questa preparazione, il resto è semplice e veloce: una somma focale di questa griglia, usando un vicinato circolare con raggio di 15 m, trova la quantità cumulativa diffusa per unità di area in ogni cella.


1
+1 sembra che se avessi uno strumento che permettesse a un kernel (che rappresenta il trattore) di spostarsi lungo un percorso (anziché lungo ogni riga) questo problema sarebbe più gestibile.
Kirk Kuykendall,

@Kirk Non è necessario seguire un percorso o righe o altro con un kernel. È importante apprezzare il cambiamento nel punto di vista che accompagna una somma focale: invece di considerare il problema come uno di spargimento di materiale da un percorso di punti, guardalo come uno di calcolare quanto materiale si accumula in ogni punto del campo . Ovviamente è lo stesso problema con la stessa soluzione. L'approccio mobile del kernel (e gli approcci di buffering proposti) prendono il primo punto di vista; la somma focale, la seconda. Ma lo strumento di somma focale è disponibile; un calcolo del kernel mobile non lo è.
whuber

Penso che l'approccio raster che descrivi sarebbe il metodo migliore se conoscessimo la velocità e il tasso di diffusione. Sfortunatamente in questo particolare scenario non conosciamo nessuno dei due. Il nostro utente finale può scegliere qualsiasi livello come input per questo report di copertura e non possiamo fare affidamento sul fatto che la geometria abbia metadati particolari.
Dbruning il

@dbruning Questo approccio non sembra richiedere velocità / spread spread noti; permette solo a loro (+ il modello più accurato della realtà) se li hai. Tuttavia, sarà anche più necessario un certo limite di cella + conteggio per estrarre dal sistema le metriche desiderate (copertura totale dell'area; area di sovrapposizione) e vi sono anche compromessi di precisione mescolati lì.
Dan S.

@dbruning Se non conosci il tasso di spread, otterrai un tasso di spread relativo. Se non conosci la velocità, sai ancora (o dovresti sapere) come le persone guidano i trattori e dovrebbero essere in grado di ricavare stime ragionevoli delle velocità relative. Se si assumono velocità costanti e tassi di spread costanti, si otterranno comunque risposte ragionevoli; saranno d'accordo con le risposte basate su buffer su porzioni diritte delle rotte del trattore; e sono probabilmente più realistici nelle porzioni curve.
whuber

2

Non sono sicuro al 100% sul protocollo StackExchange, quindi sto pubblicando questo come risposta alla mia domanda. È la risposta che ho finito per usare comunque.

L'algoritmo di base è:
1. Suddividere qualsiasi geometria sul livello in segmenti non più lunghi di 1/2 della larghezza di diffusione.
2. Per ciascun segmento:
- Creare un "buffer di rotolamento" guardando indietro lungo la forma e bufferizzando tutti i segmenti precedenti in cui la lunghezza cumulativa di tali segmenti è inferiore alla larghezza di diffusione (raggio del buffer = 1/2 larghezza di diffusione)
- Crea un "buffer del segmento successivo" del solo segmento successivo (raggio del buffer = 1/2 larghezza diffusa)
- Sottrai il "buffer di rotolamento" dal "buffer del segmento successivo" per ottenere il "nuovo buffer"
- unisci tutto il "nuovo buffer" poligoni insieme per ottenere un singolo poligono per forma.

In sostanza, ciò consente al guidatore del veicolo spargitore di effettuare curve ad angolo retto (o più ampie) senza penalità di sovrapposizione, ma se si girano troppo bruscamente in modo da diffondersi su "terreno vecchio", iniziamo a sovrapporsi.

Si sovrappone in blu

La spirale sembra che io voglia che:

spirale

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.