【问题标题】:raster in R: Operation with extract() using pixel valuesR中的栅格:使用像素值进行提取()操作
【发布时间】:2020-09-18 21:45:36
【问题描述】:

我想使用extract() 在给定栅格中的某些坐标的情况下计算缓冲区内具有“1”值的像素百分比 (ras)。

在我的例子中:

#Packages
library(raster)

# Create a raster 
ras <- raster(ncol=1000, nrow=1000)
set.seed(0)
values(ras) <- runif(ncell(ras))
values(ras)[values(ras) > 0.5] = 1 
values(ras)[values(ras) < 0.5] = NA
ras
#class      : RasterLayer 
#dimensions : 1000, 1000, 1e+06  (nrow, ncol, ncell)
#resolution : 0.36, 0.18  (x, y)
#extent     : -180, 180, -90, 90  (xmin, xmax, ymin, ymax)
#crs        : +proj=longlat +datum=WGS84 +no_defs 
#source     : memory
#names      : layer 
#values     : 1, 1  (min, max)

# Create some 30 coordinates
pts<-sampleRandom(ras, size=30, xy=TRUE)
pts.df<-as.data.frame(pts)
pts.df$area<-rnorm(30, mean=10)
head(pts.df)
#        x      y layer      area
#1 -109.26 -43.65     1 10.349010
#2   93.42 -87.21     1  9.861920
#3   57.06  86.85     1  8.642071
#4 -109.98 -45.63     1 10.376485
#5  -92.34  37.89     1 10.375138
#6   19.62  21.51     1  8.963949

#Representation
plot(ras)
points(cbind(pts.df$x,pts.df$y))

#Function for extract percentual 1s
perc1<- function(x,...) {
  leng1<-length(values(x) ==1) # length of 1s pixels
  lengtotal<-length(x) # total length of pixels inside buffer
  perc<-(leng1/lengtotal)*100
  return(perc)
}

# Extract circular, 100000 units buffer
cent_max <- raster::extract(ras, # raster layer
    cbind(pts.df$x,pts.df$y),    # SPDF with centroids for buffer
    buffer = 100000,                 # buffer size
    fun=perc1,                  # what to value to extract
    df=TRUE) 

这里我需要一个编程问题的帮助,因为perc1 函数不起作用。我想用extract()创建一个新列(percentual_1s),占像素的百分比 具有“1”的值。我需要一些方向来计算每个 100000 单位缓冲区 *100 内像素总数为“1”值的像素(“1”s 值和 NA)除以 length()。我的理想 输出是:

#        x      y layer      area   percentual_1s
#1 -109.26 -43.65     1 10.349010   23.15
#2   93.42 -87.21     1  9.861920   45.18
#3   57.06  86.85     1  8.642071   74.32
#4 -109.98 -45.63     1 10.376485   11.56
#5  -92.34  37.89     1 10.375138   56.89
#6   19.62  21.51     1  8.963949   88.15

请问有什么想法吗?

【问题讨论】:

  • 您的数据真的遍布全球吗?一个 20 米的缓冲区小于一个栅格像元的面积。 raster::extract 不会返回任何部分覆盖的内容。
  • Bad Karma,但我更改了 de 缓冲区值。谢谢@at80

标签: r raster r-raster


【解决方案1】:

如下调整你的提取函数:

percentual_1s<- function(x,...) {
  leng1<-length(which(x==1))
  lengtotal<-length(x) 
  perc<-(leng1/lengtotal)*100
  return(perc)
}

并在提取调用中添加“na.rm = FALSE”:

cent_max <- extract(ras, pts[,1:2], buffer = 1000000, fun=percentual_1s, df=TRUE, na.rm = FALSE)

这给了我:

head(cent_max)
  ID    layer
1  1 49.81865
2  2 50.27545
3  3 50.03113
4  4 50.29819
5  5 50.39391
6  6 48.89556

解决方法在:https://stat.ethz.ch/pipermail/r-sig-geo/2020-September/028437.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-06
    • 2014-06-22
    • 2021-05-08
    • 1970-01-01
    • 1970-01-01
    • 2019-05-20
    • 1970-01-01
    相关资源
    最近更新 更多