PENGEMBANGAN PRODUK INFORMASI DAN DISEMINASI...

72
2015 PUSAT PEMANFAATAN PENGINDERAAN JAUH LAPAN PENGEMBANGAN PRODUK INFORMASI DAN DISEMINASI INFORMASI PENGINDERAAN JAUH

Transcript of PENGEMBANGAN PRODUK INFORMASI DAN DISEMINASI...

Page 1: PENGEMBANGAN PRODUK INFORMASI DAN DISEMINASI …pusfatja.lapan.go.id/files_uploads_ebook/publikasi/Buku Laporan... · Akhir kata, tak ada gading yang tak retak, buku ini tentunya

2015

PUSAT PEMANFAATAN PENGINDERAAN JAUH

LAPAN

PENGEMBANGAN PRODUK INFORMASI DAN DISEMINASI INFORMASI PENGINDERAAN JAUH

Page 2: PENGEMBANGAN PRODUK INFORMASI DAN DISEMINASI …pusfatja.lapan.go.id/files_uploads_ebook/publikasi/Buku Laporan... · Akhir kata, tak ada gading yang tak retak, buku ini tentunya

i

LAPORAN KEGIATAN LITBANGYASA

PENGEMBANGAN PRODUK INFORMASI DAN DISEMINASI INFORMASI PENGINDERAAN JAUH

Oleh:

Taufik Hidayat Jansen Sitorus Sarno Maryani Hartuti Ahmad Sutanto Silvia Rossi Hamzah Taufik Maulana Iskandar Effendy Esty Kurnia Galditha A. Chulafak Dini Oktavia Ambarwati Widya Putri Tri Arso Sunugroho

PUSAT PEMANFAATAN PENGINDERAAN JAUH LEMBAGA PENERBANGAN DAN ANTARIKSA NASIONAL Jl. Kalisari No. 8 Pekayon, Pasar Rebo, Jakarta 13710 Telp. (021) 8710065 Faks. (021) 8722733

Page 3: PENGEMBANGAN PRODUK INFORMASI DAN DISEMINASI …pusfatja.lapan.go.id/files_uploads_ebook/publikasi/Buku Laporan... · Akhir kata, tak ada gading yang tak retak, buku ini tentunya

ii

Page 4: PENGEMBANGAN PRODUK INFORMASI DAN DISEMINASI …pusfatja.lapan.go.id/files_uploads_ebook/publikasi/Buku Laporan... · Akhir kata, tak ada gading yang tak retak, buku ini tentunya

iii

KATA PENGANTAR

Undang-undang No. 21 tahun 2013 mengamanatkan kepada Lembaga Penerbangan dan Antariksa Nasional (LAPAN) untuk menetapkan metode dan kualitas pengolahan data penginderaan jauh. Sehubungan dengan hal tersebut, naka dilakukan kegiatan penelitian, pengembangan, dan perekayasaan (litbangyasa) pemanfaatan penginderaan jauh sebagai dasar dalam penentuan metode dan kualitas pengolahan data. Kegiatan litbangyasa tersebut tentunya tidak dilakukan dalam waktu setahun atau dua tahun sehingga metode dan kualitas data langsung ditetapkan, namun memerlukan proses dan waktu yang cukup panjang. Agar setiap kegiatan untuk menuju hal tersebut terdokumentasi dengan baik, maka disusunlah buku laporan setiap tahunnya.

Puji syukur ke hadirat Allah SWT, penyusunan buku hasil litbangyasa dengan judul Pengembangan Produk Informasi Dan Diseminasi Informasi Penginderaan Jauh telah diselesaikan dengan baik. Buku ini disusun sebagai bukti pertanggungjawaban hasil kegiatan litbangyasa yang dibiayai oleh DIPA Pusat Pemanfaatan Penginderaan Jauh. Buku ini intinya terdiri dari 5 Bab yang memuat (1) Pendahuluan, (2) Tujuan dan Sasaran, (3) Bahan dan Metode, (5) Hasil dan Pembahasan, (6) Kesimpulan dan Saran, dan (7) Lampiran.

Dalam penyusunan buku ini tentunya melibatkan tim litbangyasa yang bekerja selama tahun 2015, narasumber baik dari tim litbangyasa yang lain dan perguruan tinggi, dan juga pihak-pihak lain yang terkait. Masukan-masukan dan hasil-hasil diskusi memperkaya kegiatan ini sehingga mendapatkan hasil yang semakin baik. Kepada pihak-pihak terkait yang telah membantu kegiatan ini, saya selaku Kepala Pusat Pemanfaatan Penginderaan Jauh mengucapkan terima kasih yang sebesar-besarnya. Kepada tim litbangyasa yang telah melakukan kegiatan litbangyasa ini, selain buku ini diharapkan juga dipublikasikan hasil temuan-temuan yang sudah didapatkan dalam media yang lain seperti Jurnal, baik nasional maupun internasional.

Akhir kata, tak ada gading yang tak retak, buku ini tentunya tidak sempurna, namun ini akan menjadi dokumen yang penting dalam kegiatan penelitian dan pengembangan selanjutnya. Kritik dan saran terkait penyusunan buku ini dapat disampaikan langsung, baik secara lisan maupun tulisan. Hal ini akan dapat membantu agar penyusunan buku berikutnya menjadi lebih baik.

Jakarta, 14 Desember 2015 Kepala Pusat Pemanfaatan Penginderaan Jauh, Dr. M. Rokhis Khomarudin

Page 5: PENGEMBANGAN PRODUK INFORMASI DAN DISEMINASI …pusfatja.lapan.go.id/files_uploads_ebook/publikasi/Buku Laporan... · Akhir kata, tak ada gading yang tak retak, buku ini tentunya

iv

Page 6: PENGEMBANGAN PRODUK INFORMASI DAN DISEMINASI …pusfatja.lapan.go.id/files_uploads_ebook/publikasi/Buku Laporan... · Akhir kata, tak ada gading yang tak retak, buku ini tentunya

v

DAFTAR ISI

Halaman: KATA PENGANTAR iii DAFTAR ISI v DAFTAR GAMBAR vi DAFTAR TABEL vii DAFTAR LAMPIRAN viii I. PENDAHULUAN 1 II. TUJUAN DAN SASARAN 2 III. BAHAN DAN METODE 2

a. Akumulasi curah hujan 2 b. Prediksi Curah Hujan Bulanan 3 c. Potensi Banjir dan Longsor 3 d. Sistem Peringkat Bahaya Kebakaran (SPBK) 3 e. Lokasi dan Distribusi Hotspot 4 f. Deteksi Area Bekas Terbakar 5 g. Tingkat Kehijauan Vegetasi dan Fase Pertumbuhan Padi 5 h. Zona Potensi Penangkapan Ikan 6

IV. HASIL DAN PEMBAHASAN 6 a. Akumulasi Curah Hujan 6 b. Prediksi Curah Hujan Bulanan 11 c. Potensi Banjir dan Longsor 12 d. Sistem Peringkat Bahaya Kebakaran (SPBK) 14 e. Lokasi dan Distribusi Titik Panas (Hotspot) 15 f. Deteksi Area Bekas Terbakar 16 g. Tingkat Kehijauan Vegetasi dan Fase Pertumbuhan Padi 16 h. Informasi Zona Potensi Penangkapan Ikan (ZPPI) 17 i. Diseminasi Informasi Kebencanaan 18

V. KESIMPULAN DAN SARAN 20 LAMPIRAN 21

Page 7: PENGEMBANGAN PRODUK INFORMASI DAN DISEMINASI …pusfatja.lapan.go.id/files_uploads_ebook/publikasi/Buku Laporan... · Akhir kata, tak ada gading yang tak retak, buku ini tentunya

vi

DAFTAR GAMBAR

Halaman: Gambar 1 Akumulasi curah hujan bulan Januari 2015 berdasarkan data

TRMM 7 Gambar 2 Akumulasi curah hujan bulan Januari 2015 berdasarkan data

Qmorph 7 Gambar 3 Akumulasi curah hujan bulan April 2015 berdasarkan data

TRMM 8 Gambar 4 Akumulasi curah hujan bulan April 2015 berdasarkan data

Qmorph 8 Gambar 5 Akumulasi curah hujan bulan Juli 2015 berdasarkan data

TRMM 9 Gambar 6 Akumulasi curah hujan bulan Juli 2015 berdasarkan data

Qmorph 9 Gambar 7 Akumulasi curah hujan bulan Oktober 2015 berdasarkan data

TRMM 10 Gambar 8 Akumulasi curah hujan bulan Oktober 2015 berdasarkan data

Qmorph 10 Gambar 9 Prediksi OLR bulan Februari 2015 11 Gambar 10 Prediksi anomali OLR bulan Februari 2015 11 Gambar 11 Prediksi estimasi curah hujan bulan Februari 2015 12 Gambar 12 Prediksi anomali estimasi curah hujan bulan Februari 2015 12 Gambar 13 Informasi spasial daerah potensi banjir di Pulau Kalimantan

Februari 2015 13 Gambar 14 Informasi spasial daerah potensi banjir di Pulau Kalimantan

Maret 2015 13 Gambar 15 Potensi Tingkat Kemudahan Penyulutan Api 10 hari pertama

Oktober 2015 14 Gambar 16 Potensi Tingkat Kekeringan dan Asap 10 hari pertama

Oktober 2015 14 Gambar 17 Kesulitan Pengendalian Kebakaran 10 hari pertama Oktober

2015 15 Gambar 18 Indeks Cuaca Kebakaran 10 hari pertama Oktober 2015 15 Gambar 19 Rekapitulasi Titik Panas (Hotspot) bulan Oktober 2015 16 Gambar 20 Tingkat Kehijauan Vegetasi dan Fase Pertumbuhan Padi

pada 8 hari pertama Januari 2015 17

Gambar 21 Informasi Zona Potensi Penangapan Ikan bulan Januari 2015 17

Page 8: PENGEMBANGAN PRODUK INFORMASI DAN DISEMINASI …pusfatja.lapan.go.id/files_uploads_ebook/publikasi/Buku Laporan... · Akhir kata, tak ada gading yang tak retak, buku ini tentunya

vii

DAFTAR TABEL

Halaman: Tabel 1 Daftar nama instansi penerima laporan 18

Page 9: PENGEMBANGAN PRODUK INFORMASI DAN DISEMINASI …pusfatja.lapan.go.id/files_uploads_ebook/publikasi/Buku Laporan... · Akhir kata, tak ada gading yang tak retak, buku ini tentunya

viii

DAFTAR LAMPIRAN

Halaman: Lampiran Sorce-code Aplikasi Deteksi Area Terbakar 21

Listing BurnedArea.py 21 Listing period.py 28 Listing FHS.py 30 Listing NBR.py 34

Page 10: PENGEMBANGAN PRODUK INFORMASI DAN DISEMINASI …pusfatja.lapan.go.id/files_uploads_ebook/publikasi/Buku Laporan... · Akhir kata, tak ada gading yang tak retak, buku ini tentunya

1

PENGEMBANGAN PRODUK INFORMASI DAN DISEMINASI INFORMASI PENGINDERAAN JAUH

Taufik Hidayat*), Jansen Sitorus, Sarno, Maryani Hartuti, Ahmad Sutanto, Silvia, Rossi Hamzah, Taufik Maulana, Iskandar Effendy, Esty Kurnia, Galditha A.

Chulafak, Dini Oktavia Ambarwati, Widya Putri, Tri Arso Sunugroho

Pusat Pemanfaatan Penginderaan Jauh LAPAN *)E-mail: [email protected]

I. PENDAHULUAN

Undang-undang No. 21 tahun 2013 mengamanatkan bahwa LAPAN dapat melakukan pengolahan data terkait klasifikasi dan deteksi parameter geo-bio-fisik jika diminta oleh pengguna. Permintaan pengguna terhadap informasi yang dihasilkan oleh LAPAN sudah banyak seperti informasi kebencanaan yang diminta oleh BNPB, Informasi hotspot yang diminta oleh Kementerian Lingkungan Hidup dan Kehutanan (KLHK), Informasi fase pertumbuhan padi oleh Kementerian Pertanian, Informasi Zona Potensi Penangkapan Ikan (ZPPI) oleh Kementerian Kelautan dan Perikanan beserta Dinas-dinas perikanan di berbagai provinsi.

Informasi sumberdaya alam, lingkungan, dan mitigasi bencana seperti informasi curah hujan bulanan dan prediksinya, informasi hotspot, sistem peringkat bahaya kebakaran (SPBK), fase pertumbuhan padi, dan informasi terkait dengan zona potensi penangkapan ikan (ZPPI) telah dioperasionalisasikan oleh Pusat Pemanfaatan Penginderaan Jauh Lembaga Penerbangan dan Antariksa Nasional. Informasi tersebut diperbaharui baik harian, mingguan, dan bulanan. Informasi ini disampaikan kepada kurang lebih terhadap lebih dari 35 pengguna baik instansi pemerintah pusat maupun daerah dan juga swasta.

Pengguna sudah memanfaatkan informasi ini untuk menentukan rekomendasi-rekomendasi dalam pelaksanaa kegiatannya. Sebagai contoh adalah informasi titik panas (hotspot) sebagai indikator kebakaran lahan dan hutan digunakan oleh pengguna untuk pemadaman kebakaran. Informasi fase pertumbuhan padi digunakan oleh kementerian pertanian untuk efisiensi pengiriman pupuk, dan juga alat mesin pertanian, sehingga produksi dapat ditingkatkan. Zona potensi penangkapan ikan (ZPPI) telah dimanfaatkan oleh nelayan dalam menentukan koordinat penangkapan ikan.

Mengingat bahwa kegiatan tersebut sangat penting, maka operasionalisasi penyampaian informasi berbasis data penginderaan jauh maka kegiatan ini terus dilakukan secara kontinu sehingga pengguna dapat terus dapat memanfaatkan informasi-informasi yang dihasilkan tersebut.

Tenaga pengolah data untuk untuk menghasilkan informasi diperlukan banyak orang dan memerlukan waktu yang cukup lama. Sehingga, kendala yang dihadapi adalah informasi yang disampaikan sering terlambat. Banyaknya orang dan waktu akan menyebabkan biaya yang dikeluarkan untuk kegiatan ini cukup

Page 11: PENGEMBANGAN PRODUK INFORMASI DAN DISEMINASI …pusfatja.lapan.go.id/files_uploads_ebook/publikasi/Buku Laporan... · Akhir kata, tak ada gading yang tak retak, buku ini tentunya

2

tinggi. Seiring dengan hal tersebut, permintaan pengguna dari tahun ke tahun meningkat sehingga pelayanannya juga harus ditingkatkan.

Oleh karena itu diperlukan sistem otomatisasi pengolahan data penginderaan jauh, sehingga pengolahan data lebih cepat dan tidak memerlukan orang banyak dalam pengolahannya. Penghematan akan dapat dilakukan dan pelayanan informasi ke pengguna lebih cepat. Pembuatan software/sistem otomatisasi ini yang dibangun tentunya berdasarkan metode/model standar yang sudah disepakati bersama yang dihasilkan dari proses penelitian dan pengembangan yang sangat panjang.

Hal ini akhirnya akan mengoptimalkan pemanfaataan penginderaan jauh untuk mendukung sumberdaya alam, lingkungan, dan mitigasi bencana serta mewujudkan kemandirian bangsa dalam pengolahan data satelit penginderaan jauh. Dalam kegiatan ini, dua sistem otomatisasi telah dikembangkan yaitu informasi zona potensi penangkapan ikan dan deteksi daerah bekas terbakar. II. TUJUAN DAN SASARAN

Tujuan dari kegiatan ini adalah: 1) Menyediakan informasi berbasis penginderaan jauh sesuai dengan

permintaan pengguna. Informasi yang disajikan adalah informasi curah hujan, sistem peringkat bahaya kebakaran, informasi hotspot, informasi fase pertumbuhan padi, dan zona potensi penangkapan ikan serta informasi lain yang dibutuhkan

2) Membuat desain sistem otomatisasi untuk pengolahan data penginderaan jauh yang menghasilkan informasi-informasi seperti di atas

III. BAHAN DAN METODE

Masing-masing bahan dan metode dari pengolahan informasi berbasis penginderaan jauh dijabarkan sebagai berikut: a. Akumulasi curah hujan

Salah satu unsur utama dalam menentukan keragaman tipe iklim di Indonesia adalah curah hujan. Curah hujan merupakan sumber air tawar disebagian besar wilayah di dunia, yang menyediakan keragaman ekosistem, untuk pembangkit tenaga listrik dan irigasi. Curah hujan dihitung menggunakan pengukur hujan, yang secara aktif dengan radar cuaca dan secara pasif oleh satelit cuaca.

Salah satu satelit cuaca yang digunakan untuk menghitung curah hujan adalah data TRMM (Tropical Rainfall Measurement Mission) dan Qmorph. Salah satu kanal yang digunakan adalah kanal Infra Merah dan micro wave yang dapat digunakan untuk menurunkan suhu kecerahan awan. Data TRMM dan Qmorph dapat digunakan untuk memantau curah hujan hingga ketelitian 0.5 – 1 jam tiap hari serta resolusi spasial 27 km untuk TRMMM dan 8 km untuk Qmorph.

Proses Pengolahan: 1) Mendownload data di alamat:

ftp://trmmopen.gsfc.nasa.gov/pub/merged/mergeIRMicro/

Page 12: PENGEMBANGAN PRODUK INFORMASI DAN DISEMINASI …pusfatja.lapan.go.id/files_uploads_ebook/publikasi/Buku Laporan... · Akhir kata, tak ada gading yang tak retak, buku ini tentunya

3

2) Mengolah data TRMM tersebut menjadi informasi curah hujan menggunakan perangkat lunak GRADS dan Adobe Photoshop

3) Data diolah per 3 jam sehingga diperoleh 8 data dalam 1 hari 4) Informasi yang dihasilkan merupakan informasi harian dan bulanan.

b. Prediksi Curah Hujan Bulanan

Salah satu unsur utama yang menentukan keragaman iklim adalah curah hujan, baik yang aktual maupun prediksi. Prediksi iklim bulanan yang berupa prediksi Outgoing Longwave Radiation (OLR) dan estimasi curah hujan di wilayah Indonesia hingga 4 (empat) bulan ke depan berdasarkan input anomali suhu permukaan laut di Samudera Pasifik. Peningkatan/penurunan anomali OLR yang berkaitan dengan penurunan/peningkatan curah hujan diperoleh dari selisih nilai bulanan dengan nilai rata-rata bulanan selama 22 tahun (1982 – 2003).

Proses Pengolahan: 1) Mendownload data suhu permukaan laut di alamat:

http://www.cdc.noaa.gov/cgi-bin/db_search/DBSearch.pl?Dataset=NOAA+Optimum+Interpolation+(OI)+SST+V2&Variable=Sea+Surface+Temperature

2) Membuat prediksi OLR dan curah hujan untuk 4 bulan berikutnya 3) Membuat layout OLR dan Curah Hujan 4) Informasi yang dihasilkan merupakan informasi bulanan

c. Potensi Banjir dan Longsor

Sebagai wilayah yang memiliki 2 musim, yaitu Hujan dan Kemarau, Indonesia adakalanya mengalami bencana yang diakibatkan oleh pengaruh 2 musim tersebut. Bencana yang biasa terjadi di Indonesia adalah banjir di musim hujan dan kekeringan di musim kemarau.

Banjir yang terjadi di wilayah Indonesia biasanya akibat curah hujan yang berlebih yang mengakibatkan tanah dan sungai tak mampu menampung air hujan, sehingga air mengalir mengakibatkan banjir. Curah hujan yang terjadi dapat diukur dengan menggunakan data penginderaan jauh, dalam hal ini data satelit lngkungan dan cuaca MTSAT.

Proses Pengolahan: 1) Download data dari:

http://weather.is.kochi-u.ac.jp/sat/gms.sea (data dalam format jpg) 2) Membuat nilai rata-rata bulanan dari data harian 3) Melakukan koreksi geometrik 4) Mengubah data menjadi nilai Brightness Temperature 5) Menentukan tingkat peluang hujan, dengan menggunakan suhu <25°C

sebagai hujan lebat yang berpotensi banjir. 6) Meng-overlay dengan batas administrasi untuk mendapatkan curah

hujan per provinsi dan membuat layout daerah potensi genangan per pulau.

d. Sistem Peringkat Bahaya Kebakaran (SPBK)

Sistem Peringkat Bahaya Kebakaran disajikan dalam 4 keluaran, yaitu: a) Potensi Tingkat Kemudahan Penyulutan Api; b) Potensi Tingkat Kekeringan dan Asap; c) Kesulitan Pengendalian Kebakaran; dan d) Indeks Cuaca Kebakaran.

Page 13: PENGEMBANGAN PRODUK INFORMASI DAN DISEMINASI …pusfatja.lapan.go.id/files_uploads_ebook/publikasi/Buku Laporan... · Akhir kata, tak ada gading yang tak retak, buku ini tentunya

4

1) Potensi Tingkat Kemudahan Penyulutan Api (FFMC) Merupakan peringkat numerik dari kandungan kadar air bahan bakaran halus. FFMC digunakan sebagai indikator kemudahan tersulut dan tersebarnya api (kebakaran). Peringkat FFMC tinggi biasanya terjadi pada rerumputan dan bahan bakaran halus lainnya yang kering/mati dan terdapat pada wilayah terbuka.

2) Potensi Tingkat Kekeringan dan Asap (DC) Merupakan peringkat numerik dari kandungan kadar air di lapisan organik yang berada di bawah permukaan tanah. DC digunakan sebagai indikator kekeringan dan potensi terjadinya kabut asap. Peringkat DC yang tinggi biasanya terjadi pada kebakaran lahan gambut.

3) Kesulitan Pengendalian (ISI) Merupakan peringkat numerik dari penyebaran api/kebakaran untuk bahan bakaran halus (rerumputan).

4) Index Cuaca Kebakaran (FWI) Merupakan peringkat numerik dari intensitas kebakaran. FWI merupakan peringkat bahaya kebakaran secara umum.

Metoda:

Input yang digunakan: - Suhu udara dari data NOAA-AVHRR - Kelembaban relatif dari NOAA-AVHRR - Akumulasi curah hujan 24 jam dari data Qmorph, NCEP-USA - Kecepatan dan arah angin dari TXLAP, BOM Australia Proses Pengolahan: - Mengolah data NOAA-AVHRR untuk menduga suhu udara dan

kelembaban relatif (elevasi sebagai salah satu input) - Mengolah data curah hujan Qmorph dari NCEP-USA - Mengolah data kecepatan angin dari data TXLAP-BOM,-Australia - Memasukkan input data suhu udara, kelembaban relatif, curah hujan,

dan kecepatan angin dalam Microsoft Access - Menjalankan software sFMS yang merupakan extention dari software

ArcView - Membuat layout peta

e. Lokasi dan Distribusi Hotspot

Salah satu bencana yang sering terjadi di wilayah Indonesia adalah kebakaran hutan/lahan, yang sangat mengganggu dan merugikan baik dari segi ekonomi maupun ekologi. Dampak yang ditimbulkan dari kebakaran hutan/lahan dari segi ekonomi adalah hilangnya ribuan hektar hutan/lahan yang merupakan sumber devisa. Dari segi ekologi, kebakaran hutan/lahan menyebabkan terjadinya deforestasi dan degradasi fungsi hutan, memusnahkan ribuan spesies hewan dan tanaman di dalamnya. Dampak lain dari kebakaran hutan/lahan ini adalah gangguan asap kebakaran yang mengganggu kesehatan manusia. Guna meminimalkan dampak dari kebakaran hutan/lahan tersebut, dilakukan pemantauan secara kontinu hingga terjadinya kebakaran hutan/lahan dapat diketahui lebih dini, salah satu diantaranya adalah dengan mengamati titik panas/hotspot menggunakan data penginderaan jauh.

Page 14: PENGEMBANGAN PRODUK INFORMASI DAN DISEMINASI …pusfatja.lapan.go.id/files_uploads_ebook/publikasi/Buku Laporan... · Akhir kata, tak ada gading yang tak retak, buku ini tentunya

5

Proses Pengolahan: 1) Mendownload data hotspot MODIS Katalog LAPAN 2) Melakukan overlay data hotspot dengan base-map wilayah Indonesia 3) Mengkroping data hotspot wilayah Indonesia 4) Mengkroping data hotspot untuk pulau-pulau yang biasa terjadi

kebakaran hutan/lahan. 5) Melakukan layout peta sebaran titik panas/hotspot.

f. Deteksi Area Bekas Terbakar

Selain mengamati lokasi dan distribusi titik panas/hotspot LAPAN juga melakukan penghitungan luas area bekas terbakar dengan menggunakan citra satelit MODIS.

Metode yang digunakan adalah Change Detection berdasarkan nilai index kebakaran NBR (Normalized Burn Ratio) dari data MODIS sebelum dan setelah periode tertentu, dengan masking data MODIS Fire Hotspot yang diperluas hingga radius 3 KM.

Input: 1) MODIS Terra/Aqua harian (MOD 09) 2) MODIS Fire Hotspot harian (MOD 14) 3) Vektor batas administrasi Proses Pengolahan: 1) Ekstraksi NBR dari data harian 2) Ekstraksi NBR-max dari data NBR 10 harian 3) Ekstraksi dNBR (menghitung selisih NBRmax dengan NBRmax periode

sebelumnya) 4) Ekstraksi FHS dari data Fire Hotspot 10 harian 5) Masking NBR-max dan dNBR dengan FHS yang diperluas hingga radius

3 KM 6) Ekstraksi burner area, menggunakan default threshold

g. Tingkat Kehijauan Vegetasi dan Fase Pertumbuhan Padi

Kekeringan adalah fenomena alam yang merugikan manusia dikarenakan langkanya ketersediaan air yang terjadi akibat lamanya musim kemarau atau musim kemarau yang panjang. Kekeringan tersebut akan berakibat pada gagalnya tanaman berproduksi, kebakaran hutan/lahan dan lain-lain. Salah satu cara untuk memantau kekeringan lahan, dalam hal ini lahan sawah adalah dengan menggunakan data penginderaan jauh satelit, karena cakupannya yang luas dan dapat memantau secara terus menerus. Pemantauan dilakukan dengan menggunakan data tingkat kehijauan/indeks vegetasi dari data MODIS.

Proses Pengolahan: 1) MODIS 8 harian dari Pustekdata 2) Mengkonversi agar data MODIS 8 harian bisa di baca software ER-

Mapper (tif format) 3) Mengkonversi EVA menjadi indeks vegetasi 4) Mereklas indeks vegetasi menajadi 7 kelas 5) Membuat layout kelas tkv perprovinsi 6) Membuat kelas fase pertumbuhan tanaman padi

Page 15: PENGEMBANGAN PRODUK INFORMASI DAN DISEMINASI …pusfatja.lapan.go.id/files_uploads_ebook/publikasi/Buku Laporan... · Akhir kata, tak ada gading yang tak retak, buku ini tentunya

6

h. Zona Potensi Penangkapan Ikan Lembaga Penerbangan dan Antariksa Nasional (LAPAN) sebagai salah

satu lembaga penelitian pemerintah sejak tahun 2002 telah berkontribusi dalam memberikan informasi mengenai daerah potensi penangkapan ikan atau yang biasa disebut informasi zona potensi penangkapan ikan (ZPPI) kepada nelayan lokal melalui kegiatan produksi informasi bagi nelayan perikanan tangkap. Dimana didalam pendistribusian informasi ZPPI tersebut melibatkan Pemda, Dinas Pengamanan-AL, BAKORKAMLA, ARMABAR, Pangkalan TNI AL Manado, Dinas Perikanan dan Kelautan, LSM dan nelayan itu sendiri.

Dalam melaksanakan kegiatan produksi dan distribusi informasi ZPPI di tahun 2014 ini LAPAN membagi wilayah distribusi menjadi tiga wilayah, yaitu wilayah Indonesia bagian Barat, Indonesia bagian Tengah dan Timur Indonesia. Wilayah Barat Indonesia meliputi PA1 (Perairan Nangroe Aceh Darussalam dan Sumatera Utara), PA2 (Perairan Selat Malaka dan Sumatera Utara), PA3 (Perairan Natuna), PA10 (Perairan Bengkulu dan Lampung), PA11 (Perairan Bangka Belitung dan Laut Jawa Bagian Barat), dan PA19 (Perairan Laut Selatan Jabar dan Jateng), sedangkan wilayah Indonesia bagian Tengah meliputi PA05 (Perairan Kalimantan Timur dan Laut Sulawesi), PA06 (Perairan Laut Sulawesi dan perairan Maluku Utara), PA12 (Perairan Laut Jawa Bagian Timur), PA13 (Perairan Selat Makassar), PA14 (Perairan Laut Maluku dan Laut Banda), PA20 (Perairan Laut Selatan Jawa Timur dan Bali), PA21 (Perairan Laut Selatan Nusa Tenggara Barat), dan PA22 (Perairan Laut Selatan Nusa Tenggara Timur), dan wilayah Timur Indonesia meliputi PA7 (Perairan Laut Halmahera dan Samudera Pasifik), PA15 (Perairan Laut Seram dan Laut Banda), PA16 (Perairan Laut Arafura dan Samudera Fasifik) dan PA24 (Perairan Laut Arafura). Sistem otomatisasi pengolahan data zona potensi penangkapan ikan sudah dilakukan setiap hari. IV. HASIL DAN PEMBAHASAN

Hasil yang telah dicapai antara lain: a. Akumulasi Curah Hujan

Akumulasi Curah Hujan berdasarkan data Tropical Rainfall Measurement Mission (TRMM) dan data Qmorph bulan Januari 2015 sampai dengan Desember 2015 telah dilaksanakan.

Di awal tahun secara umum curah hujan di beberapa wilayah masih tinggi, dan terus menurun hingga bulan September - Oktober 2015, kemudian Curah Hujan kembali meningkat seperti terlihat pada gambar berikut:

Page 16: PENGEMBANGAN PRODUK INFORMASI DAN DISEMINASI …pusfatja.lapan.go.id/files_uploads_ebook/publikasi/Buku Laporan... · Akhir kata, tak ada gading yang tak retak, buku ini tentunya

7

Gambar 1 Akumulasi curah hujan bulan Januari 2015 berdasarkan data TRMM

Gambar 2 Akumulasi curah hujan bulan Januari 2015 berdasarkan data Qmorph

Page 17: PENGEMBANGAN PRODUK INFORMASI DAN DISEMINASI …pusfatja.lapan.go.id/files_uploads_ebook/publikasi/Buku Laporan... · Akhir kata, tak ada gading yang tak retak, buku ini tentunya

8

Gambar 3 Akumulasi curah hujan bulan April 2015 berdasarkan data TRMM

Gambar 4 Akumulasi curah hujan bulan April 2015 berdasarkan data Qmorph

Page 18: PENGEMBANGAN PRODUK INFORMASI DAN DISEMINASI …pusfatja.lapan.go.id/files_uploads_ebook/publikasi/Buku Laporan... · Akhir kata, tak ada gading yang tak retak, buku ini tentunya

9

Gambar 5 Akumulasi curah hujan bulan Juli 2015 berdasarkan data TRMM

Gambar 6 Akumulasi curah hujan bulan Juli 2015 berdasarkan data Qmorph

Page 19: PENGEMBANGAN PRODUK INFORMASI DAN DISEMINASI …pusfatja.lapan.go.id/files_uploads_ebook/publikasi/Buku Laporan... · Akhir kata, tak ada gading yang tak retak, buku ini tentunya

10

Gambar 7 Akumulasi curah hujan bulan Oktober 2015 berdasarkan data TRMM

Gambar 8 Akumulasi curah hujan bulan Oktober 2015 berdasarkan data Qmorph

Page 20: PENGEMBANGAN PRODUK INFORMASI DAN DISEMINASI …pusfatja.lapan.go.id/files_uploads_ebook/publikasi/Buku Laporan... · Akhir kata, tak ada gading yang tak retak, buku ini tentunya

11

b. Prediksi Curah Hujan Bulanan Prediksi curah hujan bulanan berupa prediksi Outgoing Longwave

Radiation (OLR) dan estimasi curah hujan di wilayah Indonesia telah dilaksanakan dengan cakupan hingga 4 (empat) bulan ke depan.

Berikut contoh prediksi curah hujan yang dibuat berdasarkan dara pada Januari 2015.

Gambar 9 Prediksi OLR bulan Februari 2015

Gambar 10 Prediksi anomali OLR bulan Februari 2015

Page 21: PENGEMBANGAN PRODUK INFORMASI DAN DISEMINASI …pusfatja.lapan.go.id/files_uploads_ebook/publikasi/Buku Laporan... · Akhir kata, tak ada gading yang tak retak, buku ini tentunya

12

Gambar 11 Prediksi estimasi curah hujan bulan Februari 2015

Gambar 12 Prediksi anomali estimasi curah hujan bulan Februari 2015

c. Potensi Banjir dan Longsor

Pembuatan informasi spasial daerah potensi banjir yang dibuat berdasarkan hasil pengolahan prediksi curah hujan dan peta daerah rawan genangan telah dilaksanakan.

Berikut contoh informasi spasial daerah potensi banjir yang dibuat pada Januari 2015.

Page 22: PENGEMBANGAN PRODUK INFORMASI DAN DISEMINASI …pusfatja.lapan.go.id/files_uploads_ebook/publikasi/Buku Laporan... · Akhir kata, tak ada gading yang tak retak, buku ini tentunya

13

Gambar 13 Informasi spasial daerah potensi banjir di Pulau Kalimantan Februari 2015

Gambar 14 Informasi spasial daerah potensi banjir di Pulau Kalimantan Maret 2015

Page 23: PENGEMBANGAN PRODUK INFORMASI DAN DISEMINASI …pusfatja.lapan.go.id/files_uploads_ebook/publikasi/Buku Laporan... · Akhir kata, tak ada gading yang tak retak, buku ini tentunya

14

d. Sistem Peringkat Bahaya Kebakaran (SPBK) Kegiatan Sistem Peringkat Bahaya Kebakaran (SPBK) yang disajikan

dalam 4 keluaran telah dilaksanakan, yaitu: Potensi Tingkat Kemudahan Penyulutan Api, Potensi Tingkat Kekeringan dan Asap, Kesulitan Pengendalian Kebakaran, dan Indeks Cuaca Kebakaran.

Berikut contoh informasi spasial Sistem Peringkat Bahaya Kebakaran (SPBK) pada 10 hari pertama bulan Januari 2015:

Gambar 15 Potensi Tingkat Kemudahan Penyulutan Api 10 hari pertama Oktober 2015

Gambar 16 Potensi Tingkat Kekeringan dan Asap 10 hari pertama Oktober 2015

Page 24: PENGEMBANGAN PRODUK INFORMASI DAN DISEMINASI …pusfatja.lapan.go.id/files_uploads_ebook/publikasi/Buku Laporan... · Akhir kata, tak ada gading yang tak retak, buku ini tentunya

15

Gambar 17 Kesulitan Pengendalian Kebakaran 10 hari pertama Oktober 2015

Gambar 18 Indeks Cuaca Kebakaran 10 hari pertama Oktober 2015

e. Lokasi dan Distribusi Titik Panas (Hotspot)

Pemantauan titik panas berdasarkan data Terra/Aqua MODIS untuk seluruh wilayah Indonesia telah dilaksanakan, distribusi hotspot terbanyak di tahun ini terdapat pada bulan Oktober 2015.

Berikut rekapitulasi titik panas (hotspot) pada Oktober 2015

Page 25: PENGEMBANGAN PRODUK INFORMASI DAN DISEMINASI …pusfatja.lapan.go.id/files_uploads_ebook/publikasi/Buku Laporan... · Akhir kata, tak ada gading yang tak retak, buku ini tentunya

16

Gambar 19 Rekapitulasi Titik Panas (Hotspot) bulan Oktober 2015

f. Deteksi Area Bekas Terbakar

Deteksi area bekas terbakar dengan menggunakan citra satelit MODIS telah dilaksanakan. Selain dengan cara manual, dikembangkan pula aplikasi untuk mendeteksi area bekas terbakar agar prosesnya menjadi lebih cepat dan konsisten serta hasilnya standar.

Adapun sorce code aplikasi terlampir. g. Tingkat Kehijauan Vegetasi dan Fase Pertumbuhan Padi

Pemantauan Tingkat Kehijauan Vegetasi dan Fase Pertumbuhan Padi 8 harian dalam setahun menggunakan data tingkat kehijauan/indeks vegetasi yang bersumber dari data MODIS telah dilaksanakan.

Berikut contoh informasi spasial Tingkat Kehijauan Vegetasi dan Fase Pertumbuhan Padi pada 8 hari pertama bulan Januari 2015:

Page 26: PENGEMBANGAN PRODUK INFORMASI DAN DISEMINASI …pusfatja.lapan.go.id/files_uploads_ebook/publikasi/Buku Laporan... · Akhir kata, tak ada gading yang tak retak, buku ini tentunya

17

Gambar 20 Tingkat Kehijauan Vegetasi dan Fase Pertumbuhan Padi pada 8 hari

pertama Januari 2015

h. Informasi Zona Potensi Penangkapan Ikan (ZPPI)

Informasi ini telah dibuat berdasarkan analisis data suhu permukaan laut dan konsentrasi klorofil permukaan dari satelit NOAA-AVHRR dan Terra/Aqua MODIS.

Berikut contoh informasi spasial Zona Potensi Penangkapan Ikan pada Januari 2015:

Gambar 21 Informasi Zona Potensi Penangapan Ikan bulan Januari 2015

Page 27: PENGEMBANGAN PRODUK INFORMASI DAN DISEMINASI …pusfatja.lapan.go.id/files_uploads_ebook/publikasi/Buku Laporan... · Akhir kata, tak ada gading yang tak retak, buku ini tentunya

18

Daerah dominasi ditandai dengan perairan diarsir warna merah. Daerah yang tidak terdeteksinya ZPPI dapat disebabkan oleh seringnya perairan tersebut tertutup awan dan/atau tidak adanya front suhu permukaan laut. i. Diseminasi Informasi

Berikut daftar instansi terkait yang menerima laporan bulanan hasil kegiatan bidang Produksi Informasi secara rutin.

Tabel 1 Daftar nama instansi penerima laporan

No. Nama Instansi

1 Kepala Badan Meteorologi, Klimatologi dan Geofisika (BMKG) Jl. Angkasa I no. 2, Kemayoran, Jakarta 10720

2 Direktur Jenderal Sumber Daya Air Departemen Pekerjaan Umum, Jl. Pattimura, No 20, Kebayoran Baru, Jakarta

3 Kepala Badan Litbang Departemen Pertanian Jl. Ragunan No. 29, Pasar Minggu, Jakarta Selatan

4 Kepala Badan Ketahanan Pangan Departeman Pertanian, Jl. Harsono RM No 3, Gedung E, Jakarta 12550

5 Deputi Bidang Pendayagunaan dan Pemasyarakatan IPTEK Kementerian Riset dan Teknologi, Gedung BPP Teknologi, Lantai 6, Jl. M. H. Thamrin no. 8, Jakarta Pusat

6 Deputi Bidang Statistik Ekonomi Badan Pusat Statistik (BPS), Jl. Dr. Sutomo 6-8, Jakarta 10710

7 Deputi Bidang Survei Dasar Sumberdaya Alam BAKOSURTANAL Jl. Raya Jakarta-Bogor Km.46 Cibinong

8 Deputi Bidang Koordinasi Kerawanan Sosial Kementerian Koordinator Bidang Kesejahteraan Rakyat, Jl. Medan Merdeka Barat No. 3 Jakarta Pusat

9 Direktur Pengelolaan Lahan Ditjen Pengelolaan Lahan dan Air, Departemen Pertanian Jl. Harsono RM No. 3, Gedung D, Lantai 9, Ragunan, Jakarta

10 Direktur Penanggulangan Kebakaran Hutan Departemen Kehutanan, Gd. Manggala Wanabakti, Blok 7, Lantai 13, Jl. Gatot Subroto, Jakarta 10270

11 Kepala Pusat Data dan Informasi Pertanian Departemen Pertanian, Jl. Harsono RM No 3, Gedung D, Lantai 4, Ragunan, Jakarta 12550

12 Kepala Biro Data BAKORNAS PB, Jl. Ir. H. Juanda 36 Jakarta Pusat

Page 28: PENGEMBANGAN PRODUK INFORMASI DAN DISEMINASI …pusfatja.lapan.go.id/files_uploads_ebook/publikasi/Buku Laporan... · Akhir kata, tak ada gading yang tak retak, buku ini tentunya

19

No. Nama Instansi

13 Asisten Deputi Urusan Pengendalian Kerusakan Hutan dan Lahan Deputi Bidang Peningkatan Konservasi Sumberdaya Alam dan Pengendalian Kerusakan Lingkungan Kementerian Negara Lingkungan Hidup, Jl. D.I. Panjaitan Kav. 42, Kebon Nanas, Jakarta 13410

14 Kepala Pusat Dokumentasi dan Informasi Ilmiah (PDII) Lembaga Ilmu Pengetahuan Indonesia (LIPI), Lantai 2, Jl. Gatot Subroto no 10, Jakarta 12710

15 Kepala Bappeda Provinsi Sumatera Barat (Ir. Hediyanto W. Husaini, MSCE, M.Si) Jl. Khatib Sulaiman No. 1 Padang 25114

16 Kepala Bappeda Provinsi Sumatera Selatan Jl. Ade Irma Nasution no. 10, Palembang, Sumatera Selatan

17 Kepala BMKG Kenten Perumnas sako Kenten, Palembang, Sumatera Selatan

18 Kepala Bapedalda Provinsi Kalimantan Barat Jl. A. Yani, Pontianak, Kalimantan Barat

19 Kepala Bapedal Provinsi Riau Jl. Thamrin No. 90, Pekanbaru 28132

20 Kepala Dinas Kehutanan Provinsi Kalimantan Tengah Jl. Imam Bonjol no. 1A, Palangkaraya, Kalimantan Tengah

21 Kepala BPPLHD Provinsi Kalimantan Tengah Jl. Willem AS, Palangkaraya, Kalimantan Tengah

22 Kasubdin Perlindungan dan Pengamanan Hutan Dinas Kehutanan Provinsi Sumatera Selatan Jl. Kol. H. Barlian KM 6.5, Punti Kayu, Palembang, Sumatera Selatan

23 Kepala Pusat Pengendalian Kebakaran dan Rehabilitasi Hutan, Lembaga Pengabdian Pada Masyarakat – Universitas Palangkaraya (UNPAR) Jl. H. Timang Kampus UNPAR, Palangkaraya 73112, Kalimantan Tengah

24 Thivan Hoang Head of Technical Support UN World Food Programme Wisma Kyoei Prince, 9th Floor. Jl. Jend. Sudirman Kav 3. Jakarta 10220

25 Head of Environment and Disaster Management Bureau for Resources Development ASEAN Secretariat, 70A Jl. Sisingamangaraja, Jakarta 12110

26 Kepala UPTD Pengendalian Kebakaran Hutan (SSFFMP) Jl. Jend. Sudirman no. 2837 KM 3,5 – PO Box 1229, Palembang 30129, Sumatera Selatan

Page 29: PENGEMBANGAN PRODUK INFORMASI DAN DISEMINASI …pusfatja.lapan.go.id/files_uploads_ebook/publikasi/Buku Laporan... · Akhir kata, tak ada gading yang tak retak, buku ini tentunya

20

No. Nama Instansi

27 Totok S. Business & Support, PT Garudafood, Jl. Bintaro Raya No 10A Tanah Kusir Jakarta Selatan, 12240

28 Letkol Budi Purwanto Ban V Straops Sopsal, Mabes TNI AL Cilangkap, Jakarta Timur 13870 (021-8710022)

29 Kepala Balai Taman Nasional Sebangau Dirjen perlindungan Hutan dan Konservasi Alam – Dephut Jl.Mahir Mahar KM 1,2 PO BOX 65, Palangka Raya – Kalimantan Tengah 73113

30 Divisi R and D BULOG c.q. Kasubdiv Renstra, Gedung BULOG Lt. 11, Jl. Jend. Gatot Subroto No. 49, Jakarta 12950

31 Direktur Pengelolaan Air Irigasi Jl. Taman Margasatwa No.3 Ragunan, Pasar Minggu – Jakarta Selatan

32 Kepala Badan Lingkungan Hidup Provinsi Kalimantan Tengah UP. Kepala Bidang Pengendalian Pencemaran Lingkungan d.a. Jl. Williem AS. No. 8 Palangka Raya, Kalimantan Tengah

33 Ir. Siti Aisyah, M.Si. Badan Lingkungan Hidup Sumatera Barat, Jl. Khotib Sulaiman No. 22, Padang, Sumatera Barat

V. KESIMPULAN DAN SARAN

Telah dilaksanakan pengolahan, penyediaan dan pendiseminasian informasi berbasi penginderaan jauh yang terdiri atas informasi curah hujan, sistem peringkat bahaya kebakaran, informasi hotspot, area bekas terbakar, informasi fase pertumbuhan padi, dan zona potensi penangkapan ikan serta informasi-informasi kebencanaan lainnya baik secara otomatis maupun manual.

Desain sistem otomatisasi untuk pengolahan data penginderaan jauh masih harus terus dikembangkan dikembangkan agar pelayanan data dan informasi dapat dilaksanakan lebih cepat, tepat dan standar.

Page 30: PENGEMBANGAN PRODUK INFORMASI DAN DISEMINASI …pusfatja.lapan.go.id/files_uploads_ebook/publikasi/Buku Laporan... · Akhir kata, tak ada gading yang tak retak, buku ini tentunya

21

LAMPIRAN Sorce-code Aplikasi Deteksi Area Terbakar

Listing BurnedArea.py

#!/usr/bin/python

# aplikasi utama

import period, NBR, FHS, Burned, os, sys, getopt, datetime

start_time = datetime.datetime.now()

year = None

month = None

length = 5

session = None

b2_path = '../../../SIMBA/Otomatisasi/MODIS/Images/GeoTIFs/CorrRefl500m/'

b2_year_pos = 0

b2_month_pos = None

b2_day_pos = None

b2_dayofyear_pos = 5

b2_hour_pos = 9

b2_minute_pos = 11

b2_sign_1 = '.'

b2_sign_1_pos = 4

b2_sign_2 = '_500m_CorrRefl_02.tif'

b2_sign_2_pos = 13

b7_path = '../../../SIMBA/Otomatisasi/MODIS/Images/GeoTIFs/CorrRefl500m/'

b7_year_pos = 0

b7_month_pos = None

b7_day_pos = None

b7_dayofyear_pos = 5

Page 31: PENGEMBANGAN PRODUK INFORMASI DAN DISEMINASI …pusfatja.lapan.go.id/files_uploads_ebook/publikasi/Buku Laporan... · Akhir kata, tak ada gading yang tak retak, buku ini tentunya

22

b7_hour_pos = 9

b7_minute_pos = 11

b7_sign_1 = '.'

b7_sign_1_pos = 4

b7_sign_2 = '_500m_CorrRefl_07.tif'

b7_sign_2_pos = 13

fhs_path = '../../../SIMBA/Otomatisasi/MODIS/Images/GeoTIFs/mod14/'

fhs_year_pos = 0

fhs_month_pos = None

fhs_day_pos = None

fhs_dayofyear_pos = 5

fhs_hour_pos = 9

fhs_minute_pos = 11

fhs_sign_1 = '.'

fhs_sign_1_pos = 4

fhs_sign_2 = '_M14_fire_mask.tif'

fhs_sign_2_pos = 13

mysql_host = 'localhost'

mysql_user = 'root'

mysql_password = 'Kuro1234'

mysql_db = 'BurnedArea'

burned_file = None

get_help = 'Try \'%s --help\' for more information.' % sys.argv[0]

try:

opts, args = getopt.getopt(sys.argv[1:],'y:m:l:s:2:7:f:ha', ['year=', 'month=', 'length=', 'session=', \

'b2-path=', 'b2-year-pos=', 'b2-month-pos=', 'b2-day-pos=', 'b2-dayofyear-pos=', 'b2-hour-pos=', 'b2-minute-pos=', \

'b2-sign-1=', 'b2-sign-1-pos=', 'b2-sign-2=', 'b2-sign-2-pos=', \

'b7-path=', 'b7-year-pos=', 'b7-month-pos=', 'b7-day-pos=', 'b7-dayofyear-pos=', 'b7-hour-pos=', 'b7-minute-pos=', \

Page 32: PENGEMBANGAN PRODUK INFORMASI DAN DISEMINASI …pusfatja.lapan.go.id/files_uploads_ebook/publikasi/Buku Laporan... · Akhir kata, tak ada gading yang tak retak, buku ini tentunya

23

'b7-sign-1=', 'b7-sign-1-pos=', 'b7-sign-2=', 'b7-sign-2-pos=', \

'fhs-path=', 'fhs-year-pos=', 'fhs-month-pos=', 'fhs-day-pos=', 'fhs-dayofyear-pos=', 'fhs-hour-pos=', 'fhs-minute-pos=', \

'fhs-sign-1=', 'fhs-sign-1-pos=', 'fhs-sign-2=', 'fhs-sign-2-pos=', \

'help', 'about'])

except getopt.GetoptError:

print '%s: missing operand' % sys.argv[0]

print get_help

sys.exit()

for opt, arg in opts:

if opt in ('-h', '--help'):

print 'Usage: %s [option] <output file>' % sys.argv[0]

print 'Option:'

print ' -y, --year=<year> 4 digit year'

print ' -m, --month=<month> month (1..12)'

print ' -l, --length=<number> days per session'

print ' -s, --session=<number> session number'

print

print ' -2, --b2-path=<path> path of Band 2 files'

print ' --b2-year-pos=<position> year position from Band 2 file name'

print ' --b2-month-pos=<position> month position from Band 2 file name'

print ' --b2-day-pos=<position> day position from Band 2 file name'

print ' --b2-dayofyear-pos=<position> day of year position from Band 2 file name'

print ' --b2-hour-pos=<position> hour position from Band 2 file name'

print ' --b2-minute-pos=<position> minute position from Band 2 file name'

print ' --b2-sign-1=<text> 1st Band 2 file name sign'

print ' --b2-sign-1-pos=<position> 1st sign position from Band 2 file name'

print ' --b2-sign-2=<text> 2nd Band 2 file name sign'

print ' --b2-sign-2-pos=<position> 2nd sign position from Band 2 file name'

print

print ' -7, --b7-path=<path> path of Band 7 files'

print ' --b7-year-pos=<position> year position from Band 7 file name'

Page 33: PENGEMBANGAN PRODUK INFORMASI DAN DISEMINASI …pusfatja.lapan.go.id/files_uploads_ebook/publikasi/Buku Laporan... · Akhir kata, tak ada gading yang tak retak, buku ini tentunya

24

print ' --b7-month-pos=<position> month position from Band 7 file name'

print ' --b7-day-pos=<position> day position from Band 7 file name'

print ' --b7-dayofyear-pos=<position> day of year position from Band 7 file name'

print ' --b7-hour-pos=<position> hour position from Band 7 file name'

print ' --b7-minute-pos=<position> minute position from Band 7 file name'

print ' --b7-sign-1=<text> 1st Band 7 file name sign'

print ' --b7-sign-1-pos=<position> 1st sign position from Band 7 file name'

print ' --b7-sign-2=<text> 2nd Band 7 file name sign'

print ' --b7-sign-2-pos=<position> 2nd sign position from Band 7 file name'

print

print ' -f, --fhs-path=<path> path of FHS files'

print ' --fhs-year-pos=<position> year position from FHS file name'

print ' --fhs-month-pos=<position> month position from FHS file name'

print ' --fhs-day-pos=<position> day position from FHS file name'

print ' --fhs-dayofyear-pos=<position> day of year position from FHS file name'

print ' --fhs-hour-pos=<position> hour position from FHS file name'

print ' --fhs-minute-pos=<position> minute position from FHS file name'

print ' --fhs-sign-1=<text> 1st FHS file name sign'

print ' --fhs-sign-1-pos=<position> 1st sign position from FHS file name'

print ' --fhs-sign-2=<text> 2nd FHS file name sign'

print ' --fhs-sign-2-pos=<position> 2nd sign position from FHS file name'

print

print ' -h, --help display this help and exit'

print ' -a, --about display application information and exit'

sys.exit()

elif opt in ('-a', '--about'):

print 'BurnedArea v0.0.1'

print 'This is a small application for extracting Burned Area from MODIS satellite images'

print

Page 34: PENGEMBANGAN PRODUK INFORMASI DAN DISEMINASI …pusfatja.lapan.go.id/files_uploads_ebook/publikasi/Buku Laporan... · Akhir kata, tak ada gading yang tak retak, buku ini tentunya

25

print 'Copyright (c): 2015 LAPAN <http://www.lapan.go.id/>'

print 'All right reserved.'

sys.exit()

elif opt in ('-y', '--year'):

year = int(arg)

elif opt in ('-m', '--month'):

month = int(arg)

elif opt in ('-l', '--length'):

length = int(arg)

elif opt in ('-s', '--session'):

session = int(arg)

elif opt in ('-2', '--b2-path'):

b2_path = arg

elif opt == '--b2-year-pos':

b2_year_pos = int(arg)

elif opt == '--b2-month-pos':

b2_month_pos = int(arg)

elif opt == '--b2-day-pos':

b2_day_pos = int(arg)

elif opt == '--b2-dayofyear-pos':

b2_dayofyear_pos = int(arg)

elif opt == '--b2-hour-pos':

b2_hour_pos = int(arg)

elif opt == '--b2-minute-pos':

b2_minute_pos = int(arg)

elif opt == '--b2-sign-1':

b2_sign_1 = arg

elif opt == '--b2-sign-1-pos':

b2_sign_1_pos = int(arg)

elif opt == '--b2-sign-2':

b2_sign_2 = arg

elif opt == '--b2-sign-2-pos':

b2_sign_2_pos = int(arg)

elif opt in ('-7', '--b7-path'):

b7_path = arg

Page 35: PENGEMBANGAN PRODUK INFORMASI DAN DISEMINASI …pusfatja.lapan.go.id/files_uploads_ebook/publikasi/Buku Laporan... · Akhir kata, tak ada gading yang tak retak, buku ini tentunya

26

elif opt == '--b7-year-pos':

b7_year_pos = int(arg)

elif opt == '--b7-month-pos':

b7_month_pos = int(arg)

elif opt == '--b7-day-pos':

b7_day_pos = int(arg)

elif opt == '--b7-dayofyear-pos':

b7_dayofyear_pos = int(arg)

elif opt == '--b7-hour-pos':

b7_hour_pos = int(arg)

elif opt == '--b7-minute-pos':

b7_minute_pos = int(arg)

elif opt == '--b7-sign-1':

b7_sign_1 = arg

elif opt == '--b7-sign-1-pos':

b7_sign_1_pos = int(arg)

elif opt == '--b7-sign-2':

b7_sign_2 = arg

elif opt == '--b7-sign-2-pos':

b7_sign_2_pos = int(arg)

elif opt in ('-f', '--fhs-path'):

fhs_path = arg

elif opt == '--fhs-year-pos':

fhs_year_pos = int(arg)

elif opt == '--fhs-month-pos':

fhs_month_pos = int(arg)

elif opt == '--day-pos':

fhs_day_pos = int(arg)

elif opt == '--fhs-dayofyear-pos':

fhs_dayofyear_pos = int(arg)

elif opt == '--fhs-hour-pos':

fhs_hour_pos = int(arg)

elif opt == '--fhs-minute-pos':

fhs_minute_pos = int(arg)

elif opt == '--fhs-sign-1':

Page 36: PENGEMBANGAN PRODUK INFORMASI DAN DISEMINASI …pusfatja.lapan.go.id/files_uploads_ebook/publikasi/Buku Laporan... · Akhir kata, tak ada gading yang tak retak, buku ini tentunya

27

fhs_sign_1 = arg

elif opt == '--fhs-sign-1-pos':

fhs_sign_1_pos = int(arg)

elif opt == '--fhs-sign-2':

fhs_sign_2 = arg

elif opt == '--fhs-sign-2-pos':

fhs_sign_2_pos = int(arg)

if len(args) > 0:

burned_file = args[0]

if b2_path[:len(b2_path) - 1] != '/':

b2_path = b2_path + '/'

if b7_path[:len(b7_path) - 1] != '/':

b7_path = b7_path + '/'

if fhs_path[:len(fhs_path) - 1] != '/':

fhs_path = fhs_path + '/'

back = 0

if session != None:

if session < 0:

back = session

session = None

if (year is None) and (month is None) and (session is None):

(year, month, session) = period.get_session(length, back)

back = 0

if year is None:

year = datetime.datetime.now().year

if month is None:

month = datetime.datetime.now().month

Page 37: PENGEMBANGAN PRODUK INFORMASI DAN DISEMINASI …pusfatja.lapan.go.id/files_uploads_ebook/publikasi/Buku Laporan... · Akhir kata, tak ada gading yang tak retak, buku ini tentunya

28

if session is None:

session = 1

if b2_path is None:

print '%s: fatal error: no Band 2 path' % sys.argv[0]

print get_help

sys.exit()

if b7_path is None:

print '%s: fatal error: no Band 7 path' % sys.argv[0]

print get_help

sys.exit()

if fhs_path is None:

print '%s: fatal error: no FHS path' % sys.argv[0]

print get_help

sys.exit()

str_month = '0' + str(month)

str_month = str_month[-2:]

(pre_year, pre_month, pre_session) = period.pre_session(year, month, session, length, -1)

str_pre_month = '0' + str(pre_month)

str_pre_month = str_pre_month[-2:]

nbr_file = 'BurnedArea_NBR_%d-%s_%dd-%d.tif' % (year, str_month, length, session)

pnbr_file = 'BurnedArea_NBR_%d-%s_%dd-%d.tif' % (pre_year, str_pre_month, length, pre_session)

fhs_file = 'BurnedArea_FHS_%d-%s_%dd-%d.tif' % (year, str_month, length, session)

dnbr_file = 'BurnedArea_dNBR_%d-%s_%dd-%d.tif' % (year, str_month, length, session)

if burned_file is None:

burned_file = 'BurnedArea_%d-%s_%dd-%d.kml' % (year, str_month, length, session)

print

print 'Extracting NBR'

Page 38: PENGEMBANGAN PRODUK INFORMASI DAN DISEMINASI …pusfatja.lapan.go.id/files_uploads_ebook/publikasi/Buku Laporan... · Akhir kata, tak ada gading yang tak retak, buku ini tentunya

29

print '--------------'

(nbr_result, nbr_message) = NBR.maximum(year, month, length, session, 0, \

b2_path, b2_year_pos, b2_month_pos, b2_day_pos, b2_dayofyear_pos, b2_hour_pos, \

b2_minute_pos, b2_sign_1, b2_sign_1_pos, b2_sign_2, b2_sign_2_pos, \

b7_path, b7_year_pos, b7_month_pos, b7_day_pos, b7_dayofyear_pos, b7_hour_pos, \

b7_minute_pos, b7_sign_1, b7_sign_1_pos, b7_sign_2, b7_sign_2_pos, \

nbr_file)

print nbr_message

if not nbr_result:

sys.exit()

print

print 'Extracting pre-NBR'

print '------------------'

(pnbr_result, pnbr_message) = NBR.maximum(year, month, length, session, -1, \

b2_path, b2_year_pos, b2_month_pos, b2_day_pos, b2_dayofyear_pos, b2_hour_pos, \

b2_minute_pos, b2_sign_1, b2_sign_1_pos, b2_sign_2, b2_sign_2_pos, \

b7_path, b7_year_pos, b7_month_pos, b7_day_pos, b7_dayofyear_pos, b7_hour_pos, \

b7_minute_pos, b7_sign_1, b7_sign_1_pos, b7_sign_2, b7_sign_2_pos, \

pnbr_file)

print pnbr_message

if not pnbr_result:

sys.exit()

print

print 'Extracting FHS'

print '--------------'

(fhs_result, fhs_message) = FHS.maximum(year, month, length, session, 0, \

fhs_path, fhs_year_pos, fhs_month_pos, fhs_day_pos, fhs_dayofyear_pos, fhs_hour_pos, \

Page 39: PENGEMBANGAN PRODUK INFORMASI DAN DISEMINASI …pusfatja.lapan.go.id/files_uploads_ebook/publikasi/Buku Laporan... · Akhir kata, tak ada gading yang tak retak, buku ini tentunya

30

fhs_minute_pos, fhs_sign_1, fhs_sign_1_pos, fhs_sign_2, fhs_sign_2_pos, \

fhs_file)

print fhs_message

if not fhs_result:

sys.exit()

print

print 'Extracting dNBR...';

(dnbr_result, dnbr_message) = NBR.delta(nbr_file, pnbr_file, dnbr_file)

print dnbr_message

if not dnbr_result:

sys.exit()

print

print 'Extracting burned area...';

(burned_result, burned_message) = Burned.extract(nbr_file, 1, 4609, \

dnbr_file, None, -2583, \

fhs_file, 7, None, 3, \

mysql_host, mysql_user, mysql_password, mysql_db, \

burned_file)

print burned_message

if not burned_result:

sys.exit()

end_time = datetime.datetime.now()

run_time = end_time - start_time

print

print 'Run time:', run_time

Page 40: PENGEMBANGAN PRODUK INFORMASI DAN DISEMINASI …pusfatja.lapan.go.id/files_uploads_ebook/publikasi/Buku Laporan... · Akhir kata, tak ada gading yang tak retak, buku ini tentunya

31

Page 41: PENGEMBANGAN PRODUK INFORMASI DAN DISEMINASI …pusfatja.lapan.go.id/files_uploads_ebook/publikasi/Buku Laporan... · Akhir kata, tak ada gading yang tak retak, buku ini tentunya

32

Listing period.py

#!/usr/bin/python

# modul untuk menangani periode

import datetime

def get_text(text, position, length = None):

if length != None:

return text[(position < 0) * len(text) + position: (position < 0) * len(text) + position + length]

else:

return text[(position < 0) * len(text) + position:]

def get_digit(text, position, length = None):

digit = get_text(text, position, length)

while not digit.isdigit():

digit = digit[:len(digit) - 1]

return digit

def pre_session(year, month, session, length, back = 0):

while back < 0:

if session == 1:

date_limit = datetime.date(year, month, 1) - datetime.timedelta(days = 1)

year = int(date_limit.strftime("%Y"))

month = int(date_limit.strftime("%m"))

session = round(int(date_limit.strftime("%d")) / length)

else:

session -= 1

back += 1

return (year, month, session)

def day_limit(year, month, length, session, back = 0):

if (month < 1):

Page 42: PENGEMBANGAN PRODUK INFORMASI DAN DISEMINASI …pusfatja.lapan.go.id/files_uploads_ebook/publikasi/Buku Laporan... · Akhir kata, tak ada gading yang tak retak, buku ini tentunya

33

month = 1

elif (month > 12):

month = 12

if month == 12:

date_limit = datetime.date(year + 1, 1, 1) - datetime.timedelta(days = 1)

else:

date_limit = datetime.date(year, month + 1, 1) - datetime.timedelta(days = 1)

session_number = round(int(date_limit.strftime("%d")) / length)

if session < 1:

session = 1

elif session > session_number:

session = session_number

if back < 0:

(year, month, session) = pre_session(year, month, session, length, back)

day_first = (session - 1) * length + 1

day_last = session * length

if session == session_number:

if month == 12:

date_limit = datetime.date(year + 1, 1, 1) - datetime.timedelta(days = 1)

else:

date_limit = datetime.date(year, month + 1, 1) - datetime.timedelta(days = 1)

day_last = int(date_limit.strftime("%d"))

return (year, month, day_first, day_last)

def dayofyear_limit(year, month, length, session, back = 0):

(year, month, day_first, day_last) = day_limit(year, month, length, session, back)

date_first = datetime.date(year, month, day_first)

date_last = datetime.date(year, month, day_last)

dayofyear_first = int(date_first.strftime("%j"))

dayofyear_last = int(date_last.strftime("%j"))

return (year, dayofyear_first, dayofyear_last)

def get_session(length, back = 0):

Page 43: PENGEMBANGAN PRODUK INFORMASI DAN DISEMINASI …pusfatja.lapan.go.id/files_uploads_ebook/publikasi/Buku Laporan... · Akhir kata, tak ada gading yang tak retak, buku ini tentunya

34

date_session = datetime.datetime.now() - datetime.timedelta(days = 1)

year = int(date_session.strftime("%Y"))

month = int(date_session.strftime("%m"))

day = int(date_session.strftime("%d"))

if day < length:

date_session = datetime.date(year, month, 1) - datetime.timedelta(days = 1)

year = int(date_session.strftime("%Y"))

month = int(date_session.strftime("%m"))

session = round(int(date_session.strftime("%d")) / length)

else:

session = round(day / length)

(year, month, day_first, day_last) = day_limit(year, month, length, session)

if day < day_last:

session -= 1

if back < 0:

(year, month, session) = pre_session(year, month, session, length, back)

return (year, month, session)

Page 44: PENGEMBANGAN PRODUK INFORMASI DAN DISEMINASI …pusfatja.lapan.go.id/files_uploads_ebook/publikasi/Buku Laporan... · Akhir kata, tak ada gading yang tak retak, buku ini tentunya

35

Listing FHS.py

#!/usr/bin/python

# modul untuk menangani modis 14

import period, os, shutil, gdal, osr, numpy

def save_maximum(fhs_file, max_file):

if (fhs_file is None) or (max_file is None):

return (False, 'Missing parameters')

if os.path.isfile(max_file):

fhs_dataset = gdal.Open(fhs_file, gdal.GA_ReadOnly)

if fhs_dataset is None:

return (False, 'Can\'t open FHS file')

max_dataset = gdal.Open(max_file, gdal.GA_Update)

if max_dataset is None:

return (False, 'Can\'t open FHS-max file')

fhs_auth = max_auth = None

fhs_epsg = max_epsg = None

fhs_reference = osr.SpatialReference(fhs_dataset.GetProjection())

max_reference = osr.SpatialReference(max_dataset.GetProjection())

if fhs_reference.IsProjected:

fhs_auth = fhs_reference.GetAttrValue('AUTHORITY')

fhs_epsg = fhs_reference.GetAttrValue('AUTHORITY', 1)

if max_reference.IsProjected:

max_auth = max_reference.GetAttrValue('AUTHORITY')

max_epsg = max_reference.GetAttrValue('AUTHORITY', 1)

if not ((fhs_auth.upper() == max_auth.upper() == 'EPSG') and (fhs_epsg == max_epsg)):

Page 45: PENGEMBANGAN PRODUK INFORMASI DAN DISEMINASI …pusfatja.lapan.go.id/files_uploads_ebook/publikasi/Buku Laporan... · Akhir kata, tak ada gading yang tak retak, buku ini tentunya

36

return (False, 'FHS and FHS-max different geographic coordinate system')

fhs_geotransform = fhs_dataset.GetGeoTransform()

max_geotransform = max_dataset.GetGeoTransform()

if (fhs_geotransform[0] != max_geotransform[0]) or (fhs_geotransform[3] != max_geotransform[3]) \

or (fhs_geotransform[1] * fhs_dataset.RasterXSize != max_geotransform[1] * max_dataset.RasterXSize) \

or (fhs_geotransform[5] * fhs_dataset.RasterYSize != max_geotransform[5] * max_dataset.RasterYSize):

return (False, 'FHS and FHS-max different position or size')

fhs_band = fhs_dataset.GetRasterBand(1)

max_band = max_dataset.GetRasterBand(1)

new_projection = max_dataset.GetProjection()

new_geotransform = max_dataset.GetGeoTransform()

new_xsize = max_band.XSize

new_ysize = max_band.YSize

if (fhs_band.XSize == max_band.XSize) and (fhs_band.YSize == max_band.YSize):

fhs_raster = fhs_band.ReadAsArray(0, 0, fhs_band.XSize, fhs_band.YSize, fhs_band.XSize, fhs_band.YSize)

max_raster = max_band.ReadAsArray(0, 0, max_band.XSize, max_band.YSize, max_band.XSize, max_band.YSize)

elif (fhs_band.XSize < max_band.XSize) and (fhs_band.YSize < max_band.YSize):

xstretch = abs(fhs_geotransform[1]) / abs(max_geotransform[1])

ystretch = abs(fhs_geotransform[5]) / abs(max_geotransform[5])

if (xstretch != int(xstretch)) or (ystretch != int(ystretch)):

return (False, 'Can\'t stretch FHS image')

fhs_raster = fhs_band.ReadAsArray(0, 0, fhs_band.XSize, fhs_band.YSize, fhs_band.XSize, fhs_band.YSize)

fhs_raster = numpy.repeat(numpy.repeat(fhs_raster, int(ystretch), axis=0), int(xstretch), axis=1)

Page 46: PENGEMBANGAN PRODUK INFORMASI DAN DISEMINASI …pusfatja.lapan.go.id/files_uploads_ebook/publikasi/Buku Laporan... · Akhir kata, tak ada gading yang tak retak, buku ini tentunya

37

max_raster = max_band.ReadAsArray(0, 0, max_band.XSize, max_band.YSize, max_band.XSize, max_band.YSize)

else:

xstretch = abs(max_geotransform[1]) / abs(fhs_geotransform[1])

ystretch = abs(max_geotransform[5]) / abs(fhs_geotransform[5])

if (xstretch != int(xstretch)) or (ystretch != int(ystretch)):

return (False, 'Can\'t stretch FHS-max image')

new_projection = fhs_dataset.GetProjection()

new_geotransform = fhs_dataset.GetGeoTransform()

new_xsize = fhs_band.XSize

new_ysize = fhs_band.YSize

fhs_raster = fhs_band.ReadAsArray(0, 0, fhs_band.XSize, fhs_band.YSize, fhs_band.XSize, fhs_band.YSize)

max_raster = max_band.ReadAsArray(0, 0, max_band.XSize, max_band.YSize, max_band.XSize, max_band.YSize)

max_raster = numpy.repeat(numpy.repeat(max_raster, int(ystretch), axis=0), int(xstretch), axis=1)

new_raster = numpy.zeros((new_ysize, new_xsize), dtype=numpy.int)

new_raster += (fhs_raster <= max_raster) * max_raster

new_raster += (fhs_raster > max_raster) * fhs_raster

max_dataset.SetProjection(new_projection)

max_dataset.SetGeoTransform(new_geotransform)

max_dataset.GetRasterBand(1).WriteArray(new_raster)

fhs_dataset = max_dataset = None

return (True, 'FHS-max updated')

else:

shutil.copyfile(fhs_file, max_file)

return (True, 'FHS-max initialized')

Page 47: PENGEMBANGAN PRODUK INFORMASI DAN DISEMINASI …pusfatja.lapan.go.id/files_uploads_ebook/publikasi/Buku Laporan... · Akhir kata, tak ada gading yang tak retak, buku ini tentunya

38

def maximum(year, month, length, session, back, \

fhs_path, fhs_year_pos, fhs_month_pos, fhs_day_pos, fhs_dayofyear_pos, fhs_hour_pos, fhs_minute_pos, \

fhs_sign_1, fhs_sign_1_pos, fhs_sign_2, fhs_sign_2_pos, \

max_file):

if (year is None) or (month is None) or (length is None) or (session is None) or (back is None) \

or (fhs_path is None) or (fhs_year_pos is None) or ((fhs_month_pos is None) or (fhs_day_pos is None)) \

and (fhs_dayofyear_pos is None) or (fhs_hour_pos is None) or (fhs_minute_pos is None) \

or (fhs_sign_1 is None) or (fhs_sign_1_pos is None) or (fhs_sign_2 is None) or (fhs_sign_2_pos is None) \

or (max_file is None):

return (False, 'Missing parameters')

if not os.path.isdir(fhs_path):

return (False, 'Invalid path of FHS files')

fhs_list=[]

fhs_file_list = os.listdir(fhs_path)

if (fhs_year_pos != None) and (fhs_month_pos != None) and (fhs_day_pos != None):

(limit_year, limit_month, limit_day_first, limit_day_last) = period.day_limit(year, month, length, session, back)

for fhs_file in fhs_file_list:

if (period.get_text(fhs_file, fhs_sign_1_pos, len(fhs_sign_1)).lower() == fhs_sign_1.lower()) \

and (period.get_text(fhs_file, fhs_sign_2_pos, len(fhs_sign_2)).lower() == fhs_sign_2.lower()) \

and (int(period.get_digit(fhs_file, fhs_year_pos, 4)) == limit_year) \

and (int(period.get_digit(fhs_file, fhs_month_pos, 2)) == limit_month) \

Page 48: PENGEMBANGAN PRODUK INFORMASI DAN DISEMINASI …pusfatja.lapan.go.id/files_uploads_ebook/publikasi/Buku Laporan... · Akhir kata, tak ada gading yang tak retak, buku ini tentunya

39

and (int(period.get_digit(fhs_file, fhs_day_pos, 2)) >= limit_day_first) \

and (int(period.get_digit(fhs_file, fhs_day_pos, 2)) <= limit_day_last):

fhs_list.append(fhs_file)

elif (fhs_year_pos != None) and (fhs_dayofyear_pos != None):

(limit_year, limit_dayofyear_first, limit_dayofyear_last) = period.dayofyear_limit(year, month, length, session, back)

for fhs_file in fhs_file_list:

if (period.get_text(fhs_file, fhs_sign_1_pos, len(fhs_sign_1)).lower() == fhs_sign_1.lower()) \

and (period.get_text(fhs_file, fhs_sign_2_pos, len(fhs_sign_2)).lower() == fhs_sign_2.lower()) \

and (int(period.get_digit(fhs_file, fhs_year_pos, 4)) == limit_year) \

and (int(period.get_digit(fhs_file, fhs_dayofyear_pos, 3)) >= limit_dayofyear_first) \

and (int(period.get_digit(fhs_file, fhs_dayofyear_pos, 3)) <= limit_dayofyear_last):

fhs_list.append(fhs_file)

fhs_file_list = None

if len(fhs_list) > 0:

if os.path.isfile(max_file):

os.remove(max_file)

for i in range(0, len(fhs_list)):

print fhs_list[i] + ' => ' + max_file

(max_result, max_message) = save_maximum(fhs_path + fhs_list[i], max_file)

print max_message

else:

return (False, 'Input file not found')

return (True, 'FHS-max extracted')

Page 49: PENGEMBANGAN PRODUK INFORMASI DAN DISEMINASI …pusfatja.lapan.go.id/files_uploads_ebook/publikasi/Buku Laporan... · Akhir kata, tak ada gading yang tak retak, buku ini tentunya

40

Page 50: PENGEMBANGAN PRODUK INFORMASI DAN DISEMINASI …pusfatja.lapan.go.id/files_uploads_ebook/publikasi/Buku Laporan... · Akhir kata, tak ada gading yang tak retak, buku ini tentunya

41

Listing NBR.py

#!/usr/bin/python

# modul untuk menangani modis 09

import period, os, shutil, gdal, osr, numpy

def extract(b2_file, b7_file, nbr_file):

if (b2_file is None) or (b7_file is None) or (nbr_file is None):

return (False, 'Missing parameters')

b2_dataset = gdal.Open(b2_file, gdal.GA_ReadOnly)

if b2_dataset is None:

return (False, 'Can\'t open Band 2 file')

b7_dataset = gdal.Open(b7_file, gdal.GA_ReadOnly)

if b7_dataset is None:

return (False, 'Can\'t open Band 7 file')

b2_auth = b7_auth = None

b2_epsg = b7_epsg = None

b2_reference = osr.SpatialReference(b2_dataset.GetProjection())

b7_reference = osr.SpatialReference(b7_dataset.GetProjection())

if b2_reference.IsProjected:

b2_auth = b2_reference.GetAttrValue('AUTHORITY')

b2_epsg = b2_reference.GetAttrValue('AUTHORITY', 1)

if b7_reference.IsProjected:

b7_auth = b7_reference.GetAttrValue('AUTHORITY')

b7_epsg = b7_reference.GetAttrValue('AUTHORITY', 1)

if not ((b2_auth.upper() == b7_auth.upper() == 'EPSG') and (b2_epsg == b7_epsg)):

return (False, 'Band 2 and Band 7 different geographic coordinate system')

Page 51: PENGEMBANGAN PRODUK INFORMASI DAN DISEMINASI …pusfatja.lapan.go.id/files_uploads_ebook/publikasi/Buku Laporan... · Akhir kata, tak ada gading yang tak retak, buku ini tentunya

42

b2_geotransform = b2_dataset.GetGeoTransform()

b7_geotransform = b7_dataset.GetGeoTransform()

if (b2_geotransform[0] != b7_geotransform[0]) or (b2_geotransform[3] != b7_geotransform[3]) \

or (b2_geotransform[1] * b2_dataset.RasterXSize != b7_geotransform[1] * b7_dataset.RasterXSize) \

or (b2_geotransform[5] * b2_dataset.RasterYSize != b7_geotransform[5] * b7_dataset.RasterYSize):

return (False, 'Band 2 and Band 7 different position or size')

b2_band = b2_dataset.GetRasterBand(1)

b7_band = b7_dataset.GetRasterBand(1)

nbr_projection = b2_dataset.GetProjection()

nbr_geotransform = b2_dataset.GetGeoTransform()

nbr_xsize = b2_band.XSize

nbr_ysize = b2_band.YSize

if (b2_band.XSize == b7_band.XSize) and (b2_band.YSize == b7_band.YSize):

b2_raster = b2_band.ReadAsArray(0, 0, b2_band.XSize, b2_band.YSize, b2_band.XSize, b2_band.YSize).astype(float)

b7_raster = b7_band.ReadAsArray(0, 0, b7_band.XSize, b7_band.YSize, b7_band.XSize, b7_band.YSize).astype(float)

elif (b2_band.XSize > b7_band.XSize) and (b2_band.YSize > b7_band.YSize):

xstretch = abs(b7_geotransform[1]) / abs(b2_geotransform[1])

ystretch = abs(b7_geotransform[5]) / abs(b2_geotransform[5])

if (xstretch != int(xstretch)) or (ystretch != int(ystretch)):

return (False, 'Can\'t stretch Band 7 image')

b2_raster = b2_band.ReadAsArray(0, 0, b2_band.XSize, b2_band.YSize, b2_band.XSize, b2_band.YSize).astype(float)

b7_raster = b7_band.ReadAsArray(0, 0, b7_band.XSize, b7_band.YSize, b7_band.XSize, b7_band.YSize).astype(float)

b7_raster = numpy.repeat(numpy.repeat(b7_raster, int(ystretch), axis=0), int(xstretch), axis=1)

else:

xstretch = abs(b2_geotransform[1]) / abs(b7_geotransform[1])

ystretch = abs(b2_geotransform[5]) / abs(b7_geotransform[5])

Page 52: PENGEMBANGAN PRODUK INFORMASI DAN DISEMINASI …pusfatja.lapan.go.id/files_uploads_ebook/publikasi/Buku Laporan... · Akhir kata, tak ada gading yang tak retak, buku ini tentunya

43

if (xstretch != int(xstretch)) or (ystretch != int(ystretch)):

return (False, 'Can\'t stretch Band 2 image')

nbr_projection = b7_dataset.GetProjection()

nbr_geotransform = b7_dataset.GetGeoTransform()

nbr_xsize = b7_band.XSize

nbr_ysize = b7_band.YSize

b2_raster = b2_band.ReadAsArray(0, 0, b2_band.XSize, b2_band.YSize, b2_band.XSize, b2_band.YSize).astype(float)

b2_raster = numpy.repeat(numpy.repeat(b2_raster, int(ystretch), axis=0), int(xstretch), axis=1)

b7_raster = b7_band.ReadAsArray(0, 0, b7_band.XSize, b7_band.YSize, b7_band.XSize, b7_band.YSize).astype(float)

nbr_raster = numpy.zeros((nbr_ysize, nbr_xsize), dtype=numpy.int)

nbr_raster = (b2_raster - b7_raster) / (b2_raster + b7_raster) * 10000

nbr_raster -= ((b2_raster <= 0) * (nbr_raster - -10001))

nbr_raster -= ((b7_raster <= 0) * (nbr_raster - -10001))

nbr_raster -= ((b2_raster + b7_raster == 0) * (nbr_raster - -10001))

driver = gdal.GetDriverByName('GTiff')

nbr_dataset = driver.Create(nbr_file, nbr_xsize, nbr_ysize, 1, gdal.GDT_Int16)

nbr_dataset.SetProjection(nbr_projection)

nbr_dataset.SetGeoTransform(nbr_geotransform)

nbr_dataset.GetRasterBand(1).WriteArray(nbr_raster)

nbr_dataset = None

b2_dataset = b7_dataset = None

return (True, 'NBR extracted')

def save_maximum(nbr_file, max_file):

Page 53: PENGEMBANGAN PRODUK INFORMASI DAN DISEMINASI …pusfatja.lapan.go.id/files_uploads_ebook/publikasi/Buku Laporan... · Akhir kata, tak ada gading yang tak retak, buku ini tentunya

44

if (nbr_file is None) or (max_file is None):

return (False, 'Missing parameters')

if os.path.isfile(max_file):

nbr_dataset = gdal.Open(nbr_file, gdal.GA_ReadOnly)

if nbr_dataset is None:

return (False, 'Can\'t open NBR file')

max_dataset = gdal.Open(max_file, gdal.GA_Update)

if max_dataset is None:

return (False, 'Can\'t open NBR-max file')

nbr_auth = max_auth = None

nbr_epsg = max_epsg = None

nbr_reference = osr.SpatialReference(nbr_dataset.GetProjection())

max_reference = osr.SpatialReference(max_dataset.GetProjection())

if nbr_reference.IsProjected:

nbr_auth = nbr_reference.GetAttrValue('AUTHORITY')

nbr_epsg = nbr_reference.GetAttrValue('AUTHORITY', 1)

if max_reference.IsProjected:

max_auth = max_reference.GetAttrValue('AUTHORITY')

max_epsg = max_reference.GetAttrValue('AUTHORITY', 1)

if not ((nbr_auth.upper() == max_auth.upper() == 'EPSG') and (nbr_epsg == max_epsg)):

return (False, 'NBR and NBR-max different geographic coordinate system')

nbr_geotransform = nbr_dataset.GetGeoTransform()

max_geotransform = max_dataset.GetGeoTransform()

if (nbr_geotransform[0] != max_geotransform[0]) or (nbr_geotransform[3] != max_geotransform[3]) \

or (nbr_geotransform[1] * nbr_dataset.RasterXSize != max_geotransform[1] * max_dataset.RasterXSize) \

or (nbr_geotransform[5] * nbr_dataset.RasterYSize != max_geotransform[5] * max_dataset.RasterYSize):

return (False, 'NBR and NBR-max different position or size')

Page 54: PENGEMBANGAN PRODUK INFORMASI DAN DISEMINASI …pusfatja.lapan.go.id/files_uploads_ebook/publikasi/Buku Laporan... · Akhir kata, tak ada gading yang tak retak, buku ini tentunya

45

nbr_band = nbr_dataset.GetRasterBand(1)

max_band = max_dataset.GetRasterBand(1)

new_projection = max_dataset.GetProjection()

new_geotransform = max_dataset.GetGeoTransform()

new_xsize = max_band.XSize

new_ysize = max_band.YSize

if (nbr_band.XSize == max_band.XSize) and (nbr_band.YSize == max_band.YSize):

nbr_raster = nbr_band.ReadAsArray(0, 0, nbr_band.XSize, nbr_band.YSize, nbr_band.XSize, nbr_band.YSize)

max_raster = max_band.ReadAsArray(0, 0, max_band.XSize, max_band.YSize, max_band.XSize, max_band.YSize)

elif (nbr_band.XSize < max_band.XSize) and (nbr_band.YSize < max_band.YSize):

xstretch = abs(nbr_geotransform[1]) / abs(max_geotransform[1])

ystretch = abs(nbr_geotransform[5]) / abs(max_geotransform[5])

if (xstretch != int(xstretch)) or (ystretch != int(ystretch)):

return (False, 'Can\'t stretch NBR image')

nbr_raster = nbr_band.ReadAsArray(0, 0, nbr_band.XSize, nbr_band.YSize, nbr_band.XSize, nbr_band.YSize)

nbr_raster = numpy.repeat(numpy.repeat(nbr_raster, int(ystretch), axis=0), int(xstretch), axis=1)

max_raster = max_band.ReadAsArray(0, 0, max_band.XSize, max_band.YSize, max_band.XSize, max_band.YSize)

else:

xstretch = abs(max_geotransform[1]) / abs(nbr_geotransform[1])

ystretch = abs(max_geotransform[5]) / abs(nbr_geotransform[5])

if (xstretch != int(xstretch)) or (ystretch != int(ystretch)):

return (False, 'Can\'t stretch NBR-max image')

new_projection = nbr_dataset.GetProjection()

new_geotransform = nbr_dataset.GetGeoTransform()

new_xsize = nbr_band.XSize

new_ysize = nbr_band.YSize

Page 55: PENGEMBANGAN PRODUK INFORMASI DAN DISEMINASI …pusfatja.lapan.go.id/files_uploads_ebook/publikasi/Buku Laporan... · Akhir kata, tak ada gading yang tak retak, buku ini tentunya

46

nbr_raster = nbr_band.ReadAsArray(0, 0, nbr_band.XSize, nbr_band.YSize, nbr_band.XSize, nbr_band.YSize)

max_raster = max_band.ReadAsArray(0, 0, max_band.XSize, max_band.YSize, max_band.XSize, max_band.YSize)

max_raster = numpy.repeat(numpy.repeat(max_raster, int(ystretch), axis=0), int(xstretch), axis=1)

new_raster = numpy.zeros((new_ysize, new_xsize), dtype=numpy.int)

new_raster += (nbr_raster <= max_raster) * max_raster

new_raster += (nbr_raster > max_raster) * nbr_raster

max_dataset.SetProjection(new_projection)

max_dataset.SetGeoTransform(new_geotransform)

max_dataset.GetRasterBand(1).WriteArray(new_raster)

nbr_dataset = max_dataset = None

return (True, 'NBR-max updated')

else:

shutil.copyfile(nbr_file, max_file)

return (True, 'NBR-max initialized')

def maximum(year, month, length, session, back, \

b2_path, b2_year_pos, b2_month_pos, b2_day_pos, b2_dayofyear_pos, b2_hour_pos, b2_minute_pos, \

b2_sign_1, b2_sign_1_pos, b2_sign_2, b2_sign_2_pos, \

b7_path, b7_year_pos, b7_month_pos, b7_day_pos, b7_dayofyear_pos, b7_hour_pos, b7_minute_pos, \

b7_sign_1, b7_sign_1_pos, b7_sign_2, b7_sign_2_pos, \

max_file):

Page 56: PENGEMBANGAN PRODUK INFORMASI DAN DISEMINASI …pusfatja.lapan.go.id/files_uploads_ebook/publikasi/Buku Laporan... · Akhir kata, tak ada gading yang tak retak, buku ini tentunya

47

if (year is None) or (month is None) or (length is None) or (session is None) or (back is None) \

or (b2_path is None) or (b2_year_pos is None) or ((b2_month_pos is None) or (b2_day_pos is None)) \

and (b2_dayofyear_pos is None) or (b2_hour_pos is None) or (b2_minute_pos is None) \

or (b2_sign_1 is None) or (b2_sign_1_pos is None) or (b2_sign_2 is None) or (b2_sign_2_pos is None) \

or (b7_path is None) or (b7_year_pos is None) or ((b7_month_pos is None) or (b7_day_pos is None)) \

and (b7_dayofyear_pos is None) or (b7_hour_pos is None) or (b7_minute_pos is None) \

or (b7_sign_1 is None) or (b7_sign_1_pos is None) or (b7_sign_2 is None) or (b7_sign_2_pos is None) \

or (max_file is None):

return (False, 'Missing parameters')

if not os.path.isdir(b2_path):

return (False, 'Invalid path of Band 2 files')

if not os.path.isdir(b7_path):

return (False, 'Invalid path of Band 7 files')

b2_list=[]

b7_list=[]

nbr_list=[]

b2_file_list = os.listdir(b2_path)

b7_file_list = os.listdir(b7_path)

if (b2_year_pos != None) and (b2_month_pos != None) and (b2_day_pos != None) \

and (b7_year_pos != None) and (b7_month_pos != None) and (b7_day_pos != None):

(limit_year, limit_month, limit_day_first, limit_day_last) = period.day_limit(year, month, length, session, back)

for b2_file in b2_file_list:

if (period.get_text(b2_file, b2_sign_1_pos, len(b2_sign_1)).lower() == b2_sign_1.lower()) \

Page 57: PENGEMBANGAN PRODUK INFORMASI DAN DISEMINASI …pusfatja.lapan.go.id/files_uploads_ebook/publikasi/Buku Laporan... · Akhir kata, tak ada gading yang tak retak, buku ini tentunya

48

and (period.get_text(b2_file, b2_sign_2_pos, len(b2_sign_2)).lower() == b2_sign_2.lower()) \

and (int(period.get_digit(b2_file, b2_year_pos, 4)) == limit_year) \

and (int(period.get_digit(b2_file, b2_month_pos, 2)) == limit_month) \

and (int(period.get_digit(b2_file, b2_day_pos, 2)) >= limit_day_first) \

and (int(period.get_digit(b2_file, b2_day_pos, 2)) <= limit_day_last):

b2_year = period.get_digit(b2_file, b2_year_pos, 4)

b2_month = period.get_digit(b2_file, b2_month_pos, 2)

b2_day = period.get_digit(b2_file, b2_day_pos, 2)

b2_hour = period.get_digit(b2_file, b2_hour_pos, 2)

b2_minute = period.get_digit(b2_file, b2_minute_pos, 2)

for b7_file in b7_file_list:

if (period.get_text(b7_file, b7_sign_1_pos, len(b7_sign_1)).lower() == b7_sign_1.lower()) \

and (period.get_text(b7_file, b7_sign_2_pos, len(b7_sign_2)).lower() == b7_sign_2.lower()) \

and (period.get_digit(b7_file, b7_year_pos, 4) == b2_year) \

and (period.get_digit(b7_file, b7_month_pos, 2) == b2_month) \

and (period.get_digit(b7_file, b2_day_pos, 2) == b2_day) \

and (period.get_digit(b7_file, b2_hour_pos, 2) == b2_hour) \

and (period.get_digit(b7_file, b2_minute_pos, 2) == b2_minute):

b2_list.append(b2_file)

b7_list.append(b7_file)

nbr_list.append('NBR_%s-%s-%s_%s%s.tif' % (b2_year, b2_month, b2_day, b2_hour, b2_minute))

break

elif (b2_year_pos != None) and (b2_dayofyear_pos != None) \

and (b7_year_pos != None) and (b7_dayofyear_pos != None):

(limit_year, limit_dayofyear_first, limit_dayofyear_last) = period.dayofyear_limit(year, month, length, session, back)

for b2_file in b2_file_list:

Page 58: PENGEMBANGAN PRODUK INFORMASI DAN DISEMINASI …pusfatja.lapan.go.id/files_uploads_ebook/publikasi/Buku Laporan... · Akhir kata, tak ada gading yang tak retak, buku ini tentunya

49

if (period.get_text(b2_file, b2_sign_1_pos, len(b2_sign_1)).lower() == b2_sign_1.lower()) \

and (period.get_text(b2_file, b2_sign_2_pos, len(b2_sign_2)).lower() == b2_sign_2.lower()) \

and (int(period.get_digit(b2_file, b2_year_pos, 4)) == limit_year) \

and (int(period.get_digit(b2_file, b2_dayofyear_pos, 3)) >= limit_dayofyear_first) \

and (int(period.get_digit(b2_file, b2_dayofyear_pos, 3)) <= limit_dayofyear_last):

b2_year = period.get_digit(b2_file, b2_year_pos, 4)

b2_dayofyear = period.get_digit(b2_file, b2_dayofyear_pos, 3)

b2_hour = period.get_digit(b2_file, b2_hour_pos, 2)

b2_minute = period.get_digit(b2_file, b2_minute_pos, 2)

for b7_file in b7_file_list:

if (period.get_text(b7_file, b7_sign_1_pos, len(b7_sign_1)).lower() == b7_sign_1.lower()) \

and (period.get_text(b7_file, b7_sign_2_pos, len(b7_sign_2)).lower() == b7_sign_2.lower()) \

and (period.get_digit(b7_file, b7_year_pos, 4) == b2_year) \

and (period.get_digit(b7_file, b2_dayofyear_pos, 3) == b2_dayofyear) \

and (period.get_digit(b7_file, b2_hour_pos, 2) == b2_hour) \

and (period.get_digit(b7_file, b2_minute_pos, 2) == b2_minute):

b2_list.append(b2_file)

b7_list.append(b7_file)

nbr_list.append('NBR_%s-%s_%s%s.tif' % (b2_year, b2_dayofyear, b2_hour, b2_minute))

break

b2_file_list = b7_file_list = None

if len(nbr_list) > 0:

if os.path.isfile(max_file):

os.remove(max_file)

Page 59: PENGEMBANGAN PRODUK INFORMASI DAN DISEMINASI …pusfatja.lapan.go.id/files_uploads_ebook/publikasi/Buku Laporan... · Akhir kata, tak ada gading yang tak retak, buku ini tentunya

50

for i in range(0, len(nbr_list)):

print '(' + b2_list[i] + ', ' + b7_list[i] + ') => ' + nbr_list[i]

(nbr_result, nbr_message) = extract(b2_path + b2_list[i], b7_path + b7_list[i], nbr_list[i])

print nbr_message

if nbr_result:

print nbr_list[i] + ' => ' + max_file

(max_result, max_message) = save_maximum(nbr_list[i], max_file)

print max_message

os.remove(nbr_list[i])

else:

return (False, 'Input file not found')

return (True, 'NBR-max extracted')

def delta(nbr1_file, nbr2_file, dnbr_file):

if (nbr1_file is None) or (nbr2_file is None) or (dnbr_file is None):

return (False, 'Missing parameters')

nbr1_dataset = gdal.Open(nbr1_file, gdal.GA_ReadOnly)

if nbr1_dataset is None:

return (False, 'Can\'t open 1st NBR file')

nbr2_dataset = gdal.Open(nbr2_file, gdal.GA_ReadOnly)

if nbr2_dataset is None:

return (False, 'Can\'t open 2nd NBR file')

nbr1_auth = nbr2_auth = None

nbr1_epsg = nbr2_epsg = None

nbr1_reference = osr.SpatialReference(nbr1_dataset.GetProjection())

nbr2_reference = osr.SpatialReference(nbr2_dataset.GetProjection())

Page 60: PENGEMBANGAN PRODUK INFORMASI DAN DISEMINASI …pusfatja.lapan.go.id/files_uploads_ebook/publikasi/Buku Laporan... · Akhir kata, tak ada gading yang tak retak, buku ini tentunya

51

if nbr1_reference.IsProjected:

nbr1_auth = nbr1_reference.GetAttrValue('AUTHORITY')

nbr1_epsg = nbr1_reference.GetAttrValue('AUTHORITY', 1)

if nbr2_reference.IsProjected:

nbr2_auth = nbr2_reference.GetAttrValue('AUTHORITY')

nbr2_epsg = nbr2_reference.GetAttrValue('AUTHORITY', 1)

if not ((nbr1_auth.upper() == nbr2_auth.upper() == 'EPSG') and (nbr1_epsg == nbr2_epsg)):

return (False, '1st NBR and 2nd NBR different geographic coordinate system')

nbr1_geotransform = nbr1_dataset.GetGeoTransform()

nbr2_geotransform = nbr2_dataset.GetGeoTransform()

if (nbr1_geotransform[0] != nbr2_geotransform[0]) or (nbr1_geotransform[3] != nbr2_geotransform[3]) \

or (nbr1_geotransform[1] * nbr1_dataset.RasterXSize != nbr2_geotransform[1] * nbr2_dataset.RasterXSize) \

or (nbr1_geotransform[5] * nbr1_dataset.RasterYSize != nbr2_geotransform[5] * nbr2_dataset.RasterYSize):

return (False, '1st NBR and 2nd NBR different position or size')

nbr1_band = nbr1_dataset.GetRasterBand(1)

nbr2_band = nbr2_dataset.GetRasterBand(1)

dnbr_projection = nbr1_dataset.GetProjection()

dnbr_geotransform = nbr1_dataset.GetGeoTransform()

dnbr_xsize = nbr1_band.XSize

dnbr_ysize = nbr1_band.YSize

if (nbr1_band.XSize == nbr2_band.XSize) and (nbr1_band.YSize == nbr2_band.YSize):

nbr1_raster = nbr1_band.ReadAsArray(0, 0, nbr1_band.XSize, nbr1_band.YSize, nbr1_band.XSize, nbr1_band.YSize)

nbr2_raster = nbr2_band.ReadAsArray(0, 0, nbr2_band.XSize, nbr2_band.YSize, nbr2_band.XSize, nbr2_band.YSize)

elif (nbr1_band.XSize > nbr2_band.XSize) and (nbr1_band.YSize > nbr2_band.YSize):

Page 61: PENGEMBANGAN PRODUK INFORMASI DAN DISEMINASI …pusfatja.lapan.go.id/files_uploads_ebook/publikasi/Buku Laporan... · Akhir kata, tak ada gading yang tak retak, buku ini tentunya

52

xstretch = abs(nbr2_geotransform[1]) / abs(nbr1_geotransform[1])

ystretch = abs(nbr2_geotransform[5]) / abs(nbr1_geotransform[5])

if (xstretch != int(xstretch)) or (ystretch != int(ystretch)):

return (False, 'Can\'t stretch 2nd NBR image')

nbr1_raster = nbr1_band.ReadAsArray(0, 0, nbr1_band.XSize, nbr1_band.YSize, nbr1_band.XSize, nbr1_band.YSize)

nbr2_raster = nbr2_band.ReadAsArray(0, 0, nbr2_band.XSize, nbr2_band.YSize, nbr2_band.XSize, nbr2_band.YSize)

nbr2_raster = numpy.repeat(numpy.repeat(nbr2_raster, int(ystretch), axis=0), int(xstretch), axis=1)

else:

xstretch = abs(nbr1_geotransform[1]) / abs(nbr2_geotransform[1])

ystretch = abs(nbr1_geotransform[5]) / abs(nbr2_geotransform[5])

if (xstretch != int(xstretch)) or (ystretch != int(ystretch)):

return (False, 'Can\'t stretch 1st NBR image')

dnbr_projection = nbr2_dataset.GetProjection()

dnbr_geotransform = nbr2_dataset.GetGeoTransform()

dnbr_xsize = nbr2_band.XSize

dnbr_ysize = nbr2_band.YSize

nbr1_raster = nbr1_band.ReadAsArray(0, 0, nbr1_band.XSize, nbr1_band.YSize, nbr1_band.XSize, nbr1_band.YSize)

nbr1_raster = numpy.repeat(numpy.repeat(nbr1_raster, int(ystretch), axis=0), int(xstretch), axis=1)

nbr2_raster = nbr2_band.ReadAsArray(0, 0, nbr2_band.XSize, nbr2_band.YSize, nbr2_band.XSize, nbr2_band.YSize)

dnbr_raster = numpy.zeros((dnbr_ysize, dnbr_xsize), dtype=numpy.int)

dnbr_raster = nbr1_raster - nbr2_raster

driver = gdal.GetDriverByName('GTiff')

dnbr_dataset = driver.Create(dnbr_file, dnbr_xsize, dnbr_ysize, 1, gdal.GDT_Int16)

dnbr_dataset.SetProjection(dnbr_projection)

dnbr_dataset.SetGeoTransform(dnbr_geotransform)

Page 62: PENGEMBANGAN PRODUK INFORMASI DAN DISEMINASI …pusfatja.lapan.go.id/files_uploads_ebook/publikasi/Buku Laporan... · Akhir kata, tak ada gading yang tak retak, buku ini tentunya

53

dnbr_dataset.GetRasterBand(1).WriteArray(dnbr_raster)

dnbr_dataset = None

nbr1_dataset = nbr2_dataset = None

return (True, 'dNBR extracted')

Page 63: PENGEMBANGAN PRODUK INFORMASI DAN DISEMINASI …pusfatja.lapan.go.id/files_uploads_ebook/publikasi/Buku Laporan... · Akhir kata, tak ada gading yang tak retak, buku ini tentunya

54

Listing Burned.py

#!/usr/bin/python

# modul untuk mendeteksi burned area

import os, gdal, osr, numpy, math, MySQLdb

def extract(nbr_file, nbr_min, nbr_max, \

dnbr_file, dnbr_min, dnbr_max, \

fhs_file, fhs_min, fhs_max, fhs_rad, \

mysql_host, mysql_user, mysql_password, mysql_db, \

burned_file):

nbr_dataset = gdal.Open(nbr_file, gdal.GA_ReadOnly)

if nbr_dataset is None:

return (False, 'Can\'t open NBR file')

dnbr_dataset = gdal.Open(dnbr_file, gdal.GA_ReadOnly)

if dnbr_dataset is None:

return (False, 'Can\'t open dNBR file')

fhs_dataset = gdal.Open(fhs_file, gdal.GA_ReadOnly)

if fhs_dataset is None:

return (False, 'Can\'t open FHS file')

nbr_auth = dnbr_auth = fhs_auth = None

nbr_epsg = dnbr_epsg = fhs_epsg = None

nbr_reference = osr.SpatialReference(nbr_dataset.GetProjection())

dnbr_reference = osr.SpatialReference(dnbr_dataset.GetProjection())

fhs_reference = osr.SpatialReference(fhs_dataset.GetProjection())

if nbr_reference.IsProjected:

nbr_auth = nbr_reference.GetAttrValue('AUTHORITY')

nbr_epsg = nbr_reference.GetAttrValue('AUTHORITY', 1)

if dnbr_reference.IsProjected:

Page 64: PENGEMBANGAN PRODUK INFORMASI DAN DISEMINASI …pusfatja.lapan.go.id/files_uploads_ebook/publikasi/Buku Laporan... · Akhir kata, tak ada gading yang tak retak, buku ini tentunya

55

dnbr_auth = dnbr_reference.GetAttrValue('AUTHORITY')

dnbr_epsg = dnbr_reference.GetAttrValue('AUTHORITY', 1)

if fhs_reference.IsProjected:

fhs_auth = fhs_reference.GetAttrValue('AUTHORITY')

fhs_epsg = fhs_reference.GetAttrValue('AUTHORITY', 1)

if not ((nbr_auth.upper() == dnbr_auth.upper() == fhs_auth.upper() == 'EPSG') \

and (nbr_epsg == dnbr_epsg == fhs_epsg)):

return (False, 'NBR and dNBR and FHS different geographic coordinate system')

nbr_geotransform = nbr_dataset.GetGeoTransform()

dnbr_geotransform = dnbr_dataset.GetGeoTransform()

fhs_geotransform = fhs_dataset.GetGeoTransform()

if (nbr_geotransform[0] != dnbr_geotransform[0]) or (nbr_geotransform[0] != fhs_geotransform[0]) \

or (nbr_geotransform[3] != dnbr_geotransform[3]) or (nbr_geotransform[3] != fhs_geotransform[3]) \

or (nbr_geotransform[1] * nbr_dataset.RasterXSize != dnbr_geotransform[1] * dnbr_dataset.RasterXSize) \

or (nbr_geotransform[1] * nbr_dataset.RasterXSize != fhs_geotransform[1] * fhs_dataset.RasterXSize) \

or (nbr_geotransform[5] * nbr_dataset.RasterYSize != dnbr_geotransform[5] * dnbr_dataset.RasterYSize) \

or (nbr_geotransform[5] * nbr_dataset.RasterYSize != fhs_geotransform[5] * fhs_dataset.RasterYSize):

return (False, 'NBR and dNBR and FHS different position or size')

nbr_band = nbr_dataset.GetRasterBand(1)

dnbr_band = dnbr_dataset.GetRasterBand(1)

fhs_band = fhs_dataset.GetRasterBand(1)

burned_projection = nbr_dataset.GetProjection()

burned_geotransform = nbr_dataset.GetGeoTransform()

burned_xsize = nbr_band.XSize

burned_ysize = nbr_band.YSize

if (nbr_band.XSize == dnbr_band.XSize) and (nbr_band.YSize == dnbr_band.YSize):

Page 65: PENGEMBANGAN PRODUK INFORMASI DAN DISEMINASI …pusfatja.lapan.go.id/files_uploads_ebook/publikasi/Buku Laporan... · Akhir kata, tak ada gading yang tak retak, buku ini tentunya

56

nbr_raster = nbr_band.ReadAsArray(0, 0, nbr_band.XSize, nbr_band.YSize, nbr_band.XSize, nbr_band.YSize)

dnbr_raster = dnbr_band.ReadAsArray(0, 0, dnbr_band.XSize, dnbr_band.YSize, dnbr_band.XSize, dnbr_band.YSize)

elif (nbr_band.XSize > dnbr_band.XSize) and (nbr_band.YSize > dnbr_band.YSize):

xstretch = abs(dnbr_geotransform[1]) / abs(nbr_geotransform[1])

ystretch = abs(dnbr_geotransform[5]) / abs(nbr_geotransform[5])

if (xstretch != int(xstretch)) or (ystretch != int(ystretch)):

return (False, 'Can\'t stretch dNBR image')

nbr_raster = nbr_band.ReadAsArray(0, 0, nbr_band.XSize, nbr_band.YSize, nbr_band.XSize, nbr_band.YSize)

dnbr_raster = dnbr_band.ReadAsArray(0, 0, dnbr_band.XSize, dnbr_band.YSize, dnbr_band.XSize, dnbr_band.YSize)

dnbr_raster = numpy.repeat(numpy.repeat(dnbr_raster, int(ystretch), axis=0), int(xstretch), axis=1)

else:

xstretch = abs(nbr_geotransform[1]) / abs(dnbr_geotransform[1])

ystretch = abs(nbr_geotransform[5]) / abs(dnbr_geotransform[5])

if (xstretch != int(xstretch)) or (ystretch != int(ystretch)):

return (False, 'Can\'t stretch NBR image')

burned_projection = dnbr_dataset.GetProjection()

burned_geotransform = dnbr_dataset.GetGeoTransform()

burned_xsize = dnbr_band.XSize

burned_ysize = dnbr_band.YSize

nbr_raster = nbr_band.ReadAsArray(0, 0, nbr_band.XSize, nbr_band.YSize, nbr_band.XSize, nbr_band.YSize)

nbr_raster = numpy.repeat(numpy.repeat(nbr_raster, int(ystretch), axis=0), int(xstretch), axis=1)

dnbr_raster = dnbr_band.ReadAsArray(0, 0, dnbr_band.XSize, dnbr_band.YSize, dnbr_band.XSize, dnbr_band.YSize)

if (burned_xsize == fhs_band.XSize) and (burned_ysize == fhs_band.YSize):

fhs_raster = fhs_band.ReadAsArray(0, 0, fhs_band.XSize, fhs_band.YSize, fhs_band.XSize, fhs_band.YSize)

elif (burned_xsize > fhs_band.XSize) and (burned_ysize > fhs_band.YSize):

Page 66: PENGEMBANGAN PRODUK INFORMASI DAN DISEMINASI …pusfatja.lapan.go.id/files_uploads_ebook/publikasi/Buku Laporan... · Akhir kata, tak ada gading yang tak retak, buku ini tentunya

57

xstretch = abs(fhs_geotransform[1]) / abs(burned_geotransform[1])

ystretch = abs(fhs_geotransform[5]) / abs(burned_geotransform[5])

if (xstretch != int(xstretch)) or (ystretch != int(ystretch)):

return (False, 'Can\'t stretch FHS image')

fhs_raster = fhs_band.ReadAsArray(0, 0, fhs_band.XSize, fhs_band.YSize, fhs_band.XSize, fhs_band.YSize)

fhs_raster = numpy.repeat(numpy.repeat(fhs_raster, int(ystretch), axis=0), int(xstretch), axis=1)

else:

xstretch = abs(burned_geotransform[1]) / abs(fhs_geotransform[1])

ystretch = abs(burned_geotransform[5]) / abs(fhs_geotransform[5])

if (xstretch != int(xstretch)) or (ystretch != int(ystretch)):

return (False, 'Can\'t stretch burned area image')

burned_projection = fhs_dataset.GetProjection()

burned_geotransform = fhs_dataset.GetGeoTransform()

burned_xsize = fhs_band.XSize

burned_ysize = fhs_band.YSize

nbr_raster = numpy.repeat(numpy.repeat(nbr_raster, int(ystretch), axis=0), int(xstretch), axis=1)

dnbr_raster = numpy.repeat(numpy.repeat(dnbr_raster, int(ystretch), axis=0), int(xstretch), axis=1)

fhs_raster = fhs_band.ReadAsArray(0, 0, fhs_band.XSize, fhs_band.YSize, fhs_band.XSize, fhs_band.YSize)

burned_raster = numpy.ones((burned_ysize, burned_xsize), dtype=numpy.uint8)

if fhs_min != None:

burned_raster &= (fhs_raster >= fhs_min)

if fhs_max != None:

burned_raster &= (fhs_raster <= fhs_max)

if fhs_rad > 0:

if int(fhs_epsg) > 32600 and int(fhs_epsg) <= 32760:

fhs_mask_rad = fhs_rad

Page 67: PENGEMBANGAN PRODUK INFORMASI DAN DISEMINASI …pusfatja.lapan.go.id/files_uploads_ebook/publikasi/Buku Laporan... · Akhir kata, tak ada gading yang tak retak, buku ini tentunya

58

fhs_mask_xrad = int(round(abs(fhs_rad / burned_geotransform[1])))

fhs_mask_yrad = int(round(abs(fhs_rad / burned_geotransform[5])))

elif fhs_epsg == '4326':

fhs_mask_rad = fhs_rad * 0.009009

fhs_mask_xrad = int(round(abs(fhs_rad * 0.009009 / burned_geotransform[1])))

fhs_mask_yrad = int(round(abs(fhs_rad * 0.009009 / burned_geotransform[5])))

else:

return (False, 'Geographic coordinate system is not WGS 84')

(lines, cols) = numpy.where(burned_raster == 1)

for i in range(0, len(lines)):

for y in range(-fhs_mask_yrad, fhs_mask_yrad + 1):

for x in range(-fhs_mask_xrad, fhs_mask_xrad + 1):

line = lines[i] + y

col = cols[i] + x

if (line >= 0) and (line < burned_ysize) and (col >= 0) and (col < burned_xsize) \

and (math.hypot(x * burned_geotransform[1], y * burned_geotransform[5]) <= fhs_mask_rad) \

and (fhs_raster[line, col] > 4):

burned_raster[line, col] = 1

if nbr_min != None:

burned_raster &= (nbr_raster >= nbr_min)

if nbr_max != None:

burned_raster &= (nbr_raster <= nbr_max)

if dnbr_min != None:

burned_raster &= (dnbr_raster >= dnbr_min)

if dnbr_max != None:

burned_raster &= (dnbr_raster <= dnbr_max)

mysql_connect = MySQLdb.connect(mysql_host, mysql_user, mysql_password, mysql_db)

Page 68: PENGEMBANGAN PRODUK INFORMASI DAN DISEMINASI …pusfatja.lapan.go.id/files_uploads_ebook/publikasi/Buku Laporan... · Akhir kata, tak ada gading yang tak retak, buku ini tentunya

59

mysql_cursor = mysql_connect.cursor()

(lines, cols) = numpy.where(burned_raster == 1)

for i in range(0, len(lines)):

sql = 'SELECT COUNT(*) FROM `SHP_Province`, `SHP_Regency`, `SHP_RegencyLocation` WHERE `SHP_Province`.`ProvinceId` = `SHP_Regency`.`ProvinceId` AND `SHP_Regency`.`ProvinceId` = `SHP_RegencyLocation`.`ProvinceId` AND `SHP_Regency`.`RegencyId` = `SHP_RegencyLocation`.`RegencyId` AND CONTAINS(`SHP_RegencyLocation`.`Polygon`, POINT(%f, %f))' % (burned_geotransform[0] + cols[i] * burned_geotransform[1], burned_geotransform[3] + lines[i] * burned_geotransform[5])

mysql_cursor.execute(sql)

mysql_result = mysql_cursor.fetchall()

if mysql_result[0][0] == 0:

burned_raster[lines[i], cols[i]] = 0

mysql_connect.close()

burned_raster = numpy.repeat(numpy.repeat(burned_raster, 2, axis=0), 2, axis=1)

polygon_raster = numpy.ones((burned_ysize * 2, burned_xsize * 2), dtype=numpy.uint8)

(lines, cols) = numpy.where(burned_raster == 1)

for i in range(0, len(lines)):

if (lines[i] > 0) and (lines[i] < burned_ysize * 2 - 2) and (cols[i] > 0) and (cols[i] < burned_xsize * 2 - 2):

burned_raster[lines[i], cols[i] + 1] = 1

(lines, cols) = numpy.where(burned_raster == 1)

for i in range(0, len(lines)):

if (lines[i] > 0) and (lines[i] < burned_ysize * 2 - 2) and (cols[i] > 0) and (cols[i] < burned_xsize * 2 - 2):

burned_raster[lines[i] + 1, cols[i]] = 1

polygon_raster *= burned_raster

Page 69: PENGEMBANGAN PRODUK INFORMASI DAN DISEMINASI …pusfatja.lapan.go.id/files_uploads_ebook/publikasi/Buku Laporan... · Akhir kata, tak ada gading yang tak retak, buku ini tentunya

60

(lines, cols) = numpy.where(burned_raster == 1)

for i in range(0, len(lines)):

if (lines[i] > 0) and (lines[i] < burned_ysize * 2 - 1) and (cols[i] > 0) and (cols[i] < burned_xsize * 2 - 1):

if (burned_raster[lines[i] - 1, cols[i] - 1] == 1) and (burned_raster[lines[i] - 1, cols[i]] == 1) \

and (burned_raster[lines[i] - 1, cols[i] + 1] == 1) and (burned_raster[lines[i], cols[i] - 1] == 1) \

and (burned_raster[lines[i], cols[i] + 1] == 1) and (burned_raster[lines[i] + 1, cols[i] - 1] == 1) \

and (burned_raster[lines[i] + 1, cols[i]] == 1) and (burned_raster[lines[i] + 1, cols[i] + 1] == 1):

polygon_raster[lines[i], cols[i]] = 0

polygon_kml = open(burned_file, 'w')

polygon_kml.write('<?xml version="1.0" encoding="utf-8"?>\n<kml>\n<Document>\n')

(lines, cols) = numpy.where(polygon_raster == 1)

line = None

col = None

line_reserved = []

col_reserved = []

while len(lines) > 0:

if (line is None) and (col is None):

reserved = False

line = lines[0]

col = cols[0]

first_line = line

first_col = col

polygon_kml.write('<Placemark>\n<LineString>\n<coordinates>%f,%f,100\n' % (burned_geotransform[0] + first_col * burned_geotransform[1] / 2, burned_geotransform[3] + first_line * burned_geotransform[5] / 2))

lines = numpy.delete(lines, 0)

cols = numpy.delete(cols, 0)

if (line % 2 == 0) and (col % 2 == 0):

line_reserved.append(line)

col_reserved.append(col)

Page 70: PENGEMBANGAN PRODUK INFORMASI DAN DISEMINASI …pusfatja.lapan.go.id/files_uploads_ebook/publikasi/Buku Laporan... · Akhir kata, tak ada gading yang tak retak, buku ini tentunya

61

found = False

for i in range(0, len(lines)):

if (math.hypot(line - lines[i], col - cols[i]) <= 1):

found = True

reserved = False

line = lines[i]

col = cols[i]

polygon_kml.write('%f,%f,100\n' % (burned_geotransform[0] + col * burned_geotransform[1] / 2, burned_geotransform[3] + line * burned_geotransform[5] / 2))

lines = numpy.delete(lines, i)

cols = numpy.delete(cols, i)

if (line % 2 == 0) and (col % 2 == 0):

line_reserved.append(line)

col_reserved.append(col)

break

if not found and not reserved:

for i in range(0, len(line_reserved)):

if (math.hypot(line - line_reserved[i], col - col_reserved[i]) <= 1):

found = True

reserved = True

line = line_reserved[i]

col = col_reserved[i]

polygon_kml.write('%f,%f,100\n' % (burned_geotransform[0] + col * burned_geotransform[1] / 2, burned_geotransform[3] + line * burned_geotransform[5] / 2))

if not found or (len(lines) == 0):

polygon_kml.write('%f,%f,100\n</coordinates>\n</LineString>\n</Placemark>\n' % (burned_geotransform[0] + first_col * burned_geotransform[1] / 2, burned_geotransform[3] + first_line * burned_geotransform[5] / 2))

line = None

col = None

polygon_kml.write('</Document>\n</kml>\n')

polygon_kml.close()

nbr_dataset = dnbr_dataset = fhs_dataset = None

Page 71: PENGEMBANGAN PRODUK INFORMASI DAN DISEMINASI …pusfatja.lapan.go.id/files_uploads_ebook/publikasi/Buku Laporan... · Akhir kata, tak ada gading yang tak retak, buku ini tentunya

62

return (True, 'Burned area extracted')

Page 72: PENGEMBANGAN PRODUK INFORMASI DAN DISEMINASI …pusfatja.lapan.go.id/files_uploads_ebook/publikasi/Buku Laporan... · Akhir kata, tak ada gading yang tak retak, buku ini tentunya

PUSAT PEMANFAATAN PENGINDERAAN JAUH - 2015