Membuat Dashboard Gempa Indonesia Interaktif dengan R dan Quarto

Indonesia dikenal sebagai salah satu negara dengan aktivitas seismik tertinggi di dunia. Hampir setiap hari, gempa bumi terjadi di berbagai wilayah Nusantara, mulai dari skala kecil hingga yang cukup kuat untuk dirasakan masyarakat. Data dari BMKG (Badan Meteorologi, Klimatologi, dan Geofisika) mencatat ribuan kejadian gempa setiap tahunnya.

Dataviz
Map
Author
Published

Wednesday, the 1st of October, 2025

1 Pendahuluan

Indonesia dikenal sebagai salah satu negara dengan aktivitas seismik tertinggi di dunia. Hampir setiap hari, gempa bumi terjadi di berbagai wilayah Nusantara, mulai dari skala kecil hingga yang cukup kuat untuk dirasakan masyarakat. Data dari BMKG (Badan Meteorologi, Klimatologi, dan Geofisika) mencatat ribuan kejadian gempa setiap tahunnya.

Namun, sekadar membaca data mentah tentu tidak cukup. Kita perlu cara yang lebih intuitif untuk memahami pola sebaran gempa—misalnya melalui peta interaktif yang mudah dijelajahi. Inilah mengapa visualisasi data menjadi penting: dengan satu tampilan dashboard, informasi yang rumit bisa diubah menjadi lebih sederhana, informatif, dan menarik.

Dalam artikel ini, kita akan belajar bagaimana membuat dashboard gempa Indonesia interaktif menggunakan R dan Quarto. Dashboard ini akan menampilkan peta lokasi gempa terbaru lengkap dengan informasi magnitudo, kedalaman, dan waktu kejadian. Hasilnya, siapa pun bisa langsung mengeksplorasi data gempa secara visual tanpa perlu repot membaca tabel panjang.


2 Persiapan Paket

Sebelum mulai membangun dashboard, kita perlu menyiapkan beberapa pustaka R yang akan membantu dalam mengolah data, mengakses API, hingga menampilkan peta interaktif. Setiap pustaka memiliki fungsi khusus:

  • tidyverse → digunakan untuk data wrangling (membersihkan, memfilter, dan mengubah data agar siap dipakai).
  • httr2 → untuk mengakses API BMKG sehingga kita bisa mengambil data gempa terkini langsung dari sumber resmi.
  • jsonlite → API BMKG menyajikan data dalam format JSON, dan pustaka ini membantu kita mengubahnya menjadi data frame di R.
  • leaflet → digunakan untuk membuat peta interaktif, sehingga lokasi gempa dapat divisualisasikan dengan marker dan popup informasi.
  • gt → membantu menampilkan data dalam bentuk tabel yang rapi dan mudah dibaca, sebagai pelengkap peta.
  • lubridate → memudahkan kita mengelola dan memformat data waktu, seperti tanggal dan jam kejadian gempa.
library(tidyverse)   # data wrangling
library(httr2)       # akses API BMKG
library(jsonlite)    # parsing JSON
library(leaflet)     # peta interaktif
library(gt)          # tabel interaktif
library(lubridate)   # manipulasi waktu

3 Konversi Koordinat

Data gempa dari BMKG biasanya masih disajikan dalam bentuk teks, misalnya:

  • 6.75 LS (Lintang Selatan)
  • 106.83 BT (Bujur Timur)

Agar dapat divisualisasikan di peta, data tersebut harus dikonversi menjadi angka numerik berupa koordinat latitude dan longitude.
Untuk itu, kita buat dua fungsi sederhana:

  1. convert_lat() → mengubah nilai lintang (LS/ LU) menjadi angka. Jika lintang berada di selatan (LS), maka nilainya dibuat negatif.
  2. convert_lon() → mengubah nilai bujur (BT/BB) menjadi angka. Jika bujur berada di barat (BB), maka nilainya dibuat negatif.
convert_lat <- function(x) {
  num <- as.numeric(gsub("[^0-9.]", "", x))
  if (grepl("LS", x)) return(-num) else return(num)
}

convert_lon <- function(x) {
  num <- as.numeric(gsub("[^0-9.]", "", x))
  if (grepl("BB", x)) return(-num) else return(num)
}

4 Mengambil Data Gempa dari API BMKG

Setelah menyiapkan fungsi konversi koordinat, langkah berikutnya adalah mengambil data gempa terkini dari API BMKG.
BMKG menyediakan data gempa dalam format JSON yang dapat diakses secara publik.

Pada contoh ini, kita menggunakan alamat https://data.bmkg.go.id/DataMKG/TEWS/gempadirasakan.json.

Langkah-langkahnya adalah sebagai berikut:

  1. Membuat request ke API BMKG menggunakan httr2.
  2. Menerima respon dari server dalam format JSON.
  3. Parsing JSON menjadi data frame dengan bantuan jsonlite.
  4. Membersihkan dan memformat data, seperti:
    • Menggabungkan kolom Tanggal dan Jam menjadi DateTime.
    • Mengubah Magnitude menjadi numerik.
    • Membersihkan teks Kedalaman menjadi angka saja (dalam km).
    • Mengonversi koordinat Lintang dan Bujur dengan fungsi convert_lat() dan convert_lon().
    • Menyimpan lokasi gempa dari kolom Wilayah.
  5. Mengurutkan data berdasarkan waktu kejadian terbaru.
req <- request("https://data.bmkg.go.id/DataMKG/TEWS/gempadirasakan.json")
resp <- req_perform(req)

gempa_raw <- resp |> 
  resp_body_string() |> 
  fromJSON()

gempa_df <- gempa_raw$Infogempa$gempa |> 
  as_tibble() |> 
  mutate(
    DateTime = dmy_hms(paste(Tanggal, Jam)), 
    magnitude = as.numeric(Magnitude),
    depth = as.numeric(gsub(" km", "", Kedalaman)),
    lat = sapply(Lintang, convert_lat),
    lon = sapply(Bujur, convert_lon),
    lokasi = Wilayah
  ) |> 
  arrange(desc(DateTime))

5 Ringkasan Gempa Terkini

Setelah data berhasil kita olah, langkah berikutnya adalah membuat ringkasan informasi penting agar pengguna dashboard bisa langsung mendapatkan gambaran cepat tanpa harus melihat tabel atau peta.

Beberapa hal yang ingin kita tampilkan:

  • Jumlah gempa dalam 24 jam terakhir
  • Waktu sejak gempa terakhir terjadi

Kode berikut melakukan perhitungan tersebut:

now_id <- now(tzone = "Asia/Jakarta")   # waktu saat ini di zona WIB
last_24 <- gempa_df |> filter(DateTime > (now_id - hours(24)))  # gempa dalam 24 jam terakhir
n_24 <- nrow(last_24)  # jumlah gempa
hours_last <- round(difftime(now_id, gempa_df$DateTime[1], units = "hours"))  # jam sejak gempa terakhir

6 Peta Gempa Interaktif

Langkah selanjutnya adalah menampilkan data gempa ke dalam peta interaktif.
Dengan bantuan pustaka leaflet, kita bisa membuat peta yang:

  • Menampilkan titik lokasi gempa berdasarkan koordinat (lat, lon).
  • Memberi warna sesuai dengan magnitudo gempa.
  • Mengatur ukuran marker agar lebih mudah dibedakan.
  • Menambahkan popup informasi berisi detail waktu, magnitudo, kedalaman, dan lokasi gempa.
  • Melengkapi peta dengan legend untuk membantu interpretasi.

Berikut kodenya:

mag_pal <- colorBin("inferno", domain = 1:8, bins = c(0:5, 8))

quake_map <- gempa_df |> 
  leaflet() |> 
  addTiles() |> 
  addCircleMarkers(
    ~lon, ~lat,
    color = ~ mag_pal(magnitude),
    stroke = FALSE,
    fillOpacity = 0.7,
    radius = ~ scales::rescale(sqrt(magnitude), c(3, 12)),
    label = ~ paste0(
      format(DateTime, "%Y-%m-%d %H:%M"), "<br/>",
      "Magnitude: ", magnitude, "<br/>",
      "Kedalaman: ", depth, " km<br/>",
      "Lokasi: ", lokasi
    ) |> lapply(htmltools::HTML)
  ) |> 
  addLegend(
    title = "Magnitude", 
    pal = mag_pal, values = ~magnitude
  )

quake_map

7 Tabel Ringkasan Gempa

Selain peta interaktif, dashboard juga akan lebih informatif bila dilengkapi dengan tabel ringkasan.
Tabel ini menampilkan 10 gempa terbaru dari data BMKG, lengkap dengan waktu, lokasi, magnitudo, dan kedalaman.

Dengan menggunakan pustaka gt, tabel dapat dibuat lebih rapi, diberi warna sesuai intensitas magnitudo, dan ditambahkan keterangan sumber data.

top_n <- gempa_df |> 
  slice(1:10) |> 
  select(DateTime, magnitude, depth, lokasi)

top_n_table <- top_n |> 
  gt() |> 
  cols_label(
    DateTime = "Waktu",
    lokasi = "Lokasi",
    magnitude = "Magnitude",
    depth = "Kedalaman (km)"
  ) |> 
  fmt_number(columns = magnitude, decimals = 1) |> 
  fmt_integer(columns = depth) |> 
  data_color(
    columns = magnitude,
    fn = mag_pal
  ) |> 
  tab_header(title = md("**10 Gempa Terbaru (BMKG)**")) |> 
  tab_source_note(
    source_note = md(
      paste("Sumber: [BMKG](https://data.bmkg.go.id) • Diakses:", 
            format(now_id, "%Y-%m-%d %H:%M %Z"))
    )
  )

top_n_table
10 Gempa Terbaru (BMKG)
Waktu Magnitude Kedalaman (km) Lokasi
2025-09-30 23:49:43 6.5 11 Pusat gempa berada di laut 50 km Tenggara Sumenep - Jawa Timur
2025-09-30 08:41:30 3.5 13 Pusat gempa berada di laut 125 km baratdaya Kabupaten Garut
2025-09-30 05:30:15 4.9 12 Pusat gempa berada di laut, 121 km BaratDaya KAB-GARUT
2025-09-29 22:24:06 2.7 35 Pusat gempa berada di laut 25 km Baratlaut Nabire
2025-09-29 12:03:28 3.1 15 Pusat gempa berada di darat 15 km timur laut Alor
2025-09-28 21:06:20 2.8 17 Pusat gempa berada di darat 20 km BaratDaya Kota Bogor
2025-09-28 09:54:26 3.5 5 Pusat gempa berada di laut 51 km barat daya Mamuju Tengah
2025-09-27 16:08:55 5.1 12 Pusat gempa berada di laut 88 km Timur Laut Maluku Tengah
2025-09-27 07:09:10 4.1 13 Pusat gempa berada di darat 5 Km BaratLaut Nabire
2025-09-26 22:08:55 3.0 9 Pusat gempa berada di darat 26 km timur laut Kab. Sukabumi
Sumber: BMKG • Diakses: 2025-10-02 13:08 WIB
Back to top