Source code for geoips.plugins.classes.interpolators.utils.interp_pyresample

# # # This source code is subject to the license referenced at
# # # https://github.com/NRLMMD-GEOIPS.

"""Interpolation methods using pyresample routines."""

import logging

import numpy
from pyresample import kd_tree

LOG = logging.getLogger(__name__)

# interface = None indicates to the GeoIPS interfaces that this is not a valid
# plugin, and this module will not be added to the GeoIPS plugin registry.
# This allows including python modules within the geoips/plugins directory
# that provide helper or utility functions to the geoips plugins, but are
# not full GeoIPS plugins on their own.
interface = None


[docs]def get_data_box_definition(source_name, lons, lats): """Obtain pyresample geometry definitions. For use with pyresample based reprojections Parameters ---------- source_name : str geoips source_name for data type lons : ndarray Numpy array of longitudes, 0 to 360 lats : ndarray Numpy array of latitudes, -90 to 90 """ from geoips.plugins.classes.interpolators.utils.boxdefinitions import ( MaskedCornersSwathDefinition, ) from geoips.plugins.classes.interpolators.utils.boxdefinitions import ( PlanarPolygonDefinition, ) from pyresample.geometry import GridDefinition if source_name == "abi" and lons.ndim > 1: data_box_definition = GridDefinition( lons=numpy.ma.array(lons, subok=False), lats=numpy.ma.array(lats, subok=False), ) if source_name == "ahi": data_box_definition = PlanarPolygonDefinition( lons=numpy.ma.array(lons, subok=False), lats=numpy.ma.array(lats, subok=False), ) else: data_box_definition = MaskedCornersSwathDefinition( lons=numpy.ma.array(lons, subok=False), lats=numpy.ma.array(lats, subok=False), ) return data_box_definition
[docs]def interp_kd_tree( list_of_arrays, area_definition, data_box_definition, radius_of_influence, interp_type="nearest", sigmas=None, neighbours=None, nprocs=None, fill_value=None, ): """Interpolate using pyresample's kd_tree.resample_nearest method. Parameters ---------- list_of_array : list of numpy.ndarray list of arrays to be interpolated area_definition : areadef pyresample area_definition object of current region of interest. data_box_definition : datadef pyresample/geoips data_box_definition specifying region covered by source data. radius_of_influence : float radius of influence for interpolation Other Parameters ---------------- interp_type : str, default='nearest' One of 'nearest' or 'gauss' - kd_tree resampling methods. sigmas : int, default=None Used for interp_type 'gauss' - multiplication factor for sigmas option: * sigmas = [sigmas]*len(list_of_arrays) """ dstacked_arrays = numpy.ma.dstack(list_of_arrays) if interp_type == "nearest": kw_args = {} kw_args["fill_value"] = None kw_args["radius_of_influence"] = radius_of_influence if nprocs is not None: kw_args["nprocs"] = nprocs LOG.info("Using interp_type %s", interp_type) dstacked_arrays = kd_tree.resample_nearest( data_box_definition, dstacked_arrays, area_definition, **kw_args, ) elif interp_type == "gauss": kw_args = {} kw_args["sigmas"] = [4000] * len(list_of_arrays) kw_args["fill_value"] = None kw_args["radius_of_influence"] = radius_of_influence if sigmas is not None: kw_args["sigmas"] = [sigmas] * len(list_of_arrays) if neighbours is not None: kw_args["neighbours"] = neighbours if nprocs is not None: kw_args["nprocs"] = nprocs if fill_value is not None: kw_args["fill_value"] = fill_value LOG.info("Using interp_type %s %s", interp_type, sigmas) dstacked_arrays = kd_tree.resample_gauss( data_box_definition, dstacked_arrays, area_definition, **kw_args ) else: raise TypeError("Unknown interp_type {0}, failing".format(interp_type)) interpolated_arrays = [] # We are explicitly expecting 2d arrays back, so if 3d, break it down. for arrind in range(len(list_of_arrays)): if len(dstacked_arrays.shape) == 3: interpolated_arrays += [dstacked_arrays[:, :, arrind]] else: interpolated_arrays += [dstacked_arrays] return interpolated_arrays