<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
</head>
<body>
Salve a tutti,<br>
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.<br>
<br>
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.<br>
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.<br>
<br>
overlay_nearest funziona effettivamente così per layer in formato,
per
esempio, Memory, GeoPackage o Spatialite.<br>
<br>
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.<br>
<br>
Per fare una semplice verifica:<br>
<br>
- crea un nuovo Memory layer di tipo geometrico Point in un progetto
vuoto<br>
- aggiungi un singolo punto al layer, salva la modifica e chiudi
l'editazione<br>
- usa l'espressione overlay_nearest(@layer,$geometry) nel
calcolatore di
campi per tale layer: l'anteprima mostra il valore [] (cioè,
correttamente, un array vuoto)<br>
<br>
- esporta il Memory layer in un layer in formato Shapefile e
aggiungi
tale layer Shapefile al progetto<br>
- 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)<br>
<br>
- esporta il Memory layer in un layer in formato GeoPackage o
Spatialite
e aggiungi tale layer al progetto<br>
- usa la stessa espressione nel calcolatore di campi per tale layer
GeoPackage o Spatialite: l'anteprima mostra il valore [] (cioè,
correttamente, un array vuoto)<br>
<br>
<br>
Inoltre, sempre applicando la funzione sullo stesso layer, anche con
layer in formato Memory, GeoPackage o Spatialite, riscontro un altro
bug.<br>
<br>
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.<br>
<br>
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.<br>
<br>
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...<br>
<br>
Per verificare questo bug, metto a disposizione un piccolo file
GeoPackage
<a class="moz-txt-link-freetext" href="https://drive.google.com/file/d/195J1kph3v8q_Db2TVDXm-RMYpkaI2ES5">https://drive.google.com/file/d/195J1kph3v8q_Db2TVDXm-RMYpkaI2ES5</a><br>
<br>
Il layer contiene sette punti, con un campo ID testuale progressivo
da 1
a 7.<br>
<br>
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:<br>
<br>
<table border="1">
<tbody>
<tr>
<td>ID</td>
<td>ID_near<br>
</td>
</tr>
<tr>
<td>1</td>
<td>3</td>
</tr>
<tr>
<td>2</td>
<td>5</td>
</tr>
<tr>
<td>3</td>
<td>7</td>
</tr>
<tr>
<td>4</td>
<td>2</td>
</tr>
<tr>
<td>5</td>
<td>2</td>
</tr>
<tr>
<td>6</td>
<td>3</td>
</tr>
<tr>
<td>7</td>
<td>3<br>
</td>
</tr>
</tbody>
</table>
<br>
<br>
Se però, per esempio, elimino il punto con ID 4, la tabella diventa
erroneamente:<br>
<br>
<table border="1">
<tbody>
<tr>
<td>ID</td>
<td>ID_near</td>
</tr>
<tr>
<td>1</td>
<td>3</td>
</tr>
<tr>
<td>2</td>
<td>5</td>
</tr>
<tr>
<td>3</td>
<td>7</td>
</tr>
<tr>
<td>5</td>
<td>5</td>
</tr>
<tr>
<td>6</td>
<td>6</td>
</tr>
<tr>
<td>7</td>
<td>7</td>
</tr>
</tbody>
</table>
<br>
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).<br>
<br>
<br>
Riscontro il problema con QGIS 3.16.0 (prima versione in cui è
presente overlay_nearest), 3.16.16 e 3.22.3.<br>
<br>
<br>
Spero qualcuno possa smentirmi... ma le conferme sono apprezzate
ugualmente :-)<br>
<br>
A presto.<br>
<br>
Andrea<br>
</body>
</html>