VBasin
Rekonsiliasi alur sungai hasil delineasi DEM terhadap alur sungai aktual.
VBasin juga mencakup pemodelan HEC-HMS dan analisis rekayasa koridor sungai: penampang melintang, kapasitas Manning, stage-storage, genangan bertingkat, screening geomorfologi, serta rencana akuisisi survei.
Masalah
Jaringan sungai yang diturunkan dari DEM (DEMNAS, HydroSHEDS, SRTM, NASADEM) sering tidak berimpit dengan alur sungai sebenarnya. Penyebab tersering:
| Penyebab | Gejala |
|---|---|
| Relief datar di dataran banjir | alur "melompat" ke lembah tetangga |
| Kawasan padat bangunan | DSM membaca atap, alur sempit hilang total |
| Jembatan & gorong-gorong | alur terpotong, muncul cekungan palsu |
| Resolusi kasar (30–90 m) | sungai < 1 sel tidak terwakili |
| Tanggul & sudetan | DEM lama tidak memuat geometri baru |
Akibatnya batas sub-DAS salah, luas DAS salah, dan model hidrologi tidak dapat mereproduksi banjir di lokasi yang benar.
Cara kerja
alur referensi (OSM / digitasi) ──┐
├─→ stream burning ─→ D8 ─→ validasi ─→ kalibrasi
DEM (DEMNAS / dll) ──┘- Ambil alur aktual dari OpenStreetMap (Overpass API) atau file vektor hasil digitasi/pengukuran sendiri.
- Rekondisi DEM (stream burning) agar aliran terkunci mengikuti alur itu.
- Delineasi ulang D8: kondisioning, arah aliran, akumulasi, jaringan, DAS.
- Validasi kuantitatif — seberapa dekat alur hasil dengan alur referensi.
- Kalibrasi — sweep parameter burning, pilih yang memaksimalkan kecocokan.
Metode burning
agree — metode AGREE (Hellweger, 1997), standar de-facto. Elevasi di
dalam zona penyangga diinterpolasi linier antara dasar alur dan DEM asli:
w = clip(jarak_ke_alur / lebar_buffer, 0, 1)
z_baru = (z_alur − smooth_drop)·(1 − w) + z_asli·w
z_baru[sel alur] = z_alur − smooth_drop − sharp_dropsimple — hanya menurunkan sel alur sebesar sharp_drop. Cepat, tetapi
menciptakan tebing vertikal sehingga lereng di tepi sungai tidak realistis.
Profil dasar alur (bed_profile)
Menentukan dari mana elevasi dasar alur diambil sebelum diturunkan. Ini yang menentukan apakah kemiringan dasar hasilnya berarti atau tidak.
| Nilai | Perilaku |
|---|---|
none | pakai elevasi DEM apa adanya — mewarisi seluruh derau (atap, jembatan) |
monotonic | buang cekungan dengan menaikkannya — profil jadi tangga |
interpolate | rekonstruksi dua tahap (di bawah) — profil mulus |
Mode interpolate bekerja atas dasar bahwa keandalan DEM tidak seragam:
- Ukur kedalaman gerusan tiap sel alur = elevasi latar sekitar − elevasi sel. Besar = alur benar-benar tergerus dan dasar DEM mendekati dasar sungai; ~0 = alur tidak terbaca DEM sama sekali.
- Tetapkan jangkar. Sel yang tergerus dijadikan jangkar. Penilaian dilakukan per-ruas (median berjalan sepanjang alur), bukan per-sel — tanpa itu satu sel yang kebetulan rendah karena derau akan lolos jadi jangkar palsu dan menyeret profil. Mask jangkar juga dierosi sejauh radius penaksiran karena estimator gerusan "bocor" di batas peralihan.
- Rapikan jangkar dengan regresi isotonik berbobot agar monoton menurun ke hilir.
- Interpolasi lurus antar jangkar untuk ruas yang tidak andal. Regresi isotonik saja menghasilkan tangga; tahap inilah yang membuat kemiringan konstan per ruas.
Kedua ujung ruas selalu dijadikan jangkar (elevasinya diambil sebagai nilai DEM terendah pada ~100 m pertama/terakhir alur, jadi tahan terhadap atap bangunan yang kebetulan di garis alur). Tanpa itu, ruas di luar rentang jangkar harus diekstrapolasi dari kemiringan blok jangkar terdekat — dan pada ruas panjang itu meledak; versi awal sempat menghasilkan dasar −13 m di outlet.
Untuk anak sungai, selalu isi profile_upstream. Tanpa itu, lintasan
terpanjang dari outlet bisa naik ke sungai induk sehingga kemiringan yang
dilaporkan bukan milik ruas yang dimaksud.
Keluaran menyertakan bed_anchored_fraction — porsi panjang alur yang benar-
benar berjangkar pada DEM. Bacalah angka ini sebelum memakai kemiringannya.
Bila kecil, kemiringan yang dilaporkan didominasi interpolasi, bukan data.
Metrik validasi
Analogi klasifikasi biner dengan toleransi jarak (default 50 m):
- correctness — fraksi panjang alur hasil delineasi yang berada dalam toleransi dari alur referensi. Rendah = model mengarang alur.
- completeness — fraksi panjang alur referensi yang berhasil direproduksi. Rendah = alur nyata tidak tertangkap.
- F1 — harmonik keduanya, dipakai sebagai fungsi objektif kalibrasi.
- simpangan — median / p90 / maks jarak alur hasil ke alur referensi.
Agar adil, opsi match_length menyetel ambang akumulasi secara otomatis
sehingga panjang jaringan hasil ≈ panjang jaringan referensi. Tanpa itu,
membandingkan jaringan rapat dengan referensi OSM yang jarang akan menghasilkan
correctness rendah secara artifisial.
Membatasi wilayah penilaian. Kalau yang dipermasalahkan hanya satu ruas,
metrik untuk seluruh AOI akan encer — anak-anak sungai di perbukitan yang tidak
terpetakan OSM ikut menekan skor. Gunakan focus (poligon) atau focus_bbox
untuk membatasi wilayah penilaian. Jaraknya tetap diukur ke seluruh jaringan
referensi, jadi alur di tepi region tidak dihukum secara palsu.
Coba cepat — data demo
Tanpa DEM sendiri dan tanpa internet:
python generate_demo_data.py # bangkitkan DAS sintetis 6 x 8 km
python run_demo.py # bandingkan tanpa vs dengan rekondisiData demo mereproduksi persis masalahnya: anak sungai K. Demo turun dari perbukitan, lalu ruas tengahnya (54 % panjangnya) tertimbun di dataran padat bangunan. Ditambah sebuah cekungan dangkal pesaing yang menarik aliran ke sungai induk jauh di hilir — mekanisme yang sama dengan K. Celeng yang alirannya dibelokkan ke K. Opak.
Karena datanya dibangkitkan sendiri, dasar sungai yang sebenarnya diketahui, sehingga hasilnya dapat dinilai secara obyektif:
| Tanpa rekondisi | Burn AGREE | |
|---|---|---|
| F1 kecocokan alur | 0,621 | 0,878 |
| Simpangan median | 10 m | 0 m |
| DAS di outlet | 6,89 km² | 11,08 km² |
| Kemiringan dasar | — | 21,04 m/km (sebenarnya 21,01 — meleset 0,1 %) |
| Galat elevasi dasar | 33,4 m | 19,6 m (−41 %) |
Perhatikan dua hal sekaligus: kemiringan dasar terpulihkan nyaris tepat, tetapi
elevasi dasar absolut di ruas tertimbun tetap meleset ~20 m — di situ DEM
memang tidak memuat informasi apa pun, dan hanya separuh ruas yang berjangkar.
Itulah gunanya membaca bed_anchored_fraction sebelum memakai angkanya.
Berkas demo: data/dem_demo.tif, data/sungai_referensi.gpkg,
data/dasar_sebenarnya.csv, config_demo.yaml.
Pemakaian
pip install -r requirements.txt
# 1. Unduh alur sungai OSM (bbox lon/lat)
python main.py fetch --bbox 110.33 -7.99 110.46 -7.88 --out rivers_osm.gpkg
# 2. Delineasi dengan stream burning
python main.py run --config config_celeng.yaml
# 3. Kalibrasi parameter burning
python main.py calibrate --config config_celeng.yamlAntarmuka grafis
conda activate vempi_dosen # env yang punya PyQt5 (sama dengan VBasin)
python gui.pyAlur kerja di jendela: muat DEM → ambil alur referensi → klik outlet & ujung hulu langsung di peta → jalankan. Hasilnya tampil sebagai peta, profil memanjang dasar alur, tabel metrik, dan log. Tombol kalibrasi menjalankan sweep di latar dan otomatis menerapkan parameter terbaik.
Menentukan titik lewat klik peta bukan sekadar kenyamanan: outlet yang meleset sedikit saja bisa menempel ke sungai induk dan membuat DAS yang dilaporkan sepenuhnya keliru.
Lihat config_celeng.yaml untuk contoh konfigurasi lengkap, dan
run_celeng.py untuk studi kasus berbasis skrip (perbandingan beberapa
skenario sekaligus).
API Python
from vstream.pipeline import RunConfig, run, export
from vstream.burn import BurnParams
cfg = RunConfig(
dem="dem.tif",
bbox=[427500, 9117500, 441000, 9129500], bbox_crs="EPSG:32749",
waterway_types=["river", "stream"],
outlet=[431650.0, 9121959.0],
burn=BurnParams(method="agree", smooth_drop=2, sharp_drop=10, buffer_cells=6),
)
res = run(cfg)
print(res.metrics.f1, res.catchment_area_km2)
export(res)Keluaran
| Berkas | Isi |
|---|---|
dem_burned.tif | DEM hasil rekondisi + kondisioning |
flow_accumulation_km2.tif | akumulasi aliran (km²) |
streams_derived.gpkg | jaringan sungai hasil delineasi |
streams_reference.gpkg | alur referensi yang dipakai |
catchment.gpkg | DAS di outlet |
profil_dasar_alur.csv | profil memanjang: chainage, z DEM, z rekonstruksi, gerusan, keandalan |
metrics.json | konfigurasi + seluruh metrik |
calibration_table.csv | tabel sweep parameter |
Studi kasus: Sub-DAS Celeng, Imogiri (Bantul, DIY)
Jalankan dengan python run_celeng.py (tambah --calibrate untuk sweep penuh).
Masalah. Alur K. Celeng di dataran Imogiri tidak terbaca DEMNAS 8 m (padat bangunan, relief datar). Delineasi D8 membelokkan aliran dari Imogiri ke barat masuk K. Opak, padahal alur sebenarnya menerus ke selatan menuju K. Oyo.
Hasil — outlet uji di K. Celeng, ±1 km di hulu tempuran dengan K. Oyo; penilaian metrik dibatasi ke koridor Celeng:
| Skenario | correctness | completeness | F1 | median simpangan | DAS di outlet |
|---|---|---|---|---|---|
| A. Baseline (tanpa burning) | 36% | 48% | 0,411 | 135 m | 0,09 km² |
| B. Burn — dasar monoton | 65% | 92% | 0,763 | 0 m | 21,21 km² |
| C. Burn — dasar interpolasi | 65% | 92% | 0,763 | 0 m | 21,21 km² |
Mode dasar alur tidak mengubah hasil routing (B dan C identik) — begitu alur di-burn cukup dalam, aliran mengikutinya apa pun profil dasarnya. Yang berubah adalah apakah kemiringan dasar hasilnya bisa dipakai.
Angka 0,09 km² pada baseline adalah inti masalahnya: DEM sama sekali tidak mengalirkan air melalui titik itu. Setelah burning, DAS menjadi ~21 km² dengan bentuk yang benar — memanjang ke timur sampai perbukitan Wukirsari.
Kemiringan dasar K. Celeng — hasilnya justru sebuah peringatan. Pada ruas 4,45 km dari outlet ke hulu (K. Celeng versi OSM), rekonstruksi menghasilkan S = 2,25 m/km, tetapi hanya 7% panjang ruas yang berjangkar pada DEM. Artinya DEMNAS praktis tidak memuat informasi dasar sungai di dataran Imogiri, dan angka kemiringan itu hampir seluruhnya interpolasi antara dua ujung. Ini bukan kegagalan metode — justru inilah nilainya: ketidakpastian yang selama ini tersembunyi kini terukur. Kesimpulannya tegas: kemiringan dasar K. Celeng tidak bisa diperoleh dari DEM, harus diukur.
Tiga catatan lain dari studi kasus ini:
-
OSM ternyata memuat K. Celeng (way 575603029, tanpa nama, 4,37 km). Dibandingkan hasil digitasi manual dari citra satelit, simpangan mediannya 55 m — dua sumber independen saling menguatkan.
-
Skenario C tidak lebih baik dari B. Menambahkan jejak citra sebagai referensi kedua untuk alur yang sama justru menurunkan F1, karena kedua garis berbeda ~55 m sehingga referensinya sendiri menjadi ambigu. Untuk satu alur, pakai satu sumber referensi yang paling dipercaya.
-
sharp_dropharus cukup dalam. Dari sweep 37 kombinasi:sharp_dropDAS rata-rata F1 rata-rata 2 m 11,8 km² 0,532 5 m 16,7 km² 0,591 10 m 21,4 km² 0,612 20 m 21,4 km² 0,621 Di bawah 10 m, aliran masih lolos dari alur dan luas DAS runtuh (beberapa kombinasi hanya menghasilkan < 1 km²). Di atas 10 m hasilnya stabil. Kombinasi terbaik:
smooth_drop=5, sharp_drop=20, buffer_cells=3.
Delineasi jaringan — mirip HEC-GeoHMS
Setelah burn+delineasi (langkah 1-5), hasilnya (flow: arah aliran + akumulasi
terkondisi) sudah cukup untuk memecah satu DAS besar menjadi beberapa
Subbasin yang saling terhubung — persis batch-point delineation HEC-GeoHMS.
python run_network_celeng.pyatau lewat GUI: jalankan langkah 1-5, lalu di panel "6. Delineasi Jaringan"
klik "+ Titik via klik peta" dan tandai tempuran/lokasi yang ingin jadi
batas Subbasin (atau "Muat titik kontrol dari CSV" dgn format
No,Easting,Northing,Deskripsi_Sub_DAS,Ruas_Sungai), lalu "Delineasi
Jaringan". Hasilnya tampil sbg poligon berwarna di peta dan tabel parameter
di tab "Jaringan (HEC-HMS)".
Kenapa ini penting — persis kasus Sub-DAS 5 di model HEC-HMS proyek Opak: satu titik delineasi (tempuran Celeng-Oyo) menghasilkan DAS lump 875 km² yang melebur kontribusi K. Celeng dengan seluruh DAS Oyo. Model semacam itu tidak akan pernah bisa mereproduksi banjir di Imogiri karena hidrograf Celeng tenggelam oleh hidrograf Oyo yang jauh lebih besar. Uji pada AOI Celeng (4 titik kontrol) membuktikannya secara terpisah:
| Subbasin | Luas | Lag SCS |
|---|---|---|
| K. Celeng — hulu Imogiri | 13,79 km² | 59,6 menit |
| Tempuran Celeng-Oyo (lokal) | 7,56 km² | 62,3 menit |
| Tempuran Opak-Oyo (lokal) | 77,34 km² | 138,2 menit |
| Tempuran Code-Opak (lokal) | 18,02 km² | 87,6 menit |
Total 116,71 km² — sama persis dengan DAS kumulatif di titik paling hilir
(konservasi luas teruji lewat tests/test_network.py).
Algoritma
- Tiap titik kontrol di-snap ke sel alur terdekat.
- DAS kumulatif tiap titik dihitung sekali lewat adjacensi hulu yang dibangun sekali untuk seluruh titik (bukan per titik — jauh lebih efisien daripada memanggil delineasi satu-titik berulang kali).
- Topologi ditentukan lewat uji keanggotaan: titik A hilir dari titik B jika sel B ada di dalam DAS kumulatif A. Induk (downstream terdekat) B = A dengan DAS kumulatif TERKECIL yang masih memuat B.
- Luas Subbasin (lokal) = DAS kumulatif titik dikurangi gabungan DAS kumulatif seluruh anak langsungnya — sehingga antar-Subbasin tidak tumpang tindih dan totalnya sama dengan DAS kumulatif titik paling hilir.
- Reach disusuri lewat arah aliran (deterministik) dari tiap titik ke induknya.
- Morfometri per Subbasin: panjang & kemiringan alur terpanjang, alur sentroidal (proyeksi sentroid poligon ke alur terpanjang — pendekatan, bukan replikasi presis algoritma HEC-GeoHMS), kemiringan 10-85, kemiringan basin rata-rata, rasio elongasi, rasio relief, kerapatan drainase, statistik elevasi.
- Lag dihitung metode SCS/TR-55 (
Lag(jam) = L^0.8(S+1)^0.7/(1900√Y), butuh CN) atau Kirpich (0,6×Tc, tanpa CN) — dipilih di GUI/parameter.
Keluaran
network_subbasins.gpkg, network_lateral_subbasins.gpkg,
network_junctions.gpkg, network_reaches.gpkg, dan network.basin — berkas
teks bergaya HEC-HMS asli (Subbasin:/
Junction:/Reach: dengan Area:, Curve Number:, Lag:, Muskingum K/x:
dst., Canvas X/Y berisi koordinat CRS DEM sesungguhnya, sama seperti yang
dilakukan HEC-GeoHMS sendiri).
Jika keluaran pendamping dicentang, setiap layer penting juga ditulis sebagai dataset ESRI Shapefile lengkap
(.shp, .shx, .dbf, .prj, .cpg): Sub-DAS model, Sub-DAS kiri/kanan
per Reach, Reach, Junction, alur delineasi, alur referensi, catchment, dan
batas DAS raster-aligned. GPKG tetap menjadi format utama; SHP disediakan
untuk HEC-HMS dan software lama.
Batasan — baca sebelum dipakai untuk simulasi
- CN dan persen kedap seragam untuk semua Subbasin — nilai yang Anda
masukkan di GUI, bukan hasil overlay tata guna lahan. Sesuaikan per
Subbasin secara manual di
.basinsebelum disimulasikan. - Parameter Muskingum (K, x) adalah taksiran awal, bukan hasil kalibrasi. K ditaksir dari panjang reach / kecepatan asumsi (default 1 m/s); x default 0,2 (nilai umum, bukan spesifik lokasi).
- Alur sentroidal adalah pendekatan geometris (proyeksi sentroid ke garis alur terpanjang), bukan replikasi presisi algoritma HEC-GeoHMS.
- Kemiringan Reach hanya berarti sejauh ruas itu terbaca DEM — periksa
bed_anchored_fraction(tampil sbg peringatan oranye di tab Metrik bila < 30%) sebelum memakainya untuk desain.
Screening semua DAS menuju tepi DEM
Untuk tahap rekognisi saat titik outlet belum diketahui, panel 6. Delineasi Jaringan menyediakan tombol "Delineasi Semua DAS ke Tepi DEM". Algoritma melabeli setiap sel menurut outlet D8 di tepi raster yang menerimanya, dalam satu penelusuran adjacensi hulu. Hasilnya adalah:
..._screening_edge_catchments.gpkg— poligon tiap DAS;..._screening_edge_outlets.gpkgdan CSV — titik outlet serta luasnya;..._screening_edge_catchments_labels.tif— raster label seluruh DAS.
Nilai Tampilkan luas minimum hanya menyaring layer vektor; raster label tetap lengkap. Ini penting agar ambang dapat diganti tanpa menghitung ulang D8. Mode ini adalah screening topografi, bukan otomatisasi model HEC-HMS: pilih satu/beberapa outlet yang telah cocok dengan alur eksisting, batas DAS, dan verifikasi lapangan, lalu masukkan hanya titik tersebut ke Delineasi Jaringan biasa.
Membuat proses jaringan tetap responsif
Hasil inti (GeoPackage jaringan, network.basin, dan network_state.pkl)
selalu dibuat. Peta PNG, basemap, Shapefile, profil, proyek/ZIP QGIS adalah
keluaran pendamping yang jauh lebih berat; di GUI ia dicentang hanya bila
memang dibutuhkan pada proses itu. Pembuatan geometri/tabel juga dijalankan di
worker, bukan lagi ketika thread tampilan menerima hasil. Untuk menjalankan
ulang pada DEM yang sama, gunakan pasangan flow_direction.tif dan
flow_accumulation_km2.tif yang telah diekspor agar tahap D8 dilewati.
Catatan teknis penting
Stream burning memaksa, bukan memperbaiki. Ia mengganti informasi topografi dengan asumsi bahwa vektor alur lebih benar daripada DEM. Konsekuensinya:
- Kemiringan dasar dari DEM ter-burn hanya berarti pada mode
bed_profile="interpolate", dan hanya sejauhbed_anchored_fractiontinggi. Pada modenone/monotonicnilainya artefak derau DEM dan parametersharp_drop. Bahkan pada modeinterpolate, di ruas tak berjangkar hasilnya interpolasi ground-proxy — batas atas, bukan dasar sungai. Untuk desain hidraulik tetap pakai pengukuran penampang. - Batas DAS di sekitar alur dapat bergeser. Burning yang terlalu dalam dapat "menyedot" aliran dari DAS tetangga. Selalu bandingkan luas DAS sebelum dan sesudah.
- Jangan mem-burn saluran irigasi. Tipe OSM
ditchdancanalsering mengikuti kontur dan memotong drainase alami; mem-burn-nya menciptakan jalur aliran palsu. Defaultwaterway_typespada contoh hanyariver+stream. - Kualitas OSM tidak seragam. Di Indonesia sungai besar umumnya terpetakan baik, tetapi anak sungai kecil sering tidak bernama, tidak lengkap, atau posisinya kasar. Periksa terhadap citra sebelum dipakai sebagai kebenaran.
- Burning bukan pengganti survei. Untuk keperluan desain, geometri alur tetap harus dari pengukuran situasi sungai.
Ketergantungan
numpy, scipy, rasterio, geopandas, shapely, pysheds, matplotlib,
pandas, pyyaml; tambahan PyQt5 untuk antarmuka grafis.
Diuji pada conda env vempi_dosen (env yang sama dengan VBasin). Env itu semula
belum memuat pysheds; keduanya dipasang dengan --no-deps sehingga versi
paket lain tidak tersentuh:
pip install pysheds looseversion --no-depstarget_incision_m harus melebihi kekasaran permukaan DEM di kawasan
terbangun. Nilai terlalu kecil membuat celah antar bangunan terbaca sebagai alur
tergerus dan menjadi jangkar palsu. Untuk DEMNAS 8 m di permukiman padat,
mulailah dari 5 m dengan incision_radius_m 80–100 m.
Rumus lag SCS/TR-55 keluarannya JAM, bukan menit — mudah salah kaprah
(versi awal modul ini pernah salah sehingga melaporkan "1,0 menit" padahal
1,0 jam / 60 menit). vstream.network.scs_lag_minutes sudah mengalikan 60;
kalau mengimplementasikan ulang rumus ini di tempat lain, ingat konversinya.
Jangan tampilkan QMessageBox modal sbg reaksi otomatis atas selesainya
suatu proses (mis. di slot done/finished) — kalau GUI pernah dijalankan
tanpa interaksi (skrip otomatis, uji end-to-end, penjadwalan), dialog modal
menunggu klik yang tidak akan pernah datang dan proses tergantung permanen.
Pakai indikator non-blocking (label berwarna, baris tabel yang di-highlight)
untuk kondisi yang sifatnya informatif, bukan keputusan yang harus diambil
pengguna saat itu juga.
Dua penyesuaian dilakukan terhadap pysheds 0.5 di NumPy ≥ 2:
vstream._compatmemasang aliasnp.in1d→np.isin(dihapus di NumPy 2).vstream.delineate.catchment_maskmemakai implementasi BFS sendiri, bukanpysheds.Grid.catchment— fungsi tersebut mengembalikan satu sel saja pada kombinasi versi ini walaupun akumulasi di titik outlet besar.
Unduh DEM open-data (HydroSHEDS)
Selain DEM lokal (mis. DEMNAS), VBasin bisa mengunduh & menyiapkan DEM
HydroSHEDS v1 (data.hydrosheds.org) langsung untuk bbox manapun:
python main.py hydrosheds --bbox 110.20 -8.05 110.60 -7.50 \
--outdir dem_hydrosheds --resolution 15sKeluarannya sudah dipotong ke bbox + buffer dan direproyeksi ke UTM (metrik —
wajib, karena seluruh pipeline VBasin mengasumsikan satuan CRS = meter),
siap dipakai langsung sebagai dem: di file konfigurasi.
Alur di baliknya (vstream/hydrosheds.py): unduh berkas benua utuh (di-cache,
tidak diunduh ulang tiap kali) → potong lokal → reproyeksi. Percobaan
windowed-read jarak jauh (/vsizip/vsicurl/) yang tak perlu unduh penuh
gagal diverifikasi terhadap server HydroSHEDS (menolak permintaan Range
bertingkat GDAL walau header Accept-Ranges ada), jadi strateginya unduh
utuh + potong, bukan baca sebagian dari jaringan.
Bbox otomatis dari batas Wilayah Sungai Indonesia — daripada menebak
koordinat manual, --ws menurunkan bbox dari batas WS resmi (bersumber dari
proyek basin-atlas, 64 poligon PP No. 42/2008, dan disertakan lokal sebagai
data/ws_boundaries.geojson):
python main.py hydrosheds --ws "OPAK" --outdir dem_hydrosheds --resolution 15sBbox WS bukan batas delineasi VBasin sendiri — D8 hampir pasti sedikit
menyimpang dari poligon resmi ini — jadi vstream/das_indonesia.py selalu
memberi buffer di atas bbox poligon aslinya (buffer_for_ws): maksimum dari
lantai --buffer-km (default 10 km) dan --buffer-frac x dimensi terpanjang
WS (default 15%), dihitung di UTM lokal. Ini juga yang membuat pemilihan
cakupan lebih efisien — bbox pas-basin, bukan bbox tebakan yang biasanya
jauh lebih lebar dari perlu. Tersedia juga di GUI (dialog "Unduh
HydroSHEDS..." → isi nama WS → "Cari & isi bbox").
Pilihan --resolution: 3s (~90 m, berkas benua bisa beberapa GB),
15s (~460 m, puluhan-ratusan MB — cukup untuk uji cepat/reconnaissance),
30s (~925 m, puluhan MB).
Region HydroSHEDS tidak mengikuti intuisi geografis — diverifikasi
langsung lewat percobaan unduh nyata, bukan tebakan: region as (Asia)
berhenti tepat di garis khatulistiwa (lat ≥ 0). Seluruh Indonesia/nusantara
masuk region au (Australia/Oseania), bukan as, walau secara intuitif
terasa harus "Asia". guess_region() sudah menangani ini untuk titik di
Indonesia; untuk area lain dekat perbatasan region, override manual lewat
parameter region=.
Catatan hasil uji coba pada DAS Opak-Oyo (Imogiri/Bantul) memakai HydroSHEDS 15s: F1 jaringan turun jauh dibanding DEMNAS 8 m (0,43 vs 0,76 pada studi Celeng) dan luas DAS di outlet sedikit lebih besar dari batas DAS Opak total hasil delineasi lama (~1822 km² vs ~1673 km²) — resolusi 460 m memadai untuk gambaran regional/reconnaissance, tapi terlalu kasar untuk delineasi presisi di satu tempuran anak sungai. Untuk pekerjaan rekayasa di lokasi spesifik, tetap pakai DEMNAS (atau DEM lokal beresolusi lebih halus) sebagai sumber utama; HydroSHEDS lebih cocok sebagai pembanding cepat atau untuk area yang tak tercakup DEMNAS.
Delineasi jaringan semi-independen dari DEM sudah jadi
Panel "6. Delineasi Jaringan" di GUI punya dua sumber aliran yang bisa dipilih lewat combo box, tak lagi wajib lewat langkah 1-5:
- Hasil langkah 1-5 (Jalankan burning) — burn + delineasi + validasi lengkap lebih dulu.
- DEM sudah di-burn/dikondisikan (langsung) — muat langsung DEM yang
sudah jadi (mis.
dem_burned.tifdari proses burn terpisah), isi ambang alur (km²), klik "Siapkan Aliran". Tanpa mengulang burning, tanpa perlu alur referensi/validasi sama sekali (vstream.pipeline.prepare_flow).
Kedua sumber punya folder keluaran yang terpisah: langkah 1-5 tetap ke folder di panel "5. Validasi", jaringan (network.basin, *_subbasins.gpkg, dst.) ke folder sendiri di panel "6." — supaya hasil dua alat itu tidak bercampur di satu folder.
Titik outlet/ujung hulu — DAS dengan banyak hulu (mis. Opak-Oyo)
"Ujung hulu" di panel "3. Titik" HANYA dipakai profil dasar alur (langkah
4-5) — bukan delineasi jaringan (langkah 6, titik kontrolnya sendiri-sendiri
lewat PourPoint). Untuk DAS dengan banyak hulu sekaligus (mis. seluruh
DAS Opak-Oyo: Celeng, Oyo, Code semua headwater terpisah), kosongkan
ujung hulu (tombol ✕) — lintasan terpanjang dari outlet dipakai otomatis.
Isi WAJIB hanya kalau ruas yang dikaji spesifik satu anak sungai (mis.
K. Celeng saja) — tanpa itu profil bisa naik salah ke sungai induk.
Outlet/ujung hulu juga bisa dimuat dari CSV (tombol "Muat outlet/hulu dari CSV", baris ke-1 = outlet, baris ke-2 opsional = ujung hulu), bukan cuma klik peta.
Klik peta utk memilih titik "tidak terjadi apa-apa"? Toolbar
Pan/Zoom matplotlib (ikon tangan/kaca pembesar di atas peta) menangkap klik
utk geser/zoom peta selama aktif, sehingga klik picking diam-diam diabaikan
tanpa pesan apa pun kalau salah satu alat itu masih aktif dari sesi
eksplorasi sebelumnya. GUI sekarang mematikannya otomatis begitu masuk mode
pilih titik (MapCanvas.reset_tool()) — tak perlu diingat manual lagi.
Cache alur OSM otomatis
Tiap kali "Ambil dari OSM" berhasil, hasilnya otomatis disimpan sebagai
rivers_osm.gpkg di folder keluaran (atau folder DEM bila folder keluaran
belum diisi) — muat lagi lewat "Muat berkas vektor" tanpa perlu unduh ulang
di sesi berikutnya.
Panel Alur sungai referensi menyediakan opsi Clip alur ke batas Wilayah
Sungai Indonesia (GeoJSON). Cari nama WS seperti PROGO-OPAK-SERANG, lalu
VBasin membatasi query Overpass ke irisan bbox DEM-WS dan memotong garis hasil
unduhan tepat pada poligon WS. Opsi yang sama berlaku pada Muat berkas
vektor, sehingga SHP/GPKG/GeoJSON OSM lokal dapat dipotong tanpa proses QGIS
terpisah. Pilihan WS dari dialog HydroSHEDS otomatis diteruskan ke panel OSM.
Katalog data/ws_boundaries.geojson disertakan di paket VBasin dan dipakai
bersama oleh kedua alur tersebut.
Hujan GPM IMERG untuk Meteorologic Model HEC-HMS
Panel "7. Hujan GPM IMERG" (vstream.gpm_imerg, diadaptasi dari alat
terpisah VRainDownload) menyiapkan input hujan gridded untuk HEC-HMS:
- Buat skrip GEE — isi bbox (atau cari lewat nama Wilayah Sungai, sama seperti unduhan HydroSHEDS), rentang tanggal, resolusi waktu (harian/per-jam/native 30-menit), lalu simpan skrip JavaScript. Tempel ke https://code.earthengine.google.com (opens in a new tab) (akun Google gratis), klik Run, jalankan tiap task di tab Tasks satu per satu.
- Olah CSV → NetCDF — setelah CSV hasil ekspor terunduh dari Google
Drive, olah jadi satu grid NetCDF (time, lon, lat) siap diimpor
langsung: HEC-HMS File > Import > Gridded Data > Importer... >
Data Source: NetCDF → komponen Meteorologic Model "Gridded
Precipitation" (dikonfirmasi lewat resource string HEC-HMS 4.13
terpasang:
Grid_EntryType_NetCDF). Opsi tambahan: CSV per-sel + manifest gaya gauge individual, bila Meteorologic Model-nya dirancang per-gauge bukan gridded.
CSV GEE memakai kontrak eksplisit dan kompatibel mundur:
cell_id/lon/lat/time/precipitation tetap ada, ditambah
time_start_utc, time_end_utc, interval_minutes, units=mm, dan
value_type=period_total. IMERG V07 adalah intensitas mm/jam tiap 30
menit, sehingga skrip mengalikan irisan native dengan 0,5 sebelum
agregasi. AMS harian memakai rerata kedalaman irisan x48, bukan x24.
GPM IMERG tidak diunduh langsung dari VBasin — NASA Earthdata
mensyaratkan kredensial terpisah yang tak dimiliki alat ini. Jalurnya lewat
Google Earth Engine (komputasi di server Google, hasil jatuh ke Drive),
persis pola yang sudah terbukti jalan di VRainDownload.
Hillshade — arah cahaya (koreksi penting)
vstream.raster.hillshade (dipakai peta interaktif GUI dan
vstream.publication) sempat punya bug arah terbalik — alur sungai
(cekungan) tampak seperti punggungan gunung, dan sebaliknya. Penyebab:
np.gradient diberi dy bertanda positif padahal baris array bertambah ke
SELATAN (y sesungguhnya berkurang), plus rumus trig ESRI klasik yang gampang
salah transkripsi. Diganti hitungan langsung lewat perkalian-titik vektor
normal permukaan x arah cahaya (Lambertian) — lebih mudah diverifikasi
(lihat tests/test_canvas.py: 6 kasus arah kardinal + 1 kasus lembah-V
nyata, semua mengecek lereng yang menghadap cahaya memang lebih terang).
Basemap siap-impor HEC-HMS
Ekspor jaringan (panel "6.") sekarang otomatis menyertakan vstream.network. export_basemap: hillshade.tif + elevation.tif (GeoTIFF) dan
subbasins.shp/reaches.shp/junctions.shp (ESRI Shapefile) di folder
keluaran jaringan — sebelumnya cuma network.basin tanpa apa pun utk
dilihat sbg latar. Tambahkan lewat Basin Model HEC-HMS: klik kanan Basin
Model di Watershed Explorer → GIS → Map Layers → Add... (GeoPackage
TIDAK ada di daftar format Map Layer HEC-HMS, cuma Shapefile/HEC-RAS hdf/
Grid Cell/DLG/DXF/HMS Map/citra georeferensi/Mr Sid — dikonfirmasi lewat
resource string MLS_Shp_Desc dkk HEC-HMS 4.13 terpasang).
CN per-Subbasin dari tata guna lahan OSM
Panel "6." → tombol "Ambil tata guna lahan (CN) dari OSM"
(vstream.landuse, pola sama dgn alur sungai vstream.osm) — poligon
landuse=*/natural=* diunduh via Overpass, dipetakan ke CN kelompok
tanah hidrologi B (SCS TR-55, perkiraan KASAR, bukan overlay tanah
sesungguhnya). Tiap Subbasin dapat CN & persen kedap rerata tertimbang
luas dari poligon yang menutupinya; sel tak tercakup OSM (lazim di luar
kota) diisi nilai seragam (isian spinbox) sbg default, dan fraksi cakupan
dilaporkan di log supaya keandalannya bisa dinilai. Tanpa tombol ini,
perilaku lama (CN seragam utk semua Subbasin) tak berubah.
Hasilnya langsung tergambar di tab Peta (poligon diwarnai hijau=CN rendah s.d. kuning=CN tinggi, GUI otomatis pindah ke tab itu + dialog konfirmasi) — sebelumnya unduhan berhasil tanpa indikasi visual apa pun selain baris log yg gampang terlewat.
Performa: OSM landuse utk DAS besar/padat bisa berupa PULUHAN RIBU
poligon kecil (tiap petak sawah/rumah ditandai terpisah) — fetch_osm_landuse
sekarang men-dissolve poligon sekelas CN jadi satu baris segera setelah
diunduh (default aktif). Ini PERSIS (bukan perkiraan) karena menggabung
poligon sekelas tak mengubah luas cakupannya sama sekali — cuma memangkas
jumlah baris dari puluhan ribu jadi maksimum ~20 (jumlah kelas di
CN_TABLE). Terukur: rasterisasi ke grid DEM 2000x2000 dgn 5000 poligon
sintetis turun dari 0,30 dtk jadi 0,02 dtk (~15x), hasil numerik identik
(np.allclose). Ada jg simplify_tolerance_m opsional (default mati) utk
menyederhanakan tepi poligon yg sangat detail.
Hujan: kejadian (event) vs rancangan (kala ulang) — dua panel terpisah
Dua sumber hujan yang sengaja dipisah, jangan disamakan:
-
Panel "8a" — Hujan Kejadian/Event-Spesifik (GPM IMERG): satelit, hujan sungguhan yg pernah terjadi (mis. utk kalibrasi thd banjir tercatat). Lihat bagian GPM IMERG di atas.
-
Panel "8b" — Hujan Desain/Kala Ulang (platform hujan-id): hujan rancangan (
vstream.rainfall_design,D:\Github\website-data-hidro— nama proyek Vercel-nya persis "hujan-id" — 3300+ stasiun BMKG se-Indonesia). Membangun Meteorologic Model HEC-HMS otomatis:- Sentroid tiap Subbasin → stasiun BMKG terdekat yg punya data.
- Kedalaman 24-jam kala ulang pilihan (2-1000 thn) — distribusi
regional(Regional Frequency Analysis, dipool antar-stasiun se-region hidrologi) jadi DEFAULT & disarankan drpd fit per-stasiun tunggal (gev/gumbel/logpearson), krn lebih tahan derau utk stasiun berekam pendek (lazim di Indonesia). Pencarian stasiun otomatis lewati entrinullpd kombinasi distribusi+kala-ulang yg diminta & fallback ke stasiun valid berikutnya (ditemukan lewat data asli, bukan tebakan). - Kedalaman lokal dipakai sebagai pola spasial relatif, lalu semuanya
dikalikan satu faktor global sehingga hujan berbobot luas tepat sama
dengan target R24 areal DAS. Target dapat diisi langsung (misalnya dari
DDF areal
VRainBasin) atau dihitung dari rerata titik x ARF manual. VBasin sengaja tidak menebak ARF dari persamaan empiris yang belum diverifikasi. Mode ekstrem lokal independen hanya tersedia sebagai diagnostik dan diberi peringatan. - Disebar jadi hyetograf per jam via Mononobe (
vstream.mononobe) —R(t) = R24 * (t/24)^(1/3)(kumulatif; HATI-HATI, rumus intensitas(R24/24)*(24/t)^(2/3)BUKAN ini, keduanya gampang tertukar), lalu disusun ulang gaya alternating block supaya puncak intensitas ada di tengah durasi (posisi bisa diatur, default 50%). - Ditulis sbg
.metHEC-HMS metode Specified Average (format diverifikasi thd sampel resmiTifton_Hyetograph.met) + CSVhyetograf_<Subbasin>.csvper Subbasin.
Batasan jujur:
.metpratinjau panel 8b tidak memuat nilai deret waktu; gunakan CSV bila komponen ini dipakai sendiri. Panel 8c menulis proyek lengkap termasuk.dssmelaluipydsstools, denganPRECIP-INC,MM,PER-CUM, dan timestamp pada akhir interval.
Peta siap-publikasi & skema jaringan
Dua ekspor terpisah (panel "9."), keduanya mandiri dari PyQt5 (bisa dipanggil dari skrip/CLI):
vstream.publication.render_publication_map— peta geografis resolusi tinggi: DEM/hillshade + pewarnaan elevasi hipsometrik opsional- alur referensi/hasil delineasi + batas DAS (
catchment_mask, garis tebal terpisah dari poligon Subbasin individual) + Subbasin/Reach/ Junction gaya HEC-HMS (bentuk poligon geografis sesungguhnya) + titik kontrol + kotak pengaturan model (model_settings— metode burn, CN, metode lag, dst., supaya peta terdokumentasi sendiri) + skala batang - panah utara + judul/legenda.
- alur referensi/hasil delineasi + batas DAS (
vstream.publication.render_schematic_map(tombol terpisah) — diagram SKEMATIK gaya Basin Model HEC-HMS: Subbasin sbg kotak membundar berlabel, Junction sbg lingkaran, Reach sbg PANAH searah aliran — flowchart topologi bersih, beda dari peta geografis di atas (bukan bentuk poligon asli). Perlu Delineasi Jaringan (langkah 6) dulu.
Pelajaran mahal: shrinkA/shrinkB dan offset teks matplotlib itu
satuan points, bukan satuan data (meter) — sempat salah pakai nilai
skala DAS (meter) langsung sbg parameter itu, melontarkan panah/label
Junction jauh dari posisi sesungguhnya pada DAS besar. Diuji lewat posisi
piksel Text artist sesungguhnya (get_window_extent), bukan cuma "berkas
gambar valid" (yang tak akan menangkap bug ini sama sekali).
Sumber CN — tiga pilihan (OSM bukan lagi satu-satunya)
OSM landuse ternyata berat untuk DAS besar (unduhan puluhan ribu poligon memakan menit dan sempat membuat aplikasi menggantung). Panel "6." sekarang punya pemilih Sumber CN, terurut dari yang paling ringan:
| Pilihan | Beban | Catatan |
|---|---|---|
| Seragam (default) | seketika | satu nilai CN utk semua Subbasin |
| Berkas lokal (disarankan) | ringan | vektor ber-kolom CN, atau raster CN (GeoTIFF) |
| OSM landuse | berat | unduh Overpass; dikonfirmasi dulu lewat dialog |
"Berkas lokal" biasanya juga lebih TEPAT, bukan cuma lebih cepat: berkas
CN hasil overlay tata guna lahan × kelompok tanah hidrologi (mis. CN_25.shp
di proyek Opak — 30 poligon, kolom CN, sudah membedakan HSG A/B/C/D) jauh
lebih benar daripada jalur OSM yang terpaksa mengasumsikan semua tanah
HSG-B. Deteksi kolom otomatis: kolom bernama CN dipakai langsung; kalau
tidak ada, kolom tata guna lahan dipetakan lewat tabel bawaan. Baris ber-CN
di luar 30–100 dibuang (pasti salah kolom/satuan), bukan dipakai diam-diam.
Raster CN di-resample nearest (bukan bilinear) — CN itu nilai kelas, merata-ratakan antar kelas menghasilkan CN yang tak mewakili kelas mana pun.
Sumber DEM / aliran — kini menonjol
Pemilih sumber aliran di panel "6." dulu berupa combo kecil yang mudah terlewat. Sekarang jadi kotak ber-garis biru dengan radio button eksplisit:
- A. Pakai hasil langkah 1-5 (tombol Jalankan burning), atau
- B. Pakai DEM yang SUDAH di-burn/dikondisikan — pilih berkas, atur ambang alur, klik "Siapkan Aliran".
Di bawahnya ada indikator status yang selalu terlihat: oranye ("belum ada aliran") atau hijau ("aliran siap: grid …, ambang …") — jadi jelas apakah delineasi punya sumber yang valid sebelum dijalankan.
Peta pendamping & proyek QGIS — otomatis tiap Delineasi Jaringan
Setiap kali panel "6." (Delineasi Jaringan) diekspor, dua bahan validasi
spasial ditulis otomatis (vstream/ui/workers.py, tanpa tombol tambahan):
peta_subdas.png— peta publikasi (vstream/publication.py) yang otomatis di-zoom ke cakupan jaringan (bbox_from_network) alih-alih batas DEM penuh (DEM sering dimuat untuk cakupan rekonaisans luas — tanpa auto-zoom ini, Sub-DAS kecil di satu sudut nyaris tak kelihatan). Tiap Sub-DAS diberi nomor di peta (bukan nama+luas penuh) + legenda nomor→nama+luas di pojok kanan-atas — klaster Sub-DAS kecil berdekatan (mis. di tempuran) tak lagi saling tindih tak peduli seberapa padat.proyek_qgis.qgz— proyek QGIS asli, dibangun lewat PyQGIS sesungguhnya (vstream/qgis_project.py+vstream/_qgis_builder.py), bukan XML tebakan: VBasin men-subprocess ke Python bawaan instalasi QGIS milik pengguna (python-qgis-ltr.bat/python-qgis.bat, dicari otomatis diC:\Program Files\QGIS *) yang menjalankan builder-nya lewatqgis.coreAPI resmi. Tampilan utamanya adalah Sub-DAS kiri/kanan per Reach: incremental catchment pada junction hilir dipasangkan dengan Reach dari junction hulu, lalu dibelah oleh centerline Reach dengan sisi kiri/kanan didefinisikan sambil melihat ke hilir. Layer Sub-DAS model asli tetap disertakan tetapi nonaktif agar tidak disalahartikan sebagai unit lateral. Reach, Junction, Titik Kontrol, dan basemap elevasi+hillshade juga disertakan — siap dibuka & dieksplorasi interaktif (zoom, klik atribut, ukur) untuk validasi spasial yang lebih dalam daripada gambar statis.
Folder dan ZIP QGIS memakai GPKG di vectors/ sebagai datasource proyek,
serta menyertakan salinan interoperabilitas semua layer penting beserta
sidecar-nya di shapefiles/.
Keduanya fitur opsional yang gagal jujur, bukan diam-diam: kalau QGIS
tak terpasang di mesin, proyek_qgis.qgz dilewati dengan pesan jelas di
log — semua ekspor lain tetap jalan penuh (pola yang sama dengan
pydsstools opsional untuk HEC-DSS).
Karena peta_subdas.png sudah otomatis, tombol "Ekspor Peta Publikasi"
manual (panel lama "9.") sudah dihapus — redundan. Panel "9." yang
tersisa cuma "Ekspor Skema Jaringan" (diagram kotak/panah gaya Basin Model
HEC-HMS, beda dari peta geografis, belum ada pemicu otomatisnya).
Kotak keterangan model (metode burn, F1 validasi, sumber CN) yang dulu
cuma muncul lewat ekspor manual itu sekarang ikut ditulis otomatis ke
peta_subdas.png juga.
Dua aliran pemodelan — banjir vs debit andalan
Panel kiri dibagi menjadi tiga tab supaya kedua analisis tidak tercampur:
| Tab | Isi |
|---|---|
| 1 · DAS | Tahap BERSAMA: DEM, alur referensi, titik kontrol, rekondisi, delineasi Sub-DAS |
| 2A · BANJIR | Hujan rancangan kala ulang → debit puncak Q2–Q100 |
| 2B · DEBIT ANDALAN | Hujan historis → kurva durasi aliran, Q80/Q90/Q95, debit bulanan |
Perbedaannya bukan sekadar durasi simulasi — metodenya memang berbeda:
| Komponen | 2A · Banjir | 2B · Debit Andalan |
|---|---|---|
| Hujan | badai rancangan (frekuensi maksima) | rekaman historis bertahun-tahun |
| Simulasi | kejadian (jam) | kontinu (tahun) |
| Kehilangan | SCS Curve Number | Deficit & Constant |
| Aliran dasar | diabaikan | Recession (menentukan) |
| Evapotranspirasi | diabaikan | bulanan (wajib) |
| Routing | Muskingum | Lag bila langkah harian |
| Keluaran | Q2–Q100 puncak | FDC, Q80/Q90/Q95, Q bulanan |
| Dipakai untuk | dimensi bangunan pengendali | alokasi air, irigasi, PLTA |
SCS Curve Number sengaja tidak dipakai untuk simulasi kontinu. Metode itu tidak punya pemulihan kelembapan tanah antar kejadian — setelah hujan pertama tanah dianggap jenuh selamanya, sehingga debit musim kering ter-overestimasi dan Q80/Q95-nya tidak bermakna.
Penjaga neraca air (wajib dibaca)
Parameter kehilangan yang keliru tidak memunculkan error apa pun dari
HEC-HMS — hanya debit yang salah besar. Karena itu VBasin memeriksa
koefisien limpasan hasil simulasi (vstream/lowflow.py, wajar 0,25–0,75):
- terlalu rendah → laju kehilangan kebesaran, hampir semua hujan terserap
- terlalu tinggi (>1) → mustahil; biasanya aliran dasar awal kebesaran
Centang "Kalibrasi otomatis" untuk menyetel laju kehilangan lewat bagi dua sampai koefisien limpasan mendekati target (perlu HEC-HMS terpasang; di DAS Opak konvergen dalam 4 iterasi ke 0,435).
Menjalankan HEC-HMS tanpa membuka GUI-nya
vstream/hms_run.py memanggil HEC-HMS.cmd -s <skrip Jython> sehingga VBasin
bisa Compute sendiri. Catatan: skrip HEC-HMS diakhiri Exit(1) yang memang
melempar SystemExit beserta traceback — itu normal, keberhasilan dinilai
dari ada-tidaknya Run_*.dss yang lebih baru.
Olah hasil simulasi HEC-HMS → laporan & paparan
Panel "9." membaca kembali keluaran HEC-HMS yang sudah Anda Compute
(Run_*.dss), lalu menghasilkan sekaligus:
- hidrograf gabungan + per Titik Komputasi (
vstream/hms_report.py) - diagram batang perbandingan debit puncak
- peta sebaran debit puncak per Sub-DAS (ter-zoom ke jaringan)
debit_puncak.csv+laporan_debit.htmlpaparan_debit.pptx— 15 slide 16:9 siap presentasi (vstream/hms_ppt.py)
Empat jebakan DSS keluaran HEC-HMS yang ditangani (ditemukan dari berkas
hasil run sungguhan, bukan asumsi — lihat vstream/hms_results.py):
| Jebakan | Akibat kalau diabaikan |
|---|---|
Data kosong = sentinel -3.4028235e+38, bukan NaN | min/rata-rata jadi angka raksasa negatif |
| Satu deret terpecah per blok D-part bulanan | hidrograf cuma sepotong |
| Nama elemen dipotong 28 karakter di DSS | gagal dicocokkan ke geometri Sub-DAS |
Satu DSS memuat banyak Run (F-part RUN:) | hasil run lama tercampur diam-diam |
Peta debit dilewati dengan catatan bila nama elemen hasil simulasi tak bisa dicocokkan ke geometri — lebih baik tak ada peta daripada peta yang memetakan angka ke Sub-DAS yang salah.
Sub-DAS vs Titik Komputasi — dua hal berbeda
Keduanya sering senama dan selokasi, tapi artinya berbeda dan angkanya bisa beda puluhan kali lipat:
| Sub-DAS | Titik Komputasi (Computation Point) | |
|---|---|---|
| Apa | area tangkapan lokal/inkremental | Junction HEC-HMS, tempat debit dibaca |
| Luas | dari headstream s.d. titik itu, dikurangi Sub-DAS hulu | kumulatif seluruh DAS di hulunya |
| Independen? | ya — antar-Sub-DAS tak tumpang tindih | tidak — justru menjumlahkan semua hulu |
| Kode | angka (1, 2, 3 …) | huruf (A, B, C …) |
Contoh nyata DAS Opak: Sub-DAS 2 (Muara-Opak) luas lokalnya 39,26 km²,
tapi Titik Komputasi B di titik yang sama menerima 1346,03 km².
Memakai angka yang keliru akan salah besar dalam menaksir debit.
Kodenya sengaja beda jenis (angka vs huruf) supaya tak mungkin tertukar, dan dipakai konsisten di seluruh keluaran:
karakteristik_das.csv— kode angka + luas lokal + kolom "Mengalir ke Titik Komputasi" (huruf)titik_komputasi.csv— kode huruf + luas kumulatif + ruas ke hilir- peta — angka di poligon, huruf di berlian Junction, ruas berkode
A-B - grafik profil memanjang — legendanya memakai kode angka yang sama
Ruas/Reach diberi kode gabungan hulu-hilir (mis. K-J, H-E) sehingga
langsung terbaca menghubungkan Titik Komputasi mana ke mana.
Panah utara sengaja tidak digambar di semua plot — posisinya rawan bertabrakan dengan legenda/kotak keterangan pada rasio & zoom berbeda. Orientasi tetap terbaca dari sumbu Easting/Northing yang berlabel.
Latar peta di Basin Model HEC-HMS
Basin Model bawaan hanya menampilkan ikon Junction + garis skematik — tak ada bentuk Sub-DAS/sungai, sehingga sulit dibaca secara spasial.
⚠️ Jangan menambahkan shapefile lewat menu GIS/Import di HEC-HMS — itu membuat elemen model baru dan merusak struktur jaringan. Jalur yang benar adalah Map Layer (latar saja, bukan elemen).
VBasin menuliskannya otomatis: shapefile Sub-DAS & alur ditulis ke subfolder
maps\ lalu didaftarkan di .basin sebagai blok Basin Layer Properties >
Map Layer, plus Draw Map Objects: Yes (tanpa baris ini layer terdaftar
tapi tidak digambar — beberapa sampel resmi HEC-HMS justru begitu). Format
diverifikasi terhadap sampel resmi castro/Castro_1.basin & tifton/Tifton.basin.
Bisa dimatikan lewat include_map_layers=False.
Banyak kala ulang dalam satu proyek
Panel "8b" (Hujan Desain) punya satu kontrol kala ulang berupa centang banyak-pilihan (2, 5, 10, 25, 50, 100, 200, 500, 1000 tahun) — bukan lagi dropdown satu-pilihan. Klik "Bangun Hujan Rancangan" menghitung hujan utk SEMUA kala ulang yang dicentang sekaligus.
Panel "8c" (Proyek HEC-HMS Lengkap) memakai persis hasil itu — tidak ada kontrol kala ulang kedua di 8c. Sebelumnya ada dua pemilih kala ulang yang tak sinkron (dropdown di 8b vs centang di 8c) dan 8c diam-diam menghitung ulang hujan-id dari nol, mengabaikan apa pun yang sudah dibangun di 8b — sekarang satu sumber kebenaran saja: bangun dulu di 8b, lalu tulis proyek di 8c.
Hasilnya satu Meteorologic Model + satu Simulation Run per kala ulang, semuanya berbagi Basin Model & Control Specifications yang sama — tinggal pilih Run mana yang di-Compute, tanpa membangun ulang proyek tiap ganti kala ulang.
Tiap kala ulang memakai F-part DSS berbeda (DESIGN-25TH, DESIGN-50TH, …)
dan nama gage bersufiks (Tp.Celeng-Oyo 25th); tanpa itu deret kala ulang
berikutnya akan menimpa yang sebelumnya secara diam-diam.
Proyek HEC-HMS LENGKAP — tinggal klik Compute
Panel "8c" menulis SEMUA komponen sekaligus, saling merujuk dengan benar
(vstream/hms_project.py):
<ID>.hms proyek <Basin>.basin Basin Model
<Met>.met Meteorologic <Control>.control Control Specifications
<ID>.gage Precipitation Gages <ID>.run Simulation Run
<ID>.dss deret hujan (HEC-DSS biner)Buka di HEC-HMS: File > Open Project > <ID>.hms lalu klik Compute —
tak ada lagi langkah manual menempel hujan ke Time-Series Data Manager.
ID proyek wajib diisi (mis. Opak_Oyo_2026) dan dipakai sebagai nama
berkas .hms/.dss/.gage — tidak lagi default generik "VBasin".
Hujan ditulis ke HEC-DSS lewat pydsstools (pustaka resmi berbasis
heclib) — bukan format hasil tebak-tebakan. Kalau pydsstools tak tersedia,
proyek tetap ditulis lengkap tapi Meteorologic Model-nya jadi
No Precipitation dan hal itu dinyatakan terang-terangan, bukan
menghasilkan proyek yang tampak siap padahal tidak.
Semua format diverifikasi terhadap proyek contoh resmi HEC-HMS 4.13 yang
terpasang (samples.zip): .hms←castro, .control←Jan73, .run←castro,
.met←Tifton, .gage←castro. Nama metode presipitasi diambil dari enum asli
HEC-HMS (hms/model/met/e/aR.class), dan .gage sengaja dinamai sama dengan
proyek karena HEC-HMS menemukannya lewat konvensi nama itu.
Durasi Control Specifications = lama hujan + ekor resesi (default 12 jam, bisa diatur) supaya hidrograf sempat turun, bukan terpotong saat hujan berhenti.
Analisis koridor & struktur sungai
Tab "3 · STRUKTUR" berasal dari merger fitur unik aplikasi VBasinFlow
lama ke engine VBasin utama. Pilih titik struktur di peta, atur panjang
telusur, lebar koridor/penampang, Manning n, serta beberapa level muka air,
lalu jalankan analisis. Routing D8 yang sudah disiapkan oleh tahap DAS dipakai
ulang agar thalweg struktur konsisten dengan hasil burning dan delineasi.
Keluaran otomatisnya meliputi:
- tabel kapasitas Manning per penampang dan kedalaman;
- kurva stage-storage-discharge dan ringkasan genangan per level;
- screening geomorfologi (sinuositas, slope, shear stress, stream power, estimasi D50, dan kelas Rosgen indikatif);
- SHP centreline, penampang, serta poligon genangan;
- gambar koridor 3D, peta genangan, hipsometri, dan HTML 3D interaktif bila Plotly tersedia;
- checklist awal pemilihan lokasi bendung/embung;
- rencana survei LiDAR, orthophoto UAV, hidrometri, BM/GCP, dan penampang terestris dalam SHP + peta PNG.
Fitur yang sama dapat dijalankan headless:
python main.py corridor --dem dem_burned.tif --x 431650 --y 9121959 \
--project-name Celeng_Struktur --outdir output_corridor \
--upstream-m 1000 --downstream-m 100 --water-levels 0.5 1.0 1.5 2.0Hasil audit VBasinFlow lama
| Komponen lama | Keputusan merger |
|---|---|
| DEM, D8, outlet snapping, DAS/Sub-DAS | Dihapus; engine VBasin baru lebih lengkap dan mendukung burning + batas DAS resmi |
| Morfometri, hujan desain, hidrograf, HEC-HMS | Dihapus; sudah dicakup jaringan, proyek HEC-HMS lengkap, DSS, run headless, dan laporan |
| Peta/ekspor dasar | Dihapus; digantikan PNG publikasi, QGZ, QGIS package, GPKG/SHP, dan basemap HMS |
| Strahler ordering | Dipertahankan sebagai vstream.stream_order |
| Koridor, penampang, genangan, hidraulika | Dipertahankan dan diintegrasikan ke tab Struktur + CLI |
| Kriteria lokasi dan rencana survei | Dipertahankan sebagai keluaran analisis struktur |
Klasifikasi Rosgen, D50, stage-storage prismatik, dan template survei adalah screening awal, bukan pengganti survei topografi/hidrometri, investigasi geoteknik, atau desain rinci.
Build .exe (PyInstaller)
conda activate vempi_dosen
pyinstaller vstream.spec --noconfirm --clean # -> dist/VStream/VStream.exeHanya ada satu spec kanonis tanpa label v1/v2. Spec ini menyertakan
pydsstools lewat collect_all karena pustaka HEC-DSS-nya berupa DLL/pyd
native yang tak akan ikut kalau hanya mengandalkan analisis impor biasa.
Nama produk di dalam aplikasi adalah VBasin. Untuk menjaga nama teknis
rilis yang sudah dikenal, hasil build tetap berada di folder dist/VStream/
dan berisi VStream.exe + seluruh dependensi
(~0,9 GB — didominasi GDAL/rasterio, SciPy, dan matplotlib; wajar untuk
aplikasi geospasial mandiri). Jalankan lewat VStream.exe di dalam folder
tersebut; seluruh folder harus ikut didistribusikan, bukan hanya file exe-nya.
Environment vempi_dosen dipakai bersama proyek lain dan berisi banyak
paket tak terkait (PyTorch, Jupyter, Dask, dst.) — vstream.spec sudah
mengecualikannya lewat excludes eksplisit. Bila build gagal dengan
RecursionError, itu karena grafik impor environment bersama ini sangat
dalam; vstream.spec sudah menaikkan sys.setrecursionlimit di baris
paling atas untuk mengatasinya.
Rujukan
Hellweger, F. (1997). AGREE — DEM Surface Reconditioning System. University of Texas at Austin.
Lindsay, J.B. (2016). The practice of DEM stream burning revisited. Earth Surface Processes and Landforms, 41(5), 658–668.