def superimpose(inm, inr): run_subprocess( '{otb_bin_path}/otbcli_Superimpose -inr {inr} -inm {inm} -out {out}'. format(otb_bin_path=settings.OTB_BIN_PATH, inr=os.path.join(RESULTS_SRC, "{}.tif".format(inr)), inm=os.path.join(RESULTS_SRC, "{}.tif".format(inm)), out=os.path.join(RESULTS_FEAT, "{}.tif".format(inm))))
def clip(product): print("# Clip", product['title']) name = '{}.SAFE'.format(product['title']) dst_folder = os.path.join(S1_RAW_PATH, 'proc', name, 'clip') os.makedirs(dst_folder, exist_ok=True) vv_src = os.path.join(S1_RAW_PATH, 'proc', name, 'despeck', 'vv.tiff') vv_dst = os.path.join(dst_folder, 'vv.tiff') if not os.path.exists(vv_dst): run_subprocess( '{gdal_bin_path}/gdalwarp -of GTiff -cutline {aoi} -crop_to_cutline {src} {dst}' .format(gdal_bin_path=settings.GDAL_BIN_PATH, aoi=AOI_PATH, src=vv_src, dst=vv_dst)) vh_src = os.path.join(S1_RAW_PATH, 'proc', name, 'despeck', 'vh.tiff') vh_dst = os.path.join(dst_folder, 'vh.tiff') if not os.path.exists(vh_dst): run_subprocess( '{gdal_bin_path}/gdalwarp -of GTiff -cutline {aoi} -crop_to_cutline {src} {dst}' .format(gdal_bin_path=settings.GDAL_BIN_PATH, aoi=AOI_PATH, src=vh_src, dst=vh_dst))
def orthorectify(product): print("# Orthorectify", product['title']) name = '{}.SAFE'.format(product['title']) dst_folder = os.path.join(S1_RAW_PATH, 'proc', name, 'ortho') os.makedirs(dst_folder, exist_ok=True) src = os.path.join(S1_RAW_PATH, 'proc', name, 'calib', 'vv.tiff') dst = os.path.join(dst_folder, 'vv.tiff') if not os.path.exists(dst): run_subprocess( '{otb_bin_path}/otbcli_OrthoRectification -io.in {src} -io.out {dst} -elev.geoid {geoid_path} -elev.dem {dem_path} -opt.gridspacing 50' .format(otb_bin_path=settings.OTB_BIN_PATH, src=src, dst=dst, geoid_path=GEOID_PATH, dem_path=DEM_PATH)) src = os.path.join(S1_RAW_PATH, 'proc', name, 'calib', 'vh.tiff') dst = os.path.join(dst_folder, 'vh.tiff') if not os.path.exists(dst): run_subprocess( '{otb_bin_path}/otbcli_OrthoRectification -io.in {src} -io.out {dst} -elev.geoid {geoid_path} -elev.dem {dem_path} -opt.gridspacing 50' .format(otb_bin_path=settings.OTB_BIN_PATH, src=src, dst=dst, geoid_path=GEOID_PATH, dem_path=DEM_PATH))
def classify_image(): run_subprocess( '{otb_bin_path}/otbcli_ImageClassifier -in {input} -model {model} -out {out}' .format(otb_bin_path=settings.OTB_BIN_PATH, input=os.path.join(RESULTS_DIR, 'features.tif'), model=MODEL_PATH, out=os.path.join(RESULTS_DIR, 'cover.tif')))
def superimpose(products): print("# Superimpose") ref_product = products[0] ref_name = '{}.SAFE'.format(ref_product['title']) inr = os.path.join(S1_RAW_PATH, 'proc', ref_name, 'concatenate', 'concatenate.tiff') dst = os.path.join(S1_RAW_PATH, 'proc', ref_name, 'concatenate', 'aligned.tiff') if not os.path.exists(dst): shutil.copyfile(inr, dst) for p in products[1:]: name = '{}.SAFE'.format(p['title']) inm = os.path.join(S1_RAW_PATH, 'proc', name, 'concatenate', 'concatenate.tiff') dst = os.path.join(S1_RAW_PATH, 'proc', name, 'concatenate', 'aligned.tiff') if not os.path.exists(dst): run_subprocess( '{otb_bin_path}/otbcli_Superimpose -inr {inr} -inm {inm} -out {out}' .format(otb_bin_path=settings.OTB_BIN_PATH, inr=inr, inm=inm, out=dst))
def generate_vvvh(period): print("# Generate VV/VH band", period) src = os.path.join(S1_RES_PATH, str(period.pk), 'median.tiff') dst = os.path.join(S1_RES_PATH, str(period.pk), 'vv-vh.tiff') if not os.path.exists(dst): run_subprocess( '{otb_bin_path}/otbcli_BandMath -il {src} -out {dst} -exp "im1b1 / im1b2"' .format(otb_bin_path=settings.OTB_BIN_PATH, src=src, dst=dst))
def extract_haralick(name, band): run_subprocess( '{otb_bin_path}/otbcli_HaralickTextureExtraction -in {input} -channel {band} -texture simple -parameters.min 0 -parameters.max 0.3 -out {out}' .format(otb_bin_path=settings.OTB_BIN_PATH, input=os.path.join(RESULTS_FEAT, "{}.tif".format(name)), band=band, out=os.path.join(RESULTS_FEAT, 'haralick_{}_{}.tif'.format(name, band))))
def extract_local_stats(name, band): run_subprocess( '{otb_bin_path}/otbcli_LocalStatisticExtraction -in {input} -channel {band} -radius 3 -out {out}' .format(otb_bin_path=settings.OTB_BIN_PATH, input=os.path.join(RESULTS_FEAT, "{}.tif".format(name)), band=band, out=os.path.join(RESULTS_FEAT, 'local_stats_{}_{}.tif'.format(name, band))))
def concatenate_images(): current_dir = os.getcwd() os.chdir(RESULTS_FEAT) run_subprocess( '{otb_bin_path}/otbcli_ConcatenateImages -il $(ls {il}) -out {out}'. format(otb_bin_path=settings.OTB_BIN_PATH, il=RESULTS_FEAT, out=os.path.join(RESULTS_DIR, 'features.tif'))) os.chdir(current_dir)
def concatenate_results(period): print("# Concatenate results", period) median = os.path.join(S1_RES_PATH, str(period.pk), 'median.tiff') vv_vh = os.path.join(S1_RES_PATH, str(period.pk), 'vv-vh.tiff') dst = os.path.join(S1_RES_PATH, str(period.pk), 'concatenate.tiff') if not os.path.exists(dst): run_subprocess( '{otb_bin_path}/otbcli_ConcatenateImages -il {median} {vv_vh} -out {dst}' .format(otb_bin_path=settings.OTB_BIN_PATH, median=median, vv_vh=vv_vh, dst=dst))
def clip_results(period_s): mosaic_path = os.path.join(settings.IMAGES_PATH, 'mosaic', period_s) tif_10m = f's2_{period_s}_10m.tif' tif_20m = f's2_{period_s}_20m.tif' srcs = [tif_10m, tif_20m] for src in srcs: run_subprocess( '{gdal_bin_path}/gdalwarp -of GTiff -cutline {aoi} -crop_to_cutline {src} {dst}' .format(gdal_bin_path=settings.GDAL_BIN_PATH, aoi=AOI_UTM_PATH, src=os.path.join(mosaic_path, src), dst=os.path.join(RESULTS_PATH, src)))
def clip_result(period): print("# Clip result", period) src = os.path.join(S1_RES_PATH, str(period.pk), 'concatenate.tiff') os.makedirs(RESULTS_PATH, exist_ok=True) dst_name = 's1_{dfrom}_{dto}.tif'.format( dfrom=period.date_from.strftime('%Y%m'), dto=period.date_to.strftime('%Y%m')) dst = os.path.join(RESULTS_PATH, dst_name) if not os.path.exists(dst): run_subprocess( '{gdal_bin_path}/gdalwarp -of GTiff -cutline {aoi} -crop_to_cutline {src} {dst}' .format(gdal_bin_path=settings.GDAL_BIN_PATH, aoi=AOI_PATH, src=src, dst=dst))
def concatenate(product): print("# Concatenate", product['title']) name = '{}.SAFE'.format(product['title']) dst_folder = os.path.join(S1_RAW_PATH, 'proc', name, 'concatenate') os.makedirs(dst_folder, exist_ok=True) vv_src = os.path.join(S1_RAW_PATH, 'proc', name, 'clip', 'vv.tiff') vh_src = os.path.join(S1_RAW_PATH, 'proc', name, 'clip', 'vh.tiff') dst = os.path.join(dst_folder, 'concatenate.tiff') if not os.path.exists(dst): run_subprocess( '{otb_bin_path}/otbcli_ConcatenateImages -il {vv_src} {vh_src} -out {dst}' .format(otb_bin_path=settings.OTB_BIN_PATH, vv_src=vv_src, vh_src=vh_src, dst=dst))
def despeckle(product): print("# Despeckle", product['title']) name = '{}.SAFE'.format(product['title']) dst_folder = os.path.join(S1_RAW_PATH, 'proc', name, 'despeck') os.makedirs(dst_folder, exist_ok=True) src = os.path.join(S1_RAW_PATH, 'proc', name, 'ortho', 'vv.tiff') dst = os.path.join(dst_folder, 'vv.tiff') if not os.path.exists(dst): run_subprocess( '{otb_bin_path}/otbcli_Despeckle -in {src} -out {dst}'.format( otb_bin_path=settings.OTB_BIN_PATH, src=src, dst=dst)) src = os.path.join(S1_RAW_PATH, 'proc', name, 'ortho', 'vh.tiff') dst = os.path.join(dst_folder, 'vh.tiff') if not os.path.exists(dst): run_subprocess( '{otb_bin_path}/otbcli_Despeckle -in {src} -out {dst}'.format( otb_bin_path=settings.OTB_BIN_PATH, src=src, dst=dst))
def calibrate(product): print("# Calibrate", product['title']) name = '{}.SAFE'.format(product['title']) dst_folder = os.path.join(S1_RAW_PATH, 'proc', name, 'calib') os.makedirs(dst_folder, exist_ok=True) src = os.path.join(S1_RAW_PATH, name, 'measurement', '*-vv-*.tiff') dst = os.path.join(dst_folder, 'vv.tiff') if not os.path.exists(dst): run_subprocess( '{otb_bin_path}/otbcli_SARCalibration -in $(ls {src}) -out {dst}'. format(otb_bin_path=settings.OTB_BIN_PATH, src=src, dst=dst)) src = os.path.join(S1_RAW_PATH, name, 'measurement', '*-vh-*.tiff') dst = os.path.join(dst_folder, 'vh.tiff') if not os.path.exists(dst): run_subprocess( '{otb_bin_path}/otbcli_SARCalibration -in $(ls {src}) -out {dst}'. format(otb_bin_path=settings.OTB_BIN_PATH, src=src, dst=dst))
def concatenate_results(mosaic_name, period_s): mosaic_path = os.path.join(settings.IMAGES_PATH, 'mosaic', period_s) tif_10m = f's2_{period_s}_10m.tif' tif_20m = f's2_{period_s}_20m.tif' R10m_B02 = os.path.join(mosaic_path, '{}_R10m_B02.tif'.format(mosaic_name)) R10m_B03 = os.path.join(mosaic_path, '{}_R10m_B03.tif'.format(mosaic_name)) R10m_B04 = os.path.join(mosaic_path, '{}_R10m_B04.tif'.format(mosaic_name)) R10m_B08 = os.path.join(mosaic_path, '{}_R10m_B08.tif'.format(mosaic_name)) R10m_NDVI = os.path.join(mosaic_path, '{}_R10m_NDVI.tif'.format(mosaic_name)) R10m_NDVI = os.path.join(mosaic_path, '{}_R10m_NDWI.tif'.format(mosaic_name)) R10m_EVI = os.path.join(mosaic_path, '{}_R10m_EVI.tif'.format(mosaic_name)) R10m_SAVI = os.path.join(mosaic_path, '{}_R10m_SAVI.tif'.format(mosaic_name)) src = ' '.join([ R10m_B02, R10m_B03, R10m_B04, R10m_B08, R10m_NDVI, R10m_NDVI, R10m_EVI, R10m_SAVI ]) run_subprocess( '{otb_bin_path}/otbcli_ConcatenateImages -il {src} -out {dst}'.format( otb_bin_path=settings.OTB_BIN_PATH, src=src, dst=os.path.join(mosaic_path, tif_10m))) R20m_B05 = os.path.join(mosaic_path, '{}_R20m_B05.tif'.format(mosaic_name)) R20m_B06 = os.path.join(mosaic_path, '{}_R20m_B06.tif'.format(mosaic_name)) R20m_B07 = os.path.join(mosaic_path, '{}_R20m_B07.tif'.format(mosaic_name)) R20m_B8A = os.path.join(mosaic_path, '{}_R20m_B8A.tif'.format(mosaic_name)) R20m_B11 = os.path.join(mosaic_path, '{}_R20m_B11.tif'.format(mosaic_name)) R20m_B12 = os.path.join(mosaic_path, '{}_R20m_B12.tif'.format(mosaic_name)) src = ' '.join( [R20m_B05, R20m_B06, R20m_B07, R20m_B8A, R20m_B11, R20m_B12]) run_subprocess( '{otb_bin_path}/otbcli_ConcatenateImages -il {src} -out {dst}'.format( otb_bin_path=settings.OTB_BIN_PATH, src=src, dst=os.path.join(mosaic_path, tif_20m)))
def generate_vegetation_indexes(mosaic_name, period_s): mosaic_path = os.path.join(settings.IMAGES_PATH, 'mosaic', period_s) nir = os.path.join(mosaic_path, '{}_R10m_NIR.vrt'.format(mosaic_name)) rgb = os.path.join(mosaic_path, '{}_R10m_RGB.vrt'.format(mosaic_name)) #ndiv dst = os.path.join(mosaic_path, '{}_R10m_NDVI.tif'.format(mosaic_name)) exp = '(im1b1 - im2b1) / (im1b1 + im2b1)' run_subprocess( '{otb_bin_path}/otbcli_BandMath -il {nir} {rgb} -out {dst} -exp "{exp}"' .format(otb_bin_path=settings.OTB_BIN_PATH, nir=nir, rgb=rgb, dst=dst, exp=exp)) #ndwi dst = os.path.join(mosaic_path, '{}_R10m_NDWI.tif'.format(mosaic_name)) exp = '(im1b1 - im2b2) / (im1b1 + im2b2)' run_subprocess( '{otb_bin_path}/otbcli_BandMath -il {nir} {rgb} -out {dst} -exp "{exp}"' .format(otb_bin_path=settings.OTB_BIN_PATH, nir=nir, rgb=rgb, dst=dst, exp=exp)) #evi dst = os.path.join(mosaic_path, '{}_R10m_EVI.tif'.format(mosaic_name)) exp = '(2.5 * ((im1b1 - im2b1) / (im1b1 + 6 * im2b1 - 7.5 * im2b3 + 1)))' run_subprocess( '{otb_bin_path}/otbcli_BandMath -il {nir} {rgb} -out {dst} -exp "{exp}"' .format(otb_bin_path=settings.OTB_BIN_PATH, nir=nir, rgb=rgb, dst=dst, exp=exp)) #savi dst = os.path.join(mosaic_path, '{}_R10m_SAVI.tif'.format(mosaic_name)) exp = '((im1b1 - im2b1) * 1.5 / (im1b1 + im2b1 + 0.5))' run_subprocess( '{otb_bin_path}/otbcli_BandMath -il {nir} {rgb} -out {dst} -exp "{exp}"' .format(otb_bin_path=settings.OTB_BIN_PATH, nir=nir, rgb=rgb, dst=dst, exp=exp))
unzip(p, delete_zip=False) # Build mosaic mosaic_dir = os.path.join(proc_scene_dir, 'mosaic') os.makedirs(mosaic_dir, exist_ok=True) # FIXME: Read bounds from EXTENT_UTM_PATH xmin, ymin, xmax, ymax = [ 261215.0000000000000000, 8620583.0000000000000000, 323691.8790999995544553, 8719912.0846999995410442 ] cmd = f"python3 {settings.S2M_CLI_PATH}/mosaic.py " \ f"-te {xmin} {ymin} {xmax} {ymax} " \ f"-e 32718 -res 10 -v " \ f"-p {settings.S2M_NUM_JOBS} " \ f"-o {mosaic_dir} {raw_dir}" run_subprocess(cmd) # Get mosaic band rasters mosaic_rgb_paths = [ glob(os.path.join(mosaic_dir, f'*_{band}.tif')) for band in ['B04', 'B03', 'B02'] ] mosaic_rgb_paths = [p[0] for p in mosaic_rgb_paths if p] logger.info("RGB paths: %s", mosaic_rgb_paths) # Use gdalbuildvrt to concatenate RGB bands from mosaic vrt_path = os.path.join(mosaic_dir, 'tci.vrt') cmd = f"gdalbuildvrt -separate {vrt_path} {' '.join(mosaic_rgb_paths)}" run_subprocess(cmd) # Clip to extent and rescale virtual raster