Exemplo n.º 1
0
def fix_style(layer: QgsRasterLayer) -> None:
    ''' Sets a sensible default style for loaded raster layers and fix up other issues.

    By default QGIS uses MultiBandColor renderer if there are multiple bands.
    (See https://github.com/qgis/QGIS/blob/final-3_0_1/src/core/raster/qgsrasterlayer.cpp#L729).
    This function picks the right renderers, either a palette or gray-band renderer.

    Also, fake categories/classes that exist due to GDAL limitations are removed.
    Search for UNUSED_CATEGORY_LABEL to find details. '''
    provider = layer.dataProvider() # type: QgsRasterDataProvider
    color_interp = provider.colorInterpretation(1)
    is_palette = color_interp == QgsRaster.PaletteIndex

    # See the link below on how to create default-type renderers.
    # https://github.com/qgis/QGIS/blob/final-3_0_1/src/core/raster/qgsrasterrendererregistry.cpp#L128-L137

    renderer = layer.renderer() # type: QgsRasterRenderer
    new_renderer = None
    if is_palette:
        # For paletted layers we always re-create the renderer even if it is already a
        # paletted renderer. This is because we need to remove the UNUSED categories.
        color_table = provider.colorTable(1)
        classes = QgsPalettedRasterRenderer.colorTableToClassData(color_table)
        if not any(c.label == gis4wrf.core.UNUSED_CATEGORY_LABEL for c in classes):
            return
        new_classes = filter(lambda c: c.label != gis4wrf.core.UNUSED_CATEGORY_LABEL, classes)
        new_renderer = QgsPalettedRasterRenderer(renderer.input(), 1, new_classes)
        layer.setRenderer(new_renderer)
    else:
        if not isinstance(renderer, QgsSingleBandGrayRenderer):
            new_renderer = QgsSingleBandGrayRenderer(renderer.input(), 1)
            layer.setRenderer(new_renderer)
            layer.setDefaultContrastEnhancement() # must be *after* setting the renderer