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.
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:
-
convert_lat() → mengubah nilai lintang (LS/ LU) menjadi angka. Jika lintang berada di selatan (LS), maka nilainya dibuat negatif.
- 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:
-
Membuat request ke API BMKG menggunakan
httr2.
-
Menerima respon dari server dalam format JSON.
-
Parsing JSON menjadi data frame dengan bantuan
jsonlite.
-
Membersihkan dan memformat data, seperti:
- Menggabungkan kolom
TanggaldanJammenjadiDateTime.
- Mengubah
Magnitudemenjadi numerik.
- Membersihkan teks
Kedalamanmenjadi angka saja (dalam km).
- Mengonversi koordinat
LintangdanBujurdengan fungsiconvert_lat()danconvert_lon().
- Menyimpan lokasi gempa dari kolom
Wilayah.
- Menggabungkan kolom
- 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 terakhir6 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_map7 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 | |||