Dati una serie di punti nello spazio ci si chiede spesso, come ordinarli da sinistra a destra o da sud a nord o in qualsiasi altro modo, per esempio lungo una generica linea?
La risposta sembrerebbe banale, ma non lo è.
Tutti gli algoritmi che si occupano di risolvere questo problema, richiedono sempre un attributo secondo cui ordinare: può essere il tempo, la latitudine o longitudine, la distanza tra i punti più vicini ecc…
In questo blog post tratteremo il caso dell’ordinamento dei punti lungo una generica linea, ovvero, traccerò dei punti a caso e poi li ordinerò secondo una linea, anch’essa tracciata a caso, vedi gif animata:

L’ordinamento è possibile farlo in molti modi, ma qui voglio sottolineare la potenza delle espressioni di QGIS, quindi, proporrò il metodo tramite calcolatore di campi, ecco l’espressione da utilizzare:
with_variable ('nearest',
overlay_nearest('linea',$geometry)[0],
array_find(
array_sort(
array_foreach(
array_agg($geometry, group_by:=@nearest),
line_locate_point(@nearest,@element))),
line_locate_point(@nearest,$geometry))+1
)
NOTE FINALI: Il metodo si basa sul calcolo delle distanze dei punti lungo la linea a partire dall’origine della stessa, poi basta ordinare l’array e il gioco è fatto!!!
RIFERIMENTI
- QGIS : https://www.qgis.org/it/site/
- HfcQGIS : https://hfcqgis.opendatasicilia.it/
- Stackexchange : https://gis.stackexchange.com/questions/410832/ordering-points-along-polyline-using-line-locate-point-function-in-qgis
I MIEI CANALI – ISCRIVITI
- Telegram : https://t.me/pigrecoinfinito
- YouTube : https://www.youtube.com/c/TotòFiandaca
Se il blog post Ti è piaciuto cliccate su ‘Mi piace’, grazie!!!
if you liked the blog post click on ‘Like’, thank you !!!
Ciao, grazie sempre della condivisione. Io l’ho risolta così, prendendo esempio dal tuo blog:
array_find(array_sort(array_agg ( line_locate_point( overlay_nearest ( ‘linea’, $geometry ) [0], $geometry ) ), false ),line_locate_point( overlay_nearest ( ‘linea’, $geometry ) [0], $geometry ) )
Un saluto
"Mi piace"Piace a 1 persona
Ciao grazie della condivisione! Ho preso spunto dal tuo blog e l’ho risolta cosi:
array_find(array_sort(array_agg ( line_locate_point( overlay_nearest ( ‘linea’, $geometry ) [0], $geometry ) ), false ),line_locate_point( overlay_nearest ( ‘linea’, $geometry ) [0], $geometry ) )
Che pensi?
Grazie
"Mi piace"Piace a 1 persona