Sciogliere i poligoni in QGIS (GEOS) con tolleranza


11

Ho un livello vettoriale poligonale che rappresenta l'area inondata da un'inondazione. Il livello è stato prodotto in modo tale che alcune aree siano composte da più poligoni toccanti più piccoli (vedere la schermata seguente, etichettata "dati originali").

Vorrei dissolvere i poligoni in cui si toccano. Se uso lo strumento di geoprocessing dissolve in fTools di QGIS, che utilizza la libreria GEOS, ottengo alcuni risultati inaspettati (vedere "dissolve con fTools QGIS"). Sembra che GEOS non usi una soglia per determinare se i poligoni si stanno toccando, come menzionato in questi problemi:

http://trac.osgeo.org/qgis/ticket/3126

http://trac.osgeo.org/qgis/ticket/3184

http://hub.qgis.org/issues/2806

Lo stesso approccio in ArcGIS fornisce il risultato atteso (vedere "dissolvimento con ArcGIS 10.1").

Apparentemente questa è una "caratteristica" di GEOS, piuttosto che un bug. Esiste un modo per correggere i dati che devo produrre per il risultato atteso? Una lieve perdita di precisione (pochi cm?) Potrebbe essere accettabile per me. Idealmente la soluzione sarebbe qualcosa che potrei scrivere in un plugin QGIS, come fase di pre-elaborazione.

Domanda correlata (senza risposte): come impostare il valore di tolleranza dello strumento di Geoprocessing in QGIS?

Link ai dati di esempio come file di forma: https://www.dropbox.com/s/c8ns7wwfv289ad0/sample.zip

sciogli i poligoni v.dissolve


Una soluzione alternativa sarebbe prima crescere e poi ridurre il poligono dissolto da fTools (bufferando prima con un buffer positivo e poi con un buffer negativo).
Jake,

Ho provato questo, ma finisco con altri problemi (ad es. I.stack.imgur.com/LnFJy.png ). Qui, l'area blu viene creata quando buffer / dissolve / neg-buffer, dove non dovrebbe essere. Questo non è molto meglio del problema originale. Non riesco a vedere come posso recuperare l'angolo "acuto" originale.
Snorfalorpagus,

Risposte:


14

In questo caso, sembra che sia necessario aiutare lo strumento di dissolvenza fissando prima la topologia. Ecco come puoi farlo in GRASS.

Quando carichi lo shapefile, ecco come lo vede GRASS:

Ogni croce segna un'area. Puoi vedere che ci sono delle croci sulle linee di confine: questi sono i poligoni del nastro causati dal leggero offset tra le linee di confine.

  1. Rimuovi i poligoni del nastro formati dagli spazi tra i poligoni reali:

    v.clean input=sample output=tempA --o tool=rmarea thresh=0.001
  2. Scatta le linee di confine:

    v.clean input=tempA output=tempB --o tool=snap thresh=0.001
  3. Rompere le linee di confine nei nuovi incroci:

    v.clean input=tempB output=tempA --o tool=break thresh=0.001
  4. Rimuovi le linee di confine ora duplicate:

    v.clean input=tempA output=tempB --o tool=rmdupl thresh=0.001
  5. Sciogli i poligoni

    v.dissolve input=tempB output=cleaned --o column=ID

Et voilà:


Grazie @Jake. Questa è una risposta molto chiara Sfortunatamente quando provo ad applicare il processo all'intero set di dati (che copre 2500 km2), ricevo un errore dallo strumento di snap "ERRORE: G_realloc: impossibile allocare 144720024 byte di memoria in snap.c: 186". Immagino che dovrò scomporlo in pezzi più piccoli. Questo dovrebbe essere OK, dato che lo sto già suddividendo in quadrati di 0,25 km2 per accelerare intersezioni / indicizzazione spaziale (questo è il campo "ID" nei dati di esempio).
Snorfalorpagus,

7

Utilizzare il comando GRASS GIS v.dissolve (nel plugin Sextante -> Comandi GRASS -> Vector)

Se riproduco rapidamente il tuo esempio: inserisci qui la descrizione dell'immagine

Il risultato con v.dissolve:

inserisci qui la descrizione dell'immagine

Spiegazione

Il problema è facile da capire Un file di forma non ha una topologia, se due aree condividessero un bordo comune quel bordo sarebbe digitalizzato due volte e anche archiviato in duplicato.

Lo vedi chiaramente quando provi a modificare lo shapefile:

inserisci qui la descrizione dell'immagine

GRASS GIS (come ArcGIS) è un gIS topologico. Quando si importa lo shapefile in GRASS, il livello risultante ha una topologia: il bordo comune tra due aree esiste una volta ed è condiviso.

inserisci qui la descrizione dell'immagine

Per questo motivo, quando si desidera dissolvere un file di forma ( dissolvere due limiti ), è possibile che si verifichino problemi (in QGIS, GvSIG, OpenJUMP o ArcView 3.x precedente), vedere ArcUserI: Comprensione della topologia e dei file di forma .

In GRASS, v.dissolve è progettato per dissolvere i confini comuni tra aree con lo stesso numero di categoria


1
La mia ipotesi è che questo sia un problema numerico e mi chiedo se la tua copia abbastanza buona della geometria dell'OP, catturerebbe le stesse proprietà numeriche?
Chau,

@Chau: v.dissolveha un parametro di tolleranza, che risolve il problema del PO.
Jake,

Tale dettaglio dovrebbe essere incorporato nella risposta sopra, grazie per il chiarimento :)
Chau,

Ho aggiunto un link ai dati originali come shapefile nella domanda. Quando lo uso v.dissolvesembra funzionare, tranne per il fatto che "riempie" il quadratino al centro delle funzioni. i.stack.imgur.com/AA59l.png
Snorfalorpagus,

1
Propongo una spiegazione
gene
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.