Come posso estrarre valori da un raster per punti?
Preferisco non ad Arcgis.
Preferisco in Qgis o Mapwindow o altri GIS open source.
Come posso estrarre valori da un raster per punti?
Preferisco non ad Arcgis.
Preferisco in Qgis o Mapwindow o altri GIS open source.
Risposte:
"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/
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).
Avevo problemi con gli strumenti della GUI di QGIS e SAGA menzionati in questo thread ( Raster values to points
non funzionava per qualche motivo e v.sample
generava 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 pts
e un altro nome rast
, entrambi nello stesso sistema di coordinate. Vorresti campionare rast
ad 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:
Apri la tabella degli attributi del pts
layer con cui desideri campionare.
Quando sei nella finestra di dialogo Calcolatrice campo, scegli se desideri creare un nuovo campo o modificare un campo esistente nel tuo pts
livello.
Quindi, crea un'espressione per riempire la pts
colonna 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))
raster_value()
un nome di livello raster 'rast'
, un numero di banda 1
e la geometria del punto in make_point()
. $x
e $y
sono 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_rast
da 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
, rast
e other_rast
deve essere nello stesso sistema di coordinate per questo metodo di lavoro.
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.
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")
In GRASS GIS, è possibile eseguire una query sulla mappa nella GUI o utilizzare http://grass.osgeo.org/gdp/html_grass64/r.what.html
http://gis-techniques.blogspot.com/2012/10/extract-raster-values-from-points.html ha una guida passo passo per usare il pacchetto R Raster per estrarre i valori raster dai punti.
Puoi usare questo: http://www.saga-gis.org/saga_module_doc/2.1.3/shapes_grid_3.html
È nella toolbox SAGA di Qgis! Fa tutto in un solo passaggio :)
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')
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.")
Pensiero veloce: