Gunung Agung, Bromo, Merapi, dan Semeru

Seberapa Tinggi dan Besar Keempat Gunung Itu?

Gunung Agung, Bromo, Merapi, dan Semeru termasuk gunung-gunung yang populer di Indonesia. Pemrograman R dapat digunakan untuk memodelkan keempat gunung tersebut ke dalam bentuk 2D maupun 3D. Cara seperti ini dapat digunakan untuk membandingkan seberapa tinggi dan besar gunung-gunung tersebut.
Geostatistika
matematika membumi
tutorial
visualisasi data
Pengarang
Afiliasi
Terbit

August 25, 2024

Dimodifikasi

August 28, 2024

Kata kunci

matriks, elevasi, volume, Gunung Agung, Gunung Bromo, Gunung Merapi, Gunung Semeru

Alkisah ada seorang ksatria yang sakti mandraguna bernama Hanoman. Ksatria yang merupakan seekor kera putih itu suatu ketika diutus oleh Rama untuk mencari tanaman obat di Himalaya. Ia pun pergi ke gunung itu tanpa pikir panjang. Sesampainya di sana, ia baru sadar bahwa ternyata ia tidak mengetahui bentuk dan rupa tanaman itu seperti apa. Tak habis akal, ia pun memotong gunung itu dan membawanya ke hadapan Rama. Akhirnya, Rama dan pasukannya menemukan tanaman obat itu, kemudian mereka memakannya sehingga pulih seperti sedia kala.

Patung Hanoman di Bali, Indonesia. (Kredit: Wikimedia.org/CC0)
Gambar 1: Patung Hanoman di Bali, Indonesia. (Kredit: Wikimedia.org/CC0)

Cerita heroik tersebut meninggalkan beberapa pesan. Pertama, kita perlu memberikan instruksi sedetail mungkin agar instruksi tersebut dapat terlaksana dengan efektif dan efisien. Kedua, sikap Hanoman dalam cerita itu menyiratkan keinginan yang sangat kuat untuk menyelesaikan sebuah persoalan. Terakhir, kadang-kadang memindahkan gunung adalah solusi terbaik! Pesan terakhir ini relevan dengan persoalan berikut.

Bagaimana kita dapat membandingkan seberapa tinggi dan besar gunung-gunung di Indonesia?

Karena begitu banyaknya gunung-gunung di Indonesia, kita pilih empat saja berdasarkan kepopulerannya. Berdasarkan Google Trends, keempat gunung tersebut adalah Gunung Agung, Bromo, Merapi, dan Semeru. Untuk membandingkan keempat gunung tersebut, kita dapat “memindahkannya” sehingga berdampingan satu sama lain. Dengan demikian, kita dapat mengamatinya secara lebih mudah untuk kemudian kita bandingkan tinggi dan besar keempat gunung tersebut.

Tak seperti Hanoman yang memindahkan potongan Gunung Himalaya secara harfiah, kita hanya memindahkan representasi Gunung Agung, Bromo, Merapi, dan Semeru saja. Jika Hanoman melakukan dengan kesaktiannya, kita akan memindahkan keempat gunung tersebut dengan pemrograman R. Meskipun ada beberapa perbedaan, apa yang kita lakukan nanti intinya kurang lebih sama dengan yang dilakukan Hanoman.

  1. Seperti halnya Hanoman yang mengetahui posisi fisik Gunung Himalaya, kita juga perlu tahu di mana kita dapat menemukan representasi digital Gunung Agung, Bromo, Merapi, dan Semeru. Representasi digital itu adalah data.

  2. Seperti halnya Hanoman yang membawa potongan Gunung Himalaya, kita juga perlu menggunakan potongan keempat gunung tersebut secukupnya saja.

  3. Seperti halnya Hanoman yang memindahkan Gunung Himalaya ke hadapan Rama, kita juga perlu memindahkan keempat gunung itu di suatu tempat agar mudah diamati dan dibandingkan.

Tak perlu berlama-lama, kita keluarkan kesaktian kita. Eh, maksudku, kita siapkan alat-alat yang diperlukan.

library(tidyverse)
library(raster)
library(terra)
library(rayshader)

Memahami Ide Dasarnya

Sebelum kita menggambar model 3D Gunung Agung, Bromo, Merapi, dan Semeru, baik apabila kita bahas ide dasarnya: beberapa objek 3D itu dapat dinyatakan ke dalam sebuah matriks elevasi. Baris dan kolom matriks tersebut menyatakan koordinat \(x\) dan \(y\), sedangkan elemen-elemennya menyatakan ketinggiannya. Misalnya, kita memiliki matriks elevasi seperti berikut.

   1  2  3  4  5
1 28 30 30 26 19
2 25 29 31 28 19
3 24 31 37 32 19
4 22 28 33 30 18
5 17 19 20 19 15

Dari matriks elevasi tersebut, kita dapat membuat objek 3D dengan berdasarkan ketinggiannya (elemen-elemen matriks) dan posisinya (baris dan kolomnya). Tetapi sebelum itu, terlebih dahulu kita perhatikan proyeksi dua dimensinya seperti yang ditunjukkan pada Gambar 2.

Gambar 2: Proyeksi 2D dari sebuah objek 3D yang dibentuk dari matriks elevasi

Apakah kamu dapat membayangkan objek 3D-nya seperti apa jika proyeksi 2D-nya ditunjukkan pada Gambar 2? Ingat, warna pada diagram tersebut menggambarkan elevasi/ketinggiannya! Bandingkan imajinasimu dengan Gambar 3 berikut!

Gambar 3: Objek 3D sederhana

Proses seperti itu akan kita lakukan untuk menggambar model 3D Gunung Agung, Bromo, Merapi, dan Semeru. Untuk melakukannya, kita perlu memiliki matriks elevasi keempat gunung tersebut. Matriks tersebut akan kita siapkan pada bagian berikutnya.

Mempersiapkan Data

Seperti yang telah dijelaskan pada Bagian 1, kita perlu memiliki matriks elevasi Gunung Agung, Bromo, Merapi, dan Semeru. Matriks ini dapat ditemukan di banyak tempat. Salah satunya di situs webnya Derek Watkin. Sebelum mengunduh datanya, kamu perlu login terlebih dahulu ke dalam situs web NASA Earthdata.

Setelah berhasil login, kita perlu mencari persegi tempat keempat gunung tersebut. Untuk mencarinya, kita dapat menyeret dan memperbesar laman dalam situs web tersebut. Lokasi keempat gunung tersebut ada pada enam persegi, yaitu S08E110, S08E112, S08E113, S09E112, S09E113, dan S09E115. Untuk mengunduhnya, klik perseginya dan kemudian klik tombol “Download DEM”. Setelah itu, ekstrak semua fail zip-nya. Pindahkan fail-fail tersebut ke dalam folder kerjamu.

Sampai di sini, kita memiliki enam fail dengan nama S08E110.hgt, S08E112.hgt, S08E113.hgt, S09E112.hgt, S09E113.hgt, dan S09E115.hgt dalam folder kerja kita. Kita gunakan semua fail tersebut untuk membuat matriks_elevasi dengan kode berikut.

S08E110 <- terra::rast("S08E110.hgt")
S08E112 <- terra::rast("S08E112.hgt")
S08E113 <- terra::rast("S08E113.hgt")
S09E112 <- terra::rast("S09E112.hgt")
S09E113 <- terra::rast("S09E113.hgt")
S09E115 <- terra::rast("S09E115.hgt")

matriks_elevasi <- terra::merge(
  S08E110, S08E112, S08E113,
  S09E112, S09E113, S09E115
)
varnames(matriks_elevasi) <- "elevasi"
names(matriks_elevasi) <- "elevasi"

Seperti yang dilakukan Hanoman terhadap Gunung Himalaya, kita juga perlu memotong matriks_elevasi agar hanya memuat koordinat \(x\) dan \(y\) dari Gunung Agung, Bromo, Merapi, dan Semeru seperlunya saja. Potongan-potongan tersebut kita beri nama matriks_agung, matriks_bromo, matriks_merapi, dan matriks_semeru. Untuk memudahkan dalam pengolahan data berikutnya, kita ubah matriks-matriks tersebut menjadi tibble dan menambahkan satu variabel gunung untuk menjadi identifikasi nama gunungnya.

# Gunung Agung
batas_agung <- extent(
  115.4562, 115.5562,
  -8.393267, -8.293267
)
matriks_agung <- crop(matriks_elevasi, batas_agung)
df_agung <- as.data.frame(matriks_agung, xy = TRUE) |> 
  as_tibble() |> 
  mutate(gunung = "Agung")

# Gunung Bromo
batas_bromo <- extent(
  112.9, 113.0,
  -8.0, -7.9
)
matriks_bromo <- crop(matriks_elevasi, batas_bromo)
df_bromo <- as.data.frame(matriks_bromo, xy = TRUE) |> 
  as_tibble() |> 
  mutate(gunung = "Bromo")

# Gunung Merapi
batas_merapi <- extent(
  110.3967, 110.4967,
  -7.590278, -7.490278
)
matriks_merapi <- crop(matriks_elevasi, batas_merapi)
df_merapi <- as.data.frame(matriks_merapi, xy = TRUE) |> 
  as_tibble() |> 
  mutate(gunung = "Merapi")

# Gunung Semeru
batas_semeru <- extent(
  112.8722, 112.9722,
  -8.157778, -8.057778
)
matriks_semeru <- crop(matriks_elevasi, batas_semeru)
df_semeru <- as.data.frame(matriks_semeru, xy = TRUE) |> 
  as_tibble() |> 
  mutate(gunung = "Semeru")

Kode di atas menghasilkan empat tibble, yaitu df_agung, df_bromo, df_merapi, dan df_semeru. Selanjutnya, kita gabung keempat tibble tersebut menjadi df_gunung.

df_gunung <- bind_rows(
  df_agung, df_bromo, df_merapi, df_semeru
)

Nah, sekarang kita “pindahkan” keempat gunung tersebut dari posisi asalnya. Posisi akhir yang kita targetkan adalah posisi dengan koordinat \(x\) dan \(y\) minimumnya bernilai nol.

df_gunung <- df_gunung |> 
  group_by(gunung) |> 
  mutate(
    x_trans = x - min(x),
    y_trans = y - min(y)
  ) |> 
  ungroup()

Apakah sampai di sini kamu berhasil menjalankan baris-baris kode di atas sampai mendapatkan df_gunung? Jika iya, selamat! Jika tidak, mungkin ada beberapa hal yang perlu dicek kembali. Tetapi jika kamu langsung ingin mendapatkan df_gunung tersebut tanpa menjalankan semua baris kode di atas, kamu dapat mendapatkannya dengan menjalankan kode berikut.

load(url("https://github.com/jelajahstatid/jelajahstatid.github.io/raw/main/pos/2024-08-gunung-agung-bromo-merapi-dan-semeru/aset/df_gunung.RData"))

Kita telah memiliki data untuk menggambarkan Gunung Agung, Bromo, Merapi, dan Semeru secara berdampingan. Kita siap untuk melanjutkan perjalanan kita ke tahapan selanjutnya.

Memvisualisasikan Data

Kita telah bekerja keras di Bagian 2. Sekarang, kita masuk ke tahapan yang mengasyikkan. Yup, di tahapan ini kita akan memvisualisasikan data. Data yang kita gunakan adalah df_gunung. Visualisasi data pertama yang kita lakukan adalah membuat proyeksi 2D dari Gunung Agung, Bromo, Merapi, dan Semeru. Sebelum itu, kita siapkan temanya terlebih dahulu.

tema_gunung <- function(){
  theme(
      axis.title = element_blank(),
      axis.text = element_blank(),
      axis.ticks = element_blank(),
      legend.position = "right",
      plot.margin = margin(
        t = 10, r = 10,
        b = 10, l = 10,
        unit = "pt"
      )
    )
}

Selanjutnya kita siap untuk memvisualisasikan proyeksi 2D dari Gunung Agung, Bromo, Merapi, dan Semeru. Untuk melakukannya, kita gunakan baris kode di bawah ini. Hasilnya ditunjukkan pada Gambar 4.

plot_2d_gunung <- df_gunung |> 
  ggplot(
    aes(x_trans, y_trans)
  ) + 
  geom_tile(aes(fill = elevasi)) + 
  geom_contour(
    aes(z = elevasi), 
    breaks = c(seq(500, 3500, by = 250)),
    color = "white",
    linewidth = .25,
    alpha = .3
  ) + 
  scale_fill_gradient(
    name = "Elevasi (m)",
    low = "#6DAA55",
    high = "#205544"
  ) + 
  facet_wrap(vars(gunung)) + 
  coord_fixed() +
  tema_gunung()

print(plot_2d_gunung)
Gambar 4: Proyeksi 2D Gunung Agung, Bromo, Merapi, dan Semeru

Berdasarkan Gambar 4 tersebut, apakah kamu sudah dapat membandingkan tinggi dan besar keempat gunung tersebut? Ya, Gunung Semeru tampak paling tinggi dibandingkan ketiga gunung lainnya. Selain itu, kita dapat melihat bahwa Gunung Bromo tampak relatif lebih luas dibandingkan ketiga gunung lainnya.

Untuk melihat bentuk detailnya, kita dapat menggambar keempat gunung tersebut ke dalam bentuk 3D. Untuk melakukannya, kita gunakan metode yang telah dibahas pada pos sebelumnya. Bagaimana caranya? Kita jalankan kode berikut ini.

plot_gunung <- plot_2d_gunung + 
  theme(
    legend.position = "none"    # Menghapus legenda
  )

plot_gg(
  plot_gunung,
  multicore = TRUE,
  scale = 150
)

Beberapa saat setelah kode di atas kita jalankan, kita akan mendapatkan jendela kamera. Melalui jendela tersebut, kita dapat mengatur tampilan objek 3D-nya sesuai yang kita inginkan. Selain itu, kita juga dapat mengatur tampilannya dengan baris kode, misalnya seperti berikut.

render_camera(
    theta = 45,
    phi = 55,
    zoom = .85
)

Setelah kita mendapatkan tampilan yang cocok, kita jalankan kode berikut untuk merender gambarnya.

render_snapshot()

Hasil gambarnya seperti yang ditunjukkan pada Gambar 5.

Model 3D Gunung Agung, Bromo, Merapi, dan Semeru
Gambar 5: Model 3D Gunung Agung, Bromo, Merapi, dan Semeru

Berdasarkan Gambar 5, kita dapat membandingkan tinggi dan besar keempat gunung tersebut. Gunung semeru tampak paling tinggi. Gunung Bromo bentuknya lebih melebar dibandingkan dengan ketiga gunung lainnya. Selain itu, berdasarkan gambar tersebut kita dapat membandingkan bentuk detail keempat gunung tersebut.

Memperkirakan Tinggi dan Volume

Secara sederhana, sebenarnya kita telah dapat membandingkan tinggi dan volume keempat gunung pada Gambar 5. Akan tetapi, kita juga dapat memperkirakan berapakah tinggi dan volume keempat gunung tersebut.

Pertama, kita akan menentukan tinggi Gunung Agung, Bromo, Merapi, dan Semeru. Berdasarkan Wikipedia, tinggi keempat gunung tersebut secara berturut-turut adalah 3.142, 2.614, 2.968, dan 3.676. Sekarang, kita perkirakan tinggi keempat gunung tersebut dengan menggunakan data elevasi dalam df_gunung.

ketinggian <- df_gunung |> 
  group_by(gunung) |> 
  summarise(
    elevasi_maksimum = max(elevasi, na.rm = TRUE),
    .groups = "drop"
  )

print(ketinggian)
# A tibble: 4 × 2
  gunung elevasi_maksimum
  <chr>             <int>
1 Agung              3013
2 Bromo              2775
3 Merapi             2918
4 Semeru             3669

Meskipun hasilnya berbeda dengan informasi dalam Wikipedia, kita mendapatkan ketinggian-ketinggian yang tak jauh berbeda. Agar lebih mudah dalam membandingkan tinggi keempat gunung tersebut, kita buat diagram batangnya. Diagram batang tersebut disajikan pada Gambar 6.

ketinggian |> 
  mutate(gunung = fct_reorder(gunung, -elevasi_maksimum)) |> 
  ggplot(aes(x = gunung, y = elevasi_maksimum)) + 
  geom_col(
    aes(fill = elevasi_maksimum),
    show.legend = FALSE
  ) + 
  scale_fill_viridis_c() + 
  theme_minimal() + 
  labs(
    x = "Gunung",
    y = "Ketinggian (mdpl)"
  )
Gambar 6: Ketinggian Gunung Agung, Bromo, Merapi, dan Semeru

Berikutnya, kita akan memperkirakan volume keempat gunung tersebut. Volume yang dimaksud di sini adalah volume potongan tiap gunung pada Gambar 5. Untuk itu, kita hitung ada berapa petak data dalam setiap data gunungnya.

df_gunung |> 
  group_by(gunung) |> 
  summarise(
    banyak_petak = n(),
    .groups = "drop"
  )
# A tibble: 4 × 2
  gunung banyak_petak
  <chr>         <int>
1 Agung        129600
2 Bromo        129240
3 Merapi       129600
4 Semeru       129600

Sebagian besar, banyak petaknya adalah 129.600 kecuali data untuk Gunung Bromo. Untuk itu, banyak petak pada Gunung Bromo kita samakan saja dengan ketiga gunung lainnya.

Alas potongan gunung-gunung tersebut memiliki ukuran 0,1 derajat × 0,1 derajat. Karena 0,1 derajat kurang lebih sama dengan 110 km, ukuran alasnya berarti 11 km × 11 km dan luasnya adalah 121 km2 atau 121.000.000 m2. Padahal alas tersebut berisi 129.600 petak. Dengan demikian, luas petak tersebut dapat dihitung seperti berikut.

luas_petak_est <- 121000000 / 129600
print(luas_petak_est)
[1] 933.642

Dengan demikian, kita memeroleh luas per petaknya sekitar 933,642 m2. Sekarang coba kita kembali ke belakang. Ketika kita mengunduh data matriks elevasi dari situs webnya Derek Watkin, di situ terdapat keterangan seperti berikut.

This interface attempts to ease the pain of downloading 30-meter resolution elevation data from the Shuttle Radar Topography Mission.

Yup, petak-petak tersebut ukurannya adalah 30 m × 30 m. Dengan demikian, luas petaknya adalah 900 m2. Perkiraan kita tadi cukup dekat dengan nilai ini.

Volume potongan keempat gunung tersebut merupakan jumlah dari hasil kali luas setiap petak dan tinggi petak tersebut.

\[ \text{Volume} = \sum_{i=1}^{n} L_{i} \cdot h_{i} \]

dengan \(L_{i}\) dan \(h_{i}\) secara berturut-turut adalah luas dan tinggi tiap-tiap petak. Nah, sekarang kita hitung volume keempat gunung tersebut.

volume <- df_gunung |> 
  mutate(
    volume_petak = 900 * elevasi
  ) |> 
  group_by(gunung) |> 
  summarise(
    volume_m3 = sum(volume_petak),
    .groups = "drop"
  )

print(volume)
# A tibble: 4 × 2
  gunung    volume_m3
  <chr>         <dbl>
1 Agung  157764598200
2 Bromo  256498122600
3 Merapi 164324547900
4 Semeru 237914817300

Karena kita biasanya lebih mudah membayangkan volume dengan satuan liter, kita dapat mengkonversi satuan volumenya menjadi liter.

volume <- volume |> 
  mutate(
    volume_liter = volume_m3 * 1000
  )

print(volume)
# A tibble: 4 × 3
  gunung    volume_m3 volume_liter
  <chr>         <dbl>        <dbl>
1 Agung  157764598200      1.58e14
2 Bromo  256498122600      2.56e14
3 Merapi 164324547900      1.64e14
4 Semeru 237914817300      2.38e14

Potongan gunung manakah yang paling besar? Potongan gunung Bromo-lah yang paling besar, yaitu sekitar 2,58 × 1014 liter. Selanjutnya kita buat diagram batang yang merepresentasikan volume potongan keempat gunung tersebut. Hasilnya disajikan pada Gambar 7.

volume |> 
  mutate(
    gunung = fct_reorder(gunung, -volume_liter)
  ) |> 
  ggplot(aes(x = gunung, y = volume_liter)) + 
  geom_col(
    aes(fill = volume_liter),
    show.legend = FALSE
  ) + 
  scale_fill_viridis_c() + 
  theme_minimal() + 
  labs(
    x = "Gunung",
    y = "Volume (liter)"
  )
Gambar 7: Volume potongan Gunung Agung, Bromo, Merapi, dan Semeru

Catatan Akhir

Kita telah membandingkan seberapa tinggi dan besar Gunung Agung, Bromo, Merapi, dan Semeru. Hal itu kita lakukan dengan dua jalan: pengamatan dan perhitungan. Ketika menggunakan cara pengamatan, kita gambarkan representasi keempat gunung tersebut ke dalam bentuk 2D maupun 3D. Hasilnya seperti dapat dilihat pada Gambar 4 dan Gambar 5. Ketika kita menggunakan cara perhitungan, kita gunakan data matriks elevasi keempat gunung tersebut untuk memperkirakan tinggi dan volumenya. Cara ini kita lakukan pada Bagian 4.

Penggunaan Kembali