Visualisasi Data Gempa Bumi Indonesia dengan Bahasa R


Data gempa bumi merupakan informasi spasial penting yang sangat bermanfaat untuk analisis bencana, mitigasi risiko, dan edukasi publik. Salah satu sumber data gempa yang terbuka dan mudah diakses adalah dari United States Geological Survey (USGS) melalui format GeoJSON.
Dalam tutorial ini, kita akan belajar bagaimana menampilkan data gempa signifikan yang terjadi di wilayah Indonesia dalam bentuk peta interaktif, menggunakan bahasa R dengan bantuan pustaka leaflet
, serta menampilkan informasi gempa melalui popup pin di lokasi kejadian.
Instalasi Paket R
Sebelum memulai visualisasi, kita perlu menginstal dan memuat beberapa pustaka yang akan digunakan:
sf
: untuk membaca dan menangani data spasial termasuk GeoJSONleaflet
: untuk membuat peta interaktif berbasis web langsung dari Rhttr
: untuk mengambil data dari URL melalui HTTPjsonlite
: untuk memproses data dalam format JSONdplyr
: untuk memanipulasi dan menyaring data
Pastikan pustaka-pustaka berikut sudah terinstal
R
# Instalasi pustaka install.packages("sf") install.packages("leaflet") install.packages("httr") install.packages("jsonlite") install.packages("dplyr") # Memuat pustaka library(sf) library(leaflet) library(httr) library(jsonlite) library(dplyr)
Membaca Data Gempa dari USGS
USGS (United States Geological Survey) menyediakan data gempa bumi secara terbuka melalui berbagai API yang bisa diakses dalam format GeoJSON. Data ini mencakup berbagai periode waktu dan kriteria, antara lain:
all_day.geojson
: Semua gempa yang terjadi dalam 24 jam terakhirall_week.geojson
: Semua gempa selama seminggu terakhir
: Semua gempa selama 30 hari terakhirall
_month.geojsonsignificant_month.geojson
: Gempa yang signifikan selama 30 hari terakhir4.5_day.geojson
: Gempa dengan magnitudo > 4.5 dalam 1 hari
Informasi yang diberikan sangat lengkap, mulai dari magnitudo, lokasi, waktu, apakah menyebabkan tsunami atau tidak dan masih banyak lagi. Struktur data lengkap serta dokumentasi resmi bisa diakses di: https://earthquake.usgs.gov/earthquakes/feed/v1.0/geojson.php
Baca juga: Mengenal Data GeoJSON untuk Analisis Geospasial
Berikut adalah contoh potongan output dari API USGS ini:
JSON
.... { "type": "Feature", "properties": { "mag": 0.72, "place": "8 km WNW of Cobb, CA", "time": 1751090647690, "updated": 1751090745875, "tz": null, "url": "https://earthquake.usgs.gov/earthquakes/eventpage/nc75201611", "detail": "https://earthquake.usgs.gov/earthquakes/feed/v1.0/detail/nc75201611.geojson", .... "magType": "md", "type": "earthquake", "title": "M 0.7 - 8 km WNW of Cobb, CA" }, "geometry": { "type": "Point", "coordinates": [-122.806663513184, 38.8424987792969, 1.27999997138977] }, "id": "nc75201611" } ...
Pada contoh ini, kita akan menggunakan data semua gempa dalam 30 hari terakhir. Karena data ini bersifat dinamis, maka data yang disajikan bisa sangat berbeda tergantung kapan API tersebut diakses. Selain itu, untuk menyederhanakan, kita akan menyaring data gempa yang terjadi di wilayah Indonesia saja.
R
# Endpoint untuk data semua gempa dalam satu bulan terakhir url <- "https://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/all_month.geojson" # membaca data gempa_raw <- st_read(url) # Filter data di mana lokasi mengandung kata "Indonesia" (pada properti 'place') # Merubah format waktu menjadi format kalender (contoh: 2025-06-15 23:31:19.661) gempa_id <- gempa_raw %>% filter(grepl("Indonesia", place)) %>% mutate(waktu = as.POSIXct(time / 1000, origin = "1970-01-01"))
# OUTPUT Reading layer `all_month' from data source `https://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/all_month.geojson' using driver `GeoJSON' Simple feature collection with 9888 features and 27 fields Geometry type: POINT Dimension: XYZ Bounding box: xmin: -179.9767 ymin: -63.5738 xmax: 179.997 ymax: 87.0352 z_range: zmin: -3.47 zmax: 625.955 Geodetic CRS: WGS 84
Menampilkan Data Gempa di Peta Leaflet
Visualisasi Dasar
Langkah pertama untuk menampilkan data gempa pada peta adalah dengan menambahkan lingkaran kecil di titik-titik lokasi gempa. Kita menggunakan fungsi addCircleMarkers()
yang secara default menggambarkan setiap titik sebagai simbol bulat berwarna merah. Jika lingkaran tersebut di-klik, maka akan menampilkan popup berisi informasi lokasi, magnitudo dan waktu gempa pada area tersebut.
R
# menampilkan Peta leaflet(data = gempa_id) %>% addTiles() %>% addCircleMarkers( radius = 8, color = "red", stroke = FALSE, fillOpacity = 0.8, popup = ~paste0("<b>", place, "</b><br>Magnitudo: ", mag, "<br>Waktu: ", waktu) ) %>% setView(lng = 120, lat = -2, zoom = 4) # mengatur view peta di sekitar Wilayah Indonesia


Menggunakan Icon Khusus
Untuk membuat tampilan peta lebih menarik dan menyerupai gaya visual peta digital modern seperti Google Maps, kita bisa mengganti lingkaran menjadi ikon berbentuk pin. Ikon ini dapat berupa gambar PNG dari internet atau file lokal. Kita menggunakan fungsi makeIcon()
untuk membuat ikon, dan menampilkannya menggunakan addMarkers()
. Ikon ini akan tetap menampilkan saat diklik (popup).
Selain itu pada bagian ini kita juga dapat merubah tampilan peta menjadi lebih bersih dengan menghapus tulisan atau tampilan lain yang tidak terlalu penting. Caranya yaitu mengganti bagian addTiles()
dengan addProviderTiles(providers$CartoDB.PositronNoLabels)
R
# Menyiapkan gambar icon (pin) ikon_pin <- makeIcon( iconUrl = "https://cdn-icons-png.flaticon.com/512/684/684908.png", iconWidth = 24, iconHeight = 24 ) # menampilkan Peta leaflet(data = gempa_id) %>% addProviderTiles(providers$CartoDB.PositronNoLabels) %>% addMarkers( icon = ikon_pin, popup = ~paste0("<b>", place, "</b><br>Magnitudo: ", mag, "<br>Waktu: ", waktu) ) %>% setView(lng = 120, lat = -2, zoom = 4) # mengatur view peta di sekitar Wilayah Indonesia


Menggunakan Lebih dari Satu Icon
Visualisasi akan lebih informatif jika kita membedakan antara gempa yang signifikan dan yang tidak, berdasarkan magnitudo. Dalam contoh ini, kita anggap gempa signifikan adalah gempa dengan magnitudo ≥ 4,5. Oleh karena itu, kita menggunakan dua ikon berbeda: ikon merah untuk gempa signifikan, dan ikon abu-abu untuk gempa kurang signifikan.
Kita menambahkan kolom baru di data yang menentukan jenis ikon untuk setiap titik. Kemudian, kita gunakan dua kali addMarkers()
, masing-masing untuk subset data dengan ikon berbeda. Ini memberikan peta yang lebih komunikatif secara visual dan memudahkan pengguna mengidentifikasi pola gempa dengan cepat. Untuk membedakan antara gempa signifikan dan tidak signifikan.
R
# Ikon merah untuk gempa signifikan ikon_merah <- makeIcon( iconUrl = "https://cdn-icons-png.flaticon.com/512/684/684908.png", iconWidth = 24, iconHeight = 24 ) # Ikon orange untuk gempa kurang signifikan ikon_orange <- makeIcon( iconUrl = "https://cdn-icons-png.flaticon.com/512/727/727606.png", iconWidth = 24, iconHeight = 24 ) # Tambahkan kolom ikon berdasarkan nilai magnitudo gempa_id <- gempa_id %>% mutate(icon = ifelse(mag >= 4.5, "merah", "orange")) # menampilkan Peta leaflet() %>% addProviderTiles(providers$CartoDB.PositronNoLabels) %>% addMarkers( data = gempa_id %>% filter(icon == "merah"), icon = ikon_merah, popup = ~paste0("<b>", place, "</b><br>Magnitudo: ", mag, "<br>Waktu: ", waktu) ) %>% addMarkers( data = gempa_id %>% filter(icon == "orange"), icon = ikon_orange, popup = ~paste0("<b>", place, "</b><br>Magnitudo: ", mag, "<br>Waktu: ", waktu) ) %>% setView(lng = 120, lat = -2, zoom = 4)


Menampilkan Label Ketika di Sorot
Pada kode-kode sebelumnya, informasi baru ditampilkan ketika setiap titik tersebut di-klik terlebih dahulu. Kita juga dapat membuat tampilan popup yang muncul langsung ketika kursor menyorot titik tersebut. Untuk menampilkannya kita perlu menambah atribut label
. Secara default, label
hanya bisa menampilkan teks biasa saja. Jika ingin mengatur tampilan lebih jauh lagi, maka perlu diatur melalui properti labelOptions
.
Hasil kode berikut, saat kursor menyorot titik tertentu akan menampilkan label yang berisi informasi lokasi dan magnitudo gempa.
R
# Ikon merah untuk gempa signifikan ikon_merah <- makeIcon( iconUrl = "https://cdn-icons-png.flaticon.com/512/684/684908.png", iconWidth = 24, iconHeight = 24 ) # Ikon orange untuk gempa kurang signifikan ikon_orange <- makeIcon( iconUrl = "https://cdn-icons-png.flaticon.com/512/727/727606.png", iconWidth = 24, iconHeight = 24 ) # Tambahkan kolom ikon berdasarkan nilai magnitudo gempa_id <- gempa_id %>% mutate(icon = ifelse(mag >= 4.5, "merah", "orange")) # menampilkan Peta leaflet() %>% addProviderTiles(providers$CartoDB.PositronNoLabels) %>% addMarkers( data = gempa_id %>% filter(icon == "merah"), icon = ikon_merah, label = ~paste0(place, " | M: ", mag), popup = ~paste0("<b>", place, "</b><br>Magnitudo: ", mag, "<br>Waktu: ", waktu) ) %>% addMarkers( data = gempa_id %>% filter(icon == "orange"), icon = ikon_orange, label = ~paste0(place, " | M: ", mag), popup = ~paste0("<b>", place, "</b><br>Magnitudo: ", mag, "<br>Waktu: ", waktu) ) %>% setView(lng = 120, lat = -2, zoom = 4)


Menambah Icon dalam Popup
Untuk membuat popup lebih menarik dan informatif, kita juga bisa menambahkan ikon gambar ke dalam isi popup. Pada dasarnya popup
ditulis dalam struktur HTML sehingga kita dapat mengatur sedemikian rupa seperti penambahan gambar tersebut dengan tag <img>
serta style lainnya yang diinginkan.
R
# Ikon merah untuk gempa signifikan ikon_merah <- makeIcon( iconUrl = "https://cdn-icons-png.flaticon.com/512/684/684908.png", iconWidth = 24, iconHeight = 24 ) # Ikon orange untuk gempa kurang signifikan ikon_orange <- makeIcon( iconUrl = "https://cdn-icons-png.flaticon.com/512/727/727606.png", iconWidth = 24, iconHeight = 24 ) # Tambahkan kolom ikon berdasarkan nilai magnitudo gempa_id <- gempa_id %>% mutate(icon = ifelse(mag >= 4.5, "merah", "orange")) # menampilkan Peta leaflet() %>% addProviderTiles(providers$CartoDB.PositronNoLabels) %>% addMarkers( data = gempa_id %>% filter(icon == "merah"), icon = ikon_merah, label = ~paste0(place, " | M: ", mag), popup = ~paste0( '<div style="display: flex; align-items: center;">', '<img src="', ifelse(icon == "merah", ikon_merah["iconUrl"], ikon_orange["iconUrl"]), '" width="32" height="32" style="margin-right:10px">', '<div><b>', place, '</b><br>Magnitudo: ', mag, '<br>Waktu: ', waktu, '</div>', '</div>', '</div>' ) ) %>% addMarkers( data = gempa_id %>% filter(icon == "orange"), icon = ikon_orange, label = ~paste0(place, " | M: ", mag), popup = ~paste0( '<div style="display: flex; align-items: center;">', '<img src="', ifelse(icon == "merah", ikon_merah["iconUrl"], ikon_orange["iconUrl"]), '" width="32" height="32" style="margin-right:10px">', '<div><b>', place, '</b><br>Magnitudo: ', mag, '<br>Waktu: ', waktu, '</div>', '</div>', '</div>' ) ) %>% setView(lng = 120, lat = -2, zoom = 4)


Pengembangan lanjutan
Berikut beberapa ide lanjutan yang bisa dikembangkan dari visualisasi ini:
- Menambahkan Layer Batas Administratif: Tambahkan shapefile batas provinsi atau kabupaten dari sumber data geospasial Indonesia seperti GADM atau BIG, untuk memberikan konteks lokasi gempa secara administratif.
- Slider Waktu Interaktif: Buat slider waktu menggunakan pustaka seperti
leaflet.extras
ataushiny
agar pengguna bisa menyaring gempa berdasarkan rentang tanggal tertentu. - Pengkodean Warna Berdasarkan Kedalaman: Terapkan skema warna berdasarkan kedalaman gempa (
depth
) agar pengguna bisa memahami struktur vertikal dari distribusi gempa. - Penambahan Tooltip Statistik Ringkas: Tambahkan ringkasan statistik di pojok peta seperti jumlah gempa, rata-rata magnitudo, atau kedalaman tertinggi menggunakan pustaka tambahan seperti
htmlwidgets
atauhtmltools
. - Integrasi dengan Data Realtime atau API Shiny: Hubungkan peta dengan dashboard dinamis berbasis
shiny
yang mengambil data secara realtime dan memungkinkan eksplorasi lebih mendalam melalui grafik dan tabel pendukung.
Ringkasan
Dengan menggunakan bahasa R dan pustaka leaflet
, kita dapat memanfaatkan data GeoJSON gempa bumi dari USGS untuk membuat visualisasi interaktif yang informatif. Hasil ini, dengan pengembangan lebih lanjut akan bermanfaat dalam konteks edukasi publik, penelitian kebencanaan, maupun pemantauan sistem gempa bumi di Indonesia.
Referensi
- USGS Earthquake Catalog API: https://earthquake.usgs.gov/earthquakes/feed/v1.0/geojson.php
- Leaflet for R: https://rstudio.github.io/leaflet/
- Dokumentasi Paket
sf
: https://r-spatial.github.io/sf/ - Dokumentasi Paket
dplyr
: https://dplyr.tidyverse.org/ - Flaticon Icons: https://www.flaticon.com/