Source code for preprocessor.preprocessor_iceye_helpers
import os
import structlog
import shutil
from os.path import join, basename
import xml.etree.ElementTree as ET
from .util import get_all_data_files
logger = structlog.getLogger(__name__)
[docs]def extract_rpc_to_text_file(
source_dir: os.PathLike,
target_dir: os.PathLike,
preprocess_config: dict,
glob: str = "*ICEYE.xml",
output_file_name: str = "ICEYE.rpc",
):
filenames = get_all_data_files(source_dir, preprocess_config, [glob])
# working in source_dir to be picked up later by move operation
target_filename = join(target_dir, output_file_name)
if len(filenames) > 0:
# read file and parse XML
tree = ET.parse(filenames[0])
root = tree.getroot()
# extract RPC metadata
rpc_data_dict = extract_rpc_metadata(root)
logger.info(f"Writing a new RPC file: {target_filename}")
with open(target_filename, "w") as w:
for rpc_variable_name, value in rpc_data_dict.items():
w.write(f"{rpc_variable_name}: {value}\n")
# copy everything else to target_dir
for input_filename in get_all_data_files(source_dir, preprocess_config, "**"):
target_filename = join(target_dir, basename(input_filename))
shutil.move(input_filename, target_filename)
[docs]def extract_rpc_metadata(root: ET.Element):
data = {}
rpc_variables = [
"LINE_OFF",
"SAMP_OFF",
"LAT_OFF",
"LONG_OFF",
"HEIGHT_OFF",
"LINE_SCALE",
"SAMP_SCALE",
"LAT_SCALE",
"LONG_SCALE",
"HEIGHT_SCALE",
]
rpc_multiple_variables = [
"LINE_NUM_COEFF",
"LINE_DEN_COEFF",
"SAMP_NUM_COEFF",
"SAMP_DEN_COEFF",
]
for rpc_variable in rpc_variables:
data[rpc_variable] = get_rpc_value(rpc_variable, root)
for rpc_multiple_variable in rpc_multiple_variables:
text = get_rpc_value(rpc_multiple_variable, root)
# text handling and cleanup
values = text.replace("\n", "").strip().replace(" ", " ").split(" ")
for i, value in enumerate(values):
# save values with 1 based index as for example LINE_NUM_COEFF_1 ... 20
data[f"{rpc_multiple_variable}_{i + 1}"] = value
logger.debug(f"Extracted following RPC metadata {data}")
return data