Quando una richiesta mi colpisce, quasi sempre, scrivo un blog post. La domanda è stata fatta su Facebook nel Gruppo GIS Italia:
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.
Per un problema simile ho provato a risolvero attraverso questa guida. Tuttavia quando provo a calcolare il “cum” mi da errore “Espressione non valida” e la spiegazoine è “Funzione sconosciuta”. La funzione che non esiste è “array_sum”. Come posso risolvere?
Utilizzo QGIS3.16 Hannover.
"Mi piace""Mi piace"
Ciao, la funzione array_sum è stata introdotta a partire da QGIS 3.18, quindi devi aggiornare.
"Mi piace""Mi piace"