Esempio n. 1
0
    def postClassRaster(self,inRaster,sieveSize,inClassNumber,outShp):        
        """ !@brief Sieve size with gdal.Sieve() fiunction, them reclass to delete unwanted labels """
        
        try:
            rasterTemp = tempfile.mktemp('.tif')
                    
            datasrc = gdal.Open(inRaster)
            srcband = datasrc.GetRasterBand(1)
            data,im=dataraster.open_data_band(inRaster)        
            
            drv = gdal.GetDriverByName('GTiff')
            dst_ds = drv.Create(rasterTemp,datasrc.RasterXSize,datasrc.RasterXSize,1,gdal.GDT_Byte)
            
            dst_ds.SetGeoTransform(datasrc.GetGeoTransform())
            dst_ds.SetProjection(datasrc.GetProjection())
        
            dstband=dst_ds.GetRasterBand(1)
            
            
            
            def sieve(srcband,dstband,sieveSize):
                gdal.SieveFilter(srcband,None,dstband,sieveSize,8)
            
            pixelSize = datasrc.GetGeoTransform()[1] #get pixel size
            pixelSieve = int(sieveSize/(pixelSize*pixelSize)) #get number of pixel to sieve
            
            sieve(srcband,dstband,pixelSieve)
            
            dst_ds = None # close destination band
            
            self.Progress.addStep()
            

            rasterTemp = self.reclassAndFillHole(rasterTemp,inClassNumber)
            
            
            self.Progress.addStep()
            
            
            
        except:
            QgsMessageLog.logMessage("Cannot sieve with raster function")

        
        try :
            outShp = self.polygonize(rasterTemp,outShp) # vectorize raster
        except :
            self.Progress.reset()    
        
        self.Progress.addStep()        
        
        self.Progress.reset()
        return outShp
Esempio n. 2
0
    def historicalMapFilter(self, inImage, outRaster, inShapeGrey,
                            inShapeMedian, iterMedian):
        # open data with Gdal
        try:
            data, im = dataraster.open_data_band(inImage)
        except:
            print 'Cannot open image'

        # get proj,geo and dimension (d) from data
        proj = data.GetProjection()
        geo = data.GetGeoTransform()
        d = data.RasterCount

        if outRaster == '':
            outRaster = tempfile.mktemp('.tif')
        # Progress Bar
        maxStep = d + d * iterMedian
        try:
            filterProgress = progressBar(' Filtering...', maxStep)
        except:
            print 'Failed loading progress Bar'

        # Try all, if error close filterProgress
        try:
            # create empty geotiff with d dimension, geotransform & projection

            try:
                outFile = dataraster.create_empty_tiff(outRaster, im, d, geo,
                                                       proj)
            except:
                print 'Cannot write empty image ' + outRaster

            # fill outFile with filtered band
            for i in range(d):
                # Read data from the right band
                try:
                    filterProgress.addStep()
                    temp = data.GetRasterBand(i + 1).ReadAsArray()

                except:
                    print 'Cannot get rasterband' + i
                    QgsMessageLog.logMessage("Problem reading band " + str(i) +
                                             " from image " + inImage)
                # Filter with greyclosing, then with median filter

                try:
                    temp = ndimage.morphology.grey_closing(temp,
                                                           size=(inShapeGrey,
                                                                 inShapeGrey))
                except:
                    print 'Cannot filter with Grey_Closing'
                    QgsMessageLog.logMessage("Problem with Grey Closing")

                for j in range(iterMedian):
                    try:
                        filterProgress.addStep()
                        temp = ndimage.filters.median_filter(
                            temp, size=(inShapeMedian, inShapeMedian))
                    except:
                        print 'Cannot filter with Median'
                        QgsMessageLog.logMessage("Problem with median filter")

                # Save bandand outFile
                try:
                    out = outFile.GetRasterBand(i + 1)
                    out.WriteArray(temp)
                    out.FlushCache()
                    temp = None
                except:
                    QgsMessageLog.logMessage("Cannot save band" + str(i) +
                                             " on image" + outRaster)

            filterProgress.reset()
        except:
            filterProgress.reset()
Esempio n. 3
0
    def filters(self, inImage, outRaster, inFilter, inFilterSize,
                inFilterIter):
        # open data with Gdal
        self.processed = 0
        try:
            data, im = dataraster.open_data_band(inImage)
        except:
            print 'Cannot open image'

        # get proj,geo and dimension (d) from data
        proj = data.GetProjection()
        geo = data.GetGeoTransform()
        d = data.RasterCount

        # Progress Bar
        maxStep = d * inFilterIter
        filterProgress = progressBar(' Filtering...', maxStep)

        # Try all, if error close filterProgress

        # create empty geotiff with d dimension, geotransform & projection

        try:
            outFile = dataraster.create_empty_tiff(outRaster, im, d, geo, proj)
        except:
            print 'Cannot write empty image ' + outRaster

        # fill outFile with filtered band
        for i in range(d):
            # Read data from the right band
            filterProgress.addStep()

            temp = data.GetRasterBand(i + 1).ReadAsArray()

            # Filter with greyclosing, then with median filter
            for j in range(inFilterIter):
                filterProgress.addStep()

                try:
                    if inFilter == 'Closing':
                        temp = ndimage.morphology.grey_closing(
                            temp, size=(inFilterSize, inFilterSize))
                    elif inFilter == 'Dilation':
                        temp = ndimage.morphology.grey_dilation(
                            temp, size=(inFilterSize, inFilterSize))
                    elif inFilter == 'Opening':
                        temp = ndimage.morphology.grey_opening(
                            temp, size=(inFilterSize, inFilterSize))
                    elif inFilter == 'Erosion':
                        temp = ndimage.morphology.grey_erosion(
                            temp, size=(inFilterSize, inFilterSize))
                    elif inFilter == 'Median':
                        temp = ndimage.filters.median_filter(
                            temp, size=(inFilterSize, inFilterSize))

                except:
                    QgsMessageLog.logMessage("Cannot perform " + inFilter)
            # Save bandand outFile
            try:
                out = outFile.GetRasterBand(i + 1)
                out.WriteArray(temp)
                out.FlushCache()
                temp = None
            except:
                QgsMessageLog.logMessage("Cannot save band" + str(i) +
                                         " on image" + outRaster)
        filterProgress.reset()
        print outRaster
Esempio n. 4
0
    def historicalMapPostClass(self, inRaster, sieveSize, inClassNumber,
                               outShp):

        #Progress=progressBar(' Post-classification...',10)

        rasterTemp = tempfile.mktemp('.tif')

        datasrc = gdal.Open(inRaster)
        srcband = datasrc.GetRasterBand(1)
        data, im = dataraster.open_data_band(inRaster)

        drv = gdal.GetDriverByName('GTiff')
        dst_ds = drv.Create(rasterTemp, datasrc.RasterXSize,
                            datasrc.RasterXSize, 1, srcband.DataType)
        dst_ds.SetGeoTransform(datasrc.GetGeoTransform())
        dst_ds.SetProjection(datasrc.GetProjection())

        dstband = dst_ds.GetRasterBand(1)

        def sieve(srcband, dstband, sieveSize):
            gdal.SieveFilter(srcband, None, dstband, sieveSize)

        sieve(srcband, dstband, sieveSize)
        #Progress.addStep(2)
        dst_ds = None

        def reclass(rasterTemp, inClassNumber):
            dst_ds = gdal.Open(rasterTemp, gdal.GA_Update)
            srcband = dst_ds.GetRasterBand(1).ReadAsArray()
            # All data which is not forest is set to 0, so we fill all for the forest only, because it's a binary fill holes.
            # Set selected class as 1
            srcband[srcband != inClassNumber] = 0
            srcband[srcband == inClassNumber] = 1
            #QgsMessageLog.logMessage("Cannot sieve")

            dst_ds.GetRasterBand(1).WriteArray(srcband)
            dst_ds.FlushCache()
            return rasterTemp

        rasterTemp = reclass(rasterTemp, inClassNumber)

        #Progress.addStep(1)

        def polygonize(rasterTemp, outShp):

            sourceRaster = gdal.Open(rasterTemp)
            band = sourceRaster.GetRasterBand(1)
            driver = ogr.GetDriverByName("ESRI Shapefile")
            # If shapefile already exist, delete it
            if os.path.exists(outShp):
                driver.DeleteDataSource(outShp)

            outDatasource = driver.CreateDataSource(outShp)
            # get proj from raster
            srs = osr.SpatialReference()
            srs.ImportFromWkt(sourceRaster.GetProjectionRef())
            # create layer with proj
            outLayer = outDatasource.CreateLayer(outShp, srs)
            # Add class column (1,2...) to shapefile

            newField = ogr.FieldDefn('Class', ogr.OFTInteger)
            outLayer.CreateField(newField)
            print('vectorizing')
            gdal.Polygonize(band, None, outLayer, 0, [], callback=None)
            print('vectorized')
            outDatasource.Destroy()
            sourceRaster = None
            band = None
            #    QgsMessageLog.logMessage("Cannot vectorize "+rasterTemp)

            ioShpFile = ogr.Open(outShp, update=1)

            lyr = ioShpFile.GetLayerByIndex(0)
            nbFeatures = lyr.GetFeatureCount()
            lyr.ResetReading()

            for i in lyr:
                lyr.SetFeature(i)
                # if area is less than inMinSize or if it isn't forest, remove polygon
                if i.GetField('Class') != 1:
                    lyr.DeleteFeature(i.GetFID())
            ioShpFile.Destroy()

            #historicalProgress.reset()

            return outShp

        outShp = polygonize(rasterTemp, outShp)
        #Progress.addStep(7)
        #Progress.reset()
        return outShp
    def __init__(self,inImage,outName,inShapeGrey,inShapeMedian,iterMedian):
        # open data with Gdal
        try:
            data,im=dataraster.open_data_band(inImage)
        except:
            print 'Cannot open image'

        # get proj,geo and dimension (d) from data
        proj = data.GetProjection()
        geo = data.GetGeoTransform()
        d = data.RasterCount
        
        # Progress Bar
        maxStep=d+d*iterMedian
        try:
            filterProgress=progressBar(' Filtering...',maxStep)
        except:
            print 'Failed loading progress Bar'
        
        # Try all, if error close filterProgress        
        try:            
            # create empty geotiff with d dimension, geotransform & projection
            
            try:
                outFile=dataraster.create_empty_tiff(outName,im,d,geo,proj)
            except:
                print 'Cannot write empty image '+outName
            
            # fill outFile with filtered band
            for i in range(d):
                # Read data from the right band
                try:
                    filterProgress.addStep()
                    temp = data.GetRasterBand(i+1).ReadAsArray()
                    
                except:
                    print 'Cannot get rasterband'+i
                    QgsMessageLog.logMessage("Problem reading band "+str(i)+" from image "+inImage)
                # Filter with greyclosing, then with median filter
                try:
                    temp = ndimage.morphology.grey_closing(temp,size=(inShapeGrey,inShapeGrey))
                except:
                    print 'Cannot filter with Grey_Closing'
                    QgsMessageLog.logMessage("Problem with Grey Closing")
    
                for j in range(iterMedian):
                    try:
                        filterProgress.addStep()
                        temp = ndimage.filters.median_filter(temp,size=(inShapeMedian,inShapeMedian))
                    except:
                        print 'Cannot filter with Median'
                        QgsMessageLog.logMessage("Problem with median filter")
                    
                # Save bandand outFile
                try:
                    out=outFile.GetRasterBand(i+1)
                    out.WriteArray(temp)
                    out.FlushCache()
                    temp = None
                except:
                    QgsMessageLog.logMessage("Cannot save band"+str(i)+" on image" + outName)
                    
            filterProgress.reset()
        except:
            filterProgress.reset()