예제 #1
0
파일: io.py 프로젝트: zjuas2016/PyCINRAD
 def get_data(self, tilt:int, drange:Number_T, dtype:str) -> Radial:
     if isinstance(dtype, str):
         self.dtype = dtype.upper().encode()
     elif isinstance(dtype, bytes):
         self.dtype = dtype.upper()
     if self.dtype in [b'REF', b'VEL', b'ZDR', b'PHI', b'RHO']:
         if self.dtype in [b'ZDR', b'PHI', b'RHO'] and tilt in [1, 3]:
             tilt -= 1
             warnings.warn('Elevation angle {} does not contain {} data, automatically switch to tilt {}'.format(
                 tilt + 1, self.dtype.decode(), tilt))
         elif self.dtype in [b'VEL', b'SW'] and tilt in [0, 2]:
             tilt += 1
             warnings.warn('Elevation angle {} does not contain {} data, automatically switch to tilt {}'.format(
                 tilt - 1, self.dtype.decode(), tilt))
         hdr = self.f.sweeps[tilt][0][4][self.dtype][0]
         self.reso = hdr.gate_width
         raw = np.array([ray[4][self.dtype][1] for ray in self.f.sweeps[tilt]])
     else:
         raise RadarDecodeError('Unsupported data type {}'.format(self.dtype.decode()))
     cut = raw[:, :int(drange / self.reso)]
     masked = np.ma.array(cut, mask=np.isnan(cut))
     self.tilt = tilt
     self.drange = drange
     self.elev = self.el[tilt]
     x, y, z, d, a = self.projection(self.reso)
     radial = Radial(masked, drange, self.elev, self.reso, self.name, self.name, self.scantime, self.dtype.decode(),
                     self.stationlon, self.stationlat, x, y, a_reso=720)
     radial.add_polarc(d, a)
     return radial
예제 #2
0
파일: io.py 프로젝트: zjuas2016/PyCINRAD
    def get_data(self, tilt:int, drange:Number_T, dtype:str) -> Radial:
        r'''
        Get radar data

        Parameters
        ----------
        tilt: int
            index of elevation angle
        drange: float
            radius of data
        dtype: str
            type of product (REF, VEL, etc.)

        Returns
        -------
        r_obj: cinrad.datastruct.Radial
        '''
        task = getattr(self, 'task_name', None)
        reso = self.Rreso if dtype == 'REF' else self.Vreso
        ret = self.get_raw(tilt, drange, dtype)
        shape = ret[0].shape[1] if isinstance(ret, tuple) else ret.shape[1]
        r_obj = Radial(ret, int(np.round(shape * reso)), self.elev, reso, self.code, self.name, self.scantime, dtype,
                       self.stationlon, self.stationlat, nyquist_velocity=self.nyquist_v[tilt], task=task)
        x, y, z, d, a = self.projection(reso)
        r_obj.add_geoc(x, y, z)
        r_obj.add_polarc(d, a)
        if self.radartype == 'CC':
            r_obj.a_reso = 512
        return r_obj
예제 #3
0
파일: io.py 프로젝트: EnboYang/PyCINRAD
    def get_data(self, tilt, drange, dtype):
        r'''
        Get radar raw data

        Parameters
        ----------
        tilt: int
            index of elevation angle
        drange: float
            radius of data
        dtype: str
            type of product (REF, VEL, etc.)

        Returns
        -------
        r_obj: cinrad.datastruct.Radial
        '''
        rf_flag = False
        self.tilt = tilt
        reso = self.Rreso if dtype == 'REF' else self.Vreso
        dmax = np.round(self.data[tilt][dtype][0].shape[0] * reso)
        if dmax < drange:
            warnings.warn('Requested data range exceed max range in this tilt')
        self.drange = drange
        self.elev = self.el[tilt]
        try:
            data = np.ma.array(self.data[tilt][dtype])
        except KeyError:
            raise RadarDecodeError('Invalid product name')
        length = data.shape[1] * reso
        cut = data.T[:int(np.round(drange / reso))]
        shape_diff = np.round(drange / reso) - cut.shape[0]
        append = np.zeros(
            (int(np.round(shape_diff)), cut.shape[1])) * np.ma.masked
        if dtype == 'VEL':
            try:
                rf = self.data[tilt]['RF']
            except KeyError:
                pass
            else:
                rf_flag = True
                rf = rf.T[:int(np.round(drange / reso))]
                rf = np.ma.vstack([rf, append])
        #r = np.ma.array(cut, mask=np.isnan(cut))
        r = np.ma.vstack([cut, append])
        if rf_flag:
            r.mask = np.logical_or(r.mask, ~rf.mask)
            ret = (r.T, rf.T)
        else:
            ret = r.T
        r_obj = Radial(ret, int(np.round(r.shape[0] * reso)), self.elev, reso,
                       self.code, self.name, self.scantime, dtype,
                       self.stationlon, self.stationlat)
        x, y, z, d, a = self.projection(reso)
        r_obj.add_geoc(x, y, z)
        r_obj.add_polarc(d, a)
        if self.radartype == 'CC':
            r_obj.a_reso = 512
        return r_obj
예제 #4
0
    def get_data(
        self, tilt: int, drange: Number_T, dtype: str
    ) -> Union[Radial, Slice_]:
        r"""
        Get radar data

        Parameters
        ----------
        tilt: int
            index of elevation angle
        drange: float
            radius of data
        dtype: str
            type of product (REF, VEL, etc.)

        Returns
        -------
        r_obj: cinrad.datastruct.Radial
        """
        reso = self.scan_config[tilt].dop_reso / 1000
        ret = self.get_raw(tilt, drange, dtype)
        if self.scan_type == "PPI":
            shape = ret[0].shape[1] if isinstance(ret, tuple) else ret.shape[1]
            r_obj = Radial(
                ret,
                int(shape * reso),
                self.elev,
                reso,
                self.code,
                self.name,
                self.scantime,
                dtype,
                self.stationlon,
                self.stationlat,
                nyquist_velocity=self.scan_config[tilt].nyquist_spd,
                task=self.task_name,
            )
            x, y, z, d, a = self.projection(reso)
            r_obj.add_geoc(x, y, z)
            r_obj.add_polarc(d, a)
            return r_obj
        else:
            # Manual projection
            shape = ret[0].shape[1] if isinstance(ret, tuple) else ret.shape[1]
            dist = np.linspace(reso, self.drange, ret.shape[1])
            d, e = np.meshgrid(dist, self.aux[tilt]["elevation"])
            h = height(d, e, 0)
            rhi = Slice_(
                ret,
                d,
                h,
                self.scantime,
                self.code,
                self.name,
                dtype,
                azimuth=self.aux[tilt]["azimuth"][0],
            )
            return rhi
예제 #5
0
    def get_data(self, tilt, drange, dtype):
        r'''
        Get radar raw data

        Parameters
        ----------
        tilt: int
            index of elevation angle
        drange: float
            radius of data
        dtype: str
            type of product (REF, VEL, etc.)

        Returns
        -------
        r_obj: cinrad.datastruct.Radial
        '''
        self.tilt = tilt
        self.drange = drange
        self.elev = self.el[tilt]
        try:
            raw = np.array(self.data[tilt][dtype])
        except KeyError:
            raise RadarDecodeError('Invalid product name')
        if raw.size == 0:
            warnings.warn('Empty data', RuntimeWarning)
        data = np.ma.array(raw, mask=(raw <= 5))
        reso = self.scan_config[tilt].dop_reso / 1000
        cut = data[:, :int(drange / reso)]
        shape_diff = np.round(drange / reso) - cut.shape[1]
        append = np.zeros((cut.shape[0], int(shape_diff))) * np.ma.masked
        if dtype == 'VEL':
            rf = np.ma.array(cut.data, mask=(cut.data != 1))
            rf = np.ma.hstack([rf, append])
        cut = np.ma.hstack([cut, append])
        scale, offset = self.aux[tilt][dtype]
        r = (cut - offset) / scale
        if dtype == 'VEL':
            ret = (r, rf)
        else:
            ret = r
        r_obj = Radial(ret, int(r.shape[1] * reso), self.elev, reso, self.code,
                       self.name, self.scantime, dtype, self.stationlon,
                       self.stationlat)
        x, y, z, d, a = self.projection(reso)
        r_obj.add_geoc(x, y, z)
        r_obj.add_polarc(d, a)
        return r_obj
예제 #6
0
파일: io.py 프로젝트: EnboYang/PyCINRAD
    def get_data(self, tilt, drange, dtype):
        r'''
        Get radar raw data

        Parameters
        ----------
        tilt: int
            index of elevation angle
        drange: float
            radius of data
        dtype: str
            type of product (REF, VEL, etc.)

        Returns
        -------
        r_obj: cinrad.datastruct.Radial
        '''
        self.tilt = tilt
        self.drange = drange
        self.elev = self.el[tilt]
        try:
            data = np.array(self.data[tilt][dtype])
        except KeyError:
            raise RadarDecodeError('Invalid product name')
        if data.size == 0:
            raise RadarDecodeError(
                'Current elevation does not contain this data.')
        reso = self.scanconfig[tilt]['radial_reso']
        length = data.shape[1] * reso
        cut = data[:, :int(drange / reso)]
        r = np.ma.array(cut, mask=np.isnan(cut))
        r_obj = Radial(r, int(r.shape[0] * reso), self.elev, reso, self.code,
                       self.name, self.scantime, dtype, self.stationlon,
                       self.stationlat)
        x, y, z, d, a = self.projection(reso)
        r_obj.add_geoc(x, y, z)
        r_obj.add_polarc(d, a)
        return r_obj
예제 #7
0
    def get_data(self, tilt: int, drange: number_type, dtype: str) -> Radial:
        r'''
        Get radar raw data

        Parameters
        ----------
        tilt: int
            index of elevation angle
        drange: float
            radius of data
        dtype: str
            type of product (REF, VEL, etc.)

        Returns
        -------
        r_obj: cinrad.datastruct.Radial
        '''
        self.tilt = tilt if self.scan_type == 'PPI' else 0
        self.drange = drange
        if self.scan_type == 'RHI':
            max_range = self.scan_config[0].max_range1 / 1000
            if drange > max_range:
                drange = max_range
        self.elev = self.el[tilt]
        try:
            raw = np.array(self.data[tilt][dtype])
        except KeyError:
            raise RadarDecodeError('Invalid product name')
        if raw.size == 0:
            warnings.warn('Empty data', RuntimeWarning)
        data = np.ma.array(raw, mask=(raw <= 5))
        reso = self.scan_config[tilt].dop_reso / 1000
        cut = data[:, :int(drange / reso)]
        shape_diff = np.round(drange / reso) - cut.shape[1]
        append = np.zeros((cut.shape[0], int(shape_diff))) * np.ma.masked
        if dtype == 'VEL':
            rf = np.ma.array(cut.data, mask=(cut.data != 1))
            rf = np.ma.hstack([rf, append])
        cut = np.ma.hstack([cut, append])
        scale, offset = self.aux[tilt][dtype]
        r = (cut - offset) / scale
        if dtype in ['VEL', 'SW']:
            ret = (r, rf)
        else:
            ret = r
        if self.scan_type == 'PPI':
            r_obj = Radial(ret,
                           int(r.shape[1] * reso),
                           self.elev,
                           reso,
                           self.code,
                           self.name,
                           self.scantime,
                           dtype,
                           self.stationlon,
                           self.stationlat,
                           nyquist_velocity=self.scan_config[tilt].nyquist_spd)
            x, y, z, d, a = self.projection(reso)
            r_obj.add_geoc(x, y, z)
            r_obj.add_polarc(d, a)
            return r_obj
        else:
            # Manual projection
            dist = np.linspace(reso, self.drange, cut.shape[1])
            d, e = np.meshgrid(dist, self.aux[tilt]['elevation'])
            h = height(d, e, 0)
            rhi = Slice_(ret,
                         d,
                         h,
                         self.scantime,
                         self.code,
                         self.name,
                         dtype,
                         azimuth=self.aux[tilt]['azimuth'][0])
            return rhi