Создание кадра данных на основе значений пикселей в растровом стеке в R - PullRequest
0 голосов
/ 17 сентября 2018

Я готовлю набор данных для запуска классификации SVM.Пока у меня есть растровый стек, который включает слой ([6]) для обучения

> S1
class       : RasterStack 
dimensions  : 3865, 6899, 26664635, 6  (nrow, ncol, ncell, nlayers)
resolution  : 14.83, 14.83  (x, y)
extent      : 361363.5, 463675.7, 5760647, 5817965  (xmin, xmax, ymin, ymax)
coord. ref. : +proj=utm +zone=32 +datum=WGS84 +units=m +no_defs +ellps=WGS84 +towgs84=0,0,0 
names       : Coherence_VV_Stack2.1, Coherence_VV_Stack2.2, Coherence_VV_Stack2.3, Coherence_VV_Stack2.4, Coherence_VV_Stack2.5, Class 
min values  :                     ?,                     ?,                     ?,                     ?,                     ?,     0 
max values  :                     ?,                     ?,                     ?,                     ?,                     ?,     1 

Где S1[[6]]:

> S1[[6]]
class       : RasterLayer 
dimensions  : 3865, 6899, 26664635  (nrow, ncol, ncell)
resolution  : 14.83, 14.83  (x, y)
extent      : 361363.5, 463675.7, 5760647, 5817965  (xmin, xmax, ymin, ymax)
coord. ref. : +proj=utm +zone=32 +datum=WGS84 +units=m +no_defs +ellps=WGS84 +towgs84=0,0,0 
data source : in memory
names       : Class 
values      : 0, 1  (min, max)

и plot(S1[[6]):

enter image description here

Я хочу создать dataframe (для последующего использования в качестве входных данных для классификации), где:

  • Если значение пикселя в S1[[6]] равно 1, извлеките значения пикселей в других слоях raster stack и поместите его в dataframe

  • Если значение пикселяв S1[[6]] есть 0, ничего не делать.

Есть предложения о том, как поступить?Я знаю, что проблему можно решить, импортировав shapefile и используя функцию extract, но я хочу использовать этот подход.

Ответы [ 2 ]

0 голосов
/ 17 сентября 2018

Это должно работать

i <- Which(S1[[6]]==1, cells=TRUE)
df <- data.frame(S1[i])

Если набор данных достаточно мал, чтобы поместиться в оперативную память, вы также можете воспользоваться ярлыком, предложенным Istrel:

df <- as.data.frame(S1) 
df <- df[df[ ,6]== 1, ]
0 голосов
/ 17 сентября 2018

Вы можете использовать raster::calc для этого:

# Prepare function for manipulation with pixels
foo <- function(x){
    # NA case
    if (is.na(x[6])){
        return(NA)
    }
    # If layer 6 is 1
    if (x[6] == 1){
        # Return value from different layer (1 and 2 for example)
        return(x[c(1, 2)])
    } else {
        return(NA)
    }
}

# Use calc to loop over each pixel
new_raster <- calc(S1, foo)

# Convert result to data frame
df <- as.data.frame(new_raster)

# Remove empty values
df <- df[complete.cases(df), ]
...