Come estrarre i valori dai raster nella posizione dei punti in R?


13

La mia domanda riguarda l'estrazione di valori dai raster nella posizione dei punti. Con la funzione extract questo è molto semplice e la funzione mi dà un frame di dati con i valori di tutte le variabili nei punti. Voglio avere in quel frame di dati le coordinate di ogni punto. Come posso farlo accadere? È possibile dire a R che quando si estraggono i valori dal raster aggiungere anche le colonne del punto di posizione.

Questa è la mia procedura:

presencias=read.table("c:/SDM_R/presencias/P_lentiscus_pres.csv",header=TRUE,sep=";")

lista_variables <-list.files(path="Variables_modelizacion/solo_ascii",pattern='*.asc',full.names=TRUE)
variables <- stack(lista_variables)

variables_presencia<-extract(variables, presencias)

i risultati sono simili a questi:

> bio1  bio12  bio18  bio2  bio4 
> 90    875    165    95    4886
> 115   1085   158    83    4075
> 135   1153   153    67    3402
> 85    1026   137    99    5203
> 96    667    128    108   5823
> 98    531    109    113   6305
> 132   450    63     123   6598
> 132   569    104    106   5963
> 95    814    196    98    5571
> 146   474    39     114   6603

Ma voglio altre due colonne con i dati delle coordinate (ma potrebbero essere altre colonne dalla mia tabella di posizione di estrazione CSV).

Grazie tante.


Spiacenti, il formato dei risultati mostrati prima non è corretto.
JMCosta

Devono essere cinque colonne (bio1, bio12 .... bio4)
JMCosta

I valori non dovrebbero corrispondere alle coordinate del tuo presencias?
Roman Luštrik,

I valori delle variabili provengono dai punti di prensenza. Ma voglio anche le coordinate dei punti nella tabella. ma non so come fare.
JMCosta

Che dire di qualcosa del genere cbind(coordinates(presencias), variables_presencia)? È quindi possibile convertire in SPDF utilizzando coordinates(result) <- ~ X + Ye utilizzare nuovamente la pletora di metodi progettati per oggetti spaziali.
Roman Luštrik,

Risposte:


20

Supponendo che presenciase variablescondividere la stessa proiezione, questo dovrebbe essere un compito facile. Ti consiglio di aggiungere queste righe di codice dopo la tua read.table()dichiarazione per convertire i presenciasdataframe in un oggetto SpatialPointsDataFrame (basta affinare i nomi delle colonne che contengono le coordinate xey se differiscono dal mio esempio).

coordinates(presencias) <- c("x", "y")

Per fornire un esempio riproducibile, provo ad aprire un po 'di più l'ambito della mia risposta. Prima di tutto, scarica e decomprimi questo file di forma ESRI con posizioni più o meno importanti in Germania. Questi serviranno come dati puntuali in seguito. Avrai anche bisogno di pacchetti e dismo, per questo breve esempio, assicurati che queste librerie (e tutte le loro dipendenze) siano installate sul tuo disco rigido locale.rgdalraster

Cominciamo con il caricamento dei pacchetti richiesti.

library(dismo)
library(rgdal)
library(raster)

Successivamente, è necessario generare un RasterLayer di esempio. Nel nostro caso, utilizzeremo la gmap()funzione dal dismopacchetto per ottenere una mappa fisica della Germania.

germany.mrc <- gmap("Germany")

Ora puoi importare il tuo shapefile di punti tramite readOGRil rgdalpacchetto di R. Assicurarsi di regolare il nome dell'origine dati (dsn = ...). L'intero materiale di proiezione è obsoleto nel tuo caso particolare. Tuttavia, nel nostro esempio deve essere fatto per sovrapporre con successo i nostri dati dei punti con il RasterLayer Germania.

# Import SpatialPointsDataFrame
germany.places <- readOGR(dsn = "/path/to/shapefile", layer = "places")
# Define shapefile's current CRS
projection(germany.places) <- CRS("+proj=lonlat +ellps=WGS84")
# Reproject to RasterLayer's CRS
germany.places.mrc <- spTransform(germany.places, CRS(projection(germany.mrc)))

Per ridurre l'enorme dimensione dei nostri dati puntuali, disegneremo un campione casuale di dieci località in Germania. Questo dovrebbe bastare per i nostri scopi.

set.seed(35)
germany.places.mrc.sample <- germany.places.mrc[sample(nrow(germany.places.mrc), 10), ]

Ora che la preparazione è terminata, potremmo semplicemente iniziare ad estrarre i valori di quei particolari pixel in cui si trovano i nostri dieci punti campionati casualmente.

data <- data.frame(coordinates(germany.places.mrc.sample),
                   germany.places.mrc.sample$name, 
                   extract(germany.mrc, germany.places.mrc.sample))
names(data) <- c("x", "y", "name", "value")

Per unire le coordinate dei punti con i valori dei pixel estratti, dobbiamo solo impostare un frame di dati contenente le coordinate dei nostri SpatialPointsDataFrame. Questo è tutto!

data
           x       y          name value
1  1073490.3 6513446 Veitsteinbach   208
2  1269100.8 6156690   Assenhausen   231
3  1336757.5 6246284    Frauenwahl   195
4   828579.9 6634122      Altenhof   189
5  1571418.1 6662558         Wohla   151
6  1192299.4 6864087     Flechtorf   170
7   976270.0 6362050    Hilsenhain   208
8  1117416.4 6092146      Nestbaum   175
9  1274192.0 6344490 Wappeltshofen   236
10  878488.2 6839843        Leeden   208

1

Sicuramente puoi semplicemente fare:

variables_presencia$x <- presencias['x']

variables_presencia$y <- presencias['y']

(presumendo che i dati delle coordinate si trovino in due colonne chiamate "x" e "y")


Ho pensato in quel modo, ma avevo questi dubbi: il frame di dati risultante dall'estratto ha lo stesso ordine di quella presenza. (la prima riga del frame di dati è la prima riga della tabella di presenza)
JMCosta,

E un'altra cosa, se non ci fossero dati variabili per alcun punto (3 o 4), il numero di righe non sarà lo stesso e l'ordine non sarà lo stesso di sicuro.
JMCosta

@JMCosta: ti sbagli. I valori NA verrebbero restituiti per quei punti.
Robert Hijmans,
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.