예제 #1
0
    def test_tile_metadata_with_geometry_check(self):
        def geometry_check(meta):
            if meta['latitude_band'] == 'N':
                return False

            return True

        f = open('tests/samples/tileInfo.json', 'rb')
        tile_info = json.loads(f.read().decode(),
                               object_pairs_hook=OrderedDict)

        tile = tile_metadata(tile_info,
                             metadata_to_dict('tests/samples/metadata.xml'),
                             geometry_check)

        assert isinstance(tile, OrderedDict)
        assert tile[
            'thumbnail'] == 'http://sentinel-s2-l1c.s3.amazonaws.com/tiles/56/X/NF/2016/3/16/0/preview.jp2'
        assert tile[
            'tile_name'] == 'S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56XNF_N02.01'
        assert tile['utm_zone'] == 56
        assert tile['data_coverage_percentage'] == 65.58
        assert tile['sensing_orbit_direction'] == 'DESCENDING'
        assert len(tile['download_links']['aws_s3']) == 13

        # Make sure bands urls are left padded
        d_link = tile['download_links']['aws_s3'][0].split('.')[-2].split('/')
        assert d_link[-1] == 'B01'
예제 #2
0
    def test_metadata_to_dict_new_format(self):

        xml = open('tests/samples/metadata_new.xml')
        product = metadata_to_dict(xml)

        assert isinstance(product, OrderedDict)
        assert 'band_list' in product
        assert 'tiles' in product
        assert product['spacecraft_name'] == 'Sentinel-2A'
        assert len(product['band_list']) == 13

        tiles = list(iterkeys(product['tiles']))
        assert len(tiles) == 1
예제 #3
0
    def test_metadata_to_dict_new_format(self):

        xml = open('tests/samples/metadata_new.xml')
        product = metadata_to_dict(xml)

        assert isinstance(product, OrderedDict)
        assert 'band_list' in product
        assert 'tiles' in product
        assert product['spacecraft_name'] == 'Sentinel-2A'
        assert len(product['band_list']) == 13

        tiles = list(iterkeys(product['tiles']))
        assert len(tiles) == 1
예제 #4
0
    def test_tile_metadata(self):

        f = open('tests/samples/tileInfo.json', 'rb')
        tile_info = json.loads(f.read().decode(), object_pairs_hook=OrderedDict)

        tile = tile_metadata(tile_info, metadata_to_dict('tests/samples/metadata.xml'))

        assert isinstance(tile, OrderedDict)
        assert tile['thumbnail'] == 'http://sentinel-s2-l1c.s3.amazonaws.com/tiles/56/X/NF/2016/3/16/0/preview.jp2'
        assert tile['tile_name'] == 'S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56XNF_N02.01'
        assert tile['utm_zone'] == 56
        assert tile['data_coverage_percentage'] == 65.58
        assert tile['sensing_orbit_direction'] == 'DESCENDING'
        assert len(tile['download_links']['aws_s3']) == 13

        # Make sure bands urls are left padded
        d_link = tile['download_links']['aws_s3'][0].split('.')[-2].split('/')
        assert d_link[-1] == 'B01'
예제 #5
0
def product_metadata(product, dst_folder, counter=None, writers=[file_writer], geometry_check=None):
    """ Extract metadata for a specific product """

    if not counter:
        counter = {
            'products': 0,
            'saved_tiles': 0,
            'skipped_tiles': 0,
            'skipped_tiles_paths': []
        }

    s3_url = 'http://sentinel-s2-l1c.s3.amazonaws.com'

    product_meta_link = '{0}/{1}'.format(s3_url, product['metadata'])
    product_info = requests.get(product_meta_link, stream=True)
    product_metadata = metadata_to_dict(product_info.raw)
    product_metadata['product_meta_link'] = product_meta_link

    counter['products'] += 1

    for tile in product['tiles']:
        tile_info = requests.get('{0}/{1}'.format(s3_url, tile))
        try:
            metadata = tile_metadata(tile_info.json(), copy(product_metadata), geometry_check)

            for w in writers:
                w(dst_folder, metadata)

            logger.info('Saving to disk: %s' % metadata['tile_name'])
            counter['saved_tiles'] += 1
        except JSONDecodeError:
            logger.warning('Tile: %s was not found and skipped' % tile)
            counter['skipped_tiles'] += 1
            counter['skipped_tiles_paths'].append(tile)

    return counter
예제 #6
0
    def test_tile_metadata(self):

        f = open('tests/samples/tileInfo.json', 'rb')
        tile_info = json.loads(f.read().decode(),
                               object_pairs_hook=OrderedDict)

        tile = tile_metadata(tile_info,
                             metadata_to_dict('tests/samples/metadata.xml'))

        assert isinstance(tile, OrderedDict)
        assert tile[
            'thumbnail'] == 'http://sentinel-s2-l1c.s3.amazonaws.com/tiles/56/X/NF/2016/3/16/0/preview.jp2'
        assert tile[
            'tile_name'] == 'S2A_OPER_MSI_L1C_TL_SGS__20160316T054120_A003818_T56XNF_N02.01'
        assert tile['utm_zone'] == 56
        assert tile['data_coverage_percentage'] == 65.58
        assert tile['sensing_orbit_direction'] == 'DESCENDING'
        assert len(tile['download_links']['aws_s3']) == 13
        assert tile['tile_origin']['crs']['properties'][
            'name'] == 'urn:ogc:def:crs:EPSG:8.9:4326'

        # Make sure bands urls are left padded
        d_link = tile['download_links']['aws_s3'][0].split('.')[-2].split('/')
        assert d_link[-1] == 'B01'