This post
thoroughly details the process of building and customizing 3D
maps using the rayshader
package. It includes step-by-step, reproducible code examples and
clearly explains the required formatting for input data.
By
following this guide, you will learn how to create visually
appealing maps and tailor them to meet your specific needs,
ensuring your data is presented in the most effective way possible.
Additionally, the post covers various customization options within
rayshader, enabling you to enhance your maps with
different visual styles and effects.
The rayshader package makes it simple to create shaded 2D relief maps.
Since the package is on CRAN, you can
install it with
install.packages("rayshader")
.
We also load the raster
package to
access data to work with.
The rayshader package requires input data in elevation matrix format. This special matrix has each cell containing the elevation value of the corresponding map point.
Here’s how to obtain the elevation matrix from a
raster file using the raster
package.
# Define a region for the SRTM data (example: Swiss Alps)
extent_alps <- extent(7.0, 9.0, 46.0, 47.5)
# Download SRTM data
srtm_alps <- getData("SRTM", lon = 8.0, lat = 46.75)
# Crop the SRTM data to the defined extent
srtm_alps_cropped <- crop(srtm_alps, extent_alps)
# Convert the raster data to matrix
elevation_matrix <- raster_to_matrix(srtm_alps_cropped)
To create a basic 3D map with rayshader using the
sphere_shade()
and plot_3d()
functions, follow
these steps:
sphere_shade()
.plot_3d()
.When you render it, a 3D window will open where you can interact with the map.
rayshader includes a
specialized function to create textures:
create_texture()
. This function accepts 5 colors as
input and generates a texture suitable for use in the
sphere_shade()
function.
To add water, you first need to detect the
water in the elevation matrix using the
detect_water()
function.
After that, you can use the add_water()
function to
integrate the water into the map.
The add_shadow()
function can be used to add a shadow to
the map. The ray_shade()
function creates a shadow based on
the sun angle, while the ambient_shade()
function creates a
shadow based on the ambient light.
elevation_matrix %>%
sphere_shade(texture="desert", sunangle = 45) %>%
add_water(detect_water(elevation_matrix)) %>%
add_shadow(ray_shade(elevation_matrix), 0.5) %>% # this line adds a shadow
add_shadow(ambient_shade(elevation_matrix), 0) %>% # this line adds an ambient shadow
plot_3d(elevation_matrix, zscale = 50)
render_snapshot('img/graph/411-map-3d-with-rayshader-4.png')
You might be interested in
👋 After crafting hundreds of R charts over 12 years, I've distilled my top 10 tips and tricks. Receive them via email! One insight per day for the next 10 days! 🔥