2016-10-11 7 views
2

У меня есть растровый стек со 100 файлами. И я хочу извлечь значения из каждого файла для конкретных локальных местоположений. Это дает мне список значений для одной комбинации Lat-Long.Как извлечь данные из растрового стека на основе длинного списка?

plist <- list.files(pattern = "\\.tif$", include.dirs = TRUE) 
pstack <- stack(plist) 
#levelplot(pstack) 

for (i in 1:length(plist)) 
    t[i]=extract(pstack[[i]], 35,-90) 

Как я могу это сделать тысячи мест, когда у меня есть Lat-длинные места в отдельном файле/dataframe. Существует местоположение ID, что я хочу, чтобы сохранить тоже в окончательном списке:

Lat Long LocID 
35 -90 001 
35 -95 221 
30 -95.4 226 
31.5 - 90 776 

Моя последняя цель состоит в том, чтобы иметь dataframe этого типа:

Lat Long LocID value 
35 -90 001 0.5 
35 -95 221 1.4 
30 -95.4 226 2.5 
31.5 - 90 776 4.5 

Хотя, если это не представляется возможным, чтобы сохранить LocID, это тоже хорошо.

Один из файлов: https://www.dropbox.com/s/ank4uxjbjk3chaz/new_conus.tif?dl=0


Тестирование решение от комментариев:

latlong<-structure(list(lon = c(-71.506667, -71.506667, -71.506667, -71.215278, 
-71.215278, -71.215278, -71.215278, -71.215278, -71.215278, -71.215278 
), lat = c(42.8575, 42.8575, 42.8575, 42.568056, 42.568056, 42.568056, 
42.568056, 42.568056, 42.568056, 42.568056)), .Names = c("lon", 
"lat"), row.names = c(NA, 10L), class = "data.frame") 

< доб -экстракта (pstack, LatLong)

дает

Error in UseMethod("extract_") : 
    no applicable method for 'extract_' applied to an object of class "c('RasterStack', 'Raster', 'RasterStackBrick', 'BasicRaster')" 

Обновление # 2:

Ошибка была связана с тем, что она противоречила другой упаковке. Это работает:

raster::extract(pstack,latlong) 
+0

Можете ли вы привести пример входных данных? – jdobres

+0

Я добавил. – maximusdooku

ответ

1

Я обычно не работаю с этим типом данных, но как об этом:

library(sp) 
library(raster) 
library(rgdal) 

# coordinate data 
coords <- read.table(text = 'Lat Long LocID 
35 -90 001 
35 -95 221 
30 -95.4 226 
31.5 -90 776', header = T) 

# list of all files 
plist <- c('~/Downloads/new_conus.tif', '~/Downloads/new_conus copy.tif') 

# image stack 
data.images <- stack(plist) 

# make a master data frame containing all necessary data 
data.master <- data.frame(file = rep(plist, each = nrow(coords)), file.id = rep(1:length(plist), each = nrow(coords)), coords) 

На данный момент, у нас есть кадр данных мастера, который выглядит следующим образом:

      file file.id Lat Long LocID 
1  ~/Downloads/new_conus.tif  1 35.0 -90.0  1 
2  ~/Downloads/new_conus.tif  1 35.0 -95.0 221 
3  ~/Downloads/new_conus.tif  1 30.0 -95.4 226 
4  ~/Downloads/new_conus.tif  1 31.5 -90.0 776 
5 ~/Downloads/new_conus copy.tif  2 35.0 -90.0  1 
6 ~/Downloads/new_conus copy.tif  2 35.0 -95.0 221 
7 ~/Downloads/new_conus copy.tif  2 30.0 -95.4 226 
8 ~/Downloads/new_conus copy.tif  2 31.5 -90.0 776 

Теперь мы просто извлечь значение, соответствующее данным в каждой строке кадра данных:

# extract values for each row in the master data frame 
data.master$value <- NA 
for (i in 1:nrow(data.master)) { 
    data.master$value[i] <- with(data.master, extract(data.images[[file.id[i]]], Lat[i], Long[i])) 
} 

          file file.id Lat Long LocID value 
1  ~/Downloads/new_conus.tif  1 35.0 -90.0  1 255 
2  ~/Downloads/new_conus.tif  1 35.0 -95.0 221 255 
3  ~/Downloads/new_conus.tif  1 30.0 -95.4 226 259 
4  ~/Downloads/new_conus.tif  1 31.5 -90.0 776 249 
5 ~/Downloads/new_conus copy.tif  2 35.0 -90.0  1 255 
6 ~/Downloads/new_conus copy.tif  2 35.0 -95.0 221 255 
7 ~/Downloads/new_conus copy.tif  2 30.0 -95.4 226 259 
8 ~/Downloads/new_conus copy.tif  2 31.5 -90.0 776 249 
1

Вы можете использовать функцию extract в библиотеке raster. Сначала вы читаете в своем кадре данных и выбираете столбцы lon, lat. Скажем, у вас есть dataframedat и растровый стопка pstack

loc <- dat[,c("long", "lat")] 
ext <- extract(pstack, loc) 
new_d <- cbind(dat, ext) # bind the extracted values back to the previous dataframe 
+0

Не могли бы вы проверить решение, которое я тестировал. Я получаю сообщение об ошибке: Ошибка в UseMethod ("extract_"): не применимый метод для 'extract_', примененный к объекту класса "c ('RasterStack', 'Raster', 'RasterStackBrick', 'BasicRaster')" – maximusdooku

+0

Вы уверены, что вы извлекаете координаты 'lon, lat' из' растрового стека'? Вы все еще получаете ошибки? –