【问题标题】:How do I address R raster mosaic error: 'data' must be of a vector type, was 'NULL'?如何解决 R 光栅镶嵌错误:“数据”必须是矢量类型,是否为“NULL”?
【发布时间】:2018-12-13 15:57:19
【问题描述】:

我有一个大小不同但尺寸和分辨率相同的栅格列表。我试图将它们拼接在一起以创建一个栅格,因为我必须计算欧几里得距离,并且当它们被分割时它没有意义。我已经阅读了有关光栅镶嵌的其他问题(例如添加 names(ras_list)<-NULLras_list <- ras_list[lapply(ras_list,length)>0]),但我一直收到消息

“矩阵错误(unlist(ini), ncol = 2, byrow = TRUE) : 'data' 必须是向量类型,为 'NULL' 调用:do.call ... .rasterObjectFromFile - > .rasterFromRasterFile -> readIniFile -> 矩阵"

我的代码sn-p:

library(raster)
library(rgdal)
rnames<-list.files(path=".", pattern="*.tif")
ras_list<-list()
for (i in 1:length(rnames)){
  ras_list[[i]]<-raster(rnames[i])
}
names(ras_list) <- NULL
ras_list$fun <- mean
ras_list <- ras_list[lapply(ras_list,length)>0]
rast_mosaic <- do.call(mosaic,ras_list)
writeRaster(rast_mosaic, filename="ALL_00N.tif", format="GTiff", overwrite=TRUE)

执行 typeof(ras_list[[i]]) 为每个返回 S4。 谢谢。

编辑:添加 dput(ras_list[[1]]):

new("RasterLayer"
    , file = new(".RasterFile"
    , name = "[hidden]/output_00N_000E_010E.tif"
    , datanotation = "FLT4S"
    , byteorder = "little"
    , nodatavalue = -Inf
    , NAchanged = FALSE
    , nbands = 1L
    , bandorder = "BIL"
    , offset = 0L
    , toptobottom = TRUE
    , blockrows = 1L
    , blockcols = 72001L
    , driver = "gdal"
    , open = FALSE
)
    , data = new(".SingleLayerData"
    , values = logical(0)
    , offset = 0
    , gain = 1
    , inmemory = FALSE
    , fromdisk = TRUE
    , isfactor = FALSE
    , attributes = list()
    , haveminmax = TRUE
    , min = 0
    , max = 100
    , band = 1L
    , unit = ""
    , names = "output_00N_000E_010E"
)
    , legend = new(".RasterLegend"
    , type = character(0)
    , values = logical(0)
    , color = logical(0)
    , names = logical(0)
    , colortable = logical(0)
)
    , title = character(0)
    , extent = new("Extent"
    , xmin = -0.000138889
    , xmax = 20.000138889
    , ymin = -10.000138889
    , ymax = 0.000138889
)
    , rotated = FALSE
    , rotation = new(".Rotation"
    , geotrans = numeric(0)
    , transfun = function () 
NULL
)
    , ncols = 72001L
    , nrows = 36001L
    , crs = new("CRS"
    , projargs = "+proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0"
)
    , history = list()
    , z = list()
)

【问题讨论】:

  • 能否提供使用的数据? dput(data) 应该可以。
  • @NelsonGon 嗨,我在上面添加了它。抱歉,篇幅较长。谢谢!

标签: r gis raster mosaic


【解决方案1】:

这究竟发生在哪里?它在读取输入文件(但不是 tif 文件)时看起来。我的猜测是您包含的文件名不正确。我已将参数更改为 list.files 以可能解决该问题,并提出了一些其他建议。

library(raster)
library(rgdal)
rnames <- list.files(path=".", pattern="\\.tif$")
ras_list <- lapply(rnames, raster)
names(ras_list) <- NULL
ras_list$fun <- mean
ras_list$filename="ALL_00N.tif"
ras_list$overwrite = TRUE
rast_mosaic <- do.call(mosaic,ras_list)

如果这没有帮助,请说明发生这种情况的确切位置。如果它在lapply 中,那么你应该回到你拥有的循环,看看哪个文件是罪魁祸首。

【讨论】:

  • 感谢@Robert Hijmans,我按照您的建议改进了我的代码。虽然他们没有直接解决错误,但它帮助我找出问题并检查每个文件(乏味但必要)。一些栅格在地理上相距太远而无法链接在一起,这会在将镶嵌到一张图像中产生问题,或者我认为是这样。我把它们分成更小的马赛克,这运行得很好。这只是意味着我必须连接更多。 (每个大约 1GB)。感谢您的帮助。
猜你喜欢
  • 2018-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-07
  • 2020-09-04
  • 1970-01-01
  • 2021-08-01
相关资源
最近更新 更多