Salve a tutti,
rispondendo ad un quesito di un utente della mailing list qgis-user qualche giorno fa, mi sono accorto che si riscontrano dei bug usando la funzione overlay_nearest sullo stesso layer.
La funzione, usata su uno stesso layer, per esempio, di punti, dovrebbe trovare, per ogni punto del layer, il punto più vicino appartenente allo stesso layer.
Chiaramente il punto più vicino appartenente allo stesso layer è il punto stesso, ma il codice è fatto in modo che in questo caso venga escluso il punto stesso (che sarebbe un risultato banale) e si cerchi il secondo punto più vicino nello stesso layer.
overlay_nearest funziona effettivamente così per layer in formato, per esempio, Memory, GeoPackage o Spatialite.
Invece, per layer, per esempio, in formato Shapefile, GeoJSON o FlatGeobuf, io riscontro che la funzione restituisce sempre il punto stesso invece che il secondo punto più vicino.
Per fare una semplice verifica:
-
crea un nuovo Memory layer di tipo geometrico Point in un progetto vuoto
-
aggiungi un singolo punto al layer, salva la modifica e chiudi l’editazione
-
usa l’espressione overlay_nearest(@layer,$geometry) nel calcolatore di campi per tale layer: l’anteprima mostra il valore (cioè, correttamente, un array vuoto)
-
esporta il Memory layer in un layer in formato Shapefile e aggiungi tale layer Shapefile al progetto
-
usa la stessa espressione nel calcolatore di campi per tale layer Shapefile: l’anteprima mostra il valore [ <geometry: Point> ] (cioè l’espressione restituisce erroneamente lo stesso unico punto presente nel layer)
-
esporta il Memory layer in un layer in formato GeoPackage o Spatialite e aggiungi tale layer al progetto
-
usa la stessa espressione nel calcolatore di campi per tale layer GeoPackage o Spatialite: l’anteprima mostra il valore (cioè, correttamente, un array vuoto)
Inoltre, sempre applicando la funzione sullo stesso layer, anche con layer in formato Memory, GeoPackage o Spatialite, riscontro un altro bug.
Creando un nuovo layer di tipo geometrico Point in formato Memory, GeoPackage o Spatialite e inserendo un certo numero di punti, tutto funziona come dovrebbe e l’espressione overlay_nearest(@layer,$geometry) restituisce correttamente il secondo punto più vicino.
Se però elimino uno dei punti dal layer, allora, per tutti i punti a partire da quello successivo a quello eliminato, la funzione restituisce erroneamente il punto stesso invece che il secondo punto più vicino.
Mi sembra strano che nessun altro se ne sia ancora accorto (non ho trovato bug report a riguardo e la funzione esiste ormai da più di un paio di anni) e quindi sono un po’ in dubbio sulla reale esistenza di questi due bug…
Per verificare questo bug, metto a disposizione un piccolo file GeoPackage https://drive.google.com/file/d/195J1kph3v8q_Db2TVDXm-RMYpkaI2ES5
Il layer contiene sette punti, con un campo ID testuale progressivo da 1 a 7.
Creando un campo virtuale testuale (ID_near) con il calcolatore di campi e l’espressione overlay_nearest(@layer, ID)[0] si dovrebbero ottenere i seguenti valori:
ID | ID_near
|
- | - |
1 | 3 |
2 | 5 |
3 | 7 |
4 | 2 |
5 | 2 |
6 | 3 |
7 | 3
|
Se però, per esempio, elimino il punto con ID 4, la tabella diventa erroneamente:
ID | ID_near |
- | - |
1 | 3 |
2 | 5 |
3 | 7 |
5 | 5 |
6 | 6 |
7 | 7 |
cioè i valori del campo virtuale per i punti con ID da 1 a 3 sono corretti, mentre per i punti con ID da 5 a 7 sono errati (riportano lo stesso ID del punto).
Riscontro il problema con QGIS 3.16.0 (prima versione in cui è presente overlay_nearest), 3.16.16 e 3.22.3.
Spero qualcuno possa smentirmi… ma le conferme sono apprezzate ugualmente
A presto.
Andrea