def read_manifest(filename, **mdax): """Read a Sentinel-1 manifest file, and extract selected parameters. :Parameters: filename : str Path to manifest file. :Returns: manifest : Metadata object Selected paramters """ def parse_orbit(elm): if elm.get('type').lower() == 'start': return int(elm.text) def parse_text(elm): return elm.text def parse_tolower(elm): return elm.text.lower() def parse_satellite(elm): if elm.text.lower().startswith('sen'): return elm.text.lower() def parse_time(elm): return datetime.strptime(elm.text, "%Y-%m-%dT%H:%M:%S.%f") def parse_coordinates(elm): cor = elm.text.split() arr = [] for c in cor: y, x = [float(i) for i in c.split(',')] arr.append((x, y)) return arr def parse_files(elm): fname = elm.get('href') if fname and fname.startswith('./measurement/'): return os.path.join(basedir, fname[2:]) named_decoder = { '{http://www.esa.int/safe/sentinel-1.0}startTime': ( 'start_time', 1, parse_time), '{http://www.esa.int/safe/sentinel-1.0}stopTime': ( 'stop_time', 1, parse_time), '{http://www.opengis.net/gml}coordinates': ( 'coordinates', 1, parse_coordinates), '{http://www.esa.int/safe/sentinel-1.0}orbitNumber': ( 'orbit_number', 1, parse_orbit), '{http://www.esa.int/safe/sentinel-1.0/sentinel-1/sar/level-1}mode': ( 'instrument_mode', 1, parse_tolower), '{http://www.esa.int/safe/sentinel-1.0}familyName': ( 'satellite', 1, parse_satellite), # dublicated ! '{http://www.esa.int/safe/sentinel-1.0/sentinel-1}pass': ( 'pass', 1, parse_tolower), '{http://www.esa.int/safe/sentinel-1.0/sentinel-1/sar/level-1}transmitterReceiverPolarisation': ( 'polarisations', 2, parse_tolower), '{http://www.esa.int/safe/sentinel-1.0/sentinel-1/sar/level-1}productClassDescription': ( 'description', 1, parse_text), '{http://www.esa.int/safe/sentinel-1.0/sentinel-1/sar/level-1}productType': ( 'product_type', 1, parse_tolower), 'fileLocation': ( 'files', 2, parse_files), } tags = named_decoder.keys() manifest = Metadata() basedir = os.path.dirname(filename) with open(filename) as fp: xml = etree.parse(fp) for e in xml.getroot().iter(): if e.tag in tags: name, count, decoder = named_decoder[e.tag] value = decoder(e) if value: if count > 1: try: getattr(manifest, name).append(value) except AttributeError: setattr(manifest, name, [value]) else: setattr(manifest, name, value) # Add extra metadata for key, val in mdax.items(): if not hasattr(manifest, key): setattr(manifest, key, val) try: resolution = manifest.resolution_class channels = {} for pol in manifest.polarisations: _text = '-'.join([manifest.mission_id, manifest.instrument_mode, manifest.product_type, pol]) _name = '-'.join([manifest.instrument_mode, resolution, pol]) for fn in manifest.files: if os.path.basename(fn).startswith(_text): channels[_name] = fn manifest.channels = channels manifest.pixel_spacing = PIXEL_SPACING[manifest.instrument_mode + '-' + resolution] except AttributeError: pass return manifest
def read_manifest(filename, **mdax): """Read a Sentinel-1 manifest file, and extract selected parameters. :Parameters: filename : str Path to manifest file. :Returns: manifest : Metadata object Selected paramters """ def parse_orbit(elm): if elm.get('type').lower() == 'start': return int(elm.text) def parse_text(elm): return elm.text def parse_tolower(elm): return elm.text.lower() def parse_satellite(elm): if elm.text.lower().startswith('sen'): return elm.text.lower() def parse_time(elm): return datetime.strptime(elm.text, "%Y-%m-%dT%H:%M:%S.%f") def parse_coordinates(elm): cor = elm.text.split() arr = [] for c in cor: y, x = [float(i) for i in c.split(',')] arr.append((x, y)) return arr def parse_files(elm): fname = elm.get('href') if fname and fname.startswith('./measurement/'): return os.path.join(basedir, fname[2:]) named_decoder = { '{http://www.esa.int/safe/sentinel-1.0}startTime': ('start_time', 1, parse_time), '{http://www.esa.int/safe/sentinel-1.0}stopTime': ('stop_time', 1, parse_time), '{http://www.opengis.net/gml}coordinates': ('coordinates', 1, parse_coordinates), '{http://www.esa.int/safe/sentinel-1.0}orbitNumber': ('orbit_number', 1, parse_orbit), '{http://www.esa.int/safe/sentinel-1.0/sentinel-1/sar/level-1}mode': ('instrument_mode', 1, parse_tolower), '{http://www.esa.int/safe/sentinel-1.0}familyName': ('satellite', 1, parse_satellite), # dublicated ! '{http://www.esa.int/safe/sentinel-1.0/sentinel-1}pass': ('pass', 1, parse_tolower), '{http://www.esa.int/safe/sentinel-1.0/sentinel-1/sar/level-1}transmitterReceiverPolarisation': ('polarisations', 2, parse_tolower), '{http://www.esa.int/safe/sentinel-1.0/sentinel-1/sar/level-1}productClassDescription': ('description', 1, parse_text), '{http://www.esa.int/safe/sentinel-1.0/sentinel-1/sar/level-1}productType': ('product_type', 1, parse_tolower), 'fileLocation': ('files', 2, parse_files), } tags = named_decoder.keys() manifest = Metadata() basedir = os.path.dirname(filename) with open(filename) as fp: xml = etree.parse(fp) for e in xml.getroot().iter(): if e.tag in tags: name, count, decoder = named_decoder[e.tag] value = decoder(e) if value: if count > 1: try: getattr(manifest, name).append(value) except AttributeError: setattr(manifest, name, [value]) else: setattr(manifest, name, value) # Add extra metadata for key, val in mdax.items(): if not hasattr(manifest, key): setattr(manifest, key, val) try: resolution = manifest.resolution_class channels = {} for pol in manifest.polarisations: _text = '-'.join([ manifest.mission_id, manifest.instrument_mode, manifest.product_type, pol ]) _name = '-'.join([manifest.instrument_mode, resolution, pol]) for fn in manifest.files: if os.path.basename(fn).startswith(_text): channels[_name] = fn manifest.channels = channels manifest.pixel_spacing = PIXEL_SPACING[manifest.instrument_mode + '-' + resolution] except AttributeError: pass return manifest