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)