R没有光栅的数据

R没有光栅的数据,r,crop,raster,no-data,R,Crop,Raster,No Data,我希望在不手动定义范围的情况下裁剪某些光栅的无数据部分(无数据为黑色的图像示例) 有什么想法吗 [子集设置和[我有两种稍有不同的解决方案。第一种解决方案需要手动识别区段,但使用预定义的函数。第二种解决方案更自动化,但更手工 创建前两行为NA的可复制光栅 library(raster) # Create a reproducible example r1 <- raster(ncol=10, nrow=10) # The first 2 rows are filled with NAs (n

我希望在不手动定义范围的情况下裁剪某些光栅的无数据部分(无数据为黑色的图像示例)

有什么想法吗


[
子集设置和
[我有两种稍有不同的解决方案。第一种解决方案需要手动识别区段,但使用预定义的函数。第二种解决方案更自动化,但更手工

创建前两行为NA的可复制光栅

library(raster)
# Create a reproducible example
r1 <- raster(ncol=10, nrow=10)
# The first 2 rows are filled with NAs (no value)
r1[] <- c(rep(NA,20),21:100)
解决方案#2 它标识光栅中只有NA值的行和列,并删除光栅边距上的行和列。然后使用
extent()
计算范围

将光栅转换为矩阵,以标识值是否为NA

r1NaM <- is.na(as.matrix(r1))
绘制光栅以进行比较

layout(matrix(1:2, nrow=1))
plot(r1)
plot(r3)

我根据Marie的回答编写了一个小函数,用于快速打印裁剪的光栅。但是,如果光栅非常大,可能会出现内存问题,因为计算机可能没有足够的RAM将光栅作为矩阵加载

因此,我编写了一个内存安全函数,如果计算机有足够的RAM(因为这是最快的方法),它将使用Marie的方法;如果计算机没有足够的RAM,它将使用基于光栅函数的方法(速度较慢,但内存安全)

以下是函数:

plotCroppedRaster <- function(x, na.value = NA)
{
  if(!is.na(na.value))
  {
    x[x == na.value] <- NA
  }
  if(canProcessInMemory(x, n = 2))
  {
    x.matrix <- is.na(as.matrix(x))
    colNotNA <- which(colSums(x.matrix) != nrow(x))
    rowNotNA <- which(rowSums(x.matrix) != ncol(x))

    croppedExtent <- extent(x, 
                            r1 = rowNotNA[1], 
                            r2 = rowNotNA[length(rowNotNA)],
                            c1 = colNotNA[1], 
                            c2 = colNotNA[length(colNotNA)])

    plot(crop(x, croppedExtent))
  } else
  {
    xNA <- is.na(x)
    colNotNA <- which(colSums(xNA) != nrow(x))
    rowNotNA <- which(rowSums(xNA) != ncol(x))

    croppedExtent <- extent(x, 
                            r1 = rowNotNA[1], 
                            r2 = rowNotNA[length(rowNotNA)],
                            c1 = colNotNA[1], 
                            c2 = colNotNA[length(colNotNA)])

    plot(crop(x, croppedExtent))
  }
}

plotcropedmaster您可以使用
trim
进行以下操作:

library(raster)
r <- raster(ncol=18,nrow=18)
r[39:49] <- 1
r[205] <- 6
s <- trim(r) 
库(光栅)

r请查看我在下面的帖子,以便下次提供一个可复制的示例来说明您的问题。谢谢。总是有可能出现“无数据”的情况图像内部的值。那么您想做什么?@Carl:在我的情况下,图像内部没有数据。我只想根据数据可用的左上角和右下角裁剪图像。@Wraf下面的内容对您有帮助吗?如果没有,为什么没有?请描述尚未解决的问题,我将更新我的解决方案。加油s、 谢谢你的帮助。在我的例子中,我总是有一个带数据的中心连续区域,没有数据在外部。但实际上,你的例子是解决方案#2很好,但你应该反转ncol和nrow有一个错误…我已经完成了编辑,现在是correct@WAF:你是对的,这是一个输入错误。解决方案#2现在应该是正确的。我发现e> 修剪
非常缓慢,但玛丽·奥格·梅斯的解决方案#2在下面完美而快速地发挥了作用。
r1NaM <- is.na(as.matrix(r1))
colNotNA <- which(colSums(r1NaM) != nrow(r1))
rowNotNA <- which(rowSums(r1NaM) != ncol(r1))
r3Extent <- extent(r1, rowNotNA[1], rowNotNA[length(rowNotNA)],
   colNotNA[1], colNotNA[length(colNotNA)])
r3 <- crop(r1, r3Extent)
layout(matrix(1:2, nrow=1))
plot(r1)
plot(r3)
plotCroppedRaster <- function(x, na.value = NA)
{
  if(!is.na(na.value))
  {
    x[x == na.value] <- NA
  }
  if(canProcessInMemory(x, n = 2))
  {
    x.matrix <- is.na(as.matrix(x))
    colNotNA <- which(colSums(x.matrix) != nrow(x))
    rowNotNA <- which(rowSums(x.matrix) != ncol(x))

    croppedExtent <- extent(x, 
                            r1 = rowNotNA[1], 
                            r2 = rowNotNA[length(rowNotNA)],
                            c1 = colNotNA[1], 
                            c2 = colNotNA[length(colNotNA)])

    plot(crop(x, croppedExtent))
  } else
  {
    xNA <- is.na(x)
    colNotNA <- which(colSums(xNA) != nrow(x))
    rowNotNA <- which(rowSums(xNA) != ncol(x))

    croppedExtent <- extent(x, 
                            r1 = rowNotNA[1], 
                            r2 = rowNotNA[length(rowNotNA)],
                            c1 = colNotNA[1], 
                            c2 = colNotNA[length(colNotNA)])

    plot(crop(x, croppedExtent))
  }
}
library(raster)
r1 <- raster(ncol=10, nrow=10)
r1[] <- c(rep(NA,20),21:100)

# Uncropped
plot(r1)
# Cropped
plotCroppedRaster(r1)

# If the no-data value is different, for example 0
r2 <- raster(ncol=10, nrow=10)
r2[] <- c(rep(0,20),21:100)

# Uncropped
plot(r2)
# Cropped
plotCroppedRaster(r2, na.value = 0)
library(raster)
r <- raster(ncol=18,nrow=18)
r[39:49] <- 1
r[205] <- 6
s <- trim(r)