├── tests ├── __init__.py ├── samples │ ├── B01_full.jp2 │ ├── B01_left.jp2 │ ├── B01_multi.jp2 │ ├── B01_right.jp2 │ ├── B01_geometry.json │ ├── tileInfo.json │ ├── finalmeta.json │ ├── metadata_new.xml │ └── metadata.xml ├── test_main.py ├── test_crawler.py └── test_converter.py ├── MANIFEST.in ├── sentinel_s3 ├── __init__.py ├── crawler.py ├── main.py └── converter.py ├── setup.cfg ├── requirements.txt ├── .gitignore ├── example.py ├── .travis.yml ├── setup.py ├── README.rst └── LICENSE /tests/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /MANIFEST.in: -------------------------------------------------------------------------------- 1 | include README.md 2 | include requirements.txt 3 | -------------------------------------------------------------------------------- /sentinel_s3/__init__.py: -------------------------------------------------------------------------------- 1 | from .main import daily_metadata, range_metadata, file_writer, s3_writer, single_metadata 2 | -------------------------------------------------------------------------------- /tests/samples/B01_full.jp2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/developmentseed/sentinel-s3/HEAD/tests/samples/B01_full.jp2 -------------------------------------------------------------------------------- /tests/samples/B01_left.jp2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/developmentseed/sentinel-s3/HEAD/tests/samples/B01_left.jp2 -------------------------------------------------------------------------------- /tests/samples/B01_multi.jp2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/developmentseed/sentinel-s3/HEAD/tests/samples/B01_multi.jp2 -------------------------------------------------------------------------------- /tests/samples/B01_right.jp2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/developmentseed/sentinel-s3/HEAD/tests/samples/B01_right.jp2 -------------------------------------------------------------------------------- /setup.cfg: -------------------------------------------------------------------------------- 1 | [bdist_wheel] 2 | universal=1 3 | 4 | [metadata] 5 | description-file=README.md 6 | 7 | [aliases] 8 | test=pytest 9 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | pytest==2.9.0 2 | six==1.10.0 3 | boto3==1.3.0 4 | requests==2.9.1 5 | pyproj==1.9.5 6 | rasterio==0.34.0 7 | shapely==1.5.15 8 | wordpad==0.1.0 9 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.pyc 2 | .*.swp 3 | *.log 4 | *~ 5 | *.egg-info 6 | build/ 7 | dist/ 8 | *.eggs 9 | MANIFEST 10 | .DS_Store 11 | .idea 12 | .tox 13 | .coverage 14 | .cache 15 | -------------------------------------------------------------------------------- /example.py: -------------------------------------------------------------------------------- 1 | import logging 2 | from datetime import date 3 | from sentinel_s3 import range_metadata, s3_writer 4 | 5 | 6 | def main(): 7 | 8 | start_date = date(2015, 9, 2) 9 | end_date = date(2015, 9, 2) 10 | 11 | return range_metadata(start_date, end_date, '.', 0, [s3_writer]) 12 | 13 | 14 | if __name__ == '__main__': 15 | logger = logging.getLogger('sentinel.meta.s3') 16 | logger.setLevel(logging.DEBUG) 17 | 18 | ch = logging.StreamHandler() 19 | ch.setLevel(logging.INFO) 20 | formatter = logging.Formatter('%(message)s') 21 | ch.setFormatter(formatter) 22 | logger.addHandler(ch) 23 | 24 | result = main() 25 | 26 | print(result) 27 | -------------------------------------------------------------------------------- /tests/samples/B01_geometry.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "FeatureCollection", 3 | "features": [ 4 | { 5 | "type": "Feature", 6 | "properties": {}, 7 | "geometry": {"type": "Polygon", "coordinates": [[[-75.37225617498574, 36.95837934788912], [-74.89238848748697, 36.95891407427507], [-74.89167572347567, 37.459196344771016], [-75.37472174662845, 37.45865189706822], [-75.37225617498574, 36.95837934788912]]]} 8 | }, 9 | { 10 | "type": "Feature", 11 | "properties": {}, 12 | "geometry": { "type": "Polygon", "coordinates": [[[-74.89236578861907, 37.45108461725361], [-74.89238848748697, 36.95891407427507], [-75.05549072910433, 36.95894986875474], [-74.89236578861907, 37.45108461725361]]]} 13 | } 14 | ] 15 | } 16 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: python 2 | python: 3 | - '2.7' 4 | - '3.4' 5 | - '3.5' 6 | addons: 7 | apt: 8 | packages: 9 | - libgdal1h 10 | - gdal-bin 11 | - libgdal-dev 12 | - libgeos-dev 13 | - python-numpy 14 | script: 15 | - python setup.py test 16 | deploy: 17 | provider: pypi 18 | user: devseed 19 | password: 20 | secure: GH1pYO11lqxM3uuo/n1ll5d6oHEXZI7Ok3YwSfd3WFVeBZj1WWxfnAqBYUjzcoyQJeWbkVXhw1UIYjqkqxsqRXIVll6rgDlDFSZa8rRC4xJfK9Dv1XZxK79OAQM4IDV+NQe+l/xLzwM6cxjhPxYXsO8UMxefPvroqglObQEFXl+JisaPVYjL8qv0i63MU0w+TqpVuhtbqzl17Y1sYRCyPcntBN2pWUQdTdTPwnmHC/W+9nzBIO0t4LeZ8tvCC5OziU3kl9VFaNsUpTAiu6qDIJFgyKIN1NOTssSwmnfOuF70sXxr45SF0os1BwdKMAaE36CNCGMpmsAW9HknsvOAdgRfWM1EhKxBfBXj90hJ0rY91Rp4sCH6xn7zlspsT5xk7OrpPL9jZtbnC6oPgffVyBLu8q3xpYdzZwMyjIA00Zt9om3OPRlfCDUF3D7iodFwHLqn1qccF0CG1T7K4VsqMSosOoUpTT+LkSr/QciY2wh8J2MinWSZ+WtGWqGyJibEG29V8Qm5vklDcYswRiLp5t243UxVgI/L446gM5cew3cbrPPYSkJmbdSCTtkhJp/HtSG2SKczswW4A4/Ut4jQ+6rjSYarZHU6YNJxYcovMefIAwHmSMBWO3F7Uyrt59XIkrRCGiTRZkpBz5AP8N9dmK+WAxfHV++TH9NOyKEAWWk= 21 | on: 22 | distributions: sdist bdist_wheel 23 | repo: developmentseed/sentinel-s3 24 | branch: master 25 | -------------------------------------------------------------------------------- /tests/test_main.py: -------------------------------------------------------------------------------- 1 | import os 2 | import errno 3 | import shutil 4 | import unittest 5 | from tempfile import mkdtemp 6 | from sentinel_s3 import daily_metadata, single_metadata, file_writer 7 | 8 | 9 | class Test(unittest.TestCase): 10 | 11 | def setUp(self): 12 | self.tmp_folder = mkdtemp() 13 | 14 | def tearDown(self): 15 | try: 16 | shutil.rmtree(self.tmp_folder) 17 | except OSError as exc: 18 | if exc.errno != errno.ENOENT: 19 | raise 20 | 21 | def test_daily_metadata_with_no_results(self): 22 | # run with a date that doesn't exist 23 | daily_metadata(2015, 4, 1, '.') 24 | 25 | def test_single_metadata(self): 26 | product = 'S2A_OPER_PRD_MSIL1C_PDMC_20160311T194734_R031_V20160311T011614_20160311T011614' 27 | metas = [] 28 | 29 | def retainer(d, meta): 30 | metas.append(meta) 31 | 32 | counter = single_metadata(product, self.tmp_folder, writers=[file_writer, retainer]) 33 | 34 | self.assertEqual(len(os.listdir(self.tmp_folder)), 2) 35 | self.assertEqual(counter['saved_tiles'], 2) 36 | self.assertEqual(counter['products'], 1) 37 | 38 | self.assertTrue(isinstance(metas[0], dict)) 39 | self.assertEqual(metas[0]['product_name'], product) 40 | -------------------------------------------------------------------------------- /sentinel_s3/crawler.py: -------------------------------------------------------------------------------- 1 | import json 2 | import datetime 3 | 4 | import boto3 5 | 6 | bucket_name = 'sentinel-s2-l1c' 7 | s3 = boto3.resource('s3', region_name='eu-central-1') 8 | bucket = s3.Bucket(bucket_name) 9 | 10 | 11 | def get_tile_metadata_path(path): 12 | 13 | meta_obj = s3.Object(bucket_name, path) 14 | 15 | meta = json.loads(meta_obj.get()['Body'].read().decode()) 16 | 17 | paths = [] 18 | for tile in meta['tiles']: 19 | paths.append(tile['path'] + '/tileInfo.json') 20 | 21 | return paths 22 | 23 | 24 | def get_product_metadata_path(product_name): 25 | """ gets a single products metadata """ 26 | 27 | string_date = product_name.split('_')[-1] 28 | date = datetime.datetime.strptime(string_date, '%Y%m%dT%H%M%S') 29 | path = 'products/{0}/{1}/{2}/{3}'.format(date.year, date.month, date.day, product_name) 30 | 31 | return { 32 | product_name: { 33 | 'metadata': '{0}/{1}'.format(path, 'metadata.xml'), 34 | 'tiles': get_tile_metadata_path('{0}/{1}'.format(path, 'productInfo.json')) 35 | } 36 | } 37 | 38 | 39 | def get_products_metadata_path(year, month, day): 40 | """ Get paths to multiple products metadata """ 41 | 42 | products = {} 43 | path = 'products/{0}/{1}/{2}/'.format(year, month, day) 44 | for key in bucket.objects.filter(Prefix=path): 45 | product_path = key.key.replace(path, '').split('/') 46 | name = product_path[0] 47 | if name not in products: 48 | products[name] = {} 49 | 50 | if product_path[1] == 'metadata.xml': 51 | products[name]['metadata'] = key.key 52 | 53 | if product_path[1] == 'productInfo.json': 54 | products[name]['tiles'] = get_tile_metadata_path(key.key) 55 | 56 | return products 57 | -------------------------------------------------------------------------------- /setup.py: -------------------------------------------------------------------------------- 1 | from setuptools import setup, find_packages 2 | from codecs import open 3 | from os import path 4 | 5 | __version__ = '0.8.0' 6 | 7 | here = path.abspath(path.dirname(__file__)) 8 | 9 | # Get the long description from the README file 10 | with open(path.join(here, 'README.rst'), encoding='utf-8') as f: 11 | long_description = f.read() 12 | 13 | # get the dependencies and installs 14 | with open(path.join(here, 'requirements.txt'), encoding='utf-8') as f: 15 | all_reqs = f.read().split('\n') 16 | 17 | install_requires = [x.strip() for x in all_reqs if 'git+' not in x] 18 | dependency_links = [x.strip().replace('git+', '') for x in all_reqs if 'git+' not in x] 19 | 20 | setup( 21 | name='sentinel-s3', 22 | version=__version__, 23 | description='Python libraries for extracting Sentinel-2\'s metadata from Amazon S3', 24 | long_description=long_description, 25 | url='https://github.com/developmentseed/sentinel-s3', 26 | download_url='https://github.com/developmentseed/sentinel-s3/tarball/' + __version__, 27 | license='CC0', 28 | classifiers=[ 29 | 'Framework :: Pytest', 30 | 'Topic :: Scientific/Engineering :: GIS', 31 | 'Topic :: Scientific/Engineering', 32 | 'Intended Audience :: Developers', 33 | 'Intended Audience :: Science/Research', 34 | 'License :: Freeware', 35 | 'Programming Language :: Python :: 2.7', 36 | 'Programming Language :: Python :: 3.3', 37 | 'Programming Language :: Python :: 3.4', 38 | 'Programming Language :: Python :: 3.5', 39 | ], 40 | keywords='', 41 | packages=find_packages(exclude=['docs', 'tests*']), 42 | include_package_data=True, 43 | author='Alireza J (scisco)', 44 | install_requires=install_requires, 45 | dependency_links=dependency_links, 46 | author_email='alireza@developmentseed.org', 47 | setup_requires=['pytest-runner'], 48 | tests_require=['pytest'], 49 | ) 50 | -------------------------------------------------------------------------------- /tests/test_crawler.py: -------------------------------------------------------------------------------- 1 | import unittest 2 | from six import iterkeys 3 | from sentinel_s3.crawler import get_product_metadata_path, get_products_metadata_path 4 | 5 | 6 | class Test(unittest.TestCase): 7 | 8 | def test_get_product_metadata_path(self): 9 | 10 | product = 'S2A_OPER_PRD_MSIL1C_PDMC_20160311T194734_R031_V20160311T011614_20160311T011614' 11 | v = get_product_metadata_path(product) 12 | 13 | keys = list(iterkeys(v)) 14 | assert len(keys) == 1 15 | assert 'tiles' in v[keys[0]] 16 | assert 'metadata' in v[keys[0]] 17 | assert keys[0] == product 18 | 19 | metadata = v[keys[0]]['metadata'].split('/') 20 | tiles = v[keys[0]]['tiles'][0].split('/') 21 | 22 | self.assertEqual(metadata[-1], 'metadata.xml') 23 | self.assertEqual(tiles[-1], 'tileInfo.json') 24 | self.assertEqual(len(v[product]['tiles']), 2) 25 | 26 | def test_get_product_metadata_path_new_format(self): 27 | product = 'S2A_MSIL1C_20161211T190342_N0204_R113_T10SDG_20161211T190344' 28 | v = get_product_metadata_path(product) 29 | 30 | keys = list(iterkeys(v)) 31 | assert len(keys) == 1 32 | assert 'tiles' in v[keys[0]] 33 | assert 'metadata' in v[keys[0]] 34 | assert keys[0] == product 35 | 36 | metadata = v[keys[0]]['metadata'].split('/') 37 | tiles = v[keys[0]]['tiles'][0].split('/') 38 | 39 | self.assertEqual(metadata[-1], 'metadata.xml') 40 | self.assertEqual(tiles[-1], 'tileInfo.json') 41 | self.assertEqual(len(v[product]['tiles']), 1) 42 | 43 | def test_get_products_metadata_path(self): 44 | 45 | v = get_products_metadata_path(2015, 9, 2) 46 | 47 | keys = list(iterkeys(v)) 48 | self.assertTrue(len(keys) > 69) 49 | self.assertTrue('tiles' in v[keys[0]]) 50 | self.assertTrue('metadata' in v[keys[0]]) 51 | 52 | metadata = v[keys[0]]['metadata'].split('/') 53 | tiles = v[keys[0]]['tiles'][0].split('/') 54 | 55 | self.assertEqual(metadata[-1], 'metadata.xml') 56 | self.assertEqual(tiles[-1], 'tileInfo.json') 57 | -------------------------------------------------------------------------------- /README.rst: -------------------------------------------------------------------------------- 1 | sentinel-s3 2 | ----------- 3 | 4 | |Build Status| 5 | 6 | This packages includes a few functions that facilitates extraction of 7 | Sentinel-2's metadata from Amazon S3. 8 | 9 | Installation 10 | ~~~~~~~~~~~~ 11 | 12 | :: 13 | 14 | $ pip install sentinel-s3 15 | 16 | or 17 | 18 | :: 19 | 20 | $ python setup.py install 21 | 22 | Tests 23 | ~~~~~ 24 | 25 | :: 26 | 27 | $ python setup.py test 28 | 29 | Example 30 | ~~~~~~~ 31 | 32 | Generating metadata for a date range 33 | 34 | .. code:: python 35 | 36 | import logging 37 | from datetime import date 38 | from sentinel_s3 import range_metadata 39 | 40 | 41 | def main(): 42 | 43 | start_date = date(2016, 2, 1) 44 | end_date = date(2016, 3, 22) 45 | 46 | return range_metadata(start_date, end_date, '.', 20) 47 | 48 | 49 | if __name__ == '__main__': 50 | logger = logging.getLogger('sentinel.meta.s3') 51 | logger.setLevel(logging.DEBUG) 52 | 53 | ch = logging.StreamHandler() 54 | ch.setLevel(logging.INFO) 55 | formatter = logging.Formatter('%(message)s') 56 | ch.setFormatter(formatter) 57 | logger.addHandler(ch) 58 | 59 | result = main() 60 | 61 | print(result) 62 | 63 | 64 | Generating metadata for a single product 65 | 66 | .. code:: python 67 | 68 | import logging 69 | from datetime import date 70 | from sentinel_s3 import single_metadata 71 | 72 | 73 | def main(): 74 | 75 | product = 'S2A_OPER_PRD_MSIL1C_PDMC_20160311T194734_R031_V20160311T011614_20160311T011614' 76 | return single_metadata(product, '.') 77 | 78 | 79 | if __name__ == '__main__': 80 | logger = logging.getLogger('sentinel.meta.s3') 81 | logger.setLevel(logging.DEBUG) 82 | 83 | ch = logging.StreamHandler() 84 | ch.setLevel(logging.INFO) 85 | formatter = logging.Formatter('%(message)s') 86 | ch.setFormatter(formatter) 87 | logger.addHandler(ch) 88 | 89 | result = main() 90 | 91 | print(result) 92 | 93 | .. |Build Status| image:: https://travis-ci.org/developmentseed/sentinel-s3.svg?branch=master 94 | :target: https://travis-ci.org/developmentseed/sentinel-s3 95 | -------------------------------------------------------------------------------- /tests/samples/tileInfo.json: -------------------------------------------------------------------------------- 1 | { 2 | "path" : "tiles/56/X/NF/2016/3/16/0", 3 | "timestamp" : "2016-03-16T02:06:40.455Z", 4 | "utmZone" : 56, 5 | "latitudeBand" : "X", 6 | "gridSquare" : "NF", 7 | "datastrip" : { 8 | "id" : "S2A_OPER_MSI_L1C_DS_SGS__20160316T054120_S20160316T020640_N02.01", 9 | "path" : "products/2016/3/16/S2A_OPER_PRD_MSIL1C_PDMC_20160316T064416_R103_V20160316T020640_20160316T020640/datastrip/0" 10 | }, 11 | "tileGeometry" : { 12 | "type" : "Polygon", 13 | "crs" : { 14 | "type" : "name", 15 | "properties" : { 16 | "name" : "urn:ogc:def:crs:EPSG:8.8.1:32656" 17 | } 18 | }, 19 | "coordinates" : [ [ [ 499980.0, 8100000.0 ], [ 609780.0, 8100000.0 ], [ 609780.0, 7990200.0 ], [ 499980.0, 7990200.0 ], [ 499980.0, 8100000.0 ] ] ] 20 | }, 21 | "tileDataGeometry" : { 22 | "type" : "Polygon", 23 | "crs" : { 24 | "type" : "name", 25 | "properties" : { 26 | "name" : "urn:ogc:def:crs:EPSG:8.8.1:32656" 27 | } 28 | }, 29 | "coordinates" : [ [ [ 523427.854194367, 8080148.952465224 ], [ 530596.09144086, 8076212.912273364 ], [ 530460.708328477, 8075969.169718796 ], [ 550214.395155883, 8064965.858105348 ], [ 550220.322038512, 8064974.355047386 ], [ 550428.541503783, 8064859.462755492 ], [ 550547.485077357, 8065070.715685412 ], [ 572473.638233002, 8052586.078112776 ], [ 572349.774349867, 8052364.126224988 ], [ 591961.294499871, 8040933.448727178 ], [ 591977.054213038, 8040957.306193342 ], [ 592165.682730694, 8040848.60002782 ], [ 592272.706809608, 8041028.657328702 ], [ 609779.0, 8030701.39618724 ], [ 609779.0, 7990201.0 ], [ 499981.0, 7990201.0 ], [ 499981.0, 8092615.258833338 ], [ 508066.192804798, 8088319.379767454 ], [ 508083.463953343, 8088348.068348922 ], [ 508309.182097202, 8088227.92151282 ], [ 508402.467500382, 8088391.640839598 ], [ 523427.854194367, 8080148.952465224 ] ] ] 30 | }, 31 | "tileOrigin" : { 32 | "type" : "Point", 33 | "crs" : { 34 | "type" : "name", 35 | "properties" : { 36 | "name" : "urn:ogc:def:crs:EPSG:8.8.1:32656" 37 | } 38 | }, 39 | "coordinates" : [ 499980.0, 8100000.0 ] 40 | }, 41 | "dataCoveragePercentage" : 65.58, 42 | "cloudyPixelPercentage" : 41.31, 43 | "productName" : "S2A_OPER_PRD_MSIL1C_PDMC_20160316T064416_R103_V20160316T020640_20160316T020640", 44 | "productPath" : "products/2016/3/16/S2A_OPER_PRD_MSIL1C_PDMC_20160316T064416_R103_V20160316T020640_20160316T020640" 45 | } -------------------------------------------------------------------------------- /tests/samples/finalmeta.json: -------------------------------------------------------------------------------- 1 | {"tile_name": "S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56XNF_N02.01", "date": "2016-03-16", "thumbnail": "http://sentinel-s2-l1c.s3.amazonaws.com/tiles/56/X/NF/2016/3/16/0/preview.jp2", "path": "tiles/56/X/NF/2016/3/16/0", "timestamp": "2016-03-16T02:06:40.455Z", "utm_zone": 56, "latitude_band": "X", "grid_square": "NF", "tile_geometry": {"type": "Polygon", "crs": {"type": "name", "properties": {"name": "urn:ogc:def:crs:EPSG:8.9:4326"}}, "coordinates": [[[152.99938728692726, 72.9956989100914], [156.35949189158055, 72.96810378951403], [156.1817359597695, 71.98536775660044], [152.99941977513924, 72.01136343668333], [152.99938728692726, 72.9956989100914]]]}, "tile_data_geometry": {"type": "Polygon", "crs": {"type": "name", "properties": {"name": "urn:ogc:def:crs:EPSG:8.9:4326"}}, "coordinates": [[[153.71048432631537, 72.81650133264148], [153.92599697774142, 72.7803434835539], [153.9217869055133, 72.77817741629634], [154.51096599505496, 72.67596860186093], [154.5111506937434, 72.67604340991574], [154.51732593024104, 72.67496671256232], [154.52106423034792, 72.67683286787366], [155.16679537847472, 72.5589323267554], [155.16285661972196, 72.55698401948564], [155.73283586517778, 72.44744110658297], [155.73333574774614, 72.44764831876101], [155.73878606354745, 72.44659793200975], [155.74220573750767, 72.44816653503923], [156.24493298300607, 72.34789686144914], [156.18170856277195, 71.98537718126394], [152.99944878611683, 72.01137240202127], [152.99942011182188, 72.92949920472087], [153.24564493470317, 72.890840921175], [153.24617448550458, 72.89109746118757], [153.25303299662008, 72.89001199574696], [153.25589498907385, 72.891476086107], [153.71048432631537, 72.81650133264148]]]}, "tile_origin": {"type": "Point", "crs": {"type": "name", "properties": {"name": "urn:ogc:def:crs:EPSG:8.9:4326"}}, "coordinates": [152.99938728692726, 72.9956989100914]}, "data_coverage_percentage": 65.58, "cloudy_pixel_percentage": 41.31, "product_name": "S2A_OPER_PRD_MSIL1C_PDMC_20160316T064416_R103_V20160316T020640_20160316T020640", "product_path": "products/2016/3/16/S2A_OPER_PRD_MSIL1C_PDMC_20160316T064416_R103_V20160316T020640_20160316T020640", "spacecraft_name": "Sentinel-2A", "product_stop_time": "2016-03-16T02:06:40.455Z", "processing_level": "Level-1C", "product_type": "S2MSI1C", "processing_baseline": "02.01", "sensing_orbit_number": 103, "sensing_orbit_direction": "DESCENDING", "product_format": "SAFE", "product_cloud_coverage_assessment": 55.76177, "download_links": {"aws_s3": ["http://sentinel-s2-l1c.s3.amazonaws.com/tiles/56/X/NF/2016/3/16/0/B1.jp2", "http://sentinel-s2-l1c.s3.amazonaws.com/tiles/56/X/NF/2016/3/16/0/B2.jp2", "http://sentinel-s2-l1c.s3.amazonaws.com/tiles/56/X/NF/2016/3/16/0/B3.jp2", "http://sentinel-s2-l1c.s3.amazonaws.com/tiles/56/X/NF/2016/3/16/0/B4.jp2", "http://sentinel-s2-l1c.s3.amazonaws.com/tiles/56/X/NF/2016/3/16/0/B5.jp2", "http://sentinel-s2-l1c.s3.amazonaws.com/tiles/56/X/NF/2016/3/16/0/B6.jp2", "http://sentinel-s2-l1c.s3.amazonaws.com/tiles/56/X/NF/2016/3/16/0/B7.jp2", "http://sentinel-s2-l1c.s3.amazonaws.com/tiles/56/X/NF/2016/3/16/0/B8.jp2", "http://sentinel-s2-l1c.s3.amazonaws.com/tiles/56/X/NF/2016/3/16/0/B9.jp2", "http://sentinel-s2-l1c.s3.amazonaws.com/tiles/56/X/NF/2016/3/16/0/B10.jp2", "http://sentinel-s2-l1c.s3.amazonaws.com/tiles/56/X/NF/2016/3/16/0/B11.jp2", "http://sentinel-s2-l1c.s3.amazonaws.com/tiles/56/X/NF/2016/3/16/0/B12.jp2", "http://sentinel-s2-l1c.s3.amazonaws.com/tiles/56/X/NF/2016/3/16/0/B8A.jp2"]}} 2 | -------------------------------------------------------------------------------- /sentinel_s3/main.py: -------------------------------------------------------------------------------- 1 | import os 2 | import sys 3 | import json 4 | import logging 5 | import threading 6 | from copy import copy 7 | from datetime import date, timedelta 8 | 9 | import boto3 10 | import requests 11 | from six.moves.queue import Queue 12 | from six import iteritems, iterkeys 13 | from sentinel_s3.crawler import get_products_metadata_path, get_product_metadata_path 14 | from sentinel_s3.converter import metadata_to_dict, tile_metadata 15 | 16 | # Python 2 comptability 17 | try: 18 | JSONDecodeError = json.JSONDecodeError 19 | except AttributeError: 20 | JSONDecodeError = ValueError 21 | 22 | 23 | logger = logging.getLogger('sentinel.meta.s3') 24 | 25 | bucket_name = os.getenv('BUCKETNAME', 'sentinel-metadata') 26 | s3 = boto3.resource('s3') 27 | bucket = s3.Bucket(bucket_name) 28 | 29 | 30 | def mkdirp(path): 31 | 32 | if not os.path.exists(path): 33 | os.makedirs(path) 34 | 35 | 36 | def file_writer(product_dir, metadata): 37 | mkdirp(product_dir) 38 | 39 | f = open(os.path.join(product_dir, metadata['tile_name'] + '.json'), 'w') 40 | f.write(json.dumps(metadata)) 41 | f.close() 42 | 43 | 44 | def s3_writer(product_dir, metadata): 45 | # make sure product_dir doesn't start with slash (/) or dot (.) 46 | if product_dir.startswith('.'): 47 | product_dir = product_dir[1:] 48 | 49 | if product_dir.startswith('/'): 50 | product_dir = product_dir[1:] 51 | 52 | key = os.path.join(product_dir, metadata['tile_name'] + '.json') 53 | s3.Object(bucket_name, key).put(json.dumps(metadata)) 54 | object_acl = s3.ObjectAcl(bucket_name, key) 55 | object_acl.put(ACL='public-read') 56 | 57 | 58 | def product_metadata(product, dst_folder, counter=None, writers=[file_writer], geometry_check=None): 59 | """ Extract metadata for a specific product """ 60 | 61 | if not counter: 62 | counter = { 63 | 'products': 0, 64 | 'saved_tiles': 0, 65 | 'skipped_tiles': 0, 66 | 'skipped_tiles_paths': [] 67 | } 68 | 69 | s3_url = 'http://sentinel-s2-l1c.s3.amazonaws.com' 70 | 71 | product_meta_link = '{0}/{1}'.format(s3_url, product['metadata']) 72 | product_info = requests.get(product_meta_link, stream=True) 73 | product_metadata = metadata_to_dict(product_info.raw) 74 | product_metadata['product_meta_link'] = product_meta_link 75 | 76 | counter['products'] += 1 77 | 78 | for tile in product['tiles']: 79 | tile_info = requests.get('{0}/{1}'.format(s3_url, tile)) 80 | try: 81 | metadata = tile_metadata(tile_info.json(), copy(product_metadata), geometry_check) 82 | 83 | for w in writers: 84 | w(dst_folder, metadata) 85 | 86 | logger.info('Saving to disk: %s' % metadata['tile_name']) 87 | counter['saved_tiles'] += 1 88 | except JSONDecodeError: 89 | logger.warning('Tile: %s was not found and skipped' % tile) 90 | counter['skipped_tiles'] += 1 91 | counter['skipped_tiles_paths'].append(tile) 92 | 93 | return counter 94 | 95 | 96 | def single_metadata(product_name, dst_folder, writers=[file_writer], geometry_check=None): 97 | 98 | product_list = get_product_metadata_path(product_name) 99 | return product_metadata(product_list[product_name], dst_folder, writers=writers, geometry_check=geometry_check) 100 | 101 | 102 | def daily_metadata(year, month, day, dst_folder, writers=[file_writer], geometry_check=None, 103 | num_worker_threads=1): 104 | """ Extra metadata for all products in a specific date """ 105 | 106 | threaded = False 107 | 108 | counter = { 109 | 'products': 0, 110 | 'saved_tiles': 0, 111 | 'skipped_tiles': 0, 112 | 'skipped_tiles_paths': [] 113 | } 114 | 115 | if num_worker_threads > 1: 116 | threaded = True 117 | queue = Queue() 118 | 119 | # create folders 120 | year_dir = os.path.join(dst_folder, str(year)) 121 | month_dir = os.path.join(year_dir, str(month)) 122 | day_dir = os.path.join(month_dir, str(day)) 123 | 124 | product_list = get_products_metadata_path(year, month, day) 125 | 126 | logger.info('There are %s products in %s-%s-%s' % (len(list(iterkeys(product_list))), 127 | year, month, day)) 128 | 129 | for name, product in iteritems(product_list): 130 | product_dir = os.path.join(day_dir, name) 131 | 132 | if threaded: 133 | queue.put([product, product_dir, counter, writers, geometry_check]) 134 | else: 135 | counter = product_metadata(product, product_dir, counter, writers, geometry_check) 136 | 137 | if threaded: 138 | def worker(): 139 | while not queue.empty(): 140 | args = queue.get() 141 | try: 142 | product_metadata(*args) 143 | except Exception: 144 | exc = sys.exc_info() 145 | logger.error('%s tile skipped due to error: %s' % (threading.current_thread().name, 146 | exc[1].__str__())) 147 | args[2]['skipped_tiles'] += 1 148 | queue.task_done() 149 | 150 | threads = [] 151 | for i in range(num_worker_threads): 152 | t = threading.Thread(target=worker) 153 | t.start() 154 | threads.append(t) 155 | 156 | queue.join() 157 | 158 | return counter 159 | 160 | 161 | def range_metadata(start, end, dst_folder, num_worker_threads=0, writers=[file_writer], geometry_check=None): 162 | """ Extra metadata for all products in a date range """ 163 | 164 | assert isinstance(start, date) 165 | assert isinstance(end, date) 166 | 167 | delta = end - start 168 | 169 | dates = [] 170 | 171 | for i in range(delta.days + 1): 172 | dates.append(start + timedelta(days=i)) 173 | 174 | days = len(dates) 175 | 176 | total_counter = { 177 | 'days': days, 178 | 'products': 0, 179 | 'saved_tiles': 0, 180 | 'skipped_tiles': 0, 181 | 'skipped_tiles_paths': [] 182 | } 183 | 184 | def update_counter(counter): 185 | for key in iterkeys(total_counter): 186 | if key in counter: 187 | total_counter[key] += counter[key] 188 | 189 | for d in dates: 190 | logger.info('Getting metadata of {0}-{1}-{2}'.format(d.year, d.month, d.day)) 191 | update_counter(daily_metadata(d.year, d.month, d.day, dst_folder, writers, geometry_check, 192 | num_worker_threads)) 193 | 194 | return total_counter 195 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | CC0 1.0 Universal 2 | 3 | Statement of Purpose 4 | 5 | The laws of most jurisdictions throughout the world automatically confer 6 | exclusive Copyright and Related Rights (defined below) upon the creator and 7 | subsequent owner(s) (each and all, an "owner") of an original work of 8 | authorship and/or a database (each, a "Work"). 9 | 10 | Certain owners wish to permanently relinquish those rights to a Work for the 11 | purpose of contributing to a commons of creative, cultural and scientific 12 | works ("Commons") that the public can reliably and without fear of later 13 | claims of infringement build upon, modify, incorporate in other works, reuse 14 | and redistribute as freely as possible in any form whatsoever and for any 15 | purposes, including without limitation commercial purposes. These owners may 16 | contribute to the Commons to promote the ideal of a free culture and the 17 | further production of creative, cultural and scientific works, or to gain 18 | reputation or greater distribution for their Work in part through the use and 19 | efforts of others. 20 | 21 | For these and/or other purposes and motivations, and without any expectation 22 | of additional consideration or compensation, the person associating CC0 with a 23 | Work (the "Affirmer"), to the extent that he or she is an owner of Copyright 24 | and Related Rights in the Work, voluntarily elects to apply CC0 to the Work 25 | and publicly distribute the Work under its terms, with knowledge of his or her 26 | Copyright and Related Rights in the Work and the meaning and intended legal 27 | effect of CC0 on those rights. 28 | 29 | 1. Copyright and Related Rights. A Work made available under CC0 may be 30 | protected by copyright and related or neighboring rights ("Copyright and 31 | Related Rights"). Copyright and Related Rights include, but are not limited 32 | to, the following: 33 | 34 | i. the right to reproduce, adapt, distribute, perform, display, communicate, 35 | and translate a Work; 36 | 37 | ii. moral rights retained by the original author(s) and/or performer(s); 38 | 39 | iii. publicity and privacy rights pertaining to a person's image or likeness 40 | depicted in a Work; 41 | 42 | iv. rights protecting against unfair competition in regards to a Work, 43 | subject to the limitations in paragraph 4(a), below; 44 | 45 | v. rights protecting the extraction, dissemination, use and reuse of data in 46 | a Work; 47 | 48 | vi. database rights (such as those arising under Directive 96/9/EC of the 49 | European Parliament and of the Council of 11 March 1996 on the legal 50 | protection of databases, and under any national implementation thereof, 51 | including any amended or successor version of such directive); and 52 | 53 | vii. other similar, equivalent or corresponding rights throughout the world 54 | based on applicable law or treaty, and any national implementations thereof. 55 | 56 | 2. Waiver. To the greatest extent permitted by, but not in contravention of, 57 | applicable law, Affirmer hereby overtly, fully, permanently, irrevocably and 58 | unconditionally waives, abandons, and surrenders all of Affirmer's Copyright 59 | and Related Rights and associated claims and causes of action, whether now 60 | known or unknown (including existing as well as future claims and causes of 61 | action), in the Work (i) in all territories worldwide, (ii) for the maximum 62 | duration provided by applicable law or treaty (including future time 63 | extensions), (iii) in any current or future medium and for any number of 64 | copies, and (iv) for any purpose whatsoever, including without limitation 65 | commercial, advertising or promotional purposes (the "Waiver"). Affirmer makes 66 | the Waiver for the benefit of each member of the public at large and to the 67 | detriment of Affirmer's heirs and successors, fully intending that such Waiver 68 | shall not be subject to revocation, rescission, cancellation, termination, or 69 | any other legal or equitable action to disrupt the quiet enjoyment of the Work 70 | by the public as contemplated by Affirmer's express Statement of Purpose. 71 | 72 | 3. Public License Fallback. Should any part of the Waiver for any reason be 73 | judged legally invalid or ineffective under applicable law, then the Waiver 74 | shall be preserved to the maximum extent permitted taking into account 75 | Affirmer's express Statement of Purpose. In addition, to the extent the Waiver 76 | is so judged Affirmer hereby grants to each affected person a royalty-free, 77 | non transferable, non sublicensable, non exclusive, irrevocable and 78 | unconditional license to exercise Affirmer's Copyright and Related Rights in 79 | the Work (i) in all territories worldwide, (ii) for the maximum duration 80 | provided by applicable law or treaty (including future time extensions), (iii) 81 | in any current or future medium and for any number of copies, and (iv) for any 82 | purpose whatsoever, including without limitation commercial, advertising or 83 | promotional purposes (the "License"). The License shall be deemed effective as 84 | of the date CC0 was applied by Affirmer to the Work. Should any part of the 85 | License for any reason be judged legally invalid or ineffective under 86 | applicable law, such partial invalidity or ineffectiveness shall not 87 | invalidate the remainder of the License, and in such case Affirmer hereby 88 | affirms that he or she will not (i) exercise any of his or her remaining 89 | Copyright and Related Rights in the Work or (ii) assert any associated claims 90 | and causes of action with respect to the Work, in either case contrary to 91 | Affirmer's express Statement of Purpose. 92 | 93 | 4. Limitations and Disclaimers. 94 | 95 | a. No trademark or patent rights held by Affirmer are waived, abandoned, 96 | surrendered, licensed or otherwise affected by this document. 97 | 98 | b. Affirmer offers the Work as-is and makes no representations or warranties 99 | of any kind concerning the Work, express, implied, statutory or otherwise, 100 | including without limitation warranties of title, merchantability, fitness 101 | for a particular purpose, non infringement, or the absence of latent or 102 | other defects, accuracy, or the present or absence of errors, whether or not 103 | discoverable, all to the greatest extent permissible under applicable law. 104 | 105 | c. Affirmer disclaims responsibility for clearing rights of other persons 106 | that may apply to the Work or any use thereof, including without limitation 107 | any person's Copyright and Related Rights in the Work. Further, Affirmer 108 | disclaims responsibility for obtaining any necessary consents, permissions 109 | or other rights required for any use of the Work. 110 | 111 | d. Affirmer understands and acknowledges that Creative Commons is not a 112 | party to this document and has no duty or obligation with respect to this 113 | CC0 or use of the Work. 114 | 115 | For more information, please see 116 | 117 | -------------------------------------------------------------------------------- /tests/test_converter.py: -------------------------------------------------------------------------------- 1 | import json 2 | import unittest 3 | from copy import copy 4 | from collections import OrderedDict 5 | 6 | from six import iterkeys 7 | from sentinel_s3.converter import (camelcase_underscore, metadata_to_dict, tile_metadata, to_latlon, 8 | get_tile_geometry, convert_coordinates) 9 | 10 | 11 | class Test(unittest.TestCase): 12 | 13 | def test_camelcase_underscore(self): 14 | 15 | assert camelcase_underscore('productName') == 'product_name' 16 | assert camelcase_underscore('ProductName') == 'product_name' 17 | assert camelcase_underscore('productname') == 'productname' 18 | assert camelcase_underscore('product1Name') == 'product1_name' 19 | 20 | def test_metadata_to_dict(self): 21 | 22 | xml = open('tests/samples/metadata.xml') 23 | product = metadata_to_dict(xml) 24 | 25 | assert isinstance(product, OrderedDict) 26 | assert 'band_list' in product 27 | assert 'tiles' in product 28 | assert product['spacecraft_name'] == 'Sentinel-2A' 29 | assert len(product['band_list']) == 13 30 | 31 | tiles = list(iterkeys(product['tiles'])) 32 | assert len(tiles) == 20 33 | 34 | def test_metadata_to_dict_new_format(self): 35 | 36 | xml = open('tests/samples/metadata_new.xml') 37 | product = metadata_to_dict(xml) 38 | 39 | assert isinstance(product, OrderedDict) 40 | assert 'band_list' in product 41 | assert 'tiles' in product 42 | assert product['spacecraft_name'] == 'Sentinel-2A' 43 | assert len(product['band_list']) == 13 44 | 45 | tiles = list(iterkeys(product['tiles'])) 46 | assert len(tiles) == 1 47 | 48 | def test_tile_metadata(self): 49 | 50 | f = open('tests/samples/tileInfo.json', 'rb') 51 | tile_info = json.loads(f.read().decode(), object_pairs_hook=OrderedDict) 52 | 53 | tile = tile_metadata(tile_info, metadata_to_dict('tests/samples/metadata.xml')) 54 | 55 | assert isinstance(tile, OrderedDict) 56 | assert tile['thumbnail'] == 'http://sentinel-s2-l1c.s3.amazonaws.com/tiles/56/X/NF/2016/3/16/0/preview.jp2' 57 | assert tile['tile_name'] == 'S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56XNF_N02.01' 58 | assert tile['utm_zone'] == 56 59 | assert tile['data_coverage_percentage'] == 65.58 60 | assert tile['sensing_orbit_direction'] == 'DESCENDING' 61 | assert len(tile['download_links']['aws_s3']) == 13 62 | 63 | # Make sure bands urls are left padded 64 | d_link = tile['download_links']['aws_s3'][0].split('.')[-2].split('/') 65 | assert d_link[-1] == 'B01' 66 | 67 | def test_tile_metadata_with_geometry_check(self): 68 | 69 | def geometry_check(meta): 70 | if meta['latitude_band'] == 'N': 71 | return False 72 | 73 | return True 74 | 75 | f = open('tests/samples/tileInfo.json', 'rb') 76 | tile_info = json.loads(f.read().decode(), object_pairs_hook=OrderedDict) 77 | 78 | tile = tile_metadata(tile_info, metadata_to_dict('tests/samples/metadata.xml'), geometry_check) 79 | 80 | assert isinstance(tile, OrderedDict) 81 | assert tile['thumbnail'] == 'http://sentinel-s2-l1c.s3.amazonaws.com/tiles/56/X/NF/2016/3/16/0/preview.jp2' 82 | assert tile['tile_name'] == 'S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56XNF_N02.01' 83 | assert tile['utm_zone'] == 56 84 | assert tile['data_coverage_percentage'] == 65.58 85 | assert tile['sensing_orbit_direction'] == 'DESCENDING' 86 | assert len(tile['download_links']['aws_s3']) == 13 87 | 88 | # Make sure bands urls are left padded 89 | d_link = tile['download_links']['aws_s3'][0].split('.')[-2].split('/') 90 | assert d_link[-1] == 'B01' 91 | 92 | def test_to_latlon_edge_of_coordinate_system(self): 93 | 94 | geojson = { 95 | "type": "Polygon", 96 | "crs": { 97 | "type": "name", 98 | "properties": { 99 | "name": "urn:ogc:def:crs:EPSG:8.8.1:32601" 100 | } 101 | }, 102 | "coordinates": [ 103 | [ 104 | [ 105 | 336706.875271381, 106 | 7799999.0 107 | ], 108 | [ 109 | 409799.0, 110 | 7799999.0 111 | ], 112 | [ 113 | 409799.0, 114 | 7690201.0 115 | ], 116 | [ 117 | 300001.0, 118 | 7690201.0 119 | ], 120 | [ 121 | 300001.0, 122 | 7728957.392986406 123 | ], 124 | [ 125 | 315164.079827873, 126 | 7758207.990416902 127 | ], 128 | [ 129 | 330501.865974295, 130 | 7787926.032465892 131 | ], 132 | [ 133 | 336706.875271381, 134 | 7799999.0 135 | ] 136 | ] 137 | ] 138 | } 139 | 140 | gj = to_latlon(copy(geojson)) 141 | self.assertNotEqual(gj['coordinates'][0][0], geojson['coordinates'][0][0]) 142 | self.assertAlmostEqual(gj['coordinates'][0][1][0], 180.60306, 4) 143 | 144 | def test_to_latlon(self): 145 | 146 | geojson = { 147 | 'type': 'Polygon', 148 | 'coordinates': [ 149 | [ 150 | [448938.374906865, 2500019.0], 151 | [509759.0, 2500019.0], 152 | [509759.0, 2390221.0], 153 | [424439.204990156, 2390221.0], 154 | [430306.260834363, 2416547.808440298], 155 | [444965.351229892, 2482150.64898733], 156 | [448938.374906865, 2500019.0] 157 | ] 158 | ], 159 | 'crs': {'type': 'name', 'properties': {'name': 'urn:ogc:def:crs:EPSG:8.8.1:32632'}} 160 | } 161 | 162 | gj = to_latlon(copy(geojson)) 163 | assert gj['coordinates'][0][0] != geojson['coordinates'][0][0] 164 | 165 | def test_get_tile_geometry(self): 166 | 167 | tiles = { 168 | 'partial_right': { 169 | 'path': 'tests/samples/B01_right.jp2', 170 | 'tile': [-75.3723, -74.8924], 171 | 'data': [-75.0555, -75.3723], 172 | 'epsg': 32618 173 | }, 174 | 'partial_left': { 175 | 'path': 'tests/samples/B01_left.jp2', 176 | 'tile': [-62.1004, -61.113], 177 | 'data': [-62.1002, -62.0978], 178 | 'epsg': 32620 179 | }, 180 | 'full': { 181 | 'path': 'tests/samples/B01_full.jp2', 182 | 'tile': [-67.4893, -67.4893], 183 | 'data': [-67.4893, -67.4893], 184 | 'epsg': 32620 185 | }, 186 | 'edge_case': { 187 | 'path': 'tests/samples/B01_multi.jp2', 188 | 'tile': [-69.0002, -68.8339], 189 | 'data': [-68.9683, -68.8339], 190 | 'epsg': 32619 191 | }, 192 | } 193 | 194 | for t in iterkeys(tiles): 195 | print(t) 196 | (tile, data) = get_tile_geometry(tiles[t]['path'], tiles[t]['epsg']) 197 | 198 | fc = { 199 | 'type': 'FeatureCollection', 200 | 'features': [] 201 | } 202 | 203 | for g in [data]: 204 | f = { 205 | 'type': 'Feature', 206 | 'properties': {}, 207 | 'geometry': g 208 | } 209 | fc['features'].append(f) 210 | 211 | # # uncommen to write the results to disk for testing 212 | # f = open('test_%s.geojson' % t, 'w') 213 | # f.write(json.dumps(fc)) 214 | 215 | for i in range(0, 2): 216 | self.assertEqual(tiles[t]['tile'][i], round(tile['coordinates'][0][i][0], 4)) 217 | self.assertEqual(tiles[t]['data'][i], round(data['coordinates'][0][i][0], 4)) 218 | -------------------------------------------------------------------------------- /sentinel_s3/converter.py: -------------------------------------------------------------------------------- 1 | import re 2 | import os 3 | import errno 4 | import shutil 5 | import logging 6 | import threading 7 | from tempfile import mkdtemp 8 | from collections import OrderedDict 9 | import xml.etree.cElementTree as etree 10 | 11 | import rasterio 12 | import requests 13 | from wordpad import pad 14 | from six import iteritems 15 | from pyproj import Proj, transform 16 | from rasterio.features import shapes 17 | from shapely.ops import cascaded_union 18 | from shapely.geometry import mapping, Polygon 19 | 20 | logger = logging.getLogger('sentinel.meta.s3') 21 | s3_url = 'http://sentinel-s2-l1c.s3.amazonaws.com' 22 | 23 | 24 | def epsg_code(geojson): 25 | """ get the espg code from the crs system """ 26 | 27 | if isinstance(geojson, dict): 28 | if 'crs' in geojson: 29 | urn = geojson['crs']['properties']['name'].split(':') 30 | if 'EPSG' in urn: 31 | try: 32 | return int(urn[-1]) 33 | except (TypeError, ValueError): 34 | return None 35 | 36 | return None 37 | 38 | 39 | def test_wrap_coordinates(coords, origin, wgs84): 40 | """ Test whether coordinates wrap around the antimeridian in wgs84 """ 41 | lon_under_minus_170 = False 42 | lon_over_plus_170 = False 43 | if isinstance(coords[0], list): 44 | for c in coords[0]: 45 | c = list(transform(origin, wgs84, *c)) 46 | if c[0] < -170: 47 | lon_under_minus_170 = True 48 | elif c[0] > 170: 49 | lon_over_plus_170 = True 50 | else: 51 | return False 52 | 53 | return lon_under_minus_170 and lon_over_plus_170 54 | 55 | 56 | def convert_coordinates(coords, origin, wgs84, wrapped): 57 | """ Convert coordinates from one crs to another """ 58 | if isinstance(coords, list) or isinstance(coords, tuple): 59 | try: 60 | if isinstance(coords[0], list) or isinstance(coords[0], tuple): 61 | return [convert_coordinates(list(c), origin, wgs84, wrapped) for c in coords] 62 | elif isinstance(coords[0], float): 63 | c = list(transform(origin, wgs84, *coords)) 64 | if wrapped and c[0] < -170: 65 | c[0] = c[0] + 360 66 | return c 67 | 68 | except IndexError: 69 | pass 70 | 71 | return None 72 | 73 | 74 | def to_latlon(geojson, origin_espg=None): 75 | """ 76 | Convert a given geojson to wgs84. The original epsg must be included insde the crs 77 | tag of geojson 78 | """ 79 | 80 | if isinstance(geojson, dict): 81 | 82 | # get epsg code: 83 | if origin_espg: 84 | code = origin_espg 85 | else: 86 | code = epsg_code(geojson) 87 | if code: 88 | origin = Proj(init='epsg:%s' % code) 89 | wgs84 = Proj(init='epsg:4326') 90 | wrapped = test_wrap_coordinates(geojson['coordinates'], origin, wgs84) 91 | new_coords = convert_coordinates(geojson['coordinates'], origin, wgs84, wrapped) 92 | if new_coords: 93 | geojson['coordinates'] = new_coords 94 | try: 95 | del geojson['crs'] 96 | except KeyError: 97 | pass 98 | 99 | return geojson 100 | 101 | 102 | def camelcase_underscore(name): 103 | """ Convert camelcase names to underscore """ 104 | s1 = re.sub('(.)([A-Z][a-z]+)', r'\1_\2', name) 105 | return re.sub('([a-z0-9])([A-Z])', r'\1_\2', s1).lower() 106 | 107 | 108 | def get_tiles_list(element): 109 | """ 110 | Returns the list of all tile names from Product_Organisation element 111 | in metadata.xml 112 | """ 113 | 114 | tiles = {} 115 | 116 | for el in element: 117 | g = (el.findall('.//Granules') or el.findall('.//Granule'))[0] 118 | name = g.attrib['granuleIdentifier'] 119 | 120 | name_parts = name.split('_') 121 | mgs = name_parts[-2] 122 | tiles[mgs] = name 123 | 124 | return tiles 125 | 126 | 127 | def metadata_to_dict(metadata): 128 | """ Looks at metadata.xml file of sentinel product and extract useful keys 129 | Returns a python dict """ 130 | 131 | tree = etree.parse(metadata) 132 | root = tree.getroot() 133 | 134 | meta = OrderedDict() 135 | 136 | keys = [ 137 | 'SPACECRAFT_NAME', 138 | 'PRODUCT_STOP_TIME', 139 | 'Cloud_Coverage_Assessment', 140 | 'PROCESSING_LEVEL', 141 | 'PRODUCT_TYPE', 142 | 'PROCESSING_BASELINE', 143 | 'SENSING_ORBIT_NUMBER', 144 | 'SENSING_ORBIT_DIRECTION', 145 | 'PRODUCT_FORMAT', 146 | ] 147 | 148 | # grab important keys from the file 149 | for key in keys: 150 | try: 151 | meta[key.lower()] = root.findall('.//' + key)[0].text 152 | except IndexError: 153 | meta[key.lower()] = None 154 | 155 | meta['product_cloud_coverage_assessment'] = float(meta.pop('cloud_coverage_assessment')) 156 | 157 | meta['sensing_orbit_number'] = int(meta['sensing_orbit_number']) 158 | 159 | # get tile list 160 | meta['tiles'] = get_tiles_list(root.findall('.//Product_Organisation')[0]) 161 | 162 | # get available bands 163 | if root.findall('.//Band_List'): 164 | bands = root.findall('.//Band_List')[0] 165 | meta['band_list'] = [] 166 | for b in bands: 167 | band = b.text.replace('B', '') 168 | if len(band) == 1: 169 | band = 'B' + pad(band, 2) 170 | else: 171 | band = b.text 172 | meta['band_list'].append(band) 173 | else: 174 | bands = root.findall('.//Spectral_Information_List')[0] 175 | meta['band_list'] = [] 176 | for b in bands: 177 | band = b.attrib['physicalBand'].replace('B', '') 178 | if len(band) == 1: 179 | band = 'B' + pad(band, 2) 180 | else: 181 | band = b.attrib['physicalBand'] 182 | meta['band_list'].append(band) 183 | 184 | return meta 185 | 186 | 187 | def get_tile_geometry(path, origin_espg, tolerance=500): 188 | """ Calculate the data and tile geometry for sentinel-2 tiles """ 189 | 190 | with rasterio.open(path) as src: 191 | 192 | # Get tile geometry 193 | b = src.bounds 194 | tile_shape = Polygon([(b[0], b[1]), (b[2], b[1]), (b[2], b[3]), (b[0], b[3]), (b[0], b[1])]) 195 | tile_geojson = mapping(tile_shape) 196 | 197 | # read first band of the image 198 | image = src.read(1) 199 | 200 | # create a mask of zero values 201 | mask = image == 0. 202 | 203 | # generate shapes of the mask 204 | novalue_shape = shapes(image, mask=mask, transform=src.affine) 205 | 206 | # generate polygons using shapely 207 | novalue_shape = [Polygon(s['coordinates'][0]) for (s, v) in novalue_shape] 208 | 209 | if novalue_shape: 210 | 211 | # Make sure polygons are united 212 | # also simplify the resulting polygon 213 | union = cascaded_union(novalue_shape) 214 | 215 | # generates a geojson 216 | data_shape = tile_shape.difference(union) 217 | 218 | # If there are multipolygons, select the largest one 219 | if data_shape.geom_type == 'MultiPolygon': 220 | areas = {p.area: i for i, p in enumerate(data_shape)} 221 | largest = max(areas.keys()) 222 | data_shape = data_shape[areas[largest]] 223 | 224 | # if the polygon has interior rings, remove them 225 | if list(data_shape.interiors): 226 | data_shape = Polygon(data_shape.exterior.coords) 227 | 228 | data_shape = data_shape.simplify(tolerance, preserve_topology=False) 229 | data_geojson = mapping(data_shape) 230 | 231 | else: 232 | data_geojson = tile_geojson 233 | 234 | # convert cooridnates to degrees 235 | return (to_latlon(tile_geojson, origin_espg), to_latlon(data_geojson, origin_espg)) 236 | 237 | 238 | def get_tile_geometry_from_s3(meta): 239 | 240 | # create a temp folder 241 | tmp_folder = mkdtemp() 242 | f = os.path.join(tmp_folder, 'B01.jp2') 243 | 244 | # donwload B01 245 | r = requests.get('{0}/{1}/B01.jp2'.format(s3_url, meta['path']), stream=True) 246 | chunk_size = 1024 247 | 248 | with open(f, 'wb') as fd: 249 | for chunk in r.iter_content(chunk_size): 250 | fd.write(chunk) 251 | 252 | (meta['tile_geometry'], 253 | meta['tile_data_geometry']) = get_tile_geometry(f, epsg_code(meta['tile_geometry'])) 254 | meta['tile_origin'] = to_latlon(meta['tile_origin']) 255 | 256 | # remove temp folder 257 | try: 258 | shutil.rmtree(tmp_folder) 259 | except OSError as exc: 260 | if exc.errno != errno.ENOENT: 261 | raise 262 | 263 | return meta 264 | 265 | 266 | def tile_metadata(tile, product, geometry_check=None): 267 | """ Generate metadata for a given tile 268 | 269 | - geometry_check is a function the determines whether to calculate the geometry by downloading 270 | B01 and override provided geometry in tilejson. The meta object is passed to this function. 271 | The function return a True or False response. 272 | """ 273 | 274 | grid = 'T{0}{1}{2}'.format(pad(tile['utmZone'], 2), tile['latitudeBand'], tile['gridSquare']) 275 | 276 | meta = OrderedDict({ 277 | 'tile_name': product['tiles'][grid] 278 | }) 279 | 280 | logger.info('%s Processing tile %s' % (threading.current_thread().name, tile['path'])) 281 | 282 | meta['date'] = tile['timestamp'].split('T')[0] 283 | 284 | meta['thumbnail'] = '{1}/{0}/preview.jp2'.format(tile['path'], s3_url) 285 | 286 | # remove unnecessary keys 287 | product.pop('tiles') 288 | tile.pop('datastrip') 289 | bands = product.pop('band_list') 290 | 291 | for k, v in iteritems(tile): 292 | meta[camelcase_underscore(k)] = v 293 | 294 | meta.update(product) 295 | 296 | # construct download links 297 | links = ['{2}/{0}/{1}.jp2'.format(meta['path'], b, s3_url) for b in bands] 298 | 299 | meta['download_links'] = { 300 | 'aws_s3': links 301 | } 302 | 303 | meta['original_tile_meta'] = '{0}/{1}/tileInfo.json'.format(s3_url, meta['path']) 304 | 305 | def internal_latlon(meta): 306 | keys = ['tile_origin', 'tile_geometry', 'tile_data_geometry'] 307 | for key in keys: 308 | if key in meta: 309 | meta[key] = to_latlon(meta[key]) 310 | return meta 311 | 312 | # change coordinates to wsg4 degrees 313 | if geometry_check: 314 | if geometry_check(meta): 315 | meta = get_tile_geometry_from_s3(meta) 316 | else: 317 | meta = internal_latlon(meta) 318 | else: 319 | meta = internal_latlon(meta) 320 | 321 | # rename path key to aws_path 322 | meta['aws_path'] = meta.pop('path') 323 | 324 | return meta 325 | -------------------------------------------------------------------------------- /tests/samples/metadata_new.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 2016-12-11T19:03:42.026Z 5 | 2016-12-11T19:03:42.026Z 6 | 7 | S2A_MSIL1C_20161211T190342_N0204_R113_T10SDG_20161211T190344.SAFE 8 | 9 | Level-1C 10 | S2MSI1C 11 | 02.04 12 | 2016-12-11T19:03:44.000000Z 13 | Not applicable 14 | Not applicable 15 | 16 | Sentinel-2A 17 | INS-NOBS 18 | 2016-12-11T19:03:42.026Z 19 | 113 20 | DESCENDING 21 | 22 | 23 | SAFE_COMPACT 24 | 25 | 26 | 27 | 28 | 29 | GRANULE/L1C_T10SDG_A007689_20161211T190344/IMG_DATA/T10SDG_20161211T190342_B01 30 | 31 | 32 | GRANULE/L1C_T10SDG_A007689_20161211T190344/IMG_DATA/T10SDG_20161211T190342_B02 33 | 34 | 35 | GRANULE/L1C_T10SDG_A007689_20161211T190344/IMG_DATA/T10SDG_20161211T190342_B05 36 | 37 | 38 | GRANULE/L1C_T10SDG_A007689_20161211T190344/IMG_DATA/T10SDG_20161211T190342_B03 39 | 40 | 41 | GRANULE/L1C_T10SDG_A007689_20161211T190344/IMG_DATA/T10SDG_20161211T190342_B09 42 | 43 | 44 | GRANULE/L1C_T10SDG_A007689_20161211T190344/IMG_DATA/T10SDG_20161211T190342_B07 45 | 46 | 47 | GRANULE/L1C_T10SDG_A007689_20161211T190344/IMG_DATA/T10SDG_20161211T190342_B8A 48 | 49 | 50 | GRANULE/L1C_T10SDG_A007689_20161211T190344/IMG_DATA/T10SDG_20161211T190342_B10 51 | 52 | 53 | GRANULE/L1C_T10SDG_A007689_20161211T190344/IMG_DATA/T10SDG_20161211T190342_B06 54 | 55 | 56 | GRANULE/L1C_T10SDG_A007689_20161211T190344/IMG_DATA/T10SDG_20161211T190342_TCI 57 | 58 | 59 | GRANULE/L1C_T10SDG_A007689_20161211T190344/IMG_DATA/T10SDG_20161211T190342_B11 60 | 61 | 62 | GRANULE/L1C_T10SDG_A007689_20161211T190344/IMG_DATA/T10SDG_20161211T190342_B08 63 | 64 | 65 | GRANULE/L1C_T10SDG_A007689_20161211T190344/IMG_DATA/T10SDG_20161211T190342_B12 66 | 67 | 68 | GRANULE/L1C_T10SDG_A007689_20161211T190344/IMG_DATA/T10SDG_20161211T190342_B04 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | NODATA 77 | 0 78 | 79 | 80 | SATURATED 81 | 65535 82 | 83 | 84 | 3 85 | 2 86 | 1 87 | 88 | 10000 89 | 90 | 1.03089111499558 91 | 92 | 1913.57 93 | 1941.63 94 | 1822.61 95 | 1512.79 96 | 1425.56 97 | 1288.32 98 | 1163.19 99 | 1036.39 100 | 955.19 101 | 813.04 102 | 367.15 103 | 245.59 104 | 85.25 105 | 106 | 107 | 108 | 109 | 60 110 | 111 | 430 112 | 457 113 | 443.9 114 | 115 | 116 | 1 117 | 118 | 0.01522444 0.06669758 0.19425897 0.35395736 0.45648857 0.50759455 0.54750739 0.58419244 0.61012868 0.64603585 0.69458246 0.74037505 0.78703023 0.85862712 0.94458791 0.9928916 1 0.99055275 0.97282606 0.95596914 0.95429069 0.91888272 0.72055356 0.38639386 0.14531035 0.05161255 0.01738704 0.00029585 119 | 120 | 121 | 122 | 123 | 10 124 | 125 | 440 126 | 538 127 | 496.6 128 | 129 | 130 | 1 131 | 132 | 0.00119988 0.00201397 0.00258793 0.00271734 0.00271858 0.002053 0.00324912 0.0021993 0.00277292 0.00311194 0.00234723 0.00374245 0.0028408 0.00304821 0.00604983 0.00894596 0.01953246 0.03875845 0.08374839 0.17565347 0.29129289 0.36347223 0.3811347 0.38419864 0.39176673 0.39862405 0.40894049 0.42354641 0.4485657 0.4811418 0.50498541 0.52293008 0.52892822 0.53366 0.53242234 0.53311303 0.53655971 0.54232711 0.55667534 0.57791322 0.60145975 0.6156357 0.62060573 0.61270938 0.59482968 0.57420278 0.55609253 0.5440646 0.54004284 0.5517318 0.56998769 0.59684728 0.63205242 0.67244298 0.71093613 0.73748447 0.75709994 0.76697185 0.77176039 0.77883444 0.78683055 0.79421954 0.80824012 0.82348832 0.83743831 0.84485726 0.84716089 0.83974417 0.82502148 0.8036499 0.78544282 0.76973497 0.7598602 0.76337273 0.77981251 0.80847605 0.84947272 0.90112566 0.95456662 0.98736039 1 0.98609155 0.90770989 0.72315884 0.47814326 0.28641509 0.16955089 0.10257285 0.06498784 0.04106167 0.02503855 0.01307564 0.00257814 0.00108051 0.00030609 0.00043924 0.00044121 133 | 134 | 135 | 136 | 137 | 10 138 | 139 | 537 140 | 582 141 | 560 142 | 143 | 144 | 1 145 | 146 | 0.00080152 0.01631966 0.03749604 0.08021834 0.16857673 0.33961135 0.57045802 0.74395167 0.8255379 0.86623109 0.88713486 0.89063153 0.87743881 0.85952176 0.84272738 0.83271245 0.83091319 0.8429466 0.86557037 0.89523547 0.93204973 0.96550034 0.99001699 1 0.99850933 0.98241577 0.94879561 0.90893224 0.87016848 0.83868631 0.8133992 0.79225145 0.7842798 0.78830002 0.80532973 0.82861237 0.84453213 0.85667749 0.85654311 0.79885992 0.62453426 0.38688244 0.20018537 0.09831467 0.04284073 0.01651146 147 | 148 | 149 | 150 | 151 | 10 152 | 153 | 646 154 | 684 155 | 664.5 156 | 157 | 158 | 1 159 | 160 | 0.00261427 0.03462832 0.15030251 0.46548409 0.81834707 0.96554871 0.98388489 0.99687187 1 0.9955785 0.99164257 0.97772062 0.93750282 0.87465366 0.81520176 0.77787363 0.7662682 0.77666981 0.80308737 0.83262125 0.8589057 0.88527593 0.91047688 0.93604508 0.95692399 0.96878538 0.9736139 0.97172876 0.96901499 0.96568155 0.96045441 0.94488073 0.88430524 0.70624874 0.42290429 0.18976191 0.06313289 0.02061386 0.0020257 161 | 162 | 163 | 164 | 165 | 20 166 | 167 | 694 168 | 713 169 | 703.9 170 | 171 | 172 | 1 173 | 174 | 0.00118221 0.04128719 0.16781115 0.47867704 0.83408915 0.98555238 1 0.99917704 0.99301208 0.98202139 0.96500594 0.94523647 0.92390813 0.90154471 0.88461764 0.86012379 0.75605334 0.52042972 0.19640628 0.03678278 175 | 176 | 177 | 178 | 179 | 20 180 | 181 | 731 182 | 749 183 | 740.2 184 | 185 | 186 | 1 187 | 188 | 0.00528628 0.08491265 0.34549055 0.75026111 0.91998424 0.91774468 0.93414364 0.95786657 0.97589351 0.98201154 0.98159765 0.99345282 1 0.98250656 0.96245634 0.85475636 0.50661225 0.13533181 0.0134302 189 | 190 | 191 | 192 | 193 | 20 194 | 195 | 769 196 | 797 197 | 782.5 198 | 199 | 200 | 1 201 | 202 | 0.00158775 0.01471955 0.06700855 0.19944036 0.42271848 0.69391142 0.89840316 0.98314165 0.99479749 1 0.99483279 0.96447136 0.90781386 0.8464478 0.80150314 0.77808053 0.77627582 0.78832546 0.79959911 0.80136031 0.79006668 0.75603297 0.67647373 0.53577608 0.36341065 0.19325756 0.07716074 0.01971336 0.00315275 203 | 204 | 205 | 206 | 207 | 10 208 | 209 | 760 210 | 908 211 | 835.1 212 | 213 | 214 | 1 215 | 216 | 0.00135242 0.00391616 0.00044871 0.00759275 0.01905313 0.03349108 0.05649128 0.0870686 0.13235321 0.20327639 0.31387542 0.44988941 0.58726605 0.71436889 0.8181812 0.90284514 0.96067672 0.99369744 1 0.98524291 0.95844788 0.93666123 0.92594982 0.93050611 0.94139304 0.95341007 0.96218307 0.9655653 0.96296703 0.95877093 0.95087228 0.94471788 0.94260088 0.94521458 0.94468494 0.94302291 0.9363001 0.92707231 0.91511356 0.90021968 0.88081425 0.86148256 0.84257439 0.82215879 0.80140132 0.7765823 0.75539136 0.73775889 0.72215744 0.70870534 0.69854507 0.6903735 0.68251717 0.68178973 0.68302899 0.67891416 0.67639408 0.67176564 0.66600791 0.66127505 0.65915263 0.65868891 0.66436872 0.67295613 0.68563017 0.7011901 0.72062162 0.74210801 0.75925571 0.77620597 0.7835688 0.78713055 0.78702403 0.7828085 0.77539043 0.7675732 0.75848677 0.74517599 0.73227212 0.71988842 0.70601879 0.69027923 0.67538468 0.66109671 0.6489481 0.63768298 0.62716971 0.61876397 0.61082755 0.60427772 0.59741976 0.59177741 0.5870773 0.58292462 0.58141689 0.57973476 0.58049471 0.58280279 0.58561492 0.58979099 0.59310853 0.59700109 0.60157219 0.60336097 0.60555331 0.60896068 0.61337866 0.61852465 0.62655929 0.63707128 0.6483534 0.6587092 0.66674618 0.66798851 0.65925168 0.64099533 0.61519263 0.5829609 0.55150764 0.52589593 0.50665129 0.49612167 0.49873702 0.5117356 0.52875232 0.54241942 0.53768022 0.49573105 0.41916397 0.32670548 0.23104246 0.14852103 0.08967661 0.05496955 0.03325212 0.01976446 0.00783771 0.00128398 217 | 218 | 219 | 220 | 221 | 20 222 | 223 | 848 224 | 881 225 | 864.8 226 | 227 | 228 | 1 229 | 230 | 0.0016587 0.01322143 0.02469164 0.05133023 0.10485306 0.21639327 0.38460415 0.58535033 0.77394613 0.87784514 0.91437737 0.92209877 0.92564458 0.9293724 0.93569013 0.94639017 0.95565571 0.96536061 0.97439721 0.97984594 0.98330113 0.98288901 0.98846942 1 0.99957999 0.92089575 0.72838861 0.47188018 0.23786107 0.10682374 0.04603695 0.02219884 0.00879487 0.00046171 231 | 232 | 233 | 234 | 235 | 60 236 | 237 | 932 238 | 958 239 | 945 240 | 241 | 242 | 1 243 | 244 | 0.01805614 0.06583501 0.18513673 0.40896107 0.6807859 0.87492845 0.93105831 0.96430107 0.98449689 0.99148444 0.99741262 0.97773458 0.9794157 0.99836495 0.98976032 1 0.98740831 0.98535381 0.95618373 0.96549887 0.93078391 0.86340691 0.70418342 0.44996198 0.20134116 0.05969267 0.0138846 245 | 246 | 247 | 248 | 249 | 60 250 | 251 | 1337 252 | 1412 253 | 1373.5 254 | 255 | 256 | 1 257 | 258 | 0.00024052 5.404e-05 3.052e-05 2.872e-05 7.632e-05 0.00010949 8.804e-05 0.00012356 0.00017424 0.0003317 0.00036891 0.0004467 0.00065919 0.0010913 0.00196903 0.00373668 0.00801754 0.01884719 0.04466732 0.10165546 0.20111776 0.34284841 0.50710992 0.6632068 0.78377143 0.86153862 0.91000261 0.94193255 0.96182259 0.97365119 0.98169786 0.98795826 0.99283342 0.99649788 0.99906011 1 0.99907734 0.99601604 0.9909083 0.98479854 0.97802142 0.97030114 0.96080954 0.94849765 0.93314108 0.91482336 0.8937997 0.86825426 0.83023193 0.76384193 0.65440009 0.50671604 0.35014737 0.21799972 0.12643091 0.06768988 0.0322709 0.013544 0.00544557 0.00237642 0.00111267 0.00053796 0.0003457 0.00017488 0.00021619 0.00019479 0.00010421 5.919e-05 5.109e-05 6.115e-05 5.527e-05 3.856e-05 3.147e-05 0.00012289 0.0001089 2.502e-05 259 | 260 | 261 | 262 | 263 | 20 264 | 265 | 1539 266 | 1682 267 | 1613.7 268 | 269 | 270 | 1 271 | 272 | 6.79e-06 6.66e-06 8e-06 2.734e-05 3.685e-05 8.851e-05 0.00014522 0.00024812 0.00047627 0.00056335 0.00065326 0.00089835 0.00114664 0.00165604 0.00241611 0.00350246 0.00524274 0.0081538 0.01237062 0.0186097 0.02721853 0.03879155 0.05379167 0.07353187 0.09932758 0.1334178 0.18029249 0.24484994 0.32834511 0.42749961 0.53576798 0.64570396 0.74245998 0.81447017 0.85866596 0.87924777 0.88665266 0.888727 0.89105732 0.89725046 0.90632982 0.91627527 0.9263751 0.93515828 0.94226446 0.94739906 0.95131987 0.95416808 0.95635128 0.95813297 0.96062738 0.96344083 0.96577764 0.96818134 0.97104025 0.97343195 0.97597444 0.97865413 0.97994672 0.98064126 0.98094979 0.98143338 0.98123856 0.98068083 0.98033995 0.98101894 0.98268503 0.98507875 0.98777658 0.9903608 0.99202087 0.9933069 0.99256744 0.99044883 0.98717314 0.98353656 0.9800432 0.97617287 0.97253451 0.96977033 0.96762556 0.9662626 0.96572411 0.96592079 0.96729798 0.96975438 0.97337748 0.97862858 0.98345358 0.98765317 0.9919238 0.99554959 0.99767411 0.99866451 0.99941783 0.99930984 0.99885298 0.99913515 0.99973164 0.99973592 1 0.9998438 0.9967639 0.99175576 0.9859206 0.97887302 0.97029262 0.96135891 0.95379752 0.94709017 0.94228614 0.93919512 0.93616637 0.92889205 0.9129921 0.88158383 0.82602164 0.74412949 0.64281662 0.53483955 0.42772166 0.32439525 0.23488131 0.16445229 0.11056237 0.07271886 0.04634859 0.02949618 0.01941871 0.0133487 0.00934594 0.00654231 0.00487921 0.00341903 0.00249864 0.00196431 0.00142754 0.00105878 0.00049978 0.00022833 0.00015999 3.415e-05 4.517e-05 1.313e-05 273 | 274 | 275 | 276 | 277 | 20 278 | 279 | 2078 280 | 2320 281 | 2202.4 282 | 283 | 284 | 1 285 | 286 | 0.00063835 0.00102286 0.00288712 0.00399879 0.00658916 0.00765458 0.00799918 0.00853524 0.00929493 0.00999614 0.01096645 0.01208363 0.01335837 0.01501119 0.01711931 0.01977307 0.02332743 0.02765779 0.03320435 0.04020464 0.04886709 0.0596238 0.07315348 0.09050885 0.11143964 0.13686671 0.16776886 0.20341457 0.24281992 0.28484195 0.32711894 0.36834301 0.40794043 0.4447145 0.47647207 0.50303896 0.52524762 0.54328057 0.55717994 0.5685619 0.57895708 0.58860881 0.59881758 0.60990899 0.62128986 0.63421311 0.64847648 0.66363778 0.67997936 0.69609688 0.71189957 0.7269499 0.74124079 0.75734734 0.77201504 0.78552587 0.79818641 0.80962939 0.81965718 0.82855741 0.83668178 0.84440292 0.85106862 0.85321701 0.85471321 0.8561428 0.85778963 0.8594989 0.86142876 0.86322831 0.86511218 0.8672932 0.86967076 0.87427502 0.87856212 0.88241466 0.88590611 0.8894516 0.89320419 0.8966738 0.89987484 0.90257636 0.90481219 0.90550545 0.90564491 0.90548208 0.90513822 0.90476379 0.90406427 0.90332978 0.90274309 0.90235795 0.90196488 0.90340528 0.90429478 0.90529761 0.90642862 0.90807348 0.91010493 0.91293181 0.91556686 0.91842631 0.92128288 0.92431702 0.92719913 0.92972159 0.93190455 0.93412538 0.93588954 0.93707083 0.93762594 0.93828534 0.93763643 0.94042634 0.94250397 0.94324531 0.94301861 0.94210283 0.94061808 0.93841726 0.93665003 0.93524569 0.93301102 0.92686708 0.92104485 0.91547175 0.91100989 0.90828339 0.9072733 0.90817907 0.91115631 0.91617845 0.92284525 0.92059829 0.91947472 0.91947973 0.92126575 0.92451632 0.92772589 0.93196884 0.93676408 0.94147739 0.94679545 0.95119533 0.95443018 0.95704142 0.95972628 0.9625372 0.96485326 0.96603599 0.96664138 0.96630455 0.96545713 0.96484036 0.96365512 0.96169531 0.95944859 0.95732078 0.95513625 0.95355574 0.95273072 0.95217795 0.95172542 0.9521403 0.95263595 0.95405248 0.95707559 0.96063594 0.96421772 0.96830187 0.97268597 0.97741944 0.98289489 0.9871429 0.99073348 0.99398244 0.99678431 0.99875181 1 0.9999284 0.9991523 0.99712951 0.99388228 0.98968273 0.98373274 0.97621057 0.96780985 0.95833495 0.94842856 0.93818752 0.9277078 0.91702104 0.90597951 0.89384371 0.88165575 0.86861704 0.85460324 0.84058628 0.82598123 0.80948042 0.79182917 0.7724052 0.74907137 0.72031195 0.68815487 0.65125598 0.6100244 0.56600904 0.52095058 0.47464344 0.42924778 0.38584718 0.34208462 0.30067509 0.26317221 0.22770037 0.19571781 0.16808736 0.14467686 0.12482737 0.10823403 0.09439655 0.08235799 0.07149445 0.0626855 0.05498009 0.04818852 0.04285814 0.03859244 0.03494044 0.03199172 0.02958044 0.02741084 0.02556884 0.02395058 0.02166741 0.0191457 0.01632139 0.0109837 0.00736032 0.00649061 0.00469736 0.00205874 287 | 288 | 289 | 290 | 291 | 4.06350423 292 | 3.80272099 293 | 4.19419032 294 | 4.52153681 295 | 5.21064379 296 | 4.87648891 297 | 4.5417877 298 | 6.20706988 299 | 5.1425727 300 | 8.54635329 301 | 54.92017221 302 | 35.14920093 303 | 106.11097854 304 | 0 305 | 306 | 307 | 308 | 309 | 310 | 311 | 312 | 37.064327886131274 -122.89021164281505 37.1093977351388 -123.16017547372144 37.11090961928888 -123.15973470746324 37.1113682347847 -123.16279284552608 37.11146321255431 -123.16276529012988 37.11148080386271 -123.16288277498096 37.11197187339491 -123.16273945336445 37.150526256741486 -123.42102598841075 37.14938013965063 -123.42135721414769 37.193083542367255 -123.71493739591047 37.308448253137655 -123.68220942935916 37.45584866916195 -123.64005738115064 37.6032673529438 -123.59798491501584 37.75070904688775 -123.55572337260764 37.89811038572427 -123.5131291711159 37.94487083914931 -123.49956441582113 37.94753713280259 -122.88891399416782 37.064327886131274 -122.89021164281505 37.064327886131274 -122.89021164281505 313 | 314 | 315 | 316 | POINT 317 | 1 318 | 319 | 320 | EPSG 321 | GEOGRAPHIC 322 | 323 | 324 | 325 | 326 | 327 | S2A_OPER_GIP_ATMIMA_MPC__20150605T094744_V20150622T000000_21000101T000000_B00 328 | 329 | 330 | S2A_OPER_GIP_ATMSAD_MPC__20160729T000005_V20150703T000000_21000101T000000_B00 331 | 332 | 333 | S2A_OPER_GIP_LREXTR_MPC__20150605T094736_V20150622T000000_21000101T000000_B00 334 | 335 | 336 | S2A_OPER_GIP_INVLOC_MPC__20150731T092205_V20150703T000000_21000101T000000_B00 337 | 338 | 339 | S2A_OPER_GIP_BLINDP_MPC__20150605T094736_V20150622T000000_21000101T000000_B00 340 | 341 | 342 | S2A_OPER_GIP_CLOINV_MPC__20151021T225159_V20150701T225159_21000101T000000_B00 343 | 344 | 345 | S2A_OPER_GIP_CONVER_MPC__20150710T131444_V20150627T000000_21000101T000000_B00 346 | 347 | 348 | S2A_OPER_GIP_DATATI_MPC__20151117T131048_V20150703T000000_21000101T000000_B00 349 | 350 | 351 | S2A_OPER_GIP_DECOMP_MPC__20121031T075922_V19830101T000000_21000101T000000_B00 352 | 353 | 354 | S2__OPER_GIP_EARMOD_MPC__20150605T094736_V20150622T000000_21000101T000000_B00 355 | 356 | 357 | S2A_OPER_GIP_ECMWFP_MPC__20121031T075922_V19830101T000000_21000101T000000_B00 358 | 359 | 360 | S2A_OPER_GIP_G2PARA_MPC__20150605T094736_V20150622T000000_21000101T000000_B00 361 | 362 | 363 | S2A_OPER_GIP_G2PARE_MPC__20150605T094736_V20150622T000000_21000101T000000_B00 364 | 365 | 366 | S2A_OPER_GIP_GEOPAR_MPC__20150605T094741_V20150622T000000_21000101T000000_B00 367 | 368 | 369 | S2A_OPER_GIP_INTDET_MPC__20150731T092205_V20150703T000000_21000101T000000_B00 370 | 371 | 372 | S2A_OPER_GIP_JP2KPA_MPC__20160222T110000_V20150622T000000_21000101T000000_B00 373 | 374 | 375 | S2A_OPER_GIP_MASPAR_MPC__20161104T000000_V20161121T235900_21000101T000000_B00 376 | 377 | 378 | S2A_OPER_GIP_OLQCPA_MPC__20161118T000009_V20161121T235900_21000101T000000_B00 379 | 380 | 381 | S2A_OPER_GIP_PRDLOC_MPC__20151125T152205_V20150703T000000_21000101T000000_B00 382 | 383 | 384 | S2A_OPER_GIP_PROBAS_MPC__20160930T000204_V20161003T015000_20200101T000000_B00 385 | 386 | 387 | S2A_OPER_GIP_R2ABCA_MPC__20161110T114140_V20161107T054810_99999999T999999_B00 388 | 389 | 390 | S2A_OPER_GIP_R2BINN_MPC__20150605T094803_V20150622T000000_21000101T000000_B00 391 | 392 | 393 | S2A_OPER_GIP_R2CRCO_MPC__20151023T224715_V20150622T224715_21000101T000000_B00 394 | 395 | 396 | S2A_OPER_GIP_R2DECT_MPC__20150605T094741_V20150622T000000_21000101T000000_B01 397 | 398 | 399 | S2A_OPER_GIP_R2DECT_MPC__20150605T094741_V20150622T000000_21000101T000000_B02 400 | 401 | 402 | S2A_OPER_GIP_R2DECT_MPC__20150605T094741_V20150622T000000_21000101T000000_B03 403 | 404 | 405 | S2A_OPER_GIP_R2DECT_MPC__20150605T094741_V20150622T000000_21000101T000000_B04 406 | 407 | 408 | S2A_OPER_GIP_R2DECT_MPC__20150605T094741_V20150622T000000_21000101T000000_B05 409 | 410 | 411 | S2A_OPER_GIP_R2DECT_MPC__20150605T094741_V20150622T000000_21000101T000000_B06 412 | 413 | 414 | S2A_OPER_GIP_R2DECT_MPC__20150605T094741_V20150622T000000_21000101T000000_B07 415 | 416 | 417 | S2A_OPER_GIP_R2DECT_MPC__20150605T094741_V20150622T000000_21000101T000000_B08 418 | 419 | 420 | S2A_OPER_GIP_R2DECT_MPC__20150605T094741_V20150622T000000_21000101T000000_B8A 421 | 422 | 423 | S2A_OPER_GIP_R2DECT_MPC__20150605T094742_V20150622T000000_21000101T000000_B09 424 | 425 | 426 | S2A_OPER_GIP_R2DECT_MPC__20150605T094742_V20150622T000000_21000101T000000_B10 427 | 428 | 429 | S2A_OPER_GIP_R2DECT_MPC__20150605T094742_V20150622T000000_21000101T000000_B11 430 | 431 | 432 | S2A_OPER_GIP_R2DECT_MPC__20150605T094742_V20150622T000000_21000101T000000_B12 433 | 434 | 435 | S2A_OPER_GIP_R2DEFI_MPC__20150605T094742_V20150622T000000_21000101T000000_B01 436 | 437 | 438 | S2A_OPER_GIP_R2DEFI_MPC__20150605T094741_V20150622T000000_21000101T000000_B02 439 | 440 | 441 | S2A_OPER_GIP_R2DEFI_MPC__20150605T094741_V20150622T000000_21000101T000000_B03 442 | 443 | 444 | S2A_OPER_GIP_R2DEFI_MPC__20150605T094741_V20150622T000000_21000101T000000_B04 445 | 446 | 447 | S2A_OPER_GIP_R2DEFI_MPC__20150605T094741_V20150622T000000_21000101T000000_B05 448 | 449 | 450 | S2A_OPER_GIP_R2DEFI_MPC__20150605T094741_V20150622T000000_21000101T000000_B06 451 | 452 | 453 | S2A_OPER_GIP_R2DEFI_MPC__20150605T094741_V20150622T000000_21000101T000000_B07 454 | 455 | 456 | S2A_OPER_GIP_R2DEFI_MPC__20150605T094741_V20150622T000000_21000101T000000_B08 457 | 458 | 459 | S2A_OPER_GIP_R2DEFI_MPC__20150605T094741_V20150622T000000_21000101T000000_B8A 460 | 461 | 462 | S2A_OPER_GIP_R2DEFI_MPC__20150605T094741_V20150622T000000_21000101T000000_B09 463 | 464 | 465 | S2A_OPER_GIP_R2DEFI_MPC__20150605T094741_V20150622T000000_21000101T000000_B10 466 | 467 | 468 | S2A_OPER_GIP_R2DEFI_MPC__20150605T094741_V20150622T000000_21000101T000000_B11 469 | 470 | 471 | S2A_OPER_GIP_R2DEFI_MPC__20150605T094741_V20150622T000000_21000101T000000_B12 472 | 473 | 474 | S2A_OPER_GIP_R2DENT_MPC__20150605T094741_V20150622T000000_21000101T000000_B01 475 | 476 | 477 | S2A_OPER_GIP_R2DENT_MPC__20150605T094742_V20150622T000000_21000101T000000_B02 478 | 479 | 480 | S2A_OPER_GIP_R2DENT_MPC__20150605T094742_V20150622T000000_21000101T000000_B03 481 | 482 | 483 | S2A_OPER_GIP_R2DENT_MPC__20150605T094742_V20150622T000000_21000101T000000_B04 484 | 485 | 486 | S2A_OPER_GIP_R2DENT_MPC__20150605T094742_V20150622T000000_21000101T000000_B05 487 | 488 | 489 | S2A_OPER_GIP_R2DENT_MPC__20150605T094742_V20150622T000000_21000101T000000_B06 490 | 491 | 492 | S2A_OPER_GIP_R2DENT_MPC__20150605T094742_V20150622T000000_21000101T000000_B07 493 | 494 | 495 | S2A_OPER_GIP_R2DENT_MPC__20150605T094742_V20150622T000000_21000101T000000_B08 496 | 497 | 498 | S2A_OPER_GIP_R2DENT_MPC__20150605T094742_V20150622T000000_21000101T000000_B8A 499 | 500 | 501 | S2A_OPER_GIP_R2DENT_MPC__20150605T094742_V20150622T000000_21000101T000000_B09 502 | 503 | 504 | S2A_OPER_GIP_R2DENT_MPC__20150605T094742_V20150622T000000_21000101T000000_B10 505 | 506 | 507 | S2A_OPER_GIP_R2DENT_MPC__20150605T094742_V20150622T000000_21000101T000000_B11 508 | 509 | 510 | S2A_OPER_GIP_R2DENT_MPC__20150605T094742_V20150622T000000_21000101T000000_B12 511 | 512 | 513 | S2A_OPER_GIP_R2DEPI_MPC__20160310T155952_V20160223T220345_21000101T000000_B00 514 | 515 | 516 | S2A_OPER_GIP_R2EOB2_MPC__20150827T165847_V20150819T000000_99999999T999999_B01 517 | 518 | 519 | S2A_OPER_GIP_R2EOB2_MPC__20150827T165847_V20150819T000000_99999999T999999_B02 520 | 521 | 522 | S2A_OPER_GIP_R2EOB2_MPC__20150827T165847_V20150819T000000_99999999T999999_B03 523 | 524 | 525 | S2A_OPER_GIP_R2EOB2_MPC__20150827T165847_V20150819T000000_99999999T999999_B04 526 | 527 | 528 | S2A_OPER_GIP_R2EOB2_MPC__20150827T165847_V20150819T000000_99999999T999999_B05 529 | 530 | 531 | S2A_OPER_GIP_R2EOB2_MPC__20150827T165847_V20150819T000000_99999999T999999_B06 532 | 533 | 534 | S2A_OPER_GIP_R2EOB2_MPC__20150827T165847_V20150819T000000_99999999T999999_B07 535 | 536 | 537 | S2A_OPER_GIP_R2EOB2_MPC__20150827T165847_V20150819T000000_99999999T999999_B08 538 | 539 | 540 | S2A_OPER_GIP_R2EOB2_MPC__20150827T165847_V20150819T000000_99999999T999999_B8A 541 | 542 | 543 | S2A_OPER_GIP_R2EOB2_MPC__20150827T165847_V20150819T000000_99999999T999999_B09 544 | 545 | 546 | S2A_OPER_GIP_R2EOB2_MPC__20150827T165847_V20150819T000000_99999999T999999_B10 547 | 548 | 549 | S2A_OPER_GIP_R2EOB2_MPC__20150827T165847_V20150819T000000_99999999T999999_B11 550 | 551 | 552 | S2A_OPER_GIP_R2EOB2_MPC__20150827T165847_V20150819T000000_99999999T999999_B12 553 | 554 | 555 | S2A_OPER_GIP_R2EQOG_MPC__20161110T114140_V20161107T054810_99999999T999999_B01 556 | 557 | 558 | S2A_OPER_GIP_R2EQOG_MPC__20161110T114140_V20161107T054810_99999999T999999_B02 559 | 560 | 561 | S2A_OPER_GIP_R2EQOG_MPC__20161110T114140_V20161107T054810_99999999T999999_B03 562 | 563 | 564 | S2A_OPER_GIP_R2EQOG_MPC__20161110T114140_V20161107T054810_99999999T999999_B04 565 | 566 | 567 | S2A_OPER_GIP_R2EQOG_MPC__20161110T114140_V20161107T054810_99999999T999999_B05 568 | 569 | 570 | S2A_OPER_GIP_R2EQOG_MPC__20161110T114140_V20161107T054810_99999999T999999_B06 571 | 572 | 573 | S2A_OPER_GIP_R2EQOG_MPC__20161110T114140_V20161107T054810_99999999T999999_B07 574 | 575 | 576 | S2A_OPER_GIP_R2EQOG_MPC__20161110T114140_V20161107T054810_99999999T999999_B08 577 | 578 | 579 | S2A_OPER_GIP_R2EQOG_MPC__20161110T114140_V20161107T054810_99999999T999999_B8A 580 | 581 | 582 | S2A_OPER_GIP_R2EQOG_MPC__20161110T114140_V20161107T054810_99999999T999999_B09 583 | 584 | 585 | S2A_OPER_GIP_R2EQOG_MPC__20161110T114140_V20161107T054810_99999999T999999_B10 586 | 587 | 588 | S2A_OPER_GIP_R2EQOG_MPC__20161110T114140_V20161107T054810_99999999T999999_B11 589 | 590 | 591 | S2A_OPER_GIP_R2EQOG_MPC__20161110T114140_V20161107T054810_99999999T999999_B12 592 | 593 | 594 | S2A_OPER_GIP_R2L2NC_MPC__20150605T094742_V20150622T000000_21000101T000000_B01 595 | 596 | 597 | S2A_OPER_GIP_R2L2NC_MPC__20150605T094742_V20150622T000000_21000101T000000_B02 598 | 599 | 600 | S2A_OPER_GIP_R2L2NC_MPC__20150605T094741_V20150622T000000_21000101T000000_B03 601 | 602 | 603 | S2A_OPER_GIP_R2L2NC_MPC__20150605T094742_V20150622T000000_21000101T000000_B04 604 | 605 | 606 | S2A_OPER_GIP_R2L2NC_MPC__20150605T094742_V20150622T000000_21000101T000000_B05 607 | 608 | 609 | S2A_OPER_GIP_R2L2NC_MPC__20150605T094742_V20150622T000000_21000101T000000_B06 610 | 611 | 612 | S2A_OPER_GIP_R2L2NC_MPC__20150605T094742_V20150622T000000_21000101T000000_B07 613 | 614 | 615 | S2A_OPER_GIP_R2L2NC_MPC__20150605T094742_V20150622T000000_21000101T000000_B08 616 | 617 | 618 | S2A_OPER_GIP_R2L2NC_MPC__20150605T094742_V20150622T000000_21000101T000000_B8A 619 | 620 | 621 | S2A_OPER_GIP_R2L2NC_MPC__20150605T094742_V20150622T000000_21000101T000000_B09 622 | 623 | 624 | S2A_OPER_GIP_R2L2NC_MPC__20150605T094742_V20150622T000000_21000101T000000_B10 625 | 626 | 627 | S2A_OPER_GIP_R2L2NC_MPC__20150605T094742_V20150622T000000_21000101T000000_B11 628 | 629 | 630 | S2A_OPER_GIP_R2L2NC_MPC__20150605T094742_V20150622T000000_21000101T000000_B12 631 | 632 | 633 | S2A_OPER_GIP_R2NOMO_MPC__20150605T094803_V20150622T000000_21000101T000000_B00 634 | 635 | 636 | S2A_OPER_GIP_R2PARA_MPC__20151023T224307_V20150622T224307_21000101T000000_B00 637 | 638 | 639 | S2A_OPER_GIP_R2SWIR_MPC__20160304T100014_V20160223T230345_21000101T000000_B00 640 | 641 | 642 | S2A_OPER_GIP_R2WAFI_MPC__20150605T094742_V20150622T000000_21000101T000000_B01 643 | 644 | 645 | S2A_OPER_GIP_R2WAFI_MPC__20150605T094742_V20150622T000000_21000101T000000_B02 646 | 647 | 648 | S2A_OPER_GIP_R2WAFI_MPC__20150605T094742_V20150622T000000_21000101T000000_B03 649 | 650 | 651 | S2A_OPER_GIP_R2WAFI_MPC__20150605T094742_V20150622T000000_21000101T000000_B04 652 | 653 | 654 | S2A_OPER_GIP_R2WAFI_MPC__20150605T094742_V20150622T000000_21000101T000000_B05 655 | 656 | 657 | S2A_OPER_GIP_R2WAFI_MPC__20150605T094742_V20150622T000000_21000101T000000_B06 658 | 659 | 660 | S2A_OPER_GIP_R2WAFI_MPC__20150605T094742_V20150622T000000_21000101T000000_B07 661 | 662 | 663 | S2A_OPER_GIP_R2WAFI_MPC__20150605T094742_V20150622T000000_21000101T000000_B08 664 | 665 | 666 | S2A_OPER_GIP_R2WAFI_MPC__20150605T094742_V20150622T000000_21000101T000000_B8A 667 | 668 | 669 | S2A_OPER_GIP_R2WAFI_MPC__20150605T094742_V20150622T000000_21000101T000000_B09 670 | 671 | 672 | S2A_OPER_GIP_R2WAFI_MPC__20150605T094742_V20150622T000000_21000101T000000_B10 673 | 674 | 675 | S2A_OPER_GIP_R2WAFI_MPC__20150605T094742_V20150622T000000_21000101T000000_B11 676 | 677 | 678 | S2A_OPER_GIP_R2WAFI_MPC__20150605T094742_V20150622T000000_21000101T000000_B12 679 | 680 | 681 | S2A_OPER_GIP_RESPAR_MPC__20150605T094736_V20150622T000000_21000101T000000_B00 682 | 683 | 684 | S2A_OPER_GIP_SPAMOD_MPC__20161011T073954_V20161017T000000_21000101T000000_B00 685 | 686 | 687 | S2A_OPER_GIP_TILPAR_MPC__20151209T095117_V20150622T000000_21000101T000000_B00 688 | 689 | 690 | S2A_OPER_GIP_VIEDIR_MPC__20151117T131048_V20150703T000000_21000101T000000_B01 691 | 692 | 693 | S2A_OPER_GIP_VIEDIR_MPC__20151117T131049_V20150703T000000_21000101T000000_B02 694 | 695 | 696 | S2A_OPER_GIP_VIEDIR_MPC__20151117T131049_V20150703T000000_21000101T000000_B03 697 | 698 | 699 | S2A_OPER_GIP_VIEDIR_MPC__20151117T131049_V20150703T000000_21000101T000000_B04 700 | 701 | 702 | S2A_OPER_GIP_VIEDIR_MPC__20151117T131050_V20150703T000000_21000101T000000_B05 703 | 704 | 705 | S2A_OPER_GIP_VIEDIR_MPC__20151117T131050_V20150703T000000_21000101T000000_B06 706 | 707 | 708 | S2A_OPER_GIP_VIEDIR_MPC__20151117T131050_V20150703T000000_21000101T000000_B07 709 | 710 | 711 | S2A_OPER_GIP_VIEDIR_MPC__20151117T131050_V20150703T000000_21000101T000000_B08 712 | 713 | 714 | S2A_OPER_GIP_VIEDIR_MPC__20151117T131050_V20150703T000000_21000101T000000_B8A 715 | 716 | 717 | S2A_OPER_GIP_VIEDIR_MPC__20151117T131050_V20150703T000000_21000101T000000_B09 718 | 719 | 720 | S2A_OPER_GIP_VIEDIR_MPC__20151117T131050_V20150703T000000_21000101T000000_B10 721 | 722 | 723 | S2A_OPER_GIP_VIEDIR_MPC__20151117T131050_V20150703T000000_21000101T000000_B11 724 | 725 | 726 | S2A_OPER_GIP_VIEDIR_MPC__20151117T131051_V20150703T000000_21000101T000000_B12 727 | 728 | 729 | 730 | S2__OPER_DEM_GLOBEF_PDMC_19800101T000000_S19800101T000000 731 | 732 | 733 | S2__OPER_AUX_UT1UTC_PDMC_20161208T000000_V20161209T000000_20171208T000000 734 | 735 | 736 | S2A_OPER_AUX_GRI065_PDMC_20130621T120000_S20130101T000000 737 | 738 | 739 | S2__OPER_AUX_ECMWFD_PDMC_20161211T000000_V20161211T180000_20161212T060000 740 | 741 | 742 | 743 | 92.5404 744 | 745 | 0 746 | 0 747 | 748 | 749 | 750 | PASSED 751 | PASSED 752 | PASSED 753 | PASSED 754 | PASSED 755 | 756 | 757 | 758 | 759 | 760 | -------------------------------------------------------------------------------- /tests/samples/metadata.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 2016-03-16T02:06:40.455Z 5 | 2016-03-16T02:06:40.455Z 6 | 393_2016-03-16T06_40 7 | Level-1C 8 | S2MSI1C 9 | 02.01 10 | 2016-03-16T06:44:16.000853Z 11 | https://pdmcdam2.sentinel2.eo.esa.int/s2pdgs_geoserver/geo_service.php?service=WMS&version=1.1.0&request=GetMap&layers=S2A_A003818_N0201:S2A_A003818_N0201&styles=&bbox=143.6457116281654,70.1327293123605,159.40173910976236,72.99569891051942&width=5846&height=1062&srs=EPSG:4326&format=image/png 12 | BrowseImageFootprint 13 | 14 | Sentinel-2A 15 | INS-NOBS 16 | 2016-03-16T02:06:42.031Z 17 | 103 18 | DESCENDING 19 | 20 | 21 | 22 | 23 | 70.657 -180.0000 24 | 72.457 180.0000 25 | 26 | 27 | false 28 | true 29 | 30 | B1 31 | B2 32 | B3 33 | B4 34 | B5 35 | B6 36 | B7 37 | B8 38 | B9 39 | B10 40 | B11 41 | B12 42 | B8A 43 | 44 | Expertise 45 | 46 | 47 | NO 48 | 49 | 50 | NO 51 | 52 | 53 | SAFE 54 | false 55 | 56 | 57 | 58 | 59 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T54WXD_B08 60 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T54WXD_B8A 61 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T54WXD_B07 62 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T54WXD_B01 63 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T54WXD_B05 64 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T54WXD_B09 65 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T54WXD_B10 66 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T54WXD_B06 67 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T54WXD_B02 68 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T54WXD_B12 69 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T54WXD_B11 70 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T54WXD_B03 71 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T54WXD_B04 72 | 73 | 74 | 75 | 76 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T55WDU_B08 77 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T55WDU_B06 78 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T55WDU_B09 79 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T55WDU_B02 80 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T55WDU_B05 81 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T55WDU_B11 82 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T55WDU_B10 83 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T55WDU_B12 84 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T55WDU_B01 85 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T55WDU_B8A 86 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T55WDU_B04 87 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T55WDU_B03 88 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T55WDU_B07 89 | 90 | 91 | 92 | 93 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T55WEU_B08 94 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T55WEU_B01 95 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T55WEU_B03 96 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T55WEU_B11 97 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T55WEU_B05 98 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T55WEU_B10 99 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T55WEU_B12 100 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T55WEU_B09 101 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T55WEU_B8A 102 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T55WEU_B02 103 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T55WEU_B04 104 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T55WEU_B07 105 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T55WEU_B06 106 | 107 | 108 | 109 | 110 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T55WEV_B04 111 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T55WEV_B01 112 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T55WEV_B07 113 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T55WEV_B03 114 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T55WEV_B08 115 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T55WEV_B06 116 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T55WEV_B09 117 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T55WEV_B11 118 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T55WEV_B10 119 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T55WEV_B05 120 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T55WEV_B8A 121 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T55WEV_B02 122 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T55WEV_B12 123 | 124 | 125 | 126 | 127 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T55WFU_B06 128 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T55WFU_B01 129 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T55WFU_B07 130 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T55WFU_B8A 131 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T55WFU_B05 132 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T55WFU_B12 133 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T55WFU_B04 134 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T55WFU_B11 135 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T55WFU_B03 136 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T55WFU_B08 137 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T55WFU_B02 138 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T55WFU_B10 139 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T55WFU_B09 140 | 141 | 142 | 143 | 144 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T55WFV_B08 145 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T55WFV_B06 146 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T55WFV_B11 147 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T55WFV_B8A 148 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T55WFV_B10 149 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T55WFV_B03 150 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T55WFV_B02 151 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T55WFV_B12 152 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T55WFV_B01 153 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T55WFV_B05 154 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T55WFV_B07 155 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T55WFV_B04 156 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T55WFV_B09 157 | 158 | 159 | 160 | 161 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T55XEA_B8A 162 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T55XEA_B09 163 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T55XEA_B10 164 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T55XEA_B08 165 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T55XEA_B05 166 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T55XEA_B12 167 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T55XEA_B03 168 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T55XEA_B02 169 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T55XEA_B06 170 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T55XEA_B11 171 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T55XEA_B07 172 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T55XEA_B01 173 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T55XEA_B04 174 | 175 | 176 | 177 | 178 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T55XFA_B08 179 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T55XFA_B03 180 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T55XFA_B10 181 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T55XFA_B01 182 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T55XFA_B8A 183 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T55XFA_B12 184 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T55XFA_B06 185 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T55XFA_B09 186 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T55XFA_B11 187 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T55XFA_B02 188 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T55XFA_B04 189 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T55XFA_B07 190 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T55XFA_B05 191 | 192 | 193 | 194 | 195 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56WMD_B02 196 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56WMD_B06 197 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56WMD_B04 198 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56WMD_B03 199 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56WMD_B05 200 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56WMD_B10 201 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56WMD_B08 202 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56WMD_B8A 203 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56WMD_B11 204 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56WMD_B12 205 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56WMD_B01 206 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56WMD_B07 207 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56WMD_B09 208 | 209 | 210 | 211 | 212 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56WME_B06 213 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56WME_B07 214 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56WME_B03 215 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56WME_B02 216 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56WME_B08 217 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56WME_B8A 218 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56WME_B12 219 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56WME_B05 220 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56WME_B10 221 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56WME_B09 222 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56WME_B11 223 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56WME_B01 224 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56WME_B04 225 | 226 | 227 | 228 | 229 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56WND_B05 230 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56WND_B11 231 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56WND_B12 232 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56WND_B8A 233 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56WND_B01 234 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56WND_B10 235 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56WND_B02 236 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56WND_B03 237 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56WND_B06 238 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56WND_B04 239 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56WND_B09 240 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56WND_B07 241 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56WND_B08 242 | 243 | 244 | 245 | 246 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56WNE_B12 247 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56WNE_B09 248 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56WNE_B04 249 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56WNE_B01 250 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56WNE_B10 251 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56WNE_B07 252 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56WNE_B06 253 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56WNE_B08 254 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56WNE_B8A 255 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56WNE_B05 256 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56WNE_B02 257 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56WNE_B03 258 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56WNE_B11 259 | 260 | 261 | 262 | 263 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56WPD_B03 264 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56WPD_B02 265 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56WPD_B06 266 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56WPD_B08 267 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56WPD_B01 268 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56WPD_B09 269 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56WPD_B12 270 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56WPD_B05 271 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56WPD_B8A 272 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56WPD_B04 273 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56WPD_B07 274 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56WPD_B11 275 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56WPD_B10 276 | 277 | 278 | 279 | 280 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56WPE_B12 281 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56WPE_B02 282 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56WPE_B09 283 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56WPE_B07 284 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56WPE_B06 285 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56WPE_B10 286 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56WPE_B08 287 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56WPE_B11 288 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56WPE_B03 289 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56WPE_B01 290 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56WPE_B8A 291 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56WPE_B04 292 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56WPE_B05 293 | 294 | 295 | 296 | 297 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56XMF_B08 298 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56XMF_B05 299 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56XMF_B01 300 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56XMF_B8A 301 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56XMF_B03 302 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56XMF_B04 303 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56XMF_B09 304 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56XMF_B06 305 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56XMF_B12 306 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56XMF_B11 307 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56XMF_B10 308 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56XMF_B02 309 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56XMF_B07 310 | 311 | 312 | 313 | 314 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56XNF_B07 315 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56XNF_B08 316 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56XNF_B05 317 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56XNF_B10 318 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56XNF_B12 319 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56XNF_B06 320 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56XNF_B8A 321 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56XNF_B11 322 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56XNF_B09 323 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56XNF_B04 324 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56XNF_B02 325 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56XNF_B01 326 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56XNF_B03 327 | 328 | 329 | 330 | 331 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56XPF_B05 332 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56XPF_B11 333 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56XPF_B8A 334 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56XPF_B10 335 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56XPF_B06 336 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56XPF_B03 337 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56XPF_B04 338 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56XPF_B02 339 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56XPF_B09 340 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56XPF_B12 341 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56XPF_B07 342 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56XPF_B01 343 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56XPF_B08 344 | 345 | 346 | 347 | 348 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T57WVU_B03 349 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T57WVU_B04 350 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T57WVU_B11 351 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T57WVU_B10 352 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T57WVU_B06 353 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T57WVU_B07 354 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T57WVU_B01 355 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T57WVU_B05 356 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T57WVU_B12 357 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T57WVU_B8A 358 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T57WVU_B08 359 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T57WVU_B09 360 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T57WVU_B02 361 | 362 | 363 | 364 | 365 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T57WVV_B10 366 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T57WVV_B01 367 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T57WVV_B8A 368 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T57WVV_B05 369 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T57WVV_B08 370 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T57WVV_B04 371 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T57WVV_B02 372 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T57WVV_B11 373 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T57WVV_B09 374 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T57WVV_B12 375 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T57WVV_B03 376 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T57WVV_B06 377 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T57WVV_B07 378 | 379 | 380 | 381 | 382 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T57XVA_B10 383 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T57XVA_B06 384 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T57XVA_B8A 385 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T57XVA_B04 386 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T57XVA_B09 387 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T57XVA_B01 388 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T57XVA_B11 389 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T57XVA_B08 390 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T57XVA_B02 391 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T57XVA_B12 392 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T57XVA_B05 393 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T57XVA_B07 394 | S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T57XVA_B03 395 | 396 | 397 | 398 | 399 | 400 | 401 | NODATA 402 | 0 403 | 404 | 405 | SATURATED 406 | 65535 407 | 408 | 409 | 3 410 | 2 411 | 1 412 | 413 | 10000 414 | 415 | 1.01282184463556 416 | 417 | 1913.57 418 | 1941.63 419 | 1822.61 420 | 1512.79 421 | 1425.56 422 | 1288.32 423 | 1163.19 424 | 1036.39 425 | 955.19 426 | 813.04 427 | 367.15 428 | 245.59 429 | 85.25 430 | 431 | 432 | 4.05905872991808 433 | 3.79832030050307 434 | 4.19072427967476 435 | 4.51719715484605 436 | 5.20468055577817 437 | 4.87420783504962 438 | 4.54014964560928 439 | 6.20139364736951 440 | 5.14186096818299 441 | 8.54591670370095 442 | 55.0614207479959 443 | 35.2832828551041 444 | 0 445 | 446 | 447 | 448 | 449 | 450 | 451 | 71.18225922301176 143.77857511249624 70.19883742790859 143.6457116281654 70.1327293123605 146.53810921603315 70.2134983315834 146.56091911035293 70.21727437976578 147.1289253485503 70.19588812047054 149.77475130277935 70.1327293123605 152.53810921603312 70.21349833158341 152.5609191103529 70.21727437976578 153.1289253485502 70.19588812047054 155.77475130277938 70.1327293123605 158.53810921603315 70.2134983315834 158.56091911035293 70.21813506743955 159.25839296766586 71.15661835405452 159.27078116639032 72.05295893876409 159.28382080055226 72.57712735057714 159.29226323872626 72.89515510727976 159.40173910976236 72.89757934280551 159.29742454961635 72.99548059987063 159.29900138120578 72.97277968087197 155.93800268329463 72.97156365631429 155.93820317511245 72.99323860301097 153.29896527082704 72.99548059987063 153.29900138120578 72.99446869731338 153.14918351799386 72.99569891051942 152.99938728692726 72.99345694136416 152.99938736092395 72.97277968087197 149.93800268329463 72.97156365631429 149.93820317511245 72.99569891051942 146.99938728692726 72.05316503500357 146.99941839546815 71.20082777660429 146.99944380454758 71.1822427633901 144.22031510980838 71.17206891417852 144.22169017855745 71.18225922301176 143.77857511249624 452 | 453 | 454 | POINT 455 | 1 456 | 457 | 458 | EPSG 459 | GEOGRAPHIC 460 | 461 | 462 | 463 | 464 | S2A_OPER_GIP_BLINDP_MPC__20150605T094736_V20150622T000000_21000101T000000_B00 465 | S2A_OPER_GIP_CLOINV_MPC__20151021T225159_V20150701T225159_21000101T000000_B00 466 | S2A_OPER_GIP_DATATI_MPC__20151117T131048_V20150703T000000_21000101T000000_B00 467 | S2A_OPER_GIP_DECOMP_MPC__20121031T075922_V19830101T000000_21000101T000000_B00 468 | S2__OPER_GIP_EARMOD_MPC__20150605T094736_V20150622T000000_21000101T000000_B00 469 | S2A_OPER_GIP_ECMWFP_MPC__20121031T075922_V19830101T000000_21000101T000000_B00 470 | S2A_OPER_GIP_G2PARA_MPC__20150605T094736_V20150622T000000_21000101T000000_B00 471 | S2A_OPER_GIP_G2PARE_MPC__20150605T094736_V20150622T000000_21000101T000000_B00 472 | S2A_OPER_GIP_GEOPAR_MPC__20150605T094741_V20150622T000000_21000101T000000_B00 473 | S2A_OPER_GIP_INTDET_MPC__20150731T092205_V20150703T000000_21000101T000000_B00 474 | S2A_OPER_GIP_JP2KPA_MPC__20160222T110000_V20150622T000000_21000101T000000_B00 475 | S2A_OPER_GIP_MASPAR_MPC__20160203T150846_V20150622T000000_21000101T000000_B00 476 | S2A_OPER_GIP_OLQCPA_MPC__20151127T150000_V20000506T000000_21000101T000000_B00 477 | S2A_OPER_GIP_PRDLOC_MPC__20151125T152205_V20150703T000000_21000101T000000_B00 478 | S2__OPER_GIP_PROBAS_MPC__20160121T111510_V20151215T111510_20200101T000000_B00 479 | S2A_OPER_GIP_R2ABCA_MPC__20160310T155959_V20160229T000000_21000101T000000_B00 480 | S2A_OPER_GIP_R2BINN_MPC__20150605T094803_V20150622T000000_21000101T000000_B00 481 | S2A_OPER_GIP_R2CRCO_MPC__20151023T224715_V20150622T224715_21000101T000000_B00 482 | S2A_OPER_GIP_R2DECT_MPC__20150605T094741_V20150622T000000_21000101T000000_B01 483 | S2A_OPER_GIP_R2DECT_MPC__20150605T094741_V20150622T000000_21000101T000000_B02 484 | S2A_OPER_GIP_R2DECT_MPC__20150605T094741_V20150622T000000_21000101T000000_B03 485 | S2A_OPER_GIP_R2DECT_MPC__20150605T094741_V20150622T000000_21000101T000000_B04 486 | S2A_OPER_GIP_R2DECT_MPC__20150605T094741_V20150622T000000_21000101T000000_B05 487 | S2A_OPER_GIP_R2DECT_MPC__20150605T094741_V20150622T000000_21000101T000000_B06 488 | S2A_OPER_GIP_R2DECT_MPC__20150605T094741_V20150622T000000_21000101T000000_B07 489 | S2A_OPER_GIP_R2DECT_MPC__20150605T094741_V20150622T000000_21000101T000000_B08 490 | S2A_OPER_GIP_R2DECT_MPC__20150605T094741_V20150622T000000_21000101T000000_B8A 491 | S2A_OPER_GIP_R2DECT_MPC__20150605T094742_V20150622T000000_21000101T000000_B09 492 | S2A_OPER_GIP_R2DECT_MPC__20150605T094742_V20150622T000000_21000101T000000_B10 493 | S2A_OPER_GIP_R2DECT_MPC__20150605T094742_V20150622T000000_21000101T000000_B11 494 | S2A_OPER_GIP_R2DECT_MPC__20150605T094742_V20150622T000000_21000101T000000_B12 495 | S2A_OPER_GIP_R2DEFI_MPC__20150605T094742_V20150622T000000_21000101T000000_B01 496 | S2A_OPER_GIP_R2DEFI_MPC__20150605T094741_V20150622T000000_21000101T000000_B02 497 | S2A_OPER_GIP_R2DEFI_MPC__20150605T094741_V20150622T000000_21000101T000000_B03 498 | S2A_OPER_GIP_R2DEFI_MPC__20150605T094741_V20150622T000000_21000101T000000_B04 499 | S2A_OPER_GIP_R2DEFI_MPC__20150605T094741_V20150622T000000_21000101T000000_B05 500 | S2A_OPER_GIP_R2DEFI_MPC__20150605T094741_V20150622T000000_21000101T000000_B06 501 | S2A_OPER_GIP_R2DEFI_MPC__20150605T094741_V20150622T000000_21000101T000000_B07 502 | S2A_OPER_GIP_R2DEFI_MPC__20150605T094741_V20150622T000000_21000101T000000_B08 503 | S2A_OPER_GIP_R2DEFI_MPC__20150605T094741_V20150622T000000_21000101T000000_B8A 504 | S2A_OPER_GIP_R2DEFI_MPC__20150605T094741_V20150622T000000_21000101T000000_B09 505 | S2A_OPER_GIP_R2DEFI_MPC__20150605T094741_V20150622T000000_21000101T000000_B10 506 | S2A_OPER_GIP_R2DEFI_MPC__20150605T094741_V20150622T000000_21000101T000000_B11 507 | S2A_OPER_GIP_R2DEFI_MPC__20150605T094741_V20150622T000000_21000101T000000_B12 508 | S2A_OPER_GIP_R2DENT_MPC__20150605T094741_V20150622T000000_21000101T000000_B01 509 | S2A_OPER_GIP_R2DENT_MPC__20150605T094742_V20150622T000000_21000101T000000_B02 510 | S2A_OPER_GIP_R2DENT_MPC__20150605T094742_V20150622T000000_21000101T000000_B03 511 | S2A_OPER_GIP_R2DENT_MPC__20150605T094742_V20150622T000000_21000101T000000_B04 512 | S2A_OPER_GIP_R2DENT_MPC__20150605T094742_V20150622T000000_21000101T000000_B05 513 | S2A_OPER_GIP_R2DENT_MPC__20150605T094742_V20150622T000000_21000101T000000_B06 514 | S2A_OPER_GIP_R2DENT_MPC__20150605T094742_V20150622T000000_21000101T000000_B07 515 | S2A_OPER_GIP_R2DENT_MPC__20150605T094742_V20150622T000000_21000101T000000_B08 516 | S2A_OPER_GIP_R2DENT_MPC__20150605T094742_V20150622T000000_21000101T000000_B8A 517 | S2A_OPER_GIP_R2DENT_MPC__20150605T094742_V20150622T000000_21000101T000000_B09 518 | S2A_OPER_GIP_R2DENT_MPC__20150605T094742_V20150622T000000_21000101T000000_B10 519 | S2A_OPER_GIP_R2DENT_MPC__20150605T094742_V20150622T000000_21000101T000000_B11 520 | S2A_OPER_GIP_R2DENT_MPC__20150605T094742_V20150622T000000_21000101T000000_B12 521 | S2A_OPER_GIP_R2DEPI_MPC__20160310T155952_V20160223T220345_21000101T000000_B00 522 | S2A_OPER_GIP_R2EOB2_MPC__20150827T165847_V20150819T000000_99999999T999999_B01 523 | S2A_OPER_GIP_R2EOB2_MPC__20150827T165847_V20150819T000000_99999999T999999_B02 524 | S2A_OPER_GIP_R2EOB2_MPC__20150827T165847_V20150819T000000_99999999T999999_B03 525 | S2A_OPER_GIP_R2EOB2_MPC__20150827T165847_V20150819T000000_99999999T999999_B04 526 | S2A_OPER_GIP_R2EOB2_MPC__20150827T165847_V20150819T000000_99999999T999999_B05 527 | S2A_OPER_GIP_R2EOB2_MPC__20150827T165847_V20150819T000000_99999999T999999_B06 528 | S2A_OPER_GIP_R2EOB2_MPC__20150827T165847_V20150819T000000_99999999T999999_B07 529 | S2A_OPER_GIP_R2EOB2_MPC__20150827T165847_V20150819T000000_99999999T999999_B08 530 | S2A_OPER_GIP_R2EOB2_MPC__20150827T165847_V20150819T000000_99999999T999999_B8A 531 | S2A_OPER_GIP_R2EOB2_MPC__20150827T165847_V20150819T000000_99999999T999999_B09 532 | S2A_OPER_GIP_R2EOB2_MPC__20150827T165847_V20150819T000000_99999999T999999_B10 533 | S2A_OPER_GIP_R2EOB2_MPC__20150827T165847_V20150819T000000_99999999T999999_B11 534 | S2A_OPER_GIP_R2EOB2_MPC__20150827T165847_V20150819T000000_99999999T999999_B12 535 | S2A_OPER_GIP_R2EQOG_MPC__20160310T155952_V20160229T000000_21000101T000000_B01 536 | S2A_OPER_GIP_R2EQOG_MPC__20160310T155952_V20160229T000000_21000101T000000_B02 537 | S2A_OPER_GIP_R2EQOG_MPC__20160310T155953_V20160229T000000_21000101T000000_B03 538 | S2A_OPER_GIP_R2EQOG_MPC__20160310T155954_V20160229T000000_21000101T000000_B04 539 | S2A_OPER_GIP_R2EQOG_MPC__20160310T155955_V20160229T000000_21000101T000000_B05 540 | S2A_OPER_GIP_R2EQOG_MPC__20160310T155955_V20160229T000000_21000101T000000_B06 541 | S2A_OPER_GIP_R2EQOG_MPC__20160310T155956_V20160229T000000_21000101T000000_B07 542 | S2A_OPER_GIP_R2EQOG_MPC__20160310T155956_V20160229T000000_21000101T000000_B08 543 | S2A_OPER_GIP_R2EQOG_MPC__20160310T155957_V20160229T000000_21000101T000000_B8A 544 | S2A_OPER_GIP_R2EQOG_MPC__20160310T155957_V20160229T000000_21000101T000000_B09 545 | S2A_OPER_GIP_R2EQOG_MPC__20160310T155958_V20160229T000000_21000101T000000_B10 546 | S2A_OPER_GIP_R2EQOG_MPC__20160310T155958_V20160229T000000_21000101T000000_B11 547 | S2A_OPER_GIP_R2EQOG_MPC__20160310T155958_V20160229T000000_21000101T000000_B12 548 | S2A_OPER_GIP_R2L2NC_MPC__20150605T094742_V20150622T000000_21000101T000000_B01 549 | S2A_OPER_GIP_R2L2NC_MPC__20150605T094742_V20150622T000000_21000101T000000_B02 550 | S2A_OPER_GIP_R2L2NC_MPC__20150605T094741_V20150622T000000_21000101T000000_B03 551 | S2A_OPER_GIP_R2L2NC_MPC__20150605T094742_V20150622T000000_21000101T000000_B04 552 | S2A_OPER_GIP_R2L2NC_MPC__20150605T094742_V20150622T000000_21000101T000000_B05 553 | S2A_OPER_GIP_R2L2NC_MPC__20150605T094742_V20150622T000000_21000101T000000_B06 554 | S2A_OPER_GIP_R2L2NC_MPC__20150605T094742_V20150622T000000_21000101T000000_B07 555 | S2A_OPER_GIP_R2L2NC_MPC__20150605T094742_V20150622T000000_21000101T000000_B08 556 | S2A_OPER_GIP_R2L2NC_MPC__20150605T094742_V20150622T000000_21000101T000000_B8A 557 | S2A_OPER_GIP_R2L2NC_MPC__20150605T094742_V20150622T000000_21000101T000000_B09 558 | S2A_OPER_GIP_R2L2NC_MPC__20150605T094742_V20150622T000000_21000101T000000_B10 559 | S2A_OPER_GIP_R2L2NC_MPC__20150605T094742_V20150622T000000_21000101T000000_B11 560 | S2A_OPER_GIP_R2L2NC_MPC__20150605T094742_V20150622T000000_21000101T000000_B12 561 | S2A_OPER_GIP_R2NOMO_MPC__20150605T094803_V20150622T000000_21000101T000000_B00 562 | S2A_OPER_GIP_R2PARA_MPC__20151023T224307_V20150622T224307_21000101T000000_B00 563 | S2A_OPER_GIP_R2SWIR_MPC__20160304T100014_V20160223T230345_21000101T000000_B00 564 | S2A_OPER_GIP_R2WAFI_MPC__20150605T094742_V20150622T000000_21000101T000000_B01 565 | S2A_OPER_GIP_R2WAFI_MPC__20150605T094742_V20150622T000000_21000101T000000_B02 566 | S2A_OPER_GIP_R2WAFI_MPC__20150605T094742_V20150622T000000_21000101T000000_B03 567 | S2A_OPER_GIP_R2WAFI_MPC__20150605T094742_V20150622T000000_21000101T000000_B04 568 | S2A_OPER_GIP_R2WAFI_MPC__20150605T094742_V20150622T000000_21000101T000000_B05 569 | S2A_OPER_GIP_R2WAFI_MPC__20150605T094742_V20150622T000000_21000101T000000_B06 570 | S2A_OPER_GIP_R2WAFI_MPC__20150605T094742_V20150622T000000_21000101T000000_B07 571 | S2A_OPER_GIP_R2WAFI_MPC__20150605T094742_V20150622T000000_21000101T000000_B08 572 | S2A_OPER_GIP_R2WAFI_MPC__20150605T094742_V20150622T000000_21000101T000000_B8A 573 | S2A_OPER_GIP_R2WAFI_MPC__20150605T094742_V20150622T000000_21000101T000000_B09 574 | S2A_OPER_GIP_R2WAFI_MPC__20150605T094742_V20150622T000000_21000101T000000_B10 575 | S2A_OPER_GIP_R2WAFI_MPC__20150605T094742_V20150622T000000_21000101T000000_B11 576 | S2A_OPER_GIP_R2WAFI_MPC__20150605T094742_V20150622T000000_21000101T000000_B12 577 | S2A_OPER_GIP_RESPAR_MPC__20150605T094736_V20150622T000000_21000101T000000_B00 578 | S2A_OPER_GIP_SPAMOD_MPC__20160203T145800_V20151115T000000_21000101T000000_B00 579 | S2A_OPER_GIP_TILPAR_MPC__20151209T095117_V20150622T000000_21000101T000000_B00 580 | S2A_OPER_GIP_VIEDIR_MPC__20151117T131048_V20150703T000000_21000101T000000_B01 581 | S2A_OPER_GIP_VIEDIR_MPC__20151117T131049_V20150703T000000_21000101T000000_B02 582 | S2A_OPER_GIP_VIEDIR_MPC__20151117T131049_V20150703T000000_21000101T000000_B03 583 | S2A_OPER_GIP_VIEDIR_MPC__20151117T131049_V20150703T000000_21000101T000000_B04 584 | S2A_OPER_GIP_VIEDIR_MPC__20151117T131050_V20150703T000000_21000101T000000_B05 585 | S2A_OPER_GIP_VIEDIR_MPC__20151117T131050_V20150703T000000_21000101T000000_B06 586 | S2A_OPER_GIP_VIEDIR_MPC__20151117T131050_V20150703T000000_21000101T000000_B07 587 | S2A_OPER_GIP_VIEDIR_MPC__20151117T131050_V20150703T000000_21000101T000000_B08 588 | S2A_OPER_GIP_VIEDIR_MPC__20151117T131050_V20150703T000000_21000101T000000_B8A 589 | S2A_OPER_GIP_VIEDIR_MPC__20151117T131050_V20150703T000000_21000101T000000_B09 590 | S2A_OPER_GIP_VIEDIR_MPC__20151117T131050_V20150703T000000_21000101T000000_B10 591 | S2A_OPER_GIP_VIEDIR_MPC__20151117T131050_V20150703T000000_21000101T000000_B11 592 | S2A_OPER_GIP_VIEDIR_MPC__20151117T131051_V20150703T000000_21000101T000000_B12 593 | 594 | S2__OPER_DEM_GLOBEF_PDMC_19800101T000000_S19800101T000000 595 | S2__OPER_AUX_UT1UTC_PDMC_20160310T000000_V20160311T000000_20170310T000000 596 | S2A_OPER_AUX_GRI065_PDMC_20130621T120000_S20130101T000000 597 | S2__OPER_AUX_ECMWFD_PDMC_20160315T120000_V20160315T210000_20160316T090000 598 | 599 | 600 | 55.76177 601 | 602 | 0 603 | 0 604 | 605 | 606 | 607 | PASSED 608 | FAILED 609 | PASSED 610 | PASSED 611 | PASSED 612 | 613 | 614 | 615 | S2A_OPER_MSI_L1C_DS_SGS__20160316T054120_S20160316T020640_GEOMETRIC_QUALITY_report.xml 616 | 617 | 618 | 619 | 620 | 621 | --------------------------------------------------------------------------------