Plotting Data netCDF4 dengan Lib Netcdf4 dan matplotlib


Sudah cukup puas bermain-main dengan grib, sekarang beralih ke netcdf. Netcdf adalah format data yang umum digunakan untuk asimilasi data. Menganalisis data citra satelit dengan memanipulasi hasil bacaan tiap pixelnya (looping proses untuk semua pixel pada citranya) kurang lazim dilakukan. Untuk keperluan analisis seperti itu biasanya mengunakan data netcdf. Oleh karena itu kita akan membahas tentang netcdf kali ini.

Software yang umum digunakan untuk membuka data netcdf adalah grads atau ncview. Pada linux (ubuntu) cukup dengan mengetikkan

 ~$ sudo apt install grads  
 ~$ sudo apt install nview  

gradspun dan ncview pun langsung terinstall dan siap digunakan. Pada windows biasanya memakai opengrads.

Tapi pada artikel ini kita akan memakai python untuk keperluan plotting datanya. Kenapa memilih python daripada grads? Well, python adalah bahasa pemrograman untuk general purpose, jadi koding untuk ploting data netcdf ini bisa dikembangkan lebih luas dan canggih lagi dengan kemungkinan tanpa batas hanya dengan 1 bahasa pemrograman. Saya tidak mau bicara terlalu banyak dan membandingkannya dengan grads karena pengetahuan grads saya sendiri juga masih kurang.

Sebelum kita mengolah data yang ada di netcdf, sebaiknya kita kenali dulu struktur data netcdfnya. Jadi dalam penyimpanannya, netcdf mempunya dimensi. Dimensi-dimensi ini biasanya adalah waktu (time), lintang (latitude), dan bujur (longitude), jadinya ini berbentuk matriks.



Kita bisa mengecek dimensi dan banyaknya grid pada dimensinya serta variabel-variabel yang terkandung pada data netcdf dengan terminal python. Contoh untuk mengcek dimensinya kita gunakan pertintah seperti ini.

 ~$ python  
 Python 2.7.12 (default, Nov 19 2016, 06:48:10)   
 [GCC 5.4.0 20160609] on linux2  
 Type "help", "copyright", "credits" or "license" for more information.  
 >>> from netCDF4 import Dataset  
 >>> import numpy as np  
 >>> dset = Dataset('tes1.nc', mode = 'r')  
 >>> dset.variables.keys()  
 [u'latitude', u'longitude', u'time', u'WV']  

Disitu pertama kita import dulu file netcdfnya dengan command dataset (karena kita hanya ingin membacanya, kita pakai mode = 'r') dan ternyada ada 3 dimensi pada file netcdf ini, yaitu: latitude, longitude, dan time. Untuk mengetahui data tentang netcdfnya secara lebih lengkap, caranya bahkan lebih mudah daripada ini, yaitu

 >>> dset  
 <type 'netCDF4._netCDF4.Dataset'>  
 root group (NETCDF4 data model, file format HDF5):  
   title: WV Indonesia 2017030715 UTC  
   institution: Badan Meteorologi Klimatologi dan Geofisika  
   dimensions(sizes): latitude(2000), longitude(3000), time(1)  
   variables(dimensions): float32 latitude(latitude), float32 longitude(longitude), float64 time(time), float32 WV(time,latitude,longitude)  
   groups:   

Dari situ kita dapat informasi tambahan bahwa data netcdf ini berasal dari BMKG dan informasi tentang banyaknya grid pada dimensi-dimensi data ini (lintang ada 2000 grid, longitude ada 3000 grid, dan time ada 1 grid).

Dengan informasi ini, mari kita plotting datanya. Script untuk plotingan data bisa di download disini.

Bagian-bagian penting dari script itu yang perlu dicatat adalah kita menggunakan function Basemap() untuk mendeklarasikan jenis peta dan daerah mana saja yang ingin ditampilkan pada outputnya nanti. Lalu kita memplotting data netcdfnya ke peta dengan function pcolormesh(). Pada function ini, jika ingin memberikan argumen lintang dan bujur pada functionnya maka harus memasukkan argumen latlon = True agar function() ini menerima argumen matriks lintang dan bujur sebagai inputnya, jika tidak maka pcolormesh() mengharapkan matriks koordinat sebagai inputnya. Lalu di akhiri dengan function show() untuk menampilkan plottingan dan peta yang sudah kita set.


Bagaimana jika kita hanya ingin menampilkan, misal peta sulawesi saja atau kalimantan saja? Mudah, hanya dengan mengatur parameter yang ada di function Basemap() saja. Kita harus tahu terlebih dahulu letak astronomis wilayah yang ingin kita tampilkan itu. Misal kita ingin menampilkan wilayah sulawesi saja yang letak astronomisnya kira-kira (dengan bantuan google maps) -5.8- 1.92o derajat lintang dan 117.9o - 125.45o derajat bujur. Maka function Basemap() menjadi

 m = Basemap(resolution='l', projection='merc', \  
 llcrnrlon=117.9, llcrnrlat=-5.8, urcrnrlon=125.45, urcrnrlat=1.92) #for mercator  

Dan tampilannya jadi seperti ini


Yah, dan sekian sharing kali ini. Untuk interpretasinya tidak dibahas karena saya belum begitu paham OOT untuk kali ini. Kenapa tiba-tiba ngutak ngatik netcdf? Karena saya sedang dalam pengerjaan suatu eksperimen kecil-kecilan seperti biasa yang melibatkan netcdf ini. Sekian.

referensi
http://basemaptutorial.readthedocs.io/en/latest/plotting_data.html, diakses pada 10 Maret 2017
http://www.hydro.washington.edu/~jhamman/hydro-logic/blog/2013/10/12/plot-netcdf-data/, diakses pada 10 Maret 2017

Komentar