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))
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))
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)
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)
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)))
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)))
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 < ∞')
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
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