VBasin
Catatan teknis VBasin

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:

PenyebabGejala
Relief datar di dataran banjiralur "melompat" ke lembah tetangga
Kawasan padat bangunanDSM membaca atap, alur sempit hilang total
Jembatan & gorong-gorongalur terpotong, muncul cekungan palsu
Resolusi kasar (30–90 m)sungai < 1 sel tidak terwakili
Tanggul & sudetanDEM 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)              ──┘
  1. Ambil alur aktual dari OpenStreetMap (Overpass API) atau file vektor hasil digitasi/pengukuran sendiri.
  2. Rekondisi DEM (stream burning) agar aliran terkunci mengikuti alur itu.
  3. Delineasi ulang D8: kondisioning, arah aliran, akumulasi, jaringan, DAS.
  4. Validasi kuantitatif — seberapa dekat alur hasil dengan alur referensi.
  5. 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_drop

simple — 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.

NilaiPerilaku
nonepakai elevasi DEM apa adanya — mewarisi seluruh derau (atap, jembatan)
monotonicbuang cekungan dengan menaikkannya — profil jadi tangga
interpolaterekonstruksi dua tahap (di bawah) — profil mulus

Mode interpolate bekerja atas dasar bahwa keandalan DEM tidak seragam:

  1. 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.
  2. 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.
  3. Rapikan jangkar dengan regresi isotonik berbobot agar monoton menurun ke hilir.
  4. 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 rekondisi

Data 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 rekondisiBurn AGREE
F1 kecocokan alur0,6210,878
Simpangan median10 m0 m
DAS di outlet6,89 km²11,08 km²
Kemiringan dasar—21,04 m/km (sebenarnya 21,01 — meleset 0,1 %)
Galat elevasi dasar33,4 m19,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.yaml

Antarmuka grafis

conda activate vempi_dosen     # env yang punya PyQt5 (sama dengan VBasin)
python gui.py

Alur 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

BerkasIsi
dem_burned.tifDEM hasil rekondisi + kondisioning
flow_accumulation_km2.tifakumulasi aliran (km²)
streams_derived.gpkgjaringan sungai hasil delineasi
streams_reference.gpkgalur referensi yang dipakai
catchment.gpkgDAS di outlet
profil_dasar_alur.csvprofil memanjang: chainage, z DEM, z rekonstruksi, gerusan, keandalan
metrics.jsonkonfigurasi + seluruh metrik
calibration_table.csvtabel 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:

SkenariocorrectnesscompletenessF1median simpanganDAS di outlet
A. Baseline (tanpa burning)36%48%0,411135 m0,09 km²
B. Burn — dasar monoton65%92%0,7630 m21,21 km²
C. Burn — dasar interpolasi65%92%0,7630 m21,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:

  1. 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.

  2. 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.

  3. sharp_drop harus cukup dalam. Dari sweep 37 kombinasi:

    sharp_dropDAS rata-rataF1 rata-rata
    2 m11,8 km²0,532
    5 m16,7 km²0,591
    10 m21,4 km²0,612
    20 m21,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.py

atau 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:

SubbasinLuasLag SCS
K. Celeng — hulu Imogiri13,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

  1. Tiap titik kontrol di-snap ke sel alur terdekat.
  2. 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).
  3. 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.
  4. 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.
  5. Reach disusuri lewat arah aliran (deterministik) dari tiap titik ke induknya.
  6. 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.
  7. 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 .basin sebelum 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.gpkg dan 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:

  1. Kemiringan dasar dari DEM ter-burn hanya berarti pada mode bed_profile="interpolate", dan hanya sejauh bed_anchored_fraction tinggi. Pada mode none/monotonic nilainya artefak derau DEM dan parameter sharp_drop. Bahkan pada mode interpolate, di ruas tak berjangkar hasilnya interpolasi ground-proxy — batas atas, bukan dasar sungai. Untuk desain hidraulik tetap pakai pengukuran penampang.
  2. Batas DAS di sekitar alur dapat bergeser. Burning yang terlalu dalam dapat "menyedot" aliran dari DAS tetangga. Selalu bandingkan luas DAS sebelum dan sesudah.
  3. Jangan mem-burn saluran irigasi. Tipe OSM ditch dan canal sering mengikuti kontur dan memotong drainase alami; mem-burn-nya menciptakan jalur aliran palsu. Default waterway_types pada contoh hanya river + stream.
  4. 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.
  5. 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-deps

target_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._compat memasang alias np.in1d → np.isin (dihapus di NumPy 2).
  • vstream.delineate.catchment_mask memakai implementasi BFS sendiri, bukan pysheds.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 15s

Keluarannya 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 15s

Bbox 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.tif dari 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:

  1. 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.
  2. 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:

    1. Sentroid tiap Subbasin → stasiun BMKG terdekat yg punya data.
    2. 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 entri null pd kombinasi distribusi+kala-ulang yg diminta & fallback ke stasiun valid berikutnya (ditemukan lewat data asli, bukan tebakan).
    3. 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.
    4. 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%).
    5. Ditulis sbg .met HEC-HMS metode Specified Average (format diverifikasi thd sampel resmi Tifton_Hyetograph.met) + CSV hyetograf_<Subbasin>.csv per Subbasin.

    Batasan jujur: .met pratinjau panel 8b tidak memuat nilai deret waktu; gunakan CSV bila komponen ini dipakai sendiri. Panel 8c menulis proyek lengkap termasuk .dss melalui pydsstools, dengan PRECIP-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.
  • 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:

PilihanBebanCatatan
Seragam (default)seketikasatu nilai CN utk semua Subbasin
Berkas lokal (disarankan)ringanvektor ber-kolom CN, atau raster CN (GeoTIFF)
OSM landuseberatunduh 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 di C:\Program Files\QGIS *) yang menjalankan builder-nya lewat qgis.core API 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:

TabIsi
1 · DASTahap BERSAMA: DEM, alur referensi, titik kontrol, rekondisi, delineasi Sub-DAS
2A · BANJIRHujan rancangan kala ulang → debit puncak Q2–Q100
2B · DEBIT ANDALANHujan historis → kurva durasi aliran, Q80/Q90/Q95, debit bulanan

Perbedaannya bukan sekadar durasi simulasi — metodenya memang berbeda:

Komponen2A · Banjir2B · Debit Andalan
Hujanbadai rancangan (frekuensi maksima)rekaman historis bertahun-tahun
Simulasikejadian (jam)kontinu (tahun)
KehilanganSCS Curve NumberDeficit & Constant
Aliran dasardiabaikanRecession (menentukan)
Evapotranspirasidiabaikanbulanan (wajib)
RoutingMuskingumLag bila langkah harian
KeluaranQ2–Q100 puncakFDC, Q80/Q90/Q95, Q bulanan
Dipakai untukdimensi bangunan pengendalialokasi 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.html
  • paparan_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):

JebakanAkibat kalau diabaikan
Data kosong = sentinel -3.4028235e+38, bukan NaNmin/rata-rata jadi angka raksasa negatif
Satu deret terpecah per blok D-part bulananhidrograf cuma sepotong
Nama elemen dipotong 28 karakter di DSSgagal 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-DASTitik Komputasi (Computation Point)
Apaarea tangkapan lokal/inkrementalJunction HEC-HMS, tempat debit dibaca
Luasdari headstream s.d. titik itu, dikurangi Sub-DAS hulukumulatif seluruh DAS di hulunya
Independen?ya — antar-Sub-DAS tak tumpang tindihtidak — justru menjumlahkan semua hulu
Kodeangka (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.0

Hasil audit VBasinFlow lama

Komponen lamaKeputusan merger
DEM, D8, outlet snapping, DAS/Sub-DASDihapus; engine VBasin baru lebih lengkap dan mendukung burning + batas DAS resmi
Morfometri, hujan desain, hidrograf, HEC-HMSDihapus; sudah dicakup jaringan, proyek HEC-HMS lengkap, DSS, run headless, dan laporan
Peta/ekspor dasarDihapus; digantikan PNG publikasi, QGZ, QGIS package, GPKG/SHP, dan basemap HMS
Strahler orderingDipertahankan sebagai vstream.stream_order
Koridor, penampang, genangan, hidraulikaDipertahankan dan diintegrasikan ke tab Struktur + CLI
Kriteria lokasi dan rencana surveiDipertahankan 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.exe

Hanya 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.