<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>