Semplificazione dei poligoni adiacenti mediante lo strumento QGIS Simplify Geometries


10

Ho un grande file di forma con 200.000 poligoni ma il file è troppo grande per l'applicazione che lo utilizzerà. Vorrei generalizzare questi poligoni e creare file molto più piccoli.

Ho provato a farlo in QGIS usando lo strumento "Semplifica geometrie". Ho provato questo su una porzione molto piccola del mio Shapefile e sono contento dei risultati ma ho un piccolo problema che non so come risolvere. Ho aggiunto l'immagine per mostrare il problema.

I confini del BIANCO sono confini prima della semplificazione. I confini ROSSI sono dopo la semplificazione. Le aree problematiche sono cerchiate in arancione. Come puoi vedere, i "confini semplificati" contengono alcune aree che dopo la semplificazione non appartengono a nessuno dei precedenti poligoni.

Come posso semplificare questo Shapefile e mantenere i confini comuni tra i poligoni come un'unica linea ed eliminare le aree che sono state create dopo la semplificazione?

Poligoni semplificati in QGIS

INFORMAZIONI AGGIUNTIVE:

Dopo aver seguito le istruzioni suggerite

  1. Converti poligoni in linee
  2. Semplifica le linee
  3. Converti le linee in poligoni

Ottengo i seguenti risultati. È leggermente meglio di prima, ma ho ancora aree al di fuori dei poligoni originali (vedi aree bianche nella foto sotto).

@Andrew mi ha suggerito di associare ogni riga al poligono adiacente ma non so come farlo in QGIS.

inserisci qui la descrizione dell'immagine

Sto ancora cercando di completare il processo di semplificazione dei poligoni. Ho seguito le istruzioni suggerite in questo post e quando pensavo di ottenere risultati accettabili apparve un altro problema. Di seguito è riportato il riepilogo di ciò che ho fatto con le immagini dei risultati. Tutti i passaggi sono stati eseguiti utilizzando la toolbox PROCESSING in QGIS.

  1. Innanzitutto, ho convertito i poligoni in linee
  2. In secondo luogo, ho pulito le linee usando v.clean con l'opzione break. Ciò si è tradotto in STRATO VETTORI PULITO e STRATO ERRORE. Il livello di errore (punti verdi sull'immagine fornita) presenta un punto verde su ogni intersezione di linea. Non so che cosa significa.
  3. In terzo luogo, ho semplificato le linee usando lo strumento "SEMPLIFICA GEOMETRIA" (si traducono in linee rosse nelle immagini). Confrontando le linee rosse semplificate e le linee arancioni originali sono contento del risultato.
  4. In quarto luogo, volevo convertire le linee in poligoni usando lo strumento "Poligonizza" in "ELABORAZIONE" e ho ottenuto risultati che non mi aspettavo (seconda immagine con poligoni di colore verde oliva scuro sfumati). Sembra che le intersezioni dei livelli di errore siano collegate al poligono e abbiano creato un set completamente diverso di poligoni ignorando le linee semplificate.

Qualcuno potrebbe spiegare cosa è andato storto qui?

Perché le linee semplificate rosse non sono state convertite correttamente in poligoni semplificati?

Come puoi vedere, non sono un esperto GIS ma devo farlo da solo. Non so se sono troppo lontano dalla soluzione, ma è frustrante vedere linee semplificate che ho trovato accettabili per quello che mi piacerebbe fare ma non posso convertirle in poligoni.

Ecco due immagini con i risultati degli ultimi due passaggi del processo:

Linee semplificate e linee originali

Risultati delle linee semplificate plygonized


@nhopton Nella pagina web di Polygonizer plugins.qgis.org/plugins/Polygonizer dice che "Crea poligoni da linee intersecanti". Ciò suggerisce che i poligoni verranno creati ogni volta che c'è un'intersezione di linea (ma forse la mia interpretazione è sbagliata). Quello di cui ho bisogno è di liberarmi di quei vuoti che sono stati creati usando lo strumento "Semplifica geometrie" e se Poligonizzatore può farlo sarei molto felice.
David,

Pensandoci, il tuo strato poligonale originale dovrebbe semplificare senza problemi. Se non lo fa, penso che probabilmente significhi che hai dei poligoni cattivi nei dati originali. Poligoni che si sovrappongono leggermente o che hanno piccoli spazi tra di loro. Prova a ingrandire le aree problematiche per vedere se riesci a trovare qualcosa del genere. N.
Nhopton,

Un buon modo per preservare la topologia consiste nel flusso di lavoro suggerito da @radouxju (tranne il calcolo del centroide che non è necessario) e rappresentato nel modello di elaborazione nella mia risposta. In alternativa, penso che GRASS v.generalizesia un'altra ottima opzione. Spero che sia di aiuto.
Antonio Falciano,

Risposte:


7

Ho ottenuto un risultato abbastanza buono usando GRASS v.generalize dalla casella degli strumenti di elaborazione usando i valori predefiniti:

inserisci qui la descrizione dell'immagine

Alcune righe rimangono intatte.


Ha avuto un buon successo con questo metodo dopo aver impostato la tolleranza di snap v.in.ogr da -1 (no snap) a 0,00001 come suggerito da @Kantan.
cm1

4

Ho riscontrato questo problema con Qgis2.16, ma GRASS non è riuscito a fornire un risultato topologicamente corretto come @AndreJ.

Una buona soluzione consiste nel modificare la tolleranza di snap v.in.ogr nei parametri avanzati dello strumento v.generalize.simplify . L'impostazione predefinita è -1, che impedisce lo snap in GRASS.

Inserendo un piccolo valore qui (come 1e-05 m), lo snap viene abilitato e GRASS riconosce i bordi condivisi dei poligoni. La semplificazione fornisce quindi uno strato topologicamente corretto, senza fori.

Nota: impostando la tolleranza di snap su valori più alti, è anche possibile modificare i poligoni in modo da poter eliminare quelli molto sottili se si desidera. Segui quell'operazione con v.clean usando rmarea e una soglia abbastanza grande da eliminare i piccoli avanzi, e il gioco è fatto!


3

prima converti il ​​tuo poligono in linee

usa v.clean per pulire la tua topologia (con l'opzione "break")

allora semplifichi le tue linee

Infine ritorni le tue linee in poligoni. (Usando poligonizzare)

EDIT: Per ottenere gli attributi dei tuoi poligoni, il modo migliore, se non hai poligoni multipart nel set di dati originale , è quello di ottenere i centroidi dei vecchi e dei poligoni semplificati e unirli in base alla posizione più vicina (i centroidi dovrebbero non muoverti molto se modifichi solo leggermente i tuoi confini)


1
Mi sembra che tu abbia omesso alcuni passaggi, anche se il flusso di lavoro potrebbe funzionare alla fine. Quando converti i poligoni in linee potresti dover associare la linea a tutti i poligoni adiacenti. Quindi, dopo la semplificazione, è necessario ripristinare le linee in poligoni in più parti. Se i poligoni originali sono convessi, potresti essere in grado di abbinare l'originale al semplificato usando il centroide (ad es. Se il centroide dell'originale è contenuto nel poli semplificato è una corrispondenza). Se non sono convessi, sarà molto più difficile.
Andy W,

Ciao, ho seguito la procedura suggerita da radouxju ma continuo a ottenere parti del poligono originale al di fuori dei suoi confini originali. Come associo la linea a tutti i poligoni adiacenti in QGIS? Sto pianificando di utilizzare questi poligoni nelle applicazioni Web e devo ridurre il numero di nodi per un caricamento più veloce. Ciò che ottengo ora è una buona riduzione, ma non riesco a liberarmi di queste piccole aree che sono lì dopo la semplificazione. Qualsiasi idea per risolvere questo sarà molto apprezzata.
David,

@ David. Penso che il tuo problema potrebbe essere con il passaggio 3, le linee ai poligoni. Nel Processing Toolkit c'è uno strumento chiamato "Polygonize" e vorrei provarlo. Penso che questo abbia ancora bisogno dei pacchetti Shapely e Numpy da installare. Detto questo, non riesco a far funzionare "Polygonize" per me in QGIS-Master al momento. N.
nhopton,

2

È possibile risolvere il problema con un modello di elaborazione (ex SEXTANTE) come questo:

inserisci qui la descrizione dell'immagine

Versione dello script:

##Simplify polygons=name
##vectorlayer_input=vector
##number_tolerance=number 0.0
##output_layer_alg3=output vector
outputs_0=Processing.runalg("qgis:polygonstolines", vectorlayer_input, None)
outputs_1=Processing.runalg("qgis:simplifygeometries", outputs_0['OUTPUT'], number_tolerance, None)
outputs_2=Processing.runalg("qgis:linestopolygons", outputs_1['OUTPUT'], None)
outputs_3=Processing.runalg("qgis:joinattributestable", outputs_2['OUTPUT'], vectorlayer_input, ID, ID, output_layer_alg3)

Nota: l'unico vincolo è che il campo comune deve essere IDin Join attributes table, perché è l'unico campo della produzione di Lines to polygons. Ecco perché il campo comune non è un input variabile del modello. Quindi un IDcampo deve essere disponibile nel livello poligono di input.

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.