Come faccio a creare una mappa di calore o coropleto che utilizza poligoni in QGis?


12

Ho giocato con il plugin Heatmap per QGIS e mi chiedo se sia possibile creare Heatmap usando un plugin / strumento simile che utilizza poligoni e punti?

Vorrei ottenere una rappresentazione della densità dei dati più o meno allo stesso modo del plug-in Heatmap con i punti.

L'immagine seguente è uno schizzo approssimativo del risultato desiderato:

inserisci qui la descrizione dell'immagine


3
Hai pensato di generare centroidi per i tuoi poligoni e costruire la mappa di calore da quelli?
andytilia,

1
Alcuni ulteriori dettagli sui tuoi dati potrebbero essere d'aiuto. Cosa rappresentano i poligoni e come vengono distribuiti? Puoi pubblicare una foto di esempio?
andytilia,

@andytilia: i centroidi non rappresentano accuratamente la copertura dei poligoni. I poligoni rappresentano l'uso delle risorse all'interno di un'area di 1200m2. Alcuni poligoni sono minuscoli che rappresentano una buona macchia di bacche e altri sono enormi che coprono gli habitat di caribù e alci. Ho cercato di binning una griglia esagonale e poi contare le sovrapposizioni ... ma sono praticamente un noob quindi non sono stato in grado di trovare un buon tutorial che posso capire su quell'argomento.
NWT Adam,

1
vedi plug-in QGIS heatmap qgis.spatialthoughts.com/2012/07/…
rkm

I valori numerici hanno qualche significato per te o stai solo cercando una visualizzazione bella / chiara?
underdark

Risposte:


5

Forse puoi generare una serie di punti casuali nei tuoi poligoni, esiste uno strumento QGIS per questo ? Se hai poligoni sovrapposti, allora hai una densità maggiore di questi in quest'area. Quindi utilizzare la mappa di calore per i punti. Dovresti eseguire diversi round per trovare il numero ottimale di punti, poiché il risultato dipende da questo.

Se i tuoi dati mostrano la distribuzione di alcuni habitat, il che è comunque sfocato, questo potrebbe essere il più vicino alla situazione del mondo reale in cui un punto riflette circa un campione.


1
+1 Ottima idea. L'unica cosa che aggiungerei è Partecipa in posizione con i dati dei punti e i poligoni esagonali, sbarazzarsi di tutte le caratteristiche non corrispondenti e quindi generare punti in quello, in modo che i tuoi singoli punti non vengano annegati tra tutti gli altri punti.
RomaH,

Questo sembra dare il miglior risultato. Grazie a tutte le persone che hanno offerto soluzioni. Mi sento in colpa a dare la generosità a una sola persona in quanto sembrano esserci diverse buone soluzioni!
NWT Adam,

6

Se capisco correttamente la tua domanda, ho già fatto qualcosa di simile prima; dovevo solo ricordare cosa ho fatto.

Funzionerà se i tuoi polys si sovrappongono E non sono lo stesso layer. Se si trovano sullo stesso livello ed è possibile, spostali su livelli separati, in caso contrario il livello di destinazione erediterà solo uno dei valori.

Il processo chiave da utilizzare sono gli attributi Unisci per posizione nel menu Vettore> Gestione dati . Qui specifica il tuo campo esagonale come livello target e il livello join come uno dei tuoi poligoni. Assegna un nome al livello risultante e seleziona il pulsante di opzione per Conserva tutti i record .

Il livello risultante dovrebbe essere una copia del livello esagonale con tutte le celle che intersecano il livello poligonale. Ora per l'interazione usa l'ultimo livello risultante come livello target e unisciti al successivo livello poligonale. Prendi il lasyer risultante e unisciti al tuo prossimo livello fino a quando non avrai unito tutti i tuoi livelli.

Il tuo livello finale avrebbe dovuto ereditare tutti i campi degli attributi dei livelli precedenti e gran parte di esso potrebbe essere NULL.

Qui è dove dobbiamo giocare in alcune delle viscere di un file di forma, quindi se non hai salvato il livello come file di forma, fallo ora. E rimuovi il layer dallo spazio di lavoro in QGIS.

Apri i file * .dbf del file di forma in OpenOffice Calc, NON utilizzare Excel. Mangerà il file e sarà inutile, l'ho imparato nel modo più duro. E non riordinare i dati, è molto specifico anche sull'ordine delle righe nel file. Verificare che i NULL ora siano Zeri se non lo sono, sostituirli con cura.

Ora inserisci lo shapefile in QGIS e apri la tabella degli attributi . Ora dovrebbe mostrare zero anziché NULL. Utilizzare il calcolatore di campo e sommare i campi creati per il proprio lavoro in una nuova colonna.

Ora hai un campo sommato che dovrebbe mostrare con un certo grado di precisione i valori di tutte le raccolte di caratteristiche che si sovrappongono al campo di destinazione. Puoi usare la funzione di simbologia per colorare i tuoi poligoni in base al valore del tuo campo sommato per una bella mappa coropletica.

Se si desidera eliminare tutto il campo inutilizzato nel file. Basta aprire nuovamente il file dbf in Calc ed eliminare le colonne indesiderate a piacimento. Personalmente, consiglierei di imparare a mettermi comodo in uno shapefile in questo modo, come faccio spesso.


Sfortunatamente, ho centinaia di poligoni sovrapposti nello stesso livello. Riesci a vedere un modo per aggirare questo senza separarli in alcune centinaia di strati?
NWT Adam,

1
È possibile creare un overlay poligonale con PostGIS (se lo si utilizza) che interrompe i polis sovrapposti. gis.stackexchange.com/questions/83/… Previene che qualcuno con SQL-fu migliore possa aiutarci qui e come ottenere i poligoni risultanti per ereditare i loro valori, non sono troppo bravo.
RomaH,

1
Un'altra opzione, una che suggerirei anche fortemente, è forse il momento di ripensare il tuo approccio esatto al tuo problema. Quali dati stai cercando di mappare? C'è un motivo per ritenere che il valore sarebbe omogeneo in tutti i poligoni? Il poligono sovrapposto avrebbe effettivamente effetti cumulativi? A meno che tu non abbia buone prove per suggerire queste cose, l'uso di questa mappa per qualsiasi tipo di modellazione predittiva potrebbe essere su un terreno instabile. Pensaci bene, potresti avere la soluzione corretta ma potresti scoprire un modo migliore per modellarla o mapparla.
RomaH,

1
Grazie per il suggerimento PostGIS. Lo guarderò ma sto solo imparando a usare PostGIS. Per quanto riguarda la rivalutazione della domanda ... Capisco cosa intendi, ma non sono sicuro di come altrimenti potrei visualizzare ciò che stiamo cercando di esprimere. I nostri dati rappresentano tutte le aree che gli anziani della comunità e gli utenti delle risorse considerano produttivi o importanti dal punto di vista culturale. Comprendiamo che la mappa dei valori non è omogenea in tutto il poligono ma è abbastanza vicina per il punto che vogliamo esprimere con la mappa.
NWT Adam,

1
Complimenti a qualsiasi manuale di qgis - specialmente quando inizi a trattare con // tonnellate // di shapefile, potresti finire in una posizione davvero frustrante. Non ti pentirai di aver usato il tuo SQL-fu, sia esso con il plug-in PostGIS o il plug-in GRASS (vedi la mia risposta di seguito: gis.stackexchange.com/a/42188/7689 ).
egbutter,

4

Questo è un flusso di lavoro generale che utilizza raster. Non conosco i dettagli per realizzarlo in QGIS.

  1. Utilizzare lo strumento intersezione per creare un nuovo livello vettoriale delle aree di poligono sovrapposte
  2. Converti i tuoi livelli vettoriali, incluso il livello di sovrapposizione, in raster
  3. Usa l'aritmetica raster (probabilmente aggiunta) per combinare i raster
  4. Il risultato dovrebbe essere un raster che assomigli a una mappa di calore

I valori alfa / nulli e / o la trasparenza dei livelli consentirebbero di sovrapporre il raster su qualsiasi mappa di base.


Dopo aver attraversato questo flusso di lavoro, mi viene lasciato un grande blocco grigio che copre l'estensione del nuovo raster. Come faccio ad avere questo aspetto come una mappa di calore?
NWT Adam,

1
Esistono valori diversi assegnati ai pixel nel raster finale? Alcune considerazioni: potrebbe essere necessario specificare una risoluzione più fine (più pixel) durante la creazione dei raster; i raster dovrebbero avere le stesse dimensioni e risoluzione; potrebbe essere necessario allungare o modificare la mappa dei colori del raster risultante per mostrare colori più luminosi per valori più grandi.

Ok, ho impostato la mappa dei colori, ma sto ottenendo solo due colori blu (valore 0) e rosso (2), il valore rosso copre l'area dei miei livelli originali vettoriali e il mio livello di sovrapposizione. Immagino che quando sono stati rasterizzati agli strati sia stato assegnato un valore pari a 1 anziché a ciascun poligono. Quindi, quando sono stati aggiunti i raster, il valore totale è pari a 2. Come si ottengono i valori da mantenere / aggiungere a livello di poligono anziché a livello di livello?
NWT Adam,

il raster a risoluzione più fine dovrebbe essere di aiuto

Come posso ottenere una risoluzione più raster?
NWT Adam,

4

Prova questo, invece, se soddisfa le tue esigenze, non è una soluzione computazionale al set di dati ma se stai cercando semplicemente una soluzione infografica puoi provare questo.

Unisci gli attributi per posizione, con le tue celle esagonali come target e i dati dei punti come join. Scegli di mantenere tutte le funzionalità. Imposta la simbologia sulle celle con il valore ereditato sul colore desiderato e imposta la trasparenza su qualcosa come il 50%.

Quindi sul tuo livello con i polis circolari imposta la loro simbologia sullo stesso colore e trasparenza. Posiziona il cerchio poli davanti al poli della cella. Questo darà l'illusione di una maggiore saturazione all'aumentare del valore.

Se lo desideri, puoi anche estrarre le linee di tutti i poligoni e le sovrapposizioni in alto in modo che i contorni del sottostrato non appaiano colorati dagli altri strati.

Dovrai giocare con i colori e la trasparenza per trovare la soluzione migliore. Trovo che gli stessi colori siano i migliori ma esperimento.


4

Ti suggerisco di utilizzare il plugin GRASS - QGIS ha funzionalità piuttosto limitate (e perché reinventare la ruota in Python quando esiste già un software come GRASS?):

v.in.ogr.qgis

[potrebbero essere necessarie le prossime due righe, a seconda che i tuoi poligoni abbiano già un valore]

v.db.addcol 
v.db.update_const 

qui è dove sommiamo la sovrapposizione nei poligoni, quindi creiamo il raster in base a quelle colonne

v.to.db ... qcolumns=sum(col_with_polygon_value)
v.to.rast.attr

v.out.ogr [r.out.ogr]

3

Con QGIS semplice potrebbe essere complicato, potresti aver bisogno di script personalizzati o utilizzare un database spaziale come PostGIS o Spatialite. Vorrei creare una griglia di punti regolare con PostGIS o generare come file di testo CSV e importarlo. Quindi tracciare un cerchio attorno a ciascun punto con st_buffer o rettangoli con ST_MakeEnvelope e contare tutte le aree sovrapposte di ciascun buffer. Quindi probabilmente vuoi rimuovere tutti i 0 valori, se significa "nessun dato". Finalmente puoi fare la mappa di calore per la griglia, usando il contatore come campo Peso.

È necessario sperimentare diverse risoluzioni della griglia per trovare quella ottimale. In sostanza è molto simile all'approccio raster suggerito da Kevin, rimanendo semplicemente nel mondo dei vettori.

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.