예제 #1
0
    def fmask(self):
        '''-----\n
            Este metodo genera el algortimo Fmask que sera el que vendra por defecto en la capa de calidad de
            las landsat a partir del otono de 2015'''

        os.chdir(self.ruta_escena)

        print 'comenzando Fmask'

        try:

            print 'comenzando Fmask'
            t = time.time()
            #El valor (el ultimo valor, que es el % de confianza sobre el pixel (nubes)) se pedira desde la interfaz que se haga.
            #Ultima version de Fmask 3.3
            a = os.system(
                '"C:/Program Files/Fmask/application/Fmask" 10 10 0 {}'.format(
                    self.umbral))
            a
            if a == 0:
                self.cloud_mask = 'Fmask'
                print 'Mascara de nubes (Fmask) generada en ' + str(
                    t - time.time()) + ' segundos'

            else:
                t = time.time()
                print 'comenzando Fmask NoTIRS'
                a = os.system('C:/Cloud_Mask/Fmask_3_2')
                a
                if a == 0:
                    self.cloud_mask = 'Fmask NoTIRS'
                    print 'Mascara de nubes (Fmask NoTIRS) generada en ' + str(
                        t - time.time()) + ' segundos'
                else:
                    print 'comenzando BQA'
                    for i in os.listdir(self.ruta_escena):
                        if i.endswith('BQA.TIF'):
                            masker = landsatmasker(
                                os.path.join(self.ruta_escena, i))
                            mask = masker.getcloudmask(confidence.high,
                                                       cirrus=True,
                                                       cumulative=True)
                            masker.savetif(
                                mask,
                                os.path.join(self.ruta_escena,
                                             self.escena + '_Fmask.TIF'))
                    self.cloud_mask = 'BQA'
                    print 'Mascara de nubes (BQA) generada en ' + str(
                        t - time.time()) + ' segundos'

        except Exception as e:

            print "Unexpected error:", type(e), e
예제 #2
0
 def fmask(self):
         
         '''-----\n
         Este metodo genera el algortimo Fmask que sera el que vendra por defecto en la capa de calidad de
         las landsat a partir del otono de 2015'''
         
         os.chdir(self.ruta_escena)
             
         print 'comenzando Fmask'
         
         try:
             
             print 'comenzando Fmask'
             t = time.time()
                 #El valor (el ultimo valor, que es el % de confianza sobre el pixel (nubes)) se pedira desde la interfaz que se haga.
                 #Ultima version de Fmask 3.3
             a = os.system('"C:/Program Files/Fmask/application/Fmask" 10 10 0 {}'.format(self.umbral))
             a
             if a == 0:
                 self.cloud_mask = 'Fmask'
                 print 'Mascara de nubes (Fmask) generada en ' + str(t-time.time()) + ' segundos'
                 
             else:
                 t = time.time()
                 print 'comenzando Fmask NoTIRS'
                 a = os.system('C:/Cloud_Mask/Fmask_3_2')
                 a
                 if a == 0:
                     self.cloud_mask = 'Fmask NoTIRS'
                     print 'Mascara de nubes (Fmask NoTIRS) generada en ' + str(t-time.time()) + ' segundos'
                 else:
                     print 'comenzando BQA'
                     for i in os.listdir(self.ruta_escena):
                         if i.endswith('BQA.TIF'):
                             masker = landsatmasker(os.path.join(self.ruta_escena, i))
                             mask = masker.getcloudmask(confidence.high, cirrus = True, cumulative = True)
                             masker.savetif(mask, os.path.join(self.ruta_escena, self.escena + '_Fmask.TIF'))
                     self.cloud_mask = 'BQA'
                     print 'Mascara de nubes (BQA) generada en ' + str(t-time.time()) + ' segundos'
                                        
         except Exception as e:
             
             print "Unexpected error:", type(e), e
예제 #3
0
파일: test.py 프로젝트: dongjwOU/pymasker
import sys
sys.path.append('D:\\Projects\\Python\\pymasker\\pymasker')

import gdal
from pymasker import landsatmasker
from pymasker import confidence
from pymasker import masker

# *************************************************************************** #
#                             Landsat Test                  
# *************************************************************************** #
bandfile = gdal.Open(r'D:\Documents\University Course\SUNY Buffalo\GEO653 Advanced Remote Sensing\Project\Data\Clipped Image\BQA_Clipped.TIF')
qabband = bandfile.GetRasterBand(1).ReadAsArray()

masker = landsatmasker(qabband)
masker.bandfile = bandfile
mask = masker.getmultimask(cloud=confidence.high, cirrus = confidence.high, inclusive = True)
masker.savetif(mask, r'C:\Users\Yu\Desktop\\test6.tif')

# *************************************************************************** #
#                               Modis Test                  
# *************************************************************************** #
# bandfile = 'C:\\Users\\Yu\Desktop\\MOD09GQ.A2014274.h11v05.005.2014279025826.hdf'
# bandnum = 3

# masker = masker(bandfile, bandnum)
# mask = masker.getmask(13, 1, '1')
# masker.savetif(mask, r'C:\Users\Yu\Desktop\\test4.tif')
예제 #4
0
    def get_kl_csw(self):
        '''Este metodo obtiene los Kl para cada banda. Lo hace buscando los valores minimos dentro 
        de las zonas clasificadas como agua y sombra orografica, siempre y cuando la sombra orografica 
        no este cubierta por nubes ni sombra de nubes. La calidad de la mascara e muy importante, por eso
        a las escenas que no se puedan realizar con Fmask habria que revisarles el valor de kl.'''

        #Empezamos borrando los archivos de temp, la idea de esto es que al acabar una escena queden disponibles
        #por si se quiere comprobar algo. Ya aqui se borran antes de comenzar la siguiente
        t = time.time()

        temp = os.path.join(self.data, 'temp')
        for i in os.listdir(temp):
            arz = os.path.join(temp, i)
            os.remove(arz)

        #Hacemos el recorte al dtm para que tenga la misma extension que la escena y poder operar con los arrays
        t = time.time()
        shape = os.path.join(temp, 'poly_escena.shp')

        ruta = self.ruta_escena

        for i in os.listdir(ruta):

            if i.endswith('B1.TIF'):
                raster = os.path.join(ruta, i)

        cmd = ["gdaltindex", shape, raster]
        proc = subprocess.Popen(cmd,
                                stdout=subprocess.PIPE,
                                stderr=subprocess.PIPE)
        stdout, stderr = proc.communicate()
        exit_code = proc.wait()

        if exit_code:
            raise RuntimeError(stderr)
        else:
            print stdout
            print 'marco generado'

        #ya tenemos el dtm recortado guardado en data/temp, ahora vamos a generar el hillshade.
        #Para ello primero hay que recortar el dtm con el shape recien obtenido con la extension de la escena
        #vamos a usar la variable 'zone' para usar el dtm reproyectado al huso 30 o 29
        dtm_escena = os.path.join(temp, 'dtm_escena.img')

        #AQUI VAMOS A DEFINIR COMO FIJO EL DTM EN HUSO 17- ESTO ES NUEVO PARA CUBA!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

        if self.zone == 17:
            dtm = os.path.join(self.data, 'cubadtm_aster.tif')
        elif self.zone == 18:
            dtm = os.path.join(self.data, 'cubadtm_aster_182.tif')
        elif self.zone == 16:
            dtm = os.path.join(self.data, 'cubadtm_aster_16.tif')
        else:
            print 'No se que zona es...'
        print dtm

        cmd = [
            "gdalwarp", "-dstnodata", "0", "-cutline", "-crop_to_cutline",
            "-of", "ENVI"
        ]
        #cmd = ["gdalwarp", "-cutline", "-crop_to_cutline", "-of", "ENVI"] #PROBAR A DEJAR EL DTM ORIGINAL -9999 A VER SI SALE MEJOR
        cmd.append(dtm)
        cmd.append(dtm_escena)
        cmd.insert(4, shape)  #seria el 4/2 con/sin el dst nodata
        proc = subprocess.Popen(cmd,
                                stdout=subprocess.PIPE,
                                stderr=subprocess.PIPE)
        stdout, stderr = proc.communicate()
        exit_code = proc.wait()

        if exit_code:
            raise RuntimeError(stderr)
        else:
            print stdout
            print 'dtm_escena generado'

        #Ahora ya tenemos el dtm de la escena, a continuacion vamos a obtener el hillshade
        #primero debemos tomar los parametros solares del MTL
        for i in os.listdir(ruta):
            if i.endswith('MTL.txt'):
                mtl = os.path.join(ruta, i)
                arc = open(mtl, 'r')
                for i in arc:
                    if 'SUN_AZIMUTH' in i:
                        azimuth = float(i.split("=")[1])
                    elif 'SUN_ELEVATION' in i:
                        elevation = float(i.split("=")[1])

        #Una vez tenemos estos parametros generamos el hillshade
        salida = os.path.join(temp, 'hillshade.img')
        cmd = ["gdaldem", "hillshade", "-az", "-alt", "-of", "ENVI"]
        cmd.append(dtm_escena)
        cmd.append(salida)
        cmd.insert(3, str(azimuth))
        cmd.insert(5, str(elevation))
        proc = subprocess.Popen(cmd,
                                stdout=subprocess.PIPE,
                                stderr=subprocess.PIPE)
        stdout, stderr = proc.communicate()
        exit_code = proc.wait()

        if exit_code:
            raise RuntimeError(stderr)
        else:
            print stdout
            print 'Hillshade generado'

        #Ya esta el hillshade en data/temp. Tambien tenemos ya la Fmask generada en ori,
        #asi que ya podemos operar con los arrays
        for i in os.listdir(ruta):
            if i.endswith('MTLFmask.img') | i.endswith('_Fmask.TIF'):
                rs = os.path.join(ruta, i)
                fmask = gdal.Open(rs)
                Fmask = fmask.ReadAsArray()
                print 'min, max: ', Fmask.min(), Fmask.max()
        for i in os.listdir(temp):
            if i.endswith('shade.img'):
                rst = os.path.join(temp, i)
                print rst
                hillshade = gdal.Open(rst)
                Hillshade = hillshade.ReadAsArray()

        #Queremos los pixeles de cada banda que esten dentro del valor agua (1) y sin nada definido ((0)
        #para las sombras) de la Fmask (con lo cual tambien excluimos las nubes y sombras de nubes).
        #Junto con estos valores, queremos tambien los valores que caen en sombra (se ha decidido que
        #el valor de corte mas adecuado es el percentil 20)

        #Arriba estamos diciendo que queremos el minimo del agua o de la escena completa sin nubes ni
        #sombras ni agua pero en sombra orografica

        #Ahora vamos a aplicar la mascara y hacer los histogramas
        # if self.sat == 'L8': En principio solo seran Landsat 8
        bandas = ['B1', 'B2', 'B3', 'B4', 'B5', 'B6', 'B6', 'B7', 'B9']
        lista_kl = []
        for i in os.listdir(ruta):
            banda = i[-6:-4]
            if banda in bandas:
                raster = os.path.join(ruta, i)
                bandraster = gdal.Open(raster)
                data = bandraster.ReadAsArray()
                #anadimos la distincion entre Fmask y BQA
                if self.cloud_mask == 'Fmask' or self.cloud_mask == 'Fmask NoTIRS':
                    print 'usando Fmask'
                    data2 = data[((Fmask == 1) |
                                  (((Fmask == 0)) &
                                   (Hillshade <
                                    (np.percentile(Hillshade, 20)))))]

                else:
                    print 'usando BQA\ngenerando water mask'

                    for i in os.listdir(ruta):
                        if i.endswith('BQA.TIF'):
                            masker = landsatmasker(os.path.join(ruta, i))
                            maskwater = masker.getwatermask(
                                confidence.medium
                            )  #cogemos la confianza media, a veces no hay nada en la alta
                            #print 'watermin, watermax: ', maskwater.min(), maskwater.max()

                            data2 = data[((data != 0) & ((maskwater == 1) | (
                                ((Fmask == 0)) &
                                (Hillshade <
                                 (np.percentile(Hillshade, 20))))))]
                            print 'data2: ', data2.min(), data2.max(
                            ), data2.size

                lista_kl.append(
                    data2.min()
                )  #anadimos el valor minimo (podria ser perceniles) a la lista de kl
                lista = sorted(data2.tolist())
                print 'lista: ', lista[:10]
                #nmask = (data2<lista[1000])#probar a coger los x valores mas bajos, a ver hasta cual aguanta bien
                data3 = data2[data2 < lista[self.hist]]
                print 'data3: ', data3.min(), data3.max()

                df = pandas.DataFrame(data3)
                #plt.figure(); df.hist(figsize=(10,8), bins = 100)#incluir titulo y rotulos de ejes
                plt.figure()
                df.hist(figsize=(10, 8),
                        bins=50,
                        cumulative=False,
                        color="Red")
                plt.title(self.escena + '_gr_' + banda, fontsize=18)
                plt.xlabel("Pixel Value", fontsize=16)
                plt.ylabel("Count", fontsize=16)
                path_rad = os.path.join(self.rad, self.escena)
                if not os.path.exists(path_rad):
                    os.makedirs(path_rad)
                name = os.path.join(
                    path_rad, self.escena + '_r_' + banda.lower() + '.png')
                plt.savefig(name)

        plt.close('all')
        print 'Histogramas generados'

        #Hasta aqui tenemos los histogramas generados y los valores minimos guardados en lista_kl, ahora
        #debemos escribir los valores minimos de cada banda en el archivo kl.rad
        for i in os.listdir(self.rad):

            if i.endswith('l8.rad'):

                archivo = os.path.join(self.rad, i)
                dictio = {6: lista_kl[0], 7: lista_kl[1], 8: lista_kl[2], 9: lista_kl[3],\
                10: lista_kl[4], 11: lista_kl[5], 12: lista_kl[6], 14: lista_kl[7]}

                rad = open(archivo, 'r')
                rad.seek(0)
                lineas = rad.readlines()

                for l in range(len(lineas)):

                    if l in dictio.keys():
                        lineas[l] = lineas[l].rstrip()[:-4] + str(
                            dictio[l]) + '\n'
                    else:
                        continue

                rad.close()

                f = open(archivo, 'w')
                for linea in lineas:
                    f.write(linea)

                f.close()

                src = os.path.join(self.rad, i)
                dst = os.path.join(path_rad, self.escena + '_kl.rad')
                shutil.copy(src, dst)

        print 'modificados los metadatos del archivo kl.rad\nProceso finalizado en ' + str(
            time.time() - t) + ' segundos'
        print lista_kl
예제 #5
0
    def get_kl_csw(self):
        
        '''Este metodo obtiene los Kl para cada banda. Lo hace buscando los valores minimos dentro 
        de las zonas clasificadas como agua y sombra orografica, siempre y cuando la sombra orografica 
        no este cubierta por nubes ni sombra de nubes. La calidad de la mascara e muy importante, por eso
        a las escenas que no se puedan realizar con Fmask habria que revisarles el valor de kl.'''
    
        #Empezamos borrando los archivos de temp, la idea de esto es que al acabar una escena queden disponibles
        #por si se quiere comprobar algo. Ya aqui se borran antes de comenzar la siguiente
        t = time.time()

        temp = os.path.join(self.data, 'temp')
        for i in os.listdir(temp):
            arz = os.path.join(temp, i)
            os.remove(arz)

        #Hacemos el recorte al dtm para que tenga la misma extension que la escena y poder operar con los arrays
        t = time.time()
        shape = os.path.join(temp, 'poly_escena.shp')
        
        ruta = self.ruta_escena

        for i in os.listdir(ruta):

            if i.endswith('B1.TIF'):
                raster = os.path.join(ruta, i)

        cmd = ["gdaltindex", shape, raster]
        proc = subprocess.Popen(cmd,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
        stdout,stderr=proc.communicate()
        exit_code=proc.wait()

        if exit_code: 
            raise RuntimeError(stderr)
        else:
            print stdout
            print 'marco generado'

        #ya tenemos el dtm recortado guardado en data/temp, ahora vamos a generar el hillshade.  
        #Para ello primero hay que recortar el dtm con el shape recien obtenido con la extension de la escena
        #vamos a usar la variable 'zone' para usar el dtm reproyectado al huso 30 o 29
        dtm_escena = os.path.join(temp, 'dtm_escena.img')

        #AQUI VAMOS A DEFINIR COMO FIJO EL DTM EN HUSO 17- ESTO ES NUEVO PARA CUBA!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

        
        if self.zone == 17:
            dtm = os.path.join(self.data, 'cubadtm_aster.tif')
        elif self.zone == 18:
            dtm = os.path.join(self.data, 'cubadtm_aster_182.tif')
        elif self.zone == 16:
            dtm = os.path.join(self.data, 'cubadtm_aster_16.tif')
        else:
            print 'No se que zona es...'
        print dtm


        cmd = ["gdalwarp", "-dstnodata" , "0" , "-cutline", "-crop_to_cutline", "-of", "ENVI"]
        #cmd = ["gdalwarp", "-cutline", "-crop_to_cutline", "-of", "ENVI"] #PROBAR A DEJAR EL DTM ORIGINAL -9999 A VER SI SALE MEJOR
        cmd.append(dtm)
        cmd.append(dtm_escena)
        cmd.insert(4, shape) #seria el 4/2 con/sin el dst nodata
        proc = subprocess.Popen(cmd,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
        stdout,stderr=proc.communicate()
        exit_code=proc.wait()

        if exit_code: 
            raise RuntimeError(stderr)
        else:
            print stdout
            print 'dtm_escena generado'

        #Ahora ya tenemos el dtm de la escena, a continuacion vamos a obtener el hillshade 
        #primero debemos tomar los parametros solares del MTL
        for i in os.listdir(ruta):
            if i.endswith('MTL.txt'):
                mtl = os.path.join(ruta,i)
                arc = open(mtl,'r')
                for i in arc:
                    if 'SUN_AZIMUTH' in i:
                        azimuth = float(i.split("=")[1])
                    elif 'SUN_ELEVATION' in i:
                        elevation = float(i.split("=")[1])

        #Una vez tenemos estos parametros generamos el hillshade
        salida = os.path.join(temp, 'hillshade.img')
        cmd = ["gdaldem", "hillshade", "-az", "-alt", "-of", "ENVI"]
        cmd.append(dtm_escena)
        cmd.append(salida)
        cmd.insert(3, str(azimuth))
        cmd.insert(5, str(elevation))
        proc = subprocess.Popen(cmd,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
        stdout,stderr=proc.communicate()
        exit_code=proc.wait()

        if exit_code: 
            raise RuntimeError(stderr)
        else:
            print stdout
            print 'Hillshade generado'

        #Ya esta el hillshade en data/temp. Tambien tenemos ya la Fmask generada en ori, 
        #asi que ya podemos operar con los arrays
        for i in os.listdir(ruta):
            if i.endswith('MTLFmask.img') | i.endswith('_Fmask.TIF'):
                rs = os.path.join(ruta, i)
                fmask = gdal.Open(rs)
                Fmask = fmask.ReadAsArray()
                print 'min, max: ', Fmask.min(), Fmask.max()
        for i in os.listdir(temp):
            if i.endswith('shade.img'):
                rst = os.path.join(temp, i)
                print rst
                hillshade = gdal.Open(rst)
                Hillshade = hillshade.ReadAsArray()

        #Queremos los pixeles de cada banda que esten dentro del valor agua (1) y sin nada definido ((0) 
        #para las sombras) de la Fmask (con lo cual tambien excluimos las nubes y sombras de nubes). 
        #Junto con estos valores, queremos tambien los valores que caen en sombra (se ha decidido que 
        #el valor de corte mas adecuado es el percentil 20)

        #Arriba estamos diciendo que queremos el minimo del agua o de la escena completa sin nubes ni 
        #sombras ni agua pero en sombra orografica

        #Ahora vamos a aplicar la mascara y hacer los histogramas
        # if self.sat == 'L8': En principio solo seran Landsat 8
        bandas = ['B1', 'B2', 'B3', 'B4','B5', 'B6', 'B6', 'B7', 'B9']
        lista_kl = []
        for i in os.listdir(ruta):
            banda = i[-6:-4]
            if banda in bandas:
                raster = os.path.join(ruta, i)
                bandraster = gdal.Open(raster)
                data = bandraster.ReadAsArray()
                #anadimos la distincion entre Fmask y BQA
                if self.cloud_mask == 'Fmask' or self.cloud_mask == 'Fmask NoTIRS':
                    print 'usando Fmask'
                    data2 = data[((Fmask==1) | (((Fmask==0)) & (Hillshade<(np.percentile(Hillshade, 20)))))]

                else:
                    print 'usando BQA\ngenerando water mask'

                    for i in os.listdir(ruta):
                        if i.endswith('BQA.TIF'):
                            masker = landsatmasker(os.path.join(ruta, i))  
                            maskwater = masker.getwatermask(confidence.medium) #cogemos la confianza media, a veces no hay nada en la alta
                            #print 'watermin, watermax: ', maskwater.min(), maskwater.max()

                            data2 = data[((data != 0) & ((maskwater==1) | (((Fmask==0)) & (Hillshade<(np.percentile(Hillshade, 20))))))]
                            print 'data2: ', data2.min(), data2.max(), data2.size

                lista_kl.append(data2.min())#anadimos el valor minimo (podria ser perceniles) a la lista de kl
                lista = sorted(data2.tolist())
                print 'lista: ', lista[:10]
                #nmask = (data2<lista[1000])#probar a coger los x valores mas bajos, a ver hasta cual aguanta bien
                data3 = data2[data2<lista[self.hist]]
                print 'data3: ', data3.min(), data3.max()

                df = pandas.DataFrame(data3)
                #plt.figure(); df.hist(figsize=(10,8), bins = 100)#incluir titulo y rotulos de ejes
                plt.figure(); df.hist(figsize=(10,8), bins = 50, cumulative=False, color="Red"); 
                plt.title(self.escena + '_gr_' + banda, fontsize = 18)
                plt.xlabel("Pixel Value", fontsize=16)  
                plt.ylabel("Count", fontsize=16)
                path_rad = os.path.join(self.rad, self.escena)
                if not os.path.exists(path_rad):
                    os.makedirs(path_rad)
                name = os.path.join(path_rad, self.escena + '_r_'+ banda.lower() + '.png')
                plt.savefig(name)

        plt.close('all')
        print 'Histogramas generados'

        #Hasta aqui tenemos los histogramas generados y los valores minimos guardados en lista_kl, ahora 
        #debemos escribir los valores minimos de cada banda en el archivo kl.rad
        for i in os.listdir(self.rad):

                if i.endswith('l8.rad'):

                    archivo = os.path.join(self.rad, i)
                    dictio = {6: lista_kl[0], 7: lista_kl[1], 8: lista_kl[2], 9: lista_kl[3],\
                    10: lista_kl[4], 11: lista_kl[5], 12: lista_kl[6], 14: lista_kl[7]}
                    

                    rad = open(archivo, 'r')
                    rad.seek(0)
                    lineas = rad.readlines()

                    for l in range(len(lineas)):

                        if l in dictio.keys():
                            lineas[l] = lineas[l].rstrip()[:-4] + str(dictio[l]) + '\n'
                        else: continue

                    rad.close()

                    f = open(archivo, 'w')
                    for linea in lineas:
                        f.write(linea)

                    f.close()

                    src = os.path.join(self.rad, i)
                    dst = os.path.join(path_rad, self.escena + '_kl.rad')
                    shutil.copy(src, dst)

        print 'modificados los metadatos del archivo kl.rad\nProceso finalizado en ' + str(time.time()-t) + ' segundos'
        print lista_kl