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

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

A presto.

Andrea

Buongiorno,
confermo tutto.
Ho fatto i test consigliati e ho usato il gpkg condiviso.

Aggiungo altre osservazioni:

  1. dove è scritto nella documentazione che overlay_nearest() utilizzato con lo stesso layer ha quel comportamento? (ovvero salta i casi banali);
  2. come mai l’opzione limit:=-1 non ha effetto se il layer è lo stesso?

grazie per la segnalazione

saluti

Il giorno gio 3 feb 2022 alle ore 20:23 Andrea Giudiceandrea <andreaerdna@libero.it> ha scritto:

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

A presto.

Andrea


QGIS-it-user mailing list
QGIS-it-user@lists.osgeo.org
https://lists.osgeo.org/mailman/listinfo/qgis-it-user

Ing. Salvatore Fiandaca
mobile.:+39 327.493.8955
m: pigrecoinfinito@gmail.com
C.F.: FNDSVT71E29Z103G
P.IVA: 06597870820
membro QGIS Italia - http://qgis.it/
socio GFOSS.it - http://gfoss.it/
blog:**** https://pigrecoinfinito.com/
FB: Co-admin - https://www.facebook.com/qgis.it/****
TW: ****https://twitter.com/totofiandaca

43°51’0.54"N 10°34’27.62"E - EPSG:4326

“Se la conoscenza deve essere aperta a tutti,
perchè mai limitarne l’accesso?”
R. Stallman

Questo documento, allegati inclusi, contiene informazioni di proprietà di FIANDACA SALVATORE e deve essere utilizzato esclusivamente dal destinatario in relazione alle finalità per le quali è stato ricevuto. E’ vietata qualsiasi forma di riproduzione o divulgazione senza l’esplicito consenso di FIANDACA SALVATORE. Qualora fosse stato ricevuto per errore si prega di informare tempestivamente il mittente e distruggere la copia in proprio possesso.

Ciao Salvatore,
grazie per il test!

Nella documentazione non è indicata questa modalità della funzione overlay_nearest (e penso anche di altre funzioni overlay_*: per esempio anche overlay_intersects e overlay_equals). Peraltro, negli esempi presenti nella documentazione di tale funzione è indicato (credo erroneamente) che il parametro “max_distance” debba essere specificato come distanza in “unità di mappa”. In realtà mi pare che tale distanza sia misurata in maniera cartesiana nel sistema di riferimento dal layer sorgente e non in quello “della mappa” (suppongo voglia dire “del progetto”). Non ci avevo fatto caso, grazie per la segnalazione anche di questo problema. Farò qualche altra prova e aprirò un bug report o scriverò alla mailing list qgis-developer. A presto. Andrea

···

Il 04/02/2022 07:50, Totò Fiandaca ha scritto:

Aggiungo altre osservazioni:

  1. dove è scritto nella documentazione che overlay_nearest() utilizzato con lo stesso layer ha quel comportamento? (ovvero salta i casi banali);
  1. come mai l’opzione limit:=-1 non ha effetto se il layer è lo stesso?

aggiungo altre chicche non documentate:

le nuove funzioni overlay_* restituiscono risultati corretti anche se utilizzati con layer con SR differenti, questo non è banale e non è vero per altre e più vecchie funzioni come quelle del gruppo aggrega.

saluti

···

Ing. Salvatore Fiandaca
mobile.:+39 327.493.8955
m: pigrecoinfinito@gmail.com
C.F.: FNDSVT71E29Z103G
P.IVA: 06597870820
membro QGIS Italia - http://qgis.it/
socio GFOSS.it - http://gfoss.it/
blog:**** https://pigrecoinfinito.com/
FB: Co-admin - https://www.facebook.com/qgis.it/****
TW: ****https://twitter.com/totofiandaca

43°51’0.54"N 10°34’27.62"E - EPSG:4326

“Se la conoscenza deve essere aperta a tutti,
perchè mai limitarne l’accesso?”
R. Stallman

Questo documento, allegati inclusi, contiene informazioni di proprietà di FIANDACA SALVATORE e deve essere utilizzato esclusivamente dal destinatario in relazione alle finalità per le quali è stato ricevuto. E’ vietata qualsiasi forma di riproduzione o divulgazione senza l’esplicito consenso di FIANDACA SALVATORE. Qualora fosse stato ricevuto per errore si prega di informare tempestivamente il mittente e distruggere la copia in proprio possesso.