Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Outline a raster cell of interest by cell number

I would like to outline a raster cell given the cell number in a plot. I have made a simplified example, that I was able to make in power point, but may have a resolution that will be more difficult to do this for (720 x 360 vs 3 x 5). To generate the sample data:

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

And I would like a modification to the plot command (preferably) so that if I were to select the 5th cell, the result looks something like this: enter image description here

like image 298
Sarah Avatar asked Feb 08 '15 18:02

Sarah


Video Answer


2 Answers

Here's a general approach, where we plot an extent based on the row and column of the cell of interest.

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

The second through fourth arguments to extent determine the span of rows (args 2 and 3) and columns (args 4 and 5) that will be used to calculate the extent.

If we wanted to outline cells 3, 4, 8, and 9, we could do:

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

This works fine for rectangular extents around contiguous sets of cells. If you want to outline an arbitrary selection of cells, you could consider rasterToPolygons. E.g. for cells 2, 8, 9, 11, and 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)

Here, we create a copy of the raster, set all other cells to NA, and then the focal cells to a common value (1, in this case). rasterToPolygons then converts the non-NA cells to polygons, dissolving touching polys if desired.

fig3

like image 177
jbaums Avatar answered Nov 14 '22 20:11

jbaums


This code should do what you want.

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)
like image 28
xraynaud Avatar answered Nov 14 '22 20:11

xraynaud