Сводка и гистограмма большого растрового слоя - PullRequest
0 голосов
/ 16 октября 2018

Я очень новичок в R и у меня есть несколько вопросов относительно большого растрового слоя (Barrow_DEM.tif, 2,5 ГБ), содержащего модель рельефа.Дополнительно имеется файл формы (Barrow_DTLB.shp) с 10 полигонами, для которого я хочу получить данные высот из растра.Оба файла имеют одинаковое пространственное расширение и правильные координаты, проекцию и т. Д.

`setwd("...")
Barrow_DEM <- raster("Barrow_DEM.tif")
Barrow_DTLB <- st_read("Barrow_DTLB.shp")
Barrow_DTLB_Buffer <- st_read("Barrow_DTLB_BufferOUT.shp")
Barrow_lake <- crop(Barrow_DEM, extent(Barrow_DTLB))
raster_lake <- rasterize(Barrow_DTLB, Barrow_lake, mask = TRUE)
summary(raster_lake)`

Результат отображается следующим образом:

summary(raster_lake)
        layer
Min.        0
1st Qu.     2
Median      3
3rd Qu.     8
Max.       12
NA's        0
Warning message:
In .local(object, ...) :
  summary is an estimate based on a sample of 1e+05 cells (0.02% of all cells)

Результат для гистограммы следующий:

hist(raster_lake, col=rgb(0,0,1,0.5),  breaks=100, ylab= "Frequency", xlab= "Height", main= "Histogram DTLB Barrow")
Warning message: In .hist1(x, maxpixels = maxpixels, main = main, plot = plot, ...) :
  0% of the raster cells were used (of which 92% were NA). 7651 values used

Я уже пробовал это из другого обсуждения здесь, но это не помогло мне.replaceNA <- function(x, na.rm, ...){ if(is.na(x[1])) return(0) else return(x) } raster_lake <- calc(raster_lake, fun = replaceNA)

Кажется, что все значения данных в новом файле raster_lake, которые находятся за пределами полигонов, получили значение NA.Как мне избавиться от этих NA?Я хотел бы получить полную гистограмму, а также некоторые статистические данные, такие как медиана, среднее, минимальное, максимальное для всех многоугольников и для каждого многоугольника отдельно.

Ответы [ 3 ]

0 голосов
/ 19 июня 2019

Опция ff не будет работать, потому что сначала выполняются getValues ​​() или values ​​().Вам все еще не хватит памяти.Единственный вариант, который, я думаю, у вас есть, - это разделить ваш большой растр на тайлы, вычислить гистограмму для каждого тайла с использованием предопределенных разрывов, а затем объединить гистограмму тайлов.Или получите компьютер с гораздо большей оперативной памятью!

0 голосов
/ 19 июня 2019

Вы можете попробовать:

library(raster)

v  <- getValues(raster_lake) # extract values from raster layer into a vector
v2 <- v[!is.na(v)]           # remove NA values from the vector

length(v); length(v2)        # prove that the second object is smaller
hist(v2)
0 голосов
/ 16 октября 2018

Если я правильно понял, вы хотели бы вычислить гистограмму растровых значений при удалении NA.

Вы можете извлечь растровые значения, удалить NA и составить гистограмму значений:

require(raster)
require(sp)
require(gstat)

# load some data and make a raster object
data(meuse.grid)
meuse.grid <- data.frame(x =meuse.grid$y , y =meuse.grid$x , val = meuse.grid$dist)
coordinates(meuse.grid) <- ~x+y
gridded(meuse.grid) <- T
meuse.grid <- raster(meuse.grid)

# get the values from the raster, remove the NA's and make an histogram
hist(na.omit(getValues(meuse.grid)))

EDIT

Если у вас большой набор данных, и это займетслишком много ОЗУ (обычно в R), вы можете создать вектор объектов ff, который хранит данные на диске:

require(ff)

# create a ff object from the vector or the raster values (NA's are included)
val.Ras <- ff(getValues(meuse.grid))

# you can use this ff object as any other R vector files
hist(val.Ras[,3])

# check that it takes less memory
object.size(val.Ras)
64944 bytes

object.size(getValues(meuse.grid))
3168 bytes

Размер объекта уменьшен на 95%!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...