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
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()
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)
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()
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()
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)
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)
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')