Using Global Forecast System from THREDDS Data Server or Google Earth Engine with Python

Global Forecast System, as the name implies, is a global weather prediction model produced by the National Centers for Environmental Prediction. Among the many variables available to be used, the most common parameters are temperature, wind speed and direction, precipitation, and relative humidity. GFS provides weather forecast up to 384 hours after the model is run. This model is run 4 times a day, at 00 UTC, 06 UTC, 12 UTC, and 18 UTC. It usually takes around 5 hours for the model to complete.

GFS data can be downloaded directly from the FTP / HTTPS server provided by the National Oceanic and Atmospheric Administration, for free, since it’s funded by American taxpayers. However, manually downloading a whole (global) file just to work with a subset of data is not ideal, this is why I would recommend using one of the two options I will be explaining here, Google Earth Engine or THREDDS Data Server.

Google Earth Engine is the easiest to work with, you can either use the JavaScript Code Editor or use the Python API with Jupyter Lab environment to begin development. However, there’s an ingestion delay required to convert the GFS in GRIB-2 format to a raster image in the Google Earth Engine platform, if you need the data as soon as it’s generated, you might want to look somewhere else.

Thematic Real-time Environmental Distributed Data Services (THREDDS) Data Server is a way to distribute environmental data for research use. GFS data in its original GRIB-2 format can also be accessed through this THREDDS Data Server (TDS). The data is usually available in the TDS Catalog within 5 hours of the model generation time. TDS has a NetCDF subset service, that allows us to download a specific area of interest (using a rectangular bounding box), variables of interest, and specify the time range (or single time reference).

Both access can be done with Python, using these modules:

  1. earthengine-api (recommended install: geemap, eemont)
  2. siphon (TDS Catalog API)
  3. xarray (ndarray to work with NetCDF)
  4. netCDF4 (NetCDF backend on Python)

You can use Anaconda to create an environment with all these modules and the Jupyter Lab environment:

$ conda create -n geo python=3.9
$ conda activate geo
$ conda install -c conda-forge geemap eemont siphon xarray[complete] netCDF4

Once you’re done, you can use my Notebook example on my GitHub to begin how to access the Global Forecast System on Google Earth Engine:

Computing Weather Data with Python: NetCDF4 and Xarray

When I’m building a system that’s able to compute the daily Canadian Forest Fire Weather Indices, I began with the Google Earth Engine platform. It is capable of doing raster computation at a scale by harnessing the capabilities of the Google Cloud computing platform. Global datasets are updated daily on the Google Earth Engine platform.

In many cases, you can also download the files directly from the data source providers, like ECMWF with their ERA5 product or the GloH2O with their MSWX and MSWEP products. MSWX and MSWEP near real-time data is provided for free (time delay < 1 day) and ERA5T products can be accessible with a lag of 5 days. MSWX and MSWEP can be accessed through Google Drive link, while ERA5T data can be accessed through the Climate Data Store (CDS) API.

To prepare a development environment, I am using Python 3.9 that is provided by an Anaconda environment. I am using Miniconda as a Package Manager / Environment Manager.

$ conda create -n fwi-xarray python=3.9
$ conda activate fwi-xarray
$ conda install -c conda-forge jupyterlab numpy xarray[complete] netcdf4

Once I have my environment, I began writing code for Fine Fuel Moisture Code. I created a FineFuelMoistureCode class to help calculate the FFMC.

import xarray as xr
import numpy as np

class FineFuelMoistureCode:
    Fine Fuel Moisture Code Calculation based on the
    Canadian Forest Fire Weather Index System using xarray
    def __init__(self, temp, rhum, wind, rain, ffmc_prev):
        self.temp = temp
        self.rhum = rhum
        self.wind = wind
        self.rain = rain

        if type(ffmc_prev) == float or type(ffmc_prev) == int:
            self.ffmc_prev = rain.where(rain == ffmc_prev, \
                other = ffmc_prev)
            self.ffmc_prev = ffmc_prev

    def compute(self):
        Computes the FFMC through Raining Phase 
        and Drying Phase
        ffmc : xarray.DataArray
            today's FFMC
        return self.ffmc
    def __moisture_content(self, ffmc):
        return 147.2 * (101.0 - ffmc) / (59.5 + ffmc)

    def __moisture_code(self, moisture):
        return 59.5 * (250.0 - moisture) / (147.2 + moisture)

    def __rain_normal(self, r_f, m_o):
        delta_m = (42.5 * np.exp(-100.0 / (251.0 - m_o)) * \
            (1 - np.exp(-6.93 / r_f))) * r_f
        return m_o + delta_m

    def __rain_compensation(self, r_f, m_o):    
        mr = self.__rain_normal(r_f, m_o)
        corrective = 0.0015 * (m_o - 150.0) ** 2 * r_f **0.5
        return mr + corrective

    def __no_rain(self, rain, m_o):
        return m_o + 0.0 * rain

    def raining_phase(self):
        Moisture change due to rain from past 24 hours
        # Moisture content before rain
        m_o = xr.apply_ufunc(self.__moisture_content, self.ffmc_prev)

        # Calculate effective rain due to canopy
        no_rain = self.rain.where(self.rain <= 0.5)
        effective_rain = xr.apply_ufunc(lambda x: x - 0.5, \
            self.rain.where(self.rain > 0.5))

        # Use corrective equation for high moisture content
        compensation = m_o.where(m_o > 150.0)
        normal = m_o.where(m_o <= 150.0)

        mo_rc = xr.apply_ufunc(self.__rain_compensation, \
            effective_rain, compensation)
        mo_r = xr.apply_ufunc(self.__rain_normal, \
            effective_rain, normal)
        mo = xr.apply_ufunc(self.__no_rain, no_rain, m_o) = mo_r.fillna(0) + mo_rc.fillna(0) + mo.fillna(0)'moisture_after_rain')

    def __drying(self, mr, E_d, k_d):
        return E_d + (mr - E_d) / 10 ** k_d

    def __wetting(self, mr, E_w, k_w):
        return E_w - (E_w - mr) / 10 ** k_w

    def drying_phase(self):
        Moisture change due to drying phase from noon to afternoon
        # Equilibrium moisture content for drying and wetting phase
        E_d = 0.942 * self.rhum ** 0.679 + \
            11.0 * np.exp((self.rhum - 100.0) / 10) + \
            0.18 * (21.1 - self.temp) * (1 - np.exp(-0.115 * self.rhum))
        E_w = 0.618 * self.rhum ** 0.753 + \
            10.0 * np.exp((self.rhum - 100.0) / 10) + \
            0.18 * (21.1 - self.temp) * (1 - np.exp(-0.115 * self.rhum))
        # Calculate the log drying/wetting rate
        k_1 = 0.424 * (1 - ((100.0 - self.rhum) / 100.0) ** 1.7) + \
            0.0694 * self.wind ** 0.5 * \
            (1 - ((100.0 - self.rhum) / 100.0) ** 8)
        k_0 = 0.424 * (1 - ((100.0 - self.rhum) / 100.0) ** 1.7) + \
            0.0694 * self.wind ** 0.5 * \
            (1 - (self.rhum/100) ** 8)
        k_d = k_0 * 0.581 * np.exp(0.0365 * self.temp)
        k_w = k_1 * 0.581 * np.exp(0.0365 * self.temp)

        # Wetting and drying conditions
        drying = > E_d)
        wetting = < E_w)
        no_change = >= E_w) & ( <= E_d))

        # Moisture content after drying
        m_d = xr.apply_ufunc(self.__drying, drying, E_d, k_d)
        m_w = xr.apply_ufunc(self.__wetting, wetting, E_w, k_w)
        m = m_d.fillna(0) + m_w.fillna(0) + no_change.fillna(0)
        # Calculate Fine Fuel Moisture Code
        self.ffmc = xr.apply_ufunc(self.__moisture_code, m)
        self.ffmc = self.ffmc.rename('fine_fuel_moisture_code')

By separating the raining phase and the drying phase, I was able to create a more readable code, at least for me. I’ll share another snippet from my final code once I have it all cleaned up and fixed. But, when I had finished coding, I found out that there’s already a submodule in xclim to calculate Fire Weather Indices!

# temp, rhum, wind, rain is a DataArray
# for daily weather measurements

ffmc_prev = 85.0
ffmc_calc = FineFuelMoistureCode(temp, rhum, wind, rain, ffmc_prev)
ffmc = ffmc_calc.compute()

However, I think that this code is much simpler for equatorial area and may be easier to implement for daily FWI calculation.

Open Weather Model Datasets

While building a Fire Weather Index calculation system as an input for the Indonesian Fire Danger Rating System (Ina-FDRS), I’ve been searching for an open dataset that can be used to calculate the daily fire weather indices. The previous version of the Ina-FDRS uses the ERA5 real-time dataset from the ECMWF. This real-time dataset is not free, however the ERA5T with a 5 days delay is available for free through the Climate Data Store (CDS) API. Some of the dataset in the ERA5 family is also available on Google Earth Engine.

Since ERA5 requires a license to obtain real-time data, the next step is to find another dataset. NOAA’s Global Forecast System is freely available, since it’s funded by US tax dollars. This dataset can also be accessed freely on Google Earth Engine and updated daily in the platform. The current Fire Weather Index calculator that I developed is using GFS data as an input alongside the rain data from GSMaP.

While browsing in a forum, I found a new dataset, Multi-Source Weather (MSWX), this model is an operational, high resolution (3-hourly 0.1 degree) with a global coverage from 1979 to 7 months from now. MSWX is divided into four sub-products which are:

  1. Historical record (MSWX – Past)
  2. Near real-time extension (MSWX – NRT)
  3. Medium-range forecast ensemble (MSWX – Mid)
  4. Seasonal forecast (MSWX – Long)

GloH2O, the organization behind MSWX, also provides a global precipitation product named Multi-Source Weighted-Ensemble Precipitation (MSWEP). This product uses rain gauge, satellite, and reanalysis data to obtain precipitation estimates globally.

Both datasets are released under the Creative Commons Attribution – Non Commercial 4.0 International (CC BY-NC 4.0). They’re free to use for non-commercial purposes, by sending a request form, we will receive a link to a Google Drive folder containing the MSWX.


Data Gempa Bumi dari BMKG

Sebagai salah satu upaya peningkatan transparansi dan akuntabilitas pemerintah dan meningkatkan partisipasi masyarakat, BMKG ikut membuka inisiatif membuka beberapa data. Salah dua data yang sudah disediakan BMKG secara terbuka adalah data prakiraan cuaca dalam waktu 3 harian dan data gempa bumi yang terjadi di seluruh wilayah Indonesia yang dicatat oleh BMKG.

Ada tujuh jenis data melalui API endpoint BMKG, yaitu kejadian gempa terkini (format XML dan JSON), daftar 15 gempa bumi terakhir dengan magnitudo (M > 5.0) (format XML dan JSON), daftar 15 gempa bumi terakhir yang dapat dirasakan oleh masyarakat (format XML dan JSON), dan data shakemap dalam bentuk gambar JPG. Penggunaan API ini dapat dibaca di Data Gempabumi Terbuka BMKG.

Untuk menunjang pengembangan dashboard RECTO Tsunami, saya ingin mengimplementasikan data BMKG ini yang diperbaharui setiap menitnya oleh sistem. Untuk itu dengan bahasa pemrograman Python, saya buat sedikit script yang dapat memanggil data dari JSON API BMKG dan membuatnya dalam bentuk Pandas.DataFrame untuk diolah selanjutnya. Script ini sangat sederhana dan mudah dibuat, namun diharapkan bisa mempermudah akses data BMKG melalui sebuah modul Python sederhana. Instalasi dapat dilakukan dengan:

$ pip install bmkg-data

Setelah sudah berhasil melakukan instalasi, untuk mendapatkan data BMKG dalam bentuk tabel anda bisa menggunakan snippet code di bawah ini:

from bmkg_data import earthquake

# Get the last 15 events of felt earthquake
df_felt = earthquake.get_felt_earthquakes()

# Get the last 15 events of M > 5.0 earthquake
df_significant = earthquake.get_significant_earthquakes()

# Get the latest earthquake event
df_latest = earthquake.get_latest_earthquake()

Selamat mencoba dan menggunakan script sederhana ini.

Jangan Gunakan Aplikasi Oximeter di Android

Gambar 1. Forward WhatsApp tentang Oximeter

Pulse Oximeter adalah alat noninvasif yang mampu mengukur kadar saturasi oksigen dalam darah dan umumnya di pasang di jari. Di tengah pandemi COVID-19, alat ini umum digunakan untuk pemantauan kondisi saturasi oksigen, untuk mencegah terjadinya happy hypoxia, kondisi kekurangan oksigen tanpa gejala. Layaknya beberapa perangkat dan obat-obatan penunjang isolasi mandiri lainnya, pulse oximeter ini menjadi langka ditengah tajamnya kenaikan kasus COVID-19. Untuk itu banyak orang mencari alternatif lain untuk memantau kadar oksigen.

Pengukuran konsentrasi oksigen dalam darah (SpO2) sebenarnya adalah persentase hemoglobin yang mengandung oksigen dibandingkan keseluruhan hemoglobin. Pengukuran noninvasif oleh pulse oximeter memungkinkan karena adanya perbedaan penyerapan panjang gelombang cahaya dari hemoglobin yang mengandung oksigen dan yang tidak. Maka dari itu, umumnya pulse oximeter memiliki pemancar dan penerima cahaya di dua panjang gelombang (umumnya merah dan inframerah).

Aplikasi pulse oximeter yang tersedia di Google Play untuk HP Android, perlu dicurigai. Tanpa adanya sebuah sensor dan pemancar panjang gelombang (merah dan inframerah) ini, secara praktis tidak mungkin dilakukan pengukuran kandungan oksigen dalam darah. Maka dari itu, hindarilah penggunaan aplikasi Pulse Oximeter sebagai pengganti perangkat yang asli.

Saya adalah lulusan teknik elektro yang pernah mengambil kelas Instrumen Biomedik dan pernah bereksperimen mengukur detak jantung dan kadar oksigen darah menggunakan sensor inframerah yang dipasang di ujung jari. Kesimpulan dari artikel singkat ini juga dibahas di referensi yang saya cantumkan (dalam Bahasa Inggris).

Question: Should smartphone apps be used clinically as oximeters? Answer: No. – The Centre for Evidence-Based Medicine (

Aplikasi Geospasial di Awan

Arsitektur cloud native mengalami peningkatan popularitas di bidang IT, menghasilkan berbagai perkembangan perangkat dan praktik terbaik yang dikembangkan oleh perusahaan komputasi awan untuk membuat proses pengembangan yang murni berjalan di atas komputasi awan. Bidang informasi geospasial juga secara perlahan mulai bermigrasi untuk mengikuti tren komputasi awan, memindahkan algoritma yang biasanya terlalu berat untuk dijalankan di sebuah komputer dan melakukan visualisasi di atas aplikasi peta di halaman web. Artikel ini membahas evolusi aplikasi Geospasial di Awan (cloud native geospatial) dengan melihat arsitektur dan praktik terbaik yang muncul belakangan ini.

Sebelum mengeksplorasi lebih lanjut tentang Geospasial di Awan dan memberikan definisinya, ada empat asumsi yang menjadi dasar pengembangan ekosistem Geospasial di Awan:

  1. Semua data yang dibutuhkan oleh user ada di Awan, koleksi data ini jauh lebih besar dari data yang dapat dikumpulkan di sebuah komputer pribadi.
  2. Komputasi yang tidak terbatas untuk mengolah data besar ini tersedia di Awan dan algoritma yang mendasari pemrosesan data tersebut dapat dibagikan secara daring dan diubah-ubah secara kolaboratif.
  3. Sistem antrian dan notifikasi dapat dikembangkan agar data baru dapat diproses secara langsung, memberikan perkembangan terkini dan notifikasi kepada penggunanya.
  4. Data bisa divisualisasikan dengan peta melalui peladen web map tiles yang bisa menunjukkan data sumber maupun data dalam proses ataupun hasil akhir pemrosesan data.

Melalui empat asumsi dasar ini, proses pengolahan data geospasial yang sudah ada bisa berubah dengan adanya kapabilitas komputasi awan dan proses data yang sepenuhnya ada di Awan. Hasil dari asumsi ini adalah berbagai perkembangan teknologi untuk menunjang konsep microservices, bukan hanya dalam perspektif teknologi, namun juga dalam proses dan metodologi. Beberapa hasil evolusinya adalah munculnya paradigma-paradigma baru dalam pengolahan data geospasial.

Jika seluruh data sudah ada di Awan, tidak perlu lagi adanya duplikat data untuk mengolah dan memroses data. Sebelumnya kita perlu mengunduh data geospasial untuk menggunakan perangkat lunak untuk melakukan proses dan membuat visualisasi. Dengan komputasi awan, pemilik data dapat membayar untuk harga penyimpanan data sedangkan pengguna dapat membayar untuk akses data tanpa perlu memikirkan infrastruktur besar yang menjembataninya.

Paradigma yang berubah akibat data di Awan adalah algoritma yang dapat dikirim ke tempat data, dan bukan sebaliknya. Saat data ada di Awan, akan lebih realistis untuk membuat kontainer yang berisi algoritma pemrosesan untuk dijalankan di komputasi awan yang dekat dengan sumber data. Kontainer algoritma ini bisa dalam bentuk kontainer Docker atau sebuah fungsi seperti AWS Lambda / Google Cloud Functions. Komputasi ini dapat menggunakan sistem geospasial awan terkini seperti RasterFoundry atau Google Earth Engine, di mana pengguna dapat mengirimkan sebuah instruksi operasi pengolahan data.

Ketika data dan algoritmanya sudah bisa diimplementasikan dan dibagikan dengan sesama pengguna data, kolaborasi antar peneliti dapat muncul. Pengguna selanjutnya dapat menggunakan algoritma yang tersedia secara terbuka dan menerapkannya terhadap data yang tersedia tanpa perlu mendalami proses di belakang layar. Melalui bantuan layanan web map tiles, data-data ini bisa divisualisasikan pada setiap langkah dalam proses tersebut.

Akhir dari data hasil pengolahan GIS atau penginderaan jauh ini umumnya berupa sebuah peta statis yang seringkali berada di sebuah slide PowerPoint. Tujuan sebuah peta adalah untuk membantu memberikan informasi yang tepat guna, dengan Geospasial di Awan, pengguna yang membutuhkan informasi tertentu dapat berlangganan produk data untuk area yang diminati oleh pengguna tersebut tanpa harus membaca peta statis untuk mencari data yang dibutuhkan.

Realisasi Geospasial di Awan adalah penggunaan format data Cloud Optimized GeoTIFF yang dapat memanfaatkan fitur HTTP yaitu Byte Serving. Byte Serving adalah teknologi yang mendasari konsep streaming musik dan video tanpa harus mengunduh keseluruhan file audio atau video. Format COG mengikuti prinsip yang serupa sehingga pengguna dapat mengakses hanya bagian dari sebuah file raster yang dibutuhkan, sehingga konsep pengolahan data baru dapat dikembangkan.

Konsep utama dari COG relatif sederhana, dengan menaruh data penginderaan dan data penggambaran tersebut di Awan dan dapat diakses sebagai secara streaming. Melalui COG dan penyimpanan di Awan, perangkat lunak dapat dikembangkan untuk mengakses data ini di ekosistem Awan yang sama, sehingga pengolahan data dapat dilakukan tanpa perlu biaya unduh data dan penyimpanan data. Pengguna tidak perlu lagi menghabiskan waktu untuk mencari data, tapi hanya perlu mengakses data terkini yang tersedia dan menghasilkan analisis berdasarkan data tersebut.

Konsep kedua yang membantu sebuah aplikasi Geospasial di Awan adalah katalog aset spatiotemporal (SpatioTemporal Asset Catalog). Penyedia data penginderaan dan penggambaran tidak perlu lagi menyiapkan sistem katalog, namun bisa mengadopsi katalog STAC untuk mengidentifikasi seluruh data yang tersedia.

Konsep ketiga adalah adanya web tiling dinamis, menggunakan COG sebagai data masukan, perantara dan keluaran, sebuah server web map yang mengikuti standar Open Geospatial Consortium seperti WMTS ataupun XYZ tiles dapat digunakan untuk membantu visualisasi data. Layanan yang dapat membaca COG dan menghasilkan web map tile seperti rio-tiler dapat digunakan untuk mengembangkan prinsip visualisasi data ini.

Menggunakan ketiga teknologi ini dan berdasarkan sistem-sistem yang sudah dikembangkan menggunakan konsep Geospasial di Awan, pengguna dapat menghasilkan data peta yang dapat ditambahkan oleh informasi terkini dan bukan peta statis. Akhirnya, data geospasial bisa menjadi bagian dari kehidupan, membantu memperbaiki aplikasi yang sudah ada dan membantu membuat ekosistem interoperabilitas di mana berbagai organisasi dapat mengadopsi teknologi-teknologi ini untuk menyajikan data mereka. Selanjutnya, pengguna dapat fokus dengan hasil analisis yang dapat dibuat melalui data-data terkini yang terbuka untuk umum untuk aplikasi demi kemaslahatan bersama.

Artikel ini merupakan intisari dari seri artikel oleh Chris Holmes: Cloud Native Geospatial – Planet Stories – Medium.

Understanding Myself through Big Five Test

One key turn-around point that I had in my self-development was to understand who I am. I was able to get a depiction of my own personality through the website. is based on the Big Five personality traits, consisting of extraversion, agreeableness, conscientiousness, neuroticism, and openness. Sometimes the acronym OCEAN (openness, conscientiousness, extraversion, agreeableness, and neuroticism) is used.


People who are high in this trait tend to be more adventurous and creative, while those who are low in this trait tend to struggle with abstract thinking.

I find myself ranked higher than the average person in this trait. I believe that I am able to let my mind wander and try to formulate different ideas, seeing a new way to find solutions that others may have missed. This may lead me to be less well adapted to situations that are routinized and predictable.

Openness to experience is made up of the aspects from intellect and openness. I am ranked at the 78th percentile in Intellect, making me enjoy exploring novel ideas, working on issue-oriented discussions, enjoy reading and discuss idea-centered books. I like learning new things and finding new vocabulary to use to generate and explain novel, creative concepts and adapt to new experiences.

I am also typically open, I enjoy an outlet for my creativity, appreciate music and like to sing and make music for myself, but still can live without it.


I am moderately low in conscientiousness, which is a trait that I must admit is hard for me to work on. I am not particularly dutiful, although I am also not a sloth per se. I can work hard when pushed, but sometimes find myself distracted, indecisive, and do not mind procrastinating.

Although, this trait may be responded by other people negatively for my tendency to slack off, I do find myself not judgmental to myself or others. I find myself attributing my success to chance and luck factors instead of my hard work. I’m trying my best to overcome this disadvantages and work my way to be more conscientiousness, through harnessing my sense of purpose to allow me to get my act together while trying to improve myself.

Industriousness one of the aspect of conscientiousness, this trait is also one of my impeding factor, with low industriousness, I was always an underachiever. I put off a lot of responsibilities, that’s why I’m not judgmental of other people, including myself.

I am typical in orderliness, I do enjoy seeing everything in a good order, but I am not overtly oriented toward details, rigidly abiding rules and judgmental towards others. I am not the right person to manage complex, sensitive processes, but when supervised properly I can manage to maintain focus and proper attention.


I am low in Extraversion or high in Introversion, I am less enthusiastic, talkative, and assertive in social situations, socially awkward at times. I find constant social contact very draining and tiring and will always crave time alone to recharge. This trait make me more likely to be depressed and have lower level of self esteems.

I keep everything to myself and will always struggle to persuade, make the sale, or work in huge groups. I am low in enthusiasm, I do not really get excited about a lot of things and do not speak my mind, unless it is of interest to me. I am also very low in assertiveness, I never dominate and control social situations, I put my own opinion with reservation and do not speak my mind. This is a huge handicap for me, when I speak up about issues that I am knowledgeable, competent, and able.


I am typical in agreeableness. I am somewhat cooperative, warm and considerate. I look for the best in others and reasonably interpersonally tolerant. With average level of agreeableness, I am somewhat forgiving, accepting, flexible, gentle, and patient. I sometimes feel pity for those who are excluded, punished, or defeated, but not enough to be easily taken advantage by disagreeable people or those with predatory intent. However, sometimes with high neuroticism, this may make me suffer from resentment or to harbor invisible anger.


I am moderately high in neuroticism. This makes me more sensitive towards negative emotions, such as pain, sadness, irritable, or defensive anger, fear, and anxiety. With everything going wrong in the past, I feel that everything will go wrong now, and also in the future. I am anxious and irritable when thinking of a genuine problem I remember. I am risk-averse and with my very high withdrawal trait (91st percentile), I am more prone to feel sad, lonesome, disappointed, and grief-stricken. I have high levels of doubt, worry continuously, and become embarassed easily, and too self conscious and will be discouraged rapidly in the face of threat and punishment.

Knowing Myself, What Next?

I was discouraged when I first saw my result, I worry if I would ever find myself be in a position that can be useful to myself, my immediate family and society. I began to wonder if I am misusing the talents that I have received from the Almighty. Once I begin to accept myself as who I am, with the positive side and negative side, I was able to formulate a way forward. Self-help books did help in my self development, I think all of this is necessary to maintain a good mental health.

Data Tide Gauge IDSL dari Joint Research Center Uni Eropa

Pada tanggal 22 Desember 2018, 13:56 UTC, terjadi gelombang Tsunami yang disebabkan oleh Gunung Anak Krakatau yang diduga karena letusan gunung berapi tersebut. Saat bencana ini terjadi, sistem peringatan dini tsunami Indonesia (InaTEWS) tidak memiliki mekanisme untuk menjalankan perhitungan prediksi tinggi muka air dari letusan gunung berapi. Untuk memperkuat peringatan dini, pemerintah Indonesia menerapkan sistem peringatan yang mampu memberikan informasi terkini dari perubahan ketinggian muka air laut yang dapat menunjukkan gelombang Tsunami akibat letusan gunung berapi, agar dapat diberikan peringatan dini.

Gambar 1. Sensor Tinggi Muka Air yang terpasang di Pulau Sebesi (IDSL-301)
Sumber: TAD – IDSL-301 (

Joint Research Center Uni Eropa bersama dengan Kementerian Kelautan dan Perikanan (KKP), dan Badan Meteorologi Klimatologi dan Geofisika (BMKG) mengembangkan sistem peringatan baru. Sistem ini mengadopsi instrumen pengukuran Tsunami secara real-time yaitu Inexpensive Device for Sea Level Monitoring (IDSL) yang dikembangkan oleh JRC untuk memberikan data tinggi muka air laut secara 24/7 dan memberikan peringatan kemungkinan terjadinya Tsunami. Perangkat IDSL hibah dari JRC ini dimiliki oleh KKP dan datanya dapat diakses melalui TAD – Home (

Saat mengembangkan RECTO Tsunami, data ini juga dipakai untuk melengkapi data tide gauge (InaTides) yang dimiliki oleh Indonesia yang dikelola oleh Badan Informasi Geospasial (BIG). Salah satu hasil dari pengembangan dashboard Tsunami tersebut adalah library pengambilan data dari TAD Server JRC dalam bahasa pemrograman Python. Instalasi dapat dilakukan dengan pip, seperti berikut ini:

$ pip install idsl-gauge

Informasi lebih lanjut dan contoh Jupyter Notebook penggunaan library dapat dilihat di link GitHub di bawah ini:


  1. JRC Publications Repository – Anak Krakatau volcano emergency tsunami early warning system (

Data Gempa Realtime USGS

ANSS Comprehensive Earthquake Catalog (ComCat) adalah katalog gempa bumi yang menunjukkan sumber gempa dan produk-produk tambahan lainnya dari jaringan seismik USGS.

USGS juga menyediakan GeoJSON Summary Feed yang diperbaharui setiap 1 menit. GeoJSON adalah format untuk struktur data geografis, dapat merepresentasikan sebuah Geometry, Feature, atau FeatureCollection. GeoJSON dibuat berdasarkan standar JSON.

Gambar 1. RECTO Tsunami tsunami-data | Indonesian National Oceanography Data Center (

Saat mengembangkan RECTO Tsunami menggunakan Python, InfluxDB, dan Grafana, saya mengembangkan script sederhana untuk mengunduh data dari USGS. Program ini sekarang sudah saya simpan di PyPI dengan link: Melalui script ini, RECTO Tsunami dapat mengambil data termutakhir dari feed GeoJSON USGS dan menampilkannya ke sebuah dashboard Grafana. Instalasi modul ini dapat dilakukan dengan PIP:

$ pip install usgs-quake

Setelah berhasil instalasi usgs-quake, Anda dapat menggunakan Jupyter Notebook untuk memulai mendapatkan data gempa dalam bentuk pandas.DataFrame seperti contoh di bawah ini.

from usgs_quake import USGSEarthquake
import datetime

# Indonesian boundaries
min_lat = -15
max_lat = 15
min_lon = 90
max_lon = 150

min_mag = 6

# Initializing module with boundaries and minimum magnitude
quakes = USGSEarthquake(min_lat, max_lat, min_lon, max_lon, min_mag)

# Historical Data Query
start = datetime.datetime(1970, 1, 1)
end = datetime.datetime.utcnow()

# Begin querying the ANSS ComCat and get the number of events
count = quakes.get_historical_data(start, end)
df_historical = quakes.get_simplified_dataframe()

# Realtime Data Query
level = 'significant'
period = 'month'

# Query significant earthquakes from the past month
quakes.get_realtime_data(level = level, period = period)
df_realtime = quakes.get_simplified_dataframe()

Semoga artikel singkat ini bermanfaat bagi yang membutuhkan data gempa real-time dari USGS maupun data historis yang tersedia di ComCat.


  1. API Documentation – Earthquake Catalog (
  2. GeoJSON Summary Format (

Kembali ke Normal? Visualisasi Data Sentinel-5P dari Google Earth Engine

European Space Agency (ESA) beberapa kali telah mengeluarkan peta sebaran konsentrasi gas nitrogen dioksida dan mengorelasikannya dengan aktivitas manusia. Melalui karantina ketat, terlihat dari luar angkasa bahwa emisi gas nitrogen dioksida di suatu wilayah turun dengan signifikan. ESA mengeluarkan gambar yang menunjukkan kurangnya polusi udara sekitar Eropa dan China pada tahu 2020. Menurut peneliti dari KNMI (Royal Netherlands Meteorological Institute), data harian konsentrasi nitrogen dioksida dapat berubah-ubah karena dampak cuaca, namun jika dirata-rata dalam periode waktu tertentu, dampak cuaca ini bisa dihilangkan dan kita dapat melihat efek aktivitas manusia terhadap konsentrasi nitrogen.

Nitrogen dioxide concentrations over France
Konsentrasi Nitrogen Dioksida di Prancis

Indonesia sedang mengalami kenaikan kasus COVID-19, dari data Jakarta kita mendapatkan bahwa ada kenaikan yang tajam dari bulan Mei 2021. Data ini dapat diakses di Covid-19 (

Kenaikan Kasus COVID-19 di bulan Mei 2021

Sentinel-5P sebagai satelit terbaik yang dapat memantau konsentrasi nitrogen dioksida berskala global. Kali ini saya coba melakukan visualisasi data bulan Mei 2019, 2020, dan 2021 untuk melihat tren aktivitas manusia berdasarkan data nitrogen dioksida. Terlihat bahwa data nitrogen sudah kembali ke level sebelum pandemi. Aktivitas publik sepertinya sudah kembali ke normal.

Lalu, apa yang bisa dilakukan oleh pemegang kebijakan, apakah membatasi sementara aktivitas dan kembali menerapkan Work From Home bagi industri yang masih sanggup untuk dilakukan dari rumah? Pertanyaan ini mungkin bisa dijawab oleh pemerintah.