diff --git a/howTo/gisExample.R b/howTo/gisExample.R new file mode 100644 index 0000000000000000000000000000000000000000..fadcbb14559c093dcbcb7bc421d85ca2b478a064 --- /dev/null +++ b/howTo/gisExample.R @@ -0,0 +1,160 @@ +#Install/load pacman +if(!require(pacman)){install.packages("pacman");require(pacman)} +#Install/load tons of packages +p_load( + leaflet, + sf, + ggplot, + data.table, + ggspatial, + dplyr +) + + + + +# Census 2011 ---- +# https://www.cultureofinsight.com/post/multivariate-dot-density-maps-in-r-with-sf-ggplot2 + +# Loading 2011 Census output area shape file +# Downloaded from https://geoportal.statistics.gov.uk/ + + +dPathGeo <- "/Users/twr1m15/documents/data/geographical/census/" +# ukOA2011 <- st_read(paste0(dPathGeo,"England_oac_2011_shp/england_oac_2011.shp"),stringsAsFactors = FALSE,quiet = TRUE) + +# use 'clipped' boundaries - these exclude areas of water +ukOA2011b <- st_read(paste0(dPathGeo,"Output_Area_December_2011_Generalised_Clipped_Boundaries_in_England_and_Wales/Output_Area_December_2011_Generalised_Clipped_Boundaries_in_England_and_Wales.shp"),stringsAsFactors = FALSE,quiet = TRUE) + +# Load Census area lookup tables +ukLookupOA <- read.csv(paste0(dPathGeo,"Lookup/PCD_OA_LSOA_MSOA_LAD_MAY19_UK_LU.csv"), header=TRUE, sep=",", na.strings= c("NA", " ", ""), stringsAsFactors = FALSE) +ukLookupReg <- read.csv(paste0(dPathGeo,"Lookup/Output_Area_to_Region_December_2018_Lookup_in_England_and_Wales.csv"), header=TRUE, sep=",", na.strings= c("NA", " ", ""), stringsAsFactors = FALSE) + +head(ukLookupOA) + +ukLookupOA <- ukLookupOA %>% + select(-c("pcd7","pcd8","pcds","dointr","doterm","usertype","ladnmw")) + +ukLookupReg <- ukLookupReg %>% + dplyr::filter(!is.na(RGN18NM)) %>% + select(-c("RGN18NMW", "FID")) + + +ukLookupOA <- unique(ukLookupOA) + +uniqueN(ukLookupOA$oa11cd) + +head(ukLookupReg) + +# join OA lookup data and filter by region and local authority +ukLookup <- left_join(ukLookupOA,ukLookupReg, by = c("oa11cd" = "OA11CD")) + +ukLookup <- ukLookup %>% + dplyr::filter(RGN18NM == "South East") %>% + dplyr::filter(ladnm == "Southampton") + +head(ukLookup) + +# merge OA shape and lookup data +sf_data <- left_join(ukLookup,ukOA2011b, by = "oa11cd") %>% + st_as_sf() # reset as sf class + +# remove data tables no longer req'd +#rm(list = ls(pattern = "^ukLookup")) +#rm(ukOA2011) + +# Plot the map ---- + +# Using ggplot2 ---- +# see https://ggplot2.tidyverse.org/reference/ggsf.html +# some features like scale bar and north point require ggspatial package + +ggplot(sf_data) + + geom_sf() + + annotation_scale(location = "bl", width_hint = 0.5) + + annotation_north_arrow(location = "bl", which_north = "true", + style = north_arrow_fancy_orienteering) + +# Make interactive through plotly? https://plot.ly/ggplot2/maps-sf/ + +# Using leaflet ---- +# Useful help for leaflet +# https://rstudio.github.io/leaflet/choropleths.html +library(htmltools) + +# We need to transform the coordinate reference system for help see +# https://mgimond.github.io/Spatial/coordinate-systems-in-r.html + +st_crs(sf_data) # current coord system EPSG: 27700 +# Useful lookup spatial reference for CRS +# https://spatialreference.org/ref/epsg/27700/ + +st_crs(sf_data) # now CRS shows EPSG: 4326 (what leaflet wants) + +# transform the +sf_data <- st_transform(sf_data, "+proj=longlat +datum=WGS84") + +# Merge SAVE oa level data ---- +# Load file - created by gisDataProcess.Rmd +saveOAdata <- read.csv(paste0(dPath,"output/GIS/OAstats/gisExportRv2.csv"),stringsAsFactors = FALSE) + +# Join with output area data +saveOAprofiles <- left_join(saveOAdata,sf_data, by = c("oaCode" = "oa11cd")) %>% + rename("oa11cd" = "oaCode") %>% + st_as_sf() # reset as sf class + +saveLocalAuthList <- unique(saveOAprofiles$ladnm) + +# further filter to reduce size of data - no longer used +sf_data2 <- sf_data %>% + dplyr::filter(ladnm %in% saveLocalAuthList) + +# create popup first (requires htmltools) +sf_data2$popup_text <- + paste("Output area code: ","<b>", sf_data2$oa11cd, "</b>", + '<br/>', 'Local authority: ', '<b>', sf_data2$ladnm, '</b>', ' ') %>% + lapply(htmltools::HTML) + +leaflet(sf_data2) %>% + addTiles() %>% # Add default OpenStreetMap map tiles + addPolygons(color = "blue", fillColor = "blue", fillOpacity = 0.2, weight = 1.5, popup = ~(oa11cd), # popups clicked + label = ~(popup_text), # define labels + labelOptions = labelOptions( # label options + style = list("font-weight" = "normal", padding = "2px 2px"), + direction = "auto"), + highlight = highlightOptions( + weight = 5, + color = "#666", + fillOpacity = 0.7, + bringToFront = TRUE)) + + +dev.off() + +# create popup first (requires htmltools) +saveOAprofiles$popup_text <- + paste("Output area code: ","<b>", saveOAprofiles$oa11cd, "</b>", + '<br/>', 'Local authority: ', '<b>', saveOAprofiles$ladnm, '</b>', + '<br/>', 'Peak hours demand (OA): ', '<b>', round(saveOAprofiles$mean4to8), '</b>',' kW', + '<br/>', 'Peak hours demand (Household): ', '<b>', round(saveOAprofiles$mean4to8HH,3), '</b>',' kW') %>% + lapply(htmltools::HTML) + +# pal = colorQuantile("Reds", domain = saveOAprofiles$mean4to8, 5) +pal = colorBin("Reds", domain = saveOAprofiles$mean4to8, 5, pretty = TRUE) + + +leaflet(saveOAprofiles) %>% + addTiles() %>% # Add default OpenStreetMap map tiles + addPolygons(color = "blue", fillColor = ~pal(mean4to8), fillOpacity = 0.9, weight = 1, popup = ~(oa11cd), # popups clicked + label = ~(popup_text), # define labels + labelOptions = labelOptions( # label options + style = list("font-weight" = "normal", padding = "2px 2px"), + direction = "auto"), + highlight = highlightOptions( + weight = 5, + color = "#666", + fillOpacity = 0.7, + bringToFront = TRUE)) %>% + addLegend(pal = pal, values = ~mean4to8HH) %>% + addMiniMap() +