Home > Enterprise >  match extent of two rasters in R
match extent of two rasters in R

Time:07-30

I have two raster:

  raster1
  
  class       : SpatRaster 
  dimensions  : 21600, 43200, 1  (nrow, ncol, nlyr)
  resolution  : 0.008333333, 0.008333333  (x, y)
  extent      : -180, 180, -90, 90  (xmin, xmax, ymin, ymax)

  raster2
  
  class       : SpatRaster 
  dimensions  : 720, 1440, 1  (nrow, ncol, nlyr)
  resolution  : 0.25, 0.25  (x, y)
  extent      : -180, 180, -90, 90  (xmin, xmax, ymin, ymax)
  coord. ref. : lon/lat WGS 84 

I want to run zonal stastics to calculate sum of smaller raster raster1 on bigger raster raster2:

  terra::zonal(raster1, raster2, fun = sum, as.raster=T, filename = 'zonal.tif') 
  Error: [zonal] dimensions and/or extent do not match
  

I wasn't sure why the extent are not matching until I did this

  terra::ext(raster1)
  SpatExtent : -180.000001017276, 180.000001017276, -90.0000010172997, 90.0000010172997 (xmin, xmax, ymin, ymax)
  
  terra::ext(raster2)
  SpatExtent : -180, 180, -90, 90 (xmin, xmax, ymin, ymax)
  

which shows that raster1 extent have some imprecision. What are different ways I can fix this?

EDIT: I tried the suggestion in the comment

terra::crs(raster2) <- sf::st_crs(4326)$wkt
terra::crs(raster1) <- sf::st_crs(4326)$wkt

terra::ext(raster2)
SpatExtent : -180, 180, -90, 90 (xmin, xmax, ymin, ymax)

terra::ext(raster1)
SpatExtent : -180.000001017276, 180.000001017276, -90.0000010172997, 90.0000010172997 (xmin, xmax, ymin, ymax)
  

But my extent are still not matching

CodePudding user response:

Mismatching extents don't stop zonal working, so I think that error message is wrong. Here's two rasters that only differ in their CRS:

> library(terra)
terra 1.5.21
> raster1 = rast()
> raster1[]=1:360
> raster2 = rast()
> raster2[]=1:360
> crs(raster1) = ""
> zonal(raster1, raster2)
Error: [zonal] dimensions and/or extent do not match

I guess it could be argued that a different CRS means a different extent in the same way that "23" is different to "23 km". But the extent and the dimensions are all the same according to these tests:

> ext(raster1) == ext(raster2)
[1] TRUE
> dim(raster1) == dim(raster2)
[1] TRUE TRUE TRUE

Rasters with a different extent work fine with zonal (once I've set the CRSs to match):

> ext(raster2) = c(-180.01, 180.01, -90.01, 90.01)
> crs(raster2) = ""
> z = zonal(raster1, raster2)
> 

If you do want to change an extent, you can use ext(r) = ... as above, but you should try and figure out why extents don't match. Likely its because you have data on points and you may have cells extending out from points...

CodePudding user response:

The error message is

Error: [zonal] dimensions and/or extent do not match

In this case, that clearly refers to the difference is dimensions, which are

#dimensions  : 21600, 43200, 1  (nrow, ncol, nlyr)
#dimensions  : 720, 1440, 1  (nrow, ncol, nlyr)

I do not think the small difference in the extent is relevant at all.

To make the dimensions match you can use disagg or aggregate with a factor of 30.

If the crs of raster2 is different from that of raster1 you can (in this case, where you clearly have two global lon/lat rasters) fix that with

crs(raster2) <- crs(raster1)

And for good measure, you could in this case also do

ext(raster2) <- ext(raster1)
  • Related