【问题标题】:Classified raster images extract infos loop in R分类的光栅图像在 R 中提取信息循环
【发布时间】:2018-05-24 21:37:07
【问题描述】:

我有 800 个分类的光栅图像(7 个类别),一个图像的每个类别都需要以平方米计算。到目前为止,它适用于一张图像,但不适用于循环。我能做些什么来解决它?

report_files<-list(list of 800 tif files)
    for( i in report_files){
  reportfiles_single<-raster(report_files[i])
  df<-as.data.frame(table(reportfiles_single))
  df2<-as.data.frame(df$Freq*(0.070218*0.070218))
  {report_mean<- df2}
}

这件作品适用于一个人,并且有一个示例文件:https://ufile.io/rb7tj

a<-raster("test060707.tif")
val<-values(a)
table_val<-data.frame(val)
df<-as.data.frame(table(table_val))
df2<-as.data.frame(df$Freq*(0.070218*0.070218))

【问题讨论】:

  • 您能否提供一个可能包含 3 张图像的可重现示例并向我们提供您的数据?如果我们可以尝试在我们的机器上运行它,那么探索这个问题就容易多了。谢谢:)

标签: r loops for-loop classification r-raster


【解决方案1】:

您的循环不正确。你使用for( i in report_files){,但后来你使用i,就好像你有for( i in 1:length(report_files)){

在循环中执行table(reportfiles_single),而在您拥有的工作代码示例中,等效为table(values(reportfiles_single))

此外,您不会保留任何结果,因为您会在每次迭代中覆盖 report_mean

所以你真的应该从学习循环的工作原理开始,首先做一些简单的例子。

另外,您确定数据的空间分辨率约为 7 x 7 厘米吗?这是可能的,但似乎不太可能。

这是您可能会做的一个示例。我使用freq 方法是因为它是内存安全的,不像table(values())

library(raster)
f <- system.file("external/test.grd", package="raster")
report_files <- c(f, f, f)

res <- list()
for( i in 1:length(report_files)){
    r <- raster(report_files[i])
    # note the -2 for this example, you probably do not want that with your data
    f <- freq(r, digits= -2)
    cellsize <- prod(res(r))
    f[,2] <- f[,2] * cellsize
    res[[i]] <- f
}

您可以这样做,而不是使用循环:

s <- stack(report_files)
x <- freq(s, digits=-2)

稍后与单元格大小相乘。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-07
    • 2020-03-22
    • 2020-03-27
    • 1970-01-01
    相关资源
    最近更新 更多