sf и звезды: полигонизация категориального растра

#r #raster #sf #r-stars

Вопрос:

Я хотел бы нарисовать счетчик растров ( l ) только для категории «цель» в x растре без учета значений NA. Я стараюсь делать:

 # Packages
library(stars)
library(sf)

#Vectorizing a raster object to an sf object
tif = system.file("tif/L7_ETMs.tif", package = "stars")
x = read_stars(tif)[, 1:50, 1:50, 1:2]
x[[1]] = round(x[[1]]/5)
x[[1]] = ifelse(x[[1]]<10,NA,"target")
str(x[[1]])

#Polygonizing
l =  st_contour(x)
plot(l[1])
Error in CPL_write_gdal(mat, file, driver, options, type, dims, from,  : 
  Not compatible with requested type: [type=character; target=double].
 

Но это не работает. Пожалуйста, какая-нибудь помощь в этом?

Заранее спасибо,

Alexandre

Ответ №1:

В вашем скрипте есть несколько ошибок, во-первых, st_contour это указывает на то, что он несовместим с типом символа (ссылаясь на «целевую» строку, заданную вами в растре). Во-вторых, я бы предложил использовать аргумент breaks внутри st_contour , чтобы установить целевое значение, для которого вы хотите получить контуры. Кроме того, вы можете использовать x[rule] <- NA для маскировки определенных значений в растре. Я внес другие изменения в ваш код, которые могли бы помочь:

 # Let's stay with only the first band, indicated in the final dimension
x = read_stars(tif)[, 1:50, 1:50, 1]
x = round(x/5)
# Calculate the min and max of the raster values
purrr::map(x, min)
# 10
purrr::map(x, max)
# 28
# Mask values lower than 10
# However, this does not make any change, because the lowest value is 10
x[x<10] <- NA
# Take a look at the image
plot(x)

# Obtain the contours
l =  st_contour(x, 
                # Remove NA
                na.rm = T,
                # Obtain contour lines instead of polygons
                contour_lines = TRUE,
                # raster values at which to draw contour levels
                breaks = 12)
# Plot the contours
plot(l)