library(tidyterra)
library(terra)
library(geodata)
library(rnaturalearth)
library(ggplot2)
library(dplyr)
library(sf)
library(rlang)
library(knitr)
library(patchwork)
library(leaflet)
library(htmlwidgets)
library(htmltools)
library(raster)
library(IRdisplay)
Attaching package: ‘tidyterra’
The following object is masked from ‘package:stats’:

    filter
terra 1.9.46
Attaching package: ‘dplyr’
The following objects are masked from ‘package:terra’:

    intersect, union
The following objects are masked from ‘package:stats’:

    filter, lag
The following objects are masked from ‘package:base’:

    intersect, setdiff, setequal, union
Linking to GEOS 3.12.1, GDAL 3.8.4, PROJ 9.4.0; sf_use_s2() is TRUE
Attaching package: ‘knitr’
The following object is masked from ‘package:terra’:

    spin
Attaching package: ‘patchwork’
The following object is masked from ‘package:terra’:

    area
Loading required package: sp
Attaching package: ‘raster’
The following object is masked from ‘package:dplyr’:

    select
The following object is masked from ‘package:tidyterra’:

    select

Super Rugby (New Zealand, Australia, South Africa)#

Super Rugby has taken several formats. This notebook focuses on the classic three-country footprint—franchises in New Zealand, Australia, and South Africa that shared the competition before South African sides moved to the United Rugby Championship. Super Rugby Pacific today is centred on New Zealand and Australia; the South African grounds here are the same venues those franchises used in the Super Rugby era.

Elevation comes from geodata::elevation_30s() tiles for NZL, AUS, and ZAF, with each stadium sampled from its national raster (same pattern as the URC notebook). Coordinates are approximate stadium centre points; edit super_clubs to refine them.

super_clubs <- data.frame(
  club = c(
    "Blues", "Chiefs", "Crusaders", "Highlanders", "Hurricanes",
    "Brumbies", "Reds", "Waratahs", "Western Force", "Rebels",
    "Bulls", "Stormers", "Sharks", "Lions"
  ),
  stadium = c(
    "Eden Park", "FMG Stadium Waikato", "Apollo Projects Stadium",
    "Forsyth Barr Stadium", "Sky Stadium",
    "GIO Stadium", "Suncorp Stadium", "Allianz Stadium",
    "HBF Park", "AAMI Park",
    "Loftus Versfeld", "DHL Stadium", "Hollywoodbets Kings Park",
    "Emirates Airline Park"
  ),
  lon = c(
    174.744, 175.272, 172.636, 170.526, 174.776,
    149.002, 153.009, 151.225, 115.770, 144.983,
    28.229, 18.411, 31.030, 28.061
  ),
  lat = c(
    -36.875, -37.781, -43.531, -45.869, -41.272,
    -35.250, -27.464, -33.889, -31.938, -37.825,
    -25.748, -33.903, -29.825, -26.198
  ),
  country = c(
    rep("New Zealand", 5),
    rep("Australia", 5),
    rep("South Africa", 4)
  ),
  elev_source = c(
    rep("NZL", 5),
    rep("AUS", 5),
    rep("ZAF", 4)
  ),
  stringsAsFactors = FALSE
)

super_sv <- terra::vect(super_clubs, geom = c("lon", "lat"), crs = "EPSG:4326")

Download elevation tiles#

td <- tempdir()
elev_tiles <- list(
  NZL = geodata::elevation_30s(country = "NZL", path = td),
  AUS = geodata::elevation_30s(country = "AUS", path = td),
  ZAF = geodata::elevation_30s(country = "ZAF", path = td)
)

for (nm in names(elev_tiles)) {
  names(elev_tiles[[nm]]) <- paste0("elev_", nm)
}
Cached as: /tmp/RtmpEteVSw/elevation/NZL_elv_msk.zip
Cached as: /tmp/RtmpEteVSw/elevation/AUS_elv_msk.zip
Cached as: /tmp/RtmpEteVSw/elevation/ZAF_elv_msk.zip

Extract elevation per ground#

extract_point_elev <- function(lon, lat, src) {
  r <- elev_tiles[[src]]
  pts <- terra::vect(
    data.frame(lon = lon, lat = lat),
    geom = c("lon", "lat"),
    crs = "EPSG:4326"
  )
  if (!terra::same.crs(r, pts)) {
    pts <- terra::project(pts, r)
  }
  ex <- terra::extract(r, pts)
  as.numeric(ex[[names(r)[1]]])
}

super_elev <- super_clubs |>
  mutate(
    ground_elevation_m = mapply(
      extract_point_elev,
      lon,
      lat,
      elev_source,
      USE.NAMES = FALSE
    )
  )

super_elev |>
  arrange(desc(ground_elevation_m)) |>
  knitr::kable(
    digits = 1,
    caption = "Super Rugby grounds ranked by extracted elevation (m a.s.l.; national SRTM tile)"
  )
Table: Super Rugby grounds ranked by extracted elevation (m a.s.l.; national SRTM tile)

|club          |stadium                  |   lon|   lat|country      |elev_source | ground_elevation_m|
|:-------------|:------------------------|-----:|-----:|:------------|:-----------|------------------:|
|Lions         |Emirates Airline Park    |  28.1| -26.2|South Africa |ZAF         |               1727|
|Bulls         |Loftus Versfeld          |  28.2| -25.7|South Africa |ZAF         |               1385|
|Brumbies      |GIO Stadium              | 149.0| -35.2|Australia    |AUS         |                542|
|Waratahs      |Allianz Stadium          | 151.2| -33.9|Australia    |AUS         |                 56|
|Blues         |Eden Park                | 174.7| -36.9|New Zealand  |NZL         |                 55|
|Western Force |HBF Park                 | 115.8| -31.9|Australia    |AUS         |                 53|
|Chiefs        |FMG Stadium Waikato      | 175.3| -37.8|New Zealand  |NZL         |                 43|
|Hurricanes    |Sky Stadium              | 174.8| -41.3|New Zealand  |NZL         |                 33|
|Reds          |Suncorp Stadium          | 153.0| -27.5|Australia    |AUS         |                 27|
|Rebels        |AAMI Park                | 145.0| -37.8|Australia    |AUS         |                 19|
|Stormers      |DHL Stadium              |  18.4| -33.9|South Africa |ZAF         |                 15|
|Crusaders     |Apollo Projects Stadium  | 172.6| -43.5|New Zealand  |NZL         |                 13|
|Sharks        |Hollywoodbets Kings Park |  31.0| -29.8|South Africa |ZAF         |                 10|
|Highlanders   |Forsyth Barr Stadium     | 170.5| -45.9|New Zealand  |NZL         |                  5|
super_bar <- super_elev |>
  mutate(club = stats::reorder(club, ground_elevation_m))

ggplot(super_bar, aes(x = club, y = ground_elevation_m, fill = country)) +
  geom_col(width = 0.78, colour = "grey35", linewidth = 0.25) +
  coord_flip() +
  scale_fill_brewer(palette = "Set2", name = "Country") +
  labs(
    title = "Super Rugby ground elevation (ascending)",
    x = NULL,
    y = "Elevation (m a.s.l.)"
  ) +
  theme_minimal(base_size = 11) +
  theme(
    plot.title = element_text(face = "bold", hjust = 0, margin = margin(b = 8)),
    panel.grid.major.y = element_blank(),
    panel.grid.minor = element_blank(),
    legend.position = "bottom"
  )
../../_images/cfd4a391dabd3e12fb050b2796382d238bebfd9679a200494e7d80587b42ab99.png

Bulls and Lions again sit on the Highveld and pull the vertical scale upward, masking smaller differences among New Zealand and Australian venues (often coastal or low-lying basins). The chart below drops those two franchises so the remaining twelve grounds are easier to compare.

super_bar_trim <- super_elev |>
  dplyr::filter(!club %in% c("Bulls", "Lions")) |>
  mutate(club = stats::reorder(club, ground_elevation_m))

ggplot(super_bar_trim, aes(x = club, y = ground_elevation_m, fill = country)) +
  geom_col(width = 0.78, colour = "grey35", linewidth = 0.25) +
  coord_flip() +
  scale_fill_brewer(palette = "Set2", name = "Country") +
  labs(
    title = "Super Rugby elevation (ascending), excluding Bulls & Lions",
    x = NULL,
    y = "Elevation (m a.s.l.)"
  ) +
  theme_minimal(base_size = 11) +
  theme(
    plot.title = element_text(face = "bold", hjust = 0, margin = margin(b = 8)),
    panel.grid.major.y = element_blank(),
    panel.grid.minor = element_blank(),
    legend.position = "bottom"
  )
../../_images/0564b22370ea73783016138a1893e901bcaf092161878364c9029a52af217fd5.png

Regional maps (New Zealand, Australia, South Africa)#

We crop each national DEM to the stadium footprint, merge New Zealand and Australia for one panel, and map South Africa separately.

world_sf <- rnaturalearth::ne_countries(scale = "medium", returnclass = "sf")
super_outline_sf <- world_sf[world_sf$iso_a3 %in% c("NZL", "AUS", "ZAF"), ]
super_outline <- terra::vect(super_outline_sf)

anz_df <- super_clubs |> dplyr::filter(elev_source %in% c("NZL", "AUS"))
sa_df <- super_clubs |> dplyr::filter(elev_source == "ZAF")

anz_ext <- terra::extend(
  terra::ext(terra::vect(anz_df, geom = c("lon", "lat"), crs = "EPSG:4326")),
  2
)
sa_ext <- terra::extend(
  terra::ext(terra::vect(sa_df, geom = c("lon", "lat"), crs = "EPSG:4326")),
  2
)

r_anz <- terra::merge(
  terra::crop(elev_tiles$NZL, anz_ext),
  terra::crop(elev_tiles$AUS, anz_ext)
)
names(r_anz) <- "elevation"

r_sa <- terra::crop(elev_tiles$ZAF, sa_ext)
names(r_sa) <- "elevation"

anz_pts <- terra::vect(anz_df, geom = c("lon", "lat"), crs = "EPSG:4326")
sa_pts <- terra::vect(sa_df, geom = c("lon", "lat"), crs = "EPSG:4326")

outline_anz <- terra::crop(super_outline, anz_ext)
outline_sa <- terra::crop(super_outline, sa_ext)

if (!terra::same.crs(r_anz, outline_anz)) {
  outline_anz <- terra::project(outline_anz, r_anz)
}
if (!terra::same.crs(r_sa, outline_sa)) {
  outline_sa <- terra::project(outline_sa, r_sa)
}
p_anz <- ggplot() +
  tidyterra::geom_spatraster(data = r_anz, aes(fill = elevation)) +
  tidyterra::scale_fill_hypso_tint_c(
    name = "m",
    guide = guide_colorbar(barwidth = unit(2.6, "cm"), title.position = "top")
  ) +
  tidyterra::geom_spatvector(data = anz_pts, aes(colour = country), size = 2.8, show.legend = TRUE) +
  tidyterra::geom_spatvector_label(
    data = anz_pts,
    aes(label = club),
    size = 2,
    colour = "grey10",
    label.size = 0.12,
    show.legend = FALSE
  ) +
  tidyterra::geom_spatvector(data = outline_anz, fill = NA, colour = "grey25", linewidth = 0.25) +
  scale_colour_brewer(palette = "Set1", name = "Country") +
  labs(title = "Super Rugby — New Zealand & Australia") +
  theme_void() +
  theme(
    plot.title = element_text(face = "bold", hjust = 0.5, margin = margin(b = 4)),
    legend.title = element_text(size = 8),
    legend.position = "bottom"
  )

p_sa <- ggplot() +
  tidyterra::geom_spatraster(data = r_sa, aes(fill = elevation)) +
  tidyterra::scale_fill_hypso_tint_c(
    name = "m",
    guide = guide_colorbar(barwidth = unit(2.6, "cm"), title.position = "top")
  ) +
  tidyterra::geom_spatvector(data = sa_pts, aes(colour = country), size = 2.8, show.legend = TRUE) +
  tidyterra::geom_spatvector_label(
    data = sa_pts,
    aes(label = club),
    size = 2,
    colour = "grey10",
    label.size = 0.12,
    show.legend = FALSE
  ) +
  tidyterra::geom_spatvector(data = outline_sa, fill = NA, colour = "grey25", linewidth = 0.25) +
  scale_colour_brewer(palette = "Set1", name = "Country") +
  labs(title = "Super Rugby — South Africa") +
  theme_void() +
  theme(
    plot.title = element_text(face = "bold", hjust = 0.5, margin = margin(b = 4)),
    legend.title = element_text(size = 8),
    legend.position = "bottom"
  )

p_anz + p_sa + patchwork::plot_layout(ncol = 2, widths = c(1, 1))
<SpatRaster> resampled to 500220 cells.
Warning message:
“The `label.size` argument of `geom_label()` is deprecated as of ggplot2 3.5.0.
ℹ Please use the `linewidth` argument instead.
ℹ The deprecated feature was likely used in the tidyterra package.
  Please report the issue at <https://github.com/dieghernan/tidyterra/issues>.”
<SpatRaster> resampled to 500286 cells.
Warning message in st_point_on_surface.sfc(sf::st_zm(x)):
“st_point_on_surface may not give correct results for longitude/latitude data”
Warning message in st_point_on_surface.sfc(sf::st_zm(x)):
“st_point_on_surface may not give correct results for longitude/latitude data”
../../_images/12ab7b38f288ca0778ea990bc4d02226abbe51941a57279efd6d4b4420deea10.png

Interactive maps#

The maps below use Leaflet (via htmlwidgets). You can pan, zoom, and click stadium markers for club, venue, and extracted elevation. The elevation layer is a downsampled version of the same cropped DEM used in the static figures, so it loads quickly in the browser. An internet connection is required for the light basemap tiles.

Super Rugby — New Zealand & Australia (interactive)

Super Rugby — South Africa (interactive)

Across New Zealand and Australia, most franchises sit on low coastal or basin terrain in the DEM (e.g. Blues, Waratahs, Reds), while South Africa again mixes sea-level venues with Highveld outliers—useful context when comparing the full competition to Super Rugby Pacific today, which no longer includes the South African sides.