Anda di halaman 1dari 4

CARA CONVERT DATA RADAR CUACA BMKG (GEMATRONIK) KE EXTENSION .DAT DAN .

MAT

Pada tutorial ini kami asumsikan anda telah menginstall modul wradlib pada python anda. Untuk
memulai terlebih dahulu kita perlu mengetahui atribut metadata raw data radar mengunakan script
dibawah ini atau dapat merujuk pada portal berikut http://wradlib.org/wradlib-docs/latest/.

from traits.api import HasTraits, Instance


from traitsui.api import View, VGroup, Item, ValueEditor
from wradlib.io import read_Rainbow

def ex_load_rainbow():
filename = '2015011400000600dBZ.vol'
# load rainbow file contents to dict
rbdict = read_Rainbow(filename, loaddata=False)

class DictEditor(HasTraits):
Object = Instance(object)

def __init__(self, obj, **traits):


super(DictEditor, self).__init__(**traits)
self.Object = obj

def trait_view(self, name=None, view_elements=None):


return View(
VGroup(
Item('Object',
label='Debug',
id='debug',
editor=ValueEditor(), # ValueEditor()
style='custom',
dock='horizontal',
show_label=False), ),
title='Dictionary Editor',
width=800,
height=600,
resizable=True)

def dic(my_data):
b = DictEditor(my_data)
b.configure_traits()

dic(rbdict)

# =======================================================
if __name__ == '__main__':
ex_load_rainbow()

JIka script diatas berhasil dijalankan maka informasi metada data radar dapat dilihat berbentuk table of
content.
Informasi meta data radar diperlukan untuk mengisi scripit selanjutnya. Script dibawah ini dapat
membangun data 3 Dimensi dan menghitung CAPPI (Constanta Altitude Plan Position Indicator). Scirpt
ini membangun data dengan range 240 km, lebar pixel 1 km X 1 km X 1 km, dengan ketinggian 10 km,
namun dapat juga membangun data sesukanya tergantung keperluan anda. script ini hasil modifikasi
yang telah disediakan wradlib, untuk lebih jelasnya merujuk pada portal berikut
http://wradlib.org/wradlib-docs/latest/. Script ini juga menconvert format data berextension .vol ke .dat

import wradlib as wrl


import numpy as np
import matplotlib.pyplot as pl
pl.interactive(True)
import datetime as dt
from osgeo import osr
import glob

def ex_load_rainbow(ifile):

raw= wrl.io.read_Rainbow(ifile)
sitecoords = float (raw['volume']['radarinfo']['@lon']),float
(raw['volume']['radarinfo']['@lat']), float
(raw['volume']['radarinfo']['@alt'])
proj = osr.SpatialReference()
proj.ImportFromEPSG(23838)
# containers to hold Cartesian bin coordinates and data
xyz, data = np.array([]).reshape((-1, 3)), np.array([])
# iterate over 14 elevation angles
posangle = [0.5,0.5,1.5,1.5,2.4,3.4,4.3,6.2,10.0,14.0,19.5]
stoprange=
[240.0,400.0,240.0,400.0,240.0,240.0,240.0,120.0,120.0,120.0,120.0]
slice = [0,1,2,3,4,5,6,7,8,9,10]
for i,j,k in zip (posangle,stoprange,slice):
# print 'SLICE :',i
# print 'SLICE :',j
# print 'SLICE :',k
# get the scan metadata for each elevation

data_ori =
raw['volume']['scan']['slice'][k]['slicedata']['rawdata']['data']
datadepth =
float(raw['volume']['scan']['slice'][k]['slicedata']['rawdata']['@depth'])
datamin =
float(raw['volume']['scan']['slice'][k]['slicedata']['rawdata']['@min'])
datamax =
float(raw['volume']['scan']['slice'][k]['slicedata']['rawdata']['@max'])
data_ = datamin + data_ori * (datamax - datamin) / 2**datadepth

azi
=raw['volume']['scan']['slice'][k]['slicedata']['rayinfo']['data']
azidepth
=float(raw['volume']['scan']['slice'][k]['slicedata']['rayinfo']['@depth'])
azirange =
float(raw['volume']['scan']['slice'][k]['slicedata']['rayinfo']['@rays'])

az = (azi * azirange / 2**azidepth)*1.1


rangestep =
float(raw['volume']['scan']['slice'][k]['rangestep'])*1000
r = np.arange(0,j*1000,rangestep)
# derive 3-D Cartesian coordinate tuples
xyz_ = wrl.vpr.volcoords_from_polar(sitecoords,i,az, r, proj)
xyz, data = np.vstack((xyz, xyz_)), np.append(data, data_.ravel())

# generate 3-D Cartesian target grid coordinates


maxrange = 240000.
minelev = 0.5
maxelev = 19.5
maxalt = 10000.
horiz_res = 1000.
vert_res = 1000.
trgxyz, trgshape = wrl.vpr.make_3D_grid(sitecoords, proj,
maxrange,maxalt, horiz_res, vert_res)

# interpolate to Cartesian 3-D volume grid


tstart = dt.datetime.now()
gridder = wrl.vpr.CAPPI(xyz, trgxyz, trgshape, maxrange, minelev,
maxelev)
vol = np.ma.masked_invalid(gridder(data).reshape(trgshape))

g=open(ifile)
namafile = g.name
namafile = namafile.rstrip('.vol')

f=open('%s.dat' %(namafile),'wb')
f.write(vol)
f.close()

# =======================================================
if __name__ == '__main__':

list_data=glob.glob("*.vol")
for ifile in list_data:
try :
print (str(ifile))
ex_load_rainbow(ifile)
except :
print ('index error')
continue
Untuk merubah extension format data .dat ke .mat dan merubah nilai data <=10 menjadi NaN dapat
menggunakan script dibawah ini.

#Mengganti element array


###############################
import glob
import numpy as np
import scipy.io as sio

def changearray(ifile,namafile):
data=np.fromfile(ifile)
for (i, item) in enumerate(data):
if item <=10:
data[i] = float('NaN')

g=open(ifile)
namafile = g.name
namafile = namafile.rstrip('.dat')

sio.savemat('%s.mat' %(namafile),{'data':data})

if __name__ == '__main__':

list_data=glob.glob("*dBZ.dat")
for ifile in list_data:
print (str (ifile))
namafile = str(ifile)
changearray(ifile,namafile)

Untuk menjalankan semua script diatas cukup dengan tempatkan data radar dalam
satu folder dengan script.

Semoga script diatas bermanfaat, Jika ada yang perlu didiskusikan dapat
melalui no WA : 087840261236