[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