R Урожай нет данных растра

Я хотел бы обрезать часть без данных некоторых растров (пример изображения в 1, где нет данных в черном цвете) без определения экстента вручную.

Любая идея?

изображение без данных

5 ответов

Решение

Ты можешь использовать trim для этого:

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

[ подмножество и [<- методы замены определены для raster объекты, так что вы можете просто сделать r[ r[] == 1 ] <- NA чтобы избавиться от ценностей, где 1 ваше значение нодата (используйте NAvalue(r) выяснить, что R считает вашим значением nodata, если вы не уверены).

Обратите внимание, что вы должны использовать r[] внутри [ команда поднабора для доступа к значениям. Вот рабочий пример...

пример

#  Make a raster from system file
logo1 <- raster(system.file("external/rlogo.grd", package="raster"))

#  Copy to see difference
logo2 <- logo1

#  Set all values in logo2 that are > 230 to be NA
logo2[ logo2[] > 230 ] <- NA

#  Observe difference
par( mfrow = c( 1,2 ) )
plot(logo1)
plot(logo2)

У меня есть 2 немного разных решения. Первый требует ручного определения экстента, но использует предопределенные функции. Второй более автоматический, но немного более ручной работы.

Создайте воспроизводимый растр, для которого первые 2 строки - 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)

Решение № 1

Вручную получить экстент из построенной фигуры, используя drawExtent()

plot(r1)
r1CropExtent <- drawExtent()

Обрезать растр, используя экстент, выбранный на рисунке

r2 <- crop(r1, r1CropExtent)

Участок для сравнения

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

Решение № 2

Он идентифицирует строки и столбцы растра, которые имеют только значения NA, и удаляет те, которые находятся на границе растра. Затем рассчитайте экстент, используя extent(),

Преобразуйте растр в матрицу, которая определяет, являются ли значения NA или нет.

r1NaM <- is.na(as.matrix(r1))

Найдите столбцы и строки, которые не полностью заполнены NA

colNotNA <- which(colSums(r1NaM) != nrow(r1))
rowNotNA <- which(rowSums(r1NaM) != ncol(r1))

Найдите экстент нового растра, используя первые и последние столбцы и строки, которые не полностью заполнены сетевыми элементами. использование crop() обрезать новый растр.

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)

Если вы используете rasterVis пакет (любая версия после 25 июня 2021 г.), то он автоматически обрежет NA ценности вне

Установите версию для разработки с GitHub

      remotes::install_github("oscarperpinan/rastervis")
      library(raster)
library(terra)
library(rasterVis)

# 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)

для r1

      rasterVis::levelplot(r1,
                     margin = list(axis = TRUE))

Перевести в terra's SpatRaster затем снова построить график, используя levelplot()

      r2 <- rast(r1)
rasterVis::levelplot(r2,
                     margin = list(axis = TRUE))

Создано 26.06.2021 пакетом REPEX (v2.0.0)

Другие вопросы по тегам