Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Change isochrone renderer to QgsGraduatedSymbolRenderer to support more than 10 colors #265

Open
wants to merge 9 commits into
base: main
Choose a base branch
from
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,10 @@ RELEASING:
14. Create new release in GitHub with tag version and release title of `vX.X.X`
-->

## Unreleased
### Fixed
- Log the correct ApiError message in the isochrone processing algorithm with > 10 ranges ([#264](https://github.com/GIScience/orstools-qgis-plugin/issues/264))

## [1.8.4] - 2024-07-29

### Fixed
Expand Down
61 changes: 15 additions & 46 deletions ORStools/common/isochrones_core.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,21 +29,19 @@

from typing import Any, Generator

from qgis._core import QgsMapLayer
from qgis.core import (
QgsPointXY,
QgsFeature,
QgsField,
QgsFields,
QgsGeometry,
QgsSymbol,
QgsSimpleFillSymbolLayer,
QgsRendererCategory,
QgsCategorizedSymbolRenderer,
QgsGraduatedSymbolRenderer,
QgsMapLayer,
QgsStyle,
QgsClassificationEqualInterval,
)

from qgis.PyQt.QtCore import QVariant
from qgis.PyQt.QtGui import QColor


# import processing
Expand Down Expand Up @@ -176,49 +174,20 @@ def stylePoly(self, layer: QgsMapLayer) -> None:
:type layer: QgsMapLayer
"""

if self.dimension == "time":
legend_suffix = " min"
else:
legend_suffix = " m"

field = layer.fields().indexOf(self.field_dimension_name)
unique_values = sorted(layer.uniqueValues(field))

colors = {
0: QColor("#2b83ba"),
1: QColor("#64abb0"),
2: QColor("#9dd3a7"),
3: QColor("#c7e9ad"),
4: QColor("#edf8b9"),
5: QColor("#ffedaa"),
6: QColor("#fec980"),
7: QColor("#f99e59"),
8: QColor("#e85b3a"),
9: QColor("#d7191c"),
}

categories = []

for cid, unique_value in enumerate(unique_values):
# initialize the default symbol for this geometry type
symbol = QgsSymbol.defaultSymbol(layer.geometryType())

# configure a symbol layer
symbol_layer = QgsSimpleFillSymbolLayer(
color=colors[cid], strokeColor=QColor("#000000")
)

# replace default symbol layer with the configured one
if symbol_layer is not None:
symbol.changeSymbolLayer(0, symbol_layer)

# create renderer object
category = QgsRendererCategory(unique_value, symbol, str(unique_value) + legend_suffix)
# entry for the list of category items
categories.append(category)

# create renderer object
renderer = QgsCategorizedSymbolRenderer(self.field_dimension_name, categories)
classification_method = QgsClassificationEqualInterval()
ramp_name = "Spectral"
default_style = QgsStyle().defaultStyle()
color_ramp = default_style.colorRamp(ramp_name)
color_ramp.invert()
num_classes = len(unique_values)

renderer = QgsGraduatedSymbolRenderer(self.field_dimension_name)
renderer.setSourceColorRamp(color_ramp)
renderer.setClassificationMethod(classification_method)
renderer.updateClasses(layer, num_classes)

# assign the created renderer to the layer
if renderer is not None:
Expand Down
Loading