def get_neighbour_info(source_geo_def, target_geo_def, radius_of_influence, neighbours=8, epsilon=0, reduce_data=True, nprocs=1, segments=None): """Returns neighbour info Parameters ---------- source_geo_def : object Geometry definition of source target_geo_def : object Geometry definition of target radius_of_influence : float Cut off distance in meters neighbours : int, optional The number of neigbours to consider for each grid point epsilon : float, optional Allowed uncertainty in meters. Increasing uncertainty reduces execution time reduce_data : bool, optional Perform initial coarse reduction of source dataset in order to reduce execution time nprocs : int, optional Number of processor cores to be used segments : int or None Number of segments to use when resampling. If set to None an estimate will be calculated Returns ------- (valid_input_index, valid_output_index, index_array, distance_array) : tuple of numpy arrays Neighbour resampling info """ if source_geo_def.size < neighbours: warnings.warn('Searching for %s neighbours in %s data points' % (neighbours, source_geo_def.size)) if segments is None: cut_off = 3000000 if target_geo_def.size > cut_off: segments = int(target_geo_def.size / cut_off) else: segments = 1 # Find reduced input coordinate set valid_input_index, source_lons, source_lats = _get_valid_input_index( source_geo_def, target_geo_def, reduce_data, radius_of_influence, nprocs=nprocs) # Create kd-tree try: resample_kdtree = _create_resample_kdtree(source_lons, source_lats, valid_input_index, nprocs=nprocs) except EmptyResult: # Handle if all input data is reduced away valid_output_index, index_array, distance_array = \ _create_empty_info(source_geo_def, target_geo_def, neighbours) return (valid_input_index, valid_output_index, index_array, distance_array) if segments > 1: # Iterate through segments for i, target_slice in enumerate( geometry._get_slice(segments, target_geo_def.shape)): # Query on slice of target coordinates next_voi, next_ia, next_da = \ _query_resample_kdtree(resample_kdtree, source_geo_def, target_geo_def, radius_of_influence, target_slice, neighbours=neighbours, epsilon=epsilon, reduce_data=reduce_data, nprocs=nprocs) # Build result iteratively if i == 0: # First iteration valid_output_index = next_voi index_array = next_ia distance_array = next_da else: valid_output_index = np.append(valid_output_index, next_voi) if neighbours > 1: index_array = np.row_stack((index_array, next_ia)) distance_array = np.row_stack((distance_array, next_da)) else: index_array = np.append(index_array, next_ia) distance_array = np.append(distance_array, next_da) else: # Query kd-tree with full target coordinate set full_slice = slice(None) valid_output_index, index_array, distance_array = \ _query_resample_kdtree(resample_kdtree, source_geo_def, target_geo_def, radius_of_influence, full_slice, neighbours=neighbours, epsilon=epsilon, reduce_data=reduce_data, nprocs=nprocs) # Check if number of neighbours is potentially too low if neighbours > 1: if not np.all(np.isinf(distance_array[:, -1])): warnings.warn(('Possible more than %s neighbours ' 'within %s m for some data points') % (neighbours, radius_of_influence)) return valid_input_index, valid_output_index, index_array, distance_array
def get_resampled_image(target_area_def, source_area_def, source_image_data, fill_value=0, nprocs=1, segments=None): """Resamples image using nearest neighbour method in cartesian projection coordinate systems. Parameters ---------- target_area_def : object Target definition as AreaDefinition object source_area_def : object Source definition as AreaDefinition object source_image_data : numpy array Source image data fill_value : {int, None} optional Set undetermined pixels to this value. If fill_value is None a masked array is returned with undetermined pixels masked nprocs : int, optional Number of processor cores to be used segments : {int, None} optional Number of segments to use when resampling. If set to None an estimate will be calculated. Returns ------- image_data : numpy array Resampled image data """ if not isinstance(target_area_def, geometry.AreaDefinition): raise TypeError('target_area_def must be of type AreaDefinition') if not isinstance(source_area_def, geometry.AreaDefinition): raise TypeError('source_area_def must be of type AreaDefinition') if not isinstance(source_image_data, (np.ndarray, np.ma.core.MaskedArray)): raise TypeError('source_image must be of type ndarray' ' or a masked array.') # Calculate number of segments if needed if segments is None: rows = target_area_def.y_size cut_off = 500 if rows > cut_off: segments = int(rows / cut_off) else: segments = 1 if segments > 1: # Iterate through segments for i, target_slice in enumerate( geometry._get_slice(segments, target_area_def.shape)): # Select data from segment with slice lons, lats = target_area_def.get_lonlats(nprocs=nprocs, data_slice=target_slice) # Calculate partial result next_result = get_image_from_lonlats(lons, lats, source_area_def, source_image_data, fill_value, nprocs) # Build result iteratively if i == 0: # First iteration result = next_result else: result = np.row_stack((result, next_result)) return result else: # Get lon lat arrays of target area lons, lats = target_area_def.get_lonlats(nprocs) # Get target image return get_image_from_lonlats(lons, lats, source_area_def, source_image_data, fill_value, nprocs)
def get_resampled_image(target_area_def, source_area_def, source_image_data, fill_value=0, nprocs=1, segments=None): """Resamples image using nearest neighbour method in cartesian projection coordinate systems. Parameters ---------- target_area_def : object Target definition as AreaDefinition object source_area_def : object Source definition as AreaDefinition object source_image_data : numpy array Source image data fill_value : {int, None} optional Set undetermined pixels to this value. If fill_value is None a masked array is returned with undetermined pixels masked nprocs : int, optional Number of processor cores to be used segments : {int, None} optional Number of segments to use when resampling. If set to None an estimate will be calculated. Returns ------- image_data : numpy array Resampled image data """ if not isinstance(target_area_def, geometry.AreaDefinition): raise TypeError('target_area_def must be of type AreaDefinition') if not isinstance(source_area_def, geometry.AreaDefinition): raise TypeError('source_area_def must be of type AreaDefinition') if not isinstance(source_image_data, (np.ndarray, np.ma.core.MaskedArray)): raise TypeError('source_image must be of type ndarray' ' or a masked array.') # Calculate number of segments if needed if segments is None: rows = target_area_def.y_size cut_off = 500 if rows > cut_off: segments = int(rows / cut_off) else: segments = 1 if segments > 1: # Iterate through segments for i, target_slice in enumerate(geometry._get_slice(segments, target_area_def.shape)): # Select data from segment with slice lons, lats = target_area_def.get_lonlats( nprocs=nprocs, data_slice=target_slice) # Calculate partial result next_result = get_image_from_lonlats(lons, lats, source_area_def, source_image_data, fill_value, nprocs) # Build result iteratively if i == 0: # First iteration result = next_result else: if isinstance(next_result, np.ma.core.MaskedArray): stack = np.ma.row_stack else: stack = np.row_stack result = stack((result, next_result)) return result else: # Get lon lat arrays of target area lons, lats = target_area_def.get_lonlats(nprocs) # Get target image return get_image_from_lonlats(lons, lats, source_area_def, source_image_data, fill_value, nprocs)
def get_neighbour_info(source_geo_def, target_geo_def, radius_of_influence, neighbours=8, epsilon=0, reduce_data=True, nprocs=1, segments=None): """Returns neighbour info Parameters ---------- source_geo_def : object Geometry definition of source target_geo_def : object Geometry definition of target radius_of_influence : float Cut off distance in meters neighbours : int, optional The number of neigbours to consider for each grid point epsilon : float, optional Allowed uncertainty in meters. Increasing uncertainty reduces execution time reduce_data : bool, optional Perform initial coarse reduction of source dataset in order to reduce execution time nprocs : int, optional Number of processor cores to be used segments : int or None Number of segments to use when resampling. If set to None an estimate will be calculated Returns ------- (valid_input_index, valid_output_index, index_array, distance_array) : tuple of numpy arrays Neighbour resampling info """ if source_geo_def.size < neighbours: warnings.warn('Searching for %s neighbours in %s data points' % (neighbours, source_geo_def.size)) if segments is None: cut_off = 3000000 if target_geo_def.size > cut_off: segments = int(target_geo_def.size / cut_off) else: segments = 1 # Find reduced input coordinate set valid_input_index, source_lons, source_lats = _get_valid_input_index(source_geo_def, target_geo_def, reduce_data, radius_of_influence, nprocs=nprocs) # Create kd-tree try: resample_kdtree = _create_resample_kdtree(source_lons, source_lats, valid_input_index, nprocs=nprocs) except EmptyResult: # Handle if all input data is reduced away valid_output_index, index_array, distance_array = \ _create_empty_info(source_geo_def, target_geo_def, neighbours) return (valid_input_index, valid_output_index, index_array, distance_array) if segments > 1: # Iterate through segments for i, target_slice in enumerate(geometry._get_slice(segments, target_geo_def.shape)): # Query on slice of target coordinates next_voi, next_ia, next_da = \ _query_resample_kdtree(resample_kdtree, source_geo_def, target_geo_def, radius_of_influence, target_slice, neighbours=neighbours, epsilon=epsilon, reduce_data=reduce_data, nprocs=nprocs) # Build result iteratively if i == 0: # First iteration valid_output_index = next_voi index_array = next_ia distance_array = next_da else: valid_output_index = np.append(valid_output_index, next_voi) if neighbours > 1: index_array = np.row_stack((index_array, next_ia)) distance_array = np.row_stack((distance_array, next_da)) else: index_array = np.append(index_array, next_ia) distance_array = np.append(distance_array, next_da) else: # Query kd-tree with full target coordinate set full_slice = slice(None) valid_output_index, index_array, distance_array = \ _query_resample_kdtree(resample_kdtree, source_geo_def, target_geo_def, radius_of_influence, full_slice, neighbours=neighbours, epsilon=epsilon, reduce_data=reduce_data, nprocs=nprocs) # Check if number of neighbours is potentially too low if neighbours > 1: if not np.all(np.isinf(distance_array[:, -1])): warnings.warn(('Possible more than %s neighbours ' 'within %s m for some data points') % (neighbours, radius_of_influence)) return valid_input_index, valid_output_index, index_array, distance_array