[QGIS-it-user] Alcuni problemi con la funzione overlay_nearest usata sullo stesso layer

Andrea Giudiceandrea andreaerdna a libero.it
Gio 3 Feb 2022 11:23:14 PST


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
-------------- parte successiva --------------
Un allegato HTML è stato rimosso...
URL: <http://lists.osgeo.org/pipermail/qgis-it-user/attachments/20220203/d126a53d/attachment.html>


Maggiori informazioni sulla lista QGIS-it-user