Data spasial merupakan data yang merepresentasikan gambaran kejadian di permukaan bumi yang disajikan dalam bentuk peta, grafik dan gambar berformat digital. Data spasial tidak hanya terdiri dari baris dan kolom seperti data tabular pada umumnya, tetapi juga mencakup informasi geometris objek seperti titik (koordinat), garis, dan poligon atau area. Format yang paling umum digunakan untuk data spasial adalah shapefiles yang dikembangkan oleh ESRI. Format lain yang bisa dipakai antara lain GeoJSON dan GeoPackage. Pada latihan ini akan fokus pada data spasial yang disimpan dalam format shapefiles.

Shapefiles merupakan format vektor dari data spasial yang terdiri dari beberapa ekstensi file (Rahma Anisa 2021), yaitu:

  • Shapefile shape (.shp)
  • Shapefile shape index (.shx)
  • Shapefile attribute (.dbf)

Format shapefiles merupakan format yang sering banyak digunakan. Sehingga berbagai software yang mendukung analisis data spasial biasanya dapat digunakan untuk membuka dan mengelola shapefiles, termasuk R.

Data spasial biasanya disajikan dalam bentuk peta tematik. Salah satu jenis peta yang banyak digunakan adalah peta choropleth, yaitu jenis peta tematik yang merepresentasikan data/statistik menggunakan berbagai gradasi warna dan simbol di atas area area geografis tertentu (misalnya negara, provinsi, kabupaten dan lain-lain) (Rahmi 2021).

Pada artikel ini akan disajikan peta choropleth sebaran penduduk di Kota Bogor berdasarkan kecamatan. Shapefile diperoleh dari website data.humdata.org (HDX 2020). Sedangkan data penduduk diperoleh dari Visualisasi Data Kependudukan Kementerian Dalam Negeri (Kemendagri 2020).

Paket yang Digunakan

Ada beberapa package yang akan digunakan, yaitu dplyr untuk mengelola data frame, sf (Pebesma 2018) untuk mengelola data spasial, ggplot2 untuk membuat grafis dan leaflet untuk membuat peta interaktif. Silakan instal paket-paket tersebut terlebih dahulu:

install.packages(c("dplyr", "sf", "ggplot2", "leaflet"))

Kemudian load ke dalam working space

library(dplyr)
library(sf)
library(ggplot2)
library(leaflet)

Membaca Data Spasial

Membaca data dapat dilakukan dengan menggunakan fungsi st_read() dari paket sf. Gambaran data dapat ditampilkan dengan fungsi glimpse() dari paket dplyr.

Seluruh data yang digunakan dapat di download di sini

mapIndonesia <- st_read("data/map/shp/idn_admbnda_adm3_bps_20200401.shp", 
                        quiet = TRUE)
glimpse(mapIndonesia)
## Rows: 7,069
## Columns: 17
## $ Shape_Leng <dbl> 0.2798656, 0.7514001, 0.6900061, 0.6483629, 0.2437073, 1.35…
## $ Shape_Area <dbl> 0.003107633, 0.016925540, 0.024636382, 0.010761277, 0.00116…
## $ ADM3_EN    <chr> "2 X 11 Enam Lingkung", "2 X 11 Kayu Tanam", "Abab", "Abang…
## $ ADM3_PCODE <chr> "ID1306050", "ID1306052", "ID1612030", "ID5107050", "ID7471…
## $ ADM3_REF   <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
## $ ADM3ALT1EN <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
## $ ADM3ALT2EN <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,…
## $ ADM2_EN    <chr> "Padang Pariaman", "Padang Pariaman", "Penukal Abab Lematan…
## $ ADM2_PCODE <chr> "ID1306", "ID1306", "ID1612", "ID5107", "ID7471", "ID9432",…
## $ ADM1_EN    <chr> "Sumatera Barat", "Sumatera Barat", "Sumatera Selatan", "Ba…
## $ ADM1_PCODE <chr> "ID13", "ID13", "ID16", "ID51", "ID74", "ID94", "ID94", "ID…
## $ ADM0_EN    <chr> "Indonesia", "Indonesia", "Indonesia", "Indonesia", "Indone…
## $ ADM0_PCODE <chr> "ID", "ID", "ID", "ID", "ID", "ID", "ID", "ID", "ID", "ID",…
## $ date       <date> 2019-12-20, 2019-12-20, 2019-12-20, 2019-12-20, 2019-12-20…
## $ validOn    <date> 2020-04-01, 2020-04-01, 2020-04-01, 2020-04-01, 2020-04-01…
## $ validTo    <date> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
## $ geometry   <MULTIPOLYGON [°]> MULTIPOLYGON (((100.2811 -0..., MULTIPOLYGON (…

Terlihat bahwa data mapIndonesia hanya berisi informasi geografis. Untuk itu kita membutuhkan data tambahan.

dataBogor <- read.csv("data/Demografi-Bogor.csv")
dataBogor
##         Kota     Kecamatan   KodeBPS KodeKemendagri JumlahPenduduk LuasWilayah
## 1 Kota Bogor   Bogor Barat ID3271050       32.71.04         244708       23.08
## 2 Kota Bogor Bogor Selatan ID3271010       32.71.01         208185       31.16
## 3 Kota Bogor  Bogor Tengah ID3271040       32.71.03         106359        8.11
## 4 Kota Bogor   Bogor Timur ID3271020       32.71.02         105233       10.75
## 5 Kota Bogor   Bogor Utara ID3271030       32.71.05         192837       18.88
## 6 Kota Bogor  Tanah Sareal ID3271060       32.71.06         218135       21.25
##   KepadatanPenduduk
## 1             10603
## 2              6681
## 3             13115
## 4              9789
## 5             10214
## 6             10265

Selanjutnya gabungkan kedua data tersebut menjadi satu. Karena kita hanya ingin menampilkan peta Kota Bogor, maka kita bisa gunakan fungsi inner_join() berdasarkan kolom ADM3_PCODE dari mapIndonesia dan kolom KodeBPS dari dataBogor.

mapBogor<- mapIndonesia %>%
  inner_join(dataBogor, by = c("ADM3_PCODE" = "KodeBPS"))
mapBogor
## Simple feature collection with 6 features and 22 fields
## Geometry type: MULTIPOLYGON
## Dimension:     XY
## Bounding box:  xmin: 106.735 ymin: -6.679585 xmax: 106.8488 ymax: -6.510802
## Geodetic CRS:  WGS 84
##   Shape_Leng   Shape_Area       ADM3_EN ADM3_PCODE ADM3_REF ADM3ALT1EN
## 1  0.3644271 0.0018624008   Bogor Barat  ID3271050     <NA>       <NA>
## 2  0.3413273 0.0025144096 Bogor Selatan  ID3271010     <NA>       <NA>
## 3  0.1849809 0.0006540943  Bogor Tengah  ID3271040     <NA>       <NA>
## 4  0.1943379 0.0008671386   Bogor Timur  ID3271020     <NA>       <NA>
## 5  0.2430896 0.0015239343   Bogor Utara  ID3271030     <NA>       <NA>
## 6  0.2357695 0.0017147180  Tanah Sereal  ID3271060     <NA>       <NA>
##   ADM3ALT2EN    ADM2_EN ADM2_PCODE    ADM1_EN ADM1_PCODE   ADM0_EN ADM0_PCODE
## 1       <NA> Kota Bogor     ID3271 Jawa Barat       ID32 Indonesia         ID
## 2       <NA> Kota Bogor     ID3271 Jawa Barat       ID32 Indonesia         ID
## 3       <NA> Kota Bogor     ID3271 Jawa Barat       ID32 Indonesia         ID
## 4       <NA> Kota Bogor     ID3271 Jawa Barat       ID32 Indonesia         ID
## 5       <NA> Kota Bogor     ID3271 Jawa Barat       ID32 Indonesia         ID
## 6       <NA> Kota Bogor     ID3271 Jawa Barat       ID32 Indonesia         ID
##         date    validOn validTo       Kota     Kecamatan KodeKemendagri
## 1 2019-12-20 2020-04-01    <NA> Kota Bogor   Bogor Barat       32.71.04
## 2 2019-12-20 2020-04-01    <NA> Kota Bogor Bogor Selatan       32.71.01
## 3 2019-12-20 2020-04-01    <NA> Kota Bogor  Bogor Tengah       32.71.03
## 4 2019-12-20 2020-04-01    <NA> Kota Bogor   Bogor Timur       32.71.02
## 5 2019-12-20 2020-04-01    <NA> Kota Bogor   Bogor Utara       32.71.05
## 6 2019-12-20 2020-04-01    <NA> Kota Bogor  Tanah Sareal       32.71.06
##   JumlahPenduduk LuasWilayah KepadatanPenduduk                       geometry
## 1         244708       23.08             10603 MULTIPOLYGON (((106.7649 -6...
## 2         208185       31.16              6681 MULTIPOLYGON (((106.7961 -6...
## 3         106359        8.11             13115 MULTIPOLYGON (((106.7885 -6...
## 4         105233       10.75              9789 MULTIPOLYGON (((106.8315 -6...
## 5         192837       18.88             10214 MULTIPOLYGON (((106.8183 -6...
## 6         218135       21.25             10265 MULTIPOLYGON (((106.7822 -6...

Peta Statis dengan ggplot2

Data spasial dan informasi jumlah penduduk kota bogor sudah tersedia dalam satu dataframe. Untuk menyajikan dalam peta, beberapa paket R dapat digunakan. Untuk jenis peta statis (biasanya untuk tujuan dicetak) paket ggplot2 (Wickham 2016) bisa menjadi pilihan yaitu dengan fungsi geom_sf().

Konsep dari ggplot2 dalam visualisasi data adalah dengan mengkombinasikan data, stat dan geom atau layer. Pada perintah berikut, ggplot() akan menginisiasi layer kosong yang siap ditambahkan layer-layer lain diatasnya. Lalu geom_sf() akan memetakan data mapBogor, di mana setiap area/poligon akan diberi gradasi warna sesuai nilai pada kolom JumlahPenduduk.

p <- ggplot() +  
  geom_sf(data=mapBogor, aes(fill=JumlahPenduduk))
p

ggplot2 dilengkapi dengan banyak opsi untuk mengatur tampilkan dari output. Misalnya scale_fill_gradientn() untuk mengatur gradasi warna (secara otomatis ataupun costum), labs() untuk menambahkan judul grafik maupun keterangan sumbu, theme() untuk mengatur tema (legenda, jenis dan ukuran huruf, dan lain-lain), scale_**_continuous() pengaturan sumbu tegak maupun sumbu mendatar.

colorPalette = RColorBrewer::brewer.pal(5,"YlGnBu")
legendBreak = c(120,170,230)*1000
yBreak = seq(106.72, 106.86, by=0.04)

p + scale_fill_gradientn(colors = colorPalette, 
                       breaks = legendBreak, 
                       name = "Jumlah Penduduk") +
  labs(title = "Jumlah Penduduk Kota Bogor")  +
  theme(legend.text = element_text(size=7),
        legend.title = element_text(size=7),
        axis.text.x = element_text(size = 7),
        axis.text.y = element_text(size = 7),
        title = element_text(size=12, face='bold')) +
  scale_x_continuous(breaks = yBreak) 

Peta Interaktif dengan leaflet

Selain secara statis, peta choropleth juga dapat ditampilkan secara dinamis atau interaktif. Biasanya jika peta yang dibuat akan ditampilkan dalam halaman web. Disebut interaktif karena pengguna tidak hanya bisa “melihat” peta saja, tapi juga bisa berinteraksi langsung seperti memilih layer yang akan ditampilkan, memperbesar atau memperkecil peta, menyorot bagian tertentu pada peta untuk menampilkan data atau statistik, dan lain-lain.

Leaflet adalah salah satu JavaScript library yang paling populer untuk membuat peta interaktif. Untuk yang tidak familiar dengan JavaScript, peta leaflet dapat dibuat dibuat, diatur dan diintegrasikan dengan R menggunakan paket leaflet(Cheng, Karambelkar, and Xie 2021).

Peta yang dibuat dengan leaflet dapat diintegrasikan dalam RMarkdown dan aplikasi Shinny dengan cara yang mirip dengan ggplot2.

Berikut perintah-perintah untuk menampilkan jumlah penduduk Kota Bogor dengan peta leaflet.

  1. leaflet(): inisiasi peta dengan memanggil fungsi leaflet()
  2. addProviderTiles(): menambahkan peta dasar (base map) dengan perintah
  3. addPolygons(): menabahkan poligon dengan gradasi warna berdasarkan jumlah penduduk. Pengaturan warna gradasi menggunakan colorNumeric(). Ditambahkan pula opsi label untu menampilkan popup, yang akan muncul ketika pengguna menyorot area tertentu.
  4. addLegend(): menambahkan legenda
  5. addLayersControl(): menampilkan tombol untuk memilih layer yang akan ditampilkan
  6. setView(): mengatur posisi dan zooming default
# membuat custom palette warna
populationPalette <- colorNumeric(
  palette = "YlGnBu",
  domain = mapBogor$JumlahPenduduk
)

# membuat custom popup
popupLabel <- paste0(
    "<b>Kecamatan ", mapBogor$Kecamatan,"</b><br/>", 
    "Jumlah Penduduk (jiwa): ", mapBogor$JumlahPenduduk, "<br/>", 
    "Luas Wilayah (km2): ", mapBogor$LuasWilayah, "<br/>", 
    "Kepadatan Penduduk (jiwa/km2): ", mapBogor$KepadatanPenduduk) %>%
  lapply(htmltools::HTML)
# membuat peta leaflet
leaflet(mapBogor) %>% 
  addProviderTiles(providers$CartoDB.PositronNoLabels, group = "Light Mode") %>%
  addProviderTiles(providers$CartoDB.DarkMatterNoLabels, group = "Dark Mode") %>%
  
  addPolygons(weight = 1,
              opacity = 1, 
              fillOpacity = 0.9,
              label = popupLabel,
              color = ~populationPalette(JumlahPenduduk),
              highlightOptions = highlightOptions(color = "white", 
                                                  weight = 2, 
                                                  bringToFront = TRUE) ) %>%
  addLegend(position = "bottomright", 
            pal = populationPalette, 
            values = ~JumlahPenduduk,
            title = "Jumlah\nPenduduk",
            opacity = 1) %>%
  
  addLayersControl(position = 'topright',
                   baseGroups = c("Light Mode", "Dark Mode"),
                   options = layersControlOptions(collapsed = FALSE)) %>%
  
  setView(lat = - 6.595, lng = 106.87, zoom = 12)

Output peta di atas dapat diperbesar atau diperkecil, dan jika pengguna menyorot area tertentu maka akan muncul beberapa data dalam bentuk pop-up. Juga dapat memilih basemap yang akan digunakan, apakah terang atau gelap.

Sebetulnya peta ini masih bisa dikembangkan, misalnya dengan menambahkan data lain seperti kepadatan penduduk, jumlah penduduk menurut jenis kelamin dan data-data lainnya lalu pengguna diberi pilihan untuk memilih data apa yang ingin dilihatnya.


Cheng, Joe, Bhaskar Karambelkar, and Yihui Xie. 2021. Leaflet: Create Interactive Web Maps with the JavaScript ’Leaflet’ Library. https://CRAN.R-project.org/package=leaflet.

HDX. 2020. “Indonesia - Subnational Administrative Boundaries,” April. https://data.humdata.org/dataset/indonesia-administrative-boundary-polygons-lines-and-places-levels-0-4b.

Kemendagri. 2020. “Visualisasi Data Kependudukan,” June. https://gis.dukcapil.kemendagri.go.id/peta/.

Pebesma, Edzer. 2018. “Simple Features for R: Standardized Support for Spatial Vector Data.” The R Journal 10 (1): 439–46. https://doi.org/10.32614/RJ-2018-009.

Rahma Anisa, Abdul Aziz Nurussadad, Gerry Alfa Dito. 2021. “Working with Spatial Data,” February. https://newlms.ipb.ac.id/course/view.php?id=4791.

Rahmi, Annisa. 2021. “Database Queries Dan Spatial Data,” March. https://www.rpubs.com/annisarahmi/732309.

Wickham, Hadley. 2016. Ggplot2: Elegant Graphics for Data Analysis. Springer-Verlag New York. https://ggplot2.tidyverse.org.