Interpolare i valori M dei vertici di una linea

Quando una richiesta mi colpisce, quasi sempre, scrivo un blog post. La domanda è stata fatta su Facebook nel Gruppo GIS Italia:

Facebook

La mia risposta è stata:

Ora mi tocca descrivere la soluzione.

Procedimento

Traccio una linea con vari vertici (meglio creare un vettore in un geopackage), e tramite gli strumenti di Processing imposto il valore m per tutti uguale. Successivamente estraggo i vertici e lavoro su questi. I vertici estratti hanno la x,y e m; questi ultimi valori devono essere interpolati tra un valore minimo (che assegno al primo vertice) e un valore massimo (che assegno all’ultimo vertice); questo ultimo passaggio lo realizzo usando le espressioni di QGIS. Infine, ricostruisco, a partire a questi vertici con m interpolato, la linea che avrà i vertici con i valori m desiderati.

Primo passaggio, creo un vettore GeoPackage e traccio due linee:

Secondo passaggio, cerco l’algoritmo Imposta il valore M in Processing:

In editing sul vettore risultante, modificare il valore minimo e massimo dei valori M digitandoli manualmente (se sono poche le linee):

Terzo passaggio, cerco algoritmo Estrai Vertici in Processing:

otteniamo questo vettore punti:

  • punto (3): il fid tiene conto della linea;
  • punto (4): il vertex_index tiene conto della successione dei vertici;
  • punto (5): la distance tiene conto della distanza tra i vertici.

sono campi che utilizzeremo per l’interpolazione.

Usando il Field Calc, aggiungo un campo cum (cumulativo e pesato con le distance)

espressione usata:

with_variable('agg', 
array_agg(
expression:="distance"/sum("distance","fid"),
group_by:="fid",
order_by:="vertex_index"),
if(
"vertex_index"=0, @agg[0],
array_sum(array_slice(@agg,0,"vertex_index"))
))

ottengo:

Calcolo il valore di m interpolato:

espressione usata:

 scale_linear( 
 value:="cum",
 domain_min:=0,
 domain_max:=1,
 range_min:=minimum(m($geometry),"fid"),
 range_max:=maximum(m($geometry),"fid"))

risultato:

A questo punto abbiamo i valori M interpolati in tabella degli attributi e possiamo aggiornare la geometria usando ancora il Field Calc e usando questa espressione:

 geom_from_wkt('PointM ('||$x||' '||$y||' '||"M"||')')

Ottenuti i vertici con i valori M interpolati, ricostruire la linea usando nuovamente gli strumenti di Processing:

Occorre ordinare per Vertex_index e creare gruppi in funzione del fid che identifica le due linee.

Fatto.


NOTE FINALI: Probabilmente esiste un plugin o altra procedura più veloce per risolvere il quesito, ma a me piace molto usare le espressioni di QGIS e le metto ovunque.


RIFERIMENTI

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo di WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione /  Modifica )

Google photo

Stai commentando usando il tuo account Google. Chiudi sessione /  Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione /  Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione /  Modifica )

Connessione a %s...

Questo sito utilizza Akismet per ridurre lo spam. Scopri come vengono elaborati i dati derivati dai commenti.