Ho notato (ambito tematizzazione) che la funzione overlay_nearest [1] non restituisce i valori attesi se utilizzo parametri opzionali come limit, mi spiego meglio con un esempio:
Su un layer di punti, creo una tematizzazione personalizzata usando un layer di stile come Generatore di Geometria:
usando l’espressione:
with_variable(
'center',
@map_extent_center,
collect_geometries(
array_foreach(
overlay_nearest(
layer:='centroidi',
expression:=$geometry
,limit:=8
),
make_line(@center, @element)
)
)
)
il mio obiettivo è generare una sorta di ‘ragno’ a 8 zampe con centro @map_extent_center
(che è il centro della mappa visualizzata) e gli otto punti più vicini, sotto un esempio atteso:
Accade però che l’opzione limit:=8
non fa quello che mi aspetto, ovvero che limiti i collegamenti solo ai primi 8 punti più vicini, ma li collega tutti!!!
cosa sto sbagliando? oppure è un bug?
Sto usando OSGeo4W
saluti
–
[1] 9.2. List of functions — QGIS Documentation documentation
Ciao Salvatore,
non penso che il problema sia nel funzionamento della funzione overlay_nearest
, ma nella logica dell’espressione applicata al generatore di geometrie.
Nel generatore di geometrie, come nel calcolatore di campi, l’espressione viene calcolata per ogni geometria presente nel layer a cui è applicata.
La funzione overlay_nearest
trova le feature contenute nel layer che viene indicato nel primo parametro che siano più vicine alla “geometria corrente” del layer a cui è applicata. Mentre tu vorresti trovare le feature contenute nel layer che viene indicato nel primo parametro che siano più vicine al centro della mappa.
L’espressione, tramite la funzione overlay_nearest
, trova gli 8 punti (del layer “centroidi”) che sono più vicini al primo punto del layer a cui è applicata (suppongo lo stesso layer “centroidi”) e genera le linee tra il centro della mappa e gli 8 punti più vicini al primo punto del layer; poi trova gli 8 punti che sono più vicini al secondo punto del layer e genera le linee tra il centro della mappa e gli 8 punti che sono più vicini al secondo punto del layer; e così via… Ovviamente in questo modo tutti (o quasi) i punti presenti nel layer “centroidi” verranno collegati al centro della mappa.
Quindi non è quello che immagino tu voglia ottenere.
Puoi verificare tu stesso che sia la funzione overlay_nearest
sia l’espressione funzionino correttamente (ma non come avresti voluto), applicando la stessa identica espressione nel generatore dei geometrie di un altro layer che contenga una sola feature: vedrai solo 8 linee che collegano il centro della mappa agli 8 punti del layer “centroidi” che sono più vicini all’unica feature di questo altro layer (ma non a quelli più vicini al centro della mappa).
Non so se è possibile ottenere il risultato richiesto tramite un’espressione nel generatore di geometrie…
A presto.
Andrea
Ciao Andrea,
ho fatto i seguenti test:
Primo
Sullo stesso layer Centroidi applico questa espressione nel generatore di geometrie, usando un punto fisso:
with_variable(
'center',
make_point(1081367,4089509), -- punto fisso, unica feature
collect_geometries(
array_foreach(
overlay_nearest(
layer:='Centroidi',
expression:=$geometry
,limit:=8
),
make_line(@center, @element)
)
)
)
ottengo stesso risultato di prima, il punto di collega a tutti i punti del layer Centroide.
Secondo
Creo un nuovo layer puntuale con un solo punto, l’espressione diventa
with_variable(
'center',
geometry(get_feature_by_id('punto',0)),
collect_geometries(
array_foreach(
overlay_nearest(
layer:='Centroidi',
expression:=$geometry
,limit:=8
),
make_line(@center, @element)
)
)
)
ottengo stesso risultato, il punto è collegato con tutti gli altri.
grazie per il tempo che ci dedichi
saluti
Probabilmente non sono stato sufficientemente chiaro.
Puoi verificare tu stesso che sia la funzione overlay_nearest sia l’espressione funzionino correttamente, applicando la stessa identica espressione
with_variable(
'center',
@map_extent_center,
collect_geometries(
array_foreach(
overlay_nearest(
layer:='centroidi',
expression:=$geometry
,limit:=8
),
make_line(@center, @element)
)
)
)
nel generatore dei geometrie di un altro layer che contenga una sola feature (il layer “punto”) : vedrai solo 8 linee che collegano il centro della mappa agli 8 punti del layer “centroidi” che sono più vicini all’unica feature del layer “punto”.
Ora ho capito quello che vuoi dire, ma non serve a nulla così fatto.

Deve esserci una soluzione.
saluti
Certo, ma dimostra che la funzione overlay_nearest
e il suo parametro limit
funzionano correttamente.
L’espressione che hai creato però si basa su una idea che non tiene conto di come funziona il generatore di geometrie (e il calcolatore di campi) e quindi non restituisce il risultato voluto.
Spero sia riuscito a spiegare perché tale espressione non possa funzionare come da te sperato.
Devi farti venire un altra idea! 
Per esempio, se le coordinate del punto nel layer “punto” potessero essere aggiornate automaticamente con le coordinate del centro della mappa, il problema sarebbe risolto facilmente, utilizzando la stessa identica espressione applicata sempre al layer “punto”.