Beispiel #1
0
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
Beispiel #2
0
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