In some situations, 3D visuals can be distracting and/or misleading. However, when done correctly, they can be attention grabbing and insightful in ways that a 2D map or plot can't be. In the past, I have made 3D products using QGIS and Blender. When I first saw the examples created using the Rayshader library, I knew I had to give it a try. I gathered my own DEM data and created a mosaic of some tiles in ArcGIS Pro. The DEM that I created ended up being extremely large and R studio didn't handle it very well (understandably). The final version of this DEM can be seen at the top of this page. I decided to look into some alternatives.
I found an R package that works great in tandem with rayshader. Geoviz can grab DEM's from mapzen, satellite imagery tiles from mapbox, and basemaps from Stamen maps. I chose the center of Lake Tahoe for this visualization and then added some labels in photoshop. The R code with instructions can be found on the bottom of this page.
library(rayshader) library(geoviz) library(raster) library(rgdal) ##Lat, long of the area you want(Tahoe Center) lat <- 39.087018 long <- -120.036400 square_km <- 30 ##~Set max tiles. This sets the resolution of your DEM. ##The max is 60, but the image will be slower in R (TEST ON 10) max_tiles <- 10 #DEM data from Mapzen dem <- mapzen_dem(lat, long, square_km, max_tiles = max_tiles) # If you want to put satellite imagery on, first get a mapkey # MapKey: https://docs.mapbox.com/help/glossary/access-token mapbox_key <- "Your Key" #add this option to the following slippy_overlay: api_key = mapbox_key # or use a Stamen basemap, like I did in this example: overlay_image <- slippy_overlay( dem, image_source = "stamen", image_type = "terrain-background", ) sunangle <- 270 #Draw the rayshader scene elmat = matrix( raster::extract(dem, raster::extent(dem), method = 'bilinear'), nrow = ncol(dem), ncol = nrow(dem) ) #Rayshader texture: elmat %>% sphere_shade(texture = "bw") %>% plot_map() #plot map with overlay image and shadows elmat %>% sphere_shade(texture = "bw") %>% add_overlay(overlay_image,alphalayer = 1) %>% add_shadow(ray_shade(elmat, zscale=50,maxsearch = 500)) %>% plot_map() #render in 3d elmat %>% sphere_shade(texture = "bw") %>% add_overlay(overlay_image,alphalayer = 0.6) %>% plot_3d(elmat, zscale = 15, fov = 0, theta = -15, zoom = 0.58, phi = 38, windowsize = c(1000, 800)) render_snapshot()