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