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.
leaflet()
: inisiasi peta dengan memanggil fungsileaflet()
addProviderTiles()
: menambahkan peta dasar (base map) dengan perintahaddPolygons()
: menabahkan poligon dengan gradasi warna berdasarkan jumlah penduduk. Pengaturan warna gradasi menggunakancolorNumeric()
. Ditambahkan pula opsi label untu menampilkan popup, yang akan muncul ketika pengguna menyorot area tertentu.addLegend()
: menambahkan legendaaddLayersControl()
: menampilkan tombol untuk memilih layer yang akan ditampilkansetView()
: 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.