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