QGIS algoritmo UNIONE con singolo strato

Nel mese di agosto ho (abbiamo: OpenDataSicilia) iniziato due bei progetti, entrambi solo per la gloria, e in uno di questi abbiamo dovuto superare un grosso problema relativo all’algoritmo UNIONE presente in QGIS a partire da QGIS 3.2 Bonn.

Il problema è un caso limite e molto complesso, ovvero è l’output di API Here per la determinazione di isocrone, ecco un esempio di output:

Isocrone prima e dopo algoritmo UNIONE

Prima: dell’avvio dell’algoritmo UNIONE
DOPO: avvio dell’algoritmo UNIONE si manifestavano errori (nel log) e perdita di dati (come indica la freccia rossa).

Abbiamo aperto tre issue nel repo di QGIS, solo in questa ci ha risposto l’autore dell’algoritmo, ecco la sua risposta:

If there is a topology exception emitted from GEOS, that means some XY coordinate values are very very close to each other. Because of that, some math operations give wrong results.

The proper solution to this problem is to run “Snap geometries to layer” processing algorithm in “Snap to anchor nodes (single layer only)” mode with a small tolerance (note it is in map units!). Afterwards run “Fix geometries” algorithm to make sure that if snapping produced invalid geometries, they will get fixed.

A good question is whether QGIS should try harder to help users in these scenarios:

  • maybe add some explanation what went wrong and how to fix the input data
  • maybe try to automatically run the algorithms to fix the input data (but that seems like too much magic to me)

Autore: Martin Dobias

Tradotto in QGIS tramite modellatore Grafico:

di seguito i vari algoritmi:

Aggancia geometria al vettore
Ripara geometrie
Unione con un singolo strato

NOTE FINALI: Il problema nasce quando l’algoritmo deve fare delle differenze tra poligoni e se la differenza fosse piccolissima, la libreria che si occupa di tutto cio’ (GEOS), manifesta un errore:

GEOS geoprocessing error: difference failed.
TopologyException: found non-noded intersection between LINESTRING (2.36891e+06 4.22927e+06, 2.36892e+06 4.22927e+06) and LINESTRING (2.36892e+06 4.22928e+06, 2.3689e+06 4.22926e+06) at 2368909.6404680978 4229266.2896102117

la soluzione descritta sopra intende evitare il problema correggendo lo strato di input con uno snap, cosi facendo si evitano differenza piccolissime tra poligoni vicini.

L’issue è ancora aperta, ma questa procedura sembra limitare i danni e consente di poter lavorare anche con strati particolarmente complessi.


Riferimenti:

Ringraziamenti:

6 pensieri su “QGIS algoritmo UNIONE con singolo strato

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo di WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione /  Modifica )

Google photo

Stai commentando usando il tuo account Google. Chiudi sessione /  Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione /  Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione /  Modifica )

Connessione a %s...

Questo sito utilizza Akismet per ridurre lo spam. Scopri come vengono elaborati i dati derivati dai commenti.