R 在第二层/属性上提取具有缓冲条件的光栅平均值

R 在第二层/属性上提取具有缓冲条件的光栅平均值,r,buffer,raster,spatial,r-stars,R,Buffer,Raster,Spatial,R Stars,我有一个stars对象也可以格式化为光栅: stars object with 2 dimensions and 2 attributes attribute(s): LST_mean elevation Min. :14.98 Min. :296.0 1st Qu.:16.89 1st Qu.:346.9 Median :17.64 Median :389.3 Mean :17.52 Mean :389.2

我有一个stars对象也可以格式化为光栅:

stars object with 2 dimensions and 2 attributes
attribute(s):
   LST_mean        elevation    
 Min.   :14.98   Min.   :296.0  
 1st Qu.:16.89   1st Qu.:346.9  
 Median :17.64   Median :389.3  
 Mean   :17.52   Mean   :389.2  
 3rd Qu.:18.18   3rd Qu.:428.3  
 Max.   :20.11   Max.   :521.6  
dimension(s):
  from to  offset    delta                       refsys point values    
x   71 83 4387654  860.241 DHDN / 3-degree Gauss-Kru... FALSE   NULL [x]
y   33 41 5598885 -860.241 DHDN / 3-degree Gauss-Kru... FALSE   NULL [y]
对于光栅,它有两个属性层:温度和高程。 使用温度,我想选择位于缓冲区内的像素并返回平均值,仅用于每次与所考虑的像素的高差小于90米的像素

有什么办法吗? 计算缓冲区内像素的平均值非常容易,但我找不到对它们设置任何条件的方法


我将永远感谢你的帮助和建议。使用SATR以外的其他软件包的方法也非常受欢迎:

请参见下面使用terra的解决方案。代码使用terra::extract创建两个对应的列表:

像素值 周围的缓冲区值 随后,使用与您建议的类似的函数,使用mapply成对处理这些值

这是我第一次使用terra,但terra::extract似乎比raster::extract快得多,因此,即使对于大型光栅,此解决方案也可能是可行的

创建示例数据:

图书馆 图书馆地 r=rastncol=ncolvolcano,nrow=nrow火山,xmin=0,xmax=ncolvolcano,ymin=0,ymax=nrow火山 valuesr=火山 s=r s[]=RNORMNCELL r=cr,s crsr= 绘图仪 计算缓冲区:

pnt=as.pointsr,值=FALSE pol=缓冲PNT,10 从点提取光栅值:

x=提取器,pnt 海德克斯 从缓冲区提取光栅值:

y=提取器,pol 令人兴奋的 现在,可以使用mapply按顺序处理提取的值。 首先,我们将对象转换为列表:

x=as.data.framex x=splitx,x$ID y=as.data.framey y=splity,y$ID 接下来,我们每次都使用mapply进行必要的计算 考虑当前焦点值x和周围缓冲区 y值:

f=函数x,y{ d=absx[,2]-y[,2]差异 值=y[,3]个值 平均值[d<5],na.rm=子集的真实平均值 } 结果=mapplyf,x,y 最后,将结果放回光栅模板:

u=r[[1]] 值su=结果 普洛图
嗨,听起来是个有趣的问题!不确定我是否理解,请选择位于缓冲区内的像素并返回平均值,仅针对每次与所考虑的像素的高差小于90米的像素-请澄清所考虑的像素是什么?你的意思是创建一个循环吗?缓冲一个特定的像素,然后根据海拔差异从缓冲区内的像素子集中取平均值?是的,这正是我的意思。我正在一个像素上尝试此功能:temp_表示我理解,谢谢!如果光栅不是太大,您建议的循环方法是一个不错的选择,因此这实际上是数据大小和内存限制的问题。这种循环方法可以通过1预先计算循环外部的所有缓冲区多边形,2使用并行处理来改进。我有另一个想法,我会尝试把它发展成一个答案,同时你能分享一些细节吗?真实应用中的尺寸、分辨率和缓冲区大小是多少?或者甚至发布一个光栅的示例?感谢我要应用此功能的光栅是2003年至2019年巴伐利亚州的MODIS LST产品:尺寸:从到偏移delta refsys点值x 1 408 4284425 860.124+proj=tmerc+lat_0=0+lon。。。假空y 1 426 5604907-860.358+proj=tmerc+lat_0=0+lon。。。假空,因此它是每年173808像素/光栅。我将上传子集,我正在尝试在主后96像素汉克斯现在!请看下面的一种方法,你可以在你的光栅上测试它,首先使用rast函数将它们转换成两个波段的terra对象,或者直接从文件中读取,然后修改示例中的缓冲区大小为10,示例中的提升阈值为5。非常感谢,我认为它工作得非常好!我在一个更大的数据子集上试用了它,大约占大光栅的10%,有一个47公里的大缓冲区,它运行得相当快,没有对它进行基准测试,但我认为它只需要20分钟左右。我从未想过使用Terra,并像你一样使用它:
##      ID lyr.1       lyr.1
## [1,]  1   100 -0.03525223
## [2,]  2   100  0.31525467
## [3,]  3   101  0.94054608
## [4,]  4   101  0.37209238
## [5,]  5   101 -0.38388234
## [6,]  6   101 -0.03120593
##      ID lyr.1       lyr.1
## [1,]  1   100 -0.03525223
## [2,]  1   100  0.31525467
## [3,]  1   101  0.94054608
## [4,]  1   101  0.37209238
## [5,]  1   101 -0.38388234
## [6,]  1   101 -0.03120593