Пример #1
0
 def __init__(self,
              source_image: TiledImage,
              image_id: str = None,
              cmap_range: Tuple[float,
                                float] = DEFAULT_COLOR_MAP_VALUE_RANGE,
              cmap_name: str = DEFAULT_COLOR_MAP_NAME,
              num_colors: int = DEFAULT_COLOR_MAP_NUM_COLORS,
              no_data_value: Union[int, float] = None,
              encode: bool = False,
              format: str = None,
              tile_cache: Cache = None,
              trace_perf: bool = False):
     super().__init__(source_image,
                      image_id=image_id,
                      format=format,
                      mode='RGBA',
                      tile_cache=tile_cache,
                      trace_perf=trace_perf)
     self._cmap_range = cmap_range or DEFAULT_COLOR_MAP_VALUE_RANGE
     cmap_name, cmap = get_cmap(cmap_name or DEFAULT_COLOR_MAP_NAME,
                                default_cmap_name=DEFAULT_COLOR_MAP_NAME,
                                num_colors=num_colors
                                or DEFAULT_COLOR_MAP_NUM_COLORS)
     self._cmap_name = cmap_name
     self._cmap = cmap
     self._no_data_value = no_data_value
     self._encode = encode
Пример #2
0
    def get_color_mapping(self, ds_id: str,
                          var_name: str) -> Tuple[str, Tuple[float, float]]:
        cmap_name = None
        cmap_vmin, cmap_vmax = None, None
        color_mappings = self.get_color_mappings(ds_id)
        if color_mappings:
            color_mapping = color_mappings.get(var_name)
            if color_mapping:
                cmap_vmin, cmap_vmax = color_mapping.get(
                    'ValueRange', (None, None))
                if color_mapping.get('ColorFile') is not None:
                    cmap_name = color_mapping.get('ColorFile', cmap_name)
                else:
                    cmap_name = color_mapping.get('ColorBar', cmap_name)
                    cmap_name, _ = get_cmap(cmap_name)

        cmap_range = cmap_vmin, cmap_vmax
        if cmap_name is not None and None not in cmap_range:
            # noinspection PyTypeChecker
            return cmap_name, cmap_range

        ds = self.get_dataset(ds_id, expected_var_names=[var_name])
        var = ds[var_name]
        valid_range = get_var_valid_range(var)
        return get_var_cmap_params(var, cmap_name, cmap_range, valid_range)
Пример #3
0
    def get_color_mapping(self, ds_id: str, var_name: str):
        cmap_name = None
        cmap_vmin, cmap_vmax = None, None

        dataset_descriptor = self.get_dataset_descriptor(ds_id)
        style_name = dataset_descriptor.get('Style', 'default')
        styles = self._config.get('Styles')
        if styles:
            style = None
            for s in styles:
                if style_name == s['Identifier']:
                    style = s
                    break
            if style:
                color_mappings = style.get('ColorMappings')
                if color_mappings:
                    color_mapping = color_mappings.get(var_name)
                    if color_mapping:
                        cmap_vmin, cmap_vmax = color_mapping.get('ValueRange', (None, None))
                        if color_mapping.get('ColorFile') is not None:
                            cmap_name = color_mapping.get('ColorFile', cmap_name)
                        else:
                            cmap_name = color_mapping.get('ColorBar', cmap_name)
                            cmap_name, _ = get_cmap(cmap_name)

        cmap_params = cmap_name, cmap_vmin, cmap_vmax
        if None not in cmap_params:
            return cmap_params

        ds = self.get_dataset(ds_id, expected_var_names=[var_name])
        var = ds[var_name]
        valid_range = get_var_valid_range(var)
        return get_var_cmap_params(var, cmap_name, cmap_vmin, cmap_vmax, valid_range)
Пример #4
0
    def test_get_cmap(self):
        ensure_cmaps_loaded()

        cmap_name, cmap = get_cmap('plasma')
        self.assertEqual('plasma', cmap_name)
        self.assertIsInstance(cmap, Colormap)

        cmap_name, cmap = get_cmap('PLASMA')
        self.assertEqual('viridis', cmap_name)
        self.assertIsInstance(cmap, Colormap)

        cmap_name, cmap = get_cmap('PLASMA', default_cmap_name='magma')
        self.assertEqual('magma', cmap_name)
        self.assertIsInstance(cmap, Colormap)

        with self.assertRaises(ValueError):
            get_cmap('PLASMA', default_cmap_name='MAGMA')
Пример #5
0
def get_legend(ctx: ServiceContext, ds_id: str, var_name: str,
               params: RequestParams):
    cmap_name = params.get_query_argument('cbar', default=None)
    cmap_vmin = params.get_query_argument_float('vmin', default=None)
    cmap_vmax = params.get_query_argument_float('vmax', default=None)
    cmap_w = params.get_query_argument_int('width', default=None)
    cmap_h = params.get_query_argument_int('height', default=None)
    if cmap_name is None or cmap_vmin is None or cmap_vmax is None or cmap_w is None or cmap_h is None:
        default_cmap_cbar, (default_cmap_vmin,
                            default_cmap_vmax) = ctx.get_color_mapping(
                                ds_id, var_name)
        cmap_name = cmap_name or default_cmap_cbar
        cmap_vmin = cmap_vmin or default_cmap_vmin
        cmap_vmax = cmap_vmax or default_cmap_vmax
        cmap_w = cmap_w or DEFAULT_CMAP_WIDTH
        cmap_h = cmap_h or DEFAULT_CMAP_HEIGHT

    try:
        _, cmap = get_cmap(cmap_name)
    except ValueError:
        raise ServiceResourceNotFoundError(
            f"color bar {cmap_name!r} not found")

    fig = matplotlib.figure.Figure(figsize=(cmap_w, cmap_h))
    ax1 = fig.add_subplot(1, 1, 1)
    if '.cpd' in cmap_name:
        norm, ticks = get_norm(cmap_name)
    else:
        norm = matplotlib.colors.Normalize(vmin=cmap_vmin, vmax=cmap_vmax)
        ticks = None

    image_legend = matplotlib.colorbar.ColorbarBase(ax1,
                                                    format='%.1f',
                                                    ticks=ticks,
                                                    cmap=cmap,
                                                    norm=norm,
                                                    orientation='vertical')

    image_legend_label = ctx.get_legend_label(ds_id, var_name)
    if image_legend_label is not None:
        image_legend.set_label(image_legend_label)

    fig.patch.set_facecolor('white')
    fig.patch.set_alpha(0.0)
    fig.tight_layout()

    buffer = io.BytesIO()
    fig.savefig(buffer, format='png')

    return buffer.getvalue()
Пример #6
0
 def __init__(self,
              source_image: TiledImage,
              image_id: str = None,
              cmap_name: str = DEFAULT_COLOR_MAP_NAME,
              num_colors: int = DEFAULT_COLOR_MAP_NUM_COLORS,
              encode: bool = False,
              format: str = None,
              tile_cache: Cache = None,
              trace_perf: bool = False):
     super().__init__(source_image, image_id=image_id, format=format, mode='RGBA', tile_cache=tile_cache,
                      trace_perf=trace_perf)
     cmap_name, cmap = get_cmap(cmap_name or DEFAULT_COLOR_MAP_NAME,
                                default_cmap_name=DEFAULT_COLOR_MAP_NAME,
                                num_colors=num_colors or DEFAULT_COLOR_MAP_NUM_COLORS)
     self._cmap_name = cmap_name
     self._cmap = cmap
     self._encode = encode
Пример #7
0
 def __init__(self,
              array: np.ndarray,
              tile_size: Size2D,
              image_id: str = None,
              cmap_range: Tuple[float,
                                float] = DEFAULT_COLOR_MAP_VALUE_RANGE,
              cmap_name: str = DEFAULT_COLOR_MAP_NAME,
              num_colors: int = DEFAULT_COLOR_MAP_NUM_COLORS,
              no_data_value: Union[int, float] = None,
              encode: bool = False,
              format: str = None,
              tile_cache: Cache = None,
              flip_y: bool = False,
              valid_range: Tuple[Number, Number] = None,
              trace_perf: bool = False):
     width, height = array.shape[-1], array.shape[-2]
     tile_width, tile_height = tile_size
     num_tiles = (width + tile_width - 1) // tile_width, (
         height + tile_height - 1) // tile_height
     super().__init__((width, height),
                      tile_size=tile_size,
                      num_tiles=num_tiles,
                      image_id=image_id,
                      format=format,
                      mode='RGBA',
                      tile_cache=tile_cache,
                      trace_perf=trace_perf)
     valid_range = valid_range if valid_range is not None else (-np.inf,
                                                                np.inf)
     valid_range = tuple(map(float, valid_range))
     no_data_value = float(
         no_data_value) if no_data_value is not None else float(np.nan)
     cmap_range = cmap_range if cmap_range is not None else DEFAULT_COLOR_MAP_VALUE_RANGE
     cmap_range = tuple(map(float, cmap_range))
     self._array = array
     self._valid_range = valid_range
     self._no_data_value = no_data_value
     self._encode = encode
     self._flip_y = flip_y
     self._cmap_range = cmap_range
     self._num_colors = num_colors or DEFAULT_COLOR_MAP_NUM_COLORS
     cmap_name, cmap = get_cmap(cmap_name or DEFAULT_COLOR_MAP_NAME,
                                default_cmap_name=DEFAULT_COLOR_MAP_NAME)
     self._colors = cmap(
         np.linspace(0, 1, num_colors or DEFAULT_COLOR_MAP_NUM_COLORS))
Пример #8
0
    def get_color_mapping(self, ds_id: str, var_name: str):
        cmap_cbar, cmap_vmin, cmap_vmax = DEFAULT_CMAP_CBAR, DEFAULT_CMAP_VMIN, DEFAULT_CMAP_VMAX
        dataset_descriptor = self.get_dataset_descriptor(ds_id)
        style_name = dataset_descriptor.get('Style', 'default')
        styles = self._config.get('Styles')
        if styles:
            style = None
            for s in styles:
                if style_name == s['Identifier']:
                    style = s
                    break
            # TODO: check color_mappings is not None
            if style:
                color_mappings = style.get('ColorMappings')
                if color_mappings:
                    # TODO: check color_mappings is not None
                    color_mapping = color_mappings.get(var_name)
                    if color_mapping:
                        cmap_vmin, cmap_vmax = color_mapping.get(
                            'ValueRange', (cmap_vmin, cmap_vmax))
                        if color_mapping.get('ColorFile') is not None:
                            cmap_cbar = color_mapping.get(
                                'ColorFile', cmap_cbar)
                        else:
                            cmap_cbar = color_mapping.get(
                                'ColorBar', cmap_cbar)
                            cmap_cbar, _ = get_cmap(cmap_cbar)
                        return cmap_cbar, cmap_vmin, cmap_vmax
            else:
                ds = self.get_dataset(ds_id, expected_var_names=[var_name])
                var = ds[var_name]
                cmap_cbar = var.attrs.get('color_bar_name', cmap_cbar)
                cmap_vmin = var.attrs.get('color_value_min', cmap_vmin)
                cmap_vmax = var.attrs.get('color_value_max', cmap_vmax)

        _LOG.warning(
            f'color mapping for variable {var_name!r} of dataset {ds_id!r} undefined: using defaults'
        )
        return cmap_cbar, cmap_vmin, cmap_vmax