Beispiel #1
0
class TestSimulator(unittest.TestCase):
    def setUp(self):

        # Raster1:
        # ~ [1, 1, 3,],
        # ~ [3, 2, 1,],
        # ~ [0, 3, 1,]
        self.raster1 = Raster("../../examples/multifact.tif")
        self.raster1.resetMask([0])

        self.X = np.array([[1, 2, 3], [3, 2, 1], [0, 1, 1]])
        self.X = np.ma.array(self.X, mask=(self.X == 0))
        self.raster2 = Raster()
        self.raster2.create([self.X], self.raster1.getGeodata())

        self.aa = AreaAnalyst(self.raster1, self.raster2)

        self.crosstab = CrossTableManager(self.raster1, self.raster2)

        # Simple model
        self.model = Model(state=self.raster1)

    def test_compute_table(self):

        # print self.crosstab.getCrosstable().getCrosstable()
        # CrossTab:
        #  [[ 3.  1.  0.]
        #   [ 0.  1.  0.]
        #   [ 1.  0.  2.]]
        prediction = self.model.getPrediction(self.raster1)
        # print prediction.getBand(1)
        # prediction = [[1.0 1.0 6.0]
        #  [6.0 5.0 1.0]
        #  [-- 6.0 1.0]]
        # confidence = self.model.getConfidence()
        # print confidence.getBand(1)
        # confidence =     [[1.0 0.5  0.33]
        #  [0.5 0.33 0.25]
        #  [--  0.25 0.2]]
        result = np.array([[2.0, 1.0, 3.0], [1.0, 2.0, 1.0], [0, 3.0, 1.0]])
        result = np.ma.array(result, mask=(result == 0))

        simulator = Simulator(
            state=self.raster1, factors=None, model=self.model, crosstable=self.crosstab
        )  # The model does't use factors
        simulator.setIterationCount(1)
        simulator.simN()
        state = simulator.getState().getBand(1)
        assert_array_equal(result, state)

        result = np.array([[2.0, 1.0, 1.0], [2.0, 2.0, 1.0], [0, 3.0, 1.0]])
        result = np.ma.array(result, mask=(result == 0))

        simulator = Simulator(self.raster1, None, self.model, self.crosstab)
        simulator.setIterationCount(2)
        simulator.simN()
        state = simulator.getState().getBand(1)
        assert_array_equal(result, state)
Beispiel #2
0
    def test_WoeManager(self):
        aa = AreaAnalyst(self.sites, self.sites)
        w1 = WoeManager([self.factor], aa)
        p = w1.getPrediction(self.sites).getBand(1)
        assert_array_equal(p, self.sites.getBand(1))

        initState = Raster("../../examples/data.tif")
        finalState = Raster("../../examples/data1.tif")
        aa = AreaAnalyst(initState, finalState)
        w = WoeManager([initState], aa)
        p = w.getPrediction(initState).getBand(1)

        # Calculate by hands:
        # 1->1 transition raster:
        r11 = [[1, 1, 0, 0], [0, 1, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
        # 1->2 raster:
        r12 = [[0, 0, 1, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
        # 1->3 raster:
        r13 = [[0, 0, 0, 1], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
        # 2->1
        r21 = [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
        # 2->2
        r22 = [[0, 0, 0, 0], [0, 0, 1, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
        # 2->3
        r23 = [[0, 0, 0, 0], [0, 0, 0, 1], [1, 1, 1, 1], [0, 0, 0, 0]]
        # 3->1
        r31 = [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [1, 1, 0, 0]]
        # 3->2
        r32 = [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 1]]
        # 3->3
        r33 = [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 1, 0]]
        geodata = initState.getGeodata()
        sites = {"11": r11, "12": r12, "13": r13, "21": r21, "22": r22, "23": r23, "31": r31, "32": r32, "33": r33}
        woeDict = {}  # WoE of transitions
        for k in sites.keys():  #
            if k != "21":  # !!! r21 is zero
                x = Raster()
                x.create([np.ma.array(data=sites[k])], geodata)
                sites[k] = x
                woeDict[k] = woe(initState.getBand(1), x.getBand(1))
        # w1max = np.maximum(woeDict['11'], woeDict['12'], woeDict['13'])
        # w2max = np.maximum(woeDict['22'], woeDict['23'])
        # w3max = np.maximum(woeDict['31'], woeDict['32'], woeDict['33'])
        # Answer is index of finalClass that maximizes weights of transiotion initClass -> finalClass
        answer = [[1, 1, 1, 1], [1, 1, 3, 3], [3, 3, 3, 3], [1, 1, 1, 1]]
        assert_array_equal(p, answer)

        w = WoeManager([initState], aa, bins={0: [[2]]})
        p = w.getPrediction(initState).getBand(1)
class TestRaster (unittest.TestCase):
    def setUp(self):
        self.r1 = Raster('examples/multifact.tif')
        self.r2 = Raster('examples/sites.tif')
        self.r3 = Raster('examples/two_band.tif')

        # r1
        data1 = np.array(
            [
                [1,1,3],
                [3,2,1],
                [0,3,1]
            ])
        # r2
        data2 = np.array(
            [
                [1,2,1],
                [1,2,1],
                [0,1,2]
            ])
        mask = [
            [False, False, False],
            [False, False, False],
            [False, False, False]
        ]
        self.data1 = ma.array(data=data1, mask=mask)
        self.data2 = ma.array(data=data2, mask=mask)

    def test_RasterInit(self):
        self.assertEqual(self.r1.getBandsCount(), 1)
        band = self.r1.getBand(1)
        shape = band.shape
        x = self.r1.getXSize()
        y = self.r1.getYSize()
        self.assertEqual(shape, (x,y))

        self.assertEqual(self.r2.getBandsCount(), 1)
        band = self.r2.getBand(1)
        assert_array_equal(band, self.data2)

        self.assertTrue(self.r1.geoDataMatch(self.r2))

        self.assertTrue(self.r1.isMetricProj())


    def test_getBandStat(self):
        stat = self.r1.getBandStat(1)
        self.assertAlmostEqual(stat['mean'], 15.0/9)
        self.assertAlmostEqual(stat['std'], np.sqrt(10.0/9))

    def test_normalize(self):
        multifact = [
            [1,1,3],
            [3,2,1],
            [0,3,1],
        ]

        # Normalize using std and mean
        r1 = Raster('examples/multifact.tif')
        r1.normalize()
        r1.denormalize()
        assert_array_equal(r1.getBand(1), multifact)

        # Normalize using min and max
        r1 = Raster('examples/multifact.tif')
        r1.normalize(mode='maxmin')
        r1.denormalize()
        assert_array_equal(r1.getBand(1), multifact)

        # Two normalization procedures
        r1 = Raster('examples/multifact.tif')
        r1.normalize()
        r1.normalize(mode='maxmin')
        r1.denormalize()
        assert_array_equal(r1.getBand(1), multifact)
        r1 = Raster('examples/multifact.tif')
        r1.normalize(mode='maxmin')
        r1.normalize()
        r1.denormalize()
        assert_array_equal(r1.getBand(1), multifact)


    def test_getNeighbours(self):
        neighbours = self.r2.getNeighbours(row=1,col=0, size=0)
        self.assertEqual(neighbours, [[1]])

        neighbours = self.r2.getNeighbours(row=1,col=1, size=1)
        assert_array_equal(neighbours, [self.data2])

        neighbours = self.r3.getNeighbours(row=1,col=1, size=1)
        assert_array_equal(neighbours, [self.data2, self.data1])

        # Check pixel on the raster bound and nonzero neighbour size
        self.assertRaises(ProviderError, self.r2.getNeighbours, col=1, row=0, size=1)
        self.assertRaises(ProviderError, self.r2.getNeighbours, col=1, row=1, size=2)

    def test_geodata(self):
        geodata = self.r1.getGeodata()
        self.r1.setGeoData(geodata)
        geodata['xSize'] = geodata['xSize'] + 10
        self.assertRaises(ProviderError, self.r1.setGeoData, geodata=geodata)


    def test_save(self):
        try:
            filename = 'temp.tiff'
            self.r1.save(filename)
            r2 = Raster(filename)
            self.assertEqual(r2.get_dtype(), self.r1.get_dtype())
            self.assertEqual(r2.getBandsCount(), self.r1.getBandsCount())
            for i in range(r2.getBandsCount()):
                assert_array_equal(r2.getBand(i+1), self.r1.getBand(i+1))
        finally:
            os.remove(filename)
Beispiel #4
0
    def test_WoeManager(self):
        aa = AreaAnalyst(self.sites, self.sites)
        w1 = WoeManager([self.factor], aa)
        w1.train()
        p = w1.getPrediction(self.sites).getBand(1)
        answer = [[0,3,0], [0,3,0], [9,0,3]]
        answer = ma.array(data = answer, mask = self.mask)
        assert_array_equal(p, answer)

        initState = Raster('../../examples/data.tif')
            #~ [1,1,1,1],
            #~ [1,1,2,2],
            #~ [2,2,2,2],
            #~ [3,3,3,3]
        finalState = Raster('../../examples/data1.tif')
            #~ [1,1,2,3],
            #~ [3,1,2,3],
            #~ [3,3,3,3],
            #~ [1,1,3,2]
        aa = AreaAnalyst(initState, finalState)
        w = WoeManager([initState], aa)
        w.train()
        #print w.woe
        p = w.getPrediction(initState).getBand(1)
        self.assertEquals(p.dtype, np.uint8)

        # Calculate by hands:
        #1->1 transition raster:
        r11 = [
            [1, 1, 0, 0],
            [0, 1, 0, 0],
            [0, 0, 0, 0],
            [0, 0, 0, 0]
        ]
        #1->2 raster:
        r12 = [
            [0, 0, 1, 0],
            [0, 0, 0, 0],
            [0, 0, 0, 0],
            [0, 0, 0, 0]
        ]
        #1->3 raster:
        r13 = [
            [0, 0, 0, 1],
            [0, 0, 0, 0],
            [0, 0, 0, 0],
            [0, 0, 0, 0]
        ]
        # 2->1
        r21 = [
            [0, 0, 0, 0],
            [0, 0, 0, 0],
            [0, 0, 0, 0],
            [0, 0, 0, 0]
        ]
        # 2->2
        r22 = [
            [0, 0, 0, 0],
            [0, 0, 1, 0],
            [0, 0, 0, 0],
            [0, 0, 0, 0]
        ]
        # 2->3
        r23 = [
            [0, 0, 0, 0],
            [0, 0, 0, 1],
            [1, 1, 1, 1],
            [0, 0, 0, 0]
        ]
        # 3->1
        r31 = [
            [0, 0, 0, 0],
            [0, 0, 0, 0],
            [0, 0, 0, 0],
            [1, 1, 0, 0]
        ]
        # 3->2
        r32 = [
            [0, 0, 0, 0],
            [0, 0, 0, 0],
            [0, 0, 0, 0],
            [0, 0, 0, 1]
        ]
        # 3->3
        r33 = [
            [0, 0, 0, 0],
            [0, 0, 0, 0],
            [0, 0, 0, 0],
            [0, 0, 1, 0]
        ]
        geodata = initState.getGeodata()
        sites = {'11': r11, '12': r12, '13': r13, '21': r21, '22': r22, '23': r23, '31': r31, '32': r32, '33': r33}
        woeDict = {}    # WoE of transitions
        for k in sites.keys(): #
            if k !='21' : # !!! r21 is zero
                x = Raster()
                x.create([np.ma.array(data=sites[k])], geodata)
                sites[k] = x
                woeDict[k] = woe(initState.getBand(1), x.getBand(1))
        #w1max = np.maximum(woeDict['11'], woeDict['12'], woeDict['13'])
        #w2max = np.maximum(woeDict['22'], woeDict['23'])
        #w3max = np.maximum(woeDict['31'], woeDict['32'], woeDict['33'])
        # Answer is a transition code with max weight
        answer = [
            [0, 0, 0, 0],
            [0, 0, 5, 5],
            [5, 5, 5, 5],
            [6, 6, 6, 6]
        ]
        assert_array_equal(p, answer)

        w = WoeManager([initState], aa, bins = {0: [[2], ],})
        w.train()
        p = w.getPrediction(initState).getBand(1)
        self.assertEquals(p.dtype, np.uint8)
        c = w.getConfidence().getBand(1)
        self.assertEquals(c.dtype, np.uint8)
Beispiel #5
0
class TestRaster(unittest.TestCase):
    def setUp(self):
        self.r1 = Raster('examples/multifact.tif')
        self.r2 = Raster('examples/sites.tif')
        self.r3 = Raster('examples/two_band.tif')

        # r1
        data1 = np.array([[1, 1, 3], [3, 2, 1], [0, 3, 1]])
        # r2
        data2 = np.array([[1, 2, 1], [1, 2, 1], [0, 1, 2]])
        mask = [[False, False, False], [False, False, False],
                [False, False, False]]
        self.data1 = ma.array(data=data1, mask=mask)
        self.data2 = ma.array(data=data2, mask=mask)

    def test_RasterInit(self):
        self.assertEqual(self.r1.getBandsCount(), 1)
        band = self.r1.getBand(1)
        shape = band.shape
        x = self.r1.getXSize()
        y = self.r1.getYSize()
        self.assertEqual(shape, (x, y))

        self.assertEqual(self.r2.getBandsCount(), 1)
        band = self.r2.getBand(1)
        assert_array_equal(band, self.data2)

        self.assertTrue(self.r1.geoDataMatch(self.r2))

        self.assertTrue(self.r1.isMetricProj())

    def test_create(self):
        raster = Raster()
        raster.create([self.data1], geodata=self.r1.getGeodata())
        self.assertTrue(raster.geoDataMatch(self.r1))
        self.assertEqual(raster.getBandsCount(), 1)
        self.assertEqual(set(raster.getBandGradation(1)), set([0, 1, 2, 3]))

    def test_roundBands(self):
        rast = Raster('examples/multifact.tif')
        rast.bands = rast.bands * 0.1
        rast.roundBands()
        answer = [[[
            0,
            0,
            0,
        ], [0, 0, 0], [0, 0, 0]]]
        assert_array_equal(answer, rast.bands)

        rast = Raster('examples/multifact.tif')
        rast.bands = rast.bands * 1.1
        rast.roundBands(decimals=1)
        answer = np.array([[[1.1, 1.1, 3.3], [3.3, 2.2, 1.1], [0.0, 3.3,
                                                               1.1]]])
        assert_array_equal(answer, rast.bands)

    def test_isContinues(self):
        rast = Raster('examples/multifact.tif')
        self.assertFalse(rast.isCountinues(bandNo=1))
        rast = Raster('examples/dist_roads.tif')
        self.assertTrue(rast.isCountinues(bandNo=1))

    def test_getBandStat(self):
        stat = self.r1.getBandStat(1)
        self.assertAlmostEqual(stat['mean'], 15.0 / 9)
        self.assertAlmostEqual(stat['std'], np.sqrt(10.0 / 9))

    def test_normalize(self):
        multifact = [
            [1, 1, 3],
            [3, 2, 1],
            [0, 3, 1],
        ]

        # Normalize using std and mean
        r1 = Raster('examples/multifact.tif')
        r1.normalize()
        r1.denormalize()
        assert_array_equal(r1.getBand(1), multifact)

        # Normalize using min and max
        r1 = Raster('examples/multifact.tif')
        r1.normalize(mode='maxmin')
        r1.denormalize()
        assert_array_equal(r1.getBand(1), multifact)

        # Two normalization procedures
        r1 = Raster('examples/multifact.tif')
        r1.normalize()
        r1.normalize(mode='maxmin')
        r1.denormalize()
        assert_array_equal(r1.getBand(1), multifact)
        r1 = Raster('examples/multifact.tif')
        r1.normalize(mode='maxmin')
        r1.normalize()
        r1.denormalize()
        assert_array_equal(r1.getBand(1), multifact)

    def test_getNeighbours(self):
        neighbours = self.r2.getNeighbours(row=1, col=0, size=0)
        self.assertEqual(neighbours, [[1]])

        neighbours = self.r2.getNeighbours(row=1, col=1, size=1)
        assert_array_equal(neighbours, [self.data2])

        neighbours = self.r3.getNeighbours(row=1, col=1, size=1)
        assert_array_equal(neighbours, [self.data2, self.data1])

        # Check pixel on the raster bound and nonzero neighbour size
        self.assertRaises(ProviderError,
                          self.r2.getNeighbours,
                          col=1,
                          row=0,
                          size=1)
        self.assertRaises(ProviderError,
                          self.r2.getNeighbours,
                          col=1,
                          row=1,
                          size=2)

    def test_geodata(self):
        geodata = self.r1.getGeodata()
        self.r1.setGeoData(geodata)
        geodata['xSize'] = geodata['xSize'] + 10
        self.assertRaises(ProviderError, self.r1.setGeoData, geodata=geodata)

        self.assertTrue(self.r1.geoDataMatch(self.r1))
        self.assertTrue(
            self.r1.geoDataMatch(raster=None, geodata=self.r1.getGeodata()))

        self.assertTrue(self.r1.geoTransformMatch(self.r1))
        self.assertTrue(
            self.r1.geoTransformMatch(raster=None,
                                      geodata=self.r1.getGeodata()))

    def test_save(self):
        try:
            filename = 'temp.tiff'
            self.r1.save(filename)
            r2 = Raster(filename)
            self.assertEqual(r2.get_dtype(), self.r1.get_dtype())
            self.assertEqual(r2.getBandsCount(), self.r1.getBandsCount())
            for i in range(r2.getBandsCount()):
                assert_array_equal(r2.getBand(i + 1), self.r1.getBand(i + 1))
        finally:
            os.remove(filename)

    def test_getBandGradation(self):
        self.assertEqual(set(self.r1.getBandGradation(1)), set([0, 1, 2, 3]))
Beispiel #6
0
class TestSimulator(unittest.TestCase):

    def setUp(self):

        # Raster1:
            #~ [1, 1, 3,],
            #~ [3, 2, 1,],
            #~ [0, 3, 1,]
        self.raster1 = Raster('../../examples/multifact.tif')
        self.raster1.resetMask([0])

        self.X = np.array([
            [1, 2, 3],
            [3, 2, 1],
            [0, 1, 1]
        ])
        self.X = np.ma.array(self.X, mask=(self.X == 0))
        self.raster2 = Raster()
        self.raster2.create([self.X], self.raster1.getGeodata())

        self.aa = AreaAnalyst(self.raster1, self.raster2)

        self.crosstab = CrossTableManager(self.raster1, self.raster2)

        # Simple model
        self.model = Model(state=self.raster1)

    def test_compute_table(self):

        # print self.crosstab.getCrosstable().getCrosstable()
        # CrossTab:
        #  [[ 3.  1.  0.]
        #   [ 0.  1.  0.]
        #   [ 1.  0.  2.]]
        prediction = self.model.getPrediction(self.raster1)
        # print prediction.getBand(1)
        # prediction = [[1.0 1.0 6.0]
                     #  [6.0 5.0 1.0]
                     #  [-- 6.0 1.0]]
        # confidence = self.model.getConfidence()
        # print confidence.getBand(1)
        # confidence =     [[1.0 0.5  0.33]
                         #  [0.5 0.33 0.25]
                         #  [--  0.25 0.2]]
        result = np.array([
            [2.0, 1.0, 3.0],
            [1.0, 2.0, 1.0],
            [0,   3.0, 1.0]
        ])
        result = np.ma.array(result, mask = (result==0))

        simulator = Simulator(state=self.raster1, factors=None, model=self.model, crosstable=self.crosstab)    # The model does't use factors
        simulator.setIterationCount(1)
        simulator.simN()
        state = simulator.getState().getBand(1)
        assert_array_equal(result, state)

        result = np.array([
            [2.0, 1.0, 1.0],
            [2.0, 2.0, 1.0],
            [0,   3.0, 1.0]
        ])
        result = np.ma.array(result, mask = (result==0))

        simulator = Simulator(self.raster1, None, self.model, self.crosstab)
        simulator.setIterationCount(2)
        simulator.simN()
        state = simulator.getState().getBand(1)
        assert_array_equal(result, state)
Beispiel #7
0
    def test_WoeManager(self):
        aa = AreaAnalyst(self.sites, self.sites)
        w1 = WoeManager([self.factor], aa)
        w1.train()
        p = w1.getPrediction(self.sites).getBand(1)
        answer = [[0, 3, 0], [0, 3, 0], [9, 0, 3]]
        answer = ma.array(data=answer, mask=self.mask)
        assert_array_equal(p, answer)

        initState = Raster('../../examples/data.tif')
        #~ [1,1,1,1],
        #~ [1,1,2,2],
        #~ [2,2,2,2],
        #~ [3,3,3,3]
        finalState = Raster('../../examples/data1.tif')
        #~ [1,1,2,3],
        #~ [3,1,2,3],
        #~ [3,3,3,3],
        #~ [1,1,3,2]
        aa = AreaAnalyst(initState, finalState)
        w = WoeManager([initState], aa)
        w.train()
        #print w.woe
        p = w.getPrediction(initState).getBand(1)
        self.assertEquals(p.dtype, np.uint8)

        # Calculate by hands:
        #1->1 transition raster:
        r11 = [[1, 1, 0, 0], [0, 1, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
        #1->2 raster:
        r12 = [[0, 0, 1, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
        #1->3 raster:
        r13 = [[0, 0, 0, 1], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
        # 2->1
        r21 = [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
        # 2->2
        r22 = [[0, 0, 0, 0], [0, 0, 1, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
        # 2->3
        r23 = [[0, 0, 0, 0], [0, 0, 0, 1], [1, 1, 1, 1], [0, 0, 0, 0]]
        # 3->1
        r31 = [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [1, 1, 0, 0]]
        # 3->2
        r32 = [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 1]]
        # 3->3
        r33 = [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 1, 0]]
        geodata = initState.getGeodata()
        sites = {
            '11': r11,
            '12': r12,
            '13': r13,
            '21': r21,
            '22': r22,
            '23': r23,
            '31': r31,
            '32': r32,
            '33': r33
        }
        woeDict = {}  # WoE of transitions
        for k in sites.keys():  #
            if k != '21':  # !!! r21 is zero
                x = Raster()
                x.create([np.ma.array(data=sites[k])], geodata)
                sites[k] = x
                woeDict[k] = woe(initState.getBand(1), x.getBand(1))
        #w1max = np.maximum(woeDict['11'], woeDict['12'], woeDict['13'])
        #w2max = np.maximum(woeDict['22'], woeDict['23'])
        #w3max = np.maximum(woeDict['31'], woeDict['32'], woeDict['33'])
        # Answer is a transition code with max weight
        answer = [[0, 0, 0, 0], [0, 0, 5, 5], [5, 5, 5, 5], [6, 6, 6, 6]]
        assert_array_equal(p, answer)

        w = WoeManager([initState], aa, bins={
            0: [
                [2],
            ],
        })
        w.train()
        p = w.getPrediction(initState).getBand(1)
        self.assertEquals(p.dtype, np.uint8)
        c = w.getConfidence().getBand(1)
        self.assertEquals(c.dtype, np.uint8)