Script Konversi pgm (Dari Kochi University) ke NetCDF


Singkat cerita, saya dan temanku ada project yang cukup melelahkan karena harus mengolah data IR bertahun-tahun yang di ambil dari universitas kochi. Jadi, data pada website tersebut terbagi 2, yaitu data pgm dan koreksinya. Data pgm bisa kita anggap sebagai matriks 2 dimensi yang range nilainya 0 - 255. Sementara itu data koreksi memberikan nilai suhu IR dari range nilai data pgm pasangannya sehingga didapatkanlah data matriks suhu IR 2 dimensi.

Jadi pada saat itu kami memerlukan data ini dalam bentuk format netcdf, sehingga memerlukan suatu jalan pendek (baca: script) untuk menyelesaikan urusan ini.

Tak perlu berlama-lama lagi berikut script yang kami gunakan untuk konversi tersebut

#!/usr/bin/python
import numpy as np
from netCDF4 import Dataset
import os
import errno
import gdal
import re
#setting
direktori = '/home/genomexyz/teswget'
resol = 0.05
startlon = 70.
endlon = 160.
startlat = -20.
endlat = 70.
#spasial, start from bottom left!!!
lat = np.arange(startlat+resol,endlat+resol/2,resol)
lon = np.arange(startlon+resol,endlon+resol/2,resol)
diriter = sorted(os.listdir(direktori))
#iter file
for i in xrange(0, len(diriter), 2):
corfile = diriter[i]
pgmfile = diriter[i+1]
print corfile, pgmfile
#read pgm
ds = gdal.Open(pgmfile)
irdat = np.array(ds.GetRasterBand(1).ReadAsArray())
#matrix of correction table
idx = 0
cortable = np.zeros(256)
with open(corfile,'r') as fid: #read calibrate data
for line in fid:
if line:
if not line.find('IR1 Temperature of'):
val = re.findall("\d+\.\d+", line) #get val according to format
cortable[idx] = val[0]
idx += 1
#flip matrix
irdat = np.flipud(irdat)
#create matrix of IR map
IR = np.zeros((len(irdat), len(irdat[0])))
for i in xrange(len(lat)):
for j in xrange(len(lon)):
IR[i,j] = cortable[irdat[i,j]]
###############
#create netcdf#
###############
dset = Dataset(pgmfile+'.nc', 'w', format = 'NETCDF4_CLASSIC')
#create dimension
latdim = dset.createDimension('lat', len(lat))
londim = dset.createDimension('lon', len(lon))
#create variable
latvar = dset.createVariable('latitude', np.float32, ('lat',))
lonvar = dset.createVariable('longitude', np.float32, ('lon',))
irvar = dset.createVariable('IR', np.float32, ('lat','lon',))
#fill variable
latvar[:] = lat
lonvar[:] = lon
irvar[:] = IR
#delete old file
# os.remove(corfile)
# os.remove(pgmfile)
print irvar[:]
print np.sum(irvar[:])
view raw pgm2nc.py hosted with ❤ by GitHub
Jika tidak kelihatan, bisa klik di sini untuk mendownload script tersebut.

Library eksternal yang dibutuhkan untuk menjalankan script ini adalah
- gdal
- numpy

Yang perlu diperhatikan dalam penggunaan script ini adalah:
1. Taruh script ini sesuai dengan alamat yang ditunjukkan pada variabel 'direktori' pada script ini (silahkan ubah variabel 'direktori' sesuai dengan direktori yang berisi seluruh file pgm beserta pasangan data koreksinya yang ingin di konversi).
2. Pastikan file pgm dan koreksinya sudah benar pasangannya masing-masing pada direktori tersebut karena script ini tidak mengecek kecocokan nama pgm dan pasangan file koreksinya untuk validasi (merepotkan bikinnya soalnya, kasus kemaren butuh solusi cepat :p ).
3. Pastikan jumlah file pgm + koreksinya + script ini di direktori itu jumlahnya ganjil (file pgm + koreksinya = genap, tambah 1 file script = ganjil).

Sekian.

Komentar