InsightGEE2: Air Pollution

POV: Udara di Jakarta sedang tidak baik-baik saja.

Gerardus David
8 min readSep 9, 2023

Hallo semuanya,

Saat ini, hangat diperbincangkan tentang polusi udara di Jakarta. Apa yang menjadi penyebab utama? apa kalian berfikir tentang asap kendaraan? Tentu saja, beberapa diantara kita mungkin memiliki jawaban yang serupa, bahkan bisa jadi memiliki jawaban yang serupa namun berbeda.

Tulisan ini akan mencari tahu apa yang menjadi penyebab utama polusi udara di Jakarta dan membandingkan polusi udara tahun 2020 (selama masa lockdown) dengan situasi tahun 2023.

Mari kita lihat informasi selanjutnya.

16 Agustus 2023, pukul 12.00 WIB, Jakarta berada dalam tingkat polusi udara tertinggi di dunia mencapai 163 Air Quality Index (AQI), yang masuk dalam kategori tidak sehat. Jakarta menggeser kota-kota lain seperti Doha, Qatar, dan kota-kota lainnya [1].

Badan Meteorologi, Klimatologi, dan Geofisika (BMKG), mengemukakan bahwa sebanyak 60% polusi udara di Jakarta berasal dari sumber bergerak, terutama emisi kendaraan umum berbahan bakar solar. Padahal, menurut Dinas Perhubungan (Dishub) DKI Jakarta, jumlah kendaraan umum berbahan bakar solar hanya 0,21% dari keseluruhan kendaraan yang ada di Jakarta. Jenis kendaraan tersebut terdiri atas bus besar, bus sedang, bus Antar Kota Antar Provinsi (AKAP) dan bus pariwisata. Namun demikian, kendaraan tersebut harus melayani lebih dari 56% total kebutuhan perjalanan di Jakarta sehingga total emisi gas buangnya relatif tinggi dan berkontribusi besar terhadap polusi udara [2].

Lalu bagaimana polusi udara ketika masa lockdown? apa sama seperti saat ini? atau berbeda 🤷‍♂ ️?

Oleh karena itu, tulisan ini akan membandingkan persebaran polusi udara pada tahun 2020 (selama masa lockdown) dengan situasi tahun 2023 menggunakan data citra Sentinel-5P.

Tahap 1: Visualisasi Polusi Udara Tahun 2023

Langkah 1: Membuat Area of Interest (AOI)

Hal pertama yang saya butuhkan adalah membuat batas pengamatan, berfungsi sebagai Area of Interest (AOI) agar hanya menampilkan wilayah Jakarta. Untuk melihat cara mengimport data shapefile, kalian bisa membaca tulisan sebelumnya disini.

Langkah 2: Import Data Sentinel-5P NO2

Disini, saya menggunakan citra Sentinel-5P NO2 untuk mengukur konsentrasi Nitrogen Dioxide (NO2) di atmosfer. NO2 adalah salah satu parameter polusi udara yang umum dihasilkan oleh aktivitas manusia, terutama kendaraan bermotor [3]. Sekarang, mari kita muat data Sentinel-5P.

// Import data Sentinel-5P OFFL NO2
var datano2 = ee.ImageCollection("COPERNICUS/S5P/OFFL/L3_NO2");
function maskClouds(image){
var cf=image.select('cloud_fraction');
var mask=cf.lte(0.3);
return image.updateMask(mask).copyProperties(image);
}

Keterangan :

  • var datano2: yang digunakan untuk mengimpor citra Sentinel-5P NO2.
  • function maskClouds(image): untuk masking awan citra Sentinel-5P NO2.

Langkah 3: Masking clouds data Sentinel-5P NO2

Selanjutnya, saya mendefinisikan fungsi ‘maskClouds untuk menghilangkan objek awan dan menggunakan data densitas NO2.

// Masking clouds data Sentinel-5P NO2
var no2 = datano2
.filterBounds(AOI)
.map(maskClouds)
.select('tropospheric_NO2_column_number_density');

Keterangan :

  • var no2 : nama variabel untuk menyimpan data hasil masking Sentinel-5P NO2.
  • datano2: data Sentinel-5P NO2 yang berisi data NO2.
  • .filterBounds (AOI): untuk menampilkan data Area of Interest (AOI).
  • .map(maskClouds): untuk menghapus data objek awan dari setiap citra.
  • .select('tropospheric_NO2_column_number_density'): sebagai parameter dalam pemantauan kualitas udara.

Langkah 4: Menentukan Tahun dan Median

Script ini melakukan beberapa langkah dalam pengolahan data yaitu menentukan tahun pengamatan, menghitung median dan melakukan pemotongan citra.

// Menghitung median dan memotong data Sentinel-5P NO2 sesuai dengan AOI
var no2Median = no2.filterDate('2023-01-01', '2023-08-30').median();
var no2MedianClipped = no2Median.clipToCollection(AOI);

Keterangan :

  • var no2Median: nama variabel untuk menyimpan nilai median dari data Sentinel-5P NO2 dalam rentang waktu tertentu.
  • .filterDate('2023-01-01', '2023-08-30'): untuk memfilter data hanya pada rentang tanggal antara 1 Januari 2023 hingga 30 Agustus 2023.
  • .median() : untuk menghitung nilai median dari semua citra yang ada dalam rentang tanggal yang telah difilter.
  • var no2MedianClipped : nama variabel yang digunakan untuk menyimpan hasil median.
  • .clipToCollection(AOI) : untuk memotong hasil median sehingga hanya data yang berada dalam batas AOI yang akan disimpan.

Langkah 5: Menampilkan Visualisasi NO2 Tahun 2023

Kita dapat menampilkan visualisasi NO2 tahun 2023 menggunakan metode Map.addLayer().

//Menampilkan visualisasi NO2 2023
var no2Viz = {
min: 0,
max: 0.00015,
palette: ['black', 'blue', 'purple', 'cyan', 'green',
'yellow', 'red']
};
Map.addLayer(no2MedianClipped, no2Viz, 'NO2 2023');

Keterangan :

  • var no2Viz: nama variabel untuk mengaturan visualisasi (pallet) data NO2.
  • min: 0, max: 0.00015: untuk menentukan kisaran nilai data yang akan divisualisasikan.
  • palette: untuk menggambarkan nilai-nilai data. Palet ini berisi berbagai warna yang akan digunakan untuk mewakili berbagai tingkat nilai data NO2, mulai dari rendah (hitam) hingga tinggi (merah).
  • Map.addLayer: perintah untuk menambahkan layer visualisasi data NO2 ke peta.
  • no2MedianClipped: data NO2 yang telah sesuai dengan AOI.
  • no2Viz: pengaturan visualisasi yang akan digunakan untuk data NO2.
  • NO2 2023: label yang akan ditampilkan di peta.
Polusi Udara Tahun 2023

Tahap 2: Visualisasi Polusi Udara Tahun 2020–2023

Langkah 1: Menentukan Tahun dan Median

Sama seperti langkah sebelumnya, tetapi disini saya melakukan pengolahan data untuk menentukan dua tahun yang berbeda. Kemudian menghitung median dan melakukan pemotongan citra.

// Mengambil median NO2 untuk tahun 2020 (Lockdown) dan tahun 2023 (New normal)
var lockDown = no2.filterDate('2020-03-01', '2020-12-30')
.median().clipToCollection(AOI);
var newNormal = no2.filterDate('2022-01-01', '2022-08-30')
.median().clipToCollection(AOI);

Langkah 2: Membuat Widget Peta

Langkah kedua yaitu membuat widget untuk menampilkan dua peta, satu untuk tahun 2020 dan satu untuk tahun 2023.

// Buat widget peta untuk menampung peta tahun 2020 dan peta tahun 2023
var leftMap = ui.Map().centerObject(AOI, 11).setOptions(
'HYBRID');
var rightMap = ui.Map().setOptions('HYBRID');
// Buat widget panel terpisah untuk menampung 2 peta
var sliderPanel = ui.SplitPanel({
firstPanel: leftMap,
secondPanel: rightMap,
orientation: 'horizontal',
wipe: true,
style: {
stretch: 'both'
}
});
var linker = ui.Map.Linker([leftMap, rightMap]);

Keterangan :

  • var leftMap: nama variabel untuk membuat peta pertama yang akan menampilkan data untuk tahun 2020.
  • var rightMap: nama variabel untuk membuat peta kedua yang akan menampilkan data untuk tahun 2023.
  • var sliderPanel: nama variabel untuk membuat widget panel terpisah yang berisi dua peta.
  • var linker: nama variabel untuk menghubungkan kedua peta.

Langkah 3: Membuat Label Keterangan

Selanjutnya saya akan membuat label keterangan untuk memperjelas informasi pada interface peta.

// Membuat label keterangan
function makeMapLab(lab, position) {
var label = ui.Label({
value: lab,
style: {
fontSize: '16px',
color: '#ffffff',
fontWeight: 'bold',
backgroundColor: '337CCF',
padding: '0px'
}
});
var panel = ui.Panel({
widgets: [label],
layout: ui.Panel.Layout.flow('horizontal'),
style: {
position: position,
backgroundColor: '337CCF',
padding: '0px'
}
});
return panel;
}

Keterangan :

  • function makeMapLab(...): untuk membuat label keterangan pada peta.
  • lab: teks yang akan ditampilkan pada label keterangan.
  • position: posisi dimana label keterangan akan ditempatkan pada peta.
  • var label = ui.Label({...}): untuk membuat label dengan menggunakan teks (lab). kemudian mengatur berbagai atribut label seperti ukuran font, warna teks, warna latar belakang.
  • var label = ui.Panel({...}): untuk membuat panel yang akan berisi label keterangan.
  • ui.Panel.Layout.flow('horizontal'): untuk menampilkan panel secara horizontal.

Langkah 4: Menampilkan Perubahan NO2

Langkah terakhir adalah menampilkan perubahan NO2 tahun 2020 dan tahun 2023 menggunakan script dibawah ini

// Buat layer tahun 2020 (lockdown), tambahkan ke bagian kiri, dan tambahkan label
var lockdownLayer = ui.Map.Layer(lockDown, no2Viz);
leftMap.layers().reset([lockdownLayer]);
leftMap.add(makeMapLab('Lock Down 2020', 'top-left'));

// Buat layer tahun 2023 (new normal), tambahkan ke bagian kanan, dan tambahkan label
var newNormallayer = ui.Map.Layer(newNormal, no2Viz);
rightMap.layers().reset([newNormallayer]);
rightMap.add(makeMapLab('New Normal 2023', 'top-right'));

//Menampilkan perubahan peta menggunakan widget
ui.root.widgets().reset([sliderPanel]);

Keterangan :

  • var lockdownLayer: nama variabel untuk menampilkan data NO2 selama masa lockdown tahun 2020.
  • var newNormallayer: nama variabel untuk menampilkan data NO2 selama masa New Normal tahun 2023.
  • ui.root.widgets().reset([sliderPanel]): untuk membandingkan peta tahun 2020 dan 2023 dengan menggeser slider.
Polusi Udara Tahun 2020 dan Tahun 2023

Kesimpulan

Ketika kita membandingkan tingkat polusi udara selama masa lockdown dengan situasi saat ini di Jakarta, kita dapat melihat perbedaan yang signifikan. Pada masa lockdown, banyak aktivitas harian dan transportasi umum berhenti atau berkurang drastis, sehingga mengakibatkan penurunan lalu lintas kendaraan bermotor, termasuk kendaraan umum berbahan bakar solar. Hal ini mengurangi emisi gas buang dari kendaraan tersebut. Namun, saat ini, dengan pemulihan ekonomi dan kembalinya mobilitas penduduk, polusi udara kembali meningkat.

Perbandingan antara jumlah kendaraan umum berbahan bakar solar yang hanya mencakup 0,21% dari total kendaraan di Jakarta dengan kontribusi mereka yang signifikan terhadap polusi udara menunjukkan pentingnya mengurangi emisi dari jenis kendaraan ini. Langkah-langkah untuk mengurangi polusi udara di masa depan perlu mempertimbangkan upaya-upaya untuk mengubah sumber energi dan meningkatkan efisiensi kendaraan umum, serta mendorong penggunaan transportasi berkelanjutan.

Kalian dapat mencoba script dibawah ini atau bisa kunjungi link ini untuk mencoba langsung dalam Code Editor.

/*
Tahap 1: Visualisasi Polusi Udara Tahun 2023
*/
// Import data sentinel-5P NO2
var datano2 = ee.ImageCollection("COPERNICUS/S5P/OFFL/L3_NO2");
function maskClouds(image){
var cf=image.select('cloud_fraction');
var mask=cf.lte(0.3);
return image.updateMask(mask).copyProperties(image);
}

// Masking clouds data Sentinel-5P NO2
var no2 = datano2
.filterBounds(AOI)
.map(maskClouds)
.select('tropospheric_NO2_column_number_density');

// Menentukan range tanggal dan menghitung median
var no2Median = no2.filterDate('2023-01-01', '2023-08-30').median();

// Pemotongan data Sentinel-5P NO2 sesuai dengan AOI
var no2MedianClipped = no2Median.clipToCollection(AOI);

//Menampilkan visualisasi median NO2
var no2Viz = {
min: 0,
max: 0.00015,
palette: ['black', 'blue', 'purple', 'cyan', 'green',
'yellow', 'red']
};
Map.addLayer(no2MedianClipped, no2Viz, 'NO2 2023');

/*
Tahap 2: Visualisasi Polusi Udara Tahun 2020–2023
*/
// Mengambil median NO2 untuk tahun 2020 (Lockdown)
var lockDown = no2.filterDate('2020-03-01', '2020-12-30')
.median().clipToCollection(AOI);

// Mengambil median NO2 untuk tahun 2023 (New normal)
var newNormal = no2.filterDate('2023-01-01', '2023-08-30')
.median().clipToCollection(AOI);

// Buat widget peta untuk menampung peta tahun 2020 dan peta tahun 2023
var leftMap = ui.Map().centerObject(AOI, 11).setOptions(
'HYBRID');
var rightMap = ui.Map().setOptions('HYBRID');

// Buat widget panel terpisah untuk menampung 2 peta
var sliderPanel = ui.SplitPanel({
firstPanel: leftMap,
secondPanel: rightMap,
orientation: 'horizontal',
wipe: true,
style: {
stretch: 'both'
}
});
var linker = ui.Map.Linker([leftMap, rightMap]);

// Membuat penel keterangan tahun pada 2 peta
function makeMapLab(lab, position) {
var label = ui.Label({
value: lab,
style: {
fontSize: '16px',
color: '#ffffff',
fontWeight: 'bold',
backgroundColor: '337CCF',
padding: '0px'
}
});
var panel = ui.Panel({
widgets: [label],
layout: ui.Panel.Layout.flow('horizontal'),
style: {
position: position,
backgroundColor: '337CCF',
padding: '0px'
}
});
return panel;
}

// Buat layer tahun 2020 (lockdown), tambahkan ke bagian kiri, dan tambahkan label
var lockdownLayer = ui.Map.Layer(lockDown, no2Viz);
leftMap.layers().reset([lockdownLayer]);
leftMap.add(makeMapLab('Lock Down 2020', 'top-left'));

// Buat layer tahun 2023 (new normal), tambahkan ke bagian kanan, dan tambahkan label
var newNormallayer = ui.Map.Layer(newNormal, no2Viz);
rightMap.layers().reset([newNormallayer]);
rightMap.add(makeMapLab('New Normal 2023', 'top-right'));

//Menampilkan perubahan peta menggunakan widget
ui.root.widgets().reset([sliderPanel]);

Sampai jumpa lagi ✌

Referensi

[1] Shilvina, W dan Gita A, Cakti1. (31 Agustus 2023). Polusi Udara Jakarta Kembali Tertinggi di Dunia. Dataindonesia.id. Diakses pada tanggal 8 September 2023, melalui https://dataindonesia.id/ragam/detail/polusi-udara-jakarta-kembali-tertinggi-di-dunia-31-agustus-2023.

[2] Laura R, B., Aceng, H., dan Mohammad, Y. 2014. Estimasi Nilai Pajak Kendaraan Solar Terkait Kerugian Pencemaran Udara (Studi Kasus: Metro Mini Di Dki Jakarta). Journal of Agriculture, Resource, and Environmental Economics, No.2, Hal 98–111 (2014).

[3] Ani, M. 2018. Analisis Risiko Kualitas Udara Ambien (No2 Dan So2) Dan Gangguan Pernapasan Pada Masyarakat Di Wilayah Kalianak Surabaya. Jurnal Kesehatan Lingkungan, Vol.10, No.4, (2018).

--

--

Gerardus David
Gerardus David

Written by Gerardus David

Front End Developer | UIUX Designer | Spatial Analyst

No responses yet