예제 #1
0
 def testContainsList(self):
     self.assertFalse(QgsRasterRange.contains(1, []))
     ranges = [QgsRasterRange(1, 5)]
     self.assertTrue(QgsRasterRange.contains(3, ranges))
     self.assertFalse(QgsRasterRange.contains(13, ranges))
     ranges.append(QgsRasterRange(11, 15))
     self.assertTrue(QgsRasterRange.contains(3, ranges))
     self.assertTrue(QgsRasterRange.contains(13, ranges))
     self.assertFalse(QgsRasterRange.contains(16, ranges))
예제 #2
0
    def testContains(self):
        range = QgsRasterRange(1, 5)
        self.assertTrue(range.contains(1))
        self.assertTrue(range.contains(5))
        self.assertTrue(range.contains(4))
        self.assertTrue(range.contains(1.00001))
        self.assertTrue(range.contains(4.99999))
        self.assertFalse(range.contains(0.99999))
        self.assertFalse(range.contains(5.00001))

        # with nan min/maxs
        range = QgsRasterRange()
        self.assertTrue(range.contains(1))
        self.assertTrue(range.contains(-909999999))
        self.assertTrue(range.contains(999999999))
        range.setMin(5)
        self.assertFalse(range.contains(0))
        self.assertTrue(range.contains(5))
        self.assertTrue(range.contains(10000000))

        range = QgsRasterRange()
        range.setMax(5)
        self.assertFalse(range.contains(6))
        self.assertTrue(range.contains(5))
        self.assertTrue(range.contains(-99999))

        range = QgsRasterRange(1, 5, QgsRasterRange.IncludeMax)
        self.assertFalse(range.contains(0))
        self.assertFalse(range.contains(1))
        self.assertTrue(range.contains(2))
        self.assertTrue(range.contains(5))
        self.assertFalse(range.contains(6))

        range = QgsRasterRange(1, 5, QgsRasterRange.IncludeMin)
        self.assertFalse(range.contains(0))
        self.assertTrue(range.contains(1))
        self.assertTrue(range.contains(2))
        self.assertFalse(range.contains(5))
        self.assertFalse(range.contains(6))

        range = QgsRasterRange(1, 5, QgsRasterRange.Exclusive)
        self.assertFalse(range.contains(0))
        self.assertFalse(range.contains(1))
        self.assertTrue(range.contains(2))
        self.assertFalse(range.contains(5))
        self.assertFalse(range.contains(6))
예제 #3
0
 def testEquality(self):
     range = QgsRasterRange(1, 5)
     range2 = QgsRasterRange(1, 5)
     self.assertEqual(range, range2)
     range2.setMin(2)
     self.assertNotEqual(range, range2)
     range2.setMin(1)
     range2.setMax(4)
     self.assertNotEqual(range, range2)
     range2.setMax(5)
     self.assertEqual(range, range2)
     range.setBounds(QgsRasterRange.IncludeMax)
     self.assertNotEqual(range, range2)
     range2.setBounds(QgsRasterRange.IncludeMax)
     self.assertEqual(range, range2)
     range = QgsRasterRange()
     range2 = QgsRasterRange()
     self.assertEqual(range, range2)
     range.setMin(1)
     self.assertNotEqual(range, range2)
     range2.setMin(1)
     self.assertEqual(range, range2)
     range = QgsRasterRange()
     range2 = QgsRasterRange()
     range.setMax(5)
     self.assertNotEqual(range, range2)
     range2.setMax(5)
     self.assertEqual(range, range2)
예제 #4
0
 def testBasic(self):
     range = QgsRasterRange(1, 5)
     self.assertEqual(range.min(), 1)
     self.assertEqual(range.max(), 5)
     range.setMin(2.2)
     range.setMax(10.4)
     self.assertEqual(range.min(), 2.2)
     self.assertEqual(range.max(), 10.4)
     self.assertEqual(range.bounds(), QgsRasterRange.IncludeMinAndMax)
     range.setBounds(QgsRasterRange.IncludeMin)
     self.assertEqual(range.bounds(), QgsRasterRange.IncludeMin)
예제 #5
0
    def testOverlaps(self):
        # includes both ends
        range = QgsRasterRange(0, 10, QgsRasterRange.IncludeMinAndMax)
        self.assertTrue(range.overlaps(QgsRasterRange(1, 9)))
        self.assertTrue(range.overlaps(QgsRasterRange(1, 10)))
        self.assertTrue(range.overlaps(QgsRasterRange(1, 11)))
        self.assertTrue(range.overlaps(QgsRasterRange(0, 9)))
        self.assertTrue(range.overlaps(QgsRasterRange(0, 10)))
        self.assertTrue(range.overlaps(QgsRasterRange(0, 11)))
        self.assertTrue(range.overlaps(QgsRasterRange(-1, 10)))
        self.assertTrue(range.overlaps(QgsRasterRange(-1, 9)))
        self.assertTrue(range.overlaps(QgsRasterRange(1, 11)))
        self.assertTrue(range.overlaps(QgsRasterRange(-1, 11)))
        self.assertTrue(range.overlaps(QgsRasterRange(10, 11)))
        self.assertTrue(range.overlaps(QgsRasterRange(-1, 0)))
        self.assertFalse(range.overlaps(QgsRasterRange(-10, -1)))
        self.assertFalse(range.overlaps(QgsRasterRange(11, 12)))
        self.assertTrue(range.overlaps(QgsRasterRange(-1, float('NaN'))))
        self.assertTrue(range.overlaps(QgsRasterRange(0, float('NaN'))))
        self.assertTrue(range.overlaps(QgsRasterRange(1, float('NaN'))))
        self.assertTrue(range.overlaps(QgsRasterRange(10, float('NaN'))))
        self.assertFalse(range.overlaps(QgsRasterRange(11, float('NaN'))))
        self.assertFalse(range.overlaps(QgsRasterRange(float('NaN'), -1)))
        self.assertTrue(range.overlaps(QgsRasterRange(float('NaN'), 0)))
        self.assertTrue(range.overlaps(QgsRasterRange(float('NaN'), 1)))
        self.assertTrue(range.overlaps(QgsRasterRange(float('NaN'), 10)))
        self.assertTrue(range.overlaps(QgsRasterRange(float('NaN'), 11)))
        self.assertTrue(range.overlaps(QgsRasterRange(float('NaN'), float('NaN'))))
        self.assertFalse(range.overlaps(QgsRasterRange(-1, 0, QgsRasterRange.Exclusive)))
        self.assertFalse(range.overlaps(QgsRasterRange(-1, 0, QgsRasterRange.IncludeMin)))
        self.assertTrue(range.overlaps(QgsRasterRange(-1, 0, QgsRasterRange.IncludeMax)))
        self.assertFalse(range.overlaps(QgsRasterRange(10, 11, QgsRasterRange.Exclusive)))
        self.assertTrue(range.overlaps(QgsRasterRange(10, 11, QgsRasterRange.IncludeMin)))
        self.assertFalse(range.overlaps(QgsRasterRange(10, 11, QgsRasterRange.IncludeMax)))

        range = QgsRasterRange(float('NaN'), 10, QgsRasterRange.IncludeMinAndMax)
        self.assertTrue(range.overlaps(QgsRasterRange(1, 9)))
        self.assertTrue(range.overlaps(QgsRasterRange(1, 10)))
        self.assertTrue(range.overlaps(QgsRasterRange(1, 11)))
        self.assertTrue(range.overlaps(QgsRasterRange(0, 9)))
        self.assertTrue(range.overlaps(QgsRasterRange(0, 10)))
        self.assertTrue(range.overlaps(QgsRasterRange(0, 11)))
        self.assertTrue(range.overlaps(QgsRasterRange(-1, 10)))
        self.assertTrue(range.overlaps(QgsRasterRange(-1, 9)))
        self.assertTrue(range.overlaps(QgsRasterRange(1, 11)))
        self.assertTrue(range.overlaps(QgsRasterRange(-1, 11)))
        self.assertTrue(range.overlaps(QgsRasterRange(10, 11)))
        self.assertTrue(range.overlaps(QgsRasterRange(-1, 0)))
        self.assertTrue(range.overlaps(QgsRasterRange(-10, -1)))
        self.assertFalse(range.overlaps(QgsRasterRange(11, 12)))
        self.assertTrue(range.overlaps(QgsRasterRange(-1, float('NaN'))))
        self.assertTrue(range.overlaps(QgsRasterRange(0, float('NaN'))))
        self.assertTrue(range.overlaps(QgsRasterRange(1, float('NaN'))))
        self.assertTrue(range.overlaps(QgsRasterRange(10, float('NaN'))))
        self.assertFalse(range.overlaps(QgsRasterRange(11, float('NaN'))))
        self.assertTrue(range.overlaps(QgsRasterRange(float('NaN'), -1)))
        self.assertTrue(range.overlaps(QgsRasterRange(float('NaN'), 0)))
        self.assertTrue(range.overlaps(QgsRasterRange(float('NaN'), 1)))
        self.assertTrue(range.overlaps(QgsRasterRange(float('NaN'), 10)))
        self.assertTrue(range.overlaps(QgsRasterRange(float('NaN'), 11)))
        self.assertTrue(range.overlaps(QgsRasterRange(float('NaN'), float('NaN'))))
        self.assertTrue(range.overlaps(QgsRasterRange(-1, 0, QgsRasterRange.Exclusive)))
        self.assertTrue(range.overlaps(QgsRasterRange(-1, 0, QgsRasterRange.IncludeMin)))
        self.assertTrue(range.overlaps(QgsRasterRange(-1, 0, QgsRasterRange.IncludeMax)))
        self.assertFalse(range.overlaps(QgsRasterRange(10, 11, QgsRasterRange.Exclusive)))
        self.assertTrue(range.overlaps(QgsRasterRange(10, 11, QgsRasterRange.IncludeMin)))
        self.assertFalse(range.overlaps(QgsRasterRange(10, 11, QgsRasterRange.IncludeMax)))

        range = QgsRasterRange(0, float('NaN'), QgsRasterRange.IncludeMinAndMax)
        self.assertTrue(range.overlaps(QgsRasterRange(1, 9)))
        self.assertTrue(range.overlaps(QgsRasterRange(1, 10)))
        self.assertTrue(range.overlaps(QgsRasterRange(1, 11)))
        self.assertTrue(range.overlaps(QgsRasterRange(0, 9)))
        self.assertTrue(range.overlaps(QgsRasterRange(0, 10)))
        self.assertTrue(range.overlaps(QgsRasterRange(0, 11)))
        self.assertTrue(range.overlaps(QgsRasterRange(-1, 10)))
        self.assertTrue(range.overlaps(QgsRasterRange(-1, 9)))
        self.assertTrue(range.overlaps(QgsRasterRange(1, 11)))
        self.assertTrue(range.overlaps(QgsRasterRange(-1, 11)))
        self.assertTrue(range.overlaps(QgsRasterRange(10, 11)))
        self.assertTrue(range.overlaps(QgsRasterRange(-1, 0)))
        self.assertFalse(range.overlaps(QgsRasterRange(-10, -1)))
        self.assertTrue(range.overlaps(QgsRasterRange(11, 12)))
        self.assertTrue(range.overlaps(QgsRasterRange(-1, float('NaN'))))
        self.assertTrue(range.overlaps(QgsRasterRange(0, float('NaN'))))
        self.assertTrue(range.overlaps(QgsRasterRange(1, float('NaN'))))
        self.assertTrue(range.overlaps(QgsRasterRange(10, float('NaN'))))
        self.assertTrue(range.overlaps(QgsRasterRange(11, float('NaN'))))
        self.assertFalse(range.overlaps(QgsRasterRange(float('NaN'), -1)))
        self.assertTrue(range.overlaps(QgsRasterRange(float('NaN'), 0)))
        self.assertTrue(range.overlaps(QgsRasterRange(float('NaN'), 1)))
        self.assertTrue(range.overlaps(QgsRasterRange(float('NaN'), 10)))
        self.assertTrue(range.overlaps(QgsRasterRange(float('NaN'), 11)))
        self.assertTrue(range.overlaps(QgsRasterRange(float('NaN'), float('NaN'))))
        self.assertFalse(range.overlaps(QgsRasterRange(-1, 0, QgsRasterRange.Exclusive)))
        self.assertFalse(range.overlaps(QgsRasterRange(-1, 0, QgsRasterRange.IncludeMin)))
        self.assertTrue(range.overlaps(QgsRasterRange(-1, 0, QgsRasterRange.IncludeMax)))
        self.assertTrue(range.overlaps(QgsRasterRange(10, 11, QgsRasterRange.Exclusive)))
        self.assertTrue(range.overlaps(QgsRasterRange(10, 11, QgsRasterRange.IncludeMin)))
        self.assertTrue(range.overlaps(QgsRasterRange(10, 11, QgsRasterRange.IncludeMax)))

        # includes left end
        range = QgsRasterRange(0, 10, QgsRasterRange.IncludeMin)
        self.assertTrue(range.overlaps(QgsRasterRange(1, 9)))
        self.assertTrue(range.overlaps(QgsRasterRange(1, 10)))
        self.assertTrue(range.overlaps(QgsRasterRange(1, 11)))
        self.assertTrue(range.overlaps(QgsRasterRange(0, 9)))
        self.assertTrue(range.overlaps(QgsRasterRange(0, 10)))
        self.assertTrue(range.overlaps(QgsRasterRange(0, 11)))
        self.assertTrue(range.overlaps(QgsRasterRange(-1, 10)))
        self.assertTrue(range.overlaps(QgsRasterRange(-1, 9)))
        self.assertTrue(range.overlaps(QgsRasterRange(1, 11)))
        self.assertTrue(range.overlaps(QgsRasterRange(-1, 11)))
        self.assertFalse(range.overlaps(QgsRasterRange(10, 11)))
        self.assertTrue(range.overlaps(QgsRasterRange(-1, 0)))
        self.assertFalse(range.overlaps(QgsRasterRange(-10, -1)))
        self.assertFalse(range.overlaps(QgsRasterRange(11, 12)))
        self.assertTrue(range.overlaps(QgsRasterRange(-1, float('NaN'))))
        self.assertTrue(range.overlaps(QgsRasterRange(0, float('NaN'))))
        self.assertTrue(range.overlaps(QgsRasterRange(1, float('NaN'))))
        self.assertFalse(range.overlaps(QgsRasterRange(10, float('NaN'))))
        self.assertFalse(range.overlaps(QgsRasterRange(11, float('NaN'))))
        self.assertFalse(range.overlaps(QgsRasterRange(float('NaN'), -1)))
        self.assertTrue(range.overlaps(QgsRasterRange(float('NaN'), 0)))
        self.assertTrue(range.overlaps(QgsRasterRange(float('NaN'), 1)))
        self.assertTrue(range.overlaps(QgsRasterRange(float('NaN'), 10)))
        self.assertTrue(range.overlaps(QgsRasterRange(float('NaN'), 11)))
        self.assertTrue(range.overlaps(QgsRasterRange(float('NaN'), float('NaN'))))
        self.assertFalse(range.overlaps(QgsRasterRange(-1, 0, QgsRasterRange.Exclusive)))
        self.assertFalse(range.overlaps(QgsRasterRange(-1, 0, QgsRasterRange.IncludeMin)))
        self.assertTrue(range.overlaps(QgsRasterRange(-1, 0, QgsRasterRange.IncludeMax)))
        self.assertFalse(range.overlaps(QgsRasterRange(10, 11, QgsRasterRange.Exclusive)))
        self.assertFalse(range.overlaps(QgsRasterRange(10, 11, QgsRasterRange.IncludeMin)))
        self.assertFalse(range.overlaps(QgsRasterRange(10, 11, QgsRasterRange.IncludeMax)))

        # includes right end
        range = QgsRasterRange(0, 10, QgsRasterRange.IncludeMax)
        self.assertTrue(range.overlaps(QgsRasterRange(1, 9)))
        self.assertTrue(range.overlaps(QgsRasterRange(1, 10)))
        self.assertTrue(range.overlaps(QgsRasterRange(1, 11)))
        self.assertTrue(range.overlaps(QgsRasterRange(0, 9)))
        self.assertTrue(range.overlaps(QgsRasterRange(0, 10)))
        self.assertTrue(range.overlaps(QgsRasterRange(0, 11)))
        self.assertTrue(range.overlaps(QgsRasterRange(-1, 10)))
        self.assertTrue(range.overlaps(QgsRasterRange(-1, 9)))
        self.assertTrue(range.overlaps(QgsRasterRange(1, 11)))
        self.assertTrue(range.overlaps(QgsRasterRange(-1, 11)))
        self.assertTrue(range.overlaps(QgsRasterRange(10, 11)))
        self.assertFalse(range.overlaps(QgsRasterRange(-1, 0)))
        self.assertFalse(range.overlaps(QgsRasterRange(-10, -1)))
        self.assertFalse(range.overlaps(QgsRasterRange(11, 12)))
        self.assertTrue(range.overlaps(QgsRasterRange(-1, float('NaN'))))
        self.assertTrue(range.overlaps(QgsRasterRange(0, 50)))
        self.assertTrue(range.overlaps(QgsRasterRange(1, float('NaN'))))
        self.assertTrue(range.overlaps(QgsRasterRange(10, float('NaN'))))
        self.assertFalse(range.overlaps(QgsRasterRange(11, float('NaN'))))
        self.assertFalse(range.overlaps(QgsRasterRange(float('NaN'), -1)))
        self.assertFalse(range.overlaps(QgsRasterRange(float('NaN'), 0)))
        self.assertTrue(range.overlaps(QgsRasterRange(float('NaN'), 1)))
        self.assertTrue(range.overlaps(QgsRasterRange(float('NaN'), 10)))
        self.assertTrue(range.overlaps(QgsRasterRange(float('NaN'), 11)))
        self.assertTrue(range.overlaps(QgsRasterRange(float('NaN'), float('NaN'))))
        self.assertFalse(range.overlaps(QgsRasterRange(-1, 0, QgsRasterRange.Exclusive)))
        self.assertFalse(range.overlaps(QgsRasterRange(-1, 0, QgsRasterRange.IncludeMin)))
        self.assertFalse(range.overlaps(QgsRasterRange(-1, 0, QgsRasterRange.IncludeMax)))
        self.assertFalse(range.overlaps(QgsRasterRange(10, 11, QgsRasterRange.Exclusive)))
        self.assertTrue(range.overlaps(QgsRasterRange(10, 11, QgsRasterRange.IncludeMin)))
        self.assertFalse(range.overlaps(QgsRasterRange(10, 11, QgsRasterRange.IncludeMax)))

        # includes neither end
        range = QgsRasterRange(0, 10, QgsRasterRange.Exclusive)
        self.assertTrue(range.overlaps(QgsRasterRange(1, 9)))
        self.assertTrue(range.overlaps(QgsRasterRange(1, 10)))
        self.assertTrue(range.overlaps(QgsRasterRange(1, 11)))
        self.assertTrue(range.overlaps(QgsRasterRange(0, 9)))
        self.assertTrue(range.overlaps(QgsRasterRange(0, 10)))
        self.assertTrue(range.overlaps(QgsRasterRange(-1, 10)))
        self.assertTrue(range.overlaps(QgsRasterRange(-1, 9)))
        self.assertTrue(range.overlaps(QgsRasterRange(1, 11)))
        self.assertTrue(range.overlaps(QgsRasterRange(-1, 11)))
        self.assertFalse(range.overlaps(QgsRasterRange(10, 11)))
        self.assertFalse(range.overlaps(QgsRasterRange(-1, 0)))
        self.assertFalse(range.overlaps(QgsRasterRange(-10, -1)))
        self.assertFalse(range.overlaps(QgsRasterRange(11, 12)))
        self.assertTrue(range.overlaps(QgsRasterRange(-1, float('NaN'))))
        self.assertTrue(range.overlaps(QgsRasterRange(1, float('NaN'))))
        self.assertFalse(range.overlaps(QgsRasterRange(10, float('NaN'))))
        self.assertFalse(range.overlaps(QgsRasterRange(11, float('NaN'))))
        self.assertFalse(range.overlaps(QgsRasterRange(float('NaN'), -1)))
        self.assertFalse(range.overlaps(QgsRasterRange(float('NaN'), 0)))
        self.assertTrue(range.overlaps(QgsRasterRange(float('NaN'), 1)))
        self.assertTrue(range.overlaps(QgsRasterRange(float('NaN'), 10)))
        self.assertTrue(range.overlaps(QgsRasterRange(float('NaN'), 11)))
        self.assertTrue(range.overlaps(QgsRasterRange(float('NaN'), float('NaN'))))
        self.assertFalse(range.overlaps(QgsRasterRange(-1, 0, QgsRasterRange.Exclusive)))
        self.assertFalse(range.overlaps(QgsRasterRange(-1, 0, QgsRasterRange.IncludeMin)))
        self.assertFalse(range.overlaps(QgsRasterRange(-1, 0, QgsRasterRange.IncludeMax)))
        self.assertFalse(range.overlaps(QgsRasterRange(10, 11, QgsRasterRange.Exclusive)))
        self.assertFalse(range.overlaps(QgsRasterRange(10, 11, QgsRasterRange.IncludeMin)))
        self.assertFalse(range.overlaps(QgsRasterRange(10, 11, QgsRasterRange.IncludeMax)))
예제 #6
0
    def testOverlaps(self):
        # includes both ends
        range = QgsRasterRange(0, 10, QgsRasterRange.IncludeMinAndMax)
        self.assertTrue(range.overlaps(QgsRasterRange(1, 9)))
        self.assertTrue(range.overlaps(QgsRasterRange(1, 10)))
        self.assertTrue(range.overlaps(QgsRasterRange(1, 11)))
        self.assertTrue(range.overlaps(QgsRasterRange(0, 9)))
        self.assertTrue(range.overlaps(QgsRasterRange(0, 10)))
        self.assertTrue(range.overlaps(QgsRasterRange(0, 11)))
        self.assertTrue(range.overlaps(QgsRasterRange(-1, 10)))
        self.assertTrue(range.overlaps(QgsRasterRange(-1, 9)))
        self.assertTrue(range.overlaps(QgsRasterRange(1, 11)))
        self.assertTrue(range.overlaps(QgsRasterRange(-1, 11)))
        self.assertTrue(range.overlaps(QgsRasterRange(10, 11)))
        self.assertTrue(range.overlaps(QgsRasterRange(-1, 0)))
        self.assertFalse(range.overlaps(QgsRasterRange(-10, -1)))
        self.assertFalse(range.overlaps(QgsRasterRange(11, 12)))
        self.assertTrue(range.overlaps(QgsRasterRange(-1, float('NaN'))))
        self.assertTrue(range.overlaps(QgsRasterRange(0, float('NaN'))))
        self.assertTrue(range.overlaps(QgsRasterRange(1, float('NaN'))))
        self.assertTrue(range.overlaps(QgsRasterRange(10, float('NaN'))))
        self.assertFalse(range.overlaps(QgsRasterRange(11, float('NaN'))))
        self.assertFalse(range.overlaps(QgsRasterRange(float('NaN'), -1)))
        self.assertTrue(range.overlaps(QgsRasterRange(float('NaN'), 0)))
        self.assertTrue(range.overlaps(QgsRasterRange(float('NaN'), 1)))
        self.assertTrue(range.overlaps(QgsRasterRange(float('NaN'), 10)))
        self.assertTrue(range.overlaps(QgsRasterRange(float('NaN'), 11)))
        self.assertTrue(
            range.overlaps(QgsRasterRange(float('NaN'), float('NaN'))))
        self.assertFalse(
            range.overlaps(QgsRasterRange(-1, 0, QgsRasterRange.Exclusive)))
        self.assertFalse(
            range.overlaps(QgsRasterRange(-1, 0, QgsRasterRange.IncludeMin)))
        self.assertTrue(
            range.overlaps(QgsRasterRange(-1, 0, QgsRasterRange.IncludeMax)))
        self.assertFalse(
            range.overlaps(QgsRasterRange(10, 11, QgsRasterRange.Exclusive)))
        self.assertTrue(
            range.overlaps(QgsRasterRange(10, 11, QgsRasterRange.IncludeMin)))
        self.assertFalse(
            range.overlaps(QgsRasterRange(10, 11, QgsRasterRange.IncludeMax)))

        range = QgsRasterRange(float('NaN'), 10,
                               QgsRasterRange.IncludeMinAndMax)
        self.assertTrue(range.overlaps(QgsRasterRange(1, 9)))
        self.assertTrue(range.overlaps(QgsRasterRange(1, 10)))
        self.assertTrue(range.overlaps(QgsRasterRange(1, 11)))
        self.assertTrue(range.overlaps(QgsRasterRange(0, 9)))
        self.assertTrue(range.overlaps(QgsRasterRange(0, 10)))
        self.assertTrue(range.overlaps(QgsRasterRange(0, 11)))
        self.assertTrue(range.overlaps(QgsRasterRange(-1, 10)))
        self.assertTrue(range.overlaps(QgsRasterRange(-1, 9)))
        self.assertTrue(range.overlaps(QgsRasterRange(1, 11)))
        self.assertTrue(range.overlaps(QgsRasterRange(-1, 11)))
        self.assertTrue(range.overlaps(QgsRasterRange(10, 11)))
        self.assertTrue(range.overlaps(QgsRasterRange(-1, 0)))
        self.assertTrue(range.overlaps(QgsRasterRange(-10, -1)))
        self.assertFalse(range.overlaps(QgsRasterRange(11, 12)))
        self.assertTrue(range.overlaps(QgsRasterRange(-1, float('NaN'))))
        self.assertTrue(range.overlaps(QgsRasterRange(0, float('NaN'))))
        self.assertTrue(range.overlaps(QgsRasterRange(1, float('NaN'))))
        self.assertTrue(range.overlaps(QgsRasterRange(10, float('NaN'))))
        self.assertFalse(range.overlaps(QgsRasterRange(11, float('NaN'))))
        self.assertTrue(range.overlaps(QgsRasterRange(float('NaN'), -1)))
        self.assertTrue(range.overlaps(QgsRasterRange(float('NaN'), 0)))
        self.assertTrue(range.overlaps(QgsRasterRange(float('NaN'), 1)))
        self.assertTrue(range.overlaps(QgsRasterRange(float('NaN'), 10)))
        self.assertTrue(range.overlaps(QgsRasterRange(float('NaN'), 11)))
        self.assertTrue(
            range.overlaps(QgsRasterRange(float('NaN'), float('NaN'))))
        self.assertTrue(
            range.overlaps(QgsRasterRange(-1, 0, QgsRasterRange.Exclusive)))
        self.assertTrue(
            range.overlaps(QgsRasterRange(-1, 0, QgsRasterRange.IncludeMin)))
        self.assertTrue(
            range.overlaps(QgsRasterRange(-1, 0, QgsRasterRange.IncludeMax)))
        self.assertFalse(
            range.overlaps(QgsRasterRange(10, 11, QgsRasterRange.Exclusive)))
        self.assertTrue(
            range.overlaps(QgsRasterRange(10, 11, QgsRasterRange.IncludeMin)))
        self.assertFalse(
            range.overlaps(QgsRasterRange(10, 11, QgsRasterRange.IncludeMax)))

        range = QgsRasterRange(0, float('NaN'),
                               QgsRasterRange.IncludeMinAndMax)
        self.assertTrue(range.overlaps(QgsRasterRange(1, 9)))
        self.assertTrue(range.overlaps(QgsRasterRange(1, 10)))
        self.assertTrue(range.overlaps(QgsRasterRange(1, 11)))
        self.assertTrue(range.overlaps(QgsRasterRange(0, 9)))
        self.assertTrue(range.overlaps(QgsRasterRange(0, 10)))
        self.assertTrue(range.overlaps(QgsRasterRange(0, 11)))
        self.assertTrue(range.overlaps(QgsRasterRange(-1, 10)))
        self.assertTrue(range.overlaps(QgsRasterRange(-1, 9)))
        self.assertTrue(range.overlaps(QgsRasterRange(1, 11)))
        self.assertTrue(range.overlaps(QgsRasterRange(-1, 11)))
        self.assertTrue(range.overlaps(QgsRasterRange(10, 11)))
        self.assertTrue(range.overlaps(QgsRasterRange(-1, 0)))
        self.assertFalse(range.overlaps(QgsRasterRange(-10, -1)))
        self.assertTrue(range.overlaps(QgsRasterRange(11, 12)))
        self.assertTrue(range.overlaps(QgsRasterRange(-1, float('NaN'))))
        self.assertTrue(range.overlaps(QgsRasterRange(0, float('NaN'))))
        self.assertTrue(range.overlaps(QgsRasterRange(1, float('NaN'))))
        self.assertTrue(range.overlaps(QgsRasterRange(10, float('NaN'))))
        self.assertTrue(range.overlaps(QgsRasterRange(11, float('NaN'))))
        self.assertFalse(range.overlaps(QgsRasterRange(float('NaN'), -1)))
        self.assertTrue(range.overlaps(QgsRasterRange(float('NaN'), 0)))
        self.assertTrue(range.overlaps(QgsRasterRange(float('NaN'), 1)))
        self.assertTrue(range.overlaps(QgsRasterRange(float('NaN'), 10)))
        self.assertTrue(range.overlaps(QgsRasterRange(float('NaN'), 11)))
        self.assertTrue(
            range.overlaps(QgsRasterRange(float('NaN'), float('NaN'))))
        self.assertFalse(
            range.overlaps(QgsRasterRange(-1, 0, QgsRasterRange.Exclusive)))
        self.assertFalse(
            range.overlaps(QgsRasterRange(-1, 0, QgsRasterRange.IncludeMin)))
        self.assertTrue(
            range.overlaps(QgsRasterRange(-1, 0, QgsRasterRange.IncludeMax)))
        self.assertTrue(
            range.overlaps(QgsRasterRange(10, 11, QgsRasterRange.Exclusive)))
        self.assertTrue(
            range.overlaps(QgsRasterRange(10, 11, QgsRasterRange.IncludeMin)))
        self.assertTrue(
            range.overlaps(QgsRasterRange(10, 11, QgsRasterRange.IncludeMax)))

        # includes left end
        range = QgsRasterRange(0, 10, QgsRasterRange.IncludeMin)
        self.assertTrue(range.overlaps(QgsRasterRange(1, 9)))
        self.assertTrue(range.overlaps(QgsRasterRange(1, 10)))
        self.assertTrue(range.overlaps(QgsRasterRange(1, 11)))
        self.assertTrue(range.overlaps(QgsRasterRange(0, 9)))
        self.assertTrue(range.overlaps(QgsRasterRange(0, 10)))
        self.assertTrue(range.overlaps(QgsRasterRange(0, 11)))
        self.assertTrue(range.overlaps(QgsRasterRange(-1, 10)))
        self.assertTrue(range.overlaps(QgsRasterRange(-1, 9)))
        self.assertTrue(range.overlaps(QgsRasterRange(1, 11)))
        self.assertTrue(range.overlaps(QgsRasterRange(-1, 11)))
        self.assertFalse(range.overlaps(QgsRasterRange(10, 11)))
        self.assertTrue(range.overlaps(QgsRasterRange(-1, 0)))
        self.assertFalse(range.overlaps(QgsRasterRange(-10, -1)))
        self.assertFalse(range.overlaps(QgsRasterRange(11, 12)))
        self.assertTrue(range.overlaps(QgsRasterRange(-1, float('NaN'))))
        self.assertTrue(range.overlaps(QgsRasterRange(0, float('NaN'))))
        self.assertTrue(range.overlaps(QgsRasterRange(1, float('NaN'))))
        self.assertFalse(range.overlaps(QgsRasterRange(10, float('NaN'))))
        self.assertFalse(range.overlaps(QgsRasterRange(11, float('NaN'))))
        self.assertFalse(range.overlaps(QgsRasterRange(float('NaN'), -1)))
        self.assertTrue(range.overlaps(QgsRasterRange(float('NaN'), 0)))
        self.assertTrue(range.overlaps(QgsRasterRange(float('NaN'), 1)))
        self.assertTrue(range.overlaps(QgsRasterRange(float('NaN'), 10)))
        self.assertTrue(range.overlaps(QgsRasterRange(float('NaN'), 11)))
        self.assertTrue(
            range.overlaps(QgsRasterRange(float('NaN'), float('NaN'))))
        self.assertFalse(
            range.overlaps(QgsRasterRange(-1, 0, QgsRasterRange.Exclusive)))
        self.assertFalse(
            range.overlaps(QgsRasterRange(-1, 0, QgsRasterRange.IncludeMin)))
        self.assertTrue(
            range.overlaps(QgsRasterRange(-1, 0, QgsRasterRange.IncludeMax)))
        self.assertFalse(
            range.overlaps(QgsRasterRange(10, 11, QgsRasterRange.Exclusive)))
        self.assertFalse(
            range.overlaps(QgsRasterRange(10, 11, QgsRasterRange.IncludeMin)))
        self.assertFalse(
            range.overlaps(QgsRasterRange(10, 11, QgsRasterRange.IncludeMax)))

        # includes right end
        range = QgsRasterRange(0, 10, QgsRasterRange.IncludeMax)
        self.assertTrue(range.overlaps(QgsRasterRange(1, 9)))
        self.assertTrue(range.overlaps(QgsRasterRange(1, 10)))
        self.assertTrue(range.overlaps(QgsRasterRange(1, 11)))
        self.assertTrue(range.overlaps(QgsRasterRange(0, 9)))
        self.assertTrue(range.overlaps(QgsRasterRange(0, 10)))
        self.assertTrue(range.overlaps(QgsRasterRange(0, 11)))
        self.assertTrue(range.overlaps(QgsRasterRange(-1, 10)))
        self.assertTrue(range.overlaps(QgsRasterRange(-1, 9)))
        self.assertTrue(range.overlaps(QgsRasterRange(1, 11)))
        self.assertTrue(range.overlaps(QgsRasterRange(-1, 11)))
        self.assertTrue(range.overlaps(QgsRasterRange(10, 11)))
        self.assertFalse(range.overlaps(QgsRasterRange(-1, 0)))
        self.assertFalse(range.overlaps(QgsRasterRange(-10, -1)))
        self.assertFalse(range.overlaps(QgsRasterRange(11, 12)))
        self.assertTrue(range.overlaps(QgsRasterRange(-1, float('NaN'))))
        self.assertTrue(range.overlaps(QgsRasterRange(0, 50)))
        self.assertTrue(range.overlaps(QgsRasterRange(1, float('NaN'))))
        self.assertTrue(range.overlaps(QgsRasterRange(10, float('NaN'))))
        self.assertFalse(range.overlaps(QgsRasterRange(11, float('NaN'))))
        self.assertFalse(range.overlaps(QgsRasterRange(float('NaN'), -1)))
        self.assertFalse(range.overlaps(QgsRasterRange(float('NaN'), 0)))
        self.assertTrue(range.overlaps(QgsRasterRange(float('NaN'), 1)))
        self.assertTrue(range.overlaps(QgsRasterRange(float('NaN'), 10)))
        self.assertTrue(range.overlaps(QgsRasterRange(float('NaN'), 11)))
        self.assertTrue(
            range.overlaps(QgsRasterRange(float('NaN'), float('NaN'))))
        self.assertFalse(
            range.overlaps(QgsRasterRange(-1, 0, QgsRasterRange.Exclusive)))
        self.assertFalse(
            range.overlaps(QgsRasterRange(-1, 0, QgsRasterRange.IncludeMin)))
        self.assertFalse(
            range.overlaps(QgsRasterRange(-1, 0, QgsRasterRange.IncludeMax)))
        self.assertFalse(
            range.overlaps(QgsRasterRange(10, 11, QgsRasterRange.Exclusive)))
        self.assertTrue(
            range.overlaps(QgsRasterRange(10, 11, QgsRasterRange.IncludeMin)))
        self.assertFalse(
            range.overlaps(QgsRasterRange(10, 11, QgsRasterRange.IncludeMax)))

        # includes neither end
        range = QgsRasterRange(0, 10, QgsRasterRange.Exclusive)
        self.assertTrue(range.overlaps(QgsRasterRange(1, 9)))
        self.assertTrue(range.overlaps(QgsRasterRange(1, 10)))
        self.assertTrue(range.overlaps(QgsRasterRange(1, 11)))
        self.assertTrue(range.overlaps(QgsRasterRange(0, 9)))
        self.assertTrue(range.overlaps(QgsRasterRange(0, 10)))
        self.assertTrue(range.overlaps(QgsRasterRange(-1, 10)))
        self.assertTrue(range.overlaps(QgsRasterRange(-1, 9)))
        self.assertTrue(range.overlaps(QgsRasterRange(1, 11)))
        self.assertTrue(range.overlaps(QgsRasterRange(-1, 11)))
        self.assertFalse(range.overlaps(QgsRasterRange(10, 11)))
        self.assertFalse(range.overlaps(QgsRasterRange(-1, 0)))
        self.assertFalse(range.overlaps(QgsRasterRange(-10, -1)))
        self.assertFalse(range.overlaps(QgsRasterRange(11, 12)))
        self.assertTrue(range.overlaps(QgsRasterRange(-1, float('NaN'))))
        self.assertTrue(range.overlaps(QgsRasterRange(1, float('NaN'))))
        self.assertFalse(range.overlaps(QgsRasterRange(10, float('NaN'))))
        self.assertFalse(range.overlaps(QgsRasterRange(11, float('NaN'))))
        self.assertFalse(range.overlaps(QgsRasterRange(float('NaN'), -1)))
        self.assertFalse(range.overlaps(QgsRasterRange(float('NaN'), 0)))
        self.assertTrue(range.overlaps(QgsRasterRange(float('NaN'), 1)))
        self.assertTrue(range.overlaps(QgsRasterRange(float('NaN'), 10)))
        self.assertTrue(range.overlaps(QgsRasterRange(float('NaN'), 11)))
        self.assertTrue(
            range.overlaps(QgsRasterRange(float('NaN'), float('NaN'))))
        self.assertFalse(
            range.overlaps(QgsRasterRange(-1, 0, QgsRasterRange.Exclusive)))
        self.assertFalse(
            range.overlaps(QgsRasterRange(-1, 0, QgsRasterRange.IncludeMin)))
        self.assertFalse(
            range.overlaps(QgsRasterRange(-1, 0, QgsRasterRange.IncludeMax)))
        self.assertFalse(
            range.overlaps(QgsRasterRange(10, 11, QgsRasterRange.Exclusive)))
        self.assertFalse(
            range.overlaps(QgsRasterRange(10, 11, QgsRasterRange.IncludeMin)))
        self.assertFalse(
            range.overlaps(QgsRasterRange(10, 11, QgsRasterRange.IncludeMax)))
예제 #7
0
 def testBasic(self):
     range = QgsRasterRange(1, 5)
     self.assertEqual(range.min(), 1)
     self.assertEqual(range.max(), 5)
     range.setMin(2.2)
     range.setMax(10.4)
     self.assertEqual(range.min(), 2.2)
     self.assertEqual(range.max(), 10.4)
     self.assertEqual(range.bounds(), QgsRasterRange.IncludeMinAndMax)
     range.setBounds(QgsRasterRange.IncludeMin)
     self.assertEqual(range.bounds(), QgsRasterRange.IncludeMin)
예제 #8
0
    def testContains(self):
        range = QgsRasterRange(1, 5)
        self.assertTrue(range.contains(1))
        self.assertTrue(range.contains(5))
        self.assertTrue(range.contains(4))
        self.assertTrue(range.contains(1.00001))
        self.assertTrue(range.contains(4.99999))
        self.assertFalse(range.contains(0.99999))
        self.assertFalse(range.contains(5.00001))

        # with nan min/maxs
        range = QgsRasterRange()
        self.assertTrue(range.contains(1))
        self.assertTrue(range.contains(-909999999))
        self.assertTrue(range.contains(999999999))
        range.setMin(5)
        self.assertFalse(range.contains(0))
        self.assertTrue(range.contains(5))
        self.assertTrue(range.contains(10000000))

        range = QgsRasterRange()
        range.setMax(5)
        self.assertFalse(range.contains(6))
        self.assertTrue(range.contains(5))
        self.assertTrue(range.contains(-99999))

        range = QgsRasterRange(1, 5, QgsRasterRange.IncludeMax)
        self.assertFalse(range.contains(0))
        self.assertFalse(range.contains(1))
        self.assertTrue(range.contains(2))
        self.assertTrue(range.contains(5))
        self.assertFalse(range.contains(6))

        range = QgsRasterRange(1, 5, QgsRasterRange.IncludeMin)
        self.assertFalse(range.contains(0))
        self.assertTrue(range.contains(1))
        self.assertTrue(range.contains(2))
        self.assertFalse(range.contains(5))
        self.assertFalse(range.contains(6))

        range = QgsRasterRange(1, 5, QgsRasterRange.Exclusive)
        self.assertFalse(range.contains(0))
        self.assertFalse(range.contains(1))
        self.assertTrue(range.contains(2))
        self.assertFalse(range.contains(5))
        self.assertFalse(range.contains(6))
예제 #9
0
 def testAsText(self):
     self.assertEqual(
         QgsRasterRange(0, 10, QgsRasterRange.IncludeMinAndMax).asText(),
         '0 ≤ x ≤ 10')
     self.assertEqual(
         QgsRasterRange(-1, float('NaN')).asText(), '-1 ≤ x ≤ ∞')
     self.assertEqual(
         QgsRasterRange(float('NaN'), 5).asText(), '-∞ ≤ x ≤ 5')
     self.assertEqual(
         QgsRasterRange(float('NaN'), float('NaN')).asText(), '-∞ ≤ x ≤ ∞')
     self.assertEqual(
         QgsRasterRange(0, 10, QgsRasterRange.IncludeMin).asText(),
         '0 ≤ x < 10')
     self.assertEqual(
         QgsRasterRange(-1, float('NaN'),
                        QgsRasterRange.IncludeMin).asText(), '-1 ≤ x < ∞')
     self.assertEqual(
         QgsRasterRange(float('NaN'), 5,
                        QgsRasterRange.IncludeMin).asText(), '-∞ ≤ x < 5')
     self.assertEqual(
         QgsRasterRange(float('NaN'), float('NaN'),
                        QgsRasterRange.IncludeMin).asText(), '-∞ ≤ x < ∞')
     self.assertEqual(
         QgsRasterRange(0, 10, QgsRasterRange.IncludeMax).asText(),
         '0 < x ≤ 10')
     self.assertEqual(
         QgsRasterRange(-1, float('NaN'),
                        QgsRasterRange.IncludeMax).asText(), '-1 < x ≤ ∞')
     self.assertEqual(
         QgsRasterRange(float('NaN'), 5,
                        QgsRasterRange.IncludeMax).asText(), '-∞ < x ≤ 5')
     self.assertEqual(
         QgsRasterRange(float('NaN'), float('NaN'),
                        QgsRasterRange.IncludeMax).asText(), '-∞ < x ≤ ∞')
     self.assertEqual(
         QgsRasterRange(0, 10, QgsRasterRange.Exclusive).asText(),
         '0 < x < 10')
     self.assertEqual(
         QgsRasterRange(-1, float('NaN'),
                        QgsRasterRange.Exclusive).asText(), '-1 < x < ∞')
     self.assertEqual(
         QgsRasterRange(float('NaN'), 5, QgsRasterRange.Exclusive).asText(),
         '-∞ < x < 5')
     self.assertEqual(
         QgsRasterRange(float('NaN'), float('NaN'),
                        QgsRasterRange.Exclusive).asText(), '-∞ < x < ∞')
예제 #10
0
 def testEquality(self):
     range = QgsRasterRange(1, 5)
     range2 = QgsRasterRange(1, 5)
     self.assertEqual(range, range2)
     range2.setMin(2)
     self.assertNotEqual(range, range2)
     range2.setMin(1)
     range2.setMax(4)
     self.assertNotEqual(range, range2)
     range2.setMax(5)
     self.assertEqual(range, range2)
     range.setBounds(QgsRasterRange.IncludeMax)
     self.assertNotEqual(range, range2)
     range2.setBounds(QgsRasterRange.IncludeMax)
     self.assertEqual(range, range2)
     range = QgsRasterRange()
     range2 = QgsRasterRange()
     self.assertEqual(range, range2)
     range.setMin(1)
     self.assertNotEqual(range, range2)
     range2.setMin(1)
     self.assertEqual(range, range2)
     range = QgsRasterRange()
     range2 = QgsRasterRange()
     range.setMax(5)
     self.assertNotEqual(range, range2)
     range2.setMax(5)
     self.assertEqual(range, range2)
예제 #11
0
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
예제 #12
0
    def exportRasterLayer(self, layer, destinationFile, options=None):
        outputFormat = self.settings[
            'rasterFormat'] if 'rasterFormat' in self.settings else 'GTiff'

        if os.path.splitext(destinationFile)[1] == '':
            formats = QgsRasterFileWriter.extensionsForFormat(outputFormat)
            if len(formats) > 0:
                destinationFile = '{}.{}'.format(destinationFile, formats[0])

        provider = layer.dataProvider()

        cols = provider.xSize()
        rows = provider.ySize()
        if not provider.capabilities() & QgsRasterDataProvider.Size:
            k = float(provider.extent().width()) / float(
                provider.extent().height())
            cols = RASTER_SIZE * k
            rows = RASTER_SIZE

        pipe = QgsRasterPipe()
        if not pipe.set(provider.clone()):
            QgsMessageLog.logMessage(
                self.
                tr('Failed to export layer "{layer}": Cannot set pipe provider.'
                   ).format(layer=layer.name()), 'QConsolidate', Qgis.Warning)
            return False, None

        nodata = {}
        for i in range(1, provider.bandCount() + 1):
            if provider.sourceHasNoDataValue(i):
                value = provider.sourceNoDataValue(i)
                nodata[i] = QgsRasterRange(value, value)

        nuller = QgsRasterNuller()
        for band, value in nodata.items():
            nuller.setNoData(band, [value])

        if not pipe.insert(1, nuller):
            QgsMessageLog.logMessage(
                self.tr(
                    'Failed to export layer "{layer}": Cannot set pipe nuller.'
                ).format(layer=layer.name()), 'QConsolidate', Qgis.Warning)
            return False, None

        writer = QgsRasterFileWriter(destinationFile)
        writer.setOutputFormat(outputFormat)

        if options is not None:
            writer.setCreateOptions(options)

        success = True
        error = writer.writeRaster(pipe, cols, rows, provider.extent(),
                                   provider.crs())
        if error != QgsRasterFileWriter.NoError:
            QgsMessageLog.logMessage(
                self.tr('Failed to export layer "{layer}": {message}.').format(
                    layer=layer.name(), message=error), 'QConsolidate',
                Qgis.Warning)
            success = False

        return success, destinationFile