Сбой мозаики при чтении растров с диска, но не из памяти
Я столкнулся со странной проблемой, пытаясь сделать мозаику из нескольких сотен растров. Снимки со спутника, которые я использую, не идеально выровнены или имеют одинаковое разрешение, поэтому я выполнил шаги, найденные здесь, чтобы заново сэмплировать свои растры и затем нанести их на мозаику.
Я начал тестирование с подмножества только из четырех изображений, и у меня не возникло проблем с этим (пришлось вручную рассчитывать полный экстент, так как unionExtent
и новее union
допускает только два аргумента экстента):
# Reading raster files
rst <- lapply(list.files(), FUN = stack)
# Extracting individual extents
rst_ext <- lapply(rst, FUN = extent)
# Calculating full extent
xmin_rst <- c(); xmax_rst <- c(); ymin_rst <- c(); ymax_rst <- c();
for (i in 1:length(rst_ext)) {
xmin_rst <- c(xmin_rst, rst_ext[[i]]@xmin)
ymin_rst <- c(ymin_rst, rst_ext[[i]]@ymin)
xmax_rst <- c(xmax_rst, rst_ext[[i]]@xmax)
ymax_rst <- c(ymax_rst, rst_ext[[i]]@ymax)
}
full_extent <- extent(min(xmin_rst), max(xmax_rst),
min(ymin_rst), max(ymax_rst))
# Creating raster from full extent and first rasters' CRS and resolution
bounding_rst <- raster(full_extent,
crs = crs(rst[[1]]),
res = res(rst[[1]]))
# Resampling rasters to match attributes of the bounding raster
rst_resampled <- lapply(X = rst, fun = function(x) {
target_rst <- crop(bounding_rst, x)
resample(x, target_rst, method="bilinear")
})
# Creating mosaic
rst_mosaic <- do.call("mosaic", c(rst_resampled, fun = mean))
Это сработало хорошо, но, конечно, я не хотел сохранять все эти растры в моей памяти, так как у меня кончились все это. Я решил сохранить их в новой папке и перечитать их как stack
, а затем сделать мозаику.
# Function to crop, resample and write to a new GeoTIFF
resample_write <- function(x) {
target_rst <- crop(bounding_rst, x)
x <- resample(x, target_rst, method="bilinear")
save_name <- gsub("\\.1",
"_resampled.tif",
names(x)[1]) # Modifying name of 1st band
writeRaster(x,
filename = paste("../testing_resampling/",
save_name, sep = ""),
format = "GTiff")
}
# Running the function
lapply(rst, FUN = resample_write)
# Reading resampled images
setwd("../testing_resampling/")
rst_resampled2 <- lapply(list.files(), FUN = stack)
## Making the mosaic
rst_mosaic2 <- do.call("mosaic", c(rst_resampled2, fun = mean))
Это дает следующую ошибку:
> rst_mosaic2 <- do.call("mosaic", c(rst_resampled2, fun = mean))
Error in compareRaster(x, extent = FALSE, rowcol = FALSE, orig = TRUE, :
different origin
Я смог обойти это, установив увеличивающийся аргумент толерантности mosaic
в 0.4
но до сих пор не понимаю, почему rst_resampled1
а также rst_resampled2
давать разные mosaic
Результаты.
Сравнивая их обоих с compareRaster
а также cellStats
говорит мне, что они точно такие же.