Exemple #1
0
 def __init__(self, fields: Volume_T, max_dist: Number_T = 0.1):
     # Process data type
     if len(set([i.dtype for i in fields])) > 1:
         raise RadarCalculationError("All input data should have same data type")
     self.dtype = fields[0].dtype
     # Process time
     t_arr = np.array([time.mktime(i.scantime.timetuple()) for i in fields])
     if (t_arr.max() - t_arr.min()) / 60 > 10:
         raise RadarCalculationError(
             "Time difference of input data should not exceed 10 minutes"
         )
     mean_time = t_arr.mean()
     mean_dtime = datetime.datetime(*time.localtime(int(mean_time))[:6])
     time_increment = 10
     time_rest = mean_dtime.minute % time_increment
     if time_rest > time_increment / 2:
         mean_dtime += datetime.timedelta(minutes=(time_increment - time_rest))
     else:
         mean_dtime -= datetime.timedelta(minutes=time_rest)
     self.scan_time = mean_dtime
     self.lon_ravel = np.hstack([i.lon.ravel() for i in fields])
     self.lat_ravel = np.hstack([i.lat.ravel() for i in fields])
     self.data_ravel = np.ma.hstack([i.data.ravel() for i in fields])
     self.dist_ravel = np.hstack(
         [np.broadcast_to(i.dist, i.lon.shape).ravel() for i in fields]
     )
     self.tree = KDTree(np.dstack((self.lon_ravel, self.lat_ravel))[0])
     self.md = max_dist
Exemple #2
0
 def __init__(self, r_list: RList):
     if not is_uniform(r_list):
         raise RadarCalculationError(
             'All input radials must have the same data type')
     self.rl = r_list
     self.el = [i.elev for i in r_list]
     self.x, self.y, self.h, self.r = self._geocoor()
Exemple #3
0
    def get_section(self, start_polar=None, end_polar=None, start_cart=None, end_cart=None,
                    spacing=100):
        r'''
        Get cross-section data from input points

        Parameters
        ----------
        start_polar: list or tuple
            polar coordinates of start point i.e.(distance, azimuth)
        end_polar: list or tuple
            polar coordinates of end point i.e.(distance, azimuth)
        start_cart: list or tuple
            geographic coordinates of start point i.e.(longitude, latitude)
        end_cart: list or tuple
            geographic coordinates of end point i.e.(longitude, latitude)

        Returns
        -------
        sl: cinrad.datastruct._Slice
        '''
        if start_polar and end_polar:
            stlat = self.rl[0].stp['lat']
            stlon = self.rl[0].stp['lon']
            stp = np.round_(get_coordinate(start_polar[0], start_polar[1] * deg2rad, 0, stlon, stlat), 2)
            enp = np.round_(get_coordinate(end_polar[0], end_polar[1] * deg2rad, 0, stlon, stlat), 2)
        elif start_cart and end_cart:
            stp = start_cart
            enp = end_cart
        else:
            raise RadarCalculationError('Invalid input')
        return self._get_section(stp, enp, spacing)
Exemple #4
0
 def __init__(self, fields: Volume_T, max_dist: Number_T = 0.1):
     # Process data type
     self.dtype = get_dtype(fields[0])
     # Process time
     t_arr = np.array(
         [time.mktime(i.scan_time.timetuple()) for i in fields])
     if (t_arr.max() - t_arr.min()) / 60 > 10:
         raise RadarCalculationError(
             "Time difference of input data should not exceed 10 minutes")
     mean_time = t_arr.mean()
     mean_dtime = datetime.datetime(*time.localtime(int(mean_time))[:6])
     time_increment = 10
     time_rest = mean_dtime.minute % time_increment
     if time_rest > time_increment / 2:
         mean_dtime += datetime.timedelta(minutes=(time_increment -
                                                   time_rest))
     else:
         mean_dtime -= datetime.timedelta(minutes=time_rest)
     self.scan_time = mean_dtime
     self.lon_ravel = np.hstack(
         [i["longitude"].values.ravel() for i in fields])
     self.lat_ravel = np.hstack(
         [i["latitude"].values.ravel() for i in fields])
     self.data_ravel = np.ma.hstack(
         [i[self.dtype].values.ravel() for i in fields])
     self.dist_ravel = np.hstack([
         np.broadcast_to(i["distance"], i["longitude"].shape).ravel()
         for i in fields
     ])
     self.tree = KDTree(np.dstack((self.lon_ravel, self.lat_ravel))[0])
     self.md = max_dist
     self.attr = fields[0].attrs.copy()
Exemple #5
0
 def __init__(self, r_list: Volume_T):
     if not is_uniform(r_list):
         raise RadarCalculationError(
             'All input radials must have the same data type')
     el = [i.elev for i in r_list]
     if len(el) != len(set(el)):
         self.rl = list()
         el_list = list()
         for data in r_list:
             if data.elev not in el_list:
                 self.rl.append(data)
                 el_list.append(data.elev)
     else:
         self.rl = r_list
     self.x, self.y, self.h, self.r = self._geocoor()
Exemple #6
0
    def get_section(
        self,
        start_polar: Optional[Tuple[float, float]] = None,
        end_polar: Optional[Tuple[float, float]] = None,
        start_cart: Optional[Tuple[float, float]] = None,
        end_cart: Optional[Tuple[float, float]] = None,
        spacing: int = 500,
    ) -> Slice_:
        r"""
        Get cross-section data from input points

        Parameters
        ----------
        start_polar: list or tuple
            polar coordinates of start point i.e.(distance, azimuth)
        end_polar: list or tuple
            polar coordinates of end point i.e.(distance, azimuth)
        start_cart: list or tuple
            geographic coordinates of start point i.e.(longitude, latitude)
        end_cart: list or tuple
            geographic coordinates of end point i.e.(longitude, latitude)

        Returns
        -------
        sl: cinrad.datastruct.Slice_
        """
        if start_polar and end_polar:
            stlat = self.rl[0].stp["lat"]
            stlon = self.rl[0].stp["lon"]
            stp = np.round_(
                get_coordinate(
                    start_polar[0], start_polar[1] * deg2rad, 0, stlon, stlat
                ),
                2,
            )
            enp = np.round_(
                get_coordinate(end_polar[0], end_polar[1] * deg2rad, 0, stlon, stlat), 2
            )
        elif start_cart and end_cart:
            stp = start_cart
            enp = end_cart
        else:
            raise RadarCalculationError("Invalid input")
        return self._get_section(stp, enp, spacing)
Exemple #7
0
    def get_section(
        self,
        start_polar: Optional[Tuple[float, float]] = None,
        end_polar: Optional[Tuple[float, float]] = None,
        start_cart: Optional[Tuple[float, float]] = None,
        end_cart: Optional[Tuple[float, float]] = None,
        spacing: int = 500,
    ) -> Dataset:
        r"""
        Get cross-section data from input points

        Args:
            start_polar (tuple): polar coordinates of start point i.e.(distance, azimuth)

            end_polar (tuple): polar coordinates of end point i.e.(distance, azimuth)

            start_cart (tuple): geographic coordinates of start point i.e.(longitude, latitude)

            end_cart (tuple): geographic coordinates of end point i.e.(longitude, latitude)

        Returns:
            xarray.Dataset: Cross-section data
        """
        if start_polar and end_polar:
            stlat = self.rl[0].stp["lat"]
            stlon = self.rl[0].stp["lon"]
            stp = np.round_(
                get_coordinate(start_polar[0], start_polar[1] * deg2rad, 0,
                               stlon, stlat),
                2,
            )
            enp = np.round_(
                get_coordinate(end_polar[0], end_polar[1] * deg2rad, 0, stlon,
                               stlat), 2)
        elif start_cart and end_cart:
            stp = start_cart
            enp = end_cart
        else:
            raise RadarCalculationError("Invalid input")
        return self._get_section(stp, enp, spacing)
Exemple #8
0
 def _check_time(self):
     d_list = [_nearest_ten_minute(i.scantime) for i in self.data_list]
     d_list_stamp = [time.mktime(i.timetuple()) for i in d_list]
     if np.average(d_list_stamp) != d_list_stamp[0]:
         raise RadarCalculationError(
             'Input radar data have inconsistent time')