首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将多个栅格的像素值提取到R中的相同csv

将多个栅格的像素值提取到R中的相同csv
EN

Stack Overflow用户
提问于 2021-02-04 21:05:43
回答 2查看 225关注 0票数 0

我有多个栅格散布在一个地区和一个shp与一些多边形的一些栅格。

like this image, there are many others

我希望在不丢失shp属性值的情况下,将每个图像中这些多边形的中值提取到一个相同的csv中。我可以一个接一个地做,但必须有一种自动化的方法。我尝试使用for循环,但返回的csv只有列表中图像的值1。

代码语言:javascript
复制
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,但没有成功:

代码语言:javascript
复制
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“。

任何有助于我理解的帮助和解释都将不胜感激。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-02-09 00:48:29

循环是不可避免的,但我将所有结果数据帧合并为一个。

代码语言:javascript
复制
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中的行。

票数 0
EN

Stack Overflow用户

发布于 2021-02-04 21:56:30

这行得通吗?在我的示例中,我使用了分辨率为100x100的Amersfoort CRS ("+init=epsg:28992")。确保将其更改为您的crs和首选值。

代码语言:javascript
复制
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() 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66046250

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档