Home > Net >  Raster calculation in R
Raster calculation in R

Time:11-07

I have two files from these website: https://sedac.ciesin.columbia.edu/data/set/gpw-v4-population-count-rev11/data-download

And a shapefile of China from these website https://gadm.org/download_country_v3.html

I would like to compute the difference between the raster population layers, that I can show a map where each pixel represents the change in the population in China.

I used this code

library(raster)
library(sf) 
library(tmap)

p_15 <- terra::rast("gpw-v4-population-count-rev11_2015_2pt5_min_tif/gpw_v4_population_count_rev11_2015_2pt5_min.tif")
p_20 <- terra::rast("gpw-v4-population-count-rev11_2020_2pt5_min_tif/gpw_v4_population_count_rev11_2020_2pt5_min.tif")
CHN <- sf::read_sf("gadm36_CHN_shp/gadm36_CHN_1.shp")
CHN <- sf::st_transform(CHN, crs="epsg:4490")|> terra::vect()
p_15<- terra::project(p_15,'EPSG:4490')
p_20 <- terra::project(p_20,'EPSG:4490')
p_15_crop <- terra::crop(p_15, CHN)
p_20_crop <- terra::crop(p_20, CHN)
p_15_mask <- mask(p_15_crop, CHN)
p_20_mask <- mask(p_2_crop, CHN)

The code above everything works fine.

Now I used overlay from the raster package to calculate the difference between the population layers to show the change in each pixel.

I gave these code

diff1520 <- overlay(p_15_mask, p_20_mask, fun=function(x,y){return(y-x)})

But I got the error message method not applicable??? What is wrong with the code?

By the way, I also used geodata package, but did not solve my problem

CodePudding user response:

It's probably because you created your masks with terra. So the masks are SpatRast objects and you tried to use the overlay() function from raster and that only works with raster objects.

You can do what you want with

diff1520 <- p_20_mask - p_15_mask

That's the basic terra way.

CodePudding user response:

Simply subtracting the objects will work. But if you still want to apply a function to a SpatRaster, you can use terra::lapp, which is equivalent to raster::overlay. The main difference is that you have to combine the layers first.

library(terra)

p_mask <- c(p_15_mask, p_20_mask)
diff1520 <- lapp(p_mask, fun=function(x,y){return(y-x)})
  •  Tags:  
  • r
  • Related