From 50417261b375a912e448e460fca150f4186fef10 Mon Sep 17 00:00:00 2001 From: Frederik Vanrenterghem Date: Mon, 2 Oct 2023 22:30:39 +0800 Subject: [PATCH] Remove OpenStreetMap dependency. Use geom_sf. * Replace OpenStreetMap with maptiles and tidyterra due to sp support being removed from CRAN in Oct 2023. * Use geom_sf as that is now part of ggplot2 on CRAN. --- WA_active_schools.R | 58 ++++++++++++++++++++++----------------------- 1 file changed, 28 insertions(+), 30 deletions(-) diff --git a/WA_active_schools.R b/WA_active_schools.R index 18816aa..0811702 100644 --- a/WA_active_schools.R +++ b/WA_active_schools.R @@ -1,7 +1,8 @@ library(sf) library(dplyr) library(ggplot2) -library(OpenStreetMap) +library(maptiles) +library(tidyterra) library(viridis) library(httr2) @@ -35,32 +36,24 @@ shape.df$totalsecon <- as.numeric(shape.df$totalsecon) # filter out remote islands shape.df <- filter(shape.df,longitude > 100) # Obtain the contour box of the shape - lat <- c(min(shape.df$latitude), max(shape.df$latitude)) lon <- c(min(shape.df$longitude), max(shape.df$longitude)) - +# Define Perth metro contours lat.metro <- c(-32.1547, -31.8519) lon.metro <- c(115.7162,116.0733) -upperLeft.metro <- c(-31.8519,115.7162) -lowerRight.metro <- c(-32.1547,116.0733) - # Obtain an openstreetmap background image -map <- openmap(upperLeft = c(lat[2],lon[1]), - lowerRight = c(lat[1],lon[2]), - minNumTiles = 6, - type="https://stamen-tiles.a.ssl.fastly.net/toner-lite/{z}/{x}/{y}.png") -map.metro <- openmap(upperLeft = upperLeft.metro, - lowerRight = lowerRight.metro, - minNumTiles = 6, - type="https://stamen-tiles.a.ssl.fastly.net/toner-lite/{z}/{x}/{y}.png") - -mapLatLon <- openproj(map) +sfg_WA <- st_polygon(list(rbind(c(lon[1],lat[1]), + c(lon[2],lat[1]), + c(lon[2],lat[2]), + c(lon[1],lat[2]), + c(lon[1],lat[1]) + ))) +WATiles <- get_tiles(st_transform(st_sfc(sfg_WA, crs = 4326), 3857), provider = "Stadia.Stamen.TonerLite", crop = TRUE, zoom = 6) -OpenStreetMap::autoplot.OpenStreetMap(mapLatLon) + - geom_point(data = shape.df, - aes(x = longitude, - y = latitude, - color = totalschoo), +ggplot() + + geom_spatraster_rgb(data = WATiles) + + geom_sf(data = shape.df, + aes(color = totalschoo), show.legend = TRUE) + scale_color_viridis(option="viridis", name = "Number\nof pupils") + @@ -74,23 +67,28 @@ OpenStreetMap::autoplot.OpenStreetMap(mapLatLon) + y="") -# Zooming in on metro +# Zooming in on Perth metro shape.metro.df <- filter(shape.df, abs(latitude) <= max(abs(lat.metro)), abs(latitude) >= min(abs(lat.metro)), abs(longitude) <= max(abs(lon.metro)), abs(longitude) >= min(abs(lon.metro))) -mapLatLon.metro <- openproj(map.metro) +sfg_metro <- st_polygon(list(rbind(c(lon.metro[1],lat.metro[1]), + c(lon.metro[2],lat.metro[1]), + c(lon.metro[2],lat.metro[2]), + c(lon.metro[1],lat.metro[2]), + c(lon.metro[1],lat.metro[1]) + ))) +metroTiles <- get_tiles(st_transform(st_sfc(sfg_metro, crs = 4326), 3857), provider = "Stadia.Stamen.TonerLite", crop = TRUE, zoom = 11) # Let's look at secondary school only # 95th percentile of school size secon95th <- quantile(shape.metro.df[,"totalsecon">0]$totalsecon,probs = .95) -OpenStreetMap::autoplot.OpenStreetMap(mapLatLon.metro) + - geom_point(data = filter(shape.metro.df, totalsecon > 0), # geom_sf is not yet in ggplot2 on CRAN, so sticking to this for now - aes(x = longitude, - y = latitude, - color = totalsecon, - size = totalsecon) +ggplot() + + geom_spatraster_rgb(data = metroTiles) + + geom_sf(data = filter(shape.metro.df, totalsecon > 0), + aes(color = totalsecon, + size = totalsecon), ) + - geom_text(data = filter(shape.metro.df, totalsecon > secon95th), # name top 5% schools + geom_sf_label(data = filter(shape.metro.df, totalsecon > secon95th), # name top 5% schools aes(x = longitude, y = latitude, label = schoolname), -- 2.39.5