def reproject_MODIS(input_name, output_name, epsg_to): ''' Reproject the merged data file Keywords arguments: output_folder -- 'C:/file/to/path/' ''' import SEBAL.pySEBAL.pySEBAL_code as SEBAL # Get environmental variable SEBAL_env_paths = os.environ["SEBAL"].split(';') GDAL_env_path = SEBAL_env_paths[0] GDALWARP_PATH = os.path.join(GDAL_env_path, 'gdalwarp.exe') split_input = input_name.split('hdf":') inputname = '%shdf":"%s"' % (split_input[0], split_input[1]) # find path to the executable fullCmd = ' '.join([ "%s" % (GDALWARP_PATH), '-overwrite -s_srs "+proj=sinu +lon_0=0 +x_0=0 +y_0=0 +a=6371007.181 +b=6371007.181 +units=m +no_defs"', '-t_srs EPSG:%s -of GTiff' % (epsg_to), inputname, output_name ]) SEBAL.Run_command_window(fullCmd) return ()
os.chdir(input_folder) for file_name in [e for e in glob.glob('HDF5_*') if not e.endswith('.tif')]: print('Processing: ', file_name) extension = os.path.splitext(file_name)[1] file_name_only = os.path.splitext(file_name)[0] file_name_tiff = file_name_only + '.tif' out_name = os.path.join(input_folder, file_name_tiff) if not os.path.exists(out_name): # unzip bunzipfile if needed if str(extension) == '.bz2': fullCmd = '7z e %s -o%s' % (file_name, temp_folder) SEBAL.Run_command_window(fullCmd) input_folder_landsaf = temp_folder else: input_folder_landsaf = input_folder # Get environmental variable SEBAL_env_paths = os.environ["SEBAL"].split(';') GDAL_env_path = SEBAL_env_paths[0] GDAL_TRANSLATE = os.path.join(GDAL_env_path, 'gdal_translate.exe') GDALWARP = os.path.join(GDAL_env_path, 'gdalwarp.exe') # Set projection of GOES/LANDSAF data output_GOES_projected = os.path.join(temp_folder, 'GOES_projected_LANDSAF.tif') fullCmd = '"%s" -a_srs "+proj=geos +a=6378169 +b=6356583.8 +lon_0=0 +h=35785831" -a_ullr -5570248.832537 5570248.832537 5570248.832537 -5570248.832537 HDF5:"%s"://DSSF "%s"' % ( GDAL_TRANSLATE, os.path.join(
def Open_PROBAV_Reflectance(Name_PROBAV_Image, input_folder, output_folder, Example_fileName): import SEBAL.pySEBAL.pySEBAL_code as SEBAL # Define bands probav bands = ['SM', 'B1', 'B2', 'B3', 'B4'] #'SM', 'BLUE', 'RED', 'NIR', 'SWIR' # Get extension of PROBAV dataset Name_PROBAV, Name_PROBAV_exe = os.path.splitext(Name_PROBAV_Image) # Set the index number at 0 index = 0 # constants n188_float = 248 if (Name_PROBAV_exe == '.hdf5' or Name_PROBAV_exe == '.HDF5'): # write the data one by one to the spectral_reflectance_PROBAV for bandnmr in bands: # Translate the PROBA-V names to the Landsat band names Band_number = {'SM': 7, 'B1': 8, 'B2': 10, 'B3': 9, 'B4': 11} # Open the hdf file Band_PROBAVhdf_fileName = os.path.join(input_folder, Name_PROBAV_Image) g = gdal.Open(Band_PROBAVhdf_fileName, gdal.GA_ReadOnly) # Define temporary file out and band name in name_out = os.path.join(input_folder, '%s_test.tif' % (Name_PROBAV_Image)) name_in = g.GetSubDatasets()[Band_number[bandnmr]][0] # Get environmental variable SEBAL_env_paths = os.environ["SEBAL"].split(';') GDAL_env_path = SEBAL_env_paths[0] GDAL_TRANSLATE = os.path.join(GDAL_env_path, 'gdal_translate.exe') # run gdal translate command FullCmd = '%s -of GTiff %s %s' % (GDAL_TRANSLATE, name_in, name_out) SEBAL.Run_command_window(FullCmd) # Get the data array dest_PV = gdal.Open(name_out) Data = dest_PV.GetRasterBand(1).ReadAsArray() dest_PV = None # Define the x and y spacing Meta_data = g.GetMetadata() Lat_Top = float(Meta_data['LEVEL3_GEOMETRY_TOP_RIGHT_LATITUDE']) Lon_Left = float( Meta_data['LEVEL3_GEOMETRY_BOTTOM_LEFT_LONGITUDE']) Pixel_size = float( (Meta_data['LEVEL3_GEOMETRY_VNIR_VAA_MAPPING']).split(' ')[-3]) x_size_pv = int(Data.shape[1]) y_size_pv = int(Data.shape[0]) ulx = Lon_Left - 0.5 * Pixel_size uly = Lat_Top + 0.5 * Pixel_size lrx = ulx + x_size_pv * Pixel_size lry = uly - y_size_pv * Pixel_size # Define the georeference of the PROBA-V data geo_PROBAV = [ Lon_Left - 0.5 * Pixel_size, Pixel_size, 0, Lat_Top + 0.5 * Pixel_size, 0, -Pixel_size ] #0.000992063492063 ################################# Create a MEMORY file ############################## # create memory output with the PROBA-V band fmt = 'MEM' driver = gdal.GetDriverByName(fmt) dst_dataset = driver.Create('', int(Data.shape[1]), int(Data.shape[0]), 1, gdal.GDT_Float32) dst_dataset.SetGeoTransform(geo_PROBAV) # set the reference info srs = osr.SpatialReference() srs.SetWellKnownGeogCS("WGS84") dst_dataset.SetProjection(srs.ExportToWkt()) # write the array in the geotiff band dst_dataset.GetRasterBand(1).WriteArray(Data) ################################# reproject PROBAV MEMORY file ############################## # Reproject the PROBA-V band to match DEM's resolution PROBAV, ulx_dem, lry_dem, lrx_dem, uly_dem, epsg_to = SEBAL.reproject_dataset_example( dst_dataset, Example_fileName) dst_dataset = None #################################### Get example information ################################ if not "shape_lsc" in locals(): nrow = PROBAV.RasterYSize ncol = PROBAV.RasterXSize shape_lsc = [ncol, nrow] # Open the reprojected PROBA-V band data data_PROBAV_DN = PROBAV.GetRasterBand(1).ReadAsArray( 0, 0, ncol, nrow) # Define the filename to store the cropped Landsat image dst_FileName = os.path.join(output_folder, 'Output_radiation_balance', 'proy_PROBAV_%s.tif' % bandnmr) # close the PROBA-V g = None if not "spectral_reflectance_PROBAV" in locals(): spectral_reflectance_PROBAV = np.zeros( [shape_lsc[1], shape_lsc[0], 5]) # If the band data is the SM band than write the data into the spectral_reflectance_PROBAV and create cloud mask if bandnmr is 'SM': cloud_mask_temp = np.zeros(data_PROBAV_DN.shape) cloud_mask_temp[data_PROBAV_DN[:, :] != n188_float] = 1 spectral_reflectance_PROBAV[:, :, index] = cloud_mask_temp # If the band data is not SM change the DN values into PROBA-V values and write into the spectral_reflectance_PROBAV else: data_PROBAV = data_PROBAV_DN / 2000 spectral_reflectance_PROBAV[:, :, index] = data_PROBAV[:, :] # Change the spectral reflectance to meet certain limits spectral_reflectance_PROBAV[:, :, index] = np.where( spectral_reflectance_PROBAV[:, :, index] <= 0, np.nan, spectral_reflectance_PROBAV[:, :, index]) spectral_reflectance_PROBAV[:, :, index] = np.where( spectral_reflectance_PROBAV[:, :, index] >= 150, np.nan, spectral_reflectance_PROBAV[:, :, index]) # Save the PROBA-V as a tif file SEBAL.save_GeoTiff_proy(PROBAV, spectral_reflectance_PROBAV[:, :, index], dst_FileName, shape_lsc, nband=1) # Go to the next index index = index + 1 # Remove temporary file os.remove(name_out) else: for bandnmr in bands: # Open information Band_PROBAVhdf_fileName = os.path.join( input_folder, "%s_%s.tif" % (Name_PROBAV_Image, bandnmr)) g = gdal.Open(Band_PROBAVhdf_fileName, gdal.GA_ReadOnly) # Open original raster band x_size_pv = g.RasterXSize y_size_pv = g.RasterYSize geo_out = g.GetGeoTransform() ulx = geo_out[0] uly = geo_out[3] xDist = geo_out[1] yDist = geo_out[5] lrx = ulx + x_size_pv * xDist lry = uly - y_size_pv * yDist # Reproject the PROBA-V band to match DEM's resolution PROBAV, ulx_dem, lry_dem, lrx_dem, uly_dem, epsg_to = SEBAL.reproject_dataset_example( g, Example_fileName) data_PROBAV = PROBAV.GetRasterBand(1).ReadAsArray() # Define example array properties if not "shape_lsc" in locals(): nrow = PROBAV.RasterYSize ncol = PROBAV.RasterXSize shape_lsc = [ncol, nrow] # Define spectal reflactance empty array if not "spectral_reflectance_PROBAV" in locals(): spectral_reflectance_PROBAV = np.zeros( [shape_lsc[1], shape_lsc[0], 5]) # If the band data is the SM band than write the data into the spectral_reflectance_PROBAV and create cloud mask if bandnmr is 'SM': cloud_mask_temp = np.zeros(data_PROBAV.shape) cloud_mask_temp[data_PROBAV[:, :] != n188_float] = 1 spectral_reflectance_PROBAV[:, :, index] = cloud_mask_temp # If the band data is not SM change the DN values into PROBA-V values and write into the spectral_reflectance_PROBAV else: spectral_reflectance_PROBAV[:, :, index] = data_PROBAV[:, :] / 2000 # Define the filename to store the cropped Landsat image dst_FileName = os.path.join(output_folder, 'Output_radiation_balance', 'proy_PROBAV_%s.tif' % bandnmr) # Define shape if not "shape_lsc" in locals(): nrow = PROBAV.RasterYSize ncol = PROBAV.RasterXSize shape_lsc = [ncol, nrow] SEBAL.save_GeoTiff_proy(PROBAV, spectral_reflectance_PROBAV[:, :, index], dst_FileName, shape_lsc, nband=1) # Go to the next index index = index + 1 # Original size PROBAV dataset print('Original PROBA-V Image - ') print(' Size :', x_size_pv, y_size_pv) print(' Upper Left corner x, y: ', ulx, ', ', uly) print(' Lower right corner x, y: ', lrx, ', ', lry) print('Reprojected PROBA-V Image - ') print(' Size :', shape_lsc[1], shape_lsc[0]) print(' Upper Left corner x, y: ', ulx_dem, ', ', uly_dem) print(' Lower right corner x, y: ', lrx_dem, ', ', lry_dem) return (spectral_reflectance_PROBAV, cloud_mask_temp)
def Get_PROBAV_Para_Veg(workbook, number, Example_fileName, year, DOY, path_radiance, Apparent_atmosf_transm, cos_zn, dr, DEM_resh): import SEBAL.pySEBAL.pySEBAL_code as SEBAL # Open the General input sheet ws = workbook['General_Input'] # Extract the input and output folder, and Image type from the excel file input_folder = r"%s" % str(ws['B%d' % number].value) output_folder = r"%s" % str(ws['C%d' % number].value) ws = workbook['Additional_Input'] # If all additional fields are filled in than do not open the datasets if ws['B%d' % number].value is None or ws['C%d' % number].value is None: print( '--------------------- Open PROBA-V VIS ------------------------') # Open the Landsat_Input sheet ws = workbook['VIIRS_PROBAV_Input'] Name_PROBAV_Image = '%s' % str( ws['D%d' % number].value) # Must be a tiff file # Define the bands that will be used bands = ['SM', 'B1', 'B2', 'B3', 'B4'] #'SM', 'BLUE', 'RED', 'NIR', 'SWIR' sensor1 = 'PROBAV' sensor2 = 'VIIRS' res1 = '375m' res2 = '100m' res3 = '30m' # Set the index number at 0 index = 0 # constants n188_float = 248 # Now it is 248, but we do not exactly know what this really means and if this is for constant for all images. # write the data one by one to the spectral_reflectance_PROBAV for bandnmr in bands: # Translate the PROBA-V names to the Landsat band names Band_number = {'SM': 7, 'B1': 8, 'B2': 10, 'B3': 9, 'B4': 11} # Open the hdf file Band_PROBAVhdf_fileName = os.path.join( input_folder, '%s.HDF5' % (Name_PROBAV_Image)) g = gdal.Open(Band_PROBAVhdf_fileName, gdal.GA_ReadOnly) # Define temporary file out and band name in name_out = os.path.join(input_folder, '%s_test.tif' % (Name_PROBAV_Image)) name_in = g.GetSubDatasets()[Band_number[bandnmr]][0] # Get environmental variable SEBAL_env_paths = os.environ["SEBAL"].split(';') GDAL_env_path = SEBAL_env_paths[0] GDAL_TRANSLATE = os.path.join(GDAL_env_path, 'gdal_translate.exe') # run gdal translate command FullCmd = '%s -of GTiff %s %s' % (GDAL_TRANSLATE, name_in, name_out) SEBAL.Run_command_window(FullCmd) # Get the data array dest_PV = gdal.Open(name_out) Data = dest_PV.GetRasterBand(1).ReadAsArray() dest_PV = None # Remove temporary file os.remove(name_out) # Define the x and y spacing Meta_data = g.GetMetadata() Lat_Top = float(Meta_data['LEVEL3_GEOMETRY_TOP_RIGHT_LATITUDE']) Lon_Left = float( Meta_data['LEVEL3_GEOMETRY_BOTTOM_LEFT_LONGITUDE']) Pixel_size = float( (Meta_data['LEVEL3_GEOMETRY_VNIR_VAA_MAPPING']).split(' ')[-3]) # Define the georeference of the PROBA-V data geo_PROBAV = [ Lon_Left - 0.5 * Pixel_size, Pixel_size, 0, Lat_Top + 0.5 * Pixel_size, 0, -Pixel_size ] #0.000992063492063 ################################# Create a MEMORY file ############################## # create memory output with the PROBA-V band fmt = 'MEM' driver = gdal.GetDriverByName(fmt) dst_dataset = driver.Create('', int(Data.shape[1]), int(Data.shape[0]), 1, gdal.GDT_Float32) dst_dataset.SetGeoTransform(geo_PROBAV) # set the reference info srs = osr.SpatialReference() srs.SetWellKnownGeogCS("WGS84") dst_dataset.SetProjection(srs.ExportToWkt()) # write the array in the geotiff band dst_dataset.GetRasterBand(1).WriteArray(Data) ################################# reproject PROBAV MEMORY file ############################## # Reproject the PROBA-V band to match DEM's resolution PROBAV, ulx_dem, lry_dem, lrx_dem, uly_dem, epsg_to = SEBAL.reproject_dataset_example( dst_dataset, Example_fileName) dst_dataset = None #################################### Get example information ################################ if not "shape_lsc" in locals(): nrow = PROBAV.RasterYSize ncol = PROBAV.RasterXSize shape_lsc = [ncol, nrow] # Open the reprojected PROBA-V band data data_PROBAV_DN = PROBAV.GetRasterBand(1).ReadAsArray( 0, 0, ncol, nrow) # Define the filename to store the cropped Landsat image dst_FileName = os.path.join(output_folder, 'Output_radiation_balance', 'proy_PROBAV_%s.tif' % bandnmr) # close the PROBA-V g = None if not "spectral_reflectance_PROBAV" in locals(): spectral_reflectance_PROBAV = np.zeros( [shape_lsc[1], shape_lsc[0], 5]) # If the band data is not SM change the DN values into PROBA-V values and write into the spectral_reflectance_PROBAV if bandnmr is not 'SM': data_PROBAV = data_PROBAV_DN / 2000 spectral_reflectance_PROBAV[:, :, index] = data_PROBAV[:, :] # If the band data is the SM band than write the data into the spectral_reflectance_PROBAV and create cloud mask else: cloud_mask_temp = np.zeros(data_PROBAV_DN.shape) cloud_mask_temp[data_PROBAV_DN[:, :] != n188_float] = 1 spectral_reflectance_PROBAV[:, :, index] = cloud_mask_temp # Change the spectral reflectance to meet certain limits spectral_reflectance_PROBAV[:, :, index] = np.where( spectral_reflectance_PROBAV[:, :, index] <= 0, np.nan, spectral_reflectance_PROBAV[:, :, index]) spectral_reflectance_PROBAV[:, :, index] = np.where( spectral_reflectance_PROBAV[:, :, index] >= 150, np.nan, spectral_reflectance_PROBAV[:, :, index]) # Save the PROBA-V as a tif file SEBAL.save_GeoTiff_proy(PROBAV, spectral_reflectance_PROBAV[:, :, index], dst_FileName, shape_lsc, nband=1) # Go to the next index index = index + 1 # Original size PROBAV dataset x_size_pv = int(Data.shape[1]) y_size_pv = int(Data.shape[0]) ulx = Lon_Left - 0.5 * Pixel_size uly = Lat_Top + 0.5 * Pixel_size lrx = ulx + x_size_pv * Pixel_size lry = uly - y_size_pv * Pixel_size print('Original PROBA-V Image - ') print(' Size :', x_size_pv, y_size_pv) print(' Upper Left corner x, y: ', ulx, ', ', uly) print(' Lower right corner x, y: ', lrx, ', ', lry) print('Reprojected PROBA-V Image - ') print(' Size :', shape_lsc[1], shape_lsc[0]) print(' Upper Left corner x, y: ', ulx_dem, ', ', uly_dem) print(' Lower right corner x, y: ', lrx_dem, ', ', lry_dem) else: # Get General information example file lsc = gdal.Open(Example_fileName) nrow = lsc.RasterYSize ncol = lsc.RasterXSize shape_lsc = [ncol, nrow] ######################### Calculate Vegetation Parameters Based on VIS data ##################################### # Open the Additional input excel sheet ws = workbook['Additional_Input'] # Check NDVI and Calculate NDVI try: if (ws['B%d' % number].value) is not None: # Output folder NDVI ndvi_fileName_user = os.path.join( output_folder, 'Output_vegetation', 'User_NDVI_%s_%s_%s.tif' % (res3, year, DOY)) NDVI = SEBAL.Reshape_Reproject_Input_data( r'%s' % str(ws['B%d' % number].value), ndvi_fileName_user, Example_fileName) water_mask_temp = np.zeros((shape_lsc[1], shape_lsc[0])) water_mask_temp[NDVI < 0.0] = 1.0 SEBAL.save_GeoTiff_proy(lsc, NDVI, ndvi_fileName_user, shape_lsc, nband=1) else: n218_memory = spectral_reflectance_PROBAV[:, :, 2] + spectral_reflectance_PROBAV[:, :, 3] NDVI = np.zeros((shape_lsc[1], shape_lsc[0])) NDVI[n218_memory != 0] = ( spectral_reflectance_PROBAV[:, :, 3][n218_memory != 0] - spectral_reflectance_PROBAV[:, :, 2][n218_memory != 0]) / ( spectral_reflectance_PROBAV[:, :, 2][n218_memory != 0] + spectral_reflectance_PROBAV[:, :, 3][n218_memory != 0]) # Create Water mask based on PROBA-V water_mask_temp = np.zeros((shape_lsc[1], shape_lsc[0])) water_mask_temp[np.logical_and( spectral_reflectance_PROBAV[:, :, 2] >= spectral_reflectance_PROBAV[:, :, 3], DEM_resh > 0)] = 1 except: assert "Please check the NDVI input path" # Check Water Mask and replace if it is filled in the additianal data sheet try: if (ws['E%d' % number].value) is not None: # Overwrite the Water mask and change the output name water_mask_temp_fileName = os.path.join( output_folder, 'Output_soil_moisture', 'User_Water_mask_temporary_%s_%s_%s.tif' % (res2, year, DOY)) water_mask_temp = SEBAL.Reshape_Reproject_Input_data( r'%s' % str(ws['E%d' % number].value), water_mask_temp_fileName, Example_fileName) SEBAL.save_GeoTiff_proy(lsc, water_mask_temp, water_mask_temp_fileName, shape_lsc, nband=1) except: assert "Please check the Water Mask input path" # Check Surface albedo try: if (ws['C%d' % number].value) is not None: # Output folder surface albedo surface_albedo_fileName = os.path.join( output_folder, 'Output_vegetation', 'User_surface_albedo_%s_%s_%s.tif' % (res2, year, DOY)) Surf_albedo = SEBAL.Reshape_Reproject_Input_data( r'%s' % str(ws['C%d' % number].value), surface_albedo_fileName, Example_fileName) SEBAL.save_GeoTiff_proy(lsc, Surf_albedo, surface_albedo_fileName, shape_lsc, nband=1) else: # Calculate surface albedo based on PROBA-V Surf_albedo = 0.219 * spectral_reflectance_PROBAV[:, :, 1] + 0.361 * spectral_reflectance_PROBAV[:, :, 2] + 0.379 * spectral_reflectance_PROBAV[:, :, 3] + 0.041 * spectral_reflectance_PROBAV[:, :, 4] # Set limit surface albedo Surf_albedo = np.minimum(Surf_albedo, 0.6) except: assert "Please check the Albedo input path" # calculate vegetation properties FPAR, tir_emis, Nitrogen, vegt_cover, LAI, b10_emissivity = SEBAL.Calc_vegt_para( NDVI, water_mask_temp, shape_lsc) # create quality map QC_Map = np.zeros(NDVI.shape) QC_Map[np.isnan(NDVI)] = 1 print('Average NDVI = %s' % np.nanmean(NDVI)) print('Average Surface Albedo = %s' % np.nanmean(Surf_albedo)) print('Average LAI = %s' % np.nanmean(LAI)) print('Average Vegetation Cover = %s' % np.nanmean(vegt_cover)) print('Average FPAR = %s' % np.nanmean(FPAR)) return (Surf_albedo, NDVI, LAI, vegt_cover, FPAR, Nitrogen, tir_emis, b10_emissivity, water_mask_temp, QC_Map)