def _pre_process_sar(self, resolution: float = None) -> dict: """ Pre-process SAR data (geocoding...) Args: resolution (float): Resolution Returns: dict: Dictionary containing {band: path} """ out = {} # Create target dir (tmp dir) with tempfile.TemporaryDirectory() as tmp_dir: # Set command as a list target_file = os.path.join(tmp_dir, f"{self.condensed_name}") # Use dimap for speed and security (ie. GeoTiff's broken georef) pp_target = f"{target_file}" pp_dim = pp_target + ".dim" # Pre-process graph if PP_GRAPH not in os.environ: sat = "s1" if self.sat_id == Platform.S1.name else "sar" spt = "grd" if self.sar_prod_type == SarProductType.GDRG else "cplx" pp_graph = os.path.join(utils.get_data_dir(), f"{spt}_{sat}_preprocess_default.xml") else: pp_graph = os.environ[PP_GRAPH] if not os.path.isfile(pp_graph) or not pp_graph.endswith( ".xml"): FileNotFoundError(f"{pp_graph} cannot be found.") # Command line if not os.path.isfile(pp_dim): def_res = float(os.environ.get(SAR_DEF_RES, self.resolution)) res_m = resolution if resolution else def_res res_deg = res_m / 10.0 * 8.983152841195215e-5 # Approx cmd_list = snap.get_gpt_cli( pp_graph, [ f"-Pfile={strings.to_cmd_string(self._snap_path)}", f"-Pout={pp_dim}", f"-Pcrs={self.crs()}", f"-Pres_m={res_m}", f"-Pres_deg={res_deg}", ], display_snap_opt=LOGGER.level == logging.DEBUG, ) # Pre-process SAR images according to the given graph LOGGER.debug("Pre-process SAR image") misc.run_cli(cmd_list) # Convert DIMAP images to GeoTiff for pol in self.pol_channels: # Speckle image out[sbn.from_value(pol)] = self._write_sar(pp_dim, pol.value) return out
def test_utils(): root_dir = os.path.abspath(os.path.join(__file__, "..", "..", "..")) # Root directory src_dir = os.path.join(root_dir, "eoreader") data_dir = os.path.join(src_dir, "data") assert utils.get_root_dir() == root_dir assert utils.get_src_dir() == src_dir assert utils.get_data_dir() == data_dir
def _run_s3_gpt_cli(self, out_dim: str, resolution: float = None) -> list: """ Construct GPT command line to reproject S3 images and quality flags Args: out_dim (str): Out DIMAP name resolution (float): Resolution Returns: list: Processed band name """ # Default resolution def_res = os.environ.get(S3_DEF_RES, self.resolution) # Construct GPT graph graph_path = os.path.join(utils.get_data_dir(), "preprocess_s3.xml") snap_bands = ",".join([ self._get_snap_band_name(band) for band, band_nb in self.band_names.items() if band_nb ]) if self._instrument_name == S3Instrument.OLCI: sensor = "OLCI" fmt = "Sen3" snap_bands += ",quality_flags" else: sensor = "SLSTR_500m" fmt = "Sen3_SLSTRL1B_500m" exception_bands = ",".join([ self._get_slstr_quality_flags_name(band) for band, band_nb in self.band_names.items() if band_nb ]) snap_bands += f",{exception_bands},cloud_an,cloud_in" # Run GPT graph cmd_list = snap.get_gpt_cli( graph_path, [ f"-Pin={strings.to_cmd_string(self.path)}", f"-Pbands={snap_bands}", f"-Psensor={sensor}", f"-Pformat={fmt}", f"-Pno_data={self._snap_no_data}", f"-Pres_m={resolution if resolution else def_res}", f"-Pout={strings.to_cmd_string(out_dim)}", ], display_snap_opt=LOGGER.level == logging.DEBUG, ) LOGGER.debug("Converting %s", self.name) misc.run_cli(cmd_list) return snap_bands.split(",")
def _despeckle_sar(self, band: sbn) -> str: """ Pre-process SAR data (geocode...) Args: band (sbn): Band to despeckle Returns: str: Despeckled path """ # Create target dir (tmp dir) with tempfile.TemporaryDirectory() as tmp_dir: # Out files target_file = os.path.join(tmp_dir, f"{self.condensed_name}") dspk_dim = target_file + ".dim" # Despeckle graph if DSPK_GRAPH not in os.environ: dspk_graph = os.path.join(utils.get_data_dir(), "sar_despeckle_default.xml") else: dspk_graph = os.environ[DSPK_GRAPH] if not os.path.isfile(dspk_graph) or not dspk_graph.endswith( ".xml"): FileNotFoundError(f"{dspk_graph} cannot be found.") # Create command line and run it if not os.path.isfile(dspk_dim): path = self.get_band_paths([band])[band] cmd_list = snap.get_gpt_cli( dspk_graph, [f"-Pfile={path}", f"-Pout={dspk_dim}"], display_snap_opt=False, ) # Pre-process SAR images according to the given graph LOGGER.debug("Despeckle SAR image") misc.run_cli(cmd_list) # Convert DIMAP images to GeoTiff out = self._write_sar(dspk_dim, band.value, dspk=True) return out