Friday, July 29, 2005

Baca NetCDF dgn Matlab


Banyak data meteorologi dan oseanografi yang disimpan dengan format NetCDF (network Common Data Form, informasi lengkap tentang "apa itu NetCDF" bisa anda baca di sini). Pada artikel kali ini akan dibahas bagaimana caranya membaca file dengan format NetCDF (biasanya dengan extention "nc") dengan menggunakan Matlab. Kenapa Matlab? karena saya terbiasa pakai Matlab, jadi nggak mungkin kan kalau saya nulis artikel tentang "gimana membuka file NetCDF dengan fortran". Lagian artikel ini sebenarnya juga saya terjemahin secara bebas dari sini. Tapi bukan sekedar nerjemahin lho, sebelumnya saya juga sudah mencobanya. OK, tanpa berpanjang lebar, mari kita mulai sekarang pembahasannya.

Syarat untuk bisa mempraktekan tips ini:

  1. Anda sudah meng-install Matlab di PC anda (terserah mau yang bajakan atau yang berlisensi).
  2. Di Matlab yang anda install, toolbox untuk NetCDF juga sudah ter-install. Coba cek dengan mengetikkan: help netcdf, jika keluar uraian tentang bagaimana menggunakan netcdf, itu berarti toolbox netcdf sudah ter-install. Jika keluar netcdf.m not found, apa boleh buat anda terpaksa harus ke sini dulu untuk meng-install-nya.
  3. Anda sudah memiliki library netcdf.dll dan sebuah program kecil bernama ncdump.exe di PC anda. Jika belum anda bisa kunjungi alamat ini dan ambil file netcdf-3.5.win32bin.zip (ini untuk pengguna Windows) dan ekstrak di direktori yang anda sukai. Jangan lupa untuk mengeset path supaya program ncdump bisa dipanggil dari direktori kerja anda (jika ditaruh di direktori yang berbeda). Cara set path yang paling mudah (dari command prompt, misal ncdump ada di c:\programs\netcdf) adalah dengan mengetikkan set path=c:\programs\netcdf.
  4. Anda punya file dengan format NetCDF yang mau dibuka :)
Baiklah, jika syarat sudah terpenuhi semuanya, mari kita mulai pembahasan kita di sini. Misalkan file dengan format NetCDF yang hendak anda buka adalah slp.1994.nc, maka ketikan:

ncdump -h slp.1994.nc

dari command prompt untuk melihat header file tersebut (pada tahap ini anda belum masuk ke Matlab). Header perlu dilihat terlebih dahulu untuk mengetahui spesifikasi dari file yang hendak anda buka. Hasil perintah tersebut akan menghasilkan keluaran sebagai berikut:

netcdf slp.1994 {
dimensions:
lon = 144 ;
lat = 73 ;
time = UNLIMITED ; // (1460 currently)
variables:
float lat(lat) ;
lat:units = "degrees_north" ;
lat:actual_range = 90.f, -90.f ;
lat:long_name = "Latitude" ;
float lon(lon) ;
lon:units = "degrees_east" ;
lon:long_name = "Longitude" ;
lon:actual_range = 0.f, 357.5f ;
double time(time) ;
time:units = "hours since 1-1-1 00:00:0.0" ;
time:long_name = "Time" ;
time:actual_range = 17470320., 17479074. ;
time:delta_t = "0000-00-00 06:00:00" ;
short slp(time, lat, lon) ;
slp:long_name = "4xDaily Sea Level Pressure" ;
slp:valid_range = 87000.f, 115000.f ;
slp:actual_range = 92960.f, 111610.f ;
slp:units = "Pascals" ;
slp:add_offset = 119765.f ;
slp:scale_factor = 1.f ;
slp:missing_value = 32766s ;
slp:precision = 0s ;
slp:least_significant_digit = -1s ;
slp:GRIB_id = 2s ;
slp:GRIB_name = "PRMSL" ;
slp:var_desc = "Sea Level Pressure\n",
"P" ;
slp:dataset = "NMC Reanalysis\n",
"L" ;
slp:level_desc = "Sea Level\n",
"I" ;
slp:statistic = "Individual Obs\n",
"I" ;
slp:parent_stat = "Other\n",
"-" ;

// global attributes:
:Conventions = "COARDS" ;
:title = "4x daily NMC reanalysis (1994)" ;
:base_date = 1994s, 1s, 1s ;
:history = "created 95/02/06 by Hoop (netCDF2.3)" ;
:description = "Data is from NMC initialized reanalysis\n",
"(4x/day). It consists of most variables interpolated to\n",
"pressure surfaces from model (sigma) surfaces." ;
:platform = "Model" ;
}

Secara garis besar saya dapat sampaikan di sini ringkasan dari keluaran di atas yaitu bahwa file slp.1994.nc adalah file yang berisi data slp (Sea Level Pressure) 6 jam-an dengan format matriks (waktu,lintang,bujur), dimana ada 1460 selang waktu, 73 sel arah lintang dan 144 sel arah bujur. Waktu dimulai dari pukul 00:00, lintang dari 90LU s.d. 90LS dan bujur dari 0 s.d. 360. Satuan SLP adalah Pascal, dimana jika ingin mendapatkan harga slp sesungguhnya harus dikalikan dulu dengan scale_factor dan ditambahkan dengan add_offset (slp_terekstrak=(slp*scale_faktor)+add_offset).

Setelah kita mengetahui header-nya, jalankan program Matlab. Dari layar Matlab ketikkan:

nc=netcdf('slp.1994.nc','nowrite');

untuk membuka file NetCDF tersebut di atas.

Misalkan selanjutnya kita akan mengestrak data lintang, bujur dan slp pada waktu ke-1, maka kita dapat mengetikkan perintah berikut:

ygrid=nc{'lat'}(:);
xgrid=nc{'lon'}(:);
slp=nc{'slp',1}(1,:,:);

catatan:
  • argumen 1 pada bagian nc{'slp',1} berarti anda mengekstrak data slp dengan mengalikannya dengan scale_factor dan menambahkan pula add_offset pada hasil ekstrak anda.
  • argumen 1 pada (1,:,:) berarti anda mengekstrak data slp hanya pada waktu ke-1 di semua sel. Jika anda ingin mengekstrak data selama 1 hari, anda dapat memberikan argumen (1:4,:,:). Atau jika anda ingin mengekstrak semuanya gunakan argumen (:,:,:).
OK deh ya... selamat mencoba, semoga lancar. Kalau ada apa-apa, tinggalkan saja pesan di bagian pesan pada blog ini. Pesan di rumah makan Padang: "jika anda puas, beri tahu teman, jika anda tidak puas, beritahu kami".

4 Comments:

Blogger oseanografi said...

argumen 1 pada bagian nc{’slp’,1} ternyata sudah tidak berfungsi lagi di netcdf toolbox versi baru...

2:21 AM  
Blogger denny said...

perintah ncdump -h slp.1994.nc ini adalah perintah pada UNIX (bukan pada MATLAB). Matlab menggunakan nc_dump(nama file).

Ada hal yang ingin saya tanyakan saat membuka file dengan perintah dibawah ini terjadi error, ada saran untuk ini?
nc=netcdf('slp.1994.nc','nowrite');
??? Reference to non-existent field 'itsNCid'.

Error in ==> netcdf.ncid at 21
result = self.itsNCid;

Error in ==> ncitem.name at 35
if ~isempty(self) & ncid(self) >= 0

Error in ==> netcdf.open at 20
[theNCid, status] = ncmex('open', name(self), thePermission);

Error in ==> netcdf.netcdf at 431
result = open(result, thePermission);

terimakasih
denny

5:41 PM  
Blogger putri adia said...

Salam kenal,
Saya mw tanya klo mw konversi dari penanggalan matlab ke real time, sintaknya seperti apa ya mas. Soalny dr data angin tersebut saya tidak mendapatkan informasi real time data tersebut diambil dr tanggal brpa smpai brpa, yg ditampilkan hnya penanggalan versi matlab.


Putri

7:07 PM  
Blogger putri adia said...

Salam kenal,
Saya mw tanya klo mw konversi dari penanggalan matlab ke real time, sintaknya seperti apa ya mas. Soalny dr data angin tersebut saya tidak mendapatkan informasi real time data tersebut diambil dr tanggal brpa smpai brpa, yg ditampilkan hnya penanggalan versi matlab.


Putri

7:07 PM  

Post a Comment

<< Home