diff --git a/core/registrar/scheme.py b/core/registrar/scheme.py index ba857f34d1b1edb684a27c593359780d0fd7d747..2e17a4879a7be83f8f699c24a8fb89d0ccd9e665 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={