Skip to content

Commit

Permalink
Add ONS Open Geog API example
Browse files Browse the repository at this point in the history
  • Loading branch information
twrushby committed Jun 23, 2021
1 parent c7f6221 commit a6ca97c
Show file tree
Hide file tree
Showing 2 changed files with 93 additions and 1 deletion.
18 changes: 17 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,22 @@ Simple (and not so simple) examples of mapping data with R

You might also like https://git.soton.ac.uk/twr1m15/la_emissions_viz which drives https://rushby.shinyapps.io/LAemissions/

## data

The following example data is provided in this repository:

* Boundary data - for Solent region (various geographies: LA, LSOA, MSOA)
* Energy - area-based statistics for domestic electricity consumption (LSOA, MSOA)
* Lookup table for geographies

## rMappingExample

A simple example of mapping using R. Examples use Local Authority (LA) and Middle-layer Super Output Area (MSOA) geography and electricity consumption data (provided in `data` subfolder).

## ONS-open-geography

An example and resources for using the [ONS Open Geography portal](https://geoportal.statistics.gov.uk) to download geographical data and create maps using `Leaflet` package.

## Resources

### Openstreetmap for base maps (i.e. map tiles/rasters)
Expand All @@ -18,4 +34,4 @@ They want you to have an API key now. Yeah nah.

### tmap package - nice - check out the bubble geom

* https://cran.r-project.org/web/packages/tmap/vignettes/tmap-getstarted.html
* https://cran.r-project.org/web/packages/tmap/vignettes/tmap-getstarted.html
76 changes: 76 additions & 0 deletions open-geog-API/ONS-open-geography-example.R
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
# get feature layer data from ONS open geography API

# Really useful example of using ONS open geography portal with R
# https://medium.com/@traffordDataLab/pushing-the-boundaries-with-the-open-geography-portal-api-4d70637bddc3

library(sf)

# Load Local Authority geography from ----
# https://geoportal.statistics.gov.uk/datasets/ons::local-authority-districts-december-2020-uk-bgc/api

# Construct query URL from elements
geo_endpoint <- "https://ons-inspire.esriuk.com/arcgis/rest/services/"
geo_boundarylayer <- "Administrative_Boundaries/Local_Authority_Districts_December_2020_UK_BGC/"
geo_server <- "FeatureServer/0/"
geo_search <- "LAD20NM IN "

# Construct a vector of local authorities to load
# the following local authorities are the 'Solent' region
las_to_load <- c("Southampton","Portsmouth","Winchester",
"Eastleigh","Isle of Wight","Fareham",
"Gosport","Test Valley","East Hampshire",
"Havant","New Forest","Hart","Basingstoke and Deane")

geo_where <- las_to_load # sometimes we don't want all boundaries
geo_outfields <- "*" # returns all fields
#geo_outfields <- c("LAD20CD","LAD20NM","LONG","LAT") # use in place of line above to return selected fields only
geo_outSR <- "4326"
geo_format <- "json"

# Assemble the full URL for the query from elements above
geo_query_string <- paste0(geo_endpoint,geo_boundarylayer,geo_server,
"query?where=",geo_search,"(",paste(paste0("'",geo_where,"'"), collapse = ","),
")&outFields=",(paste(geo_outfields, collapse = ",")),"&outSR=",geo_outSR,"&f=",geo_format)


# Format the URL to remove spaces
geo_query <- URLencode(geo_query_string)
message("Loading LA geometry from ONS Open Geography API")
# API query
sf_data <- st_read(geo_query)
#plot(st_geometry(sf_data))

# Useful lookup spatial reference for CRS
# https://spatialreference.org/ref/epsg/27700/
st_coord_sys <- st_crs(sf_data) # check coord system
st_coord_sys # current coord system EPSG: 4326 (is what leaflet wants - good)

# transform the coord system if required
if(st_coord_sys$epsg != 4326){
sf_data <- st_transform(sf_data, "+proj=longlat +datum=WGS84")
}

# Create map (using leaflet) ----

# create popup first (using htmltools)
# by adding a column to sf_data object
library(htmltools)
sf_data$popup_text <-
paste("Locial authority area code: ","<b>", sf_data$lad20cd, "</b>",
'<br/>', 'Local authority: ', '<b>', sf_data$lad20nm, '</b>', ' ') %>%
lapply(htmltools::HTML)

# plot map
library(leaflet)
leaflet(sf_data) %>%
addTiles() %>% # Add default OpenStreetMap map tiles
addPolygons(color = "blue", fillColor = "blue", fillOpacity = 0.2, weight = 1.5, popup = ~(lad20nm), # 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))

0 comments on commit a6ca97c

Please sign in to comment.