Merge pull request #63298 from elpaso/bugfix-gh63277-fixed-interval-single-class

Symbol renderer: special case for fixed interval single class
This commit is contained in:
Alexander Bruy 2025-09-29 13:02:30 +01:00 committed by GitHub
commit 42feace4f9
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 75 additions and 0 deletions

View File

@ -62,7 +62,15 @@ QList<double> QgsClassificationFixedInterval::calculateBreaks( double &minimum,
return breaks;
}
// Single class
if ( minimum == maximum )
{
breaks << maximum + interval;
return breaks;
}
double value = minimum;
while ( value < maximum )
{
value += interval;

View File

@ -45,6 +45,13 @@ QList<double> QgsClassificationPrettyBreaks::calculateBreaks( double &minimum, d
if ( symmetricModeEnabled() )
makeBreaksSymmetric( breaks, symmetryPoint(), symmetryAstride() );
// Special case for single class
if ( minimum == maximum && breaks.isEmpty() )
{
// 1 is totally arbitrary but we need something
breaks << maximum + 1.0;
}
return breaks;
}

View File

@ -26,6 +26,8 @@ from qgis.core import (
QgsRendererRangeLabelFormat,
QgsVectorLayer,
QgsFillSymbol,
QgsClassificationFixedInterval,
QgsClassificationPrettyBreaks,
)
import unittest
from qgis.testing import start_app, QgisTestCase
@ -770,6 +772,64 @@ class TestQgsGraduatedSymbolRenderer(QgisTestCase):
self.assertEqual(dom.toString(), expected)
def testFixedIntervalSingleClass(self):
"""Test single class with fixed interval, issue GH #63277"""
# Create a renderer
renderer = QgsGraduatedSymbolRenderer()
renderer.setClassificationMethod(QgsClassificationFixedInterval())
symbol = createMarkerSymbol()
renderer.setSourceSymbol(symbol.clone())
# Test retrieving data values from a layer
ml = createMemoryLayer((0, 0))
renderer.setClassAttribute("value")
# Equal interval calculations
renderer.updateClasses(ml, 5)
self.assertEqual(
dumpRangeBreaks(renderer.ranges()),
"(0.0000-1.0000,)",
"Fixed interval classification not correct",
)
ml = createMemoryLayer((1, 1))
renderer.updateClasses(ml, 5)
self.assertEqual(
dumpRangeBreaks(renderer.ranges()),
"(1.0000-2.0000,)",
"Fixed interval classification not correct",
)
def testPrettyBreakSingleClass(self):
"""Test single class with pretty break, issue GH #63277"""
# Create a renderer
renderer = QgsGraduatedSymbolRenderer()
renderer.setClassificationMethod(QgsClassificationPrettyBreaks())
symbol = createMarkerSymbol()
renderer.setSourceSymbol(symbol.clone())
# Test retrieving data values from a layer
ml = createMemoryLayer((0, 0))
renderer.setClassAttribute("value")
# Equal interval calculations
renderer.updateClasses(ml, 5)
self.assertEqual(
dumpRangeBreaks(renderer.ranges()),
"(0.0000-1.0000,)",
"Pretty breaks classification not correct",
)
ml = createMemoryLayer((1, 1))
renderer.updateClasses(ml, 5)
self.assertEqual(
dumpRangeBreaks(renderer.ranges()),
"(1.0000-2.0000,)",
"Pretty breaks classification not correct",
)
if __name__ == "__main__":
unittest.main()