【问题标题】:Calculate majority using circular moving window on categorical data in R使用 R 中分类数据的圆形移动窗口计算多数
【发布时间】:2019-07-01 00:54:51
【问题描述】:

我正在尝试计算 R 中分类栅格数据集中的多数值,例如使用土地覆盖数据。这类似于 ArcGIS 中使用多数统计的焦点统计工具。我可以使用矩形移动窗口和模态函数计算大部分土地覆盖类型:

library(raster)

# create data
r <- raster(nrows = 120, ncol = 120, xmn=0)
r[] <- sample(3, ncell(r), replace=TRUE)

a<-focal(r, w=matrix(1,3,3), fun=modal)    # 3x3 moving window
plot(a)

但是,当我应用焦点权重来定义我的圆形移动窗口时,输出值似乎被视为连续数字而不是离散值,即使我将栅格转换为因子:

#convert to a factor factor
r.f<-as.factor(r)
#set up window
fw <- focalWeight(r.f, 4.5, type='circle')
#apply focal fxn
r.f.focal<-focal(r.f, w=fw, fun=modal, na.rm=TRUE) 

似乎零可能会添加到分析中,这就是造成问题的原因。谁能引导我朝着正确的方向前进?

【问题讨论】:

  • 您的栅格 crs 当前位于“+proj=longlat +datum=WGS84 +ellps=WGS84 +towgs84=0,0,0”中。如果你将 focusWeight 中的 d 减少到类似于“0.001”的值,结果看起来还不错。
  • 感谢@PhilippGärtner。我没有注意 crs - 这只是我为一个可重现的例子而努力的。当我对我的预计土地覆盖数据执行焦点功能时,我仍然遇到问题。

标签: r raster categorical-data


【解决方案1】:

我认为如果 d(现在是 4.5)是一个整数,它将被修复。您定义的半径应基于单元格计数 (1,2,3,...,n)。然而,输出仍然是浮点格式,因为内核中的每个xij 都是一个浮点数,总和为1。要实现整数输出,还有第三种选择。

library(raster)

set.seed(070319)
# create data
r <- raster(nrows = 120, ncol = 120, xmn=0)
r[] <- sample(3, ncell(r), replace=TRUE)
a<-focal(r, w=matrix(1,3,3), fun=modal)    # 3x3 moving window

par(mfrow=c(1,2)) 
plot(r)
plot(a)

#set up window
fw <- focalWeight(r, 4, type='circle')
#apply focal fxn
r.f.focal<-focal(r, w=fw, fun=modal, na.rm=TRUE)

par(mfrow=c(1,2)) 
plot(r)
plot(r.f.focal)

对于整数输出,您也可以这样做:

#set up window
fw <- ceiling(focalWeight(r, 4, type='circle'))#for integer output
#apply focal fxn
r.f.focal<-focal(r, w=fw, fun=modal, na.rm=TRUE)

par(mfrow=c(1,2), oma=c(0,0,0,1)) 
plot(r)
plot(r.f.focal)

【讨论】:

  • 谢谢@Majid。天花板函数是整数数据的关键成分。我确实注意到检查 fw 的架构/形状很重要。如果角落范围内的零太多,则焦点函数会将零引入输出。我假设焦点 fxn 会丢失像素并分配零?
  • 不用担心蒂姆。是的,这是真的!如果输入数据中有零(即'r[] fw 中的零(如 fw[fw == 0] &lt;- NA)来绕过它。如果您有更多问题,请发布一个新问题,我很乐意提供帮助:)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-09
相关资源
最近更新 更多