Extract Data grb2/grib2 Menggunakan wgrib2 dan Sedikit Shell Scripting


Di postingan-postingan sebelumnya pada pembahasan modelling, kita butuh data dummy untuk bahan simulasi. Ada website menarik untuk men generate data dummy yang diperlukan untuk mengetes aplikasi atau yang lain yaitu mockaroo.com.

Ok, setelah menyentuh tip of iceberg dari modelling yang sudah kita bahas pada postingan-postingan sebelumnya, pastinya kita sudah punya beberapa gambaran tentang modelling ini di kepala kita masing-masing. For the sake of learning, mari kita mulai beralih ke data asli. Mengingat motivasi awal kita dalam pembelajaran modelling ini, maka data asli yang akan kita cari adalah data meteorologi. (ps: walaupun tadi ada kata-kata for the sake of learning, tapi postingan ini hanya membahas tentang cara mendapat data aslinya saja, tidak ada hubungannya sama sekali dengan modelling)

Dalam Meteorologi, data-data hasil pengamatan, analisis maupun forecast disimpan dalam suatu format data. Format dari penyimpanan data ini ada beragam. Untuk kali ini, kita akan menggunakan data .grb2 (atau .grib2). Untuk membuka format data ini, kita perlu software decodingnya yaitu wgrib2.

Sayang sekali, wgrib2 tidak tersedia di repository apt (atau saya yang tidak dapat repo-nya) jadi kita tidak bisa memainkan mantra andalan kita sudo apt install wgrib2. Penginstalan wgrib2 terpaksa harus manual dengan langkah-langkah berikut (pastikan sudah menginstall gcc dan gfortran di komputer sebelumnya)

 ~$ wget ftp://ftp.cpc.ncep.noaa.gov/wd51we/wgrib2/wgrib2.tgz  
 ~$ tar -xzvf wgrib2.tgz  
 ~$ cd grib2  
 ~/grib2$ export CC=gcc  
 ~/grib2$ export FC=gfortran  
 ~/grib2$ make  

Lalu tambahkan direktori dari wgrib2 ke environment variable PATH kita

 ~/grib2$ nano ~/.bashrc  

dan tambahkan baris kode di bawah ini ke baris paling akhir lalu save.

 export PATH=$PATH:/home/genomexyz/grib2/wgrib2  

Lalu log out dari komputer dan kemudian login lagi untuk mendapatkan efeknya.

Ok persiapan tool selesai, saatnya mendownload data asli yang dibutuhkan yang bisa di download dimana saja seperti di ncdc.noaa.gov. Setelah terdownload, mari kita bermain sedikit dengan data ini. Untuk mengetahui data apa saja yang disimpan dalam data .grb2, yaitu dengan (selama postingan ini filegrbkita.grb2 silahkan ganti dengan nama file .grb2 yang telah kita download masing-masing)

 ~$ wgrib2 filegrbkita.grb2 -v  
 1:0:d=2016011206:UGRD U-Component of Wind [m/s]:planetary boundary layer:3 hour fcst:  
 2:171742:d=2016011206:VGRD V-Component of Wind [m/s]:planetary boundary layer:3 hour fcst:  
 3:342088:d=2016011206:VRATE Ventilation Rate [m^2/s]:planetary boundary layer:3 hour fcst:  
 4:436652:d=2016011206:GUST Wind Speed (Gust) [m/s]:surface:3 hour fcst:  
 5:616003:d=2016011206:HGT Geopotential Height [gpm]:10 mb:3 hour fcst:  
 6:770487:d=2016011206:TMP Temperature [K]:10 mb:3 hour fcst:  
 7:842487:d=2016011206:RH Relative Humidity [%]:10 mb:3 hour fcst:  
 8:866051:d=2016011206:UGRD U-Component of Wind [m/s]:10 mb:3 hour fcst:  
 9:943344:d=2016011206:VGRD V-Component of Wind [m/s]:10 mb:3 hour fcst:  
 10:1018992:d=2016011206:ABSV Absolute Vorticity [1/s]:10 mb:3 hour fcst:  
 11:1136024:d=2016011206:O3MR Ozone Mixing Ratio [kg/kg]:10 mb:3 hour fcst:  
 12:1261317:d=2016011206:HGT Geopotential Height [gpm]:20 mb:3 hour fcst:  
 13:1415094:d=2016011206:TMP Temperature [K]:20 mb:3 hour fcst:  
 14:1486811:d=2016011206:RH Relative Humidity [%]:20 mb:3 hour fcst:  
 15:1530936:d=2016011206:UGRD U-Component of Wind [m/s]:20 mb:3 hour fcst:  
 .  
 .  
 .  

Jenis data yang terdapat dalam file .grb2 bisa sangat banyak sampai mencapai ratusan. Itu karena data-data seperti suhu, kelembapan, angin ada sangat banyak jenisnya. Ok, anggap kita ingin mencari data suhu permukaan dan karena begitu banyak jenis data, kalau mau lihat satu per satu jenis data terlalu merepotkan, maka kita manfaatkanlah the magic of linux terminal berikut

 ~$ wgrib2 filegrbkita.grb2 -v | grep -i 'temperature'  
 6:770487:d=2016011206:TMP Temperature [K]:10 mb:3 hour fcst:  
 13:1415094:d=2016011206:TMP Temperature [K]:20 mb:3 hour fcst:  
 20:2181302:d=2016011206:TMP Temperature [K]:30 mb:3 hour fcst:  
 27:3137737:d=2016011206:TMP Temperature [K]:50 mb:3 hour fcst:  
 34:4138768:d=2016011206:TMP Temperature [K]:70 mb:3 hour fcst:  
 41:5266660:d=2016011206:TMP Temperature [K]:100 mb:3 hour fcst:  
 50:6729975:d=2016011206:TMP Temperature [K]:150 mb:3 hour fcst:  
 59:8348321:d=2016011206:TMP Temperature [K]:200 mb:3 hour fcst:  
 68:9966284:d=2016011206:TMP Temperature [K]:250 mb:3 hour fcst:  
 77:11620813:d=2016011206:TMP Temperature [K]:300 mb:3 hour fcst:  
 86:13384980:d=2016011206:TMP Temperature [K]:350 mb:3 hour fcst:  
 95:15157168:d=2016011206:TMP Temperature [K]:400 mb:3 hour fcst:  
 104:16858647:d=2016011206:TMP Temperature [K]:450 mb:3 hour fcst:  
 112:18250108:d=2016011206:TMP Temperature [K]:500 mb:3 hour fcst:  
 120:19867443:d=2016011206:TMP Temperature [K]:550 mb:3 hour fcst:  
 128:21488745:d=2016011206:TMP Temperature [K]:600 mb:3 hour fcst:  
 136:23139889:d=2016011206:TMP Temperature [K]:650 mb:3 hour fcst:  
 144:24822304:d=2016011206:TMP Temperature [K]:700 mb:3 hour fcst:  
 152:26530895:d=2016011206:TMP Temperature [K]:750 mb:3 hour fcst:  
 160:28268879:d=2016011206:TMP Temperature [K]:800 mb:3 hour fcst:  
 168:30041699:d=2016011206:TMP Temperature [K]:850 mb:3 hour fcst:  
 176:31862563:d=2016011206:TMP Temperature [K]:900 mb:3 hour fcst:  
 184:33761681:d=2016011206:TMP Temperature [K]:925 mb:3 hour fcst:  
 192:35621496:d=2016011206:TMP Temperature [K]:950 mb:3 hour fcst:  
 201:37487562:d=2016011206:TMP Temperature [K]:975 mb:3 hour fcst:  
 208:38977907:d=2016011206:TMP Temperature [K]:1000 mb:3 hour fcst:  
 219:41397299:d=2016011206:TMP Temperature [K]:surface:3 hour fcst:  
 220:41562140:d=2016011206:TSOIL Soil Temperature [K]:0-0.1 m below ground:3 hour fcst:  
 222:41760690:d=2016011206:TSOIL Soil Temperature [K]:0.1-0.4 m below ground:3 hour fcst:  
 224:41991698:d=2016011206:TSOIL Soil Temperature [K]:0.4-1 m below ground:3 hour fcst:  
 226:42222365:d=2016011206:TSOIL Soil Temperature [K]:1-2 m below ground:3 hour fcst:  
 231:42724259:d=2016011206:TMP Temperature [K]:2 m above ground:3 hour fcst:  
 233:43182289:d=2016011206:DPT Dew Point Temperature [K]:2 m above ground:3 hour fcst:  
 235:43666975:d=2016011206:APTMP Apparent Temperature [K]:2 m above ground:3 hour fcst:  
 236:43838637:d=2016011206:TMAX Maximum Temperature [K]:2 m above ground:0-3 hour max fcst:  
 237:44096142:d=2016011206:TMIN Minimum Temperature [K]:2 m above ground:0-3 hour min fcst:  
 279:50880522:d=2016011206:TMP Temperature [K]:low cloud top level:0-3 hour ave fcst:  
 280:51058273:d=2016011206:TMP Temperature [K]:middle cloud top level:0-3 hour ave fcst:  
 281:51188996:d=2016011206:TMP Temperature [K]:high cloud top level:0-3 hour ave fcst:  
 297:54037620:d=2016011206:TMP Temperature [K]:tropopause:3 hour fcst:  
 306:56186391:d=2016011206:TMP Temperature [K]:max wind:3 hour fcst:  
 307:56385787:d=2016011206:TMP Temperature [K]:80 m above ground:3 hour fcst:  
 312:57501074:d=2016011206:TMP Temperature [K]:100 m above ground:3 hour fcst:  
 315:58165733:d=2016011206:TMP Temperature [K]:1829 m above mean sea level:3 hour fcst:  
 318:58873483:d=2016011206:TMP Temperature [K]:2743 m above mean sea level:3 hour fcst:  
 321:59577005:d=2016011206:TMP Temperature [K]:3658 m above mean sea level:3 hour fcst:  
 328:61042977:d=2016011206:TMP Temperature [K]:30-0 mb above ground:3 hour fcst:  
 341:63430015:d=2016011206:TMP Temperature [K]:0.995 sigma level:3 hour fcst:  
 342:63669864:d=2016011206:POT Potential Temperature [K]:0.995 sigma level:3 hour fcst:  
 355:65793662:d=2016011206:TMP Temperature [K]:PV=2e-06 (Km^2/kg/s) surface:3 hour fcst:  
 361:66722232:d=2016011206:TMP Temperature [K]:PV=-2e-06 (Km^2/kg/s) surface:3 hour fcst:  

Bisa dilihat, walaupun sudah di filter tapi tetap saja masih banyak output terminal yang terlihat karena begitu beragamnya jenis data yang berasal dari 1 jenis data. Terlihat di nomor 219 ada jenis data yang kita inginkan. Setelah mengetahui "nomor" dari jenis data yang di inginkan, selanjutnya kita extract data tersebut pada lintang dan bujur yang kita inginkan. Contoh kita ingin mencari data suhu permukaan pada 114° bujur timur dan 6° lintang selatan, maka perintahnya

 ~$ wgrib2 filegrbkita.grb2 -d 219 -lon 114 -6  
 219:41397299:lon=114.000000,lat=-6.000000,val=303.4  

Kebanyakan kasus, yang kita inginkan adalah data yang punya selang. Sayangnya setelah saya cari google hasilnya nihil. Rasanya kurang percaya juga kebutuhan yang sangat mendasar seperti ini caranya tidak tersedia, atau mungkin saya yang kurang berusaha sewaktu searching itu. Oleh karena itu, kali ini kita akan buat script otomasi wgrib2 untuk otomasi mengextract data berselang dari file .grb2. Contoh kasus kita ingin data suhu permukaan di wilayah Indonesia seperti gambar di bawah


Terlihat di situ wilayah Indonesia terbentang dari 11° lintang selatan sampai 6° lintang utara dan 95° bujur timur sampai 141° bujur timur.

Akan tetapi sebelum itu mari kita bahas tool yang akan dibuat. Tool yang akan dibuat kali ini memanfaatkan script bash karena wgrib2 sebagai pengextract data sudah tersedia. Fiuh, scriptnya jadi juga (strugglenya asli, hilang spasi dikit langsung error scriptnya -,-) dan bisa di akses di sini. Penasaran cara kerja script ini? Buka saja file scriptnya, di situ sudah tercantum komentar-komentar pendek tentang scriptnya

Pada kasus kali ini, menjalankan scriptnya sebagai berikut

 ~$ ./scriptplot  
 masukkan nama file grib2...  
 filegrbkita.grb2
 masukkan nama variabel yang di inginkan...
 temperature  
 masukkan kode inv grib2 dan nilai lintang bawah atas dan bujur bawah atas berurutan...  
 219 -6 11 95 141  
 progress  
 100%  

Jika kita menjalankan file .grib2 mungkin prosesnya akan cukup lama (beberapa menit), bisa terlihat pada saat angka progress yang cukup lama naiknya. Alasan dibalik fenomena itu saya sendiri belum tahu. Script ini akan menghasilkan file bernama temperature.csv. Kenapa .csv? Karena format ini bisa sinkron dengan software-software pengolah angka seperti Microsoft Excel di windows atau LibreOffice Calc di linux dan akan terlihat cantik disana.

kerenkan? :D

Format dari output data ini yaitu: per row bujurnya sama dam per kolom lintangnya sama (ini sudah usaha terbaikku buat menjelaskannya, bingung rangkai kata-katanya). Ya dengan begitu, hanya berbekal script sederhana yang telah kita buat kita bisa mengextract jenis data apapun yang tersedia di file .grb2, big thanks to bash shell scripting. Mau diapakan data ini bukan bagian pembahasan kali ini. Dijadikan data untuk "initial condtion" modelling seperti pembahasan sebelumnya mungkin ide yang bagus. Sekian.

referensi:
http://www.cpc.ncep.noaa.gov/products/wesley/wgrib2/compile_questions.html
ftp://ftp.cpc.ncep.noaa.gov/wd51we/wgrib2grib1-grib2v3.pptx
http://www.ilmusiana.com/2015/08/letak-astronomis-wilayah-indonesia.html

Komentar