Hands-on Exercise 8-2

Visualising Geospatial Point Data

Author

Teo Suan Ern

Published

February 16, 2024

Modified

March 9, 2024

Note: First modified to include author’s details. Last modified to rename hands-on exercise number.

1. Getting Started

1.1 Install and launch R packages

For the purpose of this exercise, the following R packages will be used.

Show code
pacman::p_load(sf, tmap, tidyverse)

1.2 Import the data

SGPools_svy21 dataset is used for this hands-on exercise. The dataset is retrieved from Singapore SVY21 Projected Coordinates System. The XCOORD and YCOORD columns are the x-coordinates and y-coordinates of SingPools outlets and branches.

Show code
sgpools <- read_csv("data/aspatial/SGPools_svy21.csv")

1.3 Examine data structure

list(sgpools)
[[1]]
# A tibble: 306 × 7
   NAME           ADDRESS POSTCODE XCOORD YCOORD `OUTLET TYPE` `Gp1Gp2 Winnings`
   <chr>          <chr>      <dbl>  <dbl>  <dbl> <chr>                     <dbl>
 1 Livewire (Mar… 2 Bayf…    18972 30842. 29599. Branch                        5
 2 Livewire (Res… 26 Sen…    98138 26704. 26526. Branch                       11
 3 SportsBuzz (K… Lotus …   738078 20118. 44888. Branch                        0
 4 SportsBuzz (P… 1 Sele…   188306 29777. 31382. Branch                       44
 5 Prime Serango… Blk 54…   552542 32239. 39519. Branch                        0
 6 Singapore Poo… 1A Woo…   731001 21012. 46987. Branch                        3
 7 Singapore Poo… Blk 64…   370064 33990. 34356. Branch                       17
 8 Singapore Poo… Blk 88…   370088 33847. 33976. Branch                       16
 9 Singapore Poo… Blk 30…   540308 33910. 41275. Branch                       21
10 Singapore Poo… Blk 20…   560202 29246. 38943. Branch                       25
# ℹ 296 more rows

1.4 Data Preparation

Creating a sf data frame from an aspatial dataframe

The code chunk below converts sgpools data frame into a simple feature data frame by using st_as_sf() of sf packages.

Show code
sgpools_sf <- st_as_sf(sgpools, 
                       coords = c("XCOORD", "YCOORD"),
                       crs= 3414)
Learning Points
  • The coords argument requires users to provide the column name of the x-coordinates first then followed by the column name of the y-coordinates.

  • The crs argument requilightcoral users to provide the coordinates system in epsg format. EPSG: 3414 is Singapore SVY21 Projected Coordinate System. You can search for other country’s epsg code by refering to epsg.io.

  • New variable geometry is created and added to the dataframe.

list(sgpools_sf)
[[1]]
Simple feature collection with 306 features and 5 fields
Geometry type: POINT
Dimension:     XY
Bounding box:  xmin: 7844.194 ymin: 26525.7 xmax: 45176.57 ymax: 47987.13
Projected CRS: SVY21 / Singapore TM
# A tibble: 306 × 6
   NAME                         ADDRESS POSTCODE `OUTLET TYPE` `Gp1Gp2 Winnings`
 * <chr>                        <chr>      <dbl> <chr>                     <dbl>
 1 Livewire (Marina Bay Sands)  2 Bayf…    18972 Branch                        5
 2 Livewire (Resorts World Sen… 26 Sen…    98138 Branch                       11
 3 SportsBuzz (Kranji)          Lotus …   738078 Branch                        0
 4 SportsBuzz (PoMo)            1 Sele…   188306 Branch                       44
 5 Prime Serangoon North        Blk 54…   552542 Branch                        0
 6 Singapore Pools Woodlands C… 1A Woo…   731001 Branch                        3
 7 Singapore Pools 64 Circuit … Blk 64…   370064 Branch                       17
 8 Singapore Pools 88 Circuit … Blk 88…   370088 Branch                       16
 9 Singapore Pools Anchorvale … Blk 30…   540308 Branch                       21
10 Singapore Pools Ang Mo Kio … Blk 20…   560202 Branch                       25
# ℹ 296 more rows
# ℹ 1 more variable: geometry <POINT [m]>

The output shows that sgppols_sf is in point feature class with epsg ID - 3414. The bounding box provides information of the extend of the geospatial data.

2. Drawing Proportional Symbol Map

To create an interactive proportional symbol map in R, the view mode of tmap will be used.

The code churn below will turn on the interactive mode of tmap.

Show code
tmap_mode("view")

Plot Interactive Point Symbol Map

Show code
tm_shape(sgpools_sf)+
tm_bubbles(col = "lightcoral",
           size = 1,
           border.col = "black",
           border.lwd = 1)
Leaflet | Tiles © Esri — Esri, DeLorme, NAVTEQ

Make the Map Proportional

To draw a proportional symbol map, we need to assign a numerical variable to the size visual attribute. The code chunks below show that the variable Gp1Gp2Winnings is assigned to size visual attribute.

Show code
tm_shape(sgpools_sf)+
tm_bubbles(col = "lightcoral",
           size = "Gp1Gp2 Winnings",
           border.col = "black",
           border.lwd = 1)
Leaflet | Tiles © Esri — Esri, DeLorme, NAVTEQ

Adjust the Map with Different Colours

The proportional symbol map can be further improved by using the colour visual attribute. In the code chunks below, OUTLET_TYPE variable is used as the colour attribute variable.

Show code
tm_shape(sgpools_sf)+
tm_bubbles(col = "OUTLET TYPE", 
          size = "Gp1Gp2 Winnings",
          border.col = "black",
          border.lwd = 1)
OUTLET TYPE
Branch
Outlet
Leaflet | Tiles © Esri — Esri, DeLorme, NAVTEQ

Plot Twin Maps

Design Feature of tmap

Works with faceted plots. The argument sync in tm_facets() can be used to produce multiple maps with synchronised zoom and pan settings.

Show code
tm_shape(sgpools_sf) +
  tm_bubbles(col = "OUTLET TYPE", 
          size = "Gp1Gp2 Winnings",
          border.col = "black",
          border.lwd = 1) +
  tm_facets(by= "OUTLET TYPE",
            nrow = 1,
            sync = TRUE)
Branch
OUTLET TYPE
Branch
Outlet
Leaflet | Tiles © Esri — Esri, DeLorme, NAVTEQ
Outlet
OUTLET TYPE
Branch
Outlet
Leaflet | Tiles © Esri — Esri, DeLorme, NAVTEQ

Switch tmap’s viewer back to plot mode by using the code chunk below.

tmap_mode("plot")

3. References

22 Visualising Geospatial Point Data

Back to top