Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

EDBSI-SPATIO-TEMPORAL

Analisis Multitemporal Perubahan Lahan Terbuka Menggunakan ENDBSI dan AWEI untuk Wilayah Pulau

Repositori di GitHub

oleh : Defani Arman Alfitriansyah

Open In Colab
LinkedIn Medium TikTok Instagram Kaggle RPubs Behance Email GitHub

Tujuan

Analisis ini bertujuan untuk memantau dinamika perubahan luas dan tingkat keterbukaan lahan (tanah terbuka/bare soil) di suatu kawasan kepulauan selama periode 2019–2026.

Tantangan Utama

Solusi yang Diimplementasikan

  1. Masking Air AWEI(sh): Menggunakan indeks air untuk mengisolasi daratan

  2. Indeks Tanah Terbuka ENDBSI: Menghitung indeks eksklusif pada wilayah daratan yang tervalidasi


Metodologi dan Indeks Spektral

A. Automated Water Extraction Index - shadow (AWEI_sh)

Indeks ini dirancang khusus untuk mengekstrak badan air secara otomatis sekaligus menghilangkan noise dari bayangan gelap.

Referensi: Feyisa et al., 2014

Formula:

AWEI_sh = Blue + 2.5 × Green - 1.5 × (NIR + SWIR_1) - 0.25 × SWIR_2

Karakteristik:

Dimana:


B. Enhanced Normalized Difference Bare Soil Index (ENDBSI)

Indeks ini sangat sensitif untuk membedakan tanah terbuka murni dari tutupan lahan lain (seperti bangunan beton atau vegetasi kering).

Referensi: Chen et al., 2026

Formula:

ENDBSI = (3 × SWIR_1 + Red - Blue - Green - NIR - SWIR_2) / (3 × SWIR_1 + Red + Blue + Green + NIR + SWIR_2)

Rentang Nilai:

Interpretasi:


Logika Cloud Masking dan Thresholding

Proses Pemisahan Air dan Daratan

Indeks AWEI_sh diformulasikan agar:

Logika Piksel Spasial (if-else):

Untuk setiap piksel (x,y):

Algoritma Masking Lengkap

  1. Hitung AWEI_sh untuk setiap piksel dari citra Sentinel-2 Surface Reflectance

  2. Evaluasi kondisi threshold untuk setiap piksel:

    • Jika AWEI_sh > 0: Piksel diubah menjadi NoData (dihapus dari analisis)

    • Jika AWEI_sh ≤ 0: Piksel diproses oleh rumus ENDBSI

  3. Update mask pada citra ENDBSI menggunakan daratan yang tervalidasi

  4. Hitung statistik (Mean, Persentil ke-2 dan ke-98) hanya dari wilayah daratan

Keuntungan Metode Ini:


Pustaka Python yang Digunakan

PustakaFungsi UtamaReferensi
earthengine-apiAPI dasar Google Earth Engine untuk komputasi cloud spasial dan pengaksesan datasetGoogle Earth Engine Documentation
geemapIntegrasi GEE dengan Python, pemrosesan koleksi citra, dan eksport peta interaktifWu, Q. (2020). JOSS, 5(51), 2305
cartoeeModul geemap untuk eksport peta statis berkualitas publikasi jurnal ilmiahMarkert, K. N. (2019). JOSS, 4(33), 1207
cartopyProyeksi kartografi spasial dan sistem referensi koordinat (CRS) untuk presisi geografisMet Office (2013)
matplotlibPlotting grafik tren temporal 2D, tata letak kanvas, colorbar, dan elemen legendaHunter, J. D. (2007). CSE, 9(3), 90-95
imageioPembacaan/penulisan gambar raster, dan pembuatan animasi GIF dari frame PNG tahunanImageIO Documentation

Alur Kerja Analisis

Tahap 1: Instalasi dan Import Library

Langkah pertama adalah memasang seluruh pustaka pihak ketiga yang dibutuhkan untuk komputasi spasial, kemudian mengimpor modul-modul tersebut ke dalam memori lingkungan kerja.

!pip install earthengine-api geemap cartopy matplotlib imageio

import ee
import geemap.cartoee as cartoee
import geemap.colormaps as cm
import matplotlib.pyplot as plt
import matplotlib as mpl
import matplotlib.patches as mpatches
from matplotlib.colors import LinearSegmentedColormap
import cartopy.crs as ccrs
import imageio.v2 as imageio_v2
from cartopy.mpl.gridliner import LONGITUDE_FORMATTER, LATITUDE_FORMATTER
from cartopy.mpl.geoaxes import GeoAxes

Tahap 2: Autentikasi Google Earth Engine

Menghubungkan lingkungan kerja Python dengan peladen komputasi awan Google Earth Engine.

ee.Authenticate()  # Verifikasi identitas dan dapatkan token akses
ee.Initialize(project='ee-defaniarman')  # Inisialisasi sesi GEE

Tahap 3: Definisikan Area of Interest (AOI)

Menentukan batas geografis wilayah studi dalam format poligon koordinat.

roi = ee.Geometry.Polygon([[
    [128.31268280537424, 0.7648247357638791],
    [128.3597180226594, 0.7648247357638791],
    [128.3597180226594, 0.811683855445309],
    [128.31268280537424, 0.811683855445309],
    [128.31268280537424, 0.7648247357638791]
]])
bounds = roi.bounds().getInfo()['coordinates'][0]
region_bbox = [bounds[0][0], bounds[0][1], bounds[2][0], bounds[2][1]]

Tahap 4: Fungsi Penyesuaian Skala Reflektan

Mengkonversi nilai Digital Number (DN) mentah menjadi nilai reflektansi permukaan yang sebenarnya.

def apply_scale(image):
    # Konversi DN ke Reflektansi dengan faktor skala 0.0001 (DN / 10000)
    return image.divide(10000).copyProperties(image, ['system:time_start'])

Tahap 5: Fungsi Perhitungan Indeks Spektral

Menghitung indeks ENDBSI dan AWEI_sh dari band-band spektral Sentinel-2.

def add_indices(image):
    b2 = image.select('B2')
    b3 = image.select('B3')
    b4 = image.select('B4')
    b8 = image.select('B8')
    b11 = image.select('B11')
    b12 = image.select('B12')
    
    # Hitung ENDBSI
    num = b11.multiply(3).add(b4).subtract(b2).subtract(b3).subtract(b8).subtract(b12)
    den = b11.multiply(3).add(b4).add(b2).add(b3).add(b8).add(b12)
    endbsi = num.divide(den).rename('ENDBSI')
    
    # Hitung AWEI_sh
    awei_sh = (b2.add(b3.multiply(2.5))
               .subtract(b8.add(b11).multiply(1.5))
               .subtract(b12.multiply(0.25))
               .rename('AWEI_sh'))
    
    return image.addBands(endbsi).addBands(awei_sh)

Tahap 6: Konstruksi Komposit Citra Tahunan

Membangun komposit citra Sentinel-2 Surface Reflectance median tahunan untuk masing-masing tahun.

def get_annual_composite(year):
    start = ee.Date.fromYMD(year, 1, 1)
    end = ee.Date.fromYMD(year, 12, 31)
    
    return (ee.ImageCollection('COPERNICUS/S2_SR_HARMONIZED')
            .filterBounds(roi)
            .filterDate(start, end)
            .filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE', 20))
            .map(apply_scale)
            .map(add_indices)
            .median()
            .clip(roi)
            .set('year', year))

years = ee.List.sequence(2019, 2026)
col = ee.ImageCollection(years.map(get_annual_composite))

Langkah-langkah dalam fungsi:

  1. Filter citra Sentinel-2 SR untuk tahun spesifik (1 Januari - 31 Desember)

  2. Hanya ambil citra yang melingkupi AOI

  3. Filter awan dengan persentase tutupan < 20%

  4. Terapkan fungsi apply_scale untuk normalisasi nilai DN

  5. Terapkan fungsi add_indices untuk perhitungan indeks

  6. Hitung median dari seluruh citra yang tersisa untuk mengurangi noise

  7. Potong (clip) citra komposit sesuai batas AOI

Tahap 7: Rendering dan Visualisasi Spasial

Membuat rangkaian peta tahunan dengan masking air dan visualisasi ENDBSI dinamis.

Untuk setiap tahun dalam rentang 2019-2026:

  1. Filter citra komposit berdasarkan tahun

  2. Seleksi band ENDBSI dan AWEI_sh

  3. Buat mask daratan (AWEI_sh ≤ 0) dan hapus piksel air (AWEI_sh > 0)

  4. Hitung statistik persentil ke-2 dan ke-98 untuk rentang visualisasi dinamis

  5. Setup plotting dengan matplotlib dan cartopy (proyeksi PlateCarree)

  6. Tambahkan layer ENDBSI daratan dan layer air ke peta

  7. Konfigurasi gridlines dan label lintang/bujur

  8. Tambahkan judul, sumber data, dan label tahun

  9. Render colorbar dengan skala nilai yang disesuaikan

  10. Simpan setiap frame sebagai file PNG

Tahap 8: Pembuatan Animasi GIF

Menggabungkan seluruh frame PNG tahunan menjadi satu file animasi GIF.

import imageio.v2 as imageio_v2
import os

frames = ['frame_endbsi_2019.png', 'frame_endbsi_2020.png', ..., 'frame_endbsi_2026.png']
output_gif = 'ENDBSI_AWEI_Temporal_2019_2026.gif'

with imageio_v2.get_writer(output_gif, mode='I', duration=1.5, loop=0) as writer:
    for fname in frames:
        writer.append_data(imageio_v2.imread(fname))

Spesifikasi GIF:

Tahap 9: Analisis Tren Temporal

Membuat grafik line chart untuk menunjukkan tren perubahan ENDBSI dari 2019 hingga 2026.

def get_endbsi_stats(img):
    endbsi = img.select('ENDBSI')
    awei_sh = img.select('AWEI_sh')
    
    land_mask = awei_sh.lte(0)
    endbsi_land = endbsi.updateMask(land_mask)
    
    reducers = ee.Reducer.mean().combine(
        reducer2=ee.Reducer.percentile([2, 98]),
        sharedInputs=True
    )
    
    stats = endbsi_land.reduceRegion(
        reducer=reducers,
        geometry=roi,
        scale=10,
        maxPixels=1e9
    )
    return img.set(stats)

stats_fc = col.map(get_endbsi_stats)
stats_data = stats_fc.getInfo()['features']

# Extract plot data
plot_years = [f['properties']['year'] for f in stats_data]
plot_mean = [f['properties'].get('ENDBSI_mean') for f in stats_data]
plot_min = [f['properties'].get('ENDBSI_p2') for f in stats_data]
plot_max = [f['properties'].get('ENDBSI_p98') for f in stats_data]

# Plot line chart
fig, ax = plt.subplots(figsize=(12, 6))
ax.plot(plot_years, plot_max, color='#d73027', marker='^', linewidth=2, label='MAX (P98)')
ax.plot(plot_years, plot_mean, color='#f46d43', marker='o', linewidth=2, label='MEAN')
ax.plot(plot_years, plot_min, color='#1a9850', marker='v', linewidth=2, label='MIN (P2)')
ax.set_title('SPATIO-TEMPORAL TREND OF ENDBSI (2019-2026)', fontsize=14, fontweight='bold')
ax.set_xlabel('YEAR', fontsize=12)
ax.set_ylabel('ENDBSI REFLECTANCE VALUE', fontsize=12)
ax.grid(True, linestyle='--', alpha=0.6)
ax.legend()
plt.tight_layout()
plt.savefig('Chart_Trend_ENDBSI.png', dpi=150, bbox_inches='tight')

Output Hasil Analisis

Animasi Spasial-Temporal ENDBSI dengan Masking Air AWEI

Animasi ini menampilkan perubahan indeks ENDBSI dari tahun 2019 hingga 2026 dengan air yang sudah dimasking (dihapus).

ENDBSI AWEI Temporal 2019-2026

Deskripsi Visual:

Kegunaan:


Animasi True Color Composite (Warna Asli)

Menampilkan citra satelit mendekati apa yang dilihat mata manusia dengan pemetaan langsung band spektral ke saluran RGB.

True Color Temporal 2019-2026

Spesifikasi Teknis:

Interpretasi Warna:

Kegunaan:


Animasi False Color Composite (Warna Palsu)

Menampilkan kombinasi spektral untuk menonjolkan fitur yang tidak terlihat dalam True Color, terutama vegetasi dan batas water-land.

False Color Temporal 2019-2026

Spesifikasi Teknis:

Interpretasi Warna:

Kegunaan:


Output Statistik Nilai Indeks NDBSI

Chart_INDEKS

Petunjuk Penggunaan

Persyaratan Awal

  1. Akun Google (untuk akses Google Colab)

  2. Akun Google Earth Engine (daftar di https://earthengine.google.com/signup/)

  3. Google Cloud Project dengan quota unlimited (rekomendasi)

Langkah-Langkah Eksekusi

  1. Klik tombol “Open In Colab” di bagian atas repository untuk membuka notebook

  2. Login dengan akun Google yang sudah terdaftar di Earth Engine

  3. Edit cell authentication dan ubah project ID:

    ee.Initialize(project='YOUR_GEE_PROJECT_ID')
  4. Update koordinat area of interest (AOI):

    roi = ee.Geometry.Polygon([[
        [lon_min, lat_min],
        [lon_max, lat_min],
        [lon_max, lat_max],
        [lon_min, lat_max],
        [lon_min, lat_min]
    ]])
  5. Jalankan cell satu per satu dari atas ke bawah secara berurutan

  6. Tunggu setiap cell selesai eksekusi sebelum melanjutkan

  7. Output berupa file GIF dan PNG akan otomatis diunduh

Tips Penggunaan


Daftar Pustaka

Indeks dan Metodologi

Chen, J., Zhong, Y., Tang, B.-H., Huang, L., Fu, Z., Fan, D., Zhao, T., & Yang, C. (2026). ENDBSI: an Enhanced Normalized Difference Bare Soil Index for identifying the bare soil of urban and rural areas. Remote Sensing of Environment, Forthcoming.

Feyisa, G. L., Meilby, H., Fensholt, R., & Proud, S. R. (2014). Automated Water Extraction Index: A new technique for surface water mapping using Landsat imagery. Remote Sensing of Environment, 140, 23-35. Feyisa et al. (2014)

Software dan Libraries

Hunter, J. D. (2007). Matplotlib: A 2D graphics environment. Computing in Science & Engineering, 9(3), 90-95. Hunter (2007)

Markert, K. N. (2019). cartoee: Publication quality maps using Earth Engine. Journal of Open Source Software, 4(33), 1207. Markert (2019)

Met Office. (2013). Cartopy: A cartographic Python library with matplotlib support. Exeter, Devon. http://scitools.org.uk/cartopy

Wu, Q. (2020). geemap: A Python package for interactive mapping with Google Earth Engine. Journal of Open Source Software, 5(51), 2305. Wu (2020)

Data Source

European Space Agency (ESA). Sentinel-2 Level-2A (L2A) Surface Reflectance. Copernicus Programme. https://developers.google.com/earth-engine/datasets/catalog/COPERNICUS_S2_SR_HARMONIZED


Dokumentasi Package Resmi


Fitur Utama


Kontak dan Informasi

Defani Arman Alfitriansyah

Email: defaniarman@gmail.com LinkedIn: https://linkedin.com/in/defaniarmanalfitriansyah Medium: https://medium.com/@defaniarman GitHub: https://github.com/Defani


Last Updated: June 1, 2026 Repository: https://github.com/Defani/EDBSI-SPATIO-TEMPORAL

Notebook

Notebook dari repositori ini, tampil lengkap dengan sel kode dan hasilnya:

References
  1. Feyisa, G. L., Meilby, H., Fensholt, R., & Proud, S. R. (2014). Automated Water Extraction Index: A new technique for surface water mapping using Landsat imagery. Remote Sensing of Environment, 140, 23–35. 10.1016/j.rse.2013.08.029
  2. Hunter, J. D. (2007). Matplotlib: A 2D Graphics Environment. Computing in Science & Engineering, 9(3), 90–95. 10.1109/mcse.2007.55
  3. Markert, K. (2019). cartoee: Publication quality maps using Earth Engine. Journal of Open Source Software, 4(33), 1207. 10.21105/joss.01207
  4. Wu, Q. (2020). geemap: A Python package for interactive mapping with Google Earth Engine. Journal of Open Source Software, 5(51), 2305. 10.21105/joss.02305