Очертить интересующую растровую ячейку по номеру ячейки

Я хотел бы выделить растровую ячейку с учетом номера ячейки на графике. Я сделал упрощенный пример, который я смог сделать в Power Point, но может иметь разрешение, для которого это будет сделать сложнее (720 x 360 против 3 x 5). Чтобы создать образец данных:

library(raster)
x = raster(matrix(seq(1,15), nrow = 3))
plot(x)

И я хотел бы модифицировать команду plot (желательно), чтобы при выборе 5-й ячейки результат выглядел примерно так: введите здесь описание изображения


person Sarah    schedule 08.02.2015    source источник


Ответы (2)


Вот общий подход, при котором мы строим extent на основе строки и столбца интересующей ячейки.

library(raster)
r <- raster(matrix(1:15, nrow=3))
plot(r)
rc <- rowColFromCell(r, 5)
plot(extent(r, rc[1], rc[1], rc[2],  rc[2]), add=TRUE, col='red', lwd=3)

fig1

Аргументы со второго по четвертый для extent определяют диапазон строк (аргументы 2 и 3) и столбцов (аргументы 4 и 5), которые будут использоваться для вычисления экстента.

Если бы мы хотели выделить ячейки 3, 4, 8 и 9, мы могли бы сделать:

plot(r)
rc <- rowColFromCell(r, c(3, 4, 8, 9))
plot(extent(r, min(rc[, 1]), max(rc[, 1]), 
            min(rc[, 2]),  max(rc[, 2])), add=TRUE, col='red', lwd=3)

fig2

Это прекрасно работает для прямоугольных экстентов вокруг смежных наборов ячеек. Если вы хотите наметить произвольный выбор ячеек, вы можете рассмотреть rasterToPolygons. Например. для ячеек 2, 8, 9, 11 и 14:

plot(r)
r2 <- r
r2[setdiff(seq_len(ncell(r2)), c(2, 8, 9, 11, 14))] <- NA
r2[!is.na(r2)] <- 1
plot(rasterToPolygons(r2, dissolve=TRUE), add=TRUE, border='red', lwd=2)

Здесь мы создаем копию растра, устанавливаем для всех других ячеек значение NA, а затем для фокусных ячеек общее значение (в данном случае 1). Затем rasterToPolygons преобразует ячейки, не относящиеся к NA, в полигоны, при желании растворяя соприкасающиеся полигоны.

fig3

person jbaums    schedule 10.02.2015

Этот код должен делать то, что вы хотите.

plot(raster(matrix(seq(1,15), nrow = 3)))

gridx = 5
gridy = 3
dx = 1/gridx #resolution of the grid 
dy = 1/gridy

# if you want to specify the cell number (cell 1 is bottom left):

cell = 15
ny = floor(cell/gridx - dx)+1
nx = cell-gridx*(ny-1)

# if you want to give cell positions, just edit nx, ny

x1 = c(nx-1,nx-1,nx-1,nx)*dx
y1 = c(ny-1,ny,ny-1,ny-1)*dy
x2 = c(nx,nx,nx-1,nx)*dx
y2 = c(ny-1,ny,ny,ny)*dy

segments(x1,y1,x2,y2,col=2,lwd=2)
person xraynaud    schedule 08.02.2015
comment
Спасибо - не совсем делает это по номеру ячейки - но достаточно легко определить значения строки и столбца (nx и ny) с учетом номера ячейки. - person Sarah; 09.02.2015