Created on September 21, 2026 with R Markdown and Leaflet.
Click a marker for details, use the layer control (top right) to switch between base maps and toggle categories, and drag the mini-map in the corner.
library(leaflet)
sites <- data.frame(
name = c("Great Pyramid of Giza", "Machu Picchu", "Petra", "Colosseum",
"Taj Mahal", "Great Wall of China", "Angkor Wat",
"Grand Canyon", "Victoria Falls", "Mount Fuji",
"Eiffel Tower", "Sydney Opera House"),
lat = c(29.9792, -13.1631, 30.3285, 41.8902,
27.1751, 40.4319, 13.4125,
36.1069, -17.9243, 35.3606,
48.8584, -33.8568),
lng = c(31.1342, -72.5450, 35.4444, 12.4922,
78.0421, 116.5704, 103.8670,
-112.1129, 25.8572, 138.7274,
2.2945, 151.2153),
category = c("Ancient", "Ancient", "Ancient", "Ancient",
"Ancient", "Ancient", "Ancient",
"Natural", "Natural", "Natural",
"Modern", "Modern"),
fact = c("Built c. 2560 BCE; the tallest structure on Earth for ~3,800 years.",
"15th-century Inca citadel high in the Andes.",
"Rock-cut city of the Nabataeans, known as the 'Rose City'.",
"Roman amphitheatre that could seat 50,000 spectators.",
"Ivory-white marble mausoleum completed around 1653.",
"A network of fortifications stretching thousands of kilometres.",
"The largest religious monument in the world.",
"A mile-deep canyon carved by the Colorado River.",
"Known locally as 'The Smoke That Thunders'.",
"Japan's highest mountain and an active stratovolcano.",
"Wrought-iron tower finished for the 1889 World's Fair.",
"Sail-shaped performing arts centre opened in 1973."),
stringsAsFactors = FALSE
)
pal <- colorFactor(
palette = c("Ancient" = "#c0392b", "Natural" = "#27ae60", "Modern" = "#2980b9"),
domain = sites$category
)
popup_html <- paste0(
"<b>", sites$name, "</b><br/>",
"<i>", sites$category, "</i><br/>",
sites$fact
)
m <- leaflet(sites, width = "100%", height = 550) |>
# Base maps
addProviderTiles(providers$CartoDB.Positron, group = "Light") |>
addProviderTiles(providers$OpenStreetMap, group = "Street") |>
addProviderTiles(providers$Esri.WorldImagery, group = "Satellite") |>
setView(lng = 20, lat = 25, zoom = 2)
# One layer group per category so they can be toggled independently
for (cat in unique(sites$category)) {
d <- sites[sites$category == cat, ]
m <- m |>
addCircleMarkers(
data = d, lng = ~lng, lat = ~lat,
radius = 9, weight = 2, color = "white",
fillColor = ~pal(category), fillOpacity = 0.9,
popup = popup_html[sites$category == cat],
label = ~name,
group = cat
)
}
m |>
addLegend("bottomleft", pal = pal, values = ~category,
title = "Type of wonder", opacity = 1) |>
addLayersControl(
baseGroups = c("Light", "Street", "Satellite"),
overlayGroups = unique(sites$category),
options = layersControlOptions(collapsed = FALSE)
) |>
addMiniMap(toggleDisplay = TRUE, position = "bottomright") |>
addScaleBar(position = "bottomleft")