def testQgsRandomColorRampV2(self): # test random colors r = QgsRandomColorRamp() self.assertEqual(r.type(), 'randomcolors') self.assertEqual(r.count(), -1) # no color count self.assertEqual(r.value(0), 0) # all values should be 0 self.assertEqual(r.value(1), 0) # test non-pregenerated colors. All should be valid for i in range(10000): c = r.color(0) self.assertTrue(c.isValid()) # test creating from properties # QgsRandomColorRamp has no properties for now, but test to ensure no crash props = r.properties() # NOQA # test cloning ramp cloned = r.clone() self.assertEqual(cloned.type(), 'randomcolors') # test with pregenerated colors for i in range(10000): r.setTotalColorCount(10) for j in range(10): c = r.color(j * 0.1) self.assertTrue(c.isValid())
def postProcessLayer(self, layer, context, feedback): _ = feedback, context layer.setLabelsEnabled(True) pal = QgsPalLayerSettings() # Expression combinant les nom d'habitat et du faciès pal.fieldName = "|| ' - ' || ".join(self.fields) pal.isExpression = True # Mais ce label est trop long # utilisation du faciès pour le label # et du nom pour le rendu pal.fieldName = self.fields[1] pal.isExpression = False pal.labelPerPart = True pal.placement = QgsPalLayerSettings.OverPoint txt_buff = QgsTextBufferSettings() txt_buff.setEnabled(True) txt_format = pal.format() txt_format.setBuffer(txt_buff) pal.setFormat(txt_format) layer.setLabeling(QgsVectorLayerSimpleLabeling(pal)) renderer = layer.renderer() symbol = renderer.symbol() symbol.setSize(6) # Symbologie à partir du champs nom de l'habitat index = layer.fields().indexOf(self.fields[0]) values = layer.uniqueValues(index) color = QgsRandomColorRamp() color.setTotalColorCount(len(values)) categories = [] for i, value in enumerate(values): symbol = QgsSymbol.defaultSymbol(QgsWkbTypes.PointGeometry) symbol.setColor(color.color(i)) symbol.setSize(5) category = QgsRendererCategory(value, symbol, value) categories.append(category) renderer = QgsCategorizedSymbolRenderer(self.fields[0], categories) layer.setRenderer(renderer) layer.triggerRepaint()
def set_style(self): """ Set the categorized style using random color. """ index = self.output_layer.fields().indexOf('nom') values = self.output_layer.uniqueValues(index) color = QgsRandomColorRamp() color.setTotalColorCount(len(values)) categories = [] for i, value in enumerate(values): symbol = QgsSymbol.defaultSymbol(QgsWkbTypes.PolygonGeometry) symbol.setColor(color.color(i)) category = QgsRendererCategory(value, symbol, value) categories.append(category) renderer = QgsCategorizedSymbolRenderer('nom', categories) self.output_layer.setRenderer(renderer)
def rat_classify(raster_layer, band, rat, criteria, ramp=None, feedback=QgsRasterBlockFeedback()) -> list: """Classify a raster. Note: cannot use a custom shader function QgsColorRampShader subclass because it's lost in the clone stage of the renderer. :param raster_layer: the raster layer to classify :type raster_layer: QgsRasterLayer :param band: band number (1-based) :type band: int :param rat: the RAT data :type rat: dict :param criteria: key of the RAT to be used for labels :type criteria: str :param ramp: optional color ramp, defaults to QgsRandomColorRamp() :type ramp: QgsColorRamp, optional :param feedback: QGIS feedback object, defaults to QgsRasterBlockFeedback() :type feedback: QgsRasterBlockFeedback, optional :return: unique row indexes for legend items (1-based) :rtype: list """ has_color = rat.has_color labels = rat.data[criteria] label_colors = {} unique_indexes = [] # QGIS >= 3.18 for first element label if Qgis.QGIS_VERSION_INT >= 31800: base_legend_row_index = 1 else: base_legend_row_index = 0 if rat.thematic_type == gdal.GRTT_THEMATIC: # Use paletted rat_log('Using paletted renderer') value_column_name = rat.field_name(gdal.GFU_MinMax) values = rat.data[value_column_name] is_integer = isinstance(values[0], int) if ramp is None: ramp = QgsRandomColorRamp() classes = QgsPalettedRasterRenderer.classDataFromRaster( raster_layer.dataProvider(), band, ramp, feedback) row_index = base_legend_row_index for klass in classes: value = int(klass.value) if is_integer else klass.value try: index = values.index(value) except ValueError: # NODATA rat_log( f'Value {value} not found in RAT, assuming NODATA', Qgis.Warning) data_provider = raster_layer.dataProvider() if not data_provider.userNoDataValuesContains(band, value): nodata = data_provider.userNoDataValues(band) nodata_value = QgsRasterRange(value, value) nodata.append(nodata_value) data_provider.setUserNoDataValue(band, nodata) continue klass.label = str(labels[index]) if klass.label not in label_colors: unique_indexes.append(row_index) if has_color: label_colors[klass.label] = rat.data[RAT_COLOR_HEADER_NAME][index] else: label_colors[klass.label] = klass.color klass.color = label_colors[klass.label] row_index += 1 renderer = QgsPalettedRasterRenderer( raster_layer.dataProvider(), band, classes) else: # ranges rat_log('Using singleband pseudocolor renderer') min_value_column = rat.field_name(gdal.GFU_Min) max_value_column = rat.field_name(gdal.GFU_Max) # Collect unique values and colors from criteria row_index = base_legend_row_index unique_labels = [] for index in range(len(labels)): label = labels[index] if label not in unique_labels: unique_labels.append(label) unique_indexes.append(row_index) # Collect color if has_color: label_colors[label] = rat.data[RAT_COLOR_HEADER_NAME][index] row_index += 1 # Assign colors from random ramp if not has_color: ramp = QgsRandomColorRamp() ramp.setTotalColorCount(len(unique_labels)) i = 0 for index in unique_indexes: label_colors[labels[index]] = ramp.color(ramp.value(i)) i += 1 # Create values for the ramp # Collect colors for all classes colors = [] for label in labels: colors.append(label_colors[label]) ramp = QgsPresetSchemeColorRamp(colors) minValue = min(rat.data[min_value_column]) maxValue = max(rat.data[max_value_column]) assert minValue < maxValue, "Min Value must be lower than Max Value" shader = QgsRasterShader(minValue, maxValue) colorRampShaderFcn = QgsColorRampShader( minValue, maxValue, ramp) colorRampShaderFcn.setClip(True) colorRampShaderFcn.setColorRampType(QgsColorRampShader.Discrete) items = [] row = 0 for label in labels: items.append(QgsColorRampShader.ColorRampItem( rat.data[max_value_column][row], label_colors[label], label)) row += 1 colorRampShaderFcn.setColorRampItemList(items) try: # for older QGIS colorRampShaderFcn.legendSettings().setUseContinuousLegend(False) except AttributeError: rat_log( 'QgsColorRampShader.legendSettings().setUseContinuousLegend() is not supported on ths QGIS version.', Qgis.Warning) shader.setRasterShaderFunction(colorRampShaderFcn) renderer = QgsSingleBandPseudoColorRenderer( raster_layer.dataProvider(), band, shader) raster_layer.setRenderer(renderer) raster_layer.triggerRepaint() return unique_indexes