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