【问题标题】:Extract pixel values for multiple rasters to the same csv in R将多个栅格的像素值提取到 R 中的相同 csv
【发布时间】:2021-05-08 18:58:03
【问题描述】:

我有多个栅格分散在一个区域上,一个 shp 在一些栅格上具有多个多边形。

like this image, there are many others

我想将每个图像中这些多边形的中值提取到一个相同的 csv 中,而不会丢失 shp 的属性值。我可以一个一个地做,但必须有一种方法来自动化它。我尝试使用 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)

这里我得到的错误是“basename(a_csv) 中的错误:预期的字符向量参数”

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

【问题讨论】:

    标签: r loops csv


    【解决方案1】:

    这行得通吗?在我的示例中,我使用了分辨率为 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() 
    

    【讨论】:

    • 感谢您的回答!我不能让它工作。我得到“错误(函数(类,fdef,mtable):无法为签名'“RasterLayer”,“SpatialPolygonsDataFrame”'找到函数'exact_extract'的继承方法。我已将crs更改为32632,并将res更改为10x10。更详细一点,每张图片的分辨率为 10x10 厘米,shapefile 是一个多部分多边形,有 1490 条记录,并且并非所有这些都与图像重叠。
    • 如果将您的 spatialpolygonsdataframe 转换为 sf 对象可能会有所帮助(我认为这可以通过运行 shp
    【解决方案2】:

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

    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 中的行。

    【讨论】:

      猜你喜欢
      • 2022-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多