コード例 #1
0
    def testQgsVectorGradientRampV2(self):
        # test QgsGradientStop
        stop = QgsGradientStop(0.9, QColor(200, 150, 100))
        self.assertEqual(stop.offset, 0.9)
        self.assertEqual(stop.color, QColor(200, 150, 100))
        self.assertEqual(QgsGradientStop(0.1, QColor(180, 20, 30)), QgsGradientStop(0.1, QColor(180, 20, 30)))
        self.assertNotEqual(QgsGradientStop(0.1, QColor(180, 20, 30)), QgsGradientStop(0.2, QColor(180, 20, 30)))
        self.assertNotEqual(QgsGradientStop(0.1, QColor(180, 20, 30)), QgsGradientStop(0.1, QColor(180, 40, 30)))

        # test gradient with only start/end color
        r = QgsGradientColorRamp(QColor(200, 0, 0, 100), QColor(0, 200, 0, 200))
        self.assertEqual(r.type(), 'gradient')
        self.assertEqual(r.color1(), QColor(200, 0, 0, 100))
        self.assertEqual(r.color2(), QColor(0, 200, 0, 200))
        self.assertEqual(r.isDiscrete(), False)
        self.assertEqual(len(r.stops()), 0)
        self.assertEqual(r.count(), 2)
        self.assertEqual(r.value(0), 0.0)
        self.assertEqual(r.value(1), 1.0)
        self.assertEqual(r.color(0), QColor(200, 0, 0, 100))
        self.assertEqual(r.color(1), QColor(0, 200, 0, 200))
        self.assertEqual(r.color(0.5), QColor(100, 100, 0, 150))

        # test gradient with stops
        r = QgsGradientColorRamp(QColor(200, 0, 0), QColor(0, 200, 0), False, [QgsGradientStop(0.1, QColor(180, 20, 40)),
                                                                               QgsGradientStop(0.9, QColor(40, 60, 100))])
        self.assertEqual(r.color1(), QColor(200, 0, 0))
        self.assertEqual(r.color2(), QColor(0, 200, 0))
        self.assertEqual(r.isDiscrete(), False)
        self.assertEqual(len(r.stops()), 2)
        self.assertEqual(r.count(), 4)
        self.assertEqual(r.value(0), 0.0)
        self.assertEqual(r.value(1), 0.1)
        self.assertEqual(r.value(2), 0.9)
        self.assertEqual(r.value(3), 1.0)
        self.assertEqual(r.color(0), QColor(200, 0, 0))
        self.assertEqual(r.color(0.05), QColor(190, 10, 20))
        self.assertEqual(r.color(0.1), QColor(180, 20, 40))
        self.assertEqual(r.color(0.5), QColor(110, 40, 70))
        self.assertEqual(r.color(0.9), QColor(40, 60, 100))
        self.assertEqual(r.color(0.95), QColor(20, 130, 50))
        self.assertEqual(r.color(1), QColor(0, 200, 0))

        # test setters
        r.setColor1(QColor(0, 0, 200))
        self.assertEqual(r.color1(), QColor(0, 0, 200))
        self.assertEqual(r.color(0), QColor(0, 0, 200))
        r.setColor2(QColor(0, 0, 100))
        self.assertEqual(r.color2(), QColor(0, 0, 100))
        self.assertEqual(r.color(1.0), QColor(0, 0, 100))
        r.setStops([QgsGradientStop(0.4, QColor(100, 100, 40))])
        s = r.stops()
        self.assertEqual(len(s), 1)
        self.assertEqual(s[0].offset, 0.4)
        self.assertEqual(s[0].color, QColor(100, 100, 40))

        # test info
        r.setInfo({'key1': 'val1', 'key2': 'val2'})
        self.assertEqual(r.info()['key1'], 'val1')
        self.assertEqual(r.info()['key2'], 'val2')

        # test creating from properties
        props = r.properties()
        fromProps = QgsGradientColorRamp.create(props)
        self.assertEqual(fromProps.color1(), QColor(0, 0, 200))
        self.assertEqual(fromProps.color2(), QColor(0, 0, 100))
        s = fromProps.stops()
        self.assertEqual(len(s), 1)
        self.assertEqual(s[0].offset, 0.4)
        c = QColor(s[0].color)
        self.assertEqual(c, QColor(100, 100, 40))
        self.assertEqual(fromProps.info()['key1'], 'val1')
        self.assertEqual(fromProps.info()['key2'], 'val2')
        self.assertEqual(fromProps.isDiscrete(), False)

        # test cloning ramp
        cloned = r.clone()
        self.assertEqual(cloned.color1(), QColor(0, 0, 200))
        self.assertEqual(cloned.color2(), QColor(0, 0, 100))
        s = cloned.stops()
        self.assertEqual(len(s), 1)
        self.assertEqual(s[0].offset, 0.4)
        c = QColor(s[0].color)
        self.assertEqual(c, QColor(100, 100, 40))
        self.assertEqual(cloned.info()['key1'], 'val1')
        self.assertEqual(cloned.info()['key2'], 'val2')
        self.assertEqual(cloned.isDiscrete(), False)

        # test discrete ramps
        # first with no stops
        d = QgsGradientColorRamp(QColor(200, 0, 0), QColor(0, 200, 0), True)
        self.assertEqual(d.isDiscrete(), True)
        self.assertEqual(d.color(0), QColor(200, 0, 0))
        self.assertEqual(d.color(0.5), QColor(200, 0, 0))
        self.assertEqual(d.color(1), QColor(0, 200, 0))
        # then with stops
        d = QgsGradientColorRamp(QColor(200, 0, 0), QColor(0, 200, 0), True, [QgsGradientStop(0.1, QColor(180, 20, 40)),
                                                                              QgsGradientStop(0.9, QColor(40, 60, 100))])
        self.assertEqual(d.isDiscrete(), True)
        self.assertEqual(d.color(0), QColor(200, 0, 0))
        self.assertEqual(d.color(0.05), QColor(200, 0, 0))
        self.assertEqual(d.color(0.1), QColor(180, 20, 40))
        self.assertEqual(d.color(0.5), QColor(180, 20, 40))
        self.assertEqual(d.color(0.9), QColor(40, 60, 100))
        self.assertEqual(d.color(0.95), QColor(40, 60, 100))
        self.assertEqual(d.color(1), QColor(0, 200, 0))

        # to gradient
        g = QGradient()
        r = QgsGradientColorRamp(QColor(200, 0, 0), QColor(0, 200, 0), False, [QgsGradientStop(0.1, QColor(180, 20, 40)),
                                                                               QgsGradientStop(0.9, QColor(40, 60, 100))])
        r.addStopsToGradient(g, 0.5)
        self.assertEqual(len(g.stops()), 4)
        self.assertEqual(g.stops()[0], (0.0, QColor(200, 0, 0, 127)))
        self.assertEqual(g.stops()[1], (0.1, QColor(180, 20, 40, 127)))
        self.assertEqual(g.stops()[2], (0.9, QColor(40, 60, 100, 127)))
        self.assertEqual(g.stops()[3], (1.0, QColor(0, 200, 0, 127)))

        # test that stops are ordered when setting them
        # first add some out-of-order stops
        r.setStops([QgsGradientStop(0.4, QColor(100, 100, 40)),
                    QgsGradientStop(0.2, QColor(200, 200, 80)),
                    QgsGradientStop(0.8, QColor(50, 20, 10)),
                    QgsGradientStop(0.6, QColor(10, 10, 4))])
        s = r.stops()
        self.assertEqual(len(s), 4)
        self.assertEqual(s[0].offset, 0.2)
        self.assertEqual(s[0].color, QColor(200, 200, 80))
        self.assertEqual(s[1].offset, 0.4)
        self.assertEqual(s[1].color, QColor(100, 100, 40))
        self.assertEqual(s[2].offset, 0.6)
        self.assertEqual(s[2].color, QColor(10, 10, 4))
        self.assertEqual(s[3].offset, 0.8)
        self.assertEqual(s[3].color, QColor(50, 20, 10))

        # test continuous invert function
        r.invert()
        self.assertEqual(r.color(0), QColor(0, 200, 0))
        self.assertEqual(r.color(1), QColor(200, 0, 0))
        self.assertEqual(r.color(0.2), QColor(50, 20, 10))

        # test discrete invert function
        r = QgsGradientColorRamp(QColor(255, 255, 255), QColor(0, 0, 0), True, [QgsGradientStop(0.33, QColor(128, 128, 128)),
                                                                                QgsGradientStop(0.66, QColor(0, 0, 0))])
        self.assertEqual(r.color(0.2), QColor(255, 255, 255))
        self.assertEqual(r.color(0.5), QColor(128, 128, 128))
        self.assertEqual(r.color(0.8), QColor(0, 0, 0))
        r.invert()
        self.assertEqual(r.color(0.2), QColor(0, 0, 0))
        self.assertEqual(r.color(0.5), QColor(128, 128, 128))
        self.assertEqual(r.color(0.8), QColor(255, 255, 255))
コード例 #2
0
ファイル: test_qgscolorramp.py プロジェクト: vcloarec/QGIS
    def testQgsGradientColorRamp(self):
        # test QgsGradientStop
        stop = QgsGradientStop(0.9, QColor(200, 150, 100))
        self.assertEqual(stop.offset, 0.9)
        self.assertEqual(stop.color, QColor(200, 150, 100))
        self.assertEqual(QgsGradientStop(0.1, QColor(180, 20, 30)),
                         QgsGradientStop(0.1, QColor(180, 20, 30)))
        self.assertNotEqual(QgsGradientStop(0.1, QColor(180, 20, 30)),
                            QgsGradientStop(0.2, QColor(180, 20, 30)))
        self.assertNotEqual(QgsGradientStop(0.1, QColor(180, 20, 30)),
                            QgsGradientStop(0.1, QColor(180, 40, 30)))

        stop2 = QgsGradientStop(stop)
        stop2.setColorSpec(QColor.Hsv)
        self.assertNotEqual(stop2, stop)
        self.assertEqual(stop2.colorSpec(), QColor.Hsv)

        stop2 = QgsGradientStop(stop)
        stop2.setDirection(Qgis.AngularDirection.Clockwise)
        self.assertNotEqual(stop2, stop)
        self.assertEqual(stop2.direction(), Qgis.AngularDirection.Clockwise)

        # test gradient with only start/end color
        r = QgsGradientColorRamp(QColor(200, 0, 0, 100),
                                 QColor(0, 200, 0, 200))
        self.assertEqual(r.type(), 'gradient')
        self.assertEqual(r.color1(), QColor(200, 0, 0, 100))
        self.assertEqual(r.color2(), QColor(0, 200, 0, 200))
        self.assertEqual(r.isDiscrete(), False)
        self.assertEqual(len(r.stops()), 0)
        self.assertEqual(r.count(), 2)
        self.assertEqual(r.value(0), 0.0)
        self.assertEqual(r.value(1), 1.0)
        self.assertEqual(r.color(0), QColor(200, 0, 0, 100))
        self.assertEqual(r.color(1), QColor(0, 200, 0, 200))
        self.assertEqual(r.color(0.5), QColor(100, 100, 0, 150))

        r.setColorSpec(QColor.Hsv)
        self.assertEqual(r.colorSpec(), QColor.Hsv)
        r.setColor1(QColor.fromHsvF(0.1, 0.2, 0.4, 0.5))
        r.setColor2(QColor.fromHsvF(0.3, 0.4, 0.6, 0.7))
        self.assertAlmostEqual(r.color(0).hsvHueF(), 0.1, 3)
        self.assertAlmostEqual(r.color(0).hsvSaturationF(), 0.2, 3)
        self.assertAlmostEqual(r.color(0).valueF(), 0.4, 3)
        self.assertAlmostEqual(r.color(0).alphaF(), 0.5, 3)

        self.assertAlmostEqual(r.color(1).hsvHueF(), 0.3, 3)
        self.assertAlmostEqual(r.color(1).hsvSaturationF(), 0.4, 3)
        self.assertAlmostEqual(r.color(1).valueF(), 0.6, 3)
        self.assertAlmostEqual(r.color(1).alphaF(), 0.7, 3)

        self.assertAlmostEqual(r.color(0.5).hsvHueF(), 0.2, 3)
        self.assertAlmostEqual(r.color(0.5).hsvSaturationF(), 0.3, 3)
        self.assertAlmostEqual(r.color(0.5).valueF(), 0.5, 3)
        self.assertAlmostEqual(r.color(0.5).alphaF(), 0.6, 3)

        r.setDirection(Qgis.AngularDirection.Clockwise)
        self.assertAlmostEqual(r.color(0.5).hsvHueF(), 0.7, 3)
        self.assertAlmostEqual(r.color(0.5).hsvSaturationF(), 0.3, 3)
        self.assertAlmostEqual(r.color(0.5).valueF(), 0.5, 3)
        self.assertAlmostEqual(r.color(0.5).alphaF(), 0.6, 3)

        r.setDirection(Qgis.AngularDirection.CounterClockwise)
        r.setColor1(QColor.fromHsvF(0.1, 0.2, 0.4, 0.5))
        r.setColor2(QColor.fromHsvF(0.3, 0.4, 0.6, 0.7))
        self.assertAlmostEqual(r.color(0.5).hsvHueF(), 0.2, 3)
        self.assertAlmostEqual(r.color(0.5).hsvSaturationF(), 0.3, 3)
        self.assertAlmostEqual(r.color(0.5).valueF(), 0.5, 3)
        self.assertAlmostEqual(r.color(0.5).alphaF(), 0.6, 3)

        r.setDirection(Qgis.AngularDirection.Clockwise)
        self.assertAlmostEqual(r.color(0.5).hsvHueF(), 0.7, 3)
        self.assertAlmostEqual(r.color(0.5).hsvSaturationF(), 0.3, 3)
        self.assertAlmostEqual(r.color(0.5).valueF(), 0.5, 3)
        self.assertAlmostEqual(r.color(0.5).alphaF(), 0.6, 3)

        r.setColorSpec(QColor.Hsl)
        r.setDirection(Qgis.AngularDirection.CounterClockwise)
        self.assertEqual(r.colorSpec(), QColor.Hsl)
        r.setColor1(QColor.fromHslF(0.1, 0.2, 0.4, 0.5))
        r.setColor2(QColor.fromHslF(0.3, 0.4, 0.6, 0.7))
        self.assertAlmostEqual(r.color(0).hslHueF(), 0.1, 3)
        self.assertAlmostEqual(r.color(0).hslSaturationF(), 0.2, 3)
        self.assertAlmostEqual(r.color(0).lightnessF(), 0.4, 3)
        self.assertAlmostEqual(r.color(0).alphaF(), 0.5, 3)

        self.assertAlmostEqual(r.color(1).hslHueF(), 0.3, 3)
        self.assertAlmostEqual(r.color(1).hslSaturationF(), 0.4, 3)
        self.assertAlmostEqual(r.color(1).lightnessF(), 0.6, 3)
        self.assertAlmostEqual(r.color(1).alphaF(), 0.7, 3)

        self.assertAlmostEqual(r.color(0.5).hslHueF(), 0.2, 3)
        self.assertAlmostEqual(r.color(0.5).hslSaturationF(), 0.3, 3)
        self.assertAlmostEqual(r.color(0.5).lightnessF(), 0.5, 3)
        self.assertAlmostEqual(r.color(0.5).alphaF(), 0.6, 3)

        r.setDirection(Qgis.AngularDirection.Clockwise)
        self.assertAlmostEqual(r.color(0.5).hslHueF(), 0.7, 3)
        self.assertAlmostEqual(r.color(0.5).hslSaturationF(), 0.3, 3)
        self.assertAlmostEqual(r.color(0.5).lightnessF(), 0.5, 3)
        self.assertAlmostEqual(r.color(0.5).alphaF(), 0.6, 3)

        r.setDirection(Qgis.AngularDirection.CounterClockwise)
        r.setColor1(QColor.fromHslF(0.1, 0.2, 0.4, 0.5))
        r.setColor2(QColor.fromHslF(0.3, 0.4, 0.6, 0.7))
        self.assertAlmostEqual(r.color(0.5).hslHueF(), 0.2, 3)
        self.assertAlmostEqual(r.color(0.5).hslSaturationF(), 0.3, 3)
        self.assertAlmostEqual(r.color(0.5).lightnessF(), 0.5, 3)
        self.assertAlmostEqual(r.color(0.5).alphaF(), 0.6, 3)

        r.setDirection(Qgis.AngularDirection.Clockwise)
        self.assertAlmostEqual(r.color(0.5).hslHueF(), 0.7, 3)
        self.assertAlmostEqual(r.color(0.5).hslSaturationF(), 0.3, 3)
        self.assertAlmostEqual(r.color(0.5).lightnessF(), 0.5, 3)
        self.assertAlmostEqual(r.color(0.5).alphaF(), 0.6, 3)

        # test gradient with stops
        r = QgsGradientColorRamp(QColor(200, 0, 0), QColor(0, 200, 0), False, [
            QgsGradientStop(0.1, QColor(180, 20, 40)),
            QgsGradientStop(0.9, QColor(40, 60, 100))
        ])
        self.assertEqual(r.color1(), QColor(200, 0, 0))
        self.assertEqual(r.color2(), QColor(0, 200, 0))
        self.assertEqual(r.isDiscrete(), False)
        self.assertEqual(len(r.stops()), 2)
        self.assertEqual(r.count(), 4)
        self.assertEqual(r.value(0), 0.0)
        self.assertEqual(r.value(1), 0.1)
        self.assertEqual(r.value(2), 0.9)
        self.assertEqual(r.value(3), 1.0)
        self.assertEqual(r.color(0), QColor(200, 0, 0))
        self.assertEqual(r.color(0.05), QColor(190, 10, 20))
        self.assertEqual(r.color(0.1), QColor(180, 20, 40))
        self.assertEqual(r.color(0.5), QColor(110, 40, 70))
        self.assertEqual(r.color(0.9), QColor(40, 60, 100))
        self.assertEqual(r.color(0.95), QColor(20, 130, 50))
        self.assertEqual(r.color(1), QColor(0, 200, 0))

        # with color models
        r = QgsGradientColorRamp(QColor.fromHsvF(0.2, 0.4, 0.6, 0.3),
                                 QColor(0, 200, 0))
        stop1 = QgsGradientStop(0.1, QColor.fromHsvF(0.4, 0.6, 0.8, 0.1))
        stop1.setColorSpec(QColor.Hsv)
        stop2 = QgsGradientStop(0.5, QColor.fromHslF(0.3, 0.2, 0.1, 0.9))
        stop2.setColorSpec(QColor.Hsl)
        stop3 = QgsGradientStop(0.9, QColor(60, 100, 120))
        stop3.setColorSpec(QColor.Rgb)
        r.setStops([stop1, stop2, stop3])
        self.assertAlmostEqual(r.color(0).hsvHueF(), 0.2, 3)
        self.assertAlmostEqual(r.color(0).hsvSaturationF(), 0.4, 3)
        self.assertAlmostEqual(r.color(0).valueF(), 0.6, 3)
        self.assertAlmostEqual(r.color(0).alphaF(), 0.3, 3)
        self.assertAlmostEqual(r.color(0.05).hsvHueF(), 0.3, 3)
        self.assertAlmostEqual(r.color(0.05).hsvSaturationF(), 0.5, 3)
        self.assertAlmostEqual(r.color(0.05).valueF(), 0.7, 3)
        self.assertAlmostEqual(r.color(0.05).alphaF(), 0.2, 3)
        self.assertAlmostEqual(r.color(0.1).hsvHueF(), 0.4, 3)
        self.assertAlmostEqual(r.color(0.1).hsvSaturationF(), 0.6, 3)
        self.assertAlmostEqual(r.color(0.1).valueF(), 0.8, 3)
        self.assertAlmostEqual(r.color(0.1).alphaF(), 0.1, 3)
        self.assertAlmostEqual(r.color(0.1).hslHueF(), 0.4, 3)
        self.assertAlmostEqual(r.color(0.1).hslSaturationF(), 0.5454, 3)
        self.assertAlmostEqual(r.color(0.1).lightnessF(), 0.56, 3)
        self.assertAlmostEqual(r.color(0.3).hslHueF(), 0.85, 3)
        self.assertAlmostEqual(r.color(0.3).hslSaturationF(), 0.3727, 3)
        self.assertAlmostEqual(r.color(0.3).lightnessF(), 0.330, 3)
        self.assertAlmostEqual(r.color(0.3).alphaF(), 0.5, 3)
        self.assertAlmostEqual(r.color(0.5).hslHueF(), 0.3, 3)
        self.assertAlmostEqual(r.color(0.5).hslSaturationF(), 0.2, 3)
        self.assertAlmostEqual(r.color(0.5).lightnessF(), 0.1, 3)
        self.assertAlmostEqual(r.color(0.5).alphaF(), 0.9, 3)
        self.assertEqual(r.color(0.5).red(), 22)
        self.assertAlmostEqual(r.color(0.5).green(), 31, -1)
        self.assertEqual(r.color(0.5).blue(), 20)
        self.assertEqual(r.color(0.7).red(), 41)
        self.assertEqual(r.color(0.7).green(), 65)
        self.assertEqual(r.color(0.7).blue(), 70)
        self.assertAlmostEqual(r.color(0.7).alphaF(), 0.95, 3)
        self.assertEqual(r.color(0.9), QColor(60, 100, 120))
        self.assertEqual(r.color(0.95), QColor(30, 150, 60))
        self.assertEqual(r.color(1), QColor(0, 200, 0))

        # HSV based interpolation, invalid hues
        rr = QgsGradientColorRamp(QColor.fromHsvF(-1, 0, 0.6, 1),
                                  QColor.fromHsvF(0.2, 0.7, 0.8, .5))
        rr.setColorSpec(QColor.Hsv)
        self.assertAlmostEqual(rr.color(0.5).hsvHueF(), 0.2,
                               3)  # should take either avialable hue
        self.assertAlmostEqual(rr.color(0.5).hsvSaturationF(), 0.350, 3)
        self.assertAlmostEqual(rr.color(0.5).valueF(), 0.7, 3)
        self.assertAlmostEqual(rr.color(0.5).alphaF(), 0.75, 3)
        rr = QgsGradientColorRamp(QColor.fromHsvF(0.2, 0.7, 0.8, .5),
                                  QColor.fromHsvF(-1, 0, 0.6, 1))
        rr.setColorSpec(QColor.Hsv)
        self.assertAlmostEqual(rr.color(0.5).hsvHueF(), 0.2,
                               3)  # should take either avialable hue
        self.assertAlmostEqual(rr.color(0.5).hsvSaturationF(), 0.350, 3)
        self.assertAlmostEqual(rr.color(0.5).valueF(), 0.7, 3)
        self.assertAlmostEqual(rr.color(0.5).alphaF(), 0.75, 3)
        # both invalid hue
        rr = QgsGradientColorRamp(QColor.fromHsvF(-1, 0.7, 0.8, .5),
                                  QColor.fromHsvF(-1, 0, 0.6, 1))
        rr.setColorSpec(QColor.Hsv)
        self.assertEqual(rr.color(0.5).hsvHueF(), -1)
        self.assertAlmostEqual(rr.color(0.5).hsvSaturationF(), 0.350, 3)
        self.assertAlmostEqual(rr.color(0.5).valueF(), 0.7, 3)
        self.assertAlmostEqual(rr.color(0.5).alphaF(), 0.75, 3)

        # HSL based interpolation, invalid hues
        rr = QgsGradientColorRamp(QColor.fromHslF(-1, 0, 0.6, 1),
                                  QColor.fromHslF(0.2, 0.7, 0.8, .5))
        rr.setColorSpec(QColor.Hsl)
        self.assertAlmostEqual(rr.color(0.5).hslHueF(), 0.2,
                               3)  # should take either avialable hue
        self.assertAlmostEqual(rr.color(0.5).hslSaturationF(), 0.350, 3)
        self.assertAlmostEqual(rr.color(0.5).lightnessF(), 0.7, 3)
        self.assertAlmostEqual(rr.color(0.5).alphaF(), 0.75, 3)
        rr = QgsGradientColorRamp(QColor.fromHslF(0.2, 0.7, 0.8, .5),
                                  QColor.fromHslF(-1, 0, 0.6, 1))
        rr.setColorSpec(QColor.Hsl)
        self.assertAlmostEqual(rr.color(0.5).hslHueF(), 0.2,
                               3)  # should take either avialable hue
        self.assertAlmostEqual(rr.color(0.5).hslSaturationF(), 0.350, 3)
        self.assertAlmostEqual(rr.color(0.5).lightnessF(), 0.7, 3)
        self.assertAlmostEqual(rr.color(0.5).alphaF(), 0.75, 3)
        # both invalid hue
        rr = QgsGradientColorRamp(QColor.fromHslF(-1, 0.7, 0.8, .5),
                                  QColor.fromHslF(-1, 0, 0.6, 1))
        rr.setColorSpec(QColor.Hsl)
        self.assertEqual(rr.color(0.5).hslHueF(), -1)
        self.assertAlmostEqual(rr.color(0.5).hslSaturationF(), 0.350, 3)
        self.assertAlmostEqual(rr.color(0.5).lightnessF(), 0.7, 3)
        self.assertAlmostEqual(rr.color(0.5).alphaF(), 0.75, 3)

        # test setters
        r.setColor1(QColor(0, 0, 200))
        self.assertEqual(r.color1(), QColor(0, 0, 200))
        self.assertEqual(r.color(0), QColor(0, 0, 200))
        r.setColor2(QColor(0, 0, 100))
        self.assertEqual(r.color2(), QColor(0, 0, 100))
        self.assertEqual(r.color(1.0), QColor(0, 0, 100))
        stop = QgsGradientStop(0.4, QColor(100, 100, 40))
        stop.setColorSpec(QColor.Hsv)
        stop.setDirection(Qgis.AngularDirection.Clockwise)
        r.setStops([stop])
        s = r.stops()
        self.assertEqual(len(s), 1)
        self.assertEqual(s[0].offset, 0.4)
        self.assertEqual(s[0].color, QColor(100, 100, 40))

        # test info
        r.setInfo({'key1': 'val1', 'key2': 'val2'})
        self.assertEqual(r.info()['key1'], 'val1')
        self.assertEqual(r.info()['key2'], 'val2')

        # test creating from properties
        r.setColorSpec(QColor.Hsv)
        r.setDirection(Qgis.AngularDirection.Clockwise)
        props = r.properties()
        fromProps = QgsGradientColorRamp.create(props)
        self.assertEqual(fromProps.color1(), QColor(0, 0, 200))
        self.assertEqual(fromProps.color2(), QColor(0, 0, 100))
        s = fromProps.stops()
        self.assertEqual(len(s), 1)
        self.assertEqual(s[0].offset, 0.4)
        self.assertEqual(s[0].colorSpec(), QColor.Hsv)
        self.assertEqual(s[0].direction(), Qgis.AngularDirection.Clockwise)
        c = QColor(s[0].color)
        self.assertEqual(c, QColor(100, 100, 40))
        self.assertEqual(fromProps.info()['key1'], 'val1')
        self.assertEqual(fromProps.info()['key2'], 'val2')
        self.assertEqual(fromProps.isDiscrete(), False)
        self.assertEqual(fromProps.colorSpec(), QColor.Hsv)
        self.assertEqual(fromProps.direction(),
                         Qgis.AngularDirection.Clockwise)

        # test cloning ramp
        cloned = r.clone()
        self.assertEqual(cloned.color1(), QColor(0, 0, 200))
        self.assertEqual(cloned.color2(), QColor(0, 0, 100))
        s = cloned.stops()
        self.assertEqual(len(s), 1)
        self.assertEqual(s[0].offset, 0.4)
        self.assertEqual(s[0].colorSpec(), QColor.Hsv)
        self.assertEqual(s[0].direction(), Qgis.AngularDirection.Clockwise)
        c = QColor(s[0].color)
        self.assertEqual(c, QColor(100, 100, 40))
        self.assertEqual(cloned.info()['key1'], 'val1')
        self.assertEqual(cloned.info()['key2'], 'val2')
        self.assertEqual(cloned.isDiscrete(), False)
        self.assertEqual(cloned.colorSpec(), QColor.Hsv)
        self.assertEqual(cloned.direction(), Qgis.AngularDirection.Clockwise)

        # test discrete ramps
        # first with no stops
        d = QgsGradientColorRamp(QColor(200, 0, 0), QColor(0, 200, 0), True)
        self.assertEqual(d.isDiscrete(), True)
        self.assertEqual(d.color(0), QColor(200, 0, 0))
        self.assertEqual(d.color(0.5), QColor(200, 0, 0))
        self.assertEqual(d.color(1), QColor(0, 200, 0))
        # then with stops
        d = QgsGradientColorRamp(QColor(200, 0, 0), QColor(0, 200, 0), True, [
            QgsGradientStop(0.1, QColor(180, 20, 40)),
            QgsGradientStop(0.9, QColor(40, 60, 100))
        ])
        self.assertEqual(d.isDiscrete(), True)
        self.assertEqual(d.color(0), QColor(200, 0, 0))
        self.assertEqual(d.color(0.05), QColor(200, 0, 0))
        self.assertEqual(d.color(0.1), QColor(180, 20, 40))
        self.assertEqual(d.color(0.5), QColor(180, 20, 40))
        self.assertEqual(d.color(0.9), QColor(40, 60, 100))
        self.assertEqual(d.color(0.95), QColor(40, 60, 100))
        self.assertEqual(d.color(1), QColor(0, 200, 0))

        # to gradient
        g = QGradient()
        r = QgsGradientColorRamp(QColor(200, 0, 0), QColor(0, 200, 0), False, [
            QgsGradientStop(0.1, QColor(180, 20, 40)),
            QgsGradientStop(0.9, QColor(40, 60, 100))
        ])
        r.addStopsToGradient(g, 0.5)
        self.assertEqual(len(g.stops()), 4)
        self.assertEqual(g.stops()[0], (0.0, QColor(200, 0, 0, 127)))
        self.assertEqual(g.stops()[1], (0.1, QColor(180, 20, 40, 127)))
        self.assertEqual(g.stops()[2], (0.9, QColor(40, 60, 100, 127)))
        self.assertEqual(g.stops()[3], (1.0, QColor(0, 200, 0, 127)))

        # add to gradient, non-RGB color model
        g = QGradient()
        rr = QgsGradientColorRamp(QColor.fromHsvF(0.2, 0.3, 0.4),
                                  QColor.fromHsvF(0.8, 1.0, 0.6))
        rr.setColorSpec(QColor.Hsv)
        rr.addStopsToGradient(g, 0.5)
        res = [(round(stop[0], 2), round(stop[1].hsvHueF(), 2),
                round(stop[1].hsvSaturationF(),
                      2), round(stop[1].valueF(),
                                2), round(stop[1].alphaF(), 2))
               for stop in g.stops()]
        self.assertEqual(res, [(0.0, 0.2, 0.3, 0.4, 0.5),
                               (0.05, 0.23, 0.34, 0.41, 0.5),
                               (0.1, 0.26, 0.37, 0.42, 0.5),
                               (0.15, 0.29, 0.41, 0.43, 0.5),
                               (0.2, 0.32, 0.44, 0.44, 0.5),
                               (0.25, 0.35, 0.48, 0.45, 0.5),
                               (0.3, 0.38, 0.51, 0.46, 0.5),
                               (0.35, 0.41, 0.55, 0.47, 0.5),
                               (0.4, 0.44, 0.58, 0.48, 0.5),
                               (0.45, 0.47, 0.61, 0.49, 0.5),
                               (0.5, 0.5, 0.65, 0.5, 0.5),
                               (0.55, 0.53, 0.69, 0.51, 0.5),
                               (0.6, 0.56, 0.72, 0.52, 0.5),
                               (0.65, 0.59, 0.76, 0.53, 0.5),
                               (0.7, 0.62, 0.79, 0.54, 0.5),
                               (0.75, 0.65, 0.83, 0.55, 0.5),
                               (0.8, 0.68, 0.86, 0.56, 0.5),
                               (0.85, 0.71, 0.9, 0.57, 0.5),
                               (0.9, 0.74, 0.93, 0.58, 0.5),
                               (0.95, 0.77, 0.96, 0.59, 0.5),
                               (1.0, 0.8, 1.0, 0.6, 0.5)])
        # with stops
        stop = QgsGradientStop(0.6, QColor.fromHsvF(0.1, 0.7, 0.3, 0.4))
        stop.setColorSpec(QColor.Hsl)
        stop.setDirection(Qgis.AngularDirection.Clockwise)
        rr.setStops([stop])
        g = QGradient()
        rr.addStopsToGradient(g, 0.5)
        res = [(round(stop[0], 2), round(stop[1].hsvHueF(), 2),
                round(stop[1].hsvSaturationF(),
                      2), round(stop[1].valueF(),
                                2), round(stop[1].alphaF(), 2))
               for stop in g.stops()]
        self.assertEqual(res, [(0.0, 0.2, 0.3, 0.4, 0.5),
                               (0.05, 0.19, 0.34, 0.4, 0.47),
                               (0.1, 0.18, 0.38, 0.39, 0.45),
                               (0.15, 0.17, 0.42, 0.38, 0.42),
                               (0.2, 0.17, 0.46, 0.38, 0.4),
                               (0.25, 0.16, 0.49, 0.37, 0.37),
                               (0.3, 0.15, 0.53, 0.36, 0.35),
                               (0.35, 0.14, 0.56, 0.35, 0.33),
                               (0.4, 0.13, 0.59, 0.35, 0.3),
                               (0.45, 0.12, 0.62, 0.33, 0.27),
                               (0.5, 0.12, 0.65, 0.32, 0.25),
                               (0.55, 0.11, 0.67, 0.31, 0.22),
                               (0.6, 0.1, 0.7, 0.3, 0.2),
                               (0.65, 0.19, 0.74, 0.34, 0.24),
                               (0.7, 0.28, 0.78, 0.38, 0.27),
                               (0.75, 0.36, 0.81, 0.41, 0.31),
                               (0.8, 0.45, 0.85, 0.45, 0.35),
                               (0.85, 0.54, 0.89, 0.49, 0.39),
                               (0.9, 0.62, 0.93, 0.53, 0.42),
                               (0.95, 0.71, 0.96, 0.56, 0.46),
                               (1.0, 0.8, 1.0, 0.6, 0.5)])

        # test that stops are ordered when setting them
        # first add some out-of-order stops
        r.setStops([
            QgsGradientStop(0.4, QColor(100, 100, 40)),
            QgsGradientStop(0.2, QColor(200, 200, 80)),
            QgsGradientStop(0.8, QColor(50, 20, 10)),
            QgsGradientStop(0.6, QColor(10, 10, 4))
        ])
        s = r.stops()
        self.assertEqual(len(s), 4)
        self.assertEqual(s[0].offset, 0.2)
        self.assertEqual(s[0].color, QColor(200, 200, 80))
        self.assertEqual(s[1].offset, 0.4)
        self.assertEqual(s[1].color, QColor(100, 100, 40))
        self.assertEqual(s[2].offset, 0.6)
        self.assertEqual(s[2].color, QColor(10, 10, 4))
        self.assertEqual(s[3].offset, 0.8)
        self.assertEqual(s[3].color, QColor(50, 20, 10))

        # test continuous invert function
        r.invert()
        self.assertEqual(r.color(0), QColor(0, 200, 0))
        self.assertEqual(r.color(1), QColor(200, 0, 0))
        self.assertEqual(r.color(0.2), QColor(50, 20, 10))

        # test discrete invert function
        r = QgsGradientColorRamp(QColor(255, 255, 255), QColor(
            0, 0, 0), True, [
                QgsGradientStop(0.33, QColor(128, 128, 128)),
                QgsGradientStop(0.66, QColor(0, 0, 0))
            ])
        self.assertEqual(r.color(0.2), QColor(255, 255, 255))
        self.assertEqual(r.color(0.5), QColor(128, 128, 128))
        self.assertEqual(r.color(0.8), QColor(0, 0, 0))
        r.invert()
        self.assertEqual(r.color(0.2), QColor(0, 0, 0))
        self.assertEqual(r.color(0.5), QColor(128, 128, 128))
        self.assertEqual(r.color(0.8), QColor(255, 255, 255))

        # test invalid value range
        r = QgsGradientColorRamp(color1=QColor(0, 0, 255),
                                 color2=QColor(0, 255, 0),
                                 discrete=False)
        self.assertEqual(r.color(0), QColor(0, 0, 255))
        self.assertEqual(r.color(1), QColor(0, 255, 0))
        self.assertEqual(r.color(0.5).name(), QColor(0, 128, 128).name())
        self.assertEqual(r.color(2), QColor(0, 255, 0))
        self.assertEqual(r.color(-1), QColor(0, 0, 255))
        self.assertEqual(r.color(float('nan')), QColor(0, 255, 0))
コード例 #3
0
    def testQgsVectorGradientRampV2(self):
        # test QgsGradientStop
        stop = QgsGradientStop(0.9, QColor(200, 150, 100))
        self.assertEqual(stop.offset, 0.9)
        self.assertEqual(stop.color, QColor(200, 150, 100))
        self.assertEqual(QgsGradientStop(0.1, QColor(180, 20, 30)),
                         QgsGradientStop(0.1, QColor(180, 20, 30)))
        self.assertNotEqual(QgsGradientStop(0.1, QColor(180, 20, 30)),
                            QgsGradientStop(0.2, QColor(180, 20, 30)))
        self.assertNotEqual(QgsGradientStop(0.1, QColor(180, 20, 30)),
                            QgsGradientStop(0.1, QColor(180, 40, 30)))

        # test gradient with only start/end color
        r = QgsGradientColorRamp(QColor(200, 0, 0, 100),
                                 QColor(0, 200, 0, 200))
        self.assertEqual(r.type(), 'gradient')
        self.assertEqual(r.color1(), QColor(200, 0, 0, 100))
        self.assertEqual(r.color2(), QColor(0, 200, 0, 200))
        self.assertEqual(r.isDiscrete(), False)
        self.assertEqual(len(r.stops()), 0)
        self.assertEqual(r.count(), 2)
        self.assertEqual(r.value(0), 0.0)
        self.assertEqual(r.value(1), 1.0)
        self.assertEqual(r.color(0), QColor(200, 0, 0, 100))
        self.assertEqual(r.color(1), QColor(0, 200, 0, 200))
        self.assertEqual(r.color(0.5), QColor(100, 100, 0, 150))

        # test gradient with stops
        r = QgsGradientColorRamp(QColor(200, 0, 0), QColor(0, 200, 0), False, [
            QgsGradientStop(0.1, QColor(180, 20, 40)),
            QgsGradientStop(0.9, QColor(40, 60, 100))
        ])
        self.assertEqual(r.color1(), QColor(200, 0, 0))
        self.assertEqual(r.color2(), QColor(0, 200, 0))
        self.assertEqual(r.isDiscrete(), False)
        self.assertEqual(len(r.stops()), 2)
        self.assertEqual(r.count(), 4)
        self.assertEqual(r.value(0), 0.0)
        self.assertEqual(r.value(1), 0.1)
        self.assertEqual(r.value(2), 0.9)
        self.assertEqual(r.value(3), 1.0)
        self.assertEqual(r.color(0), QColor(200, 0, 0))
        self.assertEqual(r.color(0.05), QColor(190, 10, 20))
        self.assertEqual(r.color(0.1), QColor(180, 20, 40))
        self.assertEqual(r.color(0.5), QColor(110, 40, 70))
        self.assertEqual(r.color(0.9), QColor(40, 60, 100))
        self.assertEqual(r.color(0.95), QColor(20, 130, 50))
        self.assertEqual(r.color(1), QColor(0, 200, 0))

        # test setters
        r.setColor1(QColor(0, 0, 200))
        self.assertEqual(r.color1(), QColor(0, 0, 200))
        self.assertEqual(r.color(0), QColor(0, 0, 200))
        r.setColor2(QColor(0, 0, 100))
        self.assertEqual(r.color2(), QColor(0, 0, 100))
        self.assertEqual(r.color(1.0), QColor(0, 0, 100))
        r.setStops([QgsGradientStop(0.4, QColor(100, 100, 40))])
        s = r.stops()
        self.assertEqual(len(s), 1)
        self.assertEqual(s[0].offset, 0.4)
        self.assertEqual(s[0].color, QColor(100, 100, 40))

        # test info
        r.setInfo({'key1': 'val1', 'key2': 'val2'})
        self.assertEqual(r.info()['key1'], 'val1')
        self.assertEqual(r.info()['key2'], 'val2')

        # test creating from properties
        props = r.properties()
        fromProps = QgsGradientColorRamp.create(props)
        self.assertEqual(fromProps.color1(), QColor(0, 0, 200))
        self.assertEqual(fromProps.color2(), QColor(0, 0, 100))
        s = fromProps.stops()
        self.assertEqual(len(s), 1)
        self.assertEqual(s[0].offset, 0.4)
        c = QColor(s[0].color)
        self.assertEqual(c, QColor(100, 100, 40))
        self.assertEqual(fromProps.info()['key1'], 'val1')
        self.assertEqual(fromProps.info()['key2'], 'val2')
        self.assertEqual(fromProps.isDiscrete(), False)

        # test cloning ramp
        cloned = r.clone()
        self.assertEqual(cloned.color1(), QColor(0, 0, 200))
        self.assertEqual(cloned.color2(), QColor(0, 0, 100))
        s = cloned.stops()
        self.assertEqual(len(s), 1)
        self.assertEqual(s[0].offset, 0.4)
        c = QColor(s[0].color)
        self.assertEqual(c, QColor(100, 100, 40))
        self.assertEqual(cloned.info()['key1'], 'val1')
        self.assertEqual(cloned.info()['key2'], 'val2')
        self.assertEqual(cloned.isDiscrete(), False)

        # test discrete ramps
        # first with no stops
        d = QgsGradientColorRamp(QColor(200, 0, 0), QColor(0, 200, 0), True)
        self.assertEqual(d.isDiscrete(), True)
        self.assertEqual(d.color(0), QColor(200, 0, 0))
        self.assertEqual(d.color(0.5), QColor(200, 0, 0))
        self.assertEqual(d.color(1), QColor(0, 200, 0))
        # then with stops
        d = QgsGradientColorRamp(QColor(200, 0, 0), QColor(0, 200, 0), True, [
            QgsGradientStop(0.1, QColor(180, 20, 40)),
            QgsGradientStop(0.9, QColor(40, 60, 100))
        ])
        self.assertEqual(d.isDiscrete(), True)
        self.assertEqual(d.color(0), QColor(200, 0, 0))
        self.assertEqual(d.color(0.05), QColor(200, 0, 0))
        self.assertEqual(d.color(0.1), QColor(180, 20, 40))
        self.assertEqual(d.color(0.5), QColor(180, 20, 40))
        self.assertEqual(d.color(0.9), QColor(40, 60, 100))
        self.assertEqual(d.color(0.95), QColor(40, 60, 100))
        self.assertEqual(d.color(1), QColor(0, 200, 0))

        # to gradient
        g = QGradient()
        r = QgsGradientColorRamp(QColor(200, 0, 0), QColor(0, 200, 0), False, [
            QgsGradientStop(0.1, QColor(180, 20, 40)),
            QgsGradientStop(0.9, QColor(40, 60, 100))
        ])
        r.addStopsToGradient(g, 0.5)
        self.assertEqual(len(g.stops()), 4)
        self.assertEqual(g.stops()[0], (0.0, QColor(200, 0, 0, 127)))
        self.assertEqual(g.stops()[1], (0.1, QColor(180, 20, 40, 127)))
        self.assertEqual(g.stops()[2], (0.9, QColor(40, 60, 100, 127)))
        self.assertEqual(g.stops()[3], (1.0, QColor(0, 200, 0, 127)))

        # test that stops are ordered when setting them
        # first add some out-of-order stops
        r.setStops([
            QgsGradientStop(0.4, QColor(100, 100, 40)),
            QgsGradientStop(0.2, QColor(200, 200, 80)),
            QgsGradientStop(0.8, QColor(50, 20, 10)),
            QgsGradientStop(0.6, QColor(10, 10, 4))
        ])
        s = r.stops()
        self.assertEqual(len(s), 4)
        self.assertEqual(s[0].offset, 0.2)
        self.assertEqual(s[0].color, QColor(200, 200, 80))
        self.assertEqual(s[1].offset, 0.4)
        self.assertEqual(s[1].color, QColor(100, 100, 40))
        self.assertEqual(s[2].offset, 0.6)
        self.assertEqual(s[2].color, QColor(10, 10, 4))
        self.assertEqual(s[3].offset, 0.8)
        self.assertEqual(s[3].color, QColor(50, 20, 10))

        # test continuous invert function
        r.invert()
        self.assertEqual(r.color(0), QColor(0, 200, 0))
        self.assertEqual(r.color(1), QColor(200, 0, 0))
        self.assertEqual(r.color(0.2), QColor(50, 20, 10))

        # test discrete invert function
        r = QgsGradientColorRamp(QColor(255, 255, 255), QColor(
            0, 0, 0), True, [
                QgsGradientStop(0.33, QColor(128, 128, 128)),
                QgsGradientStop(0.66, QColor(0, 0, 0))
            ])
        self.assertEqual(r.color(0.2), QColor(255, 255, 255))
        self.assertEqual(r.color(0.5), QColor(128, 128, 128))
        self.assertEqual(r.color(0.8), QColor(0, 0, 0))
        r.invert()
        self.assertEqual(r.color(0.2), QColor(0, 0, 0))
        self.assertEqual(r.color(0.5), QColor(128, 128, 128))
        self.assertEqual(r.color(0.8), QColor(255, 255, 255))
コード例 #4
0
    def style_maps(layer,
                   style_by,
                   iface,
                   output_type='damages-rlzs',
                   perils=None,
                   add_null_class=False,
                   render_higher_on_top=False,
                   repaint=True,
                   use_sgc_style=False):
        symbol = QgsSymbol.defaultSymbol(layer.geometryType())
        # see properties at:
        # https://qgis.org/api/qgsmarkersymbollayerv2_8cpp_source.html#l01073
        symbol.setOpacity(1)
        if isinstance(symbol, QgsMarkerSymbol):
            # do it only for the layer with points
            symbol.symbolLayer(0).setStrokeStyle(Qt.PenStyle(Qt.NoPen))

        style = get_style(layer, iface.messageBar())

        # this is the default, as specified in the user settings
        ramp = QgsGradientColorRamp(style['color_from'], style['color_to'])
        style_mode = style['style_mode']

        # in most cases, we override the user-specified setting, and use
        # instead a setting that was required by scientists
        if output_type in OQ_TO_LAYER_TYPES:
            default_qgs_style = QgsStyle().defaultStyle()
            default_color_ramp_names = default_qgs_style.colorRampNames()
            if output_type in (
                    'damages-rlzs',
                    'avg_losses-rlzs',
                    'avg_losses-stats',
            ):
                # options are EqualInterval, Quantile, Jenks, StdDev, Pretty
                # jenks = natural breaks
                if Qgis.QGIS_VERSION_INT < 31000:
                    style_mode = QgsGraduatedSymbolRenderer.Jenks
                else:
                    style_mode = 'Jenks'
                ramp_type_idx = default_color_ramp_names.index('Reds')
                symbol.setColor(QColor(RAMP_EXTREME_COLORS['Reds']['top']))
                inverted = False
            elif (output_type in ('gmf_data', 'ruptures')
                  or (output_type == 'hmaps' and not use_sgc_style)):
                # options are EqualInterval, Quantile, Jenks, StdDev, Pretty
                # jenks = natural breaks
                if output_type == 'ruptures':
                    if Qgis.QGIS_VERSION_INT < 31000:
                        style_mode = QgsGraduatedSymbolRenderer.Pretty
                    else:
                        style_mode = 'PrettyBreaks'
                else:
                    if Qgis.QGIS_VERSION_INT < 31000:
                        style_mode = QgsGraduatedSymbolRenderer.EqualInterval
                    else:
                        style_mode = 'EqualInterval'
                ramp_type_idx = default_color_ramp_names.index('Spectral')
                inverted = True
                symbol.setColor(QColor(RAMP_EXTREME_COLORS['Reds']['top']))
            elif output_type == 'hmaps' and use_sgc_style:
                # FIXME: for SGC they were using size 10000 map units

                # options are EqualInterval, Quantile, Jenks, StdDev, Pretty
                # jenks = natural breaks
                if Qgis.QGIS_VERSION_INT < 31000:
                    style_mode = QgsGraduatedSymbolRenderer.Pretty
                else:
                    style_mode = 'PrettyBreaks'
                try:
                    ramp_type_idx = default_color_ramp_names.index(
                        'SGC_Green2Red_Hmap_Color_Ramp')
                except ValueError:
                    raise ValueError(
                        'Color ramp SGC_Green2Red_Hmap_Color_Ramp was '
                        'not found. Please import it from '
                        'Settings -> Style Manager, loading '
                        'svir/resources/sgc_green2red_hmap_color_ramp.xml')
                inverted = False
                registry = QgsApplication.symbolLayerRegistry()
                symbol_props = {
                    'name': 'square',
                    'color': '0,0,0',
                    'color_border': '0,0,0',
                    'offset': '0,0',
                    'size': '1.5',  # FIXME
                    'angle': '0',
                }
                square = registry.symbolLayerMetadata(
                    "SimpleMarker").createSymbolLayer(symbol_props)
                symbol = QgsSymbol.defaultSymbol(layer.geometryType()).clone()
                symbol.deleteSymbolLayer(0)
                symbol.appendSymbolLayer(square)
                symbol.symbolLayer(0).setStrokeStyle(Qt.PenStyle(Qt.NoPen))
            elif output_type in ['asset_risk', 'input']:
                # options are EqualInterval, Quantile, Jenks, StdDev, Pretty
                # jenks = natural breaks
                if Qgis.QGIS_VERSION_INT < 31000:
                    style_mode = QgsGraduatedSymbolRenderer.EqualInterval
                else:
                    style_mode = 'EqualInterval'
                # exposure_strings = ['number', 'occupants', 'value']
                # setting exposure colors by default
                colors = {
                    'single': RAMP_EXTREME_COLORS['Blues']['top'],
                    'ramp_name': 'Blues'
                }
                inverted = False
                if output_type == 'asset_risk':
                    damage_strings = perils
                    for damage_string in damage_strings:
                        if damage_string in style_by:
                            colors = {
                                'single':
                                RAMP_EXTREME_COLORS['Spectral']['top'],
                                'ramp_name': 'Spectral'
                            }
                            inverted = True
                            break
                else:  # 'input'
                    colors = {
                        'single': RAMP_EXTREME_COLORS['Greens']['top'],
                        'ramp_name': 'Greens'
                    }
                    symbol.symbolLayer(0).setShape(
                        QgsSimpleMarkerSymbolLayerBase.Square)
                single_color = colors['single']
                ramp_name = colors['ramp_name']
                ramp_type_idx = default_color_ramp_names.index(ramp_name)
                symbol.setColor(QColor(single_color))
            else:
                raise NotImplementedError(
                    'Undefined color ramp for output type %s' % output_type)
            ramp = default_qgs_style.colorRamp(
                default_color_ramp_names[ramp_type_idx])
            if inverted:
                ramp.invert()
        # get unique values
        fni = layer.fields().indexOf(style_by)
        unique_values = layer.dataProvider().uniqueValues(fni)
        num_unique_values = len(unique_values - {NULL})
        if num_unique_values > 2:
            if Qgis.QGIS_VERSION_INT < 31000:
                renderer = QgsGraduatedSymbolRenderer.createRenderer(
                    layer, style_by, min(num_unique_values, style['classes']),
                    style_mode, symbol.clone(), ramp)
            else:
                renderer = QgsGraduatedSymbolRenderer(style_by, [])
                # NOTE: the following returns an instance of one of the
                #       subclasses of QgsClassificationMethod
                classification_method = \
                    QgsApplication.classificationMethodRegistry().method(
                        style_mode)
                renderer.setClassificationMethod(classification_method)
                renderer.updateColorRamp(ramp)
                renderer.updateSymbols(symbol.clone())
                renderer.updateClasses(
                    layer, min(num_unique_values, style['classes']))
            if not use_sgc_style:
                if Qgis.QGIS_VERSION_INT < 31000:
                    label_format = renderer.labelFormat()
                    # NOTE: the following line might be useful
                    # label_format.setTrimTrailingZeroes(True)
                    label_format.setPrecision(2)
                    renderer.setLabelFormat(label_format, updateRanges=True)
                else:
                    renderer.classificationMethod().setLabelPrecision(2)
                    renderer.calculateLabelPrecision()
        elif num_unique_values == 2:
            categories = []
            for unique_value in unique_values:
                symbol = symbol.clone()
                try:
                    symbol.setColor(
                        QColor(RAMP_EXTREME_COLORS[ramp_name]
                               ['bottom' if unique_value ==
                                min(unique_values) else 'top']))
                except Exception:
                    symbol.setColor(
                        QColor(style['color_from'] if unique_value ==
                               min(unique_values) else style['color_to']))
                category = QgsRendererCategory(unique_value, symbol,
                                               str(unique_value))
                # entry for the list of category items
                categories.append(category)
            renderer = QgsCategorizedSymbolRenderer(style_by, categories)
        else:
            renderer = QgsSingleSymbolRenderer(symbol.clone())
        if add_null_class and NULL in unique_values:
            # add a class for NULL values
            rule_renderer = QgsRuleBasedRenderer(symbol.clone())
            root_rule = rule_renderer.rootRule()
            not_null_rule = root_rule.children()[0].clone()
            # strip parentheses from stringified color HSL
            not_null_rule.setFilterExpression(
                '%s IS NOT NULL' % QgsExpression.quotedColumnRef(style_by))
            not_null_rule.setLabel('%s:' % style_by)
            root_rule.appendChild(not_null_rule)
            null_rule = root_rule.children()[0].clone()
            null_rule.setSymbol(
                QgsFillSymbol.createSimple({
                    'color': '160,160,160',
                    'style': 'diagonal_x'
                }))
            null_rule.setFilterExpression(
                '%s IS NULL' % QgsExpression.quotedColumnRef(style_by))
            null_rule.setLabel(tr('No points'))
            root_rule.appendChild(null_rule)
            if isinstance(renderer, QgsGraduatedSymbolRenderer):
                # create value ranges
                rule_renderer.refineRuleRanges(not_null_rule, renderer)
                # remove default rule
            elif isinstance(renderer, QgsCategorizedSymbolRenderer):
                rule_renderer.refineRuleCategoris(not_null_rule, renderer)
            for rule in rule_renderer.rootRule().children()[1].children():
                label = rule.label()
                # by default, labels are like:
                # ('"collapse-structural-ASH_DRY_sum" >= 0.0000 AND
                # "collapse-structural-ASH_DRY_sum" <= 2.3949')
                first, second = label.split(" AND ")
                bottom = first.rsplit(" ", 1)[1]
                top = second.rsplit(" ", 1)[1]
                simplified = "%s - %s" % (bottom, top)
                rule.setLabel(simplified)
            root_rule.removeChildAt(0)
            renderer = rule_renderer
        if render_higher_on_top:
            renderer.setUsingSymbolLevels(True)
            symbol_items = [item for item in renderer.legendSymbolItems()]
            for i in range(len(symbol_items)):
                sym = symbol_items[i].symbol().clone()
                key = symbol_items[i].ruleKey()
                for lay in range(sym.symbolLayerCount()):
                    sym.symbolLayer(lay).setRenderingPass(i)
                renderer.setLegendSymbolItem(key, sym)
        layer.setRenderer(renderer)
        if not use_sgc_style:
            layer.setOpacity(0.7)
        if repaint:
            layer.triggerRepaint()
            iface.setActiveLayer(layer)
            iface.zoomToActiveLayer()
            # NOTE QGIS3: probably not needed
            # iface.layerTreeView().refreshLayerSymbology(layer.id())
            iface.mapCanvas().refresh()