From 3e97dfceb791efa2c7f7a3ebc93c0b28eb2dd4ea Mon Sep 17 00:00:00 2001 From: Fabian Schindler <fabian.schindler.strauss@gmail.com> Date: Tue, 3 Nov 2020 09:48:18 +0100 Subject: [PATCH] Fixed GSC footprint parsing Added option to extract level via RE --- core/registrar/scheme.py | 43 ++++++++++++++++++++++++++++++++++++---- 1 file changed, 39 insertions(+), 4 deletions(-) diff --git a/core/registrar/scheme.py b/core/registrar/scheme.py index ba857f34..2e17a487 100644 --- a/core/registrar/scheme.py +++ b/core/registrar/scheme.py @@ -102,16 +102,51 @@ class Sentinel2RegistrationScheme(RegistrationScheme): ) +def parse_ring(string): + raw_coords = string.split() + return [(lon, lat) for lat, lon in pairwise(raw_coords)] + + +def parse_polygons_gsc(elem): + def serialize_coord_list(coords): + return ','.join( + f'{x} {y}' for x, y in coords + ) + + interior = serialize_coord_list( + parse_ring( + elem.xpath( + "gml:exterior/gml:LinearRing/gml:posList", namespaces=elem.nsmap + )[0].text.strip() + ) + ) + + exteriors = [ + f'''({ + serialize_coord_list( + parse_ring(poslist_elem.text.strip()) + ) + })''' + for poslist_elem in elem.xpath( + "gml:interior/gml:LinearRing/gml:posList", namespaces=elem.nsmap + ) + ] + + return f"POLYGON(({interior}){',' if exteriors else ''}{','.join(exteriors)})" + class GSCRegistrationScheme(RegistrationScheme): GSC_SCHEMA = { 'identifier': Parameter('//gml:metaDataProperty/gsc:EarthObservationMetaData/eop:identifier/text()'), 'type': Parameter('//gml:using/eop:EarthObservationEquipment/eop:platform/eop:Platform/eop:shortName/text()'), 'level': Parameter('//gml:metaDataProperty/gsc:EarthObservationMetaData/eop:parentIdentifier/text()'), - 'mask': Parameter('//gsc:opt_metadata/gml:metaDataProperty/gsc:EarthObservationMetaData/eop:vendorSpecific/eop:SpecificInformation[eop:localAttribute/text() = "CF_POLY"]/eop:localValue/text()'), - 'footprint': Parameter('//gsc:opt_metadata/gml:metaDataProperty/gsc:EarthObservationMetaData/eop:vendorSpecific/eop:SpecificInformation[eop:localAttribute/text() = "CF_POLY"]/eop:localValue/text()'), + 'mask': Parameter('//gsc:opt_metadata/gml:metaDataProperty/gsc:EarthObservationMetaData/eop:vendorSpecific/eop:SpecificInformation[eop:localAttribute/text() = "CF_POLY"]/eop:localValue/text()', True), + 'footprint': Parameter('(gsc:sar_metadata|gsc:opt_metadata)/gml:target/eop:Footprint/gml:multiExtentOf/gml:MultiSurface/gml:surfaceMembers/gml:Polygon', True, parse_polygons_gsc), } + def __init__(self, level_re: str=r'.*(Level_[0-9]+)$'): + self.level_re = level_re + def get_context(self, source: Source, path: str) -> Context: gsc_filenames = source.list_files(path, ['GSC*.xml', 'GSC*.XML']) metadata_file = gsc_filenames[0] @@ -123,7 +158,7 @@ class GSCRegistrationScheme(RegistrationScheme): metadata['type']: source.list_files(path, ['*.tif', '*.TIF']) } - match = re.match(r'.*(Level_[0-9]+)$', metadata['level']) + match = re.match(self.level_re, metadata['level']) if match: level = match.groups()[0] else: @@ -136,7 +171,7 @@ class GSCRegistrationScheme(RegistrationScheme): product_level=level, raster_files=tiff_files, masks={ - 'validity': metadata['mask'] + 'validity': metadata['mask'][0] if metadata['mask'] else None }, metadata_files=[metadata_file], metadata={ -- GitLab