Pertama kali saya coba Google Earth Engine (GEE), tujuannya simpel: mau lihat perubahan lahan di daerah rumah saya selama 5 tahun terakhir. Ternyata, prosesnya jauh lebih mudah dari yang saya bayangkan. GEE punya koleksi citra satelit yang massive, dan kita bisa akses semuanya lewat browser tanpa download ratusan GB data.
Kalau kamu pernah penasaran gimana caranya monitor deforestasi, perubahan urbanisasi, atau analisis vegetasi pakai citra satelit, tutorial ini cocok banget. Kita akan pakai JavaScript API dari GEE dan citra Sentinel-2 dari ESA (European Space Agency) yang gratis dan berresolusi 10 meter.
Google Earth Engine adalah platform cloud computing yang dikembangkan Google khusus untuk analisis geospasial. Bayangkan punya superkomputer yang sudah diisi petabytes data citra satelit, dan kamu bisa query data itu pakai kode sederhana. Itu intinya GEE.
Keunggulan utama GEE:
Untuk mulai, buka code.earthengine.google.com dan login pakai akun Google. Kalau belum terdaftar, daftar dulu di earthengine.google.com/signup - biasanya disetujui dalam 1-2 hari.
Sentinel-2 adalah satelit observasi bumi dari program Copernicus ESA. Ada dua satelit (Sentinel-2A dan 2B) yang mengorbit bumi setiap 5 hari. Resolusi spasionalnya 10 meter untuk band visible dan NIR, cocok banget untuk analisis lahan.
Band yang sering dipakai:
Di GEE, dataset Sentinel-2 tersedia sebagai COPERNICUS/S2_SR_HARMONIZED (Surface Reflectance). Selalu pakai yang SR (Surface Reflectance) karena sudah dikoreksi atmosfer, bukan yang TOA (Top of Atmosphere).
Pertama, kita definisikan area yang mau dianalisis. Saya pakai contoh area di Jakarta Selatan yang mengalami urbanisasi cepat. Kamu bisa ganti koordinat sesuai kebutuhan.
// Definisikan area of interest (Jakarta Selatan)
var jakarta = ee.Geometry.Rectangle([106.75, -6.35, 106.90, -6.20]);
// Center map ke AOI
Map.centerObject(jakarta, 12);
Map.addLayer(jakarta, {color: 'red'}, 'AOI - Jakarta Selatan');
Kalau mau pakai polygon dari shapefile, upload dulu ke GEE Asset, lalu import sebagai ee.FeatureCollection. Untuk tutorial ini, kita pakai Rectangle sederhana.
Kita mau bandingkan kondisi lahan di 2020 vs 2025. Filter berdasarkan tanggal, area, dan cloud cover. Citra dengan cloud cover tinggi bikin analisis tidak akurat, jadi kita filter yang di bawah 10%.
// Function untuk mask cloud (SCL band)
function maskS2clouds(image) {
var scl = image.select('SCL');
// Shadow, cloud medium/high, cirrus = mask out
var mask = scl.neq(3).and(scl.neq(8)).and(scl.neq(9)).and(scl.neq(10));
return image.updateMask(mask).divide(10000);
}
// Load Sentinel-2 SR - Tahun 2020
var s2_2020 = ee.ImageCollection('COPERNICUS/S2_SR_HARMONIZED')
.filterDate('2020-01-01', '2020-12-31')
.filterBounds(jakarta)
.filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE', 10))
.map(maskS2clouds)
.median()
.clip(jakarta);
// Load Sentinel-2 SR - Tahun 2025
var s2_2025 = ee.ImageCollection('COPERNICUS/S2_SR_HARMONIZED')
.filterDate('2025-01-01', '2025-06-30')
.filterBounds(jakarta)
.filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE', 10))
.map(maskS2clouds)
.median()
.clip(jakarta);
// Visualisasi True Color
var visParams = {bands: ['B4', 'B3', 'B2'], min: 0, max: 0.3};
Map.addLayer(s2_2020, visParams, 'Sentinel-2 2020');
Map.addLayer(s2_2025, visParams, 'Sentinel-2 2025');
Fungsi maskS2clouds menggunakan band SCL (Scene Classification Layer) untuk menghapus piksel cloud, shadow, dan cirrus. .median() mengambil nilai tengah dari semua citra dalam periode tersebut, efektif menghapus cloud yang tersisa.
Untuk monitoring vegetasi, kamu juga bisa memanfaatkan pendekatan query spasial di PostGIS untuk menyimpan dan mengelola hasil analisis di database.
NDVI adalah indeks paling umum untuk mengukur kesehatan vegetasi. Rumusnya simpel:
NDVI = (NIR - Red) / (NIR + Red)
Nilai NDVI berkisar dari -1 sampai +1. Nilai mendekati +1 menunjukkan vegetasi hijau yang sehat, sedangkan nilai negatif menunjukkan air atau area terbangun.
// Hitung NDVI untuk kedua tahun
var ndvi_2020 = s2_2020.normalizedDifference(['B8', 'B4']).rename('NDVI');
var ndvi_2025 = s2_2025.normalizedDifference(['B8', 'B4']).rename('NDVI');
// Palet warna untuk NDVI
var ndviPalette = {
min: -0.2,
max: 0.8,
palette: ['#d73027', '#fc8d59', '#fee08b', '#d9ef8b', '#91cf60', '#1a9850']
};
Map.addLayer(ndvi_2020, ndviPalette, 'NDVI 2020');
Map.addLayer(ndvi_2025, ndviPalette, 'NDVI 2025');
Warna merah = area terbangun/tanah kosong, hijau = vegetasi lebat. Dengan membandingkan 2020 vs 2025, kamu bisa langsung lihat di mana vegetasi berkurang atau bertambah.
Ini bagian paling menarik. Kita selisihkan NDVI 2025 dengan NDVI 2020 untuk melihat area mana yang mengalami perubahan signifikan.
// Hitung perubahan NDVI
var ndviChange = ndvi_2025.subtract(ndvi_2020).rename('NDVI_Change');
// Klasifikasi perubahan
var decrease = ndviChange.lt(-0.15); // Vegetasi berkurang signifikan
var stable = ndviChange.gte(-0.15).and(ndviChange.lte(0.15)); // Stabil
var increase = ndviChange.gt(0.15); // Vegetasi bertambah
// Palet perubahan
var changePalette = {
min: -0.5,
max: 0.5,
palette: ['#d7191c', '#fdae61', '#ffffbf', '#a6d96a', '#1a9641']
};
Map.addLayer(ndviChange, changePalette, 'NDVI Change 2020-2025');
// Tambah layer klasifikasi
Map.addLayer(decrease.selfMask(), {palette: 'red'}, 'Vegetasi Berkurang');
Map.addLayer(increase.selfMask(), {palette: 'green'}, 'Vegetasi Bertambah');
Threshold -0.15 dan +0.15 adalah angka umum yang dipakai di literatur remote sensing. Kamu bisa sesuaikan tergantung sensitivitas yang diinginkan. Threshold lebih kecil = lebih sensitif terhadap perubahan kecil.
Mau tahu berapa hektar lahan yang berubah? Kita bisa hitung pakai reduceRegion:
// Hitung luas area perubahan (dalam meter persegi)
var areaDecrease = decrease.multiply(ee.Image.pixelArea())
.reduceRegion({
reducer: ee.Reducer.sum(),
geometry: jakarta,
scale: 10,
maxPixels: 1e9
});
var areaIncrease = increase.multiply(ee.Image.pixelArea())
.reduceRegion({
reducer: ee.Reducer.sum(),
geometry: jakarta,
scale: 10,
maxPixels: 1e9
});
// Konversi ke hektar
var haDecrease = ee.Number(areaDecrease.get('NDVI_Change')).divide(10000);
var haIncrease = ee.Number(areaIncrease.get('NDVI_Change')).divide(10000);
print('Area vegetasi berkurang (ha):', haDecrease);
print('Area vegetasi bertambah (ha):', haIncrease);
Hasilnya muncul di Console panel GEE. Scale 10 berarti menggunakan resolusi 10 meter per piksel. maxPixels: 1e9 meningkatkan batas default untuk area yang luas.
Setelah analisis selesai, export hasil untuk dipakai di GIS desktop atau web mapping:
// Export NDVI Change ke Google Drive
Export.image.toDrive({
image: ndviChange,
description: 'NDVI_Change_Jakarta_2020_2025',
folder: 'GEE_Exports',
region: jakarta,
scale: 10,
crs: 'EPSG:4326',
maxPixels: 1e9
});
// Export klasifikasi perubahan
Export.image.toDrive({
image: decrease.add(increase.multiply(2)).toByte(),
description: 'LandChange_Classification',
folder: 'GEE_Exports',
region: jakarta,
scale: 10,
crs: 'EPSG:4326',
maxPixels: 1e9
});
File GeoTIFF yang di-export bisa dibuka di QGIS, ArcGIS, atau bahkan di-load ke PostGIS untuk analisis lebih lanjut. Kalau kamu tertarik integrasi dengan database spasial, baca juga tutorial PostGIS spatial query untuk aplikasi web.
Mau lihat tren NDVI dari waktu ke waktu? Buat chart time-series:
// Load semua data 2020-2025
var s2_all = ee.ImageCollection('COPERNICUS/S2_SR_HARMONIZED')
.filterDate('2020-01-01', '2025-06-30')
.filterBounds(jakarta)
.filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE', 20))
.map(maskS2clouds)
.map(function(image) {
return image.addBands(
image.normalizedDifference(['B8', 'B4']).rename('NDVI')
);
});
// Buat chart
var chart = ui.Chart.image.series({
imageCollection: s2_all.select('NDVI'),
region: jakarta,
reducer: ee.Reducer.mean(),
scale: 100,
xProperty: 'system:time_start'
}).setOptions({
title: 'Trend NDVI - Jakarta Selatan (2020-2025)',
hAxis: {title: 'Tanggal'},
vAxis: {title: 'NDVI Rata-rata'},
lineWidth: 2,
pointSize: 3,
series: {0: {color: '#1a9850'}}
});
print(chart);
Chart ini menunjukkan fluksi musiman NDVI (hijau di musim hujan, turun di musim kemarau) dan tren jangka panjang. Kalau garis tren menurun, artinya ada deforestasi atau urbanisasi di area tersebut.
.median() atau .mean() untuk mengurangi efek cloudMap.setOptions('SATELLITE')Google Earth Engine mengubah cara kita analisis citra satelit. Yang dulu butuh superkomputer dan download data berhari-hari, sekarang bisa selesai dalam hitungan menit lewat browser. Dengan Sentinel-2 dan NDVI, kamu bisa monitor perubahan lahan di area manapun di bumi.
Mulai dari yang simpel: pilih area yang kamu kenal, bandingkan 2 tahun yang berbeda, dan lihat perubahannya. Dari situ, kembangkan ke analisis yang lebih kompleks seperti klasifikasi lahan atau prediksi tren. Kalau ada pertanyaan soal GEE atau remote sensing, drop komentar di bawah!