def calc_quick_params(in_area, out_area): """Calculate projection parameters for quick interpolation mode""" ridx, cidx = utils.generate_quick_linesample_arrays(in_area, out_area) cache = {} cache['row_idx'] = ridx cache['col_idx'] = cidx return cache
def test_generate_linesample(self): data = np.fromfunction(lambda y, x: y*x*10**-6, (3712, 3712)) row_indices, col_indices = utils.generate_quick_linesample_arrays(self.msg_area, self.area_def) res = data[row_indices, col_indices] cross_sum = res.sum() expected = 399936.39392500359 self.assertAlmostEqual(cross_sum, expected, msg='Generate linesample failed') self.failIf(row_indices.dtype != np.uint16 or col_indices.dtype != np.uint16, 'Generate linesample failed. Downcast to uint16 expected')
def test_generate_linesample(self): data = np.fromfunction(lambda y, x: y * x * 10 ** -6, (3712, 3712)) row_indices, col_indices = utils.generate_quick_linesample_arrays(self.msg_area, self.area_def) res = data[row_indices, col_indices] cross_sum = res.sum() expected = 399936.39392500359 self.assertAlmostEqual( cross_sum, expected, msg='Generate linesample failed') self.assertFalse(row_indices.dtype != np.uint16 or col_indices.dtype != np.uint16, 'Generate linesample failed. Downcast to uint16 expected')
def pyresample_method(self, ref_grid_lim, grid_lim, data): """ Method which uses the library "pyresample" which is must faster """ # FIXME: Understand how Proj_Dict influences the result X_MAX, Y_MAX = ref_grid_lim x_max, y_max = grid_lim N, M = data.shape proj_dict = { 'a': '6371228.0', 'units': 'm', 'lon_0': '0', 'proj': 'laea', 'lat_0': '-90' } ref_area = geometry.AreaDefinition( area_id='REF', name='reference', proj_id='A', proj_dict=proj_dict, x_size=N, y_size=M, area_extent=[-X_MAX, -Y_MAX, X_MAX, Y_MAX]) init_area = geometry.AreaDefinition( area_id='INIT', name='initial', proj_id='A', proj_dict=proj_dict, x_size=N, y_size=M, area_extent=[-x_max, -y_max, x_max, y_max]) base = image.ImageContainer(data, init_area) row_indices, col_indices = utils.generate_quick_linesample_arrays( init_area, ref_area) result = base.get_array_from_linesample(row_indices, col_indices) return result
def __init__(self, in_area, out_area, in_latlons=None, mode=None, radius=10000, nprocs=1): if (mode is not None and mode not in ["quick", "nearest", "ewa", "bilinear"]): raise ValueError("Projector mode must be one of 'nearest', " "'quick', 'ewa', 'bilinear'") self.area_file = get_area_file() self.in_area = None self.out_area = None self._cache = None self._filename = None self.mode = "quick" self.radius = radius self.conf = ConfigParser.ConfigParser() self.conf.read(os.path.join(CONFIG_PATH, "mpop.cfg")) # TODO: # - Rework so that in_area and out_area can be lonlats. # - Add a recompute flag ? # Setting up the input area try: self.in_area = get_area_def(in_area) in_id = in_area except (utils.AreaNotFound, AttributeError): try: in_id = in_area.area_id self.in_area = in_area except AttributeError: try: # TODO: Note that latlons are in order (lons, lats) self.in_area = geometry.SwathDefinition(lons=in_latlons[0], lats=in_latlons[1]) in_id = in_area except TypeError: raise utils.AreaNotFound("Input area " + str(in_area) + " must be defined in " + self.area_file + ", be an area object" " or longitudes/latitudes must be " "provided.") # Setting up the output area try: self.out_area = get_area_def(out_area) out_id = out_area except (utils.AreaNotFound, AttributeError): try: out_id = out_area.area_id self.out_area = out_area except AttributeError: raise utils.AreaNotFound("Output area " + str(out_area) + " must be defined in " + self.area_file + " or " "be an area object.") # if self.in_area == self.out_area: # return # choosing the right mode if necessary if mode is None: try: dicts = in_area.proj_dict, out_area.proj_dict del dicts self.mode = "quick" except AttributeError: self.mode = "nearest" else: self.mode = mode filename = (in_id + "2" + out_id + "_" + str(_get_area_hash(self.in_area)) + "to" + str(_get_area_hash(self.out_area)) + "_" + self.mode + ".npz") projections_directory = "/var/tmp" try: projections_directory = self.conf.get("projector", "projections_directory") except ConfigParser.NoSectionError: pass self._filename = os.path.join(projections_directory, filename) try: self._cache = {} self._file_cache = np.load(self._filename) except: logger.info("Computing projection from %s to %s...", in_id, out_id) if self.mode == "nearest": valid_index, valid_output_index, index_array, distance_array = \ kd_tree.get_neighbour_info(self.in_area, self.out_area, self.radius, neighbours=1, nprocs=nprocs) del distance_array self._cache = {} self._cache['valid_index'] = valid_index self._cache['valid_output_index'] = valid_output_index self._cache['index_array'] = index_array elif self.mode == "quick": ridx, cidx = \ utils.generate_quick_linesample_arrays(self.in_area, self.out_area) self._cache = {} self._cache['row_idx'] = ridx self._cache['col_idx'] = cidx elif self.mode == "ewa": from pyresample.ewa import ll2cr swath_points_in_grid, cols, rows = ll2cr(self.in_area, self.out_area) self._cache = {} # self._cache['ewa_swath_points_in_grid'] = \ # swath_points_in_grid self._cache['ewa_cols'] = cols self._cache['ewa_rows'] = rows elif self.mode == "bilinear": bilinear_t, bilinear_s, input_idxs, idx_arr = \ get_bil_info(self.in_area, self.out_area, self.radius, neighbours=32, nprocs=nprocs, masked=False) self._cache = {} self._cache['bilinear_s'] = bilinear_s self._cache['bilinear_t'] = bilinear_t self._cache['input_idxs'] = input_idxs self._cache['idx_arr'] = idx_arr
def __init__(self, in_area, out_area, in_latlons=None, mode=None, radius=10000): # TODO: # - Rework so that in_area and out_area can be lonlats. # - Add a recompute flag ? # Setting up the input area try: self.in_area = get_area_def(in_area) in_id = in_area except (utils.AreaNotFound, AttributeError): if isinstance(in_area, geometry.AreaDefinition): self.in_area = in_area in_id = in_area.area_id elif isinstance(in_area, geometry.SwathDefinition): self.in_area = in_area in_id = in_area.area_id elif in_latlons is not None: self.in_area = geometry.SwathDefinition(lons=in_latlons[0], lats=in_latlons[1]) in_id = in_area else: raise utils.AreaNotFound("Input area " + str(in_area) + " must be defined in " + AREA_FILE + ", be an area object" " or longitudes/latitudes must be " "provided.") # Setting up the output area try: self.out_area = get_area_def(out_area) out_id = out_area except (utils.AreaNotFound, AttributeError): if isinstance(out_area, (geometry.AreaDefinition, geometry.SwathDefinition)): self.out_area = out_area out_id = out_area.area_id else: raise utils.AreaNotFound("Output area " + str(out_area) + " must be defined in " + AREA_FILE + " or " "be an area object.") if self.in_area == self.out_area: return # choosing the right mode if necessary if(mode is None): if (isinstance(in_area, geometry.AreaDefinition) and isinstance(out_area, geometry.AreaDefinition)): self.mode = "quick" else: self.mode = "nearest" else: self.mode = mode filename = (in_id + "2" + out_id + "_" + self.mode + ".npz") projections_directory = "/var/tmp" try: projections_directory = CONF.get("projector", "projections_directory") except ConfigParser.NoSectionError: pass self._filename = os.path.join(projections_directory, filename) if(not os.path.exists(self._filename)): LOG.info("Computing projection from %s to %s..." %(in_id, out_id)) if self.mode == "nearest": valid_index, valid_output_index, index_array, distance_array = \ kd_tree.get_neighbour_info(self.in_area, self.out_area, radius, neighbours=1) del distance_array self._cache = {} self._cache['valid_index'] = valid_index self._cache['valid_output_index'] = valid_output_index self._cache['index_array'] = index_array elif self.mode == "quick": ridx, cidx = \ utils.generate_quick_linesample_arrays(self.in_area, self.out_area) self._cache = {} self._cache['row_idx'] = ridx self._cache['col_idx'] = cidx else: raise ValueError("Unrecognised mode " + str(self.mode) + ".") else: self._cache = {} self._file_cache = np.load(self._filename)
def __init__(self, in_area, out_area, in_latlons=None, mode=None, radius=10000, nprocs=1): if (mode is not None and mode not in ["quick", "nearest"]): raise ValueError("Projector mode must be 'nearest' or 'quick'") self.area_file = get_area_file() self.in_area = None self.out_area = None self._cache = None self._filename = None self.mode = "quick" self.radius = radius self.conf = ConfigParser.ConfigParser() self.conf.read(os.path.join(CONFIG_PATH, "mpop.cfg")) # TODO: # - Rework so that in_area and out_area can be lonlats. # - Add a recompute flag ? # Setting up the input area try: self.in_area = get_area_def(in_area) in_id = in_area except (utils.AreaNotFound, AttributeError): try: in_id = in_area.area_id self.in_area = in_area except AttributeError: try: self.in_area = geometry.SwathDefinition(lons=in_latlons[0], lats=in_latlons[1]) in_id = in_area except TypeError: raise utils.AreaNotFound( "Input area " + str(in_area) + " must be defined in " + self.area_file + ", be an area object" " or longitudes/latitudes must be " "provided.") # Setting up the output area try: self.out_area = get_area_def(out_area) out_id = out_area except (utils.AreaNotFound, AttributeError): try: out_id = out_area.area_id self.out_area = out_area except AttributeError: raise utils.AreaNotFound("Output area " + str(out_area) + " must be defined in " + self.area_file + " or " "be an area object.") #if self.in_area == self.out_area: # return # choosing the right mode if necessary if mode is None: try: dicts = in_area.proj_dict, out_area.proj_dict del dicts self.mode = "quick" except AttributeError: self.mode = "nearest" else: self.mode = mode filename = (in_id + "2" + out_id + "_" + str(_get_area_hash(self.in_area)) + "to" + str(_get_area_hash(self.out_area)) + "_" + self.mode + ".npz") projections_directory = "/var/tmp" try: projections_directory = self.conf.get("projector", "projections_directory") except ConfigParser.NoSectionError: pass self._filename = os.path.join(projections_directory, filename) try: self._cache = {} self._file_cache = np.load(self._filename) except: logger.info("Computing projection from %s to %s...", in_id, out_id) if self.mode == "nearest": valid_index, valid_output_index, index_array, distance_array = \ kd_tree.get_neighbour_info(self.in_area, self.out_area, self.radius, neighbours=1, nprocs=nprocs) del distance_array self._cache = {} self._cache['valid_index'] = valid_index self._cache['valid_output_index'] = valid_output_index self._cache['index_array'] = index_array elif self.mode == "quick": ridx, cidx = \ utils.generate_quick_linesample_arrays(self.in_area, self.out_area) self._cache = {} self._cache['row_idx'] = ridx self._cache['col_idx'] = cidx