Lewati ke isi
Profil penulisSeri Buku GIS Kehutanan dan Pertanian/ M3
Tampilkan bagian untuk:

BAB 1: Dari Foto ke Film: Menyusun Deret Waktu

#Studi kasus: "Apa yang terjadi sejak tahun lalu?"

Kepala Seksi menaruh dua puluh empat berkas citra di meja Anda. "Ini rekaman dua tahun KPH Contoh. Saya mau tahu apa yang berubah. Tapi jangan kirim dua puluh empat peta. Kirim satu cerita." Tugas pertama Anda adalah mengubah tumpukan berkas itu menjadi satu deret waktu yang tertata, bertanggal, dan siap dianalisis.

#Konsep: deret waktu dalam tiga kalimat

Deret waktu adalah kumpulan citra dari lokasi yang sama yang diambil pada tanggal berbeda, seperti buku lipat bergambar: tiap lembar hampir sama, dan perbedaan antar lembar menunjukkan gerakan. Bila lembar-lembar itu ditumpuk, tiap piksel punya riwayat angka, yang disebut profil waktu. Riwayat itu bisa dibaca seperti detak jantung: normal, naik turun musiman, atau tiba-tiba jatuh.

Istilah baru bab ini:

  • Deret waktu: citra lokasi sama pada banyak tanggal.
  • Tumpukan (stack): semua tanggal digabung menjadi satu berkas, satu tanggal satu band.
  • Profil waktu: nilai satu piksel sepanjang tanggal.
  • Stempel waktu: tanggal yang menempel pada citra atau band.
  • Reflektansi: pantulan permukaan, angka 0 sampai 1 (data sintetis di sini sudah berbentuk ini).
Ilustrasi 1.1: Kubus data
Skema: banyak citra ditumpuk menurut waktu membentuk kubus x, y, dan waktu

#Mengenal data yang dipakai

Buka paket-m3/citra/Daftar_Citra.csv. Tabel ini adalah buku harian deret Anda. Isinya empat kolom: tanggal, berkas reflektansi, berkas SCL, dan persentase piksel yang tertutup awan.

Tiga hal yang perlu Anda sadari sejak awal:

  • Selang antar tanggal tidak sama: ada yang 30 hari, ada yang 35 hari. Karena itu waktu harus dihitung dalam hari, bukan nomor urut.
  • Persentase awan berkisar dari 0 sampai sekitar 60 persen. Awan itu akan Anda bereskan di Bab 2.
  • Tiap berkas _refl.tif punya enam band dengan urutan tetap: B02, B03, B04, B08, B11, B12. Dalam ekspresi QGIS, B04 (merah) adalah band 3 dan B08 (inframerah dekat) adalah band 4.

#Menggabungkan Sentinel dan Landsat

Bila satu sensor belum cukup rapat, orang menggabungkan Sentinel-2 dan Landsat. Syaratnya: samakan dulu "bahasa"-nya.

  • Nama band berbeda. Contoh: inframerah dekat adalah B08 di Sentinel-2, dan band 5 di Landsat 8 dan 9. Periksa tabel band tiap sensor sebelum menghitung indeks. [CEK: cocokkan dengan dokumentasi sensor yang Anda pakai]
  • Skala berbeda. Menurut USGS, reflektansi permukaan Landsat Collection 2 Level-2 dihitung dengan rumus: nilai piksel dikali 0,0000275, lalu dikurangi 0,2.
  • Resolusi berbeda. Sentinel-2 10 m, Landsat 30 m. Samakan grid sebelum ditumpuk.

Buku ini memakai satu sensor tiruan supaya perhatian Anda tertuju pada cara kerja deret waktu, bukan pada urusan penyamaan sensor.

#Bagian A: QGIS

#Bagian A: Menyusun deret waktu di QGIS

A.1 Memuat dan memeriksa satu citra

  1. Buka Layer ► Data Source Manager (Ctrl+L), pilih tab Raster, lalu tambahkan S2_20240105_refl.tif.
  2. Klik kanan layer, pilih Properties, lalu buka tab Information. Pastikan: 6 band, ukuran 40 x 40, CRS EPSG:32749.
  3. Buka tab Symbology. Pilih Multiband color, lalu atur Red = Band 4, Green = Band 3, Blue = Band 2. Itu komposit warna palsu sederhana. Hutan tampak merah.

Hasilnya: Anda mengenali isi satu tanggal. Sekarang tiap tanggal akan dijadikan NDVI.

A.2 Membuat NDVI tiap tanggal dan menumpuknya

Mengulang Raster Calculator dua puluh empat kali lewat klik itu membosankan. Pakai Skrip 1.1: ia membuat NDVI tiap tanggal, lalu menggabungkan semuanya menjadi satu berkas 24 band.

PYTHON
# SKRIP 1.1 (cuplikan; berkas lengkap: skrip/1_1_susun_ndvi.py)
for tgl, pr, ps in daftar:
    nama = "S2_" + tgl.strftime("%Y%m%d") + "_refl"
    lyr = QgsRasterLayer(pr, nama)
    QgsProject.instance().addMapLayer(lyr, False)
    ekspresi = '("%s@4" - "%s@3") / ("%s@4" + "%s@3")' % (nama, nama, nama, nama)
    processing.run("native:rastercalc", {"LAYERS": [lyr], "EXPRESSION": ekspresi, "OUTPUT": out})
    keluaran.append(out)
# satu tanggal = satu band
processing.run("gdal:merge", {"INPUT": keluaran, "SEPARATE": True, "DATA_TYPE": 5, "OUTPUT": stack})

Cara membaca: native:rastercalc menghitung NDVI per tanggal. gdal:merge dengan SEPARATE bernilai benar menaruh tiap berkas pada band tersendiri. DATA_TYPE 5 berarti Float32.

Jalankan di Plugins ► Python Console (buka editor, muat berkas skrip, tekan Run). Hasil uji: berkas NDVI_deret.tif berisi 24 band dan terbaca valid di QGIS. [terbukti: diuji di QGIS 4.0.2]

A.3 Memberi stempel waktu pada tiap band

QGIS punya Temporal Controller untuk memutar layer menurut tanggal. Untuk berkas bertumpuk, pakai mode Fixed Time Range Per Band: tiap band memegang rentang tanggalnya sendiri. Menurut dokumentasi QGIS, mode ini memang dirancang untuk layer yang bandnya mewakili periode waktu berbeda.

Lewat antarmuka: klik kanan NDVI_deret, pilih Properties, buka tab Temporal, centang Dynamic Temporal Control, lalu pilih mode Fixed Time Range Per Band dan isi tanggal tiap band. Karena ada 24 band, pakai Skrip 1.3.

PYTHON
# SKRIP 1.3 (cuplikan; berkas lengkap: skrip/1_3_atur_waktu.py)
rentang = {}
for b, (tgl, _, _) in enumerate(U.daftar_citra(), start=1):
    awal = QDateTime(QDate(tgl.year, tgl.month, tgl.day), QTime(0, 0, 0))
    rentang[b] = QgsDateTimeRange(awal, awal.addDays(1))
tp = lyr.temporalProperties()
tp.setMode(Qgis.RasterTemporalMode.FixedRangePerBand)
tp.setFixedRangePerBand(rentang)
tp.setIsActive(True)

Lalu buka panel dari View ► Panels ► Temporal Controller Panel, pilih mode Animated temporal navigation, atur rentang 2024-01-01 sampai 2025-12-31, dan tekan tombol putar. Hasil uji: skrip menandai 24 band bertanggal (band 9 = 16 September 2024). [terbukti: sifat temporal terbaca ulang; tampilan animasi di antarmuka perlu Anda lihat sendiri, [CEK]]

A.4 Membaca profil waktu satu piksel

Skrip 1.2 mengambil nilai NDVI satu titik di 24 band dengan dataProvider().sample(titik, nomor_band), lalu menggambar grafiknya.

PYTHON
# SKRIP 1.2 (cuplikan; berkas lengkap: skrip/1_2_profil_waktu.py)
dp = lyr.dataProvider()
for b in range(1, lyr.bandCount() + 1):
    v, ok = dp.sample(QgsPointXY(x, y), b)
    nilai.append(v if ok else np.nan)

Contoh hasil (NDVI mentah, belum dibersihkan):

TitikNDVI tanggal pertamaNDVI minimumNDVI tanggal terakhir
Hutan alam0,870,000,88
Sawah (Beta)0,740,060,72
Bukaan (Gamma)0,860,030,04
Bekas bakar (Beta)0,870,010,01

Perhatikan: hutan alam yang tidak berubah pun sempat "turun" ke 0,00. Itu bukan hutannya, melainkan awan. Masalah ini menjadi pokok Bab 2.

Ilustrasi 1.2: Profil waktu empat piksel
Empat piksel berbeda sepanjang 24 tanggal; lonjakan turun mendadak di semua garis adalah awan

Hasilnya: Anda punya satu berkas NDVI 24 band bertanggal dan tahu cara membaca riwayat satu piksel.

#Bagian B: ArcGIS Pro

#Bagian B: ArcGIS Pro

ArcGIS Pro menyebut tumpukan bertanggal sebagai raster multidimensi. Alat deret waktunya berada di ekstensi Image Analyst.

  1. Buat mosaic dataset dari 24 berkas dengan Create Mosaic Dataset dan Add Rasters To Mosaic Dataset. [CEK]
  2. Isi satu field tanggal pada tabel footprint untuk tiap berkas. Tanggal bisa diambil dari nama berkas S2_YYYYMMDD. [CEK]
  3. Jalankan Build Multidimensional Info agar mosaic dataset mengenal dimensi waktu. Dokumentasi Esri menandai alat ini sebagai usang dan menyebut fungsinya dipindah ke toolbox Multidimensional. Cari padanannya di sana. [CEK]
  4. Klik kanan layer di panel Contents, pilih Create Chart, lalu Temporal Profile. Klik titik di peta untuk melihat profil waktu. Dokumentasi Esri menyebut grafik ini tersedia untuk multidimensional mosaic dataset, multidimensional raster layer, dan netCDF raster layer, dan datanya harus punya dimensi waktu.

#Bagian C: ArcMap 10.8

#Bagian C: ArcMap 10.8

ArcMap tidak punya raster multidimensi dan tidak punya grafik temporal profile seperti Pro. [CEK: periksa di instalasi Anda]

  1. Gabungkan tanggal lewat mosaic dataset dengan field tanggal, lalu atur properti waktunya agar bisa dimainkan lewat Time Slider. [CEK]
  2. Untuk profil satu piksel, pakai Extract Values to Points pada tiap tanggal, lalu satukan tabelnya. [CEK]
  3. Alternatif paling praktis: kerjakan bagian ini di QGIS, lalu bawa hasilnya ke ArcMap.

#Cek paham

  1. Mengapa waktu dalam deret ini dihitung dalam hari, bukan nomor urut citra?
  2. Pada profil waktu, hutan yang tidak berubah sempat menunjukkan NDVI 0,00. Apa penyebab paling mungkin?
  3. Apa gunanya mode Fixed Time Range Per Band?

Jawaban:

  1. Selang antar tanggal tidak sama. Bila memakai nomor urut, kemiringan tren dan interpolasi menjadi keliru.
  2. Awan atau bayangan awan yang menutupi piksel pada tanggal itu.
  3. Memberi tanggal pada tiap band dalam satu berkas, sehingga Temporal Controller bisa menampilkan band yang sesuai tanggal.

#Kesalahan umum

  • Menumpuk citra tanpa memeriksa urutan tanggal. Urutan nama berkas harus sama dengan urutan tanggal. Di paket ini urutan abjad sama dengan urutan waktu karena nama berformat tahun-bulan-hari.
  • Lupa bahwa piksel berawan ikut tertumpuk. Tumpukan mentah belum siap dianalisis.
  • Mencampur CRS atau ukuran piksel antar tanggal. Semua tanggal harus satu grid. Periksa ukuran dan CRS tiap berkas sebelum gdal:merge.
  • Mengira Temporal Controller mengubah data. Ia hanya mengatur apa yang tampil.

#Ringkasan dan latihan

Ringkasan: deret waktu adalah tumpukan citra bertanggal. Tiap piksel punya profil waktu. Tanggal harus dihitung dalam hari. Tumpukan mentah masih tercemar awan.

Latihan:

  1. Jalankan Skrip 1.1 dan 1.3, lalu putar animasi NDVI. Catat tanggal ketika petak di Gamma tampak "berlubang".
  2. Ganti koordinat di Skrip 1.2 dengan titik pilihan Anda, misalnya di KPH Alpha. Bandingkan profilnya dengan hutan alam.
  3. Dari Daftar_Citra.csv, tanggal mana yang paling bersih dan paling berawan?

#Tabel perbandingan: menyusun deret waktu

LangkahQGISArcGIS ProArcMap 10.8Status
Tumpuk banyak tanggalgdal:merge dengan SEPARATEMosaic dataset, raster multidimensiMosaic dataset berwaktuQGIS terbukti; lainnya [CEK]
Stempel waktuFixed Time Range Per BandDimensi waktu pada mosaicProperti waktu mosaicQGIS: sifat terbukti
Putar animasiTemporal ControllerTime slider pada layer multidimensiTime Slider[CEK]
Profil waktu satu titikdataProvider().sample()Create Chart, Temporal ProfileTidak ada padanan langsungQGIS terbukti; Pro: dokumentasi dibaca