The `terra::shade` hill shade algorithm only uses immediate neighbors to compute hill shading. In contrast, Google Earth Engine's `ee.Algorithms.HillShadow` has a neighborhood size argument, which can lead to very different results. Below is a minimal reproducible example that shows how `terra::shade` only casts shadows in the immediate vicinity of the "tower" in the middle. Using the same raster, GEE's `ee.Algorithms.HillShadow` produces very different results (see figure and code).

I am also including plots from a real-world example based on a high-resolution digital surface model. This illustrates the difference in a real-world application of the algorithm.

## Question

What are options for a hillshade algorithm in R that take a larger neighborhood size into account similar to GEE's `ee.Algorithms.HillShadow`?

## R Code

``````library("tidyverse")
library("terra")
library("tidyterra")
library("ggpubr")

# Define raster
set.seed(123423)
dsm_values <- sample(1:3, 1000, replace = TRUE)
m <- matrix(dsm_values, nrow = 100, ncol = 100)
m[40:60,40:60] <- 100
r <- rast(m, crs = "epsg:2263")
names(r) <- "dsm"

terrain <- terra::terrain(r\$dsm, c("slope", "aspect"), unit = "radians")
shade <- terra::shade(terrain\$slope, terrain\$aspect, angle = altitude, direction = azimuth, normalize = TRUE)

g1 <- ggplot() +
geom_spatraster(data = r, aes(fill = dsm)) +
scale_fill_gradientn(colors = c('blue', 'limegreen', 'yellow', 'darkorange', 'red')) +
ggtitle("DSM") +
theme_bw()

g2 <- ggplot() +
scale_fill_gradient2(low = "#ffffff", high = "#000000") +
theme_bw()

ggarrange(g1, g2)
``````

## GEE

``````// IMPORT raster as `dsm`
var azimuth = 136;
var altitude = 14.6;

Map.centerObject(dsm, 18);
var params = {min: -5, max: 500, palette: ['blue', 'limegreen', 'yellow', 'darkorange', 'red']};