ASAPify adalah WebGIS ringan untuk peringatan dini kebakaran lahan gambut. Sistem memetakan risiko setiap hari, mendeteksi titik api setiap jam, lalu agen Gemini menyusun peringatan yang rapi dan mudah dipahami. Peringatan baru terbit setelah disetujui operator.
Sudah diputuskan: nama produk ASAPify. asap = smoke dalam bahasa Indonesia, ASAP = as soon as possible, dan -ify dari notify. Artinya: peringatan soal asap yang sampai secepatnya, dan sudah terverifikasi. Tagline: "In Indonesian, asap means smoke. We make sure responders hear about it ASAP, and know it's real."
Bobot 40% ada di teknik dan pemakaian GenAI. Karena itu Gemini harus menjadi bagian inti sistem, bukan tempelan di akhir.
Halaman dan deck ini untuk tim, jadi berbahasa Indonesia. Deck submit dibuat terpisah dalam bahasa Inggris.
Cara menjawab tiap kriteria: agen dengan tools dan output terstruktur (40%), data karhutla 2026 (25%), ToPeCAl dari riset Indonesia ditambah alert yang disetujui manusia (25%), peta yang enak dipakai di HP (10%).
"ASAPify memetakan risiko kebakaran gambut setiap hari, mendeteksi titik api setiap jam, memverifikasinya dengan metode riset Indonesia bila citra tersedia, lalu agen Gemini menyusun peringatan Waspada, Siaga, atau Awas yang siap dikirim setelah disetujui operator."
Peta risiko per grid: gambut, hari tanpa hujan, angin, riwayat hotspot. Muncul sebelum ada api.
Hotspot FIRMS dikelompokkan jadi insiden. Aturan memberi level awal.
ToPeCAl di Earth Engine membaca kanal SWIR dan termal Landsat.
Gemini menyusun alasan, tindakan, dan pesan. Operator menyetujui sebelum terbit.
Satu job berjalan tiap jam. Jalur putus-putus berarti proses berhenti atau diberi label, tanpa alert. Peta risiko dan sitrep berjalan terpisah sekali sehari.
Geser diagram ke samping bila terpotong.
Semua angka ambang di bawah adalah titik awal. Nilai finalnya disesuaikan lewat backtest di minggu pertama, kecuali ambang ToPeCAl yang diambil langsung dari jurnal.
Cuaca dari Open-Meteo per titik grid 0,25°, lalu dibagikan ke sel 5 km di dalamnya. Dihitung sekali sehari pukul 06.00 WIB.
| Level | Syarat (semua di lahan gambut) |
|---|---|
| Pantau | Hotspot di luar gambut. Tampil di peta, tanpa alert. |
| Waspada | 1 deteksi di gambut dalam 24 jam. |
| Siaga | ≥ 2 deteksi dalam 24 jam, atau 1 deteksi di sel berisiko Sangat tinggi. |
| Awas | Syarat Siaga terpenuhi, ada desa ≤ 5 km, dan ToPeCAl menemukan api dalam 1 km atau ≥ 3 deteksi dalam 24 jam. |
Gemini tidak boleh mengubah level. Yang boleh mengubah hanya operator, dan perubahannya tercatat.
Dihitung di Landsat-8/9 TOA. Kanal yang dipakai: B1 (aerosol, penanda asap), B6 (SWIR-1), B7 (SWIR-2), B10 (suhu kecerahan termal, Kelvin). SICI = B7 ÷ B6. Jurnal melaporkan akurasi 82%, naik jadi 93% setelah area perkotaan di-mask.
| Kelas api | SICI | Kondisi (B1) | Reflektansi SWIR-2 (B7) | Suhu termal (B10) |
|---|---|---|---|---|
| Langit cerah · B1 < 0,27 | ||||
| S · membara (smouldering) | > 1 | cerah | 0,09 – 0,31 | ≥ 297 K |
| FS · campuran | > 1 | cerah | > 0,31 | > 300 K |
| F · menyala (flaming) | > 1 atau ≤ 1* | cerah | ≥ 0,68 | ≥ 307 K |
| Berasap · B1 ≥ 0,27 | ||||
| S · membara | > 1 | berasap | 0,11 – 0,32 | ≥ 297 K |
| FS · campuran | > 1 | berasap | 0,32 – 0,47 | > 297 K |
| F · menyala | > 1 atau ≤ 1* | berasap | ≥ 0,47 | ≥ 303 K |
import ee
def topecal(img):
"""0 = bukan api, 1 = membara (S), 2 = campuran (FS), 3 = menyala (F)."""
b1, sw1, sw2, bt = (img.select(b) for b in ['B1', 'B6', 'B7', 'B10'])
sici = sw2.divide(sw1)
asap = b1.gte(0.27)
cerah = asap.Not()
s = sici.gt(1).And(bt.gte(297)).And(
cerah.And(sw2.gte(0.09)).And(sw2.lte(0.31))
.Or(asap.And(sw2.gte(0.11)).And(sw2.lte(0.32))))
fs = sici.gt(1).And(
cerah.And(sw2.gt(0.31)).And(bt.gt(300))
.Or(asap.And(sw2.gte(0.32)).And(sw2.lte(0.47)).And(bt.gt(297))))
f = (cerah.And(sw2.gte(0.68)).And(bt.gte(307))
.Or(asap.And(sw2.gte(0.47)).And(bt.gte(303))))
kelas = ee.Image(0).where(s, 1).where(fs, 2).where(f, 3)
# mask area terbangun (sumber alarm palsu menurut jurnal)
terbangun = ee.ImageCollection('ESA/WorldCover/v200').first().select('Map').eq(50)
return kelas.updateMask(terbangun.Not()).rename('topecal')
def cari_landsat(titik, waktu):
# waktu: ee.Date saat insiden terdeteksi
koleksi = (ee.ImageCollection('LANDSAT/LC08/C02/T1_TOA')
.merge(ee.ImageCollection('LANDSAT/LC09/C02/T1_TOA'))
.filterBounds(titik)
.filterDate(waktu.advance(-1, 'day'), waktu.advance(1, 'day'))
.sort('system:time_start', False))
return koleksi # cek koleksi.size() dulu; 0 berarti "belum terverifikasi citra"
Jurnal memakai Landsat-8 Collection 1. Kita memakai Collection 2 TOA, jadi cek hasilnya secara visual pada 1–2 scene dulu sebelum dipercaya. Landsat melintas jarang, sehingga sebagian besar insiden akan berlabel "belum terverifikasi citra". Ini wajar dan perlu dijelaskan terus terang saat pitch.
Agen dibangun dengan ADK dan berjalan di Cloud Run. Ada dua tugas utama: draf alert untuk setiap insiden baru atau yang naik level, dan sitrep harian untuk satgas.
{
"incident_id": "KT-0912-042",
"level": "SIAGA",
"judul": "Titik api berulang di lahan gambut",
"alasan": [
"3 deteksi VIIRS dalam 18 jam",
"di dalam KHG contoh",
"11 hari tanpa hujan, angin 14 km/jam",
"desa terdekat 3,2 km"
],
"verifikasi": "belum ada citra Landsat",
"tindakan": {
"bpbd": "kirim tim cek lapangan",
"mpa": "siagakan pompa di desa terdekat",
"warga": "hindari membakar, laporkan asap"
},
"pesan": { "id": "…", "en": "…" },
"status": "draft"
}
Draf muncul di antrean panel operator. Setelah disetujui, statusnya menjadi approved dan kartu insiden tampil di peta publik.
Keputusan operator disimpan. Data ini dipakai untuk evaluasi dan tampil di deck.
Jalankan pada 20–30 insiden historis dan catat persentase yang lolos. Angka ini menjadi bukti kualitas GenAI di deck.
Satu service Cloud Run (asapify-api) melayani peta publik, aksi operator, dan agen. Browser tidak membaca Firestore langsung. Detail endpoint ada di halaman Backend & API, konfigurasi layanan di Konfigurasi Cloud.
Tarik FIRMS, kelompokkan insiden, hitung level, panggil ToPeCAl dan agen untuk insiden baru.
Peta risiko grid 5 km dan sitrep harian lewat agen.
ToPeCAl dan thumbnail komposit 7-6-4 untuk bukti visual.
Endpoint publik dan operator, agen dengan tools, validator.
MapLibre, peta publik, panel operator. Data lewat API; layer statis dari Cloud Storage.
| Koleksi Firestore | Isi | Ditulis oleh | Dibaca oleh |
|---|---|---|---|
incidents | titik pusat, jumlah deteksi, FRP maks, di_gambut, desa terdekat + jarak, level aturan, hasil verifikasi | job ingest | API, agen |
alerts | JSON dari agen, status draft / approved / rejected, siapa yang menyetujui | agen, API (aksi operator) | API |
risk_days | tanggal + tautan GeoJSON grid risiko di Cloud Storage | job harian | API |
sitreps | ringkasan harian per provinsi | job harian (agen) | API |
Mode replay: semua job menerima parameter tanggal, misalnya --replay 2026-09-12. Dengan ini demo bisa diputar ulang pada hari kebakaran nyata, walaupun saat penjurian hotspot sedang sepi.
Sketsa kasar sebagai pegangan frontend. Detail visual bisa berubah saat dibangun.
Setiap sprint punya definisi selesai. Kalau sprint molor, potong fitur di sprint berikutnya, jangan geser tanggal freeze.
| Peran | Tugas utama | Keluaran |
|---|---|---|
| A · Data & GIS | Layer gambut, titik desa, ingest FIRMS, pengelompokan insiden, grid risiko, backtest | Tabel insiden + grid risiko untuk tanggal demo |
| B · Citra satelit | ToPeCAl di Earth Engine, pencarian Landsat, thumbnail, cek visual hasil | Fungsi verify(incident) + contoh gambar |
| C · Backend & agen AI | Cloud Run job dan service, Scheduler, ADK + Gemini, validator, Firestore, aturan keamanan | Draf alert otomatis + sitrep |
| D · WebGIS & pitch | MapLibre, tiga layar, Firebase Hosting, video, deck bahasa Inggris | URL publik, video, deck PDF |
Rekam dengan mode replay pada tanggal demo. Tampilkan pemanggilan tools oleh agen di layar, karena bagian itulah yang dinilai 40%.
| Risiko | Rencana cadangan |
|---|---|
| Tim belum lengkap saat registrasi ditutup 11 Okt | Selesaikan di Sprint 0. Syaratnya 2–4 orang, profesional, 21+. |
| Pendaftaran Earth Engine lambat disetujui | Daftar di hari pertama. Cadangan: hitung ToPeCAl untuk tanggal demo lebih dulu, lalu simpan hasilnya. |
| Layer gambut sulit didapat | Cari di hari 1–2 dari sumber resmi atau data terbuka. Catat sumber dan lisensinya. |
| Tidak ada Landsat cerah di tanggal demo | Pilih tanggal demo di Sprint 0 justru berdasarkan ketersediaan Landsat. |
| Hotspot sepi saat penjurian | Mode replay dengan tanggal kebakaran nyata. |
| Gemini menulis angka yang salah | Structured output, validator angka, level terkunci dari aturan. |
| Biaya atau kuota Gemini | Agen hanya dipanggil untuk insiden baru atau yang naik level. Simpan hasilnya. |