Estrarre i valori raster nei punti utilizzando GIS Open Source?


21

Come posso estrarre valori da un raster per punti?

Preferisco non ad Arcgis.

Preferisco in Qgis o Mapwindow o altri GIS open source.


1
Quindi hai punti e devi estrarre i valori dal raster sotto quei punti, o devi convertire le celle raster in punti. Sto solo controllando prima di provare a trovare la risposta.
Nathan W,

Il primo, ho i punti e ho bisogno di estrarre i valori dal raster, sotto quei punti. THNX !!
Vassilis,

Risposte:


37

"Point Sampling Tool" di QGIS dovrebbe essere il plug-in che stai cercando.

Ecco una descrizione dettagliata di come usarlo: http://pvanb.wordpress.com/2010/02/15/sampling-raster-values-at-point-locations-in-qgis/

Aggiornamento basato sul commento di Paolo:

il plugin non è l'unica soluzione, e non è sempre la soluzione più semplice. Una soluzione alternativa è la funzione Saga 'Aggiungi valori raster al punto' nella casella degli strumenti di elaborazione. Vedi i dettagli http://pvanb.wordpress.com/2014/07/01/sampling-raster-values-at-point-locations-in-qgis-an-update/


5
Le persone stanno ancora trovando il post sopra menzionato in questo Q&A. Tuttavia, il plug-in non è l'unica soluzione e non è sempre la soluzione più semplice. Una soluzione alternativa è la funzione Saga 'Aggiungi valori griglia al punto' nella casella degli strumenti di elaborazione. Vedi i dettagli questo post .
Ecodiv,

Attenzione. Ho appena eseguito lo strumento di campionamento punti. 60.000 punti e 13 raster. I risultati hanno fallito il mio 30 test a campione casuale per ogni anno. Questo strumento presenta problemi con set di dati di grandi dimensioni. Non lo userei.
Se non lo sapete, basta GIS l'

Nonostante i problemi citati con set di dati di grandi dimensioni, è molto utile per estrarre tutti i valori multibanda in una volta sola. Tutte le altre soluzioni relative a QGIS supportano solo l'estrazione di una banda (come GRASS r.what) o vietano l'uso di raster multibanda (come Saga - valori raster in punti).
EikeMike,

7

In PostGIS 2.0 puoi fare:

SELECT ST_Value(rast, geom) val
FROM yourrastertabe, yourpointtable
WHERE ST_Intersects(rast, geom)

Assicurati che il tuo raster sia piastrellato molto piccolo quando lo carichi (-t 10x10 con il caricatore).


7

Avevo problemi con gli strumenti della GUI di QGIS e SAGA menzionati in questo thread ( Raster values to pointsnon funzionava per qualche motivo e v.samplegenerava errori inutili e GRASS ha creato un livello completamente nuovo che non è stato utile). Dopo aver fallito per un po 'con gli strumenti della GUI, ho provato a farlo nel Field Calculator. Ha funzionato abbastanza bene e sono stato in grado di controllare il processo un po 'meglio di quanto consentito dalle GUI e fare altri calcoli lungo la strada.

Supponi di avere un livello denominato ptse un altro nome rast, entrambi nello stesso sistema di coordinate. Vorresti campionare rastad ogni coppia X, Y rappresentata in pts.

Se non hai mai usato il calcolatore di campo prima, è abbastanza semplice. Inserirai il tuo calcolo nella casella "Espressione" e Q ti fornirà un numero di variabili e operazioni nella colonna centrale, con il testo di aiuto nella colonna di destra. Suddividerò questo processo in quattro passaggi:

  1. Apri la tabella degli attributi del ptslayer con cui desideri campionare.

  2. Quando sei nella finestra di dialogo Calcolatrice campo, scegli se desideri creare un nuovo campo o modificare un campo esistente nel tuo ptslivello.

  3. Quindi, crea un'espressione per riempire la ptscolonna di attributi nuovi o esistenti . Potresti iniziare modificando il codice di espressione che ha funzionato per me:

raster_value('rast', 1, make_point($x, $y))
  1. È necessario fornire raster_value()un nome di livello raster 'rast', un numero di banda 1e la geometria del punto in make_point(). $xe $ysono variabili di geometria dipendenti dalla posizione del punto in ciascuna riga della tabella degli attributi.

Questo metodo permette anche operazioni aritmetiche come sottraendo il valore di un altro strato raster chiamato other_rastda rast, che mi ha salvato un sacco di tempo negli strumenti grafici. Esempio sotto:

raster_value('rast', 1, make_point($x, $y)) - raster_value('other_rast', 1, make_point($x, $y))

Si noti ancora che i tre strati pts, raste other_rastdeve essere nello stesso sistema di coordinate per questo metodo di lavoro.


1
questa è la migliore risposta a questa domanda
BC B.

6

Prova a utilizzare QGIS 3.2.2 e SAGA (installato per impostazione predefinita in QGIS): la funzione "Valori raster in punti" farà tutto per te: prende un file immagine e lo converte in una forma punto-vettore prendendo le informazioni dall'immagine raster.


4

Gli strumenti GME di Hawthorne Beyer lo fanno bene tramite riga di comando e consentono un facile batch con i cicli 'for'.

isectpntrst(in="path/to/shapefile", raster="path/to/raster", field="fieldname")

Riferimento comando isectpntrst GME





2

Ecco una funzione che ho scritto usando Python e Gdal. La funzione prende un elenco di raster e un frame di dati panda contenente le coordinate del punto e restituisce un frame di dati panda con le coordinate del punto, i centroidi per le rispettive celle raster e i rispettivi valori di cella. La funzione fa parte del pacchetto chorospy del pacchetto in sviluppo (disponibile qui ).

import pandas
import numpy
from osgeo import gdal

def getValuesAtPoint(indir, rasterfileList, pos, lon, lat):
    #gt(2) and gt(4) coefficients are zero, and the gt(1) is pixel width, and gt(5) is pixel height.
    #The (gt(0),gt(3)) position is the top left corner of the top left pixel of the raster.
    for i, rs in enumerate(rasterfileList):

        presValues = []
        gdata = gdal.Open('{}/{}.tif'.format(indir,rs))
        gt = gdata.GetGeoTransform()
        band = gdata.GetRasterBand(1)
        nodata = band.GetNoDataValue()

        x0, y0 , w , h = gt[0], gt[3], gt[1], gt[5]

        data = band.ReadAsArray().astype(numpy.float)
        #free memory
        del gdata

        if i == 0:
            #iterate through the points
            for p in pos.iterrows():
                x = int((p[1][lon] - x0)/w)
                Xc = x0 + x*w + w/2 #the cell center x
                y = int((p[1][lat] - y0)/h)
                Yc = y0 + y*h + h/2 #the cell center y
                try:
                    if data[y,x] != nodata:
                        presVAL = [p[1][lon],p[1][lat], '{:.6f}'.format(Xc), '{:.6f}'.format(Yc), data[y,x]]
                        presValues.append(presVAL)
                except:
                    pass
            df = pandas.DataFrame(presValues, columns=['x', 'y', 'Xc', 'Yc', rs])
        else:
            #iterate through the points
            for p in pos.iterrows():
                x = int((p[1][lon] - x0)/w)
                y = int((p[1][lat] - y0)/h)
                try:
                    if data[y,x] != nodata:
                        presValues.append(data[y,x])
                except:
                    pass
            df[rs] = pandas.Series(presValues)
    del data, band
    return df

Esempio di come eseguirlo dato che i raster si trovano nella directory di lavoro corrente:

rasDf = getValuesAtPoint('.', ['raster1', 'raster2'], inPoints, 'x', 'y')

1

Se hai accesso a FME , puoi utilizzare uno dei due trasformatori in FME Workbench.

Il RasterCellCoercer ( "decompone tutte le funzioni raster di input numerico in singoli punti o poligoni. Una caratteristica vettore è uscita per ogni cella nel raster").

Il PointOnRasterValueExtractor ( "prende in elementi puntuali e un singolo raster di riferimento. L'uscita è costituito dal valore di banda e palette (s) in corrispondenza di ciascun punto.")


No, non ho o utilizzo FME, è un'applicazione autonoma o un plug-in?
Vassilis,

0

Pensiero veloce:

  1. gdal_polygonize.py - poligonizza la tua funzione raster
  2. Inserisci le caratteristiche dei punti e i poligoni nel database PostGIS
  3. Utilizzare la funzione st_intersects per estrarre tutti i valori di elevazione in cui le caratteristiche si intersecano

approccio interessante, perché ieri ha iniziato a studiare come usare Postgis.
Vassilis,

Grazie, è abbastanza semplicistico ma funziona. Ecco cosa sono stato in grado di produrre con questo approccio: i.imgur.com/h8CGJ.png
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.