2

I have a raster like this one: https://drive.google.com/drive/u/0/folders/1AEKu4TKpzJg95oXv8dxep24xpXaesr0F

I want to find the locations (can be the centroid or the bounding box of these cells) for the extreme values (minimum and maximum).

Here is a great answer on how to do it using stars

However, I wonder how to do it quickly using terra

There are the where.min and where.max, as well as the minmax functions. Yet they return the cell-index and the value, not the coordinates though.

1 Answer 1

3

Read raster using terra:

r = rast("au.tif")

Get coords of minimum:

xyFromCell(r, where.min(r)[2])

##           x      y
## [1,] 377500 393500

Breaking this down a bit, where.min returns the layer, cell number, and value there:

> where.min(r)
     layer   cell   value
[1,]     1 101114 1265075

If you have a multi-layer raster then you get the second column of the where.min:

Make 3 layers:

> r3 = c(r,r,r)

Splash a zero into each of the first two layers:

> r3[100,100,1]=0
> r3[200,200,2]=0

Then see:

> xyFromCell(r3, where.min(r3)[,2])
          x      y
[1,] 211500 470500
[2,] 311500 370500
[3,] 377500 393500

If you have multiple equal minima per layer, then you might want to record the layers alongside the locations...

Stick another zero in layer 2:

> r3[200,100,2]=0

Get the where.min matrix and use column 2 to get the coords info and then splat the matrix on it as well using cbind:

> wm = where.min(r3)
> cbind(xyFromCell(r3, wm[,2]), wm)
          x      y layer   cell   value
[1,] 211500 470500     1  56827       0
[2,] 211500 370500     2 114127       0
[3,] 311500 370500     2 114227       0
[4,] 377500 393500     3 101114 1265075
0

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.