<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>BMKG | Irpan Chumaedi</title><link>https://www.irpanchumaedi.com/tag/bmkg/</link><atom:link href="https://www.irpanchumaedi.com/tag/bmkg/index.xml" rel="self" type="application/rss+xml"/><description>BMKG</description><generator>Wowchemy (https://wowchemy.com)</generator><language>en-us</language><lastBuildDate>Tue, 12 May 2026 00:00:00 +0000</lastBuildDate><image><url>https://www.irpanchumaedi.com/images/icon_huc8b49dbecede763dad003ee9bbdb929f_244914_512x512_fill_lanczos_center_2.png</url><title>BMKG</title><link>https://www.irpanchumaedi.com/tag/bmkg/</link></image><item><title>Download Data Hujan BMKG: Cara Akses, Keterbatasan, dan Strategi Data Hilang</title><link>https://www.irpanchumaedi.com/post/materi-download-bmkg/</link><pubDate>Tue, 12 May 2026 00:00:00 +0000</pubDate><guid>https://www.irpanchumaedi.com/post/materi-download-bmkg/</guid><description>&lt;h2 id="data-bmkg-sebagai-referensi-utama">Data BMKG sebagai Referensi Utama&lt;/h2>
&lt;p>Data curah hujan observasi dari &lt;strong>Badan Meteorologi, Klimatologi, dan Geofisika (BMKG)&lt;/strong> adalah referensi primer dalam setiap studi hidrologi di Indonesia. Berbeda dengan data satelit (GPM IMERG) yang merupakan estimasi, data BMKG berasal dari &lt;strong>pengukuran langsung&lt;/strong> di lapangan menggunakan penakar hujan standar.&lt;/p>
&lt;p>&lt;strong>Keunggulan data BMKG:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>✅ Data pengukuran langsung (ground truth)&lt;/li>
&lt;li>✅ Umumnya tersedia hingga puluhan tahun (beberapa stasiun sejak 1970-an)&lt;/li>
&lt;li>✅ Diakui secara legal dan ilmiah untuk keperluan perizinan dan AMDAL&lt;/li>
&lt;li>✅ Menjadi acuan kalibrasi/validasi untuk data satelit&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>Keterbatasan data BMKG:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>❌ Kerapatan stasiun tidak merata — banyak area terpencil tidak terjangkau&lt;/li>
&lt;li>❌ Data seringkali tidak lengkap (banyak missing data)&lt;/li>
&lt;li>❌ Akses data historis panjang memerlukan permohonan resmi (berbayar)&lt;/li>
&lt;li>❌ Portal online hanya tersedia 2 tahun terakhir secara gratis&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="cara-mengakses-data-bmkg">Cara Mengakses Data BMKG&lt;/h2>
&lt;p>Ada tiga jalur utama untuk mendapatkan data curah hujan BMKG:&lt;/p>
&lt;h3 id="jalur-1-portal-bmkg-data-online-gratis-terbatas-2-tahun">Jalur 1: Portal BMKG Data Online (Gratis, Terbatas 2 Tahun)&lt;/h3>
&lt;p>🔗 &lt;strong>URL:&lt;/strong> &lt;a href="https://dataonline.bmkg.go.id/" target="_blank" rel="noopener">https://dataonline.bmkg.go.id/&lt;/a>&lt;/p>
&lt;p>Portal ini menyediakan akses gratis ke data iklim (curah hujan, suhu, kelembaban, dll.) namun &lt;strong>hanya 2 tahun terakhir&lt;/strong> yang bisa diunduh secara mandiri.&lt;/p>
&lt;p>&lt;strong>Langkah akses:&lt;/strong>&lt;/p>
&lt;ol>
&lt;li>Buka &lt;a href="https://dataonline.bmkg.go.id/" target="_blank" rel="noopener">https://dataonline.bmkg.go.id/&lt;/a>&lt;/li>
&lt;li>Klik &lt;strong>&amp;ldquo;Masuk&amp;rdquo;&lt;/strong> → daftar akun gratis jika belum punya&lt;/li>
&lt;li>Pilih menu &lt;strong>&amp;ldquo;Data Iklim&amp;rdquo;&lt;/strong> → &lt;strong>&amp;ldquo;Unduh Data&amp;rdquo;&lt;/strong>&lt;/li>
&lt;li>Pilih stasiun, parameter (Curah Hujan / RR), dan periode waktu&lt;/li>
&lt;li>Format output: &lt;strong>Excel (.xlsx)&lt;/strong> atau CSV&lt;/li>
&lt;/ol>
&lt;blockquote>
&lt;p>&lt;strong>Catatan penting:&lt;/strong> Server BMKG Data Online menerapkan pembatasan ketat. Permintaan data lebih dari 2 tahun akan ditolak secara otomatis oleh sistem, bukan karena akun terbatas.&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h3 id="jalur-2-permohonan-resmi-ke-upt-bmkg-data-historis-panjang">Jalur 2: Permohonan Resmi ke UPT BMKG (Data Historis Panjang)&lt;/h3>
&lt;p>Untuk data historis lebih dari 2 tahun (misalnya 10–30 tahun untuk keperluan AMDAL), kamu perlu mengajukan &lt;strong>permohonan data resmi&lt;/strong> ke Balai Besar / UPT BMKG setempat.&lt;/p>
&lt;p>&lt;strong>Prosedur permohonan:&lt;/strong>&lt;/p>
&lt;ol>
&lt;li>Buat surat permohonan data resmi di atas kop perusahaan/instansi&lt;/li>
&lt;li>Cantumkan: nama stasiun, parameter, periode, dan tujuan penggunaan&lt;/li>
&lt;li>Kirimkan ke UPT BMKG yang membawahi wilayah stasiun target&lt;/li>
&lt;li>Biaya: bervariasi, umumnya &lt;strong>Rp 50.000 – Rp 500.000&lt;/strong> per stasiun per periode (PNBP)&lt;/li>
&lt;li>Waktu proses: &lt;strong>1–3 minggu&lt;/strong> tergantung beban kerja UPT&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>Kontak UPT BMKG berdasarkan wilayah:&lt;/strong>&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Wilayah&lt;/th>
&lt;th>UPT BMKG&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Jawa Barat&lt;/td>
&lt;td>BMKG Stamet Bandung, BBTMC Serpong&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Kalimantan Selatan&lt;/td>
&lt;td>BMKG Staklim Banjarbaru&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Kalimantan Timur&lt;/td>
&lt;td>BMKG Staklim Samarinda&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Maluku Utara&lt;/td>
&lt;td>BMKG Stamet Ternate&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Sulawesi&lt;/td>
&lt;td>BMKG Staklim Makassar&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;hr>
&lt;hr>
&lt;h2 id="memahami-format-data-bmkg">Memahami Format Data BMKG&lt;/h2>
&lt;p>Data yang diunduh dari portal BMKG biasanya berbentuk tabel Excel dengan format seperti ini:&lt;/p>
&lt;pre>&lt;code>Nama Stasiun : Stasiun Klimatologi Banjarbaru
Lintang : -3.4425° LS
Bujur : 114.8253° BT
Elevasi : 66 m
Parameter : Curah Hujan (mm)
Tanggal | RR
-----------|------
2023-01-01 | 15.2
2023-01-02 | 0.0
2023-01-03 | 8888 ← kode data hilang (missing)
2023-01-04 | 9999 ← kode tidak ada pengamatan
2023-01-05 | 22.4
&lt;/code>&lt;/pre>
&lt;p>&lt;strong>Kode khusus yang sering muncul:&lt;/strong>&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Kode&lt;/th>
&lt;th>Makna&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&lt;code>8888&lt;/code>&lt;/td>
&lt;td>Data hilang / tidak tercatat&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>9999&lt;/code>&lt;/td>
&lt;td>Tidak ada pengamatan (hari libur, dll.)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>-&lt;/code> atau &lt;code>NaN&lt;/code>&lt;/td>
&lt;td>Tidak ada data&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>0.0&lt;/code>&lt;/td>
&lt;td>Tidak hujan (hari kering)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;code>Tr&lt;/code>&lt;/td>
&lt;td>&lt;em>Trace&lt;/em> — hujan sangat kecil, tidak terukur (&amp;lt;0.5 mm)&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;blockquote>
&lt;p>&lt;strong>Penting:&lt;/strong> Jangan sampai kode &lt;code>8888&lt;/code> atau &lt;code>9999&lt;/code> ikut dihitung sebagai nilai curah hujan! Ini adalah kesalahan umum yang membuat analisis frekuensi menjadi tidak valid.&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h2 id="identifikasi-dan-penanganan-data-hilang-missing-data">Identifikasi dan Penanganan Data Hilang (Missing Data)&lt;/h2>
&lt;h3 id="langkah-1-hitung-persentase-data-hilang">Langkah 1: Hitung Persentase Data Hilang&lt;/h3>
&lt;p>Sebelum menggunakan data BMKG, wajib hukumnya mengecek kualitas data:&lt;/p>
&lt;pre>&lt;code class="language-r"># ============================================================
# Identifikasi missing data pada dataset BMKG
# ============================================================
options(OutDec = &amp;quot;.&amp;quot;)
library(dplyr)
library(lubridate)
# Baca data (sesuaikan path)
data_hujan &amp;lt;- read.csv(&amp;quot;data_bmkg_banjarbaru.csv&amp;quot;,
stringsAsFactors = FALSE)
# Konversi tanggal
data_hujan$tanggal &amp;lt;- as.Date(data_hujan$tanggal, format = &amp;quot;%Y-%m-%d&amp;quot;)
# Ganti kode missing dengan NA
data_hujan$rr[data_hujan$rr %in% c(8888, 9999)] &amp;lt;- NA
data_hujan$rr[data_hujan$rr == &amp;quot;Tr&amp;quot;] &amp;lt;- 0 # Trace dianggap 0
# Hitung persentase missing per tahun
ringkasan_missing &amp;lt;- data_hujan %&amp;gt;%
mutate(tahun = year(tanggal)) %&amp;gt;%
group_by(tahun) %&amp;gt;%
summarise(
total_hari = n(),
hari_missing = sum(is.na(rr)),
persen_missing = round(hari_missing / total_hari * 100, 1)
)
print(ringkasan_missing)
&lt;/code>&lt;/pre>
&lt;p>&lt;strong>Panduan interpretasi kualitas data:&lt;/strong>&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Persentase Missing&lt;/th>
&lt;th>Kategori&lt;/th>
&lt;th>Tindakan&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>&amp;lt; 5%&lt;/td>
&lt;td>Baik&lt;/td>
&lt;td>Imputasi sederhana&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>5% – 15%&lt;/td>
&lt;td>Cukup&lt;/td>
&lt;td>Imputasi dengan stasiun tetangga&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>15% – 30%&lt;/td>
&lt;td>Kurang&lt;/td>
&lt;td>Pertimbangkan data satelit sebagai suplemen&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&amp;gt; 30%&lt;/td>
&lt;td>Buruk&lt;/td>
&lt;td>Hindari penggunaan, gunakan GPM IMERG&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h3 id="langkah-2-strategi-imputasi-data-hilang">Langkah 2: Strategi Imputasi Data Hilang&lt;/h3>
&lt;p>Ada beberapa metode pengisian data hilang, pilih berdasarkan kondisi lapangan:&lt;/p>
&lt;h4 id="metode-1-rata-rata-stasiun-tetangga-normal-ratio-method">Metode 1: Rata-rata Stasiun Tetangga (Normal Ratio Method)&lt;/h4>
&lt;p>Metode ini menggunakan bobot berdasarkan rasio curah hujan normal tahunan antara stasiun target dan stasiun pengisi.&lt;/p>
&lt;pre>&lt;code class="language-r"># ============================================================
# Imputasi dengan Normal Ratio Method
# ============================================================
# Curah hujan tahunan rata-rata (mm/tahun) dari masing-masing stasiun
# Dapatkan nilai ini dari 10–30 tahun data di tiap stasiun
n_target &amp;lt;- 2100 # Stasiun target (yang punya missing data)
n_stasiun1 &amp;lt;- 1950 # Stasiun tetangga 1
n_stasiun2 &amp;lt;- 2300 # Stasiun tetangga 2
n_stasiun3 &amp;lt;- 2050 # Stasiun tetangga 3
# Jika deviasi curah hujan normal antar stasiun &amp;lt; 10%:
# Gunakan rata-rata aritmetika sederhana
# Jika deviasi ≥ 10%: Gunakan Normal Ratio Method
hitung_imputasi_normal_ratio &amp;lt;- function(rr1, rr2, rr3,
n_t, n_1, n_2, n_3) {
# Formula: P_x = (N_x/3) * (P_1/N_1 + P_2/N_2 + P_3/N_3)
nilai &amp;lt;- (n_t / 3) * (rr1/n_1 + rr2/n_2 + rr3/n_3)
return(round(nilai, 1))
}
# Contoh pengisian untuk satu hari missing
rr_imputasi &amp;lt;- hitung_imputasi_normal_ratio(
rr1 = 18.5, rr2 = 22.0, rr3 = 15.8,
n_t = n_target, n_1 = n_stasiun1,
n_2 = n_stasiun2, n_3 = n_stasiun3
)
cat(&amp;quot;Curah hujan hasil imputasi:&amp;quot;, rr_imputasi, &amp;quot;mm\n&amp;quot;)
&lt;/code>&lt;/pre>
&lt;h4 id="metode-2-inverse-distance-weighting-idw-antar-stasiun">Metode 2: Inverse Distance Weighting (IDW) antar Stasiun&lt;/h4>
&lt;pre>&lt;code class="language-r"># ============================================================
# Imputasi dengan IDW berdasarkan jarak antar stasiun
# ============================================================
# Koordinat stasiun (dalam derajat desimal)
stasiun &amp;lt;- data.frame(
nama = c(&amp;quot;Target&amp;quot;, &amp;quot;Sts_1&amp;quot;, &amp;quot;Sts_2&amp;quot;, &amp;quot;Sts_3&amp;quot;),
lon = c(114.825, 114.600, 115.100, 114.700),
lat = c(-3.443, -3.200, -3.600, -3.700),
rr_hari = c(NA, 18.5, 22.0, 15.8) # NA = missing
)
# Hitung jarak Euclidean (approx) dalam km
hitung_jarak_km &amp;lt;- function(lon1, lat1, lon2, lat2) {
dx &amp;lt;- (lon2 - lon1) * 111.32 * cos(lat1 * pi / 180)
dy &amp;lt;- (lat2 - lat1) * 110.57
sqrt(dx^2 + dy^2)
}
stasiun_pengisi &amp;lt;- stasiun[!is.na(stasiun$rr_hari), ]
# Hitung jarak dari stasiun target ke pengisi
stasiun_pengisi$jarak &amp;lt;- mapply(
hitung_jarak_km,
lon1 = stasiun$lon[1], lat1 = stasiun$lat[1],
lon2 = stasiun_pengisi$lon, lat2 = stasiun_pengisi$lat
)
# Bobot IDW (1/d^2)
stasiun_pengisi$bobot &amp;lt;- 1 / stasiun_pengisi$jarak^2
# Curah hujan hasil IDW
rr_idw &amp;lt;- sum(stasiun_pengisi$rr_hari * stasiun_pengisi$bobot) /
sum(stasiun_pengisi$bobot)
cat(&amp;quot;Curah hujan IDW:&amp;quot;, round(rr_idw, 1), &amp;quot;mm\n&amp;quot;)
&lt;/code>&lt;/pre>
&lt;h4 id="metode-3-isi-dengan-data-gpm-imerg-rekomendasi-modern">Metode 3: Isi dengan Data GPM IMERG (Rekomendasi Modern)&lt;/h4>
&lt;p>Jika tidak ada stasiun tetangga yang memadai, data GPM IMERG Final Run bisa digunakan untuk mengisi missing data setelah dilakukan &lt;strong>bias correction&lt;/strong>:&lt;/p>
&lt;pre>&lt;code class="language-r"># ============================================================
# Koreksi bias GPM IMERG menggunakan ratio scaling
# ============================================================
# Periode yang memiliki data lengkap di keduanya (untuk kalibrasi)
# bmkg_lengkap = data BMKG periode overlap (tanpa missing)
# gpm_overlap = data GPM periode yang sama
# Hitung faktor koreksi bulanan
faktor_koreksi &amp;lt;- data.frame(
bulan = 1:12,
fc = tapply(bmkg_lengkap$rr, month(bmkg_lengkap$tanggal),
mean, na.rm = TRUE) /
tapply(gpm_overlap$rr, month(gpm_overlap$tanggal),
mean, na.rm = TRUE)
)
# Terapkan koreksi ke GPM untuk mengisi missing BMKG
data_gabungan &amp;lt;- data_hujan # copy data BMKG
bln_missing &amp;lt;- month(data_gabungan$tanggal[is.na(data_gabungan$rr)])
fc_terpilih &amp;lt;- faktor_koreksi$fc[bln_missing]
data_gabungan$rr[is.na(data_gabungan$rr)] &amp;lt;-
gpm_data$rr[is.na(data_hujan$rr)] * fc_terpilih
&lt;/code>&lt;/pre>
&lt;hr>
&lt;h2 id="validasi-kualitas-data-akhir">Validasi Kualitas Data Akhir&lt;/h2>
&lt;p>Setelah imputasi, lakukan validasi visual sebelum data digunakan untuk analisis lanjutan:&lt;/p>
&lt;pre>&lt;code class="language-r"># ============================================================
# Plot curah hujan tahunan untuk deteksi anomali
# ============================================================
library(ggplot2)
data_tahunan &amp;lt;- data_hujan %&amp;gt;%
mutate(tahun = year(tanggal)) %&amp;gt;%
group_by(tahun) %&amp;gt;%
summarise(rr_tahunan = sum(rr, na.rm = TRUE))
ggplot(data_tahunan, aes(x = tahun, y = rr_tahunan)) +
geom_bar(stat = &amp;quot;identity&amp;quot;, fill = &amp;quot;#2196F3&amp;quot;, alpha = 0.8) +
geom_hline(yintercept = mean(data_tahunan$rr_tahunan),
linetype = &amp;quot;dashed&amp;quot;, color = &amp;quot;red&amp;quot;, linewidth = 0.8) +
labs(
title = &amp;quot;Curah Hujan Tahunan — Stasiun BMKG&amp;quot;,
subtitle = &amp;quot;Garis merah: rata-rata periode analisis&amp;quot;,
x = &amp;quot;Tahun&amp;quot;,
y = &amp;quot;Curah Hujan Tahunan (mm)&amp;quot;
) +
theme_bw(base_size = 12)
&lt;/code>&lt;/pre>
&lt;p>Perhatikan anomali seperti lonjakan ekstrem atau nilai nol pada seluruh tahun — ini bisa mengindikasikan kesalahan dalam proses imputasi atau kode missing yang belum tergantikan.&lt;/p>
&lt;hr>
&lt;h2 id="kesimpulan-kapan-gunakan-data-bmkg-vs-gpm-imerg">Kesimpulan: Kapan Gunakan Data BMKG vs GPM IMERG?&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Kondisi&lt;/th>
&lt;th>Rekomendasi&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Stasiun BMKG &amp;lt; 5 km dari area studi, data lengkap&lt;/td>
&lt;td>Gunakan BMKG saja&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Stasiun BMKG ada tapi banyak missing data (&amp;gt;15%)&lt;/td>
&lt;td>Gabungkan BMKG + GPM (hybrid)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Tidak ada stasiun BMKG dalam radius 20 km&lt;/td>
&lt;td>Gunakan GPM IMERG Final Run&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Keperluan AMDAL formal&lt;/td>
&lt;td>BMKG sebagai primer, GPM sebagai sekunder&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Data &amp;gt; 10 tahun diperlukan dan proses lambat&lt;/td>
&lt;td>GPM + Open-Meteo ERA5 sebagai suplemen&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h2 id="referensi">Referensi&lt;/h2>
&lt;ul>
&lt;li>BMKG Data Online: &lt;a href="https://dataonline.bmkg.go.id/" target="_blank" rel="noopener">https://dataonline.bmkg.go.id/&lt;/a>&lt;/li>
&lt;li>WMO (2012). &lt;em>Guide to Meteorological Instruments and Methods of Observation&lt;/em>. WMO No. 8.&lt;/li>
&lt;li>Paulhus, J.L.H. &amp;amp; Kohler, M.A. (1952). Interpolation of missing precipitation records. &lt;em>Monthly Weather Review&lt;/em>, 80(8), 129–133.&lt;/li>
&lt;li>Soewarno (1995). &lt;em>Hidrologi: Aplikasi Metode Statistik untuk Analisa Data&lt;/em>. Nova, Bandung.&lt;/li>
&lt;/ul></description></item><item><title>Keterbatasan Data Hujan Pos dan Alternatif GPM IMERG</title><link>https://www.irpanchumaedi.com/post/materi-keterbatasan-data-hujan/</link><pubDate>Sun, 10 May 2026 00:00:00 +0000</pubDate><guid>https://www.irpanchumaedi.com/post/materi-keterbatasan-data-hujan/</guid><description>&lt;link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/leaflet/1.9.4/leaflet.min.css"/>
&lt;script src="https://cdnjs.cloudflare.com/ajax/libs/leaflet/1.9.4/leaflet.min.js">&lt;/script>
&lt;script src="https://cdnjs.cloudflare.com/ajax/libs/plotly.js/2.27.0/plotly.min.js">&lt;/script>
&lt;p>Ketersediaan data curah hujan yang memadai merupakan fondasi utama dalam analisis hidrologi. Namun di Indonesia, data pos hujan konvensional menghadapi berbagai keterbatasan — terutama di wilayah luar Pulau Jawa.&lt;/p>
&lt;hr>
&lt;h2 id="1-sebaran-stasiun-hujan-bmkg">1. Sebaran Stasiun Hujan BMKG&lt;/h2>
&lt;p>Berdasarkan inventarisasi BMKG, terdapat &lt;strong>6.487 stasiun hujan&lt;/strong> aktif di seluruh Indonesia — terdiri dari Pos Hujan Kerjasama (PHK), Automatic AWS (AAWS), dan UPT.&lt;/p>
&lt;div id="peta-bmkg" style="height:420px;border-radius:8px;margin:1rem 0;border:1px solid rgba(0,0,0,0.1);">&lt;/div>
&lt;p style="font-size:0.8rem;color:#888;text-align:center;">
💡 Zoom masuk untuk melihat nama stasiun &amp;nbsp;·&amp;nbsp; Klik titik untuk detail &amp;nbsp;·&amp;nbsp; Biru = PHK · Merah = AAWS · Hijau = UPT
&lt;/p>
&lt;script>
function initPetaBMKG() {
if (typeof L === 'undefined') {
setTimeout(initPetaBMKG, 100);
return;
}
(function() {
var data = [{"n":"Genteng I","j":"Pos Hujan Kerjasama","p":"Jawa Timur","e": 171,"lo":113.94690,"la": -8.34778},{"n":"Huta Bagasan","j":"Pos Hujan Kerjasama","p":"Sumatera Utara","e":null,"lo": 99.32000,"la": 2.75000},{"n":"Surat/Mojo","j":"Pos Hujan Kerjasama","p":"Jawa Timur","e": 123,"lo":111.95030,"la": -7.88194},{"n":"Niniari","j":"Pos Hujan Kerjasama","p":"Maluku","e":null,"lo":128.40000,"la": -3.07000},{"n":"Kerta Sari","j":"Pos Hujan Kerjasama","p":"Jawa Barat","e":null,"lo":107.28414,"la": -6.20928},{"n":"Wanadadi","j":"Pos Hujan Kerjasama","p":"Jawa Tengah","e":null,"lo":109.62580,"la": -7.36860},{"n":"Jonggol","j":"Pos Hujan Kerjasama","p":"Jawa Barat","e": 137,"lo":107.06590,"la": -6.46790},{"n":"Jatibarang 2","j":"Pos Hujan Kerjasama","p":"Jawa Tengah","e": 22,"lo":109.05470,"la": -6.96297},{"n":"Debut","j":"Pos Hujan Kerjasama","p":"Maluku","e":null,"lo":132.70000,"la": -5.74000},{"n":"Stageof Onowembo","j":"Pos Hujan Kerjasama","p":"Sumatera Utara","e":null,"lo": 97.55200,"la": 1.29000},{"n":"Bakunase","j":"Pos Hujan Kerjasama","p":"Nusa Tenggara Timur","e": 8,"lo":123.58722,"la":-10.18754},{"n":"Lemong","j":"Pos Hujan Kerjasama","p":"Lampung","e":null,"lo":105.20167,"la": -4.60000},{"n":"Bangko","j":"Pos Hujan Kerjasama","p":"Riau","e": 4,"lo":100.80010,"la": 2.17000},{"n":"Gumbil","j":"Pos Hujan Kerjasama","p":"Kalimantan Selatan","e":null,"lo":115.34970,"la": -2.72127},{"n":"Tinjowan Bibitan","j":"Pos Hujan Kerjasama","p":"Sumatera Utara","e":null,"lo": 99.48000,"la": 3.09000},{"n":"Kaliwringin","j":"Pos Hujan Kerjasama","p":"Jawa Tengah","e": 205,"lo":110.19660,"la": -7.10410},{"n":"Tarsanabaru","j":"Pos Hujan Kerjasama","p":"Jawa Barat","e": 5,"lo":108.37330,"la": -6.88330},{"n":"Pakkat Hauagong","j":"Pos Hujan Kerjasama","p":"Sumatera Utara","e": 531,"lo": 98.46900,"la": 2.17700},{"n":"","j":"Pos Hujan Kerjasama","p":"Nanggroe Aceh Darussalam","e":null,"lo": 96.00000,"la": 4.32000},{"n":"Talaga","j":"Pos Hujan Kerjasama","p":"Jawa Barat","e": 636,"lo":108.36670,"la": -6.96667},{"n":"Bener Kelipah","j":"Pos Hujan Kerjasama","p":"Nanggroe Aceh Darussalam","e":null,"lo": 96.91570,"la": 4.77421},{"n":"Payung","j":"Pos Hujan Kerjasama","p":"Jawa Tengah","e":null,"lo":109.46210,"la": -6.99827},{"n":"Borong Rapoa","j":"Pos Hujan Kerjasama","p":"Sulawesi Selatan","e": 707,"lo":120.04420,"la": -5.39417},{"n":"Batang Peranap","j":"Pos Hujan Kerjasama","p":"Riau","e":null,"lo":101.84170,"la": -0.74842},{"n":"Baning","j":"Pos Hujan Kerjasama","p":"Kalimantan Barat","e": 29,"lo":111.50030,"la": -0.06083},{"n":"Sidaharja","j":"Pos Hujan Kerjasama","p":"Jawa Barat","e": 65,"lo":108.69536,"la": -7.42385},{"n":"Bah Jambi Afd 1","j":"Pos Hujan Kerjasama","p":"Sumatera Utara","e": 181,"lo": 99.16400,"la": 2.93200},{"n":"Unib","j":"Pos Hujan Kerjasama","p":"Bengkulu","e": 29,"lo":102.26890,"la": -2.24111},{"n":"Surantih","j":"Pos Hujan Kerjasama","p":"Sumatera Barat","e": 16,"lo":100.65080,"la": 1.59889},{"n":"Sumber Rejo","j":"Pos Hujan Kerjasama","p":"Lampung","e":null,"lo":105.09675,"la": -4.67849},{"n":"Rantau Laban","j":"Pos Hujan Kerjasama","p":"Sumatera Utara","e":null,"lo": 99.16700,"la": 3.38500},{"n":"Pakembaran","j":"Pos Hujan Kerjasama","p":"Jawa Tengah","e":null,"lo":109.13380,"la": -6.98115},{"n":"Setia Bakti","j":"Pos Hujan Kerjasama","p":"Lampung","e":null,"lo":105.27500,"la": -4.40000},{"n":"Beduai","j":"Pos Hujan Kerjasama","p":"Kalimantan Barat","e": 6,"lo":110.39000,"la": 0.70218},{"n":"Karangploso","j":"Pos Hujan Kerjasama","p":"Jawa Timur","e": 575,"lo":112.59670,"la": -7.90139},{"n":"Situnggaling","j":"Pos Hujan Kerjasama","p":"Sumatera Utara","e":null,"lo": 98.52800,"la": 2.91600},{"n":"Binjai Barat","j":"Pos Hujan Kerjasama","p":"Sumatera Utara","e": 32,"lo": 98.49000,"la": 3.62000},{"n":"Bantar Kalong","j":"Pos Hujan Kerjasama","p":"Jawa Barat","e": 540,"lo":108.08000,"la": -7.07000},{"n":"Losarang","j":"Pos Hujan Kerjasama","p":"Jawa Barat","e": 4,"lo":108.16670,"la": -6.40000},{"n":"Kuta Cot Glie","j":"Pos Hujan Kerjasama","p":"Nanggroe Aceh Darussalam","e": 49,"lo": 95.56000,"la": 5.31000},{"n":"Ngargoyoso","j":"Pos Hujan Kerjasama","p":"Jawa Tengah","e": 830,"lo":111.11320,"la": -7.60780},{"n":"Nawangan","j":"Pos Hujan Kerjasama","p":"Jawa Timur","e": 662,"lo":111.19030,"la": -7.99917},{"n":"Tamansari/Kemuningsari","j":"Pos Hujan Kerjasama","p":"Jawa Timur","e": 36,"lo":113.61530,"la": -8.28722},{"n":"Pabuaran","j":"Pos Hujan Kerjasama","p":"Banten","e":null,"lo":106.07190,"la": -6.20525},{"n":"Pulerejo/Muneng","j":"Pos Hujan Kerjasama","p":"Jawa Timur","e": 73,"lo":111.61610,"la": -7.49889},{"n":"Sekerak","j":"Pos Hujan Kerjasama","p":"Nanggroe Aceh Darussalam","e":null,"lo": 97.92510,"la": 4.34230},{"n":"Loji","j":"Pos Hujan Kerjasama","p":"Jawa Barat","e": 60,"lo":108.30000,"la": -6.71667},{"n":"Menes","j":"Pos Hujan Kerjasama","p":"Banten","e":null,"lo":105.91990,"la": -6.37667},{"n":"Pesanggrahan/ Depok","j":"Pos Hujan Kerjasama","p":"DKI Jakarta","e": 86,"lo":106.77230,"la": -6.39718},{"n":"Tenggarong Sebrang / Teluk Dalam","j":"Pos Hujan Kerjasama","p":"Kalimantan Timur","e": 29,"lo":117.45560,"la": 2.16353},{"n":"Lawa","j":"Pos Hujan Kerjasama","p":"Kalimantan Selatan","e": 39,"lo":115.00880,"la": -3.24751},{"n":"Salam","j":"Pos Hujan Kerjasama","p":"Jawa Tengah","e":null,"lo":110.32100,"la": -7.62500},{"n":"Bonegunu","j":"Pos Hujan Kerjasama","p":"Sulawesi Tenggara","e":null,"lo":122.98580,"la": -4.75515},{"n":"Spp Kalasey","j":"Pos Hujan Kerjasama","p":"Sulawesi Utara","e": 46,"lo":124.76830,"la": 1.44639},{"n":"Cukurguling/Lumbang","j":"Pos Hujan Kerjasama","p":"Jawa Timur","e": 251,"lo":112.97860,"la": -7.78472},{"n":"Ciasem","j":"Pos Hujan Kerjasama","p":"Jawa Barat","e": 24,"lo":107.65000,"la": -6.35000},{"n":"Bonto Lebang","j":"Pos Hujan Kerjasama","p":"Sulawesi Selatan","e":null,"lo":119.38690,"la": -5.42444},{"n":"Krueng Sabe","j":"Pos Hujan Kerjasama","p":"Nanggroe Aceh Darussalam","e": 13,"lo": 95.65000,"la": 4.61000},{"n":"Mesuji Raya","j":"Pos Hujan Kerjasama","p":"Sumatera Selatan","e":null,"lo":105.01240,"la": -3.20900},{"n":"Rantau Pandan","j":"Pos Hujan Kerjasama","p":"Jambi","e":null,"lo":102.31190,"la": -1.70127},{"n":"Pulau Rimau","j":"Pos Hujan Kerjasama","p":"Sumatera Selatan","e": 15,"lo":104.46390,"la": -2.60789},{"n":"Pernantian","j":"Pos Hujan Kerjasama","p":"Sumatera Utara","e":null,"lo": 99.78500,"la": 2.21400},{"n":"Beji","j":"Pos Hujan Kerjasama","p":"DI Yogyakarta","e":null,"lo":110.16000,"la": -7.87000},{"n":"Wadaslintang","j":"Pos Hujan Kerjasama","p":"Jawa Tengah","e": 317,"lo":109.81930,"la": -7.54364},{"n":"Pancur Bpp","j":"Pos Hujan Kerjasama","p":"Jawa Tengah","e": 30,"lo":111.47200,"la": -6.71669},{"n":"Rakumpit","j":"Pos Hujan Kerjasama","p":"Kalimantan Tengah","e": 49,"lo":113.67000,"la": -1.75060},{"n":"Tapung Hulu","j":"Pos Hujan Kerjasama","p":"Riau","e": 88,"lo":100.93880,"la": 0.66305},{"n":"Batukliang","j":"Pos Hujan Kerjasama","p":"Nusa Tenggara Barat","e": 7,"lo":116.30000,"la": -8.57000},{"n":"Condong","j":"Pos Hujan Kerjasama","p":"Jawa Timur","e": 95,"lo":113.36970,"la": -7.87083},{"n":"Pulau Banyak","j":"Pos Hujan Kerjasama","p":"Nanggroe Aceh Darussalam","e": 20,"lo": 97.28000,"la": 2.19000},{"n":"Cubadak","j":"Pos Hujan Kerjasama","p":"Sumatera Barat","e":null,"lo":100.54190,"la": 0.46583},{"n":"Prailiu","j":"Pos Hujan Kerjasama","p":"Nusa Tenggara Timur","e": 7,"lo":120.27970,"la": -9.65778},{"n":"Cimanuk","j":"Pos Hujan Kerjasama","p":"Banten","e": 223,"lo":106.04380,"la": -6.35035},{"n":"Junjungan Sirih (Muaro Pingai)","j":"Pos Hujan Kerjasama","p":"Sumatera Barat","e":null,"lo":100.40920,"la": -0.71222},{"n":"Bunder","j":"Pos Hujan Kerjasama","p":"Jawa Barat","e":null,"lo":108.26065,"la": -6.47600},{"n":"Muara Beliti 1","j":"Pos Hujan Kerjasama","p":"Sumatera Selatan","e":null,"lo":103.41640,"la": -3.41636},{"n":"Wanasabakidul","j":"Pos Hujan Kerjasama","p":"Jawa Barat","e": 116,"lo":108.56670,"la": -6.71670},{"n":"Teritip","j":"Pos Hujan Kerjasama","p":"Kalimantan Timur","e": 10,"lo":116.87080,"la": -1.26611},{"n":"Tualang","j":"Pos Hujan Kerjasama","p":"Riau","e": 37,"lo":101.81670,"la": 0.98330},{"n":"Satrian/Kanigoro","j":"Pos Hujan Kerjasama","p":"Jawa Timur","e": 168,"lo":112.22030,"la": -8.14472},{"n":"Sp. Mamplam","j":"Pos Hujan Kerjasama","p":"Nanggroe Aceh Darussalam","e":null,"lo": 96.44000,"la": 5.21000},{"n":"Pangkalan Lesung","j":"Pos Hujan Kerjasama","p":"Riau","e":null,"lo":102.11920,"la": -0.02884},{"n":"Musi Landas","j":"Pos Hujan Kerjasama","p":"Sumatera Selatan","e": 34,"lo":104.61340,"la": -2.91678},{"n":"Sei Balei","j":"Pos Hujan Kerjasama","p":"Sumatera Utara","e":null,"lo": 99.18000,"la": 3.11000},{"n":"Pojok","j":"Pos Hujan Kerjasama","p":"Jawa Timur","e": 259,"lo":112.20780,"la": -8.06944},{"n":"Kemantren/Jabung","j":"Pos Hujan Kerjasama","p":"Jawa Timur","e": 530,"lo":112.75190,"la": -7.94639},{"n":"Sri Gunung","j":"Pos Hujan Kerjasama","p":"Sumatera Selatan","e": 13,"lo":104.08600,"la": -2.58656},{"n":"Patilangio","j":"Pos Hujan Kerjasama","p":"Gorontalo","e":null,"lo":121.86000,"la": 0.51000},{"n":"Gembungan/Slemanan","j":"Pos Hujan Kerjasama","p":"Jawa Timur","e": 195,"lo":112.09970,"la": -8.00194},{"n":"Kappang","j":"Pos Hujan Kerjasama","p":"Sulawesi Selatan","e": 321,"lo":119.75220,"la": -5.01417},{"n":"Kedungkamal","j":"Pos Hujan Kerjasama","p":"Jawa Tengah","e":null,"lo":109.92060,"la": -7.79101},{"n":"Tangunan","j":"Pos Hujan Kerjasama","p":"Jawa Timur","e": 70,"lo":112.46420,"la": -7.54306},{"n":"Sungai Apit","j":"Pos Hujan Kerjasama","p":"Riau","e": 29,"lo":102.13330,"la": 0.75000},{"n":"Bpp Ngadirejo","j":"Pos Hujan Kerjasama","p":"Jawa Tengah","e":null,"lo":110.06100,"la": -7.23600},{"n":"Pakuan Ratu","j":"Pos Hujan Kerjasama","p":"Lampung","e":null,"lo":104.72843,"la": -4.41624},{"n":"Singkawang Timur","j":"Pos Hujan Kerjasama","p":"Kalimantan Barat","e": 3,"lo":109.02480,"la": 0.88422},{"n":"Amahai","j":"Pos Hujan Kerjasama","p":"Maluku","e":null,"lo":128.94000,"la": -3.33000},{"n":"Tongoa","j":"Pos Hujan Kerjasama","p":"Sulawesi Tengah","e":null,"lo":120.17100,"la": -1.21870},{"n":"Panongan","j":"Pos Hujan Kerjasama","p":"Jawa Barat","e": 41,"lo":108.25000,"la": -6.73333},{"n":"Ngelak","j":"Pos Hujan Kerjasama","p":"Jawa Tengah","e": 799,"lo":111.12230,"la": -7.66414},{"n":"Pos Uptd Saumlaki","j":"Pos Hujan Kerjasama","p":"Maluku","e": 8,"lo":131.31000,"la": -7.97820},{"n":"Tegorejo","j":"Pos Hujan Kerjasama","p":"Jawa Tengah","e": 32,"lo":110.14870,"la": -6.97747},{"n":"Waru","j":"Pos Hujan Kerjasama","p":"Kalimantan Timur","e": 9,"lo":116.61610,"la": -1.38910},{"n":"Sawahan","j":"Pos Hujan Kerjasama","p":"Jawa Timur","e": 569,"lo":111.77000,"la": -7.72389},{"n":"Stageof Winangun","j":"Pos Hujan Kerjasama","p":"Sulawesi Utara","e": 124,"lo":124.84000,"la": 1.45000},{"n":"Sidoklumpuk/Sidoarjo","j":"Pos Hujan Kerjasama","p":"Jawa Timur","e": 56,"lo":112.72060,"la": -7.44611},{"n":"Kedungjati 1","j":"Pos Hujan Kerjasama","p":"Jawa Tengah","e":null,"lo":110.63370,"la": -7.15889},{"n":"Bpp Tanete Rilau","j":"Pos Hujan Kerjasama","p":"Sulawesi Selatan","e": 9,"lo":119.60810,"la": -4.48056},{"n":"Gebangan Slt","j":"Pos Hujan Kerjasama","p":"Jawa Tengah","e":null,"lo":110.05800,"la": -7.03600},{"n":"Srimadono Smpk","j":"Pos Hujan Kerjasama","p":"Jawa Tengah","e": 26,"lo":109.78350,"la": -7.71906},{"n":"Telaga Tawang","j":"Pos Hujan Kerjasama","p":"Bali","e": 291,"lo":115.46000,"la": -8.46000},{"n":"Tungkal Ilir","j":"Pos Hujan Kerjasama","p":"Jambi","e": 14,"lo":103.46810,"la": -1.26283},{"n":"Pulau Malan","j":"Pos Hujan Kerjasama","p":"Kalimantan Tengah","e":null,"lo":113.11289,"la": -7.73718},{"n":"Boja","j":"Pos Hujan Kerjasama","p":"Jawa Tengah","e": 316,"lo":110.27090,"la": -7.10379},{"n":"Parung Kuda","j":"Pos Hujan Kerjasama","p":"Jawa Barat","e":null,"lo":106.76670,"la": -6.85000},{"n":"Pringgarata","j":"Pos Hujan Kerjasama","p":"Nusa Tenggara Barat","e": 5,"lo":116.25000,"la": -8.62000},{"n":"Maligas","j":"Pos Hujan Kerjasama","p":"Sumatera Utara","e":null,"lo": 99.36300,"la": 3.03800},{"n":"Cigeulis","j":"Pos Hujan Kerjasama","p":"Banten","e":null,"lo":105.64000,"la": -6.55000},{"n":"Campalagoe/ Bonto Jaya","j":"Pos Hujan Kerjasama","p":"Sulawesi Selatan","e": 256,"lo":119.87440,"la": -5.53417},{"n":"Boyolangu","j":"Pos Hujan Kerjasama","p":"Jawa Timur","e": 135,"lo":111.89560,"la": -8.11056},{"n":"Turangi Lama","j":"Pos Hujan Kerjasama","p":"Sumatera Utara","e":null,"lo": 98.28000,"la": 3.45000},{"n":"Tiworo Kepulauan3","j":"Pos Hujan Kerjasama","p":"Sulawesi Tenggara","e":null,"lo":122.43300,"la": -4.77249},{"n":"Kali Orang","j":"Pos Hujan Kerjasama","p":"Kalimantan Timur","e":null,"lo":116.98750,"la": 0.99971},{"n":"Nanga Mau","j":"Pos Hujan Kerjasama","p":"Kalimantan Barat","e": 160,"lo":113.55000,"la": -6.94000},{"n":"Balongjeruk","j":"Pos Hujan Kerjasama","p":"Jawa Timur","e": 95,"lo":112.19030,"la": -7.67222},{"n":"Curah Malang","j":"Pos Hujan Kerjasama","p":"Jawa Timur","e": 51,"lo":113.56720,"la": -8.24139},{"n":"Sukajadi","j":"Pos Hujan Kerjasama","p":"Banten","e":null,"lo":106.22960,"la": -6.18920},{"n":"Bunga Melur","j":"Pos Hujan Kerjasama","p":"Jawa Barat","e":1050,"lo":106.97470,"la": -7.04762},{"n":"Bulu Cenrana/Pituriawa","j":"Pos Hujan Kerjasama","p":"Sulawesi Selatan","e":null,"lo":119.95640,"la": -3.82366},{"n":"Sorkam","j":"Pos Hujan Kerjasama","p":"Sumatera Utara","e":null,"lo": 98.58000,"la": 1.90000},{"n":"Gembo","j":"Pos Hujan Kerjasama","p":"Jawa Tengah","e":null,"lo":109.76340,"la": -7.39702},{"n":"Oro-Oro Pule","j":"Pos Hujan Kerjasama","p":"Jawa Timur","e": 84,"lo":112.83810,"la": -7.74417},{"n":"Sangata Utara","j":"Pos Hujan Kerjasama","p":"Kalimantan Timur","e": 65,"lo":117.05190,"la": 0.54022},{"n":"Pintu Air Cideng","j":"Pos Hujan Kerjasama","p":"DKI Jakarta","e": 21,"lo":106.80670,"la": -6.17360},{"n":"Boto/Botogerdu","j":"Pos Hujan Kerjasama","p":"Jawa Timur","e": 250,"lo":113.11360,"la": -7.84833},{"n":"Petungasri/Kasri","j":"Pos Hujan Kerjasama","p":"Jawa Timur","e": 212,"lo":112.68810,"la": -7.65167},{"n":"Cambai","j":"Pos Hujan Kerjasama","p":"Kep. Bangka Belitung","e":null,"lo":106.15640,"la": -2.24583},{"n":"Sememu","j":"Pos Hujan Kerjasama","p":"Jawa Timur","e": 171,"lo":113.13250,"la": -8.19750},{"n":"Ktr. Kel. Kairagi Ii","j":"Pos Hujan Kerjasama","p":"Sulawesi Utara","e": 67,"lo":124.90000,"la": 1.50000},{"n":"Kalipentung/ Tanjungtirto","j":"Pos Hujan Kerjasama","p":"DI Yogyakarta","e": 137,"lo":110.45850,"la": -7.78681},{"n":"Pagar Jati","j":"Pos Hujan Kerjasama","p":"Bengkulu","e": 136,"lo":102.40220,"la": -3.63610},{"n":"Rejosari 2","j":"Pos Hujan Kerjasama","p":"Lampung","e":null,"lo":105.16167,"la": -4.30111},{"n":"Bontomatene","j":"Pos Hujan Kerjasama","p":"Sulawesi Selatan","e": 94,"lo":119.77500,"la": -5.61444},{"n":"Blahkiuh","j":"Pos Hujan Kerjasama","p":"Bali","e": 193,"lo":115.21000,"la": -8.51000},{"n":"Cipero","j":"Pos Hujan Kerjasama","p":"Jawa Tengah","e":null,"lo":109.30800,"la": -6.98782},{"n":"Lebak Wangi","j":"Pos Hujan Kerjasama","p":"Jawa Barat","e": 23,"lo":106.78000,"la": -6.13000},{"n":"Padalarang","j":"Pos Hujan Kerjasama","p":"Jawa Barat","e":null,"lo":107.47735,"la": -6.85347},{"n":"Kd Labuhan Uki","j":"Pos Hujan Kerjasama","p":"Sulawesi Utara","e": 6,"lo":123.94500,"la": 0.86139},{"n":"Sumurpanggang","j":"Pos Hujan Kerjasama","p":"Jawa Tengah","e":null,"lo":109.10430,"la": -6.87830},{"n":"Mompang","j":"Pos Hujan Kerjasama","p":"Sumatera Utara","e":null,"lo": 99.59400,"la": 0.84600},{"n":"AWS Krui","j":"aaws","p":"Lampung","e":null,"lo":103.93021,"la": -5.12924},{"n":"ARG Panti","j":"aaws","p":"Jawa Timur","e":null,"lo":113.63710,"la": -8.14961},{"n":"AAWS Rembang","j":"aaws","p":"Jawa Tengah","e":null,"lo":111.33484,"la": -6.70188},{"n":"ARG Pandeglang","j":"aaws","p":"Banten","e":null,"lo":106.10207,"la": -6.30380},{"n":"ARG Sigaluh","j":"aaws","p":"Jawa Tengah","e":null,"lo":109.75300,"la": -7.39200},{"n":"AWS Kemayoran","j":"aaws","p":"DKI Jakarta","e":null,"lo":106.85290,"la": -6.13343},{"n":"ARG Sampang Madura","j":"aaws","p":"Jawa Timur","e":null,"lo":113.47667,"la": -6.89578},{"n":"ARG Kintap","j":"aaws","p":"Kalimantan Selatan","e":null,"lo":115.28959,"la": -3.86192},{"n":"ARG Kedungombo","j":"aaws","p":"Jawa Tengah","e":null,"lo":110.83634,"la": -7.24037},{"n":"ARG Lebak Bulus","j":"aaws","p":"DKI Jakarta","e":null,"lo":106.77737,"la": -6.30417},{"n":"AWS Kulon Progo","j":"aaws","p":"DI Yogyakarta","e":null,"lo":110.12022,"la": -7.89177},{"n":"ARG Sedinginan","j":"aaws","p":"Riau","e":null,"lo":101.27300,"la": 1.34210},{"n":"AWS Stamet Paloh Sambas","j":"aaws","p":"Kalimantan Barat","e":null,"lo":109.32210,"la": 1.73740},{"n":"ARG Tomang","j":"aaws","p":"DKI Jakarta","e":null,"lo":106.78000,"la": -6.16670},{"n":"AAWS Bojongmangu","j":"aaws","p":"Jawa Barat","e":null,"lo":107.19200,"la": -6.43187},{"n":"ARG OKU","j":"aaws","p":"Sumatera Selatan","e":null,"lo":103.97150,"la": -4.76706},{"n":"ARG Batu","j":"aaws","p":"Jawa Timur","e":null,"lo":112.52310,"la": -7.84123},{"n":"AAWS Sruweng Kebumen","j":"aaws","p":"Jawa Tengah","e":null,"lo":109.60476,"la": -7.66142},{"n":"ARG Buleleng","j":"aaws","p":"Bali","e":null,"lo":115.10050,"la": -8.13499},{"n":"AWS Lamongan","j":"aaws","p":"Jawa Timur","e":null,"lo":112.32972,"la": -7.09389},{"n":"AWS Juwana Pati","j":"aaws","p":"Jawa Tengah","e":null,"lo":111.14600,"la": -6.72100},{"n":"AWS Sungai Tabuk","j":"aaws","p":"Kalimantan Selatan","e":null,"lo":114.68182,"la": -3.32653},{"n":"AWS Jagorawi Bogor","j":"aaws","p":"Jawa Barat","e":null,"lo":106.52164,"la": -6.27635},{"n":"AAWS Tuban","j":"aaws","p":"Jawa Timur","e":null,"lo":112.01381,"la": -6.88317},{"n":"AWS Gorontalo","j":"aaws","p":"Gorontalo","e":null,"lo":122.85260,"la": 0.63843},{"n":"AWS Maritim Panjang Lampung","j":"aaws","p":"Lampung","e":null,"lo":105.31050,"la": -5.45553},{"n":"AWS Stamet Tanjung Pinang","j":"aaws","p":"Kep. Riau","e":null,"lo":104.52600,"la": 0.91840},{"n":"ARG Pasir Pangaraian","j":"aaws","p":"Riau","e":null,"lo":101.01000,"la": 0.19340},{"n":"ARG Solok","j":"aaws","p":"Sumatera Barat","e":null,"lo":100.62778,"la": -0.94472},{"n":"ARG Pekutatan","j":"aaws","p":"Bali","e":null,"lo":114.83830,"la": -8.40194},{"n":"AAWS Pondok Salam (AWS+)","j":"aaws","p":"Jawa Barat","e":null,"lo":107.49780,"la": -6.61872},{"n":"AAWS Serang Curug","j":"aaws","p":"Banten","e":null,"lo":106.19020,"la": -6.17122},{"n":"AAWS Ciamis","j":"aaws","p":"Jawa Barat","e":null,"lo":108.36940,"la": -7.29875},{"n":"AWS Nangapinoh","j":"aaws","p":"Kalimantan Barat","e":null,"lo":111.47000,"la": 0.42000},{"n":"AWS Tebo","j":"aaws","p":"Jambi","e":null,"lo":102.17555,"la": -1.38166},{"n":"AWS Kuningan","j":"aaws","p":"Jawa Barat","e":null,"lo":108.45680,"la": -6.99970},{"n":"AWS Cisolok Sukabumi","j":"aaws","p":"Jawa Barat","e":null,"lo":106.47630,"la": -6.95950},{"n":"ARG Karang Nunggal","j":"aaws","p":"Jawa Barat","e":null,"lo":108.14000,"la": -7.62530},{"n":"AAWS Purwodadi","j":"aaws","p":"Jawa Tengah","e":null,"lo":110.91430,"la": -7.10400},{"n":"AWS Staklim Sampali","j":"aaws","p":"Sumatera Utara","e":null,"lo": 98.78000,"la": 3.61600},{"n":"AWS Koba","j":"aaws","p":"Kep. Bangka Belitung","e":null,"lo":106.41670,"la": -2.52330},{"n":"ARG SMPK Lahat","j":"aaws","p":"Sumatera Selatan","e":null,"lo":103.43900,"la": -3.98277},{"n":"AAWS Jember","j":"aaws","p":"Jawa Timur","e":null,"lo":113.44444,"la": -8.20750},{"n":"ARG SMPK Pemalang","j":"aaws","p":"Jawa Tengah","e":null,"lo":109.46130,"la": -6.89682},{"n":"ARG Kandis","j":"aaws","p":"Riau","e":null,"lo":101.11519,"la": 1.02854},{"n":"AWS Staklim Pondok Betung","j":"aaws","p":"Banten","e":null,"lo":106.76000,"la": -6.25000},{"n":"AAWS Waikabubak (AWS+)","j":"aaws","p":"Nusa Tenggara Timur","e":null,"lo":119.39120,"la": -9.62411},{"n":"ARG SMPK Bunga Maya","j":"aaws","p":"Riau","e":null,"lo":102.11670,"la": 0.78330},{"n":"ARG SMPK Tanah Datar","j":"aaws","p":"Sumatera Barat","e":null,"lo":100.56778,"la": -0.47444},{"n":"AWS Selagai lingga","j":"aaws","p":"Lampung","e":null,"lo":104.68037,"la": -5.10120},{"n":"ARG Cibaliung","j":"aaws","p":"Banten","e":null,"lo":106.01540,"la": -6.49350},{"n":"ARG Pronojiwo","j":"aaws","p":"Jawa Timur","e":null,"lo":113.00430,"la": -8.17200},{"n":"AWS Tamiang Hulu","j":"aaws","p":"Nanggroe Aceh Darussalam","e":null,"lo": 97.86441,"la": 4.27744},{"n":"AWS Stamet Banyuwangi","j":"aaws","p":"Jawa Timur","e":null,"lo":114.36944,"la": -8.21028},{"n":"ARG Cariu","j":"aaws","p":"Jawa Barat","e":null,"lo":107.14294,"la": -6.16028},{"n":"AWS Singkil","j":"aaws","p":"Sulawesi Utara","e":null,"lo":124.85389,"la": 1.50306},{"n":"ARG Cisalak","j":"aaws","p":"Banten","e":null,"lo":106.30059,"la": -6.37080},{"n":"AWS Stamet Branti","j":"aaws","p":"Lampung","e":null,"lo":105.17571,"la": -5.24253},{"n":"ARG Aceh","j":"aaws","p":"Nanggroe Aceh Darussalam","e":null,"lo": 97.78570,"la": 4.92426},{"n":"AAWS GAW Agam","j":"aaws","p":"Sumatera Barat","e":null,"lo":100.38222,"la": 0.25028},{"n":"ARG Sekotong","j":"aaws","p":"Nusa Tenggara Barat","e":null,"lo":116.07900,"la": -8.83769},{"n":"ARG SMPK Musi Rawas","j":"aaws","p":"Sumatera Selatan","e":null,"lo":102.92247,"la": -3.20283},{"n":"ARG Tuban","j":"aaws","p":"Jawa Timur","e":null,"lo":112.48361,"la": -6.90039},{"n":"AAWS Lape Sumbawa (AWS+)","j":"aaws","p":"Nusa Tenggara Barat","e":null,"lo":117.61720,"la": -8.62531},{"n":"ARG Tanjung Jabung Barat","j":"aaws","p":"Jambi","e":null,"lo":100.42669,"la": 0.84200},{"n":"ARG Waikabubak","j":"aaws","p":"Nusa Tenggara Timur","e":null,"lo":124.89250,"la": 9.10833},{"n":"ARG Waduk Mrica","j":"aaws","p":"Jawa Tengah","e":null,"lo":109.61300,"la": -7.39100},{"n":"AWS Ranowulu Bitung","j":"aaws","p":"Sulawesi Utara","e":null,"lo":125.12389,"la": 1.46167},{"n":"ARG SMPK Tasikmalaya","j":"aaws","p":"Jawa Barat","e":null,"lo":108.20310,"la": -7.33082},{"n":"ARG Rendang","j":"aaws","p":"Bali","e":null,"lo":115.42020,"la": -8.41583},{"n":"ARG Manokwari","j":"aaws","p":"Papua Barat","e":null,"lo":133.72890,"la": -0.79186},{"n":"AWS Borobudur","j":"aaws","p":"Jawa Tengah","e":null,"lo":110.21397,"la": -7.61412},{"n":"AWS Mojokerto","j":"aaws","p":"Jawa Timur","e":null,"lo":112.92000,"la": -7.65944},{"n":"AAWS Kandat Kediri (AWS+)","j":"aaws","p":"Jawa Timur","e":null,"lo":112.03361,"la": -7.93389},{"n":"ARG Siak","j":"aaws","p":"Riau","e":null,"lo":102.11100,"la": 1.11490},{"n":"ARG Ratahan","j":"aaws","p":"Sulawesi Utara","e":null,"lo":124.79028,"la": 1.02250},{"n":"ARG SMPK Bojong Picung","j":"aaws","p":"Jawa Barat","e":null,"lo":107.27380,"la": -6.83699},{"n":"ARG Cidaun","j":"aaws","p":"Jawa Barat","e":null,"lo":107.36083,"la": -7.49167},{"n":"ARG SMPK Jombang","j":"aaws","p":"Jawa Timur","e":null,"lo":112.23300,"la": -7.49361},{"n":"ARG Sorolangun","j":"aaws","p":"Jambi","e":null,"lo":102.92231,"la": -1.07486},{"n":"AWS Stamet Serang","j":"aaws","p":"Banten","e":null,"lo":106.13180,"la": -6.11127},{"n":"AAWS Kroya Cilacap","j":"aaws","p":"Jawa Tengah","e":null,"lo":109.24522,"la": -7.59953},{"n":"AWS Stageof Karangkates","j":"aaws","p":"Jawa Timur","e":null,"lo":112.77194,"la": -8.15218},{"n":"ARG Alas Sumbawa","j":"aaws","p":"Nusa Tenggara Barat","e":null,"lo":116.99369,"la": -8.51358},{"n":"AWS Sorong","j":"aaws","p":"Papua Barat","e":null,"lo":131.29030,"la": -0.89167},{"n":"AAWS Bantul","j":"aaws","p":"DI Yogyakarta","e":null,"lo":110.37470,"la": -7.72167},{"n":"AAWS Singingi Riau","j":"aaws","p":"Riau","e":null,"lo":101.48859,"la": -0.59824},{"n":"AWS Bamaang Hulu","j":"aaws","p":"Kalimantan Tengah","e":null,"lo":112.97500,"la": -2.50182},{"n":"ARG Poso","j":"aaws","p":"Sulawesi Tengah","e":null,"lo":120.90830,"la": -1.91720},{"n":"AAWS Gerokgak (AWS+)","j":"aaws","p":"Bali","e":null,"lo":114.68000,"la": -8.15000},{"n":"AAWS Oelbubuk","j":"aaws","p":"Nusa Tenggara Timur","e":null,"lo":124.26700,"la": -9.75900},{"n":"ARG Sumber Probolinggo","j":"aaws","p":"Jawa Timur","e":null,"lo":113.37889,"la": -7.78194},{"n":"AAWS Tabalong","j":"aaws","p":"Kalimantan Selatan","e":null,"lo":115.39008,"la": -2.13466},{"n":"AWS Kanigoro Blitar","j":"aaws","p":"Jawa Timur","e":null,"lo":112.22260,"la": -8.14288},{"n":"ARG Pinolosian","j":"aaws","p":"Sulawesi Utara","e":null,"lo":124.11750,"la": 0.39417},{"n":"ARG Tapanuli","j":"aaws","p":"Sumatera Utara","e":null,"lo": 99.22000,"la": 1.40000},{"n":"AWS Karanganyar","j":"aaws","p":"Jawa Tengah","e":null,"lo":111.06700,"la": -7.61500},{"n":"ARG Bengkalis","j":"aaws","p":"Riau","e":null,"lo":102.08400,"la": 1.29580},{"n":"ARG Tulis","j":"aaws","p":"Jawa Tengah","e":null,"lo":109.79800,"la": -7.32500},{"n":"AWS Pekalongan","j":"aaws","p":"Jawa Tengah","e":null,"lo":109.58700,"la": -7.10400},{"n":"AWS Stamet Cilacap","j":"aaws","p":"Jawa Tengah","e":null,"lo":109.01480,"la": -7.71860},{"n":"AAWS Sukodono (AWS+)","j":"aaws","p":"Jawa Tengah","e":null,"lo":110.96620,"la": -7.32750},{"n":"AAWS Penajam Paser Utara","j":"aaws","p":"Kalimantan Timur","e":null,"lo":116.65650,"la": -1.36163},{"n":"AWS Tiris Probolinggo","j":"aaws","p":"Jawa Timur","e":null,"lo":113.40111,"la": -7.96306},{"n":"ARG Nusa Penida","j":"aaws","p":"Bali","e":null,"lo":115.49940,"la": -8.67455},{"n":"ARG Manggarai","j":"aaws","p":"DKI Jakarta","e":null,"lo":106.84870,"la": -6.20748},{"n":"ARG SMPK Sragen","j":"aaws","p":"Jawa Tengah","e":null,"lo":111.04380,"la": -7.52544},{"n":"AWS Sintang","j":"aaws","p":"Kalimantan Barat","e":null,"lo":111.47000,"la": 0.06000},{"n":"AAWS Rokan Hilir","j":"aaws","p":"Riau","e":null,"lo":101.02467,"la": 1.85911},{"n":"AAWS Tabanan","j":"aaws","p":"Bali","e":null,"lo":115.13917,"la": -8.46083},{"n":"ARG Baturiti Tabanan","j":"aaws","p":"Bali","e":null,"lo":115.16000,"la": -8.26150},{"n":"AWS Staklim Banjarbaru","j":"aaws","p":"Kalimantan Selatan","e":null,"lo":114.84084,"la": -3.46225},{"n":"AAWS Kampar Kiri Riau","j":"aaws","p":"Riau","e":null,"lo":100.25300,"la": 0.34170},{"n":"ARG Kangean","j":"aaws","p":"Jawa Timur","e":null,"lo":115.47111,"la": -6.85867},{"n":"AWS Tambilahan","j":"aaws","p":"Riau","e":null,"lo":103.13473,"la": -0.28358},{"n":"ARG Karanggede","j":"aaws","p":"Jawa Tengah","e":null,"lo":110.64800,"la": -7.36200},{"n":"ARG Ciomas","j":"aaws","p":"Banten","e":null,"lo":106.25109,"la": -6.20400},{"n":"ARG Majenang","j":"aaws","p":"Jawa Tengah","e":null,"lo":108.75810,"la": -7.29584},{"n":"AWS Putussibau","j":"aaws","p":"Kalimantan Barat","e":null,"lo":112.93470,"la": 0.83895},{"n":"AAWS Rappang","j":"aaws","p":"Sulawesi Selatan","e":null,"lo":119.80465,"la": -3.88929},{"n":"ARG Kolaka","j":"aaws","p":"Sulawesi Tenggara","e":null,"lo":121.67747,"la": -4.11241},{"n":"AWS Cepu Blora","j":"aaws","p":"Jawa Tengah","e":null,"lo":111.57599,"la": -7.17012},{"n":"AAWS Banyumas","j":"aaws","p":"Jawa Tengah","e":null,"lo":109.30510,"la": -7.52870},{"n":"ARG Muaro Jambi","j":"aaws","p":"Jambi","e":null,"lo":103.47430,"la": -1.98370},{"n":"ARG Muara Bungo","j":"aaws","p":"Jambi","e":null,"lo":101.88840,"la": -1.60930},{"n":"AAWS Banyuwangi","j":"aaws","p":"Jawa Timur","e":null,"lo":114.14445,"la": -8.37910},{"n":"AWS Stamet Citeko","j":"aaws","p":"Jawa Barat","e":null,"lo":106.93510,"la": -6.69796},{"n":"AWS Stamet Bima","j":"aaws","p":"Nusa Tenggara Barat","e":null,"lo":118.67940,"la": -8.51661},{"n":"ARG SMPK Singamerta","j":"aaws","p":"Banten","e":null,"lo":106.24058,"la": -6.11928},{"n":"AWS Staklim Maros","j":"aaws","p":"Sulawesi Selatan","e":null,"lo":119.57879,"la": -4.94593},{"n":"AWS Maritim Merak","j":"aaws","p":"Banten","e":null,"lo":105.98530,"la": -5.91889},{"n":"ARG Minasatene","j":"aaws","p":"Sulawesi Selatan","e":null,"lo":119.57420,"la": -4.83161},{"n":"ARG Mojokerto","j":"aaws","p":"Jawa Timur","e":null,"lo":112.42778,"la": -7.59139},{"n":"ARG Betun","j":"aaws","p":"Nusa Tenggara Timur","e":null,"lo":124.90750,"la": 9.56500},{"n":"ARG Pulosari","j":"aaws","p":"Jawa Tengah","e":null,"lo":109.27074,"la": -7.18731},{"n":"AAWS Sukoharjo","j":"aaws","p":"Jawa Tengah","e":null,"lo":110.71680,"la": -7.57697},{"n":"ARG Gandus","j":"aaws","p":"Sumatera Selatan","e":null,"lo":104.72190,"la": -3.01480},{"n":"AWS Galela","j":"aaws","p":"Maluku Utara","e":null,"lo":127.83333,"la": 1.81667},{"n":"AWS Mayang Jember","j":"aaws","p":"Jawa Timur","e":null,"lo":114.33778,"la": -8.17693},{"n":"AWS Prancak Jembrana","j":"aaws","p":"Bali","e":null,"lo":114.64000,"la": -8.40000},{"n":"AWS Bondowoso","j":"aaws","p":"Jawa Timur","e":null,"lo":114.26556,"la": -7.85608},{"n":"ARG Saptosari","j":"aaws","p":"DI Yogyakarta","e":null,"lo":110.51010,"la": -8.04752},{"n":"ARG Randublatung","j":"aaws","p":"Jawa Tengah","e":null,"lo":111.41400,"la": -7.19400},{"n":"AWS Murung","j":"aaws","p":"Kalimantan Tengah","e":null,"lo":114.75280,"la": 0.50550},{"n":"AAWS Lore Piore (AWS+)","j":"aaws","p":"Sulawesi Tengah","e":null,"lo":120.19000,"la": 1.31000},{"n":"AWS Labuha","j":"aaws","p":"Maluku Utara","e":null,"lo":127.50080,"la": -0.63796},{"n":"AWS Stageof Ternate","j":"aaws","p":"Maluku Utara","e":null,"lo":127.36630,"la": 0.76580},{"n":"AWS Patean Kendal","j":"aaws","p":"Jawa Tengah","e":null,"lo":110.09000,"la": -7.09100},{"n":"AWS Tanggul Jember","j":"aaws","p":"Jawa Timur","e":null,"lo":113.75806,"la": -8.16300},{"n":"AAWS Selogiri (AWS+)","j":"aaws","p":"Jawa Tengah","e":null,"lo":110.88970,"la": -7.78156},{"n":"Stasiun Meteorologi Maritim Lampung","j":"UPT","p":"Lampung","e": 1,"lo":105.33000,"la": -5.47000},{"n":"Stasiun Meteorologi Binaka","j":"UPT","p":"Sumatera Utara","e": 175,"lo": 97.71000,"la": 1.16502},{"n":"Stasiun Meteorologi Gamar Malamo","j":"UPT","p":"Maluku Utara","e": 29,"lo":127.50000,"la": 1.49000},{"n":"Stasiun Meteorologi Hasanuddin","j":"UPT","p":"Sulawesi Selatan","e": 14,"lo":119.55000,"la": -5.07000},{"n":"Stasiun Meteorologi Rahadi Oesman","j":"UPT","p":"Kalimantan Barat","e": 9,"lo":109.97000,"la": -1.80000},{"n":"Stasiun Meteorologi Mararena","j":"UPT","p":"Papua","e": 3,"lo":138.75000,"la": -1.85000},{"n":"Stasiun Meteorologi Maritim Bitung","j":"UPT","p":"Sulawesi Utara","e": 3,"lo":125.18000,"la": 1.44306},{"n":"Stasiun Geofisika Tuntungan","j":"UPT","p":"Sumatera Utara","e": 86,"lo": 98.56000,"la": 3.50100},{"n":"Stasiun Meteorologi Sentani","j":"UPT","p":"Papua","e": 96,"lo":140.48000,"la": -2.57000},{"n":"Stasiun Geofisika Parapat","j":"UPT","p":"Sumatera Utara","e":1061,"lo": 98.92000,"la": 2.69395},{"n":"Stasiun Meteorologi Maritim Perak II","j":"UPT","p":"Jawa Timur","e": 3,"lo":112.74000,"la": -7.20937},{"n":"Stasiun Meteorologi Mathilda Batlayeri","j":"UPT","p":"Maluku","e": 24,"lo":131.30000,"la": -7.98000},{"n":"Stasiun Meteorologi Frans Kaisiepo","j":"UPT","p":"Papua","e": 3,"lo":136.10000,"la": -1.19069},{"n":"Stasiun Meteorologi Sultan Muhammad Kaharuddin","j":"UPT","p":"Nusa Tenggara Barat","e": 4,"lo":117.43000,"la": -8.52000},{"n":"Stasiun Geofisika Jakarta","j":"UPT","p":"DKI Jakarta","e": 4,"lo":106.84000,"la": -6.15568},{"n":"Stasiun Meteorologi Yuvai Semaring","j":"UPT","p":"Kalimantan Timur","e":1090,"lo":115.68000,"la": 3.86000},{"n":"Stasiun Meteorologi Tjut Nyak Dien Meulaboh","j":"UPT","p":"Nanggroe Aceh Darussalam","e": 3,"lo": 96.25000,"la": 4.04898},{"n":"Stasiun Meteorologi Malikussaleh","j":"UPT","p":"Nanggroe Aceh Darussalam","e": 28,"lo": 96.93000,"la": 5.22800},{"n":"Balai Besar Meteorologi, Klimatologi, dan Geofisika Wilayah I","j":"UPT","p":"Sumatera Utara","e":null,"lo": 98.64000,"la": 3.53970},{"n":"Stasiun Meteorologi Syamsudin Noor","j":"UPT","p":"Kalimantan Selatan","e": 32,"lo":114.76000,"la": -3.45000},{"n":"Stasiun Meteorologi David Constantijn Saudale","j":"UPT","p":"Nusa Tenggara Timur","e": 174,"lo":123.07000,"la":-10.73000},{"n":"Stasiun Meteorologi Rendani","j":"UPT","p":"Papua Barat","e": 3,"lo":134.05000,"la": -0.88000},{"n":"Stasiun Geofisika Tangerang","j":"UPT","p":"Banten","e": 14,"lo":106.38000,"la": -6.10000},{"n":"Stasiun Meteorologi Frans Sales Lega","j":"UPT","p":"Nusa Tenggara Timur","e":1070,"lo":120.45000,"la": -8.63000},{"n":"Stasiun Meteorologi Sanggu","j":"UPT","p":"Kalimantan Tengah","e": 37,"lo":114.90000,"la": -1.67000},{"n":"Stasiun Geofisika Mataie","j":"UPT","p":"Nanggroe Aceh Darussalam","e": 12,"lo": 95.49000,"la": 5.46610},{"n":"Stasiun Meteorologi Kasiguncu","j":"UPT","p":"Sulawesi Tengah","e": 15,"lo":120.73000,"la": -1.38000},{"n":"Stasiun Klimatologi Maros","j":"UPT","p":"Sulawesi Selatan","e": 11,"lo":119.55000,"la": -4.90000},{"n":"Stasiun Geofisika Silaing Bawah","j":"UPT","p":"Sumatera Barat","e": 773,"lo":100.40000,"la": 0.45700},{"n":"Stasiun Meteorologi Maritim","j":"UPT","p":"Sumatera Barat","e": 2,"lo":100.37000,"la": -0.99600},{"n":"Stasiun Geofisika Waingapu","j":"UPT","p":"Nusa Tenggara Timur","e": 13,"lo":120.30000,"la": -9.90000},{"n":"Stasiun Meteorologi H. Asan","j":"UPT","p":"Kalimantan Tengah","e": 3,"lo":112.93000,"la": -2.55000},{"n":"Stasiun Meteorologi Cut Bau Maimun Saleh","j":"UPT","p":"Nanggroe Aceh Darussalam","e": 126,"lo": 95.35000,"la": 5.86979},{"n":"Stasiun Meteorologi Sam Ratulangi","j":"UPT","p":"Sulawesi Utara","e": 80,"lo":124.92000,"la": 1.53000},{"n":"Stasiun Meteorologi Juwata","j":"UPT","p":"Kalimantan Timur","e": 6,"lo":117.57000,"la": 3.33000},{"n":"Stasiun Meteorologi Sudjarwo Tjondro Negoro","j":"UPT","p":"Papua","e": 8,"lo":136.23000,"la": -1.87000},{"n":"Stasiun Klimatologi Kenten","j":"UPT","p":"Sumatera Selatan","e": 8,"lo":104.70000,"la": -3.00000},{"n":"Stasiun Geofisika Karang Panjang","j":"UPT","p":"Maluku","e": 83,"lo":128.19000,"la": -3.69000},{"n":"Stasiun Meteorologi Komodo","j":"UPT","p":"Nusa Tenggara Timur","e": 67,"lo":119.89000,"la": -8.49000},{"n":"Stasiun Meteorologi Geser","j":"UPT","p":"Maluku","e": 2,"lo":130.88000,"la": -3.88130},{"n":"Stasiun Klimatologi Semarang","j":"UPT","p":"Jawa Tengah","e": 227,"lo":110.42000,"la": -6.98000},{"n":"Stasiun Meteorologi Budiarto","j":"UPT","p":"Banten","e": 46,"lo":106.57000,"la": -6.28700},{"n":"Stasiun Meteorologi Soekarno Hatta","j":"UPT","p":"Banten","e": 8,"lo":106.65000,"la": -6.12000},{"n":"Stasiun Meteorologi Maritim Tanjung Priok","j":"UPT","p":"DKI Jakarta","e": 2,"lo":106.88000,"la": -6.10781},{"n":"Stasiun Meteorologi Sultan Mahmud Badaruddin II","j":"UPT","p":"Sumatera Selatan","e": 11,"lo":104.70000,"la": -2.90000},{"n":"Stasiun Meteorologi Maritim","j":"UPT","p":"Sulawesi Tenggara","e": 2,"lo":122.60000,"la": -3.95000},{"n":"Stasiun Geofisika Saumlaki","j":"UPT","p":"Maluku","e": 26,"lo":131.30000,"la": -7.98000},{"n":"Stasiun Meteorologi Fransiskus Xaverius Seda","j":"UPT","p":"Nusa Tenggara Timur","e": 4,"lo":122.25000,"la": -8.63000},{"n":"Stasiun Klimatologi Pondok Betung","j":"UPT","p":"Banten","e": 26,"lo":106.75000,"la": -6.26107},{"n":"Stasiun Meteorologi Aek Godang","j":"UPT","p":"Sumatera Utara","e": 281,"lo": 99.45000,"la": 1.55000},{"n":"Stasiun Geofisika Sanglah","j":"UPT","p":"Bali","e": 15,"lo":115.21000,"la": -8.67689},{"n":"Stasiun Meteorologi Umbu Mehang Kunda","j":"UPT","p":"Nusa Tenggara Timur","e": 52,"lo":120.33000,"la": -9.67000},{"n":"Stasiun Meteorologi Sangkapura","j":"UPT","p":"Jawa Timur","e":null,"lo":112.63000,"la": -5.85000},{"n":"Stasiun Meteorologi Bandara Internasional Lombok","j":"UPT","p":"Nusa Tenggara Barat","e": 16,"lo":116.11000,"la": -8.55000},{"n":"Stasiun Meteorologi Seigun","j":"UPT","p":"Papua Barat","e":null,"lo":131.26000,"la": -0.87726},{"n":"Stasiun Meteorologi Tegal","j":"UPT","p":"Jawa Tengah","e": 3,"lo":109.15000,"la": -6.85000},{"n":"Stasiun Meteorologi Supadio","j":"UPT","p":"Kalimantan Barat","e": 3,"lo":109.45000,"la": -0.14206},{"n":"Stasiun Meteorologi Sepinggan","j":"UPT","p":"Kalimantan Timur","e": 3,"lo":116.90000,"la": -1.26000},{"n":"Stasiun Meteorologi Ngurah Rai","j":"UPT","p":"Bali","e": 4,"lo":115.17000,"la": -8.74916},{"n":"Stasiun Meteorologi Djalaluddin","j":"UPT","p":"Gorontalo","e": 18,"lo":122.83000,"la": 0.63300},{"n":"Stasiun Meteorologi Sultan Thaha","j":"UPT","p":"Jambi","e": 26,"lo":103.64000,"la": -1.63368},{"n":"Stasiun Geofisika Bandung","j":"UPT","p":"Jawa Barat","e": 829,"lo":107.60000,"la": -6.88000},{"n":"Stasiun Klimatologi Sicincin","j":"UPT","p":"Sumatera Barat","e": 137,"lo":100.71000,"la": -0.57500},{"n":"Stasiun Meteorologi Enarotali","j":"UPT","p":"Papua","e":1774,"lo":136.38000,"la": -3.92688},{"n":"Stasiun Geofisika Kepahiyang","j":"UPT","p":"Bengkulu","e": 517,"lo":102.59000,"la": -3.63000},{"n":"Stasiun Klimatologi Banjar Baru","j":"UPT","p":"Kalimantan Selatan","e": 55,"lo":114.84000,"la": -3.46225},{"n":"Stasiun Meteorologi Sultan Muhammad Salahuddin","j":"UPT","p":"Nusa Tenggara Barat","e": 3,"lo":118.69000,"la": -8.54323},{"n":"Stasiun Meteorologi Hang Nadim","j":"UPT","p":"Kep. Riau","e": 28,"lo":104.12000,"la": 1.11700},{"n":"Stasiun Geofisika Tanjung Pandan","j":"UPT","p":"Kep. Bangka Belitung","e": 22,"lo":107.65000,"la": -2.75750},{"n":"Stasiun Meteorologi Tanjung Harapan","j":"UPT","p":"Kalimantan Timur","e": 3,"lo":117.22000,"la": 2.50000},{"n":"Stasiun Meteorologi F.L Tobing","j":"UPT","p":"Sumatera Utara","e": 10,"lo": 98.88000,"la": 1.55000},{"n":"Stasiun Meteorologi Pangsuma","j":"UPT","p":"Kalimantan Barat","e": 43,"lo":112.93000,"la": 0.84000},{"n":"Stasiun Geofisika Tual","j":"UPT","p":"Maluku","e": 22,"lo":132.75000,"la": -5.64000},{"n":"Stasiun Geofisika Balikpapan","j":"UPT","p":"Kalimantan Timur","e": 31,"lo":116.91463,"la": -1.25530},{"n":"Stasiun Meteorologi Moanamani","j":"UPT","p":"Papua","e": 3,"lo":135.52000,"la": -3.35210},{"n":"Stasiun Geofisika Banjarnegara","j":"UPT","p":"Jawa Tengah","e": 608,"lo":109.71000,"la": -7.31800},{"n":"Stasiun Geofisika Angkasapura","j":"UPT","p":"Papua","e": 400,"lo":140.41000,"la": -2.52000},{"n":"Stasiun Meteorologi Beringin","j":"UPT","p":"Kalimantan Tengah","e": 42,"lo":114.53000,"la": -0.56000},{"n":"Stasiun Meteorologi Andi Jemma","j":"UPT","p":"Sulawesi Selatan","e": 50,"lo":120.32000,"la": -2.55440},{"n":"Stasiun Meteorologi Sultan Iskandar Muda","j":"UPT","p":"Nanggroe Aceh Darussalam","e": 20,"lo": 95.42000,"la": 5.52100},{"n":"Stasiun Geofisika Kendari","j":"UPT","p":"Sulawesi Tenggara","e": 10,"lo":122.62000,"la": -3.96000},{"n":"Stasiun Meteorologi Tanah Merah","j":"UPT","p":"Papua","e": 97,"lo":140.31000,"la": -6.10000},{"n":"Stasiun Klimatologi Lasiana","j":"UPT","p":"Nusa Tenggara Timur","e": 19,"lo":123.60000,"la":-10.17000},{"n":"Stasiun Geofisika Sorong","j":"UPT","p":"Papua Barat","e": 64,"lo":131.26000,"la": -0.86000},{"n":"Stasiun Meteorologi Utarom","j":"UPT","p":"Papua Barat","e": 5,"lo":133.75000,"la": -3.67000},{"n":"Stasiun Klimatologi Sei Durian","j":"UPT","p":"Jambi","e": 34,"lo":103.49000,"la": -1.60000},{"n":"Stasiun Meteorologi Sangia Ni Bandera","j":"UPT","p":"Sulawesi Tenggara","e": 10,"lo":121.60000,"la": -4.17500},{"n":"Stasiun Meteorologi Pongtiku","j":"UPT","p":"Sulawesi Selatan","e": 879,"lo":119.82000,"la": -3.04250},{"n":"Stasiun Meteorologi Paloh","j":"UPT","p":"Kalimantan Barat","e": 15,"lo":109.30000,"la": 1.74000},{"n":"Balai Besar Meteorologi, Klimatologi, dan Geofisika Wilayah V","j":"UPT","p":"Papua","e":null,"lo":140.68000,"la": -2.56700},{"n":"Stasiun Meteorologi Cilacap","j":"UPT","p":"Jawa Tengah","e": 20,"lo":109.02000,"la": -7.73000},{"n":"Stasiun Meteorologi Dabo","j":"UPT","p":"Kep. Riau","e": 29,"lo":104.58000,"la": -0.48000},{"n":"Stasiun Meteorologi Citeko","j":"UPT","p":"Jawa Barat","e": 920,"lo":106.85000,"la": -6.70000},{"n":"Stasiun Meteorologi Japura","j":"UPT","p":"Riau","e": 19,"lo":102.32000,"la": 0.33000},{"n":"Stasiun Meteorologi Susilo","j":"UPT","p":"Kalimantan Barat","e": 31,"lo":111.47000,"la": 0.06000},{"n":"Stasiun Meteorologi Mozez Kilangin","j":"UPT","p":"Papua","e": 30,"lo":136.43000,"la": -4.72000},{"n":"Stasiun Meteorologi Raja Haji Abdullah Tanjung Balai Karimun","j":"UPT","p":"Kep. Riau","e": 1,"lo":103.38000,"la": 1.03000},{"n":"Stasiun Meteorologi Dumatubun","j":"UPT","p":"Maluku","e": 16,"lo":132.73000,"la": -5.66000},{"n":"Stasiun Meteorologi Oesman Sadik","j":"UPT","p":"Maluku Utara","e": 14,"lo":127.50000,"la": -0.63784},{"n":"Stasiun Meteorologi H. Asan Hananjoedin","j":"UPT","p":"Kep. Bangka Belitung","e": 47,"lo":107.75000,"la": -2.75000},{"n":"Stasiun Klimatologi Darmaga","j":"UPT","p":"Jawa Barat","e": 207,"lo":106.75000,"la": -6.50000},{"n":"Stasiun Geofisika Palu","j":"UPT","p":"Sulawesi Tengah","e": 149,"lo":119.84000,"la": -0.90519},{"n":"Stasiun Klimatologi Masgar","j":"UPT","p":"Lampung","e": 71,"lo":105.18000,"la": -5.17236},{"n":"Stasiun Meteorologi Naha","j":"UPT","p":"Sulawesi Utara","e": 6,"lo":125.51000,"la": 3.68000},{"n":"Stasiun Meteorologi Eltari","j":"UPT","p":"Nusa Tenggara Timur","e": 102,"lo":123.40000,"la":-10.10000},{"n":"Stasiun Meteorologi Jatiwangi","j":"UPT","p":"Jawa Barat","e": 85,"lo":108.27000,"la": -6.75000},{"n":"Pos Meteorologi Penggung","j":"UPT","p":"Jawa Barat","e": 23,"lo":108.33205,"la": -6.45190},{"n":"Stasiun Meteorologi Tarempa","j":"UPT","p":"Kep. Riau","e": 2,"lo":106.25000,"la": 3.20000},{"n":"Stasiun Geofisika Gowa","j":"UPT","p":"Sulawesi Selatan","e": 28,"lo":119.50000,"la": -5.20000},{"n":"Stasiun Klimatologi Negara","j":"UPT","p":"Bali","e": 24,"lo":114.62000,"la": -8.34000},{"n":"Stasiun Meteorologi Kemayoran","j":"UPT","p":"DKI Jakarta","e": 4,"lo":106.84000,"la": -6.15559},{"n":"Stasiun Klimatologi Indrapuri","j":"UPT","p":"Nanggroe Aceh Darussalam","e": 51,"lo": 95.46000,"la": 5.40000},{"n":"Stasiun Geofisika Winangun","j":"UPT","p":"Sulawesi Utara","e": 128,"lo":124.84000,"la": 1.44390},{"n":"Stasiun Geofisika Kota Bumi","j":"UPT","p":"Lampung","e": 60,"lo":104.87000,"la": -4.83631},{"n":"Stasiun Meteorologi Kijang","j":"UPT","p":"Kep. Riau","e": 18,"lo":104.53000,"la": 0.91816},{"n":"Stasiun Meteorologi Mopah","j":"UPT","p":"Papua","e":null,"lo":140.38000,"la": -8.47000},{"n":"Stasiun Meteorologi Perak I","j":"UPT","p":"Jawa Timur","e": 3,"lo":112.46000,"la": -7.13000},{"n":"Stasiun Meteorologi Majene","j":"UPT","p":"Sulawesi Barat","e": 29,"lo":119.20000,"la": -3.56194},{"n":"Stasiun Geofisika Gunung Sitoli","j":"UPT","p":"Sumatera Utara","e": 175,"lo": 97.58000,"la": 1.30000},{"n":"Stasiun Meteorologi Sultan Syarif Kasim II","j":"UPT","p":"Riau","e": 27,"lo":101.43000,"la": 0.46700},{"n":"Stasiun Meteorologi Kualanamu","j":"UPT","p":"Sumatera Utara","e": 23,"lo": 98.89000,"la": 3.64200},{"n":"Stasiun Meteorologi Mutiara Sis-Al Jufri","j":"UPT","p":"Sulawesi Tengah","e": 228,"lo":119.91000,"la": -0.91589},{"n":"Stasiun Meteorologi Amahai","j":"UPT","p":"Maluku","e": 10,"lo":128.88000,"la": -3.35000},{"n":"Stasiun Klimatologi Genyem","j":"UPT","p":"Papua","e": 70,"lo":140.16000,"la": -2.60000},{"n":"Stasiun Meteorologi Kalianget","j":"UPT","p":"Jawa Timur","e":null,"lo":113.97000,"la": -7.05000},{"n":"Stasiun Klimatologi Siantan","j":"UPT","p":"Kalimantan Barat","e": 2,"lo":109.19000,"la": 0.07500},{"n":"Stasiun Geofisika Yogyakarta","j":"UPT","p":"DI Yogyakarta","e": 153,"lo":110.30000,"la": -7.82000},{"n":"Stasiun Meteorologi Nangapinoh","j":"UPT","p":"Kalimantan Barat","e": 40,"lo":111.47000,"la": -0.42000},{"n":"Stasiun Meteorologi Beto Ambari","j":"UPT","p":"Sulawesi Tenggara","e": 233,"lo":122.62000,"la": -5.47000},{"n":"Stasiun Meteorologi Juanda","j":"UPT","p":"Jawa Timur","e":null,"lo":112.77000,"la": -7.37000},{"n":"Stasiun Meteorologi Temindung","j":"UPT","p":"Kalimantan Timur","e": 10,"lo":117.16000,"la": -0.48000},{"n":"Stasiun Meteorologi Gusti Syamsir Alam","j":"UPT","p":"Kalimantan Selatan","e": 2,"lo":116.17000,"la": -3.30000},{"n":"Stasiun Meteorologi Sultan Baabullah","j":"UPT","p":"Maluku Utara","e": 33,"lo":127.38000,"la": 0.83330},{"n":"Stasiun Geofisika Kampung Baru","j":"UPT","p":"Nusa Tenggara Timur","e": 4,"lo":123.61000,"la":-10.15000},{"n":"Stasiun Meteorologi Ahmad Yani","j":"UPT","p":"Jawa Tengah","e":null,"lo":110.38000,"la": -6.98000},{"n":"Stasiun Meteorologi Raden Inten II","j":"UPT","p":"Lampung","e": 81,"lo":105.18000,"la": -5.27000},{"n":"Stasiun Meteorologi Maritim Pontianak","j":"UPT","p":"Kalimantan Barat","e": 4,"lo":109.34000,"la": -0.03000},{"n":"Stasiun Geofisika Sawahan","j":"UPT","p":"Jawa Timur","e": 835,"lo":111.79000,"la": -7.74000},{"n":"Stasiun Meteorologi Sultan Bantilan","j":"UPT","p":"Sulawesi Tengah","e": 2,"lo":120.79000,"la": 1.12114},{"n":"Stasiun Meteorologi Dok II Jayapura","j":"UPT","p":"Papua","e": 3,"lo":140.72000,"la": -2.53000},{"n":"Stasiun Geofisika Tretes","j":"UPT","p":"Jawa Timur","e": 832,"lo":112.64000,"la": -7.70000},{"n":"Stasiun Pemantau Atmosfir Global Bukit Koto Tabang","j":"UPT","p":"Sumatera Barat","e": 865,"lo":100.32000,"la": -0.20000},{"n":"Stasiun Meteorologi Ranai","j":"UPT","p":"Kep. Riau","e": 2,"lo":108.39000,"la": 3.91206},{"n":"Stasiun Geofisika Ternate","j":"UPT","p":"Maluku Utara","e": 43,"lo":127.35000,"la": 0.78100},{"n":"Stasiun Meteorologi Iskandar","j":"UPT","p":"Kalimantan Tengah","e": 22,"lo":111.66000,"la": -2.73000},{"n":"Stasiun Klimatologi Sampali","j":"UPT","p":"Sumatera Utara","e": 25,"lo": 98.78000,"la": 3.61687},{"n":"Stasiun Meteorologi Tardamu","j":"UPT","p":"Nusa Tenggara Timur","e": 15,"lo":121.83000,"la":-10.50000},{"n":"Stasiun Meteorologi Banyuwangi","j":"UPT","p":"Jawa Timur","e": 43,"lo":114.35000,"la": -8.21000},{"n":"Stasiun Meteorologi Maritim Belawan","j":"UPT","p":"Sumatera Utara","e": 3,"lo": 98.71000,"la": 3.78824},{"n":"Stasiun Klimatologi Kediri","j":"UPT","p":"Nusa Tenggara Barat","e": 52,"lo":116.17000,"la": -8.63640}];
var map = L.map('peta-bmkg', {scrollWheelZoom:false}).setView([-2.5,118],4);
L.tileLayer('https://{s}.basemaps.cartocdn.com/light_all/{z}/{x}/{y}{r}.png',{
attribution:'© OpenStreetMap © CARTO', maxZoom:18
}).addTo(map);
// Fix tile misalignment - invalidate setelah render
setTimeout(function(){ map.invalidateSize(); }, 300);
setTimeout(function(){ map.invalidateSize(); }, 800);
var warna = {"Pos Hujan Kerjasama":"#2196F3","aaws":"#E53935","UPT":"#43A047"};
data.forEach(function(d) {
var c = warna[d.j]||"#999";
var m = L.circleMarker([d.la,d.lo],{radius:5,color:c,fillColor:c,fillOpacity:0.7,weight:0.5});
m.bindPopup('&lt;b>'+d.n+'&lt;/b>&lt;br>Jenis: '+d.j+'&lt;br>Provinsi: '+d.p+(d.e?'&lt;br>Elevasi: '+d.e+' mdpl':''));
m.bindTooltip(d.n,{permanent:false,direction:'top'});
m.addTo(map);
});
map.on('zoomend',function(){
var z=map.getZoom();
document.querySelectorAll('#peta-bmkg .leaflet-tooltip').forEach(function(el){
el.style.display=z>=9?'block':'none';
});
});
// Paksa recalculate setelah layout selesai
window.addEventListener('load', function(){ map.invalidateSize(true); });
setTimeout(function(){ map.invalidateSize(true); }, 500);
setTimeout(function(){ map.invalidateSize(true); }, 1500);
})();
}
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', initPetaBMKG);
} else {
initPetaBMKG();
}
&lt;/script>
&lt;hr>
&lt;h2 id="2-kerapatan-stasiun-vs-standar-wmo">2. Kerapatan Stasiun vs Standar WMO&lt;/h2>
&lt;p>Standar WMO (2008) merekomendasikan minimal &lt;strong>1 pos per 250 km²&lt;/strong> untuk kawasan pegunungan tropis.&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Wilayah&lt;/th>
&lt;th>Luas (km²)&lt;/th>
&lt;th>Stasiun&lt;/th>
&lt;th>Kerapatan (km²/pos)&lt;/th>
&lt;th>Status WMO&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Jawa&lt;/td>
&lt;td>128.297&lt;/td>
&lt;td>2.765&lt;/td>
&lt;td>46&lt;/td>
&lt;td>✅ Memenuhi&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Sumatera&lt;/td>
&lt;td>473.481&lt;/td>
&lt;td>1.321&lt;/td>
&lt;td>358&lt;/td>
&lt;td>⚠️ Di bawah standar&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Kalimantan&lt;/td>
&lt;td>748.168&lt;/td>
&lt;td>842&lt;/td>
&lt;td>889&lt;/td>
&lt;td>❌ Jauh di bawah&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Sulawesi&lt;/td>
&lt;td>188.522&lt;/td>
&lt;td>1.023&lt;/td>
&lt;td>184&lt;/td>
&lt;td>✅ Memenuhi&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Maluku&lt;/td>
&lt;td>31.982&lt;/td>
&lt;td>213&lt;/td>
&lt;td>150&lt;/td>
&lt;td>✅ Memenuhi&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Papua&lt;/td>
&lt;td>421.981&lt;/td>
&lt;td>323&lt;/td>
&lt;td>1.306&lt;/td>
&lt;td>❌ Jauh di bawah&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;blockquote>
&lt;p>Kalimantan dan Papua memiliki kerapatan stasiun yang sangat rendah — DAS-DAS besar di sana hampir tidak terpantau secara langsung.&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h2 id="3-gpm-imerg-sebagai-alternatif">3. GPM IMERG sebagai Alternatif&lt;/h2>
&lt;p>&lt;strong>GPM IMERG&lt;/strong> adalah produk curah hujan berbasis satelit dari NASA dan JAXA, tersedia gratis sejak Juni 2000.&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>Parameter&lt;/th>
&lt;th>Nilai&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Resolusi spasial&lt;/td>
&lt;td>0.1° × 0.1° (~11 km)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Resolusi temporal&lt;/td>
&lt;td>30 menit&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Ketersediaan&lt;/td>
&lt;td>Juni 2000 – sekarang&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Varian terbaik&lt;/td>
&lt;td>Final Run (koreksi dengan data pos)&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Akses&lt;/td>
&lt;td>Gratis via NASA Earthdata&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h2 id="4-validasi-gpm-imerg--interaktif">4. Validasi GPM IMERG — Interaktif&lt;/h2>
&lt;p>Geser slider untuk mensimulasikan &lt;strong>koreksi bias&lt;/strong> pada data GPM IMERG. Metrik validasi (NSE, KGE, PBIAS, RMSE) berubah otomatis.&lt;/p>
&lt;div style="margin:1.2rem 0 0.5rem;">
&lt;label style="font-size:0.9rem;font-weight:600;">
Faktor Koreksi Bias: &lt;span id="bias-label" style="color:#1565C0;font-family:monospace;">1.00×&lt;/span>
&lt;/label>&lt;br>
&lt;input type="range" id="bias-slider" min="0.7" max="1.3" step="0.01" value="1.0"
style="width:100%;max-width:480px;margin-top:6px;accent-color:#1565C0;">
&lt;/div>
&lt;div style="display:grid;grid-template-columns:1fr 290px;gap:14px;margin-top:0.5rem;">
&lt;div>
&lt;div id="plot-hidrograf" style="height:290px;">&lt;/div>
&lt;p style="font-size:0.78rem;color:#888;text-align:center;margin-top:2px;">
DAS Akelamo, Pulau Obi, 2020–2022 · Hover untuk nilai per bulan
&lt;/p>
&lt;/div>
&lt;div>
&lt;table style="width:100%;border-collapse:collapse;font-size:0.85rem;">
&lt;thead>
&lt;tr style="background:#1A3A5C;color:white;">
&lt;th style="padding:6px 9px;text-align:left;">Metrik&lt;/th>
&lt;th style="padding:6px 9px;text-align:center;">Nilai&lt;/th>
&lt;th style="padding:6px 9px;text-align:left;">Status&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>&lt;td style="padding:5px 9px;font-weight:600;">NSE&lt;/td>
&lt;td id="val-nse" style="padding:5px 9px;text-align:center;font-family:monospace;font-weight:700;">&lt;/td>
&lt;td id="sta-nse" style="padding:5px 9px;font-size:0.8rem;">&lt;/td>&lt;/tr>
&lt;tr style="background:#f5f5f5;">
&lt;td style="padding:5px 9px;font-weight:600;">KGE&lt;/td>
&lt;td id="val-kge" style="padding:5px 9px;text-align:center;font-family:monospace;font-weight:700;">&lt;/td>
&lt;td id="sta-kge" style="padding:5px 9px;font-size:0.8rem;">&lt;/td>&lt;/tr>
&lt;tr>&lt;td style="padding:5px 9px;font-weight:600;">PBIAS (%)&lt;/td>
&lt;td id="val-pbias" style="padding:5px 9px;text-align:center;font-family:monospace;font-weight:700;">&lt;/td>
&lt;td id="sta-pbias" style="padding:5px 9px;font-size:0.8rem;">&lt;/td>&lt;/tr>
&lt;tr style="background:#f5f5f5;">
&lt;td style="padding:5px 9px;font-weight:600;">RMSE (mm)&lt;/td>
&lt;td id="val-rmse" style="padding:5px 9px;text-align:center;font-family:monospace;font-weight:700;">&lt;/td>
&lt;td id="sta-rmse" style="padding:5px 9px;">—&lt;/td>&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;div style="margin-top:8px;font-size:0.77rem;color:#444;background:#EFF6FF;
border-left:3px solid #1565C0;padding:7px 9px;border-radius:0 5px 5px 0;">
&lt;strong>Kriteria Moriasi et al. (2007):&lt;/strong>&lt;br>
NSE ≥ 0.65 → Memuaskan&lt;br>KGE ≥ 0.50 → Baik&lt;br>|PBIAS| ≤ 15% → Memuaskan
&lt;/div>
&lt;/div>
&lt;/div>
&lt;script>
(function() {
var obs = [210,185,230,160,90,45,20,15,30,110,185,230,
190,210,250,140,80,35,18,20,40,120,200,215,
220,195,240,150,85,50,22,18,35,115,190,225];
var imerg = [195,200,215,150,85,40,18,18,28,105,175,215,
180,195,235,135,75,32,16,18,38,115,190,200,
205,185,225,142,80,46,20,16,32,108,180,210];
var bln = ["Jan'20","Feb'20","Mar'20","Apr'20","Mei'20","Jun'20","Jul'20","Ags'20","Sep'20","Okt'20","Nov'20","Des'20",
"Jan'21","Feb'21","Mar'21","Apr'21","Mei'21","Jun'21","Jul'21","Ags'21","Sep'21","Okt'21","Nov'21","Des'21",
"Jan'22","Feb'22","Mar'22","Apr'22","Mei'22","Jun'22","Jul'22","Ags'22","Sep'22","Okt'22","Nov'22","Des'22"];
function hitung(sim) {
var n=obs.length, mo=0, ms=0;
for(var i=0;i&lt;n;i++){mo+=obs[i];ms+=sim[i];}
mo/=n; ms/=n;
var ssTot=0,ssRes=0,sumObs=0,sumSim=0,d1=0,d2=0,num=0;
for(var i=0;i&lt;n;i++){
ssTot+=Math.pow(obs[i]-mo,2); ssRes+=Math.pow(obs[i]-sim[i],2);
sumObs+=obs[i]; sumSim+=sim[i];
d1+=Math.pow(obs[i]-mo,2); d2+=Math.pow(sim[i]-ms,2);
num+=(obs[i]-mo)*(sim[i]-ms);
}
var nse=1-ssRes/ssTot;
var pbias=(sumSim-sumObs)/sumObs*100;
var rmse=Math.sqrt(ssRes/n);
var r=num/(Math.sqrt(d1)*Math.sqrt(d2));
var kge=1-Math.sqrt(Math.pow(r-1,2)+Math.pow(Math.sqrt(d2/n)/Math.sqrt(d1/n)-1,2)+Math.pow(ms/mo-1,2));
return {nse:nse,kge:kge,pbias:pbias,rmse:rmse};
}
function sta(v,t) {
if(t==="nse") return v>=0.75?"🟢 Sangat baik":v>=0.65?"🟡 Baik":v>=0.5?"🟠 Memuaskan":"🔴 Tidak memuaskan";
if(t==="kge") return v>=0.75?"🟢 Sangat baik":v>=0.5?"🟡 Baik":"🔴 Perlu koreksi";
if(t==="pbias") return Math.abs(v)&lt;=10?"🟢 Sangat baik":Math.abs(v)&lt;=15?"🟡 Baik":Math.abs(v)&lt;=25?"🟠 Memuaskan":"🔴 Tidak memuaskan";
return "—";
}
// Init Plotly
Plotly.newPlot('plot-hidrograf', [
{x:bln,y:obs,name:'Observasi',type:'scatter',mode:'lines',
fill:'tozeroy',fillcolor:'rgba(21,101,192,0.12)',
line:{color:'#1565C0',width:2},hovertemplate:'%{x}&lt;br>Observasi: &lt;b>%{y} mm&lt;/b>&lt;extra>&lt;/extra>'},
{x:bln,y:imerg,name:'GPM IMERG',type:'scatter',mode:'lines',
line:{color:'#C62828',width:2,dash:'dash'},hovertemplate:'%{x}&lt;br>GPM IMERG: &lt;b>%{y} mm&lt;/b>&lt;extra>&lt;/extra>'}
], {
margin:{t:10,b:50,l:52,r:10},
yaxis:{title:'mm/bulan',gridcolor:'#eee'},
xaxis:{tickangle:-45,tickfont:{size:9}},
legend:{orientation:'h',y:-0.3},
paper_bgcolor:'rgba(0,0,0,0)', plot_bgcolor:'rgba(0,0,0,0)',
font:{size:11}
}, {displayModeBar:false,responsive:true});
function update(bias) {
var sim = imerg.map(function(v){return Math.round(v*bias*10)/10;});
// Plotly.react: update seluruh data chart - lebih reliable dari restyle
Plotly.react('plot-hidrograf', [
{x:bln,y:obs,name:'Observasi',type:'scatter',mode:'lines',
fill:'tozeroy',fillcolor:'rgba(21,101,192,0.12)',
line:{color:'#1565C0',width:2},
hovertemplate:'%{x}&lt;br>Observasi: &lt;b>%{y} mm&lt;/b>&lt;extra>&lt;/extra>'},
{x:bln,y:sim,name:'GPM IMERG',type:'scatter',mode:'lines',
line:{color:'#C62828',width:2,dash:'dash'},
hovertemplate:'%{x}&lt;br>GPM IMERG: &lt;b>%{y} mm&lt;/b>&lt;extra>&lt;/extra>'}
], {
margin:{t:10,b:50,l:52,r:10},
yaxis:{title:'mm/bulan',gridcolor:'#eee'},
xaxis:{tickangle:-45,tickfont:{size:9}},
legend:{orientation:'h',y:-0.3},
paper_bgcolor:'rgba(0,0,0,0)', plot_bgcolor:'rgba(0,0,0,0)',
font:{size:11}
}, {displayModeBar:false,responsive:true});
var m = hitung(sim);
document.getElementById('val-nse').textContent = m.nse.toFixed(3);
document.getElementById('val-kge').textContent = m.kge.toFixed(3);
document.getElementById('val-pbias').textContent = m.pbias.toFixed(1);
document.getElementById('val-rmse').textContent = m.rmse.toFixed(1);
document.getElementById('sta-nse').textContent = sta(m.nse,'nse');
document.getElementById('sta-kge').textContent = sta(m.kge,'kge');
document.getElementById('sta-pbias').textContent = sta(m.pbias,'pbias');
}
update(1.0);
document.getElementById('bias-slider').addEventListener('input',function(){
var b=parseFloat(this.value);
document.getElementById('bias-label').textContent=b.toFixed(2)+'×';
update(b);
});
})();
&lt;/script>
&lt;hr>
&lt;h2 id="kesimpulan">Kesimpulan&lt;/h2>
&lt;ol>
&lt;li>Kerapatan pos hujan Indonesia tidak merata — Kalimantan dan Papua jauh di bawah standar WMO&lt;/li>
&lt;li>GPM IMERG Final Run merupakan alternatif andal untuk DAS tanpa pos hujan memadai&lt;/li>
&lt;li>Validasi dengan NSE, KGE, dan PBIAS wajib dilakukan sebelum digunakan dalam pemodelan&lt;/li>
&lt;li>Koreksi bias disarankan jika |PBIAS| &amp;gt; 15%&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>Referensi:&lt;/strong> Moriasi et al. (2007) · Huffman et al. (2020) · WMO (2008)&lt;/p></description></item><item><title>Kalibrasi Data GPM dengan Data BMKG</title><link>https://www.irpanchumaedi.com/post/materi-kalibrasi-data-gpm-bmkg/</link><pubDate>Thu, 01 Feb 2024 00:00:00 +0000</pubDate><guid>https://www.irpanchumaedi.com/post/materi-kalibrasi-data-gpm-bmkg/</guid><description>
&lt;style>
.materi-kalibrasi {
--navy:#0A2342; --blue:#185fa5; --blue-mid:#378add; --blue-light:#85b7eb; --blue-pale:#e6f1fb;
--red:#B91C1C; --red-light:#fee2e2; --navy2:#1A5276;
--amber:#B45309; --amber-light:#fef3c7;
--purple:#6D28D9; --purple-light:#ede9fe;
--green:#1d6f42; --green-light:#d1fae5;
--gray-100:#f8fafc; --gray-200:#e2e8f0; --gray-300:#cbd5e1;
--gray-500:#64748b; --gray-600:#475569; --gray-700:#334155; --gray-900:#0f172a;
--radius:10px; --radius-sm:6px;
--shadow:0 2px 12px rgba(0,0,0,0.07);
--shadow-md:0 4px 20px rgba(0,0,0,0.10);
--code-bg:#1e1e2e;
}
.materi-kalibrasi, .materi-kalibrasi *::before, .materi-kalibrasi *::after {box-sizing:border-box;margin:0;padding:0;}
/.materi-kalibrasi * STICKY NAV */
.sticky-nav {position:sticky;top:0;z-index:200;background:#fff;border-bottom:1px solid var(--gray-200);box-shadow:var(--shadow);}
.materi-kalibrasi .sticky-inner {max-width:900px;margin:0 auto;padding:0 1.25rem;display:flex;align-items:center;gap:1rem;height:52px;}
.materi-kalibrasi .sticky-title {font-size:13px;font-weight:600;color:var(--navy);white-space:nowrap;}
.materi-kalibrasi .progress-track {flex:1;height:4px;background:var(--gray-200);border-radius:2px;}
.materi-kalibrasi .progress-fill {height:100%;background:linear-gradient(90deg,var(--blue),var(--purple));border-radius:2px;width:0%;transition:width 0.3s;}
.materi-kalibrasi .sticky-pct {font-size:12px;color:var(--gray-500);min-width:32px;}
/.materi-kalibrasi * FLOATING TOC */
.toc-float {position:fixed;top:80px;right:0;width:180px;background:#fff;border:1px solid var(--gray-200);border-right:none;border-radius:var(--radius) 0 0 var(--radius);box-shadow:-2px 4px 16px rgba(0,0,0,0.09);z-index:150;transition:all 0.28s cubic-bezier(0.4,0,0.2,1);overflow:hidden;}
.materi-kalibrasi .toc-float.collapsed {width:32px;}
.materi-kalibrasi .toc-head {display:flex;align-items:center;justify-content:space-between;padding:8px 10px 8px 12px;border-bottom:1px solid var(--gray-200);cursor:pointer;user-select:none;background:var(--navy);border-radius:var(--radius) 0 0 0;}
.materi-kalibrasi .toc-head:hover {background:#1a3a5c;}
.materi-kalibrasi .toc-title {font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:0.07em;color:rgba(255,255,255,0.9);white-space:nowrap;overflow:hidden;}
.materi-kalibrasi .toc-chevron {font-size:11px;color:rgba(255,255,255,0.7);flex-shrink:0;transition:transform 0.25s;margin-left:6px;}
.materi-kalibrasi .toc-float.collapsed .toc-chevron {transform:rotate(180deg);}
.materi-kalibrasi .toc-float.collapsed .toc-title {opacity:0;width:0;margin:0;}
.materi-kalibrasi .toc-body {padding:8px 6px;max-height:calc(100vh - 140px);overflow-y:auto;scrollbar-width:thin;scrollbar-color:var(--gray-300) transparent;}
.materi-kalibrasi .toc-body::-webkit-scrollbar {width:3px;}
.materi-kalibrasi .toc-body::-webkit-scrollbar-thumb {background:var(--gray-300);border-radius:2px;}
.materi-kalibrasi .toc-float.collapsed .toc-body {display:none;}
.materi-kalibrasi .toc-link {display:block;font-size:11px;color:var(--gray-600);text-decoration:none;padding:3px 8px;border-radius:4px;border-left:2px solid transparent;margin-bottom:1px;transition:all 0.15s;line-height:1.4;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.materi-kalibrasi .toc-link:hover {background:var(--blue-pale);color:var(--blue);border-left-color:var(--blue);}
.materi-kalibrasi .toc-link.active {background:var(--blue-pale);color:var(--blue);border-left-color:var(--blue);font-weight:600;}
.materi-kalibrasi .toc-link.sub {padding-left:14px;font-size:10px;color:var(--gray-500);}
.materi-kalibrasi .toc-link.sub.active {color:var(--blue);}
.materi-kalibrasi .toc-toggle {display:none;position:fixed;bottom:20px;right:16px;width:40px;height:40px;border-radius:50%;background:var(--navy);color:#fff;border:none;font-size:16px;cursor:pointer;box-shadow:var(--shadow-md);z-index:160;align-items:center;justify-content:center;}
@.materi-kalibrasi media(max-width:1100px) {.toc-float{display:none;}.materi-kalibrasi .toc-toggle {display:flex;}.materi-kalibrasi }
/* HERO */
.hero {background:linear-gradient(135deg,#0A2342 0%,#1A3a5c 55%,#2d1065 100%);color:#fff;padding:3rem 1.5rem 2.5rem;border-radius:0 0 var(--radius) var(--radius);margin-bottom:2rem;position:relative;overflow:hidden;}
.materi-kalibrasi .hero::before {content:'';position:absolute;top:-80px;right:-60px;width:300px;height:300px;border-radius:50%;background:rgba(55,138,221,0.12);}
.materi-kalibrasi .hero::after {content:'';position:absolute;bottom:-100px;left:10%;width:250px;height:250px;border-radius:50%;background:rgba(109,40,217,0.10);}
.materi-kalibrasi .hero-inner {max-width:900px;margin:0 auto;position:relative;z-index:1;}
.materi-kalibrasi .hero-badge {display:inline-block;background:rgba(55,138,221,0.25);color:#85b7eb;font-size:11px;padding:3px 10px;border-radius:20px;margin-bottom:0.75rem;letter-spacing:0.04em;}
.materi-kalibrasi .hero h1 {font-size:clamp(22px,4vw,30px);font-weight:700;line-height:1.3;margin-bottom:0.5rem;}
.materi-kalibrasi .hero-sub {font-size:14px;color:rgba(255,255,255,0.65);margin-bottom:1.5rem;}
.materi-kalibrasi .hero-pills {display:flex;flex-wrap:wrap;gap:8px;margin-top:1rem;}
.materi-kalibrasi .hero-pill {display:inline-block;font-size:11px;padding:4px 10px;border-radius:20px;font-weight:600;border:1px solid;}
.materi-kalibrasi .pill-red {background:rgba(185,28,28,0.25);color:#fca5a5;border-color:rgba(185,28,28,0.4);}
.materi-kalibrasi .pill-blue {background:rgba(26,82,118,0.3);color:#85b7eb;border-color:rgba(26,82,118,0.5);}
.materi-kalibrasi .pill-amber {background:rgba(180,83,9,0.25);color:#fcd34d;border-color:rgba(180,83,9,0.4);}
.materi-kalibrasi .pill-purple {background:rgba(109,40,217,0.25);color:#c4b5fd;border-color:rgba(109,40,217,0.4);}
.materi-kalibrasi .hero-meta {display:flex;flex-wrap:wrap;gap:1.25rem;margin-top:1rem;}
.materi-kalibrasi .hero-meta-item {font-size:12px;color:rgba(255,255,255,0.55);}
/.materi-kalibrasi * LAYOUT */
.wrap {max-width:900px;margin:0 auto;padding:0 1.25rem 4rem;}
/.materi-kalibrasi * SECTIONS */
.section {margin-bottom:3rem;}
.materi-kalibrasi .section-header {display:flex;align-items:center;gap:12px;margin-bottom:1.25rem;}
.materi-kalibrasi .section-num {width:32px;height:32px;border-radius:50%;background:var(--navy);color:#fff;font-size:13px;font-weight:600;display:flex;align-items:center;justify-content:center;flex-shrink:0;}
.materi-kalibrasi .section-header h2 {font-size:20px;font-weight:700;color:var(--gray-900);}
/.materi-kalibrasi * CARDS */
.card {background:#fff;border-radius:var(--radius);padding:1.25rem 1.5rem;box-shadow:var(--shadow);margin-bottom:1rem;}
.materi-kalibrasi .card-navy {border-left:4px solid var(--navy);}
.materi-kalibrasi .card-blue {border-left:4px solid var(--blue-mid);}
.materi-kalibrasi .card-red {border-left:4px solid var(--red);}
.materi-kalibrasi .card-amber {border-left:4px solid var(--amber);}
.materi-kalibrasi .card-green {border-left:4px solid var(--green);}
.materi-kalibrasi .card-purple {border-left:4px solid var(--purple);}
.materi-kalibrasi .card-label {font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:0.07em;color:var(--gray-500);margin-bottom:6px;}
.materi-kalibrasi .card p {font-size:13px;color:var(--gray-600);line-height:1.65;}
/.materi-kalibrasi * GRID */
.grid-2 {display:grid;grid-template-columns:1fr 1fr;gap:1rem;margin-bottom:1rem;}
.materi-kalibrasi .grid-3 {display:grid;grid-template-columns:1fr 1fr 1fr;gap:1rem;margin-bottom:1rem;}
.materi-kalibrasi .grid-4 {display:grid;grid-template-columns:repeat(4,1fr);gap:1rem;margin-bottom:1.5rem;}
@.materi-kalibrasi media(max-width:640px) {.grid-2,.grid-3,.grid-4{grid-template-columns:1fr;}.materi-kalibrasi }
/* METRIC CARDS */
.metric-card {background:#fff;border-radius:var(--radius);padding:1rem 1.1rem;box-shadow:var(--shadow);text-align:center;position:relative;overflow:hidden;}
.materi-kalibrasi .metric-card::before {content:'';position:absolute;top:0;left:0;right:0;height:3px;}
.materi-kalibrasi .metric-card.red::before {background:var(--red);}
.materi-kalibrasi .metric-card.blue::before {background:var(--navy2);}
.materi-kalibrasi .metric-card.green::before {background:var(--green);}
.materi-kalibrasi .metric-card.amber::before {background:var(--amber);}
.materi-kalibrasi .metric-label {font-size:11px;color:var(--gray-500);font-weight:600;margin-bottom:4px;}
.materi-kalibrasi .metric-raw {font-size:14px;font-weight:700;color:var(--red);}
.materi-kalibrasi .metric-m4 {font-size:14px;font-weight:700;color:var(--navy2);}
.materi-kalibrasi .metric-arrow {font-size:11px;color:var(--green);margin:3px 0;}
.materi-kalibrasi .metric-thresh {font-size:10px;color:var(--gray-500);}
/.materi-kalibrasi * INFO BOXES */
.info-box {display:flex;gap:10px;background:var(--blue-pale);border:1px solid #b5d4f4;border-radius:var(--radius-sm);padding:.9rem 1rem;font-size:13px;color:#0c447c;margin:1rem 0;line-height:1.55;}
.materi-kalibrasi .warn-box {display:flex;gap:10px;background:var(--amber-light);border:1px solid #fac775;border-radius:var(--radius-sm);padding:.9rem 1rem;font-size:13px;color:var(--amber);margin:1rem 0;line-height:1.55;}
.materi-kalibrasi .success-box {display:flex;gap:10px;background:var(--green-light);border:1px solid #a7f3d0;border-radius:var(--radius-sm);padding:.9rem 1rem;font-size:13px;color:var(--green);margin:1rem 0;line-height:1.55;}
.materi-kalibrasi .purple-box {display:flex;gap:10px;background:var(--purple-light);border:1px solid #c4b5fd;border-radius:var(--radius-sm);padding:.9rem 1rem;font-size:13px;color:var(--purple);margin:1rem 0;line-height:1.55;}
.materi-kalibrasi .box-icon {font-size:18px;flex-shrink:0;line-height:1.3;}
/.materi-kalibrasi * FORMULA */
.formula-block {background:#0f172a;border-radius:var(--radius-sm);padding:1rem 1.25rem;margin:.75rem 0;font-family:'Consolas','Courier New',monospace;font-size:14px;color:#e2e8f0;text-align:center;letter-spacing:0.02em;border-left:4px solid var(--purple);}
.materi-kalibrasi .formula-block .eq-label {font-size:11px;color:#94a3b8;display:block;margin-bottom:4px;text-align:left;}
.materi-kalibrasi .formula-block .eq-main {color:#c4b5fd;font-size:15px;}
.materi-kalibrasi .formula-block .eq-desc {font-size:11px;color:#64748b;display:block;margin-top:6px;text-align:left;}
/.materi-kalibrasi * STEP FLOW */
.step-flow {margin:1rem 0;}
.materi-kalibrasi .step-item {display:flex;gap:14px;}
.materi-kalibrasi .step-line {display:flex;flex-direction:column;align-items:center;}
.materi-kalibrasi .step-dot {width:30px;height:30px;border-radius:50%;background:var(--blue-mid);color:#fff;font-size:12px;font-weight:600;display:flex;align-items:center;justify-content:center;flex-shrink:0;}
.materi-kalibrasi .step-dot.navy {background:var(--navy);}
.materi-kalibrasi .step-dot.purple {background:var(--purple);}
.materi-kalibrasi .step-connector {width:2px;background:var(--gray-200);flex:1;min-height:16px;margin:3px 0;}
.materi-kalibrasi .step-body {padding-bottom:20px;flex:1;}
.materi-kalibrasi .step-title {font-size:14px;font-weight:600;color:var(--gray-800);margin-bottom:4px;}
.materi-kalibrasi .step-desc {font-size:13px;color:var(--gray-600);line-height:1.6;}
/.materi-kalibrasi * CODE */
.code-wrap {background:var(--code-bg);border-radius:var(--radius-sm);overflow:hidden;margin:.75rem 0;box-shadow:var(--shadow-md);}
.materi-kalibrasi .code-header {background:#2a2a3e;padding:7px 14px;display:flex;align-items:center;justify-content:space-between;}
.materi-kalibrasi .code-lang {font-size:11px;color:#a0aec0;font-weight:600;letter-spacing:0.05em;display:flex;align-items:center;gap:6px;}
.materi-kalibrasi .code-lang .dot {width:8px;height:8px;border-radius:50%;}
.materi-kalibrasi .copy-btn {font-size:11px;color:#a0aec0;cursor:pointer;background:none;border:none;padding:2px 8px;border-radius:4px;transition:all 0.2s;}
.materi-kalibrasi .copy-btn:hover {background:rgba(255,255,255,0.1);color:#fff;}
.materi-kalibrasi pre {padding:1rem 1.25rem;overflow-x:auto;font-family:'Consolas','Courier New',monospace;font-size:12.5px;line-height:1.75;color:#cdd6f4;}
.materi-kalibrasi pre::-webkit-scrollbar {height:4px;}
.materi-kalibrasi pre::-webkit-scrollbar-thumb {background:#4a4a6a;border-radius:2px;}
.materi-kalibrasi .kw {color:#cba6f7;}.materi-kalibrasi .fn {color:#89b4fa;}.materi-kalibrasi .str {color:#a6e3a1;}.materi-kalibrasi .num {color:#fab387;}.materi-kalibrasi .cm {color:#6c7086;font-style:italic;}.materi-kalibrasi .op {color:#89dceb;}.materi-kalibrasi .pkg {color:#f38ba8;}
/.materi-kalibrasi * IMAGE FIGURE */
.fig-wrap {background:#fff;border-radius:var(--radius);box-shadow:var(--shadow-md);overflow:hidden;margin-bottom:1.5rem;}
.materi-kalibrasi .fig-header {background:var(--gray-100);padding:8px 14px;font-size:11px;font-weight:600;color:var(--gray-500);border-bottom:1px solid var(--gray-200);display:flex;align-items:center;gap:6px;}
.materi-kalibrasi .fig-img {width:100%;display:block;}
.materi-kalibrasi .fig-caption {padding:8px 14px;font-size:12px;color:var(--gray-500);border-top:1px solid var(--gray-200);font-style:italic;}
/.materi-kalibrasi * TABLE */
.tbl-wrap {overflow-x:auto;margin-bottom:1rem;}
.materi-kalibrasi .data-tbl {width:100%;border-collapse:collapse;font-size:13px;min-width:400px;}
.materi-kalibrasi .data-tbl th {background:var(--navy);color:#fff;padding:8px 12px;text-align:center;font-weight:600;font-size:12px;}
.materi-kalibrasi .data-tbl td {padding:6px 12px;border-bottom:1px solid var(--gray-200);text-align:right;font-family:'Consolas',monospace;font-size:12px;}
.materi-kalibrasi .data-tbl td:first-child {text-align:center;font-family:inherit;font-weight:600;color:var(--gray-700);}
.materi-kalibrasi .data-tbl tr:hover td {background:var(--blue-pale);}
.materi-kalibrasi .data-tbl .pos {color:var(--red);font-weight:700;}
.materi-kalibrasi .data-tbl .neg {color:var(--navy2);}
.materi-kalibrasi .data-tbl .good {color:var(--green);font-weight:700;}
.materi-kalibrasi .data-tbl .bad {color:var(--red);}
.materi-kalibrasi .data-tbl .head-raw {background:var(--red)!important;}
.materi-kalibrasi .data-tbl .head-m4 {background:var(--navy2)!important;}
.materi-kalibrasi .data-tbl .head-obs {background:var(--amber)!important;}
.materi-kalibrasi .data-tbl .head-fk {background:var(--purple)!important;}
/.materi-kalibrasi * CHART */
.chart-card {background:#fff;border-radius:var(--radius);padding:1.25rem 1.5rem 1rem;box-shadow:var(--shadow);margin-bottom:1.25rem;}
.materi-kalibrasi .chart-title {font-size:13px;font-weight:600;color:var(--gray-700);margin-bottom:2px;}
.materi-kalibrasi .chart-sub {font-size:11px;color:var(--gray-400);margin-bottom:1rem;}
.materi-kalibrasi .chart-wrap {position:relative;width:100%;}
.materi-kalibrasi .legend-row {display:flex;flex-wrap:wrap;gap:12px;margin-top:10px;font-size:11px;color:var(--gray-500);}
.materi-kalibrasi .legend-item {display:flex;align-items:center;gap:5px;}
.materi-kalibrasi .legend-sq {width:10px;height:10px;border-radius:2px;flex-shrink:0;}
/.materi-kalibrasi * COMPARISON TABLE */
.compare-tbl {width:100%;border-collapse:collapse;margin-bottom:1rem;}
.materi-kalibrasi .compare-tbl th {padding:10px 14px;font-size:12px;font-weight:600;text-align:center;}
.materi-kalibrasi .compare-tbl td {padding:9px 14px;border-bottom:1px solid var(--gray-200);font-size:13px;}
.materi-kalibrasi .compare-tbl .metric-name {font-weight:600;color:var(--gray-700);background:var(--gray-100);}
.materi-kalibrasi .compare-tbl .val-raw {color:var(--red);font-weight:600;text-align:center;font-family:monospace;}
.materi-kalibrasi .compare-tbl .val-m4 {color:var(--navy2);font-weight:700;text-align:center;font-family:monospace;}
.materi-kalibrasi .compare-tbl .thresh {color:var(--gray-500);text-align:center;font-size:12px;}
.materi-kalibrasi .compare-tbl .status-good {color:var(--green);font-weight:700;text-align:center;}
.materi-kalibrasi .compare-tbl .status-bad {color:var(--red);text-align:center;}
.materi-kalibrasi .compare-tbl thead th:nth-child(2) {background:rgba(185,28,28,0.1);color:var(--red);}
.materi-kalibrasi .compare-tbl thead th:nth-child(3) {background:rgba(26,82,118,0.1);color:var(--navy2);}
/.materi-kalibrasi * TAG */
.tag {display:inline-block;font-size:11px;padding:3px 10px;border-radius:20px;margin:2px;font-weight:500;}
.materi-kalibrasi .tag-blue {background:var(--blue-pale);color:#0c447c;}
.materi-kalibrasi .tag-red {background:var(--red-light);color:var(--red);}
.materi-kalibrasi .tag-purple {background:var(--purple-light);color:var(--purple);}
.materi-kalibrasi .tag-green {background:var(--green-light);color:var(--green);}
.materi-kalibrasi .tag-amber {background:var(--amber-light);color:var(--amber);}
/.materi-kalibrasi * DIVIDER */
.divider {height:1px;background:var(--gray-200);margin:2.5rem 0;}
/.materi-kalibrasi * ANIMATE */
@keyframes fadeUp {from{opacity:0;transform:translateY(16px);}.materi-kalibrasi to {opacity:1;transform:translateY(0);}.materi-kalibrasi }
.anim-in {opacity:1;}
.materi-kalibrasi .anim-in.visible {animation:fadeUp 0.45s ease both;}
/* === LAYOUT FIX: integrasi Wowchemy === */
.materi-kalibrasi { box-sizing: border-box; width: 100%; overflow-x: hidden; }
.materi-kalibrasi * { box-sizing: border-box; }
.materi-kalibrasi .wrap, .materi-kalibrasi .section { max-width: 100%; }
/* === DARK MODE === */
body.dark .materi-kalibrasi { color:#8e94b5; }
/* Heading &amp; teks utama */
body.dark .materi-kalibrasi h1,
body.dark .materi-kalibrasi h2,
body.dark .materi-kalibrasi h3,
body.dark .materi-kalibrasi h4 { color:#e8eaf6 !important; }
body.dark .materi-kalibrasi p { color:#8e94b5; }
body.dark .materi-kalibrasi strong { color:#e8eaf6; }
body.dark .materi-kalibrasi li { color:#8e94b5; }
/* Section header */
body.dark .materi-kalibrasi .section-header { border-color:#343858; }
body.dark .materi-kalibrasi .section-header h2 { color:#e8eaf6 !important; }
body.dark .materi-kalibrasi .section-num {
background:#1e3a6e !important;
color:#5b8fff !important;
border-color:#2a4a8e !important;
}
body.dark .materi-kalibrasi .subsection h3 { color:#c8ccdf !important; }
/* Cards — background &amp; border */
body.dark .materi-kalibrasi [class*="card"],
body.dark .materi-kalibrasi .card,
body.dark .materi-kalibrasi .metric-card {
background:#222638 !important;
border-color:#343858 !important;
box-shadow: 0 2px 12px rgba(0,0,0,0.3) !important;
}
/* Card teks — SEMUA varian label &amp; nilai */
body.dark .materi-kalibrasi .card-label,
body.dark .materi-kalibrasi .metric-label,
body.dark .materi-kalibrasi .metric-sub {
color:#8e94b5 !important;
}
body.dark .materi-kalibrasi .card p,
body.dark .materi-kalibrasi .card-body {
color:#8e94b5 !important;
}
body.dark .materi-kalibrasi .metric-val {
/* warna nilai (biru/amber/dll) tetap — biarkan dari CSS asli */
filter: brightness(1.2);
}
/* Teks dengan var gray-* — override via CSS variable remapping */
body.dark .materi-kalibrasi {
--gray-100:#1b1d27;
--gray-200:#222638;
--gray-300:#2a2e42;
--gray-500:#8e94b5;
--gray-600:#a0a8cc;
--gray-700:#c8ccdf;
--gray-900:#e8eaf6;
--navy:#e8eaf6;
--navy2:#c8ccdf;
--blue:#5b8fff;
--blue-mid:#7aa5ff;
--blue-pale:#1e2a42;
--red:#e05a5a;
--red-light:#2d1515;
--amber:#f4a642;
--amber-light:#2d2010;
--purple:#9d7cf8;
--purple-light:#1e1530;
--green:#3ecf8e;
--green-light:#0d2418;
--shadow: 0 2px 12px rgba(0,0,0,0.35);
--shadow-md: 0 4px 20px rgba(0,0,0,0.45);
--code-bg:#12151f;
}
/* Table */
body.dark .materi-kalibrasi table { border-color:#343858; }
body.dark .materi-kalibrasi th {
background:#2a2e42 !important;
color:#8e94b5 !important;
border-color:#343858 !important;
}
body.dark .materi-kalibrasi td {
border-color:#343858 !important;
color:#8e94b5 !important;
}
body.dark .materi-kalibrasi tr:nth-child(even) { background:#1e2235 !important; }
body.dark .materi-kalibrasi tr:hover td { background:#252840 !important; }
/* Code */
body.dark .materi-kalibrasi code,
body.dark .materi-kalibrasi pre {
background:#12151f !important;
color:#a8b4ff !important;
}
/* Form inputs */
body.dark .materi-kalibrasi select,
body.dark .materi-kalibrasi input[type=number],
body.dark .materi-kalibrasi input[type=text] {
background:#2a2e42 !important;
border-color:#343858 !important;
color:#e8eaf6 !important;
}
/* Result/output boxes */
body.dark .materi-kalibrasi [class*="result"],
body.dark .materi-kalibrasi [id*="result"],
body.dark .materi-kalibrasi [class*="output"],
body.dark .materi-kalibrasi [id*="output"] {
background:#222638 !important;
border-color:#343858 !important;
color:#8e94b5 !important;
}
/* Grid boxes */
body.dark .materi-kalibrasi .grid-2>*,
body.dark .materi-kalibrasi .grid-3>*,
body.dark .materi-kalibrasi .grid-4>* {
background:#222638 !important;
border-color:#343858 !important;
}
/* Info/alert boxes */
body.dark .materi-kalibrasi [class*="info-"],
body.dark .materi-kalibrasi [class*="alert-"],
body.dark .materi-kalibrasi [class*="note-"] {
background:#1e2235 !important;
border-color:#343858 !important;
color:#8e94b5 !important;
}
/* Links */
body.dark .materi-kalibrasi a { color:#5b8fff; }
body.dark .materi-kalibrasi hr { border-color:#343858; }
/* Fix teks inline style hardcoded */
body.dark .materi-kalibrasi [style*="color:#0f172a"],
body.dark .materi-kalibrasi [style*="color:#1e293b"],
body.dark .materi-kalibrasi [style*="color:#334155"],
body.dark .materi-kalibrasi [style*="color:#475569"] {
color:#e8eaf6 !important;
}
body.dark .materi-kalibrasi [style*="background:#fff"],
body.dark .materi-kalibrasi [style*="background:#f4f6f9"],
body.dark .materi-kalibrasi [style*="background:#f8fafc"],
body.dark .materi-kalibrasi [style*="background:#f1f5f9"] {
background:#222638 !important;
}
&lt;/style>
&lt;script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/4.4.1/chart.umd.js">&lt;/script>
&lt;div class="materi-kalibrasi">
&lt;!-- ===== S1: LATAR BELAKANG ===== -->
&lt;section class="section anim-in" id="s1">
&lt;div class="section-header">&lt;div class="section-num">1&lt;/div>&lt;h2>Latar Belakang&lt;/h2>&lt;/div>
&lt;div class="card card-navy">
&lt;div class="card-label">Masalah Utama&lt;/div>
&lt;p>GPM IMERG adalah produk curah hujan satelit presisi tinggi dari NASA dengan resolusi 0.1° × 0.1° dan temporal 30 menit. Namun dalam analisis hidrologi — khususnya untuk menentukan &lt;strong>Hujan Harian Maksimum Tahunan (HHMT)&lt;/strong> sebagai input desain bangunan air — data mentah (raw) GPM sering menunjukkan &lt;strong>bias sistematis negatif yang signifikan&lt;/strong> dibandingkan observasi BMKG di lapangan.&lt;/p>
&lt;/div>
&lt;div class="grid-2">
&lt;div class="card card-red">
&lt;div class="card-label">⚠️ GPM Raw — Masalah&lt;/div>
&lt;p>PBIAS = &lt;strong>−31.9%&lt;/strong> artinya GPM Raw secara rata-rata &lt;em>meremehkan&lt;/em> curah hujan sebesar hampir sepertiga dari nilai sesungguhnya. NSE = −1.06 menunjukkan model bahkan lebih buruk dari sekedar menggunakan nilai rata-rata — tidak layak digunakan langsung untuk desain hidrologi.&lt;/p>
&lt;/div>
&lt;div class="card card-blue">
&lt;div class="card-label">✅ GPM M4 — Solusi&lt;/div>
&lt;p>Setelah kalibrasi dengan metode &lt;strong>Year-Specific Scaling Factor (M4)&lt;/strong>, PBIAS turun menjadi &lt;strong>+3.5%&lt;/strong> — hampir tidak ada bias. NSE meningkat ke 0.77 dan KGE ke 0.88, keduanya masuk kategori &lt;em>Sangat Baik&lt;/em> menurut SNI 2415:2016.&lt;/p>
&lt;/div>
&lt;/div>
&lt;div class="grid-4">
&lt;div class="metric-card red">
&lt;div class="metric-label">PBIAS&lt;/div>
&lt;div class="metric-raw">−31.9%&lt;/div>
&lt;div class="metric-arrow">↓ 91%&lt;/div>
&lt;div class="metric-m4">+3.5%&lt;/div>
&lt;div class="metric-thresh">Threshold: &amp;lt;10%&lt;/div>
&lt;/div>
&lt;div class="metric-card blue">
&lt;div class="metric-label">NSE&lt;/div>
&lt;div class="metric-raw">−1.062&lt;/div>
&lt;div class="metric-arrow">↑ 172%&lt;/div>
&lt;div class="metric-m4">0.772&lt;/div>
&lt;div class="metric-thresh">Threshold: ≥0.75&lt;/div>
&lt;/div>
&lt;div class="metric-card green">
&lt;div class="metric-label">KGE&lt;/div>
&lt;div class="metric-raw">0.206&lt;/div>
&lt;div class="metric-arrow">↑ 326%&lt;/div>
&lt;div class="metric-m4">0.879&lt;/div>
&lt;div class="metric-thresh">Threshold: ≥0.75&lt;/div>
&lt;/div>
&lt;div class="metric-card amber">
&lt;div class="metric-label">RMSE&lt;/div>
&lt;div class="metric-raw">47.4 mm&lt;/div>
&lt;div class="metric-arrow">↓ 67%&lt;/div>
&lt;div class="metric-m4">15.8 mm&lt;/div>
&lt;div class="metric-thresh">Semakin kecil&lt;/div>
&lt;/div>
&lt;/div>
&lt;div class="success-box">&lt;span class="box-icon">🎯&lt;/span>&lt;span>Kalibrasi dengan metode M4 berhasil mengubah data GPM yang &lt;em>tidak layak pakai&lt;/em> menjadi data yang masuk kategori &lt;strong>Sangat Baik (SB)&lt;/strong> untuk semua metrik validasi menurut Moriasi et al. (2007) dan SNI 2415:2016.&lt;/span>&lt;/div>
&lt;/section>
&lt;div class="divider">&lt;/div>
&lt;!-- ===== S2: DATA &amp; WILAYAH ===== -->
&lt;section class="section anim-in" id="s2">
&lt;div class="section-header">&lt;div class="section-num">2&lt;/div>&lt;h2>Data &amp;amp; Wilayah Studi&lt;/h2>&lt;/div>
&lt;div id="s2a">&lt;/div>
&lt;div class="card card-blue" style="margin-bottom:1rem;">
&lt;div class="card-label">🛰️ Piksel GPM B4 — Titik Referensi&lt;/div>
&lt;p>Analisis berfokus pada satu piksel GPM IMERG V07 yang merepresentasikan wilayah Kota Banjarmasin, yang selanjutnya disebut &lt;strong>Piksel B4&lt;/strong>.&lt;/p>
&lt;/div>
&lt;div class="grid-2">
&lt;div class="card">
&lt;div class="card-label">Koordinat Piksel B4&lt;/div>
&lt;p style="font-family:monospace;font-size:14px;color:var(--navy);">114.60°E, 3.30°S&lt;/p>
&lt;p style="margin-top:6px;">Bounding Box: 114.487–114.687°E, 3.197–3.397°S&lt;/p>
&lt;/div>
&lt;div class="card">
&lt;div class="card-label">Produk GPM&lt;/div>
&lt;p>&lt;strong>GPM IMERG V07 Final Run&lt;/strong> (NASA Giovanni)&lt;br>Resolusi: 0.1° × 0.1° · Temporal: Daily&lt;br>Variabel: Presipitasi harian (mm)&lt;/p>
&lt;/div>
&lt;/div>
&lt;div id="s2b">&lt;/div>
&lt;div class="card-label" style="font-size:11px;margin-bottom:10px;">🌧️ Stasiun Observasi BMKG (Ground Truth)&lt;/div>
&lt;div class="grid-2">
&lt;div class="card card-amber">
&lt;div class="card-label">Stasiun SY — Syamsuddin Noor&lt;/div>
&lt;p>&lt;strong>Lokasi:&lt;/strong> Banjarmasin, Kalimantan Selatan&lt;br>&lt;strong>Piksel GPM-nya:&lt;/strong> 114.80°E, 3.40°S&lt;br>&lt;strong>Periode:&lt;/strong> 1998–2025 (28 tahun)&lt;br>&lt;strong>Catatan:&lt;/strong> Tahun 2010 data = 0 mm (tidak valid, hanya BMKG Kalsel yang digunakan)&lt;/p>
&lt;/div>
&lt;div class="card card-amber">
&lt;div class="card-label">Stasiun KS — BMKG Kalsel (Banjarbaru)&lt;/div>
&lt;p>&lt;strong>Lokasi:&lt;/strong> Banjarbaru, Kalimantan Selatan&lt;br>&lt;strong>Piksel GPM-nya:&lt;/strong> 114.85°E, 3.45°S&lt;br>&lt;strong>Periode:&lt;/strong> 1998–2025 (28 tahun)&lt;br>&lt;strong>Catatan:&lt;/strong> Digunakan sebagai data pembanding &amp;amp; pengisi ketika SY tidak tersedia&lt;/p>
&lt;/div>
&lt;/div>
&lt;div id="s2c">&lt;/div>
&lt;div class="card-label" style="font-size:11px;margin-bottom:8px;">📊 Tabel Data Lengkap — HHMT 1998–2025&lt;/div>
&lt;div class="tbl-wrap">
&lt;table class="data-tbl">
&lt;thead>
&lt;tr>
&lt;th>Tahun&lt;/th>
&lt;th class="head-raw">GPM Raw (mm)&lt;/th>
&lt;th class="head-fk">Fk M4&lt;/th>
&lt;th class="head-m4">GPM M4 (mm)&lt;/th>
&lt;th class="head-obs">Obs BMKG (mm)&lt;/th>
&lt;th class="head-raw">Error Raw (mm)&lt;/th>
&lt;th class="head-m4">Error M4 (mm)&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody id="tblBody">&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;div class="info-box">&lt;span class="box-icon">ℹ️&lt;/span>&lt;span>HHMT = Hujan Harian Maksimum Tahunan. Error = GPM − Obs BMKG. Nilai negatif berarti GPM meremehkan observasi. Tahun 2010: data BMKG SY = 0 mm (tidak valid), Fk dihitung dari stasiun KS saja.&lt;/span>&lt;/div>
&lt;/section>
&lt;div class="divider">&lt;/div>
&lt;!-- ===== S3: METODE ===== -->
&lt;section class="section anim-in" id="s3">
&lt;div class="section-header">&lt;div class="section-num">3&lt;/div>&lt;h2>Metode Koreksi Bias M4&lt;/h2>&lt;/div>
&lt;p style="font-size:13px;color:var(--gray-600);margin-bottom:1.25rem;line-height:1.7;">Terdapat beberapa metode koreksi bias yang umum digunakan dalam hidrologi berbasis data satelit. Analisis ini membandingkan empat metode (M1–M4) dan memilih &lt;strong>M4: Year-Specific Scaling Factor&lt;/strong> sebagai yang terbaik.&lt;/p>
&lt;div id="s3a">&lt;/div>
&lt;div class="card" style="margin-bottom:1.25rem;">
&lt;div class="card-label" style="margin-bottom:10px;">Perbandingan 4 Metode Koreksi Bias&lt;/div>
&lt;div class="tbl-wrap">
&lt;table class="compare-tbl">
&lt;thead>
&lt;tr>
&lt;th style="text-align:left;background:var(--gray-100);color:var(--gray-700);">Metode&lt;/th>
&lt;th style="text-align:left;background:var(--gray-100);color:var(--gray-700);">Prinsip&lt;/th>
&lt;th style="background:var(--gray-100);color:var(--gray-700);">Keunggulan&lt;/th>
&lt;th style="background:var(--gray-100);color:var(--gray-700);">Keterbatasan&lt;/th>
&lt;th style="background:var(--gray-100);color:var(--gray-700);">Status&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td style="font-weight:700;color:var(--red);">M1 — CF Bulanan&lt;/td>
&lt;td style="font-size:12px;color:var(--gray-600);">GPM × faktor koreksi per bulan HHMT&lt;/td>
&lt;td style="font-size:12px;text-align:center;">Mempertimbangkan musim&lt;/td>
&lt;td style="font-size:12px;text-align:center;">CF dihitung hanya dari 1 stasiun&lt;/td>
&lt;td style="text-align:center;">&lt;span class="tag tag-amber">Cukup Baik&lt;/span>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="font-weight:700;color:var(--amber);">M2 — Direct Scaling&lt;/td>
&lt;td style="font-size:12px;color:var(--gray-600);">GPM × (rerata Obs / rerata GPM) global&lt;/td>
&lt;td style="font-size:12px;text-align:center;">Sangat sederhana&lt;/td>
&lt;td style="font-size:12px;text-align:center;">Satu faktor untuk semua tahun&lt;/td>
&lt;td style="text-align:center;">&lt;span class="tag tag-amber">Cukup Baik&lt;/span>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td style="font-weight:700;color:var(--purple);">M3 — Quantile Mapping&lt;/td>
&lt;td style="font-size:12px;color:var(--gray-600);">Rank-to-rank GPM vs Obs (CDF matching)&lt;/td>
&lt;td style="font-size:12px;text-align:center;">Koreksi distribusi penuh&lt;/td>
&lt;td style="font-size:12px;text-align:center;">Butuh data lebih banyak; asumsi stasioner&lt;/td>
&lt;td style="text-align:center;">&lt;span class="tag tag-blue">Baik&lt;/span>&lt;/td>
&lt;/tr>
&lt;tr style="background:rgba(26,82,118,0.04);">
&lt;td style="font-weight:700;color:var(--navy2);">M4 — Year-Specific ✅&lt;/td>
&lt;td style="font-size:12px;color:var(--gray-600);">GPM × Fk per tahun dari semua stasiun tersedia&lt;/td>
&lt;td style="font-size:12px;text-align:center;font-weight:600;color:var(--green);">Fk unik tiap tahun, multi-stasiun&lt;/td>
&lt;td style="font-size:12px;text-align:center;">Butuh data BMKG per tahun&lt;/td>
&lt;td style="text-align:center;">&lt;span class="tag tag-green">🏆 Terbaik&lt;/span>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;/div>
&lt;div id="s3b">&lt;/div>
&lt;div class="card card-purple">
&lt;div class="card-label">Formula Inti — Metode M4&lt;/div>
&lt;/div>
&lt;div class="formula-block">
&lt;span class="eq-label">Langkah 1: Faktor Koreksi per Stasiun per Tahun&lt;/span>
&lt;span class="eq-main">Fk_SY = HHMT_Ground_SY / HHMT_GPM_B4&lt;/span>
&lt;/div>
&lt;div class="formula-block">
&lt;span class="eq-label">Langkah 2: Fk Akhir = Rata-rata dari semua stasiun tersedia&lt;/span>
&lt;span class="eq-main">Fk = mean(Fk_SY, Fk_KS)&lt;/span>
&lt;span class="eq-desc">Jika hanya satu stasiun tersedia (mis. 2010): Fk = Fk dari stasiun yang ada&lt;/span>
&lt;/div>
&lt;div class="formula-block">
&lt;span class="eq-label">Langkah 3: GPM Terkoreksi&lt;/span>
&lt;span class="eq-main">GPM_M4 = GPM_Raw_B4 × Fk&lt;/span>
&lt;span class="eq-desc">Hasil: HHMT tahunan yang sudah dikalibrasi terhadap observasi BMKG&lt;/span>
&lt;/div>
&lt;div class="step-flow" style="margin-top:1.25rem;">
&lt;div class="card-label" style="margin-bottom:10px;">Alur Kerja M4 Step-by-Step&lt;/div>
&lt;div class="step-item">
&lt;div class="step-line">&lt;div class="step-dot navy">1&lt;/div>&lt;div class="step-connector">&lt;/div>&lt;/div>
&lt;div class="step-body">
&lt;div class="step-title">Ekstrak HHMT GPM Raw dari Piksel B4&lt;/div>
&lt;div class="step-desc">Download data harian GPM IMERG V07 dari NASA Giovanni untuk piksel 114.60°E, 3.30°S. Ekstrak nilai HHMT (nilai maksimum harian dalam setahun) untuk setiap tahun 1998–2025.&lt;/div>
&lt;/div>
&lt;/div>
&lt;div class="step-item">
&lt;div class="step-line">&lt;div class="step-dot navy">2&lt;/div>&lt;div class="step-connector">&lt;/div>&lt;/div>
&lt;div class="step-body">
&lt;div class="step-title">Ekstrak HHMT Ground Truth dari BMKG&lt;/div>
&lt;div class="step-desc">Ambil data harian dari dua stasiun BMKG: Syamsuddin Noor (SY) dan BMKG Kalsel/Banjarbaru (KS). Hitung HHMT per tahun dari masing-masing stasiun.&lt;/div>
&lt;/div>
&lt;/div>
&lt;div class="step-item">
&lt;div class="step-line">&lt;div class="step-dot navy">3&lt;/div>&lt;div class="step-connector">&lt;/div>&lt;/div>
&lt;div class="step-body">
&lt;div class="step-title">Hitung Faktor Koreksi Fk per Tahun&lt;/div>
&lt;div class="step-desc">Fk_SY = Gnd_SY / GPM_B4; Fk_KS = Gnd_KS / GPM_B4. Fk final = rata-rata dari stasiun yang tersedia. Jika data SY tidak valid (tahun 2010: Gnd_SY = 0 mm), gunakan Fk_KS saja.&lt;/div>
&lt;/div>
&lt;/div>
&lt;div class="step-item">
&lt;div class="step-line">&lt;div class="step-dot navy">4&lt;/div>&lt;div class="step-connector">&lt;/div>&lt;/div>
&lt;div class="step-body">
&lt;div class="step-title">Terapkan Fk ke GPM Raw&lt;/div>
&lt;div class="step-desc">GPM_M4 = GPM_Raw × Fk. Setiap tahun mendapatkan faktor koreksi yang berbeda — ini yang membuat M4 lebih akurat dibandingkan M2 (satu faktor global).&lt;/div>
&lt;/div>
&lt;/div>
&lt;div class="step-item">
&lt;div class="step-line">&lt;div class="step-dot navy">5&lt;/div>&lt;div class="step-connector">&lt;/div>&lt;/div>
&lt;div class="step-body">
&lt;div class="step-title">Validasi dengan Metrik Goodness-of-Fit&lt;/div>
&lt;div class="step-desc">Hitung R, NSE, KGE, PBIAS, RMSE, MAE untuk membandingkan GPM M4 vs Obs BMKG. Bandingkan dengan threshold SNI 2415:2016 kategori Sangat Baik (SB): NSE ≥ 0.75, KGE ≥ 0.75, |PBIAS| &amp;lt; 10%.&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;div class="warn-box">&lt;span class="box-icon">⚠️&lt;/span>&lt;span>Metode M4 bersifat &lt;em>year-specific&lt;/em> — artinya Fk dikalibrasi untuk periode historis yang sudah ada data BMKG-nya. Untuk proyeksi masa depan, perlu diasumsikan Fk konstan (nilai median atau rata-rata historis) karena tidak ada data ground truth masa depan.&lt;/span>&lt;/div>
&lt;/section>
&lt;div class="divider">&lt;/div>
&lt;!-- ===== S4: VISUALISASI ===== -->
&lt;section class="section anim-in" id="s4">
&lt;div class="section-header">&lt;div class="section-num">4&lt;/div>&lt;h2>Hasil Visualisasi&lt;/h2>&lt;/div>
&lt;div id="s4a">&lt;/div>
&lt;div class="fig-wrap">
&lt;div class="fig-header">📈 Panel 1 — Time Series HHMT Tahunan&lt;/div>
&lt;img src="https://www.irpanchumaedi.com/images/kalibrasi-gpm/timeseries-hhmt-tahunan.jpg" alt="Time series HHMT tahunan GPM Raw vs GPM M4 vs Observasi BMKG 1998-2025" loading="lazy" style="width:100%;border-radius:8px;margin:0.5rem 0;">
&lt;div class="fig-caption">Time series HHMT tahunan: GPM Raw (merah solid) vs GPM M4 (navy solid) vs Observasi BMKG (oranye dashed). Label kotak menunjukkan nilai puncak tahun 2021 = 252.2 mm.&lt;/div>
&lt;/div>
&lt;div class="card card-navy" style="margin-bottom:1.5rem;">
&lt;div class="card-label">Interpretasi Time Series&lt;/div>
&lt;p>GPM Raw secara konsisten &lt;em>berada di bawah&lt;/em> observasi BMKG sepanjang 28 tahun — mencerminkan bias negatif yang sistematis. Setelah kalibrasi M4, GPM M4 (garis navy) &lt;strong>mengikuti pola observasi BMKG dengan sangat baik&lt;/strong>, termasuk menangkap puncak ekstrem tahun 2021 (252.2 mm) yang berkorelasi dengan banjir besar Banjarmasin Januari 2021.&lt;/p>
&lt;/div>
&lt;div id="s4b">&lt;/div>
&lt;div class="fig-wrap">
&lt;div class="fig-header">📊 Panel 2 — Bar Chart Perbandingan Tahunan&lt;/div>
&lt;img src="https://www.irpanchumaedi.com/images/kalibrasi-gpm/barchart-perbandingan-tahunan.jpg" alt="Bar chart perbandingan HHMT tahunan GPM Raw vs GPM M4 vs Observasi BMKG 1998-2025" loading="lazy" style="width:100%;border-radius:8px;margin:0.5rem 0;">
&lt;div class="fig-caption">Bar chart dengan 3 seri per tahun: GPM Raw (merah), GPM M4 (navy), Obs BMKG (oranye). Terlihat GPM M4 jauh lebih mendekati bar oranye dibanding GPM Raw.&lt;/div>
&lt;/div>
&lt;div class="chart-card">
&lt;div class="chart-title">Residual Error per Tahun (GPM − Obs BMKG)&lt;/div>
&lt;div class="chart-sub">Zona hijau = ±10 mm (toleransi ideal) · GPM M4 hampir selalu di dalam zona hijau&lt;/div>
&lt;div class="chart-wrap" style="height:240px;">&lt;canvas id="chartResidual" role="img" aria-label="Bar chart residual error GPM Raw vs GPM M4 per tahun. GPM M4 jauh lebih dekat ke nol.">&lt;/canvas>&lt;/div>
&lt;div class="legend-row">
&lt;div class="legend-item">&lt;div class="legend-sq" style="background:rgba(185,28,28,0.75);">&lt;/div>Error GPM Raw&lt;/div>
&lt;div class="legend-item">&lt;div class="legend-sq" style="background:rgba(26,82,118,0.75);">&lt;/div>Error GPM M4&lt;/div>
&lt;div class="legend-item">&lt;div class="legend-sq" style="background:rgba(29,111,66,0.2);border:1px dashed #1d6f42;">&lt;/div>Zona ±10 mm&lt;/div>
&lt;/div>
&lt;/div>
&lt;div id="s4c">&lt;/div>
&lt;div class="fig-wrap">
&lt;div class="fig-header">🔵 Panel 3 — Scatter Plot: GPM Raw vs GPM M4 terhadap Observasi BMKG&lt;/div>
&lt;img src="https://www.irpanchumaedi.com/images/kalibrasi-gpm/scatterplot-gpm-vs-bmkg.jpg" alt="Scatter plot GPM Raw vs Obs BMKG dan GPM M4 vs Obs BMKG" loading="lazy" style="width:100%;border-radius:8px;margin:0.5rem 0;">
&lt;div class="fig-caption">Kiri: Scatter GPM Raw vs Obs BMKG — titik tersebar jauh dari garis 1:1 (R=0.373). Kanan: Scatter GPM M4 vs Obs BMKG — titik mengikuti garis 1:1 dengan rapat (R=0.900).&lt;/div>
&lt;/div>
&lt;div class="success-box">&lt;span class="box-icon">🎯&lt;/span>&lt;span>Garis putus-putus abu-abu pada scatter plot adalah garis &lt;strong>1:1 (perfect fit)&lt;/strong>. Semakin dekat titik ke garis ini, semakin baik kalibrasi. GPM M4 (kanan) menunjukkan sebaran yang sangat rapat di sekitar garis 1:1 dengan CI band yang sempit — bukti kalibrasi yang sangat berhasil.&lt;/span>&lt;/div>
&lt;/section>
&lt;div class="divider">&lt;/div>
&lt;!-- ===== S5: METRIK VALIDASI ===== -->
&lt;section class="section anim-in" id="s5">
&lt;div class="section-header">&lt;div class="section-num">5&lt;/div>&lt;h2>Metrik Validasi Statistik&lt;/h2>&lt;/div>
&lt;div class="chart-card">
&lt;div class="chart-title">Perbandingan Metrik Goodness-of-Fit — GPM Raw vs GPM M4&lt;/div>
&lt;div class="chart-sub">Threshold Sangat Baik (SNI 2415:2016 / Moriasi et al. 2007) ditampilkan sebagai garis putus-putus&lt;/div>
&lt;div class="chart-wrap" style="height:280px;">&lt;canvas id="chartMetrik" role="img" aria-label="Bar chart metrik validasi R NSE KGE untuk GPM Raw dan GPM M4. Semua metrik GPM M4 melampaui threshold SB.">&lt;/canvas>&lt;/div>
&lt;/div>
&lt;div class="tbl-wrap">
&lt;table class="compare-tbl" style="width:100%;border-collapse:collapse;">
&lt;thead>
&lt;tr>
&lt;th style="text-align:left;background:var(--gray-100);color:var(--gray-700);padding:10px 14px;font-size:12px;">Metrik&lt;/th>
&lt;th style="background:rgba(185,28,28,0.1);color:var(--red);padding:10px 14px;font-size:12px;text-align:center;">GPM Raw (M0)&lt;/th>
&lt;th style="background:rgba(26,82,118,0.1);color:var(--navy2);padding:10px 14px;font-size:12px;text-align:center;">GPM M4&lt;/th>
&lt;th style="background:var(--gray-100);color:var(--gray-700);padding:10px 14px;font-size:12px;text-align:center;">Threshold SB&lt;/th>
&lt;th style="background:var(--gray-100);color:var(--gray-700);padding:10px 14px;font-size:12px;text-align:center;">Status M4&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>&lt;td class="metric-name" style="padding:9px 14px;font-weight:600;background:var(--gray-100);">R (Korelasi Pearson)&lt;/td>&lt;td class="val-raw" style="padding:9px 14px;">0.373&lt;/td>&lt;td class="val-m4" style="padding:9px 14px;">0.900&lt;/td>&lt;td class="thresh" style="padding:9px 14px;">≥ 0.75&lt;/td>&lt;td class="status-good" style="padding:9px 14px;">✅ SB&lt;/td>&lt;/tr>
&lt;tr>&lt;td class="metric-name" style="padding:9px 14px;font-weight:600;background:var(--gray-100);">R² (Koef. Determinasi)&lt;/td>&lt;td class="val-raw" style="padding:9px 14px;">0.139&lt;/td>&lt;td class="val-m4" style="padding:9px 14px;">0.811&lt;/td>&lt;td class="thresh" style="padding:9px 14px;">≥ 0.75&lt;/td>&lt;td class="status-good" style="padding:9px 14px;">✅ SB&lt;/td>&lt;/tr>
&lt;tr>&lt;td class="metric-name" style="padding:9px 14px;font-weight:600;background:var(--gray-100);">NSE (Nash-Sutcliffe Eff.)&lt;/td>&lt;td class="val-raw" style="padding:9px 14px;">−1.062&lt;/td>&lt;td class="val-m4" style="padding:9px 14px;">0.772&lt;/td>&lt;td class="thresh" style="padding:9px 14px;">≥ 0.75&lt;/td>&lt;td class="status-good" style="padding:9px 14px;">✅ SB&lt;/td>&lt;/tr>
&lt;tr>&lt;td class="metric-name" style="padding:9px 14px;font-weight:600;background:var(--gray-100);">KGE (Kling-Gupta Eff.)&lt;/td>&lt;td class="val-raw" style="padding:9px 14px;">0.206&lt;/td>&lt;td class="val-m4" style="padding:9px 14px;">0.879&lt;/td>&lt;td class="thresh" style="padding:9px 14px;">≥ 0.75&lt;/td>&lt;td class="status-good" style="padding:9px 14px;">✅ SB&lt;/td>&lt;/tr>
&lt;tr>&lt;td class="metric-name" style="padding:9px 14px;font-weight:600;background:var(--gray-100);">PBIAS (%)&lt;/td>&lt;td class="val-raw" style="padding:9px 14px;">−31.9%&lt;/td>&lt;td class="val-m4" style="padding:9px 14px;">+3.5%&lt;/td>&lt;td class="thresh" style="padding:9px 14px;">|PBIAS| &amp;lt; 10%&lt;/td>&lt;td class="status-good" style="padding:9px 14px;">✅ SB&lt;/td>&lt;/tr>
&lt;tr>&lt;td class="metric-name" style="padding:9px 14px;font-weight:600;background:var(--gray-100);">RMSE (mm)&lt;/td>&lt;td class="val-raw" style="padding:9px 14px;">47.44 mm&lt;/td>&lt;td class="val-m4" style="padding:9px 14px;">15.79 mm&lt;/td>&lt;td class="thresh" style="padding:9px 14px;">Min (↓)&lt;/td>&lt;td class="status-good" style="padding:9px 14px;">✅ −67%&lt;/td>&lt;/tr>
&lt;tr>&lt;td class="metric-name" style="padding:9px 14px;font-weight:600;background:var(--gray-100);">MAE (mm)&lt;/td>&lt;td class="val-raw" style="padding:9px 14px;">38.72 mm&lt;/td>&lt;td class="val-m4" style="padding:9px 14px;">11.14 mm&lt;/td>&lt;td class="thresh" style="padding:9px 14px;">Min (↓)&lt;/td>&lt;td class="status-good" style="padding:9px 14px;">✅ −71%&lt;/td>&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;/div>
&lt;div class="grid-2" style="margin-top:1rem;">
&lt;div class="card card-blue">
&lt;div class="card-label">Tentang NSE (Nash-Sutcliffe Efficiency)&lt;/div>
&lt;p>NSE = 1 adalah sempurna. NSE = 0 berarti model sama akuratnya dengan rata-rata observasi. NSE &amp;lt; 0 berarti model &lt;em>lebih buruk&lt;/em> dari rata-rata. GPM Raw dengan NSE = −1.06 sangat tidak layak. GPM M4 dengan NSE = 0.77 masuk kategori Sangat Baik.&lt;/p>
&lt;/div>
&lt;div class="card card-purple">
&lt;div class="card-label">Tentang KGE (Kling-Gupta Efficiency)&lt;/div>
&lt;p>KGE menggabungkan korelasi, bias, dan variabilitas dalam satu metrik. KGE ≥ 0.75 = Sangat Baik. KGE GPM M4 = 0.879 menunjukkan keseimbangan yang baik antara tiga komponen tersebut — model tidak hanya berkorelasi tinggi, tapi juga reproduksi variabilitasnya bagus.&lt;/p>
&lt;/div>
&lt;/div>
&lt;/section>
&lt;div class="divider">&lt;/div>
&lt;!-- ===== S6: FAKTOR KOREKSI ===== -->
&lt;section class="section anim-in" id="s6">
&lt;div class="section-header">&lt;div class="section-num">6&lt;/div>&lt;h2>Distribusi Faktor Koreksi (Fk)&lt;/h2>&lt;/div>
&lt;div class="chart-card">
&lt;div class="chart-title">Faktor Koreksi Fk per Tahun (Year-Specific Scaling Factor)&lt;/div>
&lt;div class="chart-sub">Fk = mean(Gnd_SY/GPM_B4, Gnd_KS/GPM_B4) · Garis putus-putus = Median Fk · Garis titik-titik = Fk=1.0 (tidak ada koreksi)&lt;/div>
&lt;div class="chart-wrap" style="height:260px;">&lt;canvas id="chartFk" role="img" aria-label="Bar chart faktor koreksi Fk per tahun 1998-2025. Sebagian besar Fk di atas 1.0 artinya GPM meremehkan observasi.">&lt;/canvas>&lt;/div>
&lt;div class="legend-row">
&lt;div class="legend-item">&lt;div class="legend-sq" style="background:rgba(109,40,217,0.75);">&lt;/div>Fk per tahun&lt;/div>
&lt;div class="legend-item">&lt;div style="width:20px;border-top:2px dashed var(--purple);margin-top:5px;">&lt;/div>&amp;nbsp;Median Fk&lt;/div>
&lt;div class="legend-item">&lt;div style="width:20px;border-top:2px dotted #94a3b8;margin-top:5px;">&lt;/div>&amp;nbsp;Fk = 1.0&lt;/div>
&lt;/div>
&lt;/div>
&lt;div class="grid-3">
&lt;div class="card">
&lt;div class="card-label">Median Fk&lt;/div>
&lt;p style="font-size:22px;font-weight:700;color:var(--purple);">1.402&lt;/p>
&lt;p style="margin-top:4px;">GPM secara rata-rata meremehkan observasi sebesar &lt;strong>~40%&lt;/strong>. Fk &amp;gt; 1 artinya observasi lebih tinggi dari GPM.&lt;/p>
&lt;/div>
&lt;div class="card">
&lt;div class="card-label">Rentang Fk&lt;/div>
&lt;p style="font-size:13px;line-height:1.8;margin-top:4px;">
Min: &lt;strong>0.842&lt;/strong> (2011) — tahun saat GPM justru lebih tinggi&lt;br>
Max: &lt;strong>2.466&lt;/strong> (2014) — GPM sangat meremehkan&lt;br>
StDev: ±0.37 (variasi antar tahun tinggi)
&lt;/p>
&lt;/div>
&lt;div class="card">
&lt;div class="card-label">Implikasi Fk Tinggi&lt;/div>
&lt;p style="margin-top:4px;">Tahun dengan Fk &amp;gt; 2.0 (2014, 2020, 2021, 2022, 2023) adalah tahun-tahun dengan curah hujan ekstrem tinggi di Banjarmasin — satelit GPM &lt;em>secara struktural&lt;/em> kesulitan menangkap puncak intensitas.&lt;/p>
&lt;/div>
&lt;/div>
&lt;div class="warn-box">&lt;span class="box-icon">⚠️&lt;/span>&lt;span>Variabilitas Fk yang tinggi antar tahun (0.84 – 2.47) menunjukkan bahwa metode koreksi bias tunggal (M2) tidak cukup — justru inilah alasan utama M4 unggul: setiap tahun mendapat koreksi yang sesuai kondisinya.&lt;/span>&lt;/div>
&lt;/section>
&lt;div class="divider">&lt;/div>
&lt;!-- ===== S7: KODE R ===== -->
&lt;section class="section anim-in" id="s7">
&lt;div class="section-header">&lt;div class="section-num">7&lt;/div>&lt;h2>Kode R — Reproduksi Analisis&lt;/h2>&lt;/div>
&lt;p style="font-size:13px;color:var(--gray-600);margin-bottom:1.25rem;line-height:1.7;">Seluruh analisis dikerjakan menggunakan R dengan package &lt;code style="background:var(--gray-100);padding:1px 5px;border-radius:3px;font-size:12px;">ggplot2&lt;/code>, &lt;code style="background:var(--gray-100);padding:1px 5px;border-radius:3px;font-size:12px;">patchwork&lt;/code>, &lt;code style="background:var(--gray-100);padding:1px 5px;border-radius:3px;font-size:12px;">readxl&lt;/code>, dan &lt;code style="background:var(--gray-100);padding:1px 5px;border-radius:3px;font-size:12px;">dplyr&lt;/code>. Kode di bawah dapat langsung dijalankan dengan file Excel yang disediakan.&lt;/p>
&lt;div class="code-wrap">
&lt;div class="code-header">
&lt;span class="code-lang">&lt;span class="dot" style="background:#4fc3f7;">&lt;/span>R · Setup &amp; Import Data&lt;/span>
&lt;button class="copy-btn" onclick="copyCode(this)">Salin&lt;/button>
&lt;/div>
&lt;pre>&lt;span class="fn">library&lt;/span>(&lt;span class="pkg">ggplot2&lt;/span>); &lt;span class="fn">library&lt;/span>(&lt;span class="pkg">readxl&lt;/span>); &lt;span class="fn">library&lt;/span>(&lt;span class="pkg">patchwork&lt;/span>)
&lt;span class="fn">library&lt;/span>(&lt;span class="pkg">scales&lt;/span>); &lt;span class="fn">library&lt;/span>(&lt;span class="pkg">dplyr&lt;/span>); &lt;span class="fn">library&lt;/span>(&lt;span class="pkg">tidyr&lt;/span>)
&lt;span class="fn">library&lt;/span>(&lt;span class="pkg">ggrepel&lt;/span>) &lt;span class="cm"># label titik scatter plot&lt;/span>
&lt;span class="cm"># ── Baca data utama dari Excel ───────────────────────────────&lt;/span>
xl &lt;span class="op">&amp;lt;-&lt;/span> &lt;span class="str">"Input_Plot_GPM_NoWMO.xlsx"&lt;/span>
df &lt;span class="op">&amp;lt;-&lt;/span> &lt;span class="fn">read_excel&lt;/span>(xl, sheet &lt;span class="op">=&lt;/span> &lt;span class="str">"DATA_UTAMA"&lt;/span>, skip &lt;span class="op">=&lt;/span> &lt;span class="num">3&lt;/span>)
met &lt;span class="op">&amp;lt;-&lt;/span> &lt;span class="fn">read_excel&lt;/span>(xl, sheet &lt;span class="op">=&lt;/span> &lt;span class="str">"METRIK_VALIDASI"&lt;/span>, skip &lt;span class="op">=&lt;/span> &lt;span class="num">3&lt;/span>)
&lt;span class="cm"># ── Bersihkan nama kolom &amp; konversi tipe data ────────────────&lt;/span>
df &lt;span class="op">&amp;lt;-&lt;/span> df &lt;span class="op">|&amp;gt;&lt;/span>
&lt;span class="fn">rename&lt;/span>(raw &lt;span class="op">=&lt;/span> &lt;span class="str">`GPM_Raw
(mm)`&lt;/span>, m4 &lt;span class="op">=&lt;/span> &lt;span class="str">`M4_Baru
(mm)`&lt;/span>,
obs &lt;span class="op">=&lt;/span> &lt;span class="str">`Obs_BMKG
(mm)`&lt;/span>, fk &lt;span class="op">=&lt;/span> &lt;span class="str">`Fk_Baru
(rata²)`&lt;/span>) &lt;span class="op">|&amp;gt;&lt;/span>
&lt;span class="fn">filter&lt;/span>(&lt;span class="op">!&lt;/span>&lt;span class="fn">is.na&lt;/span>(Tahun)) &lt;span class="op">|&amp;gt;&lt;/span>
&lt;span class="fn">mutate&lt;/span>(&lt;span class="fn">across&lt;/span>(&lt;span class="fn">c&lt;/span>(Tahun, raw, m4, obs, fk), as.numeric),
tahun &lt;span class="op">=&lt;/span> &lt;span class="fn">as.integer&lt;/span>(Tahun),
err_raw &lt;span class="op">=&lt;/span> raw &lt;span class="op">-&lt;/span> obs,
err_m4 &lt;span class="op">=&lt;/span> m4 &lt;span class="op">-&lt;/span> obs)&lt;/pre>
&lt;/div>
&lt;div class="code-wrap">
&lt;div class="code-header">
&lt;span class="code-lang">&lt;span class="dot" style="background:#4fc3f7;">&lt;/span>R · Hitung Faktor Koreksi Fk &amp; Terapkan ke GPM&lt;/span>
&lt;button class="copy-btn" onclick="copyCode(this)">Salin&lt;/button>
&lt;/div>
&lt;pre>&lt;span class="cm"># ── Data referensi: HHMT dari stasiun BMKG &amp; piksel GPM ─────&lt;/span>
&lt;span class="cm"># Asumsi: df sudah memiliki kolom gnd_sy, gnd_ks, gpm_b4&lt;/span>
df &lt;span class="op">&amp;lt;-&lt;/span> df &lt;span class="op">|&amp;gt;&lt;/span>
&lt;span class="fn">mutate&lt;/span>(
&lt;span class="cm"># Fk per stasiun = BMKG / GPM_B4 (untuk setiap tahun)&lt;/span>
fk_sy &lt;span class="op">=&lt;/span> gnd_sy &lt;span class="op">/&lt;/span> gpm_b4,
fk_ks &lt;span class="op">=&lt;/span> gnd_ks &lt;span class="op">/&lt;/span> gpm_b4,
&lt;span class="cm"># Fk final = rata-rata stasiun yang tersedia&lt;/span>
&lt;span class="cm"># Jika salah satu NA (mis. 2010: gnd_sy = 0), gunakan yang ada&lt;/span>
fk_m4 &lt;span class="op">=&lt;/span> &lt;span class="fn">case_when&lt;/span>(
&lt;span class="fn">is.na&lt;/span>(fk_sy) &lt;span class="op">|&lt;/span> gnd_sy &lt;span class="op">==&lt;/span> &lt;span class="num">0&lt;/span> &lt;span class="op">~&lt;/span> fk_ks,
&lt;span class="fn">is.na&lt;/span>(fk_ks) &lt;span class="op">~&lt;/span> fk_sy,
&lt;span class="kw">.default&lt;/span> &lt;span class="op">~&lt;/span> &lt;span class="fn">mean&lt;/span>(&lt;span class="fn">c&lt;/span>(fk_sy, fk_ks))
),
&lt;span class="cm"># Terapkan Fk ke GPM Raw piksel B4&lt;/span>
gpm_m4 &lt;span class="op">=&lt;/span> gpm_b4 &lt;span class="op">*&lt;/span> fk_m4
)
&lt;span class="cm"># ── Ringkasan statistik ──────────────────────────────────────&lt;/span>
&lt;span class="fn">cat&lt;/span>(&lt;span class="str">"Median Fk:"&lt;/span>, &lt;span class="fn">round&lt;/span>(&lt;span class="fn">median&lt;/span>(df&lt;span class="op">$&lt;/span>fk_m4, na.rm &lt;span class="op">=&lt;/span> &lt;span class="kw">TRUE&lt;/span>), &lt;span class="num">3&lt;/span>), &lt;span class="str">"
"&lt;/span>)
&lt;span class="fn">cat&lt;/span>(&lt;span class="str">"Rentang:"&lt;/span>, &lt;span class="fn">round&lt;/span>(&lt;span class="fn">min&lt;/span>(df&lt;span class="op">$&lt;/span>fk_m4), &lt;span class="num">3&lt;/span>), &lt;span class="str">"–"&lt;/span>,
&lt;span class="fn">round&lt;/span>(&lt;span class="fn">max&lt;/span>(df&lt;span class="op">$&lt;/span>fk_m4), &lt;span class="num">3&lt;/span>), &lt;span class="str">"
"&lt;/span>)&lt;/pre>
&lt;/div>
&lt;div class="code-wrap">
&lt;div class="code-header">
&lt;span class="code-lang">&lt;span class="dot" style="background:#4fc3f7;">&lt;/span>R · Hitung Metrik Validasi&lt;/span>
&lt;button class="copy-btn" onclick="copyCode(this)">Salin&lt;/button>
&lt;/div>
&lt;pre>&lt;span class="cm"># ── Fungsi hitung metrik validasi ───────────────────────────&lt;/span>
&lt;span class="fn">hitung_metrik&lt;/span> &lt;span class="op">&amp;lt;-&lt;/span> &lt;span class="kw">function&lt;/span>(sim, obs) {
n &lt;span class="op">&amp;lt;-&lt;/span> &lt;span class="fn">length&lt;/span>(sim)
bias &lt;span class="op">&amp;lt;-&lt;/span> sim &lt;span class="op">-&lt;/span> obs
R_val &lt;span class="op">&amp;lt;-&lt;/span> &lt;span class="fn">cor&lt;/span>(obs, sim)
NSE &lt;span class="op">&amp;lt;-&lt;/span> &lt;span class="num">1&lt;/span> &lt;span class="op">-&lt;/span> &lt;span class="fn">sum&lt;/span>(bias&lt;span class="op">^&lt;/span>&lt;span class="num">2&lt;/span>) &lt;span class="op">/&lt;/span> &lt;span class="fn">sum&lt;/span>((obs &lt;span class="op">-&lt;/span> &lt;span class="fn">mean&lt;/span>(obs))&lt;span class="op">^&lt;/span>&lt;span class="num">2&lt;/span>)
KGE &lt;span class="op">&amp;lt;-&lt;/span> &lt;span class="num">1&lt;/span> &lt;span class="op">-&lt;/span> &lt;span class="fn">sqrt&lt;/span>((R_val&lt;span class="op">-&lt;/span>&lt;span class="num">1&lt;/span>)&lt;span class="op">^&lt;/span>&lt;span class="num">2&lt;/span> &lt;span class="op">+&lt;/span>
(&lt;span class="fn">sd&lt;/span>(sim)&lt;span class="op">/&lt;/span>&lt;span class="fn">sd&lt;/span>(obs)&lt;span class="op">-&lt;/span>&lt;span class="num">1&lt;/span>)&lt;span class="op">^&lt;/span>&lt;span class="num">2&lt;/span> &lt;span class="op">+&lt;/span>
(&lt;span class="fn">mean&lt;/span>(sim)&lt;span class="op">/&lt;/span>&lt;span class="fn">mean&lt;/span>(obs)&lt;span class="op">-&lt;/span>&lt;span class="num">1&lt;/span>)&lt;span class="op">^&lt;/span>&lt;span class="num">2&lt;/span>)
PBIAS &lt;span class="op">&amp;lt;-&lt;/span> &lt;span class="fn">sum&lt;/span>(bias) &lt;span class="op">/&lt;/span> &lt;span class="fn">sum&lt;/span>(obs) &lt;span class="op">*&lt;/span> &lt;span class="num">100&lt;/span>
RMSE &lt;span class="op">&amp;lt;-&lt;/span> &lt;span class="fn">sqrt&lt;/span>(&lt;span class="fn">mean&lt;/span>(bias&lt;span class="op">^&lt;/span>&lt;span class="num">2&lt;/span>))
MAE &lt;span class="op">&amp;lt;-&lt;/span> &lt;span class="fn">mean&lt;/span>(&lt;span class="fn">abs&lt;/span>(bias))
&lt;span class="fn">data.frame&lt;/span>(R=R_val, NSE=NSE, KGE=KGE, PBIAS=PBIAS, RMSE=RMSE, MAE=MAE)
}
&lt;span class="cm"># ── Bandingkan M0 (Raw) vs M4 ────────────────────────────────&lt;/span>
metrik_raw &lt;span class="op">&amp;lt;-&lt;/span> &lt;span class="fn">hitung_metrik&lt;/span>(df&lt;span class="op">$&lt;/span>raw, df&lt;span class="op">$&lt;/span>obs)
metrik_m4 &lt;span class="op">&amp;lt;-&lt;/span> &lt;span class="fn">hitung_metrik&lt;/span>(df&lt;span class="op">$&lt;/span>m4, df&lt;span class="op">$&lt;/span>obs)
&lt;span class="fn">bind_rows&lt;/span>(
&lt;span class="fn">mutate&lt;/span>(metrik_raw, Metode &lt;span class="op">=&lt;/span> &lt;span class="str">"GPM Raw"&lt;/span>),
&lt;span class="fn">mutate&lt;/span>(metrik_m4, Metode &lt;span class="op">=&lt;/span> &lt;span class="str">"GPM M4"&lt;/span>)
) &lt;span class="op">|&amp;gt;&lt;/span> &lt;span class="fn">select&lt;/span>(Metode, R, NSE, KGE, PBIAS, RMSE, MAE)&lt;/pre>
&lt;/div>
&lt;div class="code-wrap">
&lt;div class="code-header">
&lt;span class="code-lang">&lt;span class="dot" style="background:#4fc3f7;">&lt;/span>R · Time Series Plot (Panel 1)&lt;/span>
&lt;button class="copy-btn" onclick="copyCode(this)">Salin&lt;/button>
&lt;/div>
&lt;pre>&lt;span class="cm"># ── Reshape ke long format untuk ggplot ──────────────────────&lt;/span>
df_long &lt;span class="op">&amp;lt;-&lt;/span> df &lt;span class="op">|&amp;gt;&lt;/span>
&lt;span class="fn">select&lt;/span>(tahun, raw, m4, obs) &lt;span class="op">|&amp;gt;&lt;/span>
&lt;span class="fn">pivot_longer&lt;/span>(&lt;span class="fn">c&lt;/span>(raw, m4, obs), names_to &lt;span class="op">=&lt;/span> &lt;span class="str">"seri"&lt;/span>, values_to &lt;span class="op">=&lt;/span> &lt;span class="str">"hhmt"&lt;/span>) &lt;span class="op">|&amp;gt;&lt;/span>
&lt;span class="fn">mutate&lt;/span>(seri &lt;span class="op">=&lt;/span> &lt;span class="fn">factor&lt;/span>(seri,
levels &lt;span class="op">=&lt;/span> &lt;span class="fn">c&lt;/span>(&lt;span class="str">"obs"&lt;/span>, &lt;span class="str">"m4"&lt;/span>, &lt;span class="str">"raw"&lt;/span>),
labels &lt;span class="op">=&lt;/span> &lt;span class="fn">c&lt;/span>(&lt;span class="str">"Obs BMKG"&lt;/span>, &lt;span class="str">"GPM M4 (Koreksi)"&lt;/span>, &lt;span class="str">"GPM Raw"&lt;/span>)))
p1 &lt;span class="op">&amp;lt;-&lt;/span> &lt;span class="fn">ggplot&lt;/span>(df_long, &lt;span class="fn">aes&lt;/span>(x &lt;span class="op">=&lt;/span> tahun, y &lt;span class="op">=&lt;/span> hhmt,
color &lt;span class="op">=&lt;/span> seri, linetype &lt;span class="op">=&lt;/span> seri, linewidth &lt;span class="op">=&lt;/span> seri)) &lt;span class="op">+&lt;/span>
&lt;span class="fn">geom_line&lt;/span>(na.rm &lt;span class="op">=&lt;/span> &lt;span class="kw">TRUE&lt;/span>) &lt;span class="op">+&lt;/span>
&lt;span class="fn">geom_point&lt;/span>(data &lt;span class="op">=&lt;/span> &lt;span class="op">.&lt;/span> &lt;span class="op">|&amp;gt;&lt;/span> &lt;span class="fn">filter&lt;/span>(seri &lt;span class="op">==&lt;/span> &lt;span class="str">"Obs BMKG"&lt;/span>),
size &lt;span class="op">=&lt;/span> &lt;span class="num">1.8&lt;/span>, shape &lt;span class="op">=&lt;/span> &lt;span class="num">21&lt;/span>) &lt;span class="op">+&lt;/span>
&lt;span class="fn">geom_label&lt;/span>(data &lt;span class="op">=&lt;/span> df &lt;span class="op">|&amp;gt;&lt;/span> &lt;span class="fn">filter&lt;/span>(m4 &lt;span class="op">&amp;gt;&lt;/span> &lt;span class="num">200&lt;/span>),
&lt;span class="fn">aes&lt;/span>(x &lt;span class="op">=&lt;/span> tahun, y &lt;span class="op">=&lt;/span> m4 &lt;span class="op">+&lt;/span> &lt;span class="num">8&lt;/span>,
label &lt;span class="op">=&lt;/span> &lt;span class="fn">paste0&lt;/span>(tahun, &lt;span class="str">"
"&lt;/span>, m4, &lt;span class="str">"mm"&lt;/span>)),
inherit.aes &lt;span class="op">=&lt;/span> &lt;span class="kw">FALSE&lt;/span>, size &lt;span class="op">=&lt;/span> &lt;span class="num">2.8&lt;/span>, color &lt;span class="op">=&lt;/span> &lt;span class="str">"#1A5276"&lt;/span>) &lt;span class="op">+&lt;/span>
&lt;span class="fn">scale_color_manual&lt;/span>(
values &lt;span class="op">=&lt;/span> &lt;span class="fn">c&lt;/span>(&lt;span class="str">"Obs BMKG"&lt;/span>&lt;span class="op">=&lt;/span>&lt;span class="str">"#B45309"&lt;/span>, &lt;span class="str">"GPM M4 (Koreksi)"&lt;/span>&lt;span class="op">=&lt;/span>&lt;span class="str">"#1A5276"&lt;/span>,
&lt;span class="str">"GPM Raw"&lt;/span>&lt;span class="op">=&lt;/span>&lt;span class="str">"#B91C1C"&lt;/span>), name &lt;span class="op">=&lt;/span> &lt;span class="kw">NULL&lt;/span>) &lt;span class="op">+&lt;/span>
&lt;span class="fn">scale_linetype_manual&lt;/span>(
values &lt;span class="op">=&lt;/span> &lt;span class="fn">c&lt;/span>(&lt;span class="str">"Obs BMKG"&lt;/span>&lt;span class="op">=&lt;/span>&lt;span class="str">"dashed"&lt;/span>, &lt;span class="str">"GPM M4 (Koreksi)"&lt;/span>&lt;span class="op">=&lt;/span>&lt;span class="str">"solid"&lt;/span>,
&lt;span class="str">"GPM Raw"&lt;/span>&lt;span class="op">=&lt;/span>&lt;span class="str">"solid"&lt;/span>), name &lt;span class="op">=&lt;/span> &lt;span class="kw">NULL&lt;/span>) &lt;span class="op">+&lt;/span>
&lt;span class="fn">scale_y_continuous&lt;/span>(
limits &lt;span class="op">=&lt;/span> &lt;span class="fn">c&lt;/span>(&lt;span class="num">0&lt;/span>, &lt;span class="num">280&lt;/span>),
labels &lt;span class="op">=&lt;/span> &lt;span class="kw">function&lt;/span>(x) &lt;span class="fn">paste0&lt;/span>(x, &lt;span class="str">" mm"&lt;/span>)) &lt;span class="op">+&lt;/span>
&lt;span class="fn">labs&lt;/span>(
title &lt;span class="op">=&lt;/span> &lt;span class="str">"Time Series HHMT Tahunan"&lt;/span>,
subtitle &lt;span class="op">=&lt;/span> &lt;span class="str">"GPM Raw vs GPM M4 vs Observasi BMKG | 1998–2025"&lt;/span>,
x &lt;span class="op">=&lt;/span> &lt;span class="kw">NULL&lt;/span>, y &lt;span class="op">=&lt;/span> &lt;span class="str">"HHMT (mm)"&lt;/span>,
caption &lt;span class="op">=&lt;/span> &lt;span class="str">"Sumber: GPM IMERG V07 (NASA) | BMKG Syamsuddin Noor + BMKG Kalsel"&lt;/span>
) &lt;span class="op">+&lt;/span>
&lt;span class="fn">theme_minimal&lt;/span>(base_size &lt;span class="op">=&lt;/span> &lt;span class="num">11&lt;/span>) &lt;span class="op">+&lt;/span>
&lt;span class="fn">theme&lt;/span>(plot.title &lt;span class="op">=&lt;/span> &lt;span class="fn">element_text&lt;/span>(face &lt;span class="op">=&lt;/span> &lt;span class="str">"bold"&lt;/span>))
&lt;span class="cm"># ── Scatter Plot: M4 vs Obs ───────────────────────────────────&lt;/span>
p_scatter &lt;span class="op">&amp;lt;-&lt;/span> &lt;span class="fn">ggplot&lt;/span>(df, &lt;span class="fn">aes&lt;/span>(x &lt;span class="op">=&lt;/span> obs, y &lt;span class="op">=&lt;/span> m4)) &lt;span class="op">+&lt;/span>
&lt;span class="fn">geom_abline&lt;/span>(slope &lt;span class="op">=&lt;/span> &lt;span class="num">1&lt;/span>, intercept &lt;span class="op">=&lt;/span> &lt;span class="num">0&lt;/span>,
linetype &lt;span class="op">=&lt;/span> &lt;span class="str">"dashed"&lt;/span>, color &lt;span class="op">=&lt;/span> &lt;span class="str">"#94A3B8"&lt;/span>) &lt;span class="op">+&lt;/span>
&lt;span class="fn">geom_point&lt;/span>(color &lt;span class="op">=&lt;/span> &lt;span class="str">"#1A5276"&lt;/span>, size &lt;span class="op">=&lt;/span> &lt;span class="num">3&lt;/span>, shape &lt;span class="op">=&lt;/span> &lt;span class="num">21&lt;/span>) &lt;span class="op">+&lt;/span>
&lt;span class="fn">ggrepel&lt;/span>::&lt;span class="fn">geom_text_repel&lt;/span>(&lt;span class="fn">aes&lt;/span>(label &lt;span class="op">=&lt;/span> tahun),
size &lt;span class="op">=&lt;/span> &lt;span class="num">2.5&lt;/span>, color &lt;span class="op">=&lt;/span> &lt;span class="str">"#475569"&lt;/span>) &lt;span class="op">+&lt;/span>
&lt;span class="fn">geom_smooth&lt;/span>(method &lt;span class="op">=&lt;/span> &lt;span class="str">"lm"&lt;/span>, se &lt;span class="op">=&lt;/span> &lt;span class="kw">TRUE&lt;/span>,
color &lt;span class="op">=&lt;/span> &lt;span class="str">"#1A5276"&lt;/span>, fill &lt;span class="op">=&lt;/span> &lt;span class="str">"#1A527622"&lt;/span>) &lt;span class="op">+&lt;/span>
&lt;span class="fn">coord_equal&lt;/span>() &lt;span class="op">+&lt;/span>
&lt;span class="fn">labs&lt;/span>(title &lt;span class="op">=&lt;/span> &lt;span class="str">"Scatter: GPM M4 vs Obs BMKG"&lt;/span>,
x &lt;span class="op">=&lt;/span> &lt;span class="str">"Observasi BMKG (mm)"&lt;/span>, y &lt;span class="op">=&lt;/span> &lt;span class="str">"GPM M4 (mm)"&lt;/span>)
&lt;span class="cm"># ── Gabung &amp; simpan ──────────────────────────────────────────&lt;/span>
fig_final &lt;span class="op">&amp;lt;-&lt;/span> p1 &lt;span class="op">/&lt;/span> p_scatter &lt;span class="op">+&lt;/span>
&lt;span class="fn">plot_annotation&lt;/span>(
title &lt;span class="op">=&lt;/span> &lt;span class="str">"Koreksi Bias GPM IMERG V07 — WPG Banjarmasin"&lt;/span>,
caption &lt;span class="op">=&lt;/span> &lt;span class="str">"SNI 2415:2016 | Teutschbein &amp; Seibert (2012)"&lt;/span>)
&lt;span class="fn">ggsave&lt;/span>(&lt;span class="str">"hasil_kalibrasi_gpm.png"&lt;/span>, fig_final,
width &lt;span class="op">=&lt;/span> &lt;span class="num">36&lt;/span>, height &lt;span class="op">=&lt;/span> &lt;span class="num">30&lt;/span>, units &lt;span class="op">=&lt;/span> &lt;span class="str">"cm"&lt;/span>, dpi &lt;span class="op">=&lt;/span> &lt;span class="num">300&lt;/span>)&lt;/pre>
&lt;/div>
&lt;/section>
&lt;div class="divider">&lt;/div>
&lt;!-- ===== S8: KESIMPULAN ===== -->
&lt;section class="section anim-in" id="s8">
&lt;div class="section-header">&lt;div class="section-num">8&lt;/div>&lt;h2>Kesimpulan&lt;/h2>&lt;/div>
&lt;div class="card card-green">
&lt;div class="card-label" style="margin-bottom:10px;">Ringkasan Hasil&lt;/div>
&lt;div class="step-flow">
&lt;div class="step-item">
&lt;div class="step-line">&lt;div class="step-dot" style="background:var(--green);">✓&lt;/div>&lt;div class="step-connector">&lt;/div>&lt;/div>
&lt;div class="step-body">
&lt;div class="step-title">GPM Raw tidak layak digunakan langsung&lt;/div>
&lt;div class="step-desc">PBIAS = −31.9% dan NSE = −1.06 mengonfirmasi bahwa data mentah GPM IMERG secara sistematis meremehkan HHMT di wilayah Banjarmasin sebesar ~32% — tidak memenuhi threshold SNI 2415:2016 untuk analisis hidrologi desain.&lt;/div>
&lt;/div>
&lt;/div>
&lt;div class="step-item">
&lt;div class="step-line">&lt;div class="step-dot" style="background:var(--green);">✓&lt;/div>&lt;div class="step-connector">&lt;/div>&lt;/div>
&lt;div class="step-body">
&lt;div class="step-title">Metode M4 (Year-Specific Scaling) adalah yang terbaik&lt;/div>
&lt;div class="step-desc">Dibandingkan M1 (CF bulanan), M2 (direct scaling), dan M3 (quantile mapping), metode M4 menghasilkan metrik terbaik karena Fk dikalibrasi unik per tahun dari rata-rata dua stasiun BMKG — menangkap variabilitas antar tahun yang signifikan.&lt;/div>
&lt;/div>
&lt;/div>
&lt;div class="step-item">
&lt;div class="step-line">&lt;div class="step-dot" style="background:var(--green);">✓&lt;/div>&lt;div class="step-connector">&lt;/div>&lt;/div>
&lt;div class="step-body">
&lt;div class="step-title">Semua metrik validasi masuk kategori Sangat Baik&lt;/div>
&lt;div class="step-desc">Setelah kalibrasi M4: R=0.900, NSE=0.772, KGE=0.879, PBIAS=+3.5%, RMSE=15.8 mm. Semua nilai melampaui threshold Sangat Baik (SB) menurut Moriasi et al. (2007) dan SNI 2415:2016.&lt;/div>
&lt;/div>
&lt;/div>
&lt;div class="step-item">
&lt;div class="step-line">&lt;div class="step-dot" style="background:var(--green);">✓&lt;/div>&lt;div class="step-connector">&lt;/div>&lt;/div>
&lt;div class="step-body">
&lt;div class="step-title">Aplikasi praktis: data GPM M4 layak untuk analisis frekuensi&lt;/div>
&lt;div class="step-desc">Dengan kualitas data yang sudah masuk SB, GPM M4 dapat digunakan sebagai data curah hujan dalam analisis frekuensi (menghitung return period 25, 50, 100 tahun) untuk desain bangunan air di wilayah yang tidak memiliki stasiun observasi.&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;/div>
&lt;div class="grid-2" style="margin-top:1rem;">
&lt;div class="card">
&lt;div class="card-label">Referensi Utama&lt;/div>
&lt;p style="line-height:2; font-size:12px;">
📚 Moriasi et al. (2007) — Model Evaluation Guidelines&lt;br>
📚 Teutschbein &amp;amp; Seibert (2012) — Bias Correction Methods&lt;br>
📚 Knoben et al. (2019) — KGE Commentary&lt;br>
📚 SNI 2415:2016 — Tata Cara Perhitungan Debit Banjir Rencana&lt;br>
🛰️ NASA GPM IMERG V07 Final Run&lt;br>
🌧️ BMKG Stasiun Syamsuddin Noor &amp;amp; BMKG Kalsel
&lt;/p>
&lt;/div>
&lt;div class="card">
&lt;div class="card-label">Keterbatasan &amp;amp; Pengembangan&lt;/div>
&lt;p style="line-height:1.8; font-size:12px;">
⚠️ Fk bersifat historis — proyeksi masa depan asumsi Fk = median&lt;br>
⚠️ Hanya 2 stasiun BMKG — wilayah DAS besar butuh lebih banyak&lt;br>
⚠️ Koreksi bias pada level HHMT — bukan distribusi harian penuh&lt;br>
🔭 Pengembangan: uji pada stasiun lain &amp;amp; periode lebih panjang&lt;br>
🔭 Kombinasikan M4 dengan M3 (Quantile Mapping) untuk distribusi
&lt;/p>
&lt;/div>
&lt;/div>
&lt;div style="background:linear-gradient(135deg,#0A2342,#1A3a5c 60%,#2d1065);color:#fff;border-radius:var(--radius);padding:1.75rem 2rem;text-align:center;margin-top:1.5rem;">
&lt;div style="font-size:18px;font-weight:700;margin-bottom:8px;">Ada pertanyaan tentang kalibrasi data GPM?&lt;/div>
&lt;p style="font-size:13px;color:rgba(255,255,255,0.65);margin-bottom:1.25rem;">Diskusi metodologi, data, atau implementasi di proyekmu&lt;/p>
&lt;a href="https://www.irpanchumaedi.com/#contact" target="_top" style="display:inline-block;background:var(--blue-mid);color:#fff;font-size:13px;font-weight:600;padding:10px 24px;border-radius:20px;text-decoration:none;">Hubungi saya →&lt;/a>
&lt;/div>
&lt;/section>
&lt;/div>
&lt;script>
/* DATA */
const years = [1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024, 2025];
const rawData = [62.8, 71.0, 75.4, 66.4, 64.6, 70.6, 89.3, 63.4, 76.1, 70.7, 82.7, 58.3, 81.5, 161.3, 64.8, 74.6, 67.2, 53.1, 71.1, 92.9, 72.8, 67.9, 57.2, 105.2, 62.7, 57.1, 103.1, 63.9];
const m4Data = [105.3, 92.2, 98.3, 83.8, 95.0, 139.6, 136.0, 64.2, 85.5, 97.9, 149.1, 101.9, 90.5, 135.8, 94.0, 103.0, 165.7, 107.4, 108.0, 99.5, 101.7, 84.0, 124.1, 252.2, 135.0, 131.1, 127.7, 92.6];
const obsData = [86.1, 93.1, 101.0, 78.9, 119.8, 119.8, 136.1, 62.2, 80.0, 109.3, 116.2, 105.2, 90.5, 113.0, 92.4, 118.2, 117.5, 98.9, 108.0, 111.8, 112.1, 70.5, 122.1, 249.0, 120.8, 127.6, 148.4, 84.4];
const fkData = [1.6768, 1.2979, 1.3031, 1.262, 1.4706, 1.978, 1.523, 1.0134, 1.1229, 1.3847, 1.8035, 1.7479, 1.1104, 0.8419, 1.4506, 1.3807, 2.4658, 2.0235, 1.519, 1.071, 1.397, 1.2364, 2.1696, 2.3969, 2.1531, 2.296, 1.2386, 1.4491];
const errRaw = rawData.map((v,i) => parseFloat((v - obsData[i]).toFixed(1)));
const errM4 = m4Data.map((v,i) => parseFloat((v - obsData[i]).toFixed(1)));
const medFk = (() => { const s=[...fkData].sort((a,b)=>a-b); const m=Math.floor(s.length/2); return s.length%2?s[m]:(s[m-1]+s[m])/2; })();
/* PROGRESS */
function updateProgress() {
const pct = Math.round((window.scrollY/(document.body.scrollHeight-window.innerHeight))*100)||0;
document.getElementById('progBar').style.width = pct+'%';
document.getElementById('progPct').textContent = pct+'%';
updateToc();
}
window.addEventListener('scroll', updateProgress, {passive:true});
/* TOC */
function updateToc() {
const secs = document.querySelectorAll('section[id],div[id]');
const links = document.querySelectorAll('.toc-link');
let active = '';
secs.forEach(s => { if(s.getBoundingClientRect().top &lt; 120) active = s.id; });
links.forEach(l => {
const href = l.getAttribute('href').slice(1);
l.classList.toggle('active', href === active);
});
}
function toggleToc() {
const toc = document.getElementById('tocFloat');
toc.classList.toggle('collapsed');
// Save state
try { localStorage.setItem('tocCollapsed', toc.classList.contains('collapsed')); } catch(e){}
}
function toggleTocMobile() {
const toc = document.getElementById('tocFloat');
toc.style.display = toc.style.display === 'block' ? 'none' : 'block';
}
// Restore collapse state
(function(){
try {
if(localStorage.getItem('tocCollapsed') === 'true') {
document.getElementById('tocFloat').classList.add('collapsed');
}
} catch(e){}
})();
/* FILL TABLE */
const tbody = document.getElementById('tblBody');
const rowData = [
[1998,62.8,1.677,105.3,86.1], [1999,71.0,1.298,92.2,93.1],
[2000,75.4,1.303,98.3,101.0], [2001,66.4,1.262,83.8,78.9],
[2002,64.6,1.471,95.0,119.8], [2003,70.6,1.978,139.6,119.8],
[2004,89.3,1.523,136.0,136.1], [2005,63.4,1.013,64.2,62.2],
[2006,76.1,1.123,85.5,80.0], [2007,70.7,1.385,97.9,109.3],
[2008,82.7,1.804,149.1,116.2], [2009,58.3,1.748,101.9,105.2],
[2010,81.5,1.110,90.5,90.5], [2011,161.3,0.842,135.8,113.0],
[2012,64.8,1.451,94.0,92.4], [2013,74.6,1.381,103.0,118.2],
[2014,67.2,2.466,165.7,117.5], [2015,53.1,2.024,107.4,98.9],
[2016,71.1,1.519,108.0,108.0], [2017,92.9,1.071,99.5,111.8],
[2018,72.8,1.397,101.7,112.1], [2019,67.9,1.236,84.0,70.5],
[2020,57.2,2.170,124.1,122.1], [2021,105.2,2.397,252.2,249.0],
[2022,62.7,2.153,135.0,120.8], [2023,57.1,2.296,131.1,127.6],
[2024,103.1,1.239,127.7,148.4], [2025,63.9,1.449,92.6,84.4]
];
rowData.forEach(([yr,raw,fk,m4,obs]) => {
const er = parseFloat((raw-obs).toFixed(1));
const em = parseFloat((m4-obs).toFixed(1));
const tr = document.createElement('tr');
tr.innerHTML = `&lt;td>${yr}&lt;/td>
&lt;td class="${er&lt;0?'neg':'pos'}">${raw}&lt;/td>
&lt;td style="color:#6D28D9;font-weight:600;">${fk.toFixed(3)}&lt;/td>
&lt;td class="${Math.abs(em)&lt;15?'good':''}">${m4}&lt;/td>
&lt;td>${obs}&lt;/td>
&lt;td class="${er&lt;0?'bad':'pos'}">${er>0?'+':''}${er}&lt;/td>
&lt;td class="${Math.abs(em)&lt;15?'good':'bad'}">${em>0?'+':''}${em}&lt;/td>`;
tbody.appendChild(tr);
});
/* CHARTS */
const CH = {};
function buildCharts() {
// ── Residual Error ──────────────────────────────────────────
const ctx1 = document.getElementById('chartResidual');
if(ctx1 &amp;&amp; !CH.r) {
ctx1.height = 240;
CH.r = new Chart(ctx1, {
type:'bar',
data:{
labels: years,
datasets:[
{label:'Error GPM Raw', data:errRaw, backgroundColor:'rgba(185,28,28,0.72)', borderRadius:3},
{label:'Error GPM M4', data:errM4, backgroundColor:'rgba(26,82,118,0.78)', borderRadius:3},
{type:'line', label:'Zona +10mm', data:Array(28).fill(10),
borderColor:'rgba(29,111,66,0.5)', borderWidth:1.5, borderDash:[5,4], pointRadius:0, fill:false},
{type:'line', label:'Zona -10mm', data:Array(28).fill(-10),
borderColor:'rgba(29,111,66,0.5)', borderWidth:1.5, borderDash:[5,4], pointRadius:0, fill:'-1',
backgroundColor:'rgba(29,111,66,0.08)'}
]
},
options:{
responsive:true, maintainAspectRatio:false,
plugins:{
legend:{display:true, position:'bottom', labels:{font:{size:11}, usePointStyle:true,
filter: item => !item.text.startsWith('Zona')}},
tooltip:{callbacks:{label:c => {
if(c.dataset.label.startsWith('Zona')) return null;
const sign = c.raw > 0 ? '+' : '';
return c.dataset.label + ': ' + sign + c.raw + ' mm';
}}}
},
scales:{
x:{ticks:{font:{size:10}, maxRotation:60, autoSkip:false}, grid:{display:false}},
y:{title:{display:true, text:'Error (mm)'}, ticks:{font:{size:11}},
grid:{color:'rgba(0,0,0,0.06)'}}
},
animation:{duration:700}
}
});
}
// ── Metrik Validasi ─────────────────────────────────────────
const ctx2 = document.getElementById('chartMetrik');
if(ctx2 &amp;&amp; !CH.m) {
ctx2.height = 280;
CH.m = new Chart(ctx2, {
type:'bar',
data:{
labels:['R (Korelasi)', 'R² (Determinasi)', 'NSE (Nash-Sutcliffe)', 'KGE (Kling-Gupta)'],
datasets:[
{label:'GPM Raw', data:[0.373,0.139,-1.062,0.206], backgroundColor:'rgba(185,28,28,0.75)', borderRadius:4},
{label:'GPM M4', data:[0.900,0.811, 0.772, 0.879], backgroundColor:'rgba(26,82,118,0.80)', borderRadius:4},
{type:'line', label:'Threshold SB (0.75)', data:[0.75,0.75,0.75,0.75],
borderColor:'#1d6f42', borderWidth:2, borderDash:[6,4], pointRadius:0, fill:false}
]
},
options:{
responsive:true, maintainAspectRatio:false,
plugins:{
legend:{position:'bottom', labels:{font:{size:11}, usePointStyle:true}},
tooltip:{callbacks:{label:c => c.dataset.label + ': ' + Number(c.raw).toFixed(3)}}
},
scales:{
x:{ticks:{font:{size:11}}, grid:{display:false}},
y:{min:-1.2, max:1.05, title:{display:true, text:'Nilai Metrik'}, ticks:{font:{size:11}}}
},
animation:{duration:800}
}
});
}
// ── Faktor Koreksi Fk ───────────────────────────────────────
const ctx3 = document.getElementById('chartFk');
if(ctx3 &amp;&amp; !CH.fk) {
ctx3.height = 260;
const medLabel = 'Median Fk (' + medFk.toFixed(3) + ')';
CH.fk = new Chart(ctx3, {
type:'bar',
data:{
labels: years,
datasets:[
{label:'Fk per tahun', data:fkData, backgroundColor:'rgba(109,40,217,0.75)', borderRadius:3},
{type:'line', label: medLabel, data:Array(28).fill(medFk),
borderColor:'#6D28D9', borderWidth:2, borderDash:[6,4], pointRadius:0, fill:false},
{type:'line', label:'Fk = 1.0', data:Array(28).fill(1.0),
borderColor:'#94a3b8', borderWidth:1.5, borderDash:[3,3], pointRadius:0, fill:false}
]
},
options:{
responsive:true, maintainAspectRatio:false,
plugins:{
legend:{display:false},
tooltip:{callbacks:{label:c => {
if(c.datasetIndex === 0) return 'Fk: ' + Number(c.raw).toFixed(3);
return c.dataset.label;
}}}
},
scales:{
x:{ticks:{font:{size:10}, maxRotation:60, autoSkip:false}, grid:{display:false}},
y:{min:0, max:2.85, title:{display:true, text:'Fk (-)'}, ticks:{font:{size:11}}}
},
animation:{duration:700}
}
});
}
}
/* INTERSECTION OBSERVER */
const io = new IntersectionObserver(entries => {
entries.forEach(e => {
if(e.isIntersecting) {
e.target.classList.add('visible');
buildCharts();
}
});
}, {threshold:0.01, rootMargin:'0px 0px -10px 0px'});
document.querySelectorAll('.anim-in').forEach(el => io.observe(el));
// Fallback: build charts immediately in case IO doesn't fire (iframe context)
setTimeout(buildCharts, 400);
/* COPY */
function copyCode(btn) {
const text = btn.closest('.code-wrap').querySelector('pre').innerText;
navigator.clipboard.writeText(text).then(() => {
btn.textContent='✓ Tersalin!';
setTimeout(()=>btn.textContent='Salin',2000);
});
}
updateProgress();
buildCharts();
&lt;/script></description></item></channel></rss>