Thursday, April 19, 2018

Pemetaan Tumpahan Minyak di Pantai Balikpapan Menggunakan Citra Radar Sentinel 1A dan Google Earth Engine

Kasus tumpahan minyak di Pantai Balikpapan awal April 2018 menjadi isu hangat bulan ini. Berbagai media memberitakan dampak negatif dari bencana lingkungan ini. Sebagai geoscientist, isu ini menarik buat saya pribadi karena sebaran tumpahan minyak di laut saat ini sudah bisa dideteksi dengan baik dan dipetakan sebarannya menggunakan data radar SAR.

Dengan bermodal layanan cloud image processing dari Google Earth Engine (GEE) saya mencoba bereksperimen memetakan sebaran area tumpahan minyak di Pantai Balikpapan. GEE menyediakan akses ke repositori data Sentinel 1 SAR yang saat ini operasional, dan kebetulan selang beberapa hari dari kejadian tumpahan minyak, satelit Sentinel 1A lewat di atas Balikpapan.

Saya menggunakan kode awal dari Simon Ilyuschenko dari GEE Team yang digunakan untuk pemetaan area banjir dari citra Sentinel, yang saya modifikasi untuk lebih peka terhadap tumpahan minyak. Dengan menggunakan teknik pemrosesan image tresholding dan image difference dari citra yang merekam pada kondisi sebelum ( minggu ke 3 maret 2018) dan sesudah kejadian tumpahan minyak (minggu pertama April 2018), area sebaran tumpahan minyak dapat diidentifikasi. Tumpahan minyak dapat diidentifikasi dengan mudah dari citra SAR karena  minyak dan air mempunyai konstanta dielektrik yang berbeda, dan spektrum gelombang mikro pada panjang gelombang C Band sangat sensitif dengan perbedaan konstanta dielektrik, terutama pada polarisasi VV (Vertical send Vertical return)

Meskipun demikian, kode ini belum sempurna karena masih terdapat area - area yang misklasifikasi, sehingga revisi dan pemrosesan citra lebih lanjut perlu dilakukan. Sebenarnya identifikasi area tumpahan minyak ini lebih gampang dilakukan kalau kita menggunakan software desktop yang bisa mengolah data radar seperti ESA SNAP, ENVI Sarscape atau ERDAS dan PCI Geomatica, tetapi GEE menawarkan sesuatu yang berbeda, yaitu kepraktisan, karena kita tidak perlu mendownload data yang ukurannya cukup besar, dan menyiapkan hardware komputer yang mumpuni. Semua bisa dikerjakan di Cloud hanya dengan mengetikkan beberapa baris kode javascript API. Berikut ini screenshot hasilnya.


Rekan - rekan yang tertarik mencoba bisa menggunakan kode yang saya gunakan di bawah ini. Sukur -sukur bisa memperbaiki dan mengembangkan lebih lanjut. Jangan lupa colek saya ya kalau ada revisi.

var geometry = geometry;

// Load Sentinel-1 images to map Oil Spill in Balikpapan Indonesia April 2018.
// This script was originally written by Simon Ilyushchenko (GEE team)
// and adapted by Simon Gascoin (CNRS/CESBIO) and Michel Le Page (IRD/CESBIO)
// and also adapted by Bramantiyo Marjuki (Indonesia Ministry of Public Works/Regional Development Departement of Diponegoro University)
// Default location
var pt = geometry; //Coulommiers

// Load Sentinel-1 C-band SAR Ground Range collection (log scaling, VV co-polar)
var collection =  ee.ImageCollection('COPERNICUS/S1_GRD').filterBounds(pt)
.filter(ee.Filter.listContains('transmitterReceiverPolarisation', 'VV'))
.select('VV');

// Filter by date 
var before = collection.filterDate('2018-03-10', '2018-03-29').mosaic();
var after = collection.filterDate('2018-03-31', '2018-04-06').mosaic();
var diff = after.subtract(before);
// Threshold smoothed radar intensities to identify "spill" areas.
var SMOOTHING_RADIUS = 200;
var DIFF_UPPER_THRESHOLD = -0.9;

var diff_smoothed = after.focal_median(SMOOTHING_RADIUS, 'circle', 'meters').subtract(before.focal_median(SMOOTHING_RADIUS, 'circle', 'meters'));

var diff_thresholded = diff_smoothed.lt(DIFF_UPPER_THRESHOLD);

// Display map
Map.centerObject(pt, 13);
Map.addLayer(before, {min:-30,max:0}, 'Before oil spill');
Map.addLayer(after, {min:-30,max:0}, 'After oil spill');
Map.addLayer(before.addBands(after).addBands(diff), {min:-10,max:10},'composite', 0);
Map.addLayer(after.subtract(before), {min:-10,max:10}, 'After - before', 0);
Map.addLayer(diff_smoothed, {min:-10,max:10}, 'diff smoothed', 0);
Map.addLayer(diff_thresholded.updateMask(diff_thresholded),
  {palette:"0000FF"},'oil spill areas - blue',1);