Como extrair valores de rasters no local dos pontos em R?

13

Minha pergunta é sobre a extração de valores de rasters no local dos pontos. Com a extração da função, isso é muito fácil, e a função fornece um quadro de dados com os valores de todas as variáveis ​​nos pontos. Eu quero ter nesse quadro de dados as coordenadas de cada ponto. Como posso fazer isso acontecer? É possível dizer a R que, ao extrair os valores da varredura, adicione também as colunas do ponto de localização.

Este é o meu procedimento:

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)

os resultados são algo como estes:

> 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

Mas eu quero mais duas colunas com os dados de coordenadas (mas podem ser outras colunas da minha tabela de localização de extração de csv).

Muito obrigada.

JMCosta
fonte
Desculpe, o formato dos resultados mostrados antes não está correto.
JMCosta #
Deve ser cinco colunas (bio1, bio12 .... bio4)
JMCosta
Os valores não devem corresponder às suas coordenadas presencias?
Roman Luštrik
Os valores das variáveis ​​são dos pontos de presença. Mas também quero as coordenadas dos pontos da tabela. mas eu não sei como fazer.
JMCosta #
Que tal algo semelhante cbind(coordinates(presencias), variables_presencia)? Você pode converter para SPDF usando coordinates(result) <- ~ X + Ye pode usar a infinidade de métodos projetados para objetos espaciais novamente.
Roman Luštrik

Respostas:

20

Supondo que presenciase variablescompartilhe a mesma projeção, essa deve ser uma tarefa fácil. Eu recomendo que você adicione essas linhas de código após a sua read.table()instrução para converter o presenciasquadro de dados em um objeto SpatialPointsDataFrame (basta refinar os nomes das colunas que contêm as coordenadas xey se diferirem do meu exemplo).

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

Para fornecer um exemplo reproduzível, tento abrir um pouco mais o escopo da minha resposta. Primeiro, faça o download e descompacte este arquivo de forma ESRI com locais mais ou menos importantes na Alemanha. Estes servirão como dados pontuais mais tarde. Você também precisará de pacotes e dismo, neste pequeno exemplo, verifique se essas bibliotecas (e todas as suas dependências) estão instaladas no disco rígido local.rgdalraster

Vamos começar carregando os pacotes necessários.

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

Em seguida, você deve gerar uma amostra RasterLayer. No nosso caso, usaremos a gmap()função do dismopacote para obter um mapa físico da Alemanha.

germany.mrc <- gmap("Germany")

Agora você pode importar seu shapefile de ponto via readOGRdo rgdalpacote de R. Certifique-se de ajustar o nome da fonte de dados (dsn = ...). Todo o material de projeção é obsoleto no seu caso particular. No entanto, isso deve ser feito em nosso exemplo para sobrepor com êxito nossos dados de ponto com o RasterLayer da Alemanha.

# 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)))

Para reduzir o tamanho enorme de nossos dados de pontos, desenharemos uma amostra aleatória de dez locais na Alemanha. Isso deve ser suficiente para nossos propósitos.

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

Agora que o material de preparação foi concluído, poderíamos começar a extrair os valores desses pixels em particular em que nossos dez pontos amostrados aleatoriamente se encontram.

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")

Para mesclar as coordenadas do ponto com os valores de pixel extraídos, precisamos apenas configurar um quadro de dados contendo as coordenadas do nosso SpatialPointsDataFrame. É isso aí!

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
fdetsch
fonte
1

Certamente você pode fazer:

variables_presencia$x <- presencias['x']

variables_presencia$y <- presencias['y']

(presumindo que seus dados de coordenadas estejam em duas colunas chamadas 'x' e 'y')

Jack Harrison
fonte
Eu pensei dessa maneira, mas eu tinha essas dúvidas: o quadro de dados resultante da extração tem a mesma ordem que presença. (primeira linha de trama de dados é a primeira linha da tabela presença)
JMCosta
E outra coisa, se não houvesse dados variáveis ​​para nenhum ponto (3 ou 4), o número de linhas não será o mesmo e a ordem não será a mesma, com certeza.
JMCosta
@ JMCosta: você está errado sobre isso. Os valores de NA seriam retornados para esses pontos.
Robert Hijmans