4. Mendapatkan data masukan (Google Earth Engine / HEC-GeoHMS)
Anda tidak harus sudah memiliki dataset DEM/arah-aliran/tutupan-lahan/curah-hujan. Ada dua tool untuk alur “mengambil data nyata untuk DAS dan kejadian nyata”:
4a. vflood-gee — membuat pipeline GEE Code Editor yang siap dipakai
vflood-gee rokan15s --bbox 99.70,0.07,101.32,1.93 \
--event-start 2023-12-15 --event-end 2023-12-27 --outdir gee-scripts/Tool ini menulis 01_topo.js, 02_landcover.js, 03_rainfall_event.js — tempel masing-masing ke
code.earthengine.google.com (opens in a new tab), jalankan, lalu di tab Tasks → Run All, dan download hasil ekspor dari Google Drive.
Perlu dicatat: tool ini tidak memanggil Earth Engine secara langsung (tidak ada autentikasi interaktif di lingkungan ini). Tool hanya menghasilkan teks skrip.
Pilihan dataset mengikuti konvensi basin-atlas yang sudah tervalidasi:
- MERIT DEM (atau jika memakai
--dem-source hydrosheds_conditioneduntuk DEM HydroSHEDS yang sudah dikondisikan secara hidrologis) - ESA WorldCover untuk land cover
- GPM IMERG V07 untuk curah hujan (dikumpulkan menjadi harian — lihat penjelasan di bawah)
04_evapotranspiration.js (MODIS MOD16A2GF, komposit 8 hari) tidak ditulis kecuali --include-evapotranspiration diberikan — belum ada importer PET.txt untuk feed data itu ke sisi VFlood-RRI. Jadi default-nya belum ada “tempat” untuk PET.
Dua bug nyata yang ditemukan dari skrip referensi yang divalidasi manual dan diperbaiki di sini (bukan sekadar menyalin):
Map.centerObject(ROI, zoom)bisa memicu bug centroid Earth Engine pada beberapa geometri — semua script di sini memakaiMap.setCenter(lon, lat, zoom)alih-alihnya, dengan pusat (center) dihitung di Python dari bbox.- Membuat daftar gambar per hari dengan client-side
forloop dan memanggil.getInfo()sekali per iterasi adalah anti-pattern yang rapuh/lambat di Earth Engine dan bisa memicu quota request atau berperilaku tak konsisten pada event yang lebih panjang.
03_rainfall_event.js membangun daftar per hari menggunakan server-side ee.List.sequence(...).map(...) dan mengekspor seluruh window event sebagai satu multi-band GeoTIFF (satu band per hari, dinamai rain_YYYYMMDD), bukan satu task per hari.
Kebenaran satuan, diperiksa bukan diasumsikan: band precipitation milik IMERG adalah laju (mm/hr) yang dilaporkan tiap 30 menit, bukan akumulasi kedalaman total. Menjumlahkan 48 nilai half-hourly untuk satu hari akan meng-overcount kedalaman sebenarnya. 03_rainfall_event.js menjumlahkan curah harian lalu mengoreksi dengan mengalikan faktor 0.5 untuk mendapatkan kedalaman harian yang benar.
Secara aljabar ini sama dengan metode resmi NASA (mean rate × 24 jam). Koreksi ini diverifikasi terhadap dua deskripsi independen, bukan asumsi.
Hasilnya diumpankan ke sisi import via geo_import.geotiff_multiband_stack_to_raindat pada langkah import (lihat §4c) — satu file multi-band, bukan daftar file single-band.
Catatan penting DEM/flow-network: 01_topo.js default-nya hanya mengekspor DEM pada resolusi native sebenarnya (~90m/3 arc-sec; kontrol lewat --dem-scale, default mengikuti --dem-source yang dipilih). Tidak mengekspor flow direction/accumulation milik GEE.
Ini disengaja, karena flow direction/accumulation dari GEE (mis. WWF/HydroSHEDS/15DIR/15ACC) selalu diturunkan dari surface elevation HydroSHEDS yang terkondisi, sementara DEM bisa berasal dari sumber lain (--dem-source merit). Mencampur keduanya bisa membuat routing memakai representasi medan yang tidak konsisten (salah secara diam-diam di pit/flat/reach boundaries).
Jalur rekomendasi: turunkan flow direction/accumulation secara lokal dari DEM yang sama yang di-download, lewat vflood-import terrain/pysheds (§4c) atau VFloodPrep Tab 2 (§4e). Ini memastikan konsistensi.
Kalau Anda benar-benar ingin membandingkan dengan network GEE, gunakan --include-gee-flow-network untuk mengekspor 15DIR/15ACC juga.
4b. vflood-import — konversi GeoTIFF menjadi format VFlood-RRI
vflood-import raster dem.tif --as dem --out topo/adem.txt
vflood-import raster dir.tif --as dir --out topo/adir.txt --hydrosheds
vflood-import raster acc.tif --as acc --out topo/acc_15s.txt
vflood-import raster landcover.tif --as landuse --out topo/landuse.txt
vflood-import rain day000.tif day001.tif ... --out rain/rain.dat
vflood-import rain-geotiff-stack rain_stack.tif --out rain/rain.dat--hydroshedsmemetakan kode sink internal HydroSHEDS (byte 255) menjadi nilai -1 seperti yang dicek oleh VFlood-RRI.--as landusejuga mencetak tabel saran parameter Manning’s-n berdasarkan kelas land-cover.vflood-import rainmengimplementasikan konvensi harian→per-halamanrain.datmilik RRI secara persis (dividing default--divide 24membagi 1 hari rata-rata menjadi mm/h).vflood-import rain-geotiff-stacksama, tapi untuk satu multi-band GeoTIFF (satu band per hari).
Path vflood-import raster juga bekerja untuk output delineation HEC-GeoHMS/ArcHydro karena keduanya menggunakan encoding D8 ESRI yang sama.
4c. Sumber data Indonesia (DEMNAS/BATNAS, NetCDF curah hujan satelit, VRain)
Bagian ini ada berdampingan dengan jalur §4 (GEE/HEC-GeoHMS) — tetap memakai vflood-import command yang sama, hanya subcommand yang berbeda.
vflood-import terrain — turunkan flow-direction/accumulation lokal dari DEMNAS/BATNAS
vflood-import terrain demnas_8m.tif --outdir topo/Melakukan pit-filling, depression-filling, D8 flow-direction, dan flow-accumulation langsung dari DEM (via pysheds) lalu menulis dem.txt/dir.txt/acc.txt.
vflood-import terrain juga bisa melewatkan pit filling kalau Anda sudah mengkondisikan DEM sendiri via --no-fill-pits.
vflood-import rain-netcdf — curah hujan satelit NetCDF gridded → rain.dat
vflood-import rain-netcdf chirps_daily.nc --out rain/rain.datMembaca file pada resolusi grid native-nya (tidak ada remapping saat import) dan mencetak corner/cellsize yang lalu Anda copy ke RRI_Input.txt (kolom xllcorner_rain/yllcorner_rain/cellsize_rain).
VFlood-RRI akan melakukan remapping ke grid model pada waktu run.
Auto-detect nama variabel/dimensi & satuan dilakukan berdasarkan metadata file; jika auto-detect salah, set secara eksplisit pakai --var/--lat-dim/--lon-dim/--time-dim/--units.
vflood-import rain-vrain — output stasiun VRain (Thiessen-weighted) → rain.dat
vflood-import rain-vrain manifest.csv --out rain/rain.dat --extent-from RRI_Input.txtMembaca manifest gaya VRain (Station,X,Y,DailyFile,SubDailyFile,AMSFile) dan data CSV tiap stasiun (Time,Rain atau Date,Rain), kemudian membangun multi-gauge rain.dat pada resolusi grid model. Nilai tiap sel diambil dari stasiun yang poligon Thiessennya mengandung titik pusat sel (--method thiessen, default), dengan fallback --method nearest jika hanya ada 1–2 stasiun.
Ini menggantikan keterbatasan utilitas asli yang hanya mendukung satu gauge untuk seluruh DAS.
4d. vflood-import init — satu DEM masuk, proyek siap dijalankan keluar
Jika Anda menggunakan jalur-jalur di atas, Anda masih perlu mengedit RRI_Input.txt dan menyamakan grid tiap input secara manual. Subcommand init menutup gap itu.
Berikan DEM mentah (mis. HydroSHEDS/DEMNAS/BATNAS tile) plus sumber curah hujan, lalu vflood-import init menurunkan terrain, melakukan resampling curah hujan ke grid DEM, dan menulis RRI_Input.txt lengkap dalam satu kali panggilan.
vflood-import init dem.tif --rain-netcdf chirps_daily.nc --outdir project/
vflood-import init dem.tif --rain-geotiffs day000.tif day001.tif ... --outdir project/
vflood-import init dem.tif --rain-netcdf gsmap.nc --landuse worldcover.tif --outdir project/
vflood-rri project/RRI_Input.txt # langsung dijalankanDEM adalah jangkar (“patokan”). Semua input lain dirisample ke extent/cellsize (ny, nx) persis DEM lewat grid_align.resample_to_grid (menggunakan rasterio.warp.reproject: bilinear untuk rainfall/elevation, nearest untuk data kategorikal land-use agar kode kelas tidak “diaveraging” tanpa makna).
Output yang ditulis di dalam --outdir:
topo/dem.txt,topo/dir.txt,topo/acc.txttopo/landuse.txt(jika--landusediberikan)rain/rain.dat(resampled ke grid DEM)RRI_Input.txt(writer baru:config.write_rri_input, setara urutan field seperti RRI)
Catatan: parameter hidrolik yang dipakai adalah placeholder yang generik dan konservatif, bukan hasil kalibrasi.
Pilihan penting:
--outdir <path> required: folder proyek
--rain-netcdf <file.nc> gridded rainfall NetCDF (tepat satu dari --rain-* di bawah)
--rain-geotiffs <file1.tif> <file2.tif> ... urutan GeoTIFF single-band (satu per hari)
--rain-geotiff-stack <file.tif> ONE multi-band GeoTIFF (satu band per hari)
--rain-units mm|mm/h|mm/day --rain-netcdf only (default: auto-detect)
--rain-var <name> --rain-netcdf only: nama variabel rainfall
--divide 24.0 / --seconds-per-band 86400.0
--landuse <file.tif> --scheme worldcover|klhk
--fill-pits / --no-fill-pits
--lasth <hours> --outnum <n>
--dt 30 --dt-riv 10
--dem-aggregate-factor <n> resolusi running/output: perkasar DEM dengan faktor
bilangan bulat ini sebelum menurunkan dir/accLand-locked di latlon (utm=0) seperti proyek lokal lain di manual ini.
Resolusi running/output (--dem-aggregate-factor): hasil ekspor DEM asli bisa
terlalu besar untuk dijalankan penuh (event 342 jam pada DEM ~93m 2154×2088 = 4,49 juta
sel aktif) — --dem-aggregate-factor N memperkasar DEM lewat block-average
(cara yang benar untuk mengecilkan data kontinu seperti elevasi, bukan point-sampling)
sebelum flow direction/accumulation diturunkan, supaya routing tetap konsisten
dengan resolusi apa pun yang akhirnya dipakai. Curah hujan/land-use lalu otomatis
diselaraskan ke grid yang sudah lebih kasar itu. N harus habis membagi ncols/nrows
DEM secara eksak (gagal dengan pesan error yang jelas, bukan diam-diam memotong baris/
kolom tepi — misalnya tile 2154×2088 hanya menerima faktor 1/2/3/6, karena
gcd(2154,2088)=6). Kosongkan (default) untuk menjalankan pada resolusi native DEM.
Tersedia di Tab 2 VFloodPrep (§4e) sebagai field "Running/output resolution factor"
di bagian Advanced.
4e. vflood-prep (VFloodPrep) — GUI desktop untuk §4/§4d
vflood-prepMembuka jendela dua tab yang membungkus vflood-gee dan vflood-import init di balik sebuah form.
- Tab 1 — Acquire Data (GEE): nama DAS, bbox, event start/end, pilihan sumber DEM, dan opsi menulis
04_evapotranspiration.js(default off).

- Tab 2 — Build VFlood-RRI Project: pilih DEM GeoTIFF hasil download dan sumber hujan (multi-band stack default), serta opsi land-cover.

Keterangan: implementasi ini mengeksekusi logika yang sama persis seperti CLI (generate script lalu proses apa yang kembali), tidak menambah logika baru.
4f. vflood-control (VFloodControl) — orkestrasi seluruh pipeline
vflood-controlMenghubungkan akhir §4e dengan tahap ekspor/NetCDF/analyze menjadi satu alur melalui satu jendela GUI:
- 0. Prepare data (opsional): membuka embedded VFloodPrep di dalam proses yang sama.
- 1. Check Inputs: validasi
validate.validate_projectterhadapRRI_Input.txtyang di-load. - 2. Run: menjalankan simulasi via
cli.run_projectdalam background thread dengan log langsung; bisa di-cancel. - 3. Post-process: menjalankan
vflood-export/vflood-netcdf/vflood-analyzesebagai subprocess nyata.

VFloodControl tidak menambah logika fisika/format/GIS baru—semua tahap hanya memanggil code yang sudah teruji atau CLI yang sudah didokumentasikan.
4g. Masking DAS dan penempatan checkpoint otomatis (watershed.py)
Ekspor DEM rectangular (default VFloodPrep — bbox dari GEE/HEC-GeoHMS selalu berbentuk kotak) bukan berarti sudah menjadi DAS yang terdelineasi. RRI sendiri tidak mensyaratkan itu — mekanisme domain=0/1/2 di RRI.f90:228-245 sudah mentolerir banyak sel "outlet" batas terbuka sekaligus, di mana pun jalur aliran mencapai tepi rectangle atau sink internal, dan indexing.py/kernels/river.py di VFlood-RRI mereplikasi ini persis. Yang tidak didapat dari rectangle mentah: (1) inflow dari area upstream di luar kotak tidak ikut terhitung, dan (2) setiap sungai yang kepotong tepi kotak jadi "outlet" buatan sendiri, tidak mewakili kondisi hilir yang nyata. watershed.py mempersempit domain hanya ke sel yang benar-benar mengalir ke satu atau beberapa muara sungai nyata — tersedia lewat vflood-import init (§4d):
vflood-import init dem.tif --rain-geotiff-stack rain_stack.tif --outdir project/ \
--auto-mask-outlets --max-outlets 1 --auto-locations 0,0.5,1Masking (pilih maksimal satu):
--auto-mask-outlets— tanpa polygon/koordinat: mencari sel tepi domain dengan akumulasi aliran tertinggi lalu mask ke catchment-nya.--max-outlets Nmembatasi jumlah outlet yang dipertimbangkan —1untuk studi satu DAS, lebih tinggi untuk studi regional.--pour-point lon,lat(bisa diulang) — mask ke catchment yang mengalir ke titik tertentu, di-snap otomatis ke sel channel akumulasi tertinggi terdekat — mirip "smart outlet placement" milik proyek sejenis VBasinFlow, diimplementasikan ulang secara independen di sini. Tombol "Pick Outlet(s)..." di VFloodPrep mengisi ini secara interaktif — tanpa map canvas, sesederhana mungkin: tabel kandidat auto-detect (deteksi yang sama dengan--auto-mask-outlets, luas area terbesar dulu), pilih satu atau lebih.--catchment-boundary boundary.geojson— mask ke polygon yang sudah ada (batas DAS resmi BIG/BWS, atau hasil ekspor dari tool delineasi khusus seperti VBasinFlow) — direproyeksi otomatis ke EPSG:4326 kalau sumbernya UTM/projected.
Sel yang termask diberi nilai nodata DEM (dipaksa <= -100.0) — klasifikasi domain RRI sendiri (zs > -100.0) yang benar-benar mengecualikannya dari simulasi, jadi tidak perlu logika domain baru sama sekali di sisi simulasi. Diterapkan sebelum resampling --dem-aggregate-factor (§4d) supaya batas masking tetap presisi. Pada DEM GEE nyata 2154×2088 (basin Sesayap, sudah di-aggregate 6x), masking ke outlet dominan tunggal memangkas 124.834 sel rectangular menjadi 41.711 sel aktif — masking dan resolusi adalah dua tuas independen yang saling melengkapi.
Penempatan checkpoint otomatis, independen dari masking: --auto-locations 0,0.5,1 menulis location.txt dari posisi fraksional di sepanjang main channel tiap outlet yang terdeteksi — 0=titik paling hulu, 1=outlet, berdasarkan jarak geodesik nyata. Main channel ditelusuri ke hulu dari outlet, selalu mengikuti cabang dengan akumulasi aliran lebih besar di tiap pertemuan sungai. Satu outlet -> basin_f0.00/basin_f0.50/basin_f1.00; beberapa (studi regional) -> basin1_f0.00, basin2_f0.00, dst. Otomatis set hydro_switch=1.
Studi regional multi-DAS (provinsi dengan beberapa sistem sungai terpisah, seperti banjir Aceh/Sumut November 2025): karena mekanisme domain RRI sudah menangani banyak outlet sekaligus secara native, satu run dengan bbox lebar mencakup seluruh region mensimulasikan semua sistem sungai di dalamnya sekaligus, masing-masing dengan hidrograf terpisah namanya — tanpa perlu pemisahan DAS atau coupling multi-run. Gabungkan dengan --dem-aggregate-factor (§4d) untuk resolusi running yang realistis di skala itu.
Tersedia juga sebagai library langsung (from vflood_rri import watershed) — juga tersedia di GUI VFloodPrep (Tab 2) sebagai bagian "Catchment masking".
4h. Spin-up curah hujan antecedent (scaffold_project_with_spinup)
Model yang mulai dari kondisi kering total (hs=hr=0 di t=0) bisa under-estimate puncak banjir sebenarnya kalau tidak ada memori kelembaban tanah/baseflow. vflood-import init-with-spinup menutup gap ini — bukan dengan import dataset soil moisture eksternal (SMAP/GLDAS/ERA5-Land ada di GEE, tapi tidak ada pemetaan 1:1 tervalidasi ke state RRI sendiri), tapi dengan benar-benar menjalankan simulasi pemanasan pada curah hujan antecedent nyata, lalu mengumpankan state akhirnya ke run event yang sebenarnya:
vflood-import init-with-spinup dem.tif --rain-geotiff-stack combined_rain.tif \
--spinup-days 10 --outdir project/
vflood-rri project/event/RRI_Input.txt # run event sebenarnya, sudah warm-started--rain-geotiff-stack adalah satu download gabungan mencakup periode pemanasan dan event; --spinup-days N menentukan berapa band terdepan adalah pemanasan. Proyek spin-up dijalankan lebih dulu (lasth dipaksa persis spinup_days*24 jam), lalu proyek event di-scaffold dengan init_slo_switch=1/init_riv_switch=1 merujuk output akhir spin-up — lasth proyek event tetap durasi event itu sendiri, tidak pernah diperpanjang oleh spin-up. --no-run-spinup men-scaffold keduanya tanpa menjalankan spin-up. Tab 2 VFloodPrep punya kemampuan yang sama sebagai checkbox "Antecedent rainfall spin-up" + field jumlah hari.