我有多个栅格散布在一个地区和一个shp与一些多边形的一些栅格。
like this image, there are many others
我希望在不丢失shp属性值的情况下,将每个图像中这些多边形的中值提取到一个相同的csv中。我可以一个接一个地做,但必须有一种自动化的方法。我尝试使用for循环,但返回的csv只有列表中图像的值1。
dir<-"C:/Users"
listImages <- lapply(list.files(dir, pattern = ".tif$", full.names = TRUE), raster)
shp<-readOGR("shapefile.shp")
for(i in listImages) {
imgextr<-extract(i, shp, fun=median, df=TRUE )
write.csv(imgextr, file="test.csv")
}这就是我所能做到的最远的循环。我真的希望避免为每个光栅创建一个csv,这是很多的。我还尝试使用lapply,但没有成功:
extractor <- function(img){
imgextr<-extract(i, shp, fun=median, df=TRUE)
write.csv(imgextr, file = 'test.csv')))
}
lapply(listImages, FUN=extractor)在这里,我得到的错误是"Error in basename(a_csv):a character vector argument expected“。
任何有助于我理解的帮助和解释都将不胜感激。
发布于 2021-02-09 00:48:29
循环是不可避免的,但我将所有结果数据帧合并为一个。
library(raster)
library(rgdal)
# List tif files
Files <- list.files(pattern = ".tif")
# Read shapefile with quadrats
uav <- readOGR("shapefile.shp")
# Name your output variable
# Raster Layer requires one value
# For RasterStack or Raster Brick, a value per layer
VAR = "median_ndvi"
# List collecting results of every run
DF <- list()
# Collecting information in a loop
for(i in Files) DF[[i]] <- {
r <- raster(i)
names(r) <- VAR # set a standard name for the layer
imgext <- extract(x = r, y = uav, fun = median, df = TRUE)
# Discard NA values
imgext <- imgext[!is.na(imgext[ , VAR]),]
imgext
}
# Since all data frames have the same columns
# you can call 'rbind()'
DF <- do.call(rbind, DF)编辑:相对于以前的版本,我将答案简化了一点。使用VAR命名输出变量,而ID对应于输入SpatialPolygonsDataFrame中的行。
发布于 2021-02-04 21:56:30
这行得通吗?在我的示例中,我使用了分辨率为100x100的Amersfoort CRS ("+init=epsg:28992")。确保将其更改为您的crs和首选值。
library(sf)
library(raster)
library(exactextractr)
library(data.table)
library(tidyr)
calc_median <- function(){
#list raster files
listImages <- lapply(list.files(dir, pattern = ".nc$", full.names = TRUE), raster)
#create a mask (defined resolution, same extend and crs as shapefile)
RasterMask <- raster() #create raster
extent(RasterMask) <- extent(shp) #set extent to extent of shapefile
res(RasterMask) <- c(100, 100) #define resolution
crs(RasterMask) <- CRS("+init=epsg:28992") #set crs
#create a list to bind results to
result <- list() #create list
#calculate median values using a for loop
for(i in listImages){
#read raster file
rasterfile <- i
#convert raster file to crs of rastermask
rasterfile <- projectRaster(rasterfile, RasterMask, crs = crs(RasterMask))
#extract median value for polygon
poly_extract <- copy(shp) #copy shapefile
poly_extract$Median <- exact_extract(rasterfile, poly_extract, 'median') #extract median value
poly_extract$Raster <- names(rasterfile) #add name of raster file
result[[names(i)]] <- poly_extract #add results to list
}
#rbind results, convert to data table in the process (for pivot_wider)
result_bind <- setDT(do.call(rbind, result))
#pivot_wider results (for overview)
result_reordered <- pivot_wider(result_bind, names_from = Raster, values_from = Median)
#return result
return(result_reordered)
}
#run function. You can save it using fwrite if you want.
median_values <- calc_median() https://stackoverflow.com/questions/66046250
复制相似问题