[QGIS-it-user] Somma progressiva valori di lunghezza

Ciao a tutti,

ho un problema che pensavo fosse banale da risolvere con le espressioni
e invece mi è sembrato molto più facile da risolvere con python.

Scenario: un layer puntuale (in SR proiettato) dove ho ricavato le
distanze fra ogni punto tramite l'espressione

length(
  make_line( geometry($currentfeature), geometry(get_feature_by_id(
@layer_name , $id +1))))

quello che mi aspettavo fosse più immediato è ottenere un campo con la
somma progressiva delle lunghezze, ovvero

l | cum

0 0
10 10
20 30
40 70

con python è un attimo, con le espressioni invece qualcuno ha avuto modo
di sperimentare un problema simile?

Grazie

Matteo

--
Matteo Ghetta - www.faunalia.eu
QGIS & PostGIS courses: http://www.faunalia.eu/training.html
https://www.google.com/trends/explore?date=all&geo=IT&q=qgis,arcgis

Ciao una possibile soluzione potrebbe essere:
1)Creare con l'algoritmo "da punti a linea" il percorso che avrà come nome
layer "Percorsi" per esempio.
2) sul layer puntuale aggiungere il seguente nuovo campo:

distance_to_vertex( geometry:= geom_from_wkt( geom_to_wkt( geometry(
get_feature( 'Percorsi', 'begin', 0)))) , vertex:= $id )

dopo di chè puoi anche eliminare il layer temporaneo "Percorsi".

Dovrebbe essere qualcosa che assomiglia a quel che cerchi.

Aldo

--
Sent from: http://osgeo-org.1560.x6.nabble.com/QGIS-Italian-User-f5250612.html

Ciao,

grazie della risposta. Pensavo cmq ci fosse un modo un po' più
immediato, immaginavo anche per fare operazioni iterative di
quell'attributo di quella feature rispetto alla feature precedente (e.
differenza di tempo in secondi).

Grazie

Matteo

ghtmtt wrote

Pensavo cmq ci fosse un modo un po' più
immediato, immaginavo anche per fare operazioni iterative di
quell'attributo di quella feature rispetto alla feature precedente (e.
differenza di tempo in secondi).

Ciao,
hai provato ad usare attribute() e get_feature_by_id() come, per esempio,
nel caso discusso su stackexchange
https://gis.stackexchange.com/questions/312921/add-cumulative-sum-column-to-attribute-table
?

Andrea

--
Sent from: http://osgeo-org.1560.x6.nabble.com/QGIS-Italian-User-f5250612.html

Se può essere ancora utile per qualcuno, la procedura è molto semplice:

dato un layer "nome_layer", con un campo "campo_valore" che contiene i
valori da sommare cumulativamente, si aggiunge un campo "campo_cumulativo"
alla tabella e si usa il calcolatore di campi per aggiornare i valori di
tale campo con la seguente espressione:

if($id = 1, attribute($currentfeature, 'campo_valore'),
attribute($currentfeature, 'campo_valore') +
attribute(get_feature_by_id('nome_layer', $id-1), 'campo_cumulativo'))

Nella maggior parte dei casi il primo record di un layer ha $id =1; in
alcuni casi, per esempio gli shapefile, il primo record ha $id = 0, quindi
la condizione di test di if dovrebbe essere modificata di conseguenza
affinché l'espressione funzioni come previsto.
Alternativamente si potrebbe usare, invece che la funzione $id, la variabile
@row_number, in quanto quest'ultima dovrebbe iniziare sempre da 1 e quindi
la seguente espressione dovrebbe funzionare in ogni caso :

if(@row_number = 1, attribute($currentfeature, 'campo_valore'),
attribute($currentfeature, 'campo_valore') +
attribute(get_feature_by_id('nome_layer', @row_number-1),
'campo_cumulativo'))

La somma cumulativa avviene in ordine per feature id, quindi i record del
layer devono essere già intrinsecamente ordinati secondo l'ordine con cui si
vuole che i valori vengano sommati.

Andrea

--
Sent from: http://osgeo-org.1560.x6.nabble.com/QGIS-Italian-User-f5250612.html

Ciao,
per avere la distanza cumulativa si può fare senza scomodare python o il calcolatore di campi,
basta convertire i punti in una linea, poi con lo strumento di processing “Estrai vertici” si riconverte la linea in punti ed in automatico viene aggiunto un campo “distance” con la distanza cumulativa.
Se ci sono dati nella tabella attributi originaria ovviamente vengono persi durante la conversione il linea ma si possono recuperare dai punti iniziali con “Unisci attributi per posizione”.
(Provato su QGIS 3.4)

···

Il 12/10/2019 23:18, andreaerdna ha scritto:

Se può essere ancora utile per qualcuno, la procedura è molto semplice:

dato un layer "nome_layer", con un campo "campo_valore" che contiene i
valori da sommare cumulativamente, si aggiunge un campo "campo_cumulativo"
alla tabella e si usa il calcolatore di campi per aggiornare i valori di
tale campo con la seguente espressione:

if($id = 1, attribute($currentfeature, 'campo_valore'),
attribute($currentfeature, 'campo_valore') +
attribute(get_feature_by_id('nome_layer', $id-1), 'campo_cumulativo'))

Nella maggior parte dei casi il primo record di un layer ha $id =1; in
alcuni casi, per esempio gli shapefile, il primo record ha $id = 0, quindi
la condizione di test di if dovrebbe essere modificata di conseguenza
affinché l'espressione funzioni come previsto.
Alternativamente si potrebbe usare, invece che la funzione $id, la variabile
@row_number, in quanto quest'ultima dovrebbe iniziare sempre da 1 e quindi
la seguente espressione dovrebbe funzionare in ogni caso :

if(@row_number = 1, attribute($currentfeature, 'campo_valore'),
attribute($currentfeature, 'campo_valore') +
attribute(get_feature_by_id('nome_layer', @row_number-1),
'campo_cumulativo'))

La somma cumulativa avviene in ordine per feature id, quindi i record del
layer devono essere già intrinsecamente ordinati secondo l'ordine con cui si
vuole che i valori vengano sommati.

Andrea

--
Sent from: [http://osgeo-org.1560.x6.nabble.com/QGIS-Italian-User-f5250612.html](http://osgeo-org.1560.x6.nabble.com/QGIS-Italian-User-f5250612.html)
_______________________________________________
QGIS-it-user mailing list
[QGIS-it-user@lists.osgeo.org](mailto:QGIS-it-user@lists.osgeo.org)
[https://lists.osgeo.org/mailman/listinfo/qgis-it-user](https://lists.osgeo.org/mailman/listinfo/qgis-it-user)


Alessandro Perego www.alspergis.altervista.org

Ciao a tutti,
aggiungo le mie soluzioni a quelle già proposte e poi condivido un gist
<https://gist.github.com/pigreco/4b10950c673dbfacc719c2acb06ea840&gt; con le
soluzioni

utilizzando la stessa simbologia e usando gli array:

prima soluzione usando solo le funzioni nel core di QGIS:

if(
$id = 1, array_agg( "l")[0],
eval(
replace(
array_to_string(
array_slice( array_agg( "l"),0,$id-1)), ',','+'))
)

Seconda soluzione usando il Plugin ArrayPlus [0] che aggiunge nuove funzioni
sugli array:

if(
$id = 1, array_agg( "l")[0],
array_sum( array_slice( array_agg( "l"),0,$id-1))
)

[0] https://framagit.org/jbdesbas/arrayPlus

-----
https://pigrecoinfinito.wordpress.com/
--
Sent from: http://osgeo-org.1560.x6.nabble.com/QGIS-Italian-User-f5250612.html