]> git.vanrenterghem.biz Git - www2.vanrenterghem.biz.git/blob - source/posts/Red_Rooster_line.org
Add post about punk rock band.
[www2.vanrenterghem.biz.git] / source / posts / Red_Rooster_line.org
1 #+date: <2024-02-27 Tue 22:27>
2 #+filetags: :R:spatial:analysis:visualisation:open_web:
3 #+title: Sydney's Red Rooster line.
5 #+BEGIN_PREVIEW
7 Listening to ABC Radio National a couple of weeks ago, I learned about Sydney's Red Rooster line. It's a straight line that can be drawn across Sydney marking the socio-economic divide that exists between the northern and eastern suburbs of Sydney and the western and soutwestern ones. Out of curiosity, I set out to explore this using data available on the open web, in particular [[https://welcome.openstreetmap.org/what-is-openstreetmap/][OpenStreetMap]].
9 #+ATTR_HTML: :class img-fluid :alt Map of Sydney with Red Rooster line
10 [[file:../assets/Sydney_Red_Rooster_line.png]]
12 The above map was drawn in R using [[https://www.openstreetmap.org/][OpenStreetMap]] data for all its components.
14 #+END_PREVIEW
16 In R, obtaining data from OpenStreetMap is most easily done using the ~osmdata~ library, which provides functions to create and send an Overpass query. For instance, the snippet below obtains all locations that have been tagged as a fast food amenity within a geographical bounding box. In the same way, all roads, waterways and suburb boundaries can be obtained.
18 #+BEGIN_SRC R
19 fastfood <- lapply(bb, function(x) {
20     opq(x, timeout = 50) |>
21     add_osm_feature("amenity", "fast_food") |>
22     osmdata_sf()})
23 #+END_SRC
25 One of the quirks of the returned data is that any geometrical shape that has an element of it within the bounding box of the query is returned in whole. When rendered on a map surface, this results in the map exceeding the boundaries of the bounding box. Using the ~st_intersection()~ function this can be corrected relatively easily.
27 More difficult is rendering the ocean in a particular color, as there is no polygon returned for the partial ocean within the query geometry. This contrary to waterways and lakes. I solved this creating an outline for the overall land area within the bounding box, and subtracting that area from its bounding box area.
29 #+BEGIN_SRC R
30 outlines <- st_union(osm_multipolygons)
32 ocean <- function() {
33     a <- st_difference(boundingBoxSfc, outlines)
34     a <- st_transform(a, crs = st_crs(outlines))
35     return(a)}
36 #+END_SRC
38 In the full code, available on [[http://git.vanrenterghem.biz/R/openstreetmap-red-rooster-locations-analysis.git][my git server]], I also plot Perth to see whether the same socio-economic dividing line can be found over here in Western Australia's capital. It's certainly possible to see the affluent western suburbs are not as well served by Red Rooster as the eastern and southern ones:
40 #+ATTR_HTML: :class img-fluid :alt Map of Perth with Red Rooster locations
41 [[file:../assets/Perth_Red_Rooster_locations.png]]