def create_consolidated_water_mask(self):
     sentinel2_mask_path=os.path.join(self.output_directory, 'sentinel2_water_mask.tif')
     sentinel2_mask_ds=gdal.Open(sentinel2_mask_path)
     sentinel2_mask_nodata_value=sentinel2_mask_ds.GetRasterBand(1).GetNoDataValue()
     sentinel2_mask_array=sentinel2_mask_ds.GetRasterBand(1).ReadAsArray()
     sentinel2_mask_ds=None
     
     landsat_mask_path=os.path.join(self.output_directory, 'landsat_water_mask.tif')
     landsat_mask_ds=gdal.Warp('MEM', landsat_mask_path,  options=gdal.WarpOptions(format = 'MEM', xRes = 10, yRes = -10))
     landsat_mask_nodata_value=landsat_mask_ds.GetRasterBand(1).GetNoDataValue()
     landsat_mask_array=landsat_mask_ds.GetRasterBand(1).ReadAsArray()
     landsat_mask_ds=None
     
     sentinel2_mask_array[sentinel2_mask_array==sentinel2_mask_nodata_value]=landsat_mask_array
             
     save_array_as_gtiff(sentinel2_mask_array, os.path.join(self.output_directory, 'sentinel2_landsat_water_mask.tif'), gtiff_path=os.path.join(self.output_directory, 'sentinel2_water_mask.tif'), dtype='uint', nodata_value=landsat_mask_nodata_value)
Пример #2
0
 def save_indices(self, output_folder):
     array = self.get_NDVI_as_array()
     save_array_as_gtiff(array,
                         output_folder + '/NDVI.tif',
                         dataset=self.nir)
     array = self.get_NDWI_as_array()
     save_array_as_gtiff(array,
                         output_folder + '/NDWI.tif',
                         dataset=self.nir)
     #array=self.get_MNDWI_as_array()
     #save_array_as_gtiff(array, output_folder+'/MNDWI.tif', dataset=self.nir)
     array = self.get_WRI_as_array()
     save_array_as_gtiff(array,
                         output_folder + '/WRI.tif',
                         dataset=self.nir)
     array = self.get_AWEI_as_array()
     save_array_as_gtiff(array,
                         output_folder + '/AWEI.tif',
                         dataset=self.nir)
     array = None
 def classify_dataset(self, landsat=False, sentinel2=False, bands_using=True, indices_using=True):
     if sentinel2==True:
         images_collection=[]
         if indices_using==True:
             indices=os.listdir(os.path.join(self.output_directory, 'sentinel2_indices'))
             for index in indices:
                 images_collection.append(os.path.join(self.output_directory, 'sentinel2_indices', index))
         if bands_using==True:
             bands=os.listdir(os.path.join(self.output_directory, 'sentinel2'))
             for band in bands:
                 if band!='cloud_mask.tif':
                     images_collection.append(os.path.join(self.output_directory, 'sentinel2', band)) 
         a=WatershesBasedClassifier(images_collection, base_image_index=2)
         a.get_classified_segmentation(os.path.join(self.output_directory, 'sentinel2_class.tif'), mode='raster', window_size=500, statistical_indicators=['mean', 'min', 'max'])
         a=None
         for index in indices:
             if index=='NDWI.tif':
                 ds=gdal.Open(os.path.join(self.output_directory, 'sentinel2_indices', index))
                 array=np.array(ds.GetRasterBand(1).ReadAsArray())
                 ds=None
                 ndwi_bin_array=get_binary_classified_array(array)
                 save_array_as_gtiff(ndwi_bin_array, os.path.join(self.output_directory, 'ndwi_bin_array.tif'), gtiff_path=os.path.join(self.output_directory, 'sentinel2_class.tif'))
                 array=None
             if 'NDVI' in index:
                 ds=gdal.Open(os.path.join(self.output_directory, 'sentinel2_indices', index))
                 array=np.array(ds.GetRasterBand(1).ReadAsArray())
                 ds=None
                 ndvi_bin_array=get_binary_classified_array(array)
                 save_array_as_gtiff(ndvi_bin_array, os.path.join(self.output_directory, 'ndvi_bin_array.tif'), gtiff_path=os.path.join(self.output_directory, 'sentinel2_class.tif'))
                 array=None 
         claster_ds=gdal.Open(os.path.join(self.output_directory, 'sentinel2_class.tif'))
         claster_array=np.array(claster_ds.GetRasterBand(1).ReadAsArray())
         claster_ds=None
         new_claster_array=get_binary_array_from_clasters(claster_array, [ndwi_bin_array, reverse_binary_array(ndvi_bin_array)])
         
         mask_path=os.path.join(self.output_directory, 'sentinel2', 'nir.tif')
         mask_ds=gdal.Open(mask_path)
         mask_array=mask_ds.getRasterBand(1).ReadAsArray()
         mask_nodata=mask_ds.getRasterBand(1).GetNoDataValue()
         mask_ds=None
         new_claster_array[mask_array==mask_nodata]=5
         mask_array=None
         
         ndwi_bin_array=None
         ndvi_bin_array=None
         save_array_as_gtiff(new_claster_array, os.path.join(self.output_directory, 'sentinel2_water_mask.tif'), gtiff_path=os.path.join(self.output_directory, 'sentinel2_class.tif'), dtype='uint', nodata_value=5)                
     
     if landsat==True:
         images_collection=[]
         if indices_using==True:
             indices=os.listdir(os.path.join(self.output_directory, 'landsat_indices'))
             for index in indices:
                 images_collection.append(os.path.join(self.output_directory, 'landsat_indices', index))
         if bands_using==True:
             bands=os.listdir(os.path.join(self.output_directory, 'landsat'))
             for band in bands:
                 if band!='cloud_mask.tif':
                     images_collection.append(os.path.join(self.output_directory, 'landsat', band)) 
         a=WatershesBasedClassifier(images_collection, base_image_index=2)
         a.get_classified_segmentation(os.path.join(self.output_directory, 'landsat_class.tif'), mode='raster', window_size=500, statistical_indicators=['mean', 'min', 'max'])
         a=None
         for index in indices:
             if index=='NDWI.tif':
                 ds=gdal.Open(os.path.join(self.output_directory, 'landsat_indices', index))
                 array=np.array(ds.GetRasterBand(1).ReadAsArray())
                 ds=None
                 ndwi_bin_array=get_binary_classified_array(array)
                 save_array_as_gtiff(ndwi_bin_array, os.path.join(self.output_directory, 'ndwi_bin_array.tif'), gtiff_path=os.path.join(self.output_directory, 'landsat_class.tif'), dtype='uint')
                 array=None
             if 'NDVI' in index:
                 ds=gdal.Open(os.path.join(self.output_directory, 'landsat_indices', index))
                 array=np.array(ds.GetRasterBand(1).ReadAsArray())
                 ds=None
                 ndvi_bin_array=get_binary_classified_array(array)
                 save_array_as_gtiff(ndvi_bin_array, os.path.join(self.output_directory, 'ndvi_bin_array.tif'), gtiff_path=os.path.join(self.output_directory, 'landsat_class.tif'), dtype='uint')
                 array=None 
         claster_ds=gdal.Open(os.path.join(self.output_directory, 'landsat_class.tif'))
         claster_array=np.array(claster_ds.GetRasterBand(1).ReadAsArray())
         claster_ds=None
         new_claster_array=get_binary_array_from_clasters(claster_array, [ndwi_bin_array, reverse_binary_array(ndvi_bin_array)])
         
         mask_path=os.path.join(self.output_directory, 'landsat', 'nir.tif')
         mask_ds=gdal.Open(mask_path)
         mask_array=mask_ds.getRasterBand(1).ReadAsArray()
         mask_nodata=mask_ds.getRasterBand(1).GetNoDataValue()
         mask_ds=None
         new_claster_array[mask_array==mask_nodata]=5
         mask_array=None
             
         ndwi_bin_array=None
         ndvi_bin_array=None
         save_array_as_gtiff(new_claster_array, os.path.join(self.output_directory, 'landsat_water_mask.tif'), gtiff_path=os.path.join(self.output_directory, 'landsat_class.tif'), dtype='uint', nodata_value=5)
Пример #4
0
    def save_landsat_prepared_images(self, output_folder):
        if self.landsat_folder != None:
            landsat_files = os.listdir(
                os.path.join(self.input_folder, self.landsat_folder))
            for file in landsat_files:
                if 'b3' in file.lower().split('.')[0].split('_'):
                    band_B3 = os.path.join(self.input_folder,
                                           self.landsat_folder, file)
                    print('band_B3: ' + file)
                if 'b4' in file.lower().split('.')[0].split('_'):
                    band_B4 = os.path.join(self.input_folder,
                                           self.landsat_folder, file)
                    print('band_B4: ' + file)
                if 'b5' in file.lower().split('.')[0].split('_'):
                    band_B5 = os.path.join(self.input_folder,
                                           self.landsat_folder, file)
                    print('band_B5: ' + file)
                if 'b6' in file.lower().split('.')[0].split('_'):
                    band_B6 = os.path.join(self.input_folder,
                                           self.landsat_folder, file)
                    print('band_B6: ' + file)
                if 'b7' in file.lower().split('.')[0].split('_'):
                    band_B7 = os.path.join(self.input_folder,
                                           self.landsat_folder, file)
                    print('band_B7: ' + file)
                if 'MTL' in file.split('.')[0].split('_'):
                    MTL_file = os.path.join(self.input_folder,
                                            self.landsat_folder, file)
                    print('MTL_file: ' + file)
                if 'ANG' in file.split('.')[0].split('_'):
                    ANG_file = os.path.join(self.input_folder,
                                            self.landsat_folder, file)
                    print('ANG_file: ' + file)
            bands_list = [band_B3, band_B4, band_B5, band_B6, band_B7]
            try:
                (os.mkdir(os.path.join(self.input_folder, 'temp')))
            except Exception:
                pass

            if self.landsat_correction_method == 'srem' and self.usgs_util_path == None:
                raise Exception(
                    "For using SREM correction indicate usgs_util_path!")
            if self.landsat_correction_method == 'srem' and self.usgs_util_path != None:
                srem = SREMPyLandsat(mode='landsat-usgs-utils')
                for band in bands_list:
                    if band != band_B6 and band != band_B7:
                        data = {
                            'band': band,
                            'metadata': MTL_file,
                            'angles_file': ANG_file,
                            'usgs_util_path': self.usgs_util_path,
                            'temp_dir': os.path.join(self.input_folder,
                                                     'temp/'),
                            'cygwin_bash_exe_path': None
                        }
                        srem.set_data(data)
                        sr = srem.get_srem_surface_reflectance_as_array()
                        if band == band_B3:
                            filename = os.path.join(output_folder, 'grn.tif')
                        if band == band_B4:
                            filename = os.path.join(output_folder, 'red.tif')
                        if band == band_B5:
                            filename = os.path.join(output_folder, 'nir.tif')
                        srem.save_array_as_gtiff(sr, filename)
                    else:
                        if band == band_B6:
                            filename = os.path.join(output_folder, 'mir.tif')
                        if band == band_B7:
                            filename = os.path.join(output_folder, 'swir.tif')
                        pre_image = LandsatBandCalibrator(band, MTL_file)
                        corrected_array = pre_image.get_dos_corrected_reflectance_as_array(
                        )
                        pre_image.save_array_as_gtiff(corrected_array,
                                                      filename)

            if self.landsat_correction_method == 'dos':
                for band in bands_list:
                    print('Running DOS: ' + band)
                    if band == band_B3:
                        filename = os.path.join(output_folder, 'grn.tif')
                    if band == band_B4:
                        filename = os.path.join(output_folder, 'red.tif')
                    if band == band_B5:
                        filename = os.path.join(output_folder, 'nir.tif')
                    if band == band_B6:
                        filename = os.path.join(output_folder, 'mir.tif')
                    if band == band_B7:
                        filename = os.path.join(output_folder, 'swir.tif')
                    pre_image = LandsatBandCalibrator(band, MTL_file)
                    corrected_array = pre_image.get_dos_corrected_reflectance_as_array(
                    )
                    pre_image.save_array_as_gtiff(corrected_array, filename)
                    pre_image = None

            if self.landsat_cloud_fmask == True:
                output_cloud_path = os.path.join(output_folder,
                                                 'cloud_mask.tif')
                input_directory = os.path.join(self.input_folder,
                                               self.landsat_folder)
                print('Running FMASK')
                cmd = '%s -o %s --scenedir %s --cloudbufferdistance %s --cloudprobthreshold %s --shadowbufferdistance %s' % (
                    FMASK_EXECUTABLE_PATH_LANDSAT, output_cloud_path,
                    input_directory, 30, 75.0, 0)
                print("cmd: " + cmd)
                os.system(cmd)
                os.remove(output_cloud_path + '.aux.xml')

                mask_ds = gdal.Open(output_cloud_path)
                mask_array = np.array(mask_ds.GetRasterBand(1).ReadAsArray())
                mask_ds = None
                output_files_list = os.listdir(output_folder)
                for file in output_files_list:
                    if file != 'cloud_mask.tif':
                        ds = gdal.Open(os.path.join(output_folder, file))
                        output_array = np.array(
                            ds.GetRasterBand(1).ReadAsArray())
                        output_array[mask_array == 2] = np.nan
                        output_array[mask_array == 3] = np.nan
                        save_array_as_gtiff(output_array,
                                            os.path.join(output_folder, file),
                                            dataset=ds)
                mask_array = None
                ds = None
                output_array = None

            shutil.rmtree(os.path.join(self.input_folder, 'temp'))
            try:
                os.remove(output_cloud_path + '.aux.xml')
            except Exception as e:
                print(e)
                pass
Пример #5
0
    def save_sentinel2_prepared_images(self, output_folder):
        if self.sentinel2_L2A_folder == None and self.sentinel2_L1C_folder != None:
            if self.sen2cor_util_path == None:
                raise Exception(
                    'For processing Sentinel-2 1C-level product sen2cor_util_path is required'
                )
            cmd = '%s %s' % (self.sen2cor_util_path,
                             os.path.join(self.input_folder,
                                          self.sentinel2_L1C_folder))

            #после демоверсии можно посмотреть на встроенную возможность использования ЦМР,
            #которую sen2cor сам же скачивает http://data_public:[email protected]/srtm/tiles/GeoTIFF/
            #но придется конфигурацию sen2cor менять пользователю, а не программно
            #поэтому пока без ЦМР

            print("cmd: " + cmd)
            os.system(cmd)
            self.sentinel2_L2A_folder = self.sentinel2_L1C_folder.replace(
                'MSIL1C', 'MSIL2A')

        if self.sentinel2_L2A_folder != None:
            granule_into_main = os.path.join(self.input_folder,
                                             self.sentinel2_L2A_folder,
                                             'GRANULE')
            images_dir = os.path.join(
                os.listdir(granule_into_main)[0], 'IMG_DATA')
            if self.sentinel2_resolution == 20:
                print('Output spatial resolution - 20')
                m_images_folder = os.path.join(granule_into_main, images_dir,
                                               'R20m')
                for file in os.listdir(m_images_folder):
                    if 'B03' in file.split('_') or 'B04' in file.split(
                            '_') or 'B8A' in file.split(
                                '_') or 'B11' in file.split(
                                    '_') or 'B12' in file.split('_'):
                        new_file = file.replace('B03', '__grn')
                        new_file = new_file.replace('B04', '__red')
                        new_file = new_file.replace('B8A', '__nir')
                        new_file = new_file.replace('B11', '__mir')
                        new_file = new_file.replace('B12', '__swir')
                        new_file = new_file.split('___')[-1]
                        new_file = new_file.replace('_20m', '')
                        gdal.Warp(
                            output_folder + '/' + new_file.split('.')[0] +
                            '.tif', os.path.join(m_images_folder, file))
            if self.sentinel2_resolution == 10:
                print('Output spatial resolution - 10')
                m_images_folder = os.path.join(granule_into_main, images_dir,
                                               'R10m')
                for file in os.listdir(m_images_folder):
                    if 'B03' in file.split('_') or 'B04' in file.split(
                            '_') or 'B08' in file.split('_'):
                        new_file = file.replace('B03', '__grn')
                        new_file = new_file.replace('B04', '__red')
                        new_file = new_file.replace('B08', '__nir')
                        new_file = new_file.split('___')[-1]
                        new_file = new_file.replace('_10m', '')
                        gdal.Warp(
                            output_folder + '/' + new_file.split('.')[0] +
                            '.tif', os.path.join(m_images_folder, file))
                mm_images_folder = os.path.join(granule_into_main, images_dir,
                                                'R20m')
                for file in os.listdir(mm_images_folder):
                    if 'B11' in file.split('_') or 'B12' in file.split('_'):
                        new_file = file.replace('B11', '__mir')
                        new_file = new_file.replace('B12', '__swir')
                        new_file = new_file.split('___')[-1]
                        gdal.Warp(output_folder + '/' +
                                  new_file.replace('_20m.jp2', '.tif'),
                                  os.path.join(mm_images_folder, file),
                                  xRes=10,
                                  yRes=-10,
                                  resampleAlg='bilinear')

        if self.sentinel2_cloud != None:

            if self.sentinel2_cloud == 'native_2A_level':
                cloud_mask_folder = os.path.join(granule_into_main, images_dir,
                                                 'R20m')
                for file in os.listdir(cloud_mask_folder):
                    if 'SCL' in file.split('_'):
                        cloud_mask_file = os.path.join(cloud_mask_folder, file)
                        cloud_flags = [3, 8, 9, 10, 11]
                if self.sentinel2_resolution == 10:
                    gdal.Warp(os.path.join(output_folder, 'cloud_mask.tif'),
                              cloud_mask_file,
                              xRes=10,
                              yRes=-10)
                    cloud_mask_file = os.path.join(output_folder,
                                                   'cloud_mask.tif')

            if self.sentinel2_cloud == 'fmask':
                if self.sentinel2_L1C_folder == None:
                    raise Exception(
                        'Fmask is applicable only to 1C-level product')
                cloud_mask_file = os.path.join(output_folder, 'cloud_mask.tif')
                print('Running FMASK')
                cmd = '%s -o %s --safedir %s --cloudbufferdistance %s --cloudprobthreshold %s --shadowbufferdistance %s' % (
                    FMASK_EXECUTABLE_PATH_SENTINEL, cloud_mask_file,
                    os.path.join(self.input_folder,
                                 self.sentinel2_L1C_folder), 30, 75.0, 0)
                print("cmd: " + cmd)
                os.system(cmd)
                try:
                    os.remove(cloud_mask_file + '.aux.xml')
                except Exception:
                    pass
                cloud_flags = [2, 3]
                if self.sentinel2_resolution == 10:
                    gdal.Warp(os.path.join(output_folder, 'cloud_mask.tif'),
                              cloud_mask_file,
                              xRes=10,
                              yRes=-10)
                    cloud_mask_file = os.path.join(output_folder,
                                                   'cloud_mask.tif')
                    print('del .aux.xml')
                    try:
                        os.remove(cloud_mask_file + '.aux.xml')
                    except Exception:
                        pass

            if self.sentinel2_cloud == 's2cloudless':
                print('Running s2cloudless')
                if self.sentinel2_resolution == 10:
                    resolution = '10m'
                if self.sentinel2_resolution == 20:
                    resolution = '20m'
                cloud_mask_file = os.path.join(output_folder, 'cloud_mask.tif')
                u = S2CloudDetectorUtil(os.path.join(
                    self.input_folder, self.sentinel2_L1C_folder),
                                        resolution=resolution)
                u.detect_clouds()
                u.export_to_gtiff(output_gtiff=cloud_mask_file, mode='mask')
                u = None
                cloud_flags = [1]

            mask_ds = gdal.Open(cloud_mask_file)
            mask_array = np.array(mask_ds.GetRasterBand(1).ReadAsArray())
            mask_ds = None
            for file in os.listdir(output_folder):
                if file != 'cloud_mask.tif':
                    print('Masking file: ' + file)
                    ds = gdal.Open(os.path.join(output_folder, file))
                    output_array = np.array(ds.GetRasterBand(1).ReadAsArray())
                    for flag in cloud_flags:
                        output_array[mask_array == flag] = 32767
                    save_array_as_gtiff(output_array,
                                        os.path.join(output_folder, file),
                                        dataset=ds,
                                        dtype='int')
                    new_ds = gdal.Open(os.path.join(output_folder, file),
                                       GA_Update)
                    new_ds.GetRasterBand(1).SetNoDataValue(32767)
            mask_array = None
            ds = None
            new_ds = None
            output_array = None