From 675eff1be3dc8f13335cfb180e24654dcef40eb2 2022-06-09 01:57:09 From: Juan C. Espinoza Date: 2022-06-09 01:57:09 Subject: [PATCH] Add georef for realtime --- diff --git a/schainpy/model/data/jrodata.py b/schainpy/model/data/jrodata.py index 8202d1a..b7cfb8d 100644 --- a/schainpy/model/data/jrodata.py +++ b/schainpy/model/data/jrodata.py @@ -907,8 +907,8 @@ class PlotterData(object): Object to hold data to be plotted ''' - MAXNUMX = 200 - MAXNUMY = 200 + MAXNUMX = 1000 + MAXNUMY = 1000 def __init__(self, code, exp_code, localtime=True): @@ -993,25 +993,28 @@ class PlotterData(object): self.__heights = [H for tm in self.times] - def jsonify(self, tm, plot_name, plot_type, decimate=False): + def jsonify(self, tm, plot_name, plot_type, key=None, decimate=False): ''' Convert data to json ''' + if key is None: + key = self.key + meta = {} meta['xrange'] = [] dy = int(len(self.yrange)/self.MAXNUMY) + 1 - tmp = self.data[tm][self.key] + tmp = self.data[tm][key] shape = tmp.shape if len(shape) == 2: - data = self.roundFloats(self.data[tm][self.key][::, ::dy].tolist()) + data = self.roundFloats(self.data[tm][key][::, ::dy].tolist()) elif len(shape) == 3: - dx = int(self.data[tm][self.key].shape[1]/self.MAXNUMX) + 1 + dx = int(self.data[tm][key].shape[1]/self.MAXNUMX) + 1 data = self.roundFloats( - self.data[tm][self.key][::, ::dx, ::dy].tolist()) + self.data[tm][key][::, ::dx, ::dy].tolist()) meta['xrange'] = self.roundFloats(self.xrange[2][::dx].tolist()) else: - data = self.roundFloats(self.data[tm][self.key].tolist()) + data = self.roundFloats(self.data[tm][key].tolist()) ret = { 'plot': plot_name, @@ -1022,7 +1025,9 @@ class PlotterData(object): meta['type'] = plot_type meta['interval'] = float(self.interval) meta['localtime'] = self.localtime - meta['yrange'] = self.roundFloats(self.yrange[::dy].tolist()) + #meta['yrange'] = self.roundFloats(self.yrange[::dy].tolist()) + meta['yrange'] = self.roundFloats(self.lat[::dy].tolist()) + meta['xrange'] = self.roundFloats(self.lon[::dy].tolist()) meta.update(self.meta) ret['metadata'] = meta return json.dumps(ret) @@ -1066,4 +1071,4 @@ class PlotterData(object): if isinstance(obj, list): return list(map(PlotterData.roundFloats, obj)) elif isinstance(obj, float): - return round(obj, 2) + return round(obj, 4) diff --git a/schainpy/model/graphics/jroplot_base.py b/schainpy/model/graphics/jroplot_base.py index 16ac4e7..7a0762b 100644 --- a/schainpy/model/graphics/jroplot_base.py +++ b/schainpy/model/graphics/jroplot_base.py @@ -596,9 +596,9 @@ class Plot(Operation): if isinstance(value, (numpy.float32, numpy.float64)): value = round(float(value), 2) self.data.meta[attr] = value - if self.colormap == 'jet': + if self.colormap == 'jet' or self.colormap == 'sophy_w': self.data.meta['colormap'] = 'Jet' - elif 'RdBu' in self.colormap: + elif 'sophy_v' in self.colormap: self.data.meta['colormap'] = 'RdBu' else: self.data.meta['colormap'] = 'Viridis' @@ -611,7 +611,7 @@ class Plot(Operation): tm = self.sender_queue.popleft() except IndexError: break - msg = self.data.jsonify(tm, self.save_code, self.plot_type) + msg = self.data.jsonify(tm, self.save_code, self.plot_type, key='var') self.socket.send_string(msg) socks = dict(self.poll.poll(2000)) if socks.get(self.socket) == zmq.POLLIN: diff --git a/schainpy/model/graphics/jroplot_parameters.py b/schainpy/model/graphics/jroplot_parameters.py index 6bdf1c3..8a57ba7 100644 --- a/schainpy/model/graphics/jroplot_parameters.py +++ b/schainpy/model/graphics/jroplot_parameters.py @@ -6,8 +6,8 @@ from mpl_toolkits.axisartist.grid_finder import FixedLocator, DictFormatter from schainpy.model.graphics.jroplot_base import Plot, plt from schainpy.model.graphics.jroplot_spectra import SpectraPlot, RTIPlot, CoherencePlot, SpectraCutPlot from schainpy.utils import log -# libreria wradlib -#import wradlib as wrl + +import wradlib.georef as georef EARTH_RADIUS = 6.3710e3 @@ -372,7 +372,7 @@ class PolarMapPlot(Plot): class WeatherParamsPlot(Plot): #CODE = 'RHI' #plot_name = 'RHI' - #plot_type = 'rhistyle' + plot_type = 'scattermap' buffering = False def setup(self): @@ -418,10 +418,20 @@ class WeatherParamsPlot(Plot): if 'pow' in self.attr_data[0].lower(): # data['data'] = 10*numpy.log10(getattr(dataOut, self.attr_data[0])/(factor)) - data['data'] = numpy.ma.masked_array(10*numpy.log10(getattr(dataOut, self.attr_data[0])/(factor)), mask=mask) + tmp = numpy.ma.masked_array(10*numpy.log10(getattr(dataOut, self.attr_data[0])/(factor)), mask=mask) else: - data['data'] = numpy.ma.masked_array(getattr(dataOut, self.attr_data[0]), mask=mask) - # data['data'] = getattr(dataOut, self.attr_data[0]) + tmp = numpy.ma.masked_array(getattr(dataOut, self.attr_data[0]), mask=mask) + # tmp = getattr(dataOut, self.attr_data[0]) + + r = dataOut.heightList + delta_height = r[1]-r[0] + valid = numpy.where(r>=0)[0] + data['r'] = numpy.arange(len(valid))*delta_height + + try: + data['data'] = tmp[self.channels[0]][:,valid] + except: + data['data'] = tmp[0][:,valid] if dataOut.mode_op == 'PPI': self.CODE = 'PPI' @@ -430,25 +440,22 @@ class WeatherParamsPlot(Plot): self.CODE = 'RHI' self.title = self.CODE - data['azi'] = dataOut.data_azi - data['ele'] = dataOut.data_ele + data['azi'] = dataOut.data_azi + data['ele'] = dataOut.data_ele data['mode_op'] = dataOut.mode_op - + var = data['data'].flatten() + r = numpy.tile(data['r'], data['data'].shape[0]).reshape(data['data'].shape)*1000 + lla = georef.spherical_to_proj(r, data['azi'], data['ele'], (-75.295893, -12.040436, 3379.2147)) + meta['lat'] = lla[:,:,1].flatten()[var.mask==False] + meta['lon'] = lla[:,:,0].flatten()[var.mask==False] + data['var'] = numpy.array([var[var.mask==False]]) + return data, meta def plot(self): - data = self.data[-1] - r = self.data.yrange - delta_height = r[1]-r[0] - r_mask = numpy.where(r>=0)[0] - r = numpy.arange(len(r_mask))*delta_height - self.y = 2*r - - try: - z = data['data'][self.channels[0]][:,r_mask] - except: - z = data['data'][0][:,r_mask] - + data = self.data[-1] + z = data['data'] + r = data['r'] self.titles = [] self.ymax = self.ymax if self.ymax else numpy.nanmax(r)