library(dplyr)
library(ggplot2)
library(glue)
library(sf)
library(rnaturalearth)
library(rnaturalearthhires)Day 11 of 30DayMapChallenge: « Minimal » (previously).
A recent dataset of Roman Empire’s road system has just been published (de Soto et al. 2025) and is updated on Itiner-e where we can download the current GeoJSON. Let’s update an old post.
Data
if (!file.exists("itiner.geojson")) {
download.file("https://itiner-e.org/route-segments/download",
"itiner.geojson")
}
roads <- read_sf("itiner.geojson") |>
mutate(type = factor(type, levels = c("Main Road",
"Secondary Road",
"River",
"Sea Lane"))) |>
st_transform("EPSG:3035")
# map background
world <- ne_countries(scale = 50) Map
bb <- st_bbox(roads)
ggplot() +
geom_sf(data = world, fill = "snow2", color = "snow2") +
geom_sf(data = roads, aes(color = type, linetype = type, linewidth = type)) +
scale_color_manual(
values = c("Main Road" = "chocolate4",
"Secondary Road" = "chocolate2",
"River" = "steelblue1",
"Sea Lane" = "slategray1")) +
scale_linetype_manual(
values = c("Main Road" = 1,
"Secondary Road" = 1,
"River" = 1,
"Sea Lane" = 2)) +
scale_linewidth_manual(
values = c("Main Road" = .5,
"Secondary Road" = .2,
"River" = .2,
"Sea Lane" = .2)) +
coord_sf(crs = "EPSG:3035",
xlim = bb[c(1, 3)], ylim = bb[c(2, 4)]) +
labs(title = "Roman roads",
caption = glue("https://r.iresmi.net/ - {Sys.Date()}
{st_crs(roads)$Name}
data: Itiner-e doi:10.1038/s41597-025-06140-z / Natural Earth")) +
theme_minimal() +
theme(plot.caption = element_text(size = 6,
color = "darkgrey"),
legend.position = "bottom")
References
de Soto, Pau, Adam Pažout, Tom Brughmans, Peter Bjerregaard Vahlstrup, Álvaro Auir, Toon Bongers, Jens Emil Bødstrup Christoffersen, et al. 2025. “Itiner-e: A High-Resolution Dataset of Roads of the Roman Empire.” Scientific Data 12 (1): 1731. https://doi.org/10.1038/s41597-025-06140-z.
