x, y = geoportail_pyramid[level].coordinate_to_projection(location)
from PyGeoPortail.Math.Interval import Interval2D
interval = Interval2D((x, x + 500), (y, y + 500))
mosaic_interval = geoportail_pyramid[level].projection_interval_to_mosaic(interval)
print(mosaic_interval)
# for row, column in mosaic_interval.iter():
#     print(row, column)

loop = asyncio.get_event_loop()

tile = loop.run_until_complete(geoportail_wtms.download_ortho_photo(level, row, column))
# tile.to_pil_image().save(tile.filename(with_layer=True, with_level=True))

geoportail_map_provider = GeoPortailMapProvider(geoportail_wtms)
tasks = [asyncio.async(geoportail_map_provider.get_tile(level, row, column + i)) for i in range(3)]
loop.run_until_complete(asyncio.wait(tasks))

lru_cache = LruCache(constraint=1024**3)

def done_callback(future):
    print('done', future.result())

cached_pyramid = CachedPyramid(geoportail_map_provider, lru_cache)
tasks = [asyncio.async(cached_pyramid.acquire(level, row, column + i)) for i in (0, 1, 0)]
for task in tasks:
    task.add_done_callback(done_callback)
loop.run_until_complete(asyncio.wait(tasks))
cached_pyramid.release(level, row, column)
lru_cache.recycle()
loop = asyncio.get_event_loop()
cache_path = os.path.join(os.environ['HOME'], '.cache', 'pygeoportail')
if not os.path.exists(cache_path):
    os.mkdir(cache_path)

def done_callback(future):
    tile = future.result()
    tile.save(cache_path)

if False:
    level_max = 16
    for level in range(level_max +1):
        pyramid_level = geoportail_pyramid[level]
        mosaic_interval = pyramid_level.projection_interval_to_mosaic(area)
        print(level, mosaic_interval)
        for r in mosaic_interval.x.iter():
            tasks = [asyncio.async(geoportail_map_provider.get_tile(level, r, c))
                     for c in mosaic_interval.y.iter()]
            for task in tasks:
                task.add_done_callback(done_callback)
            loop.run_until_complete(asyncio.wait(tasks))

loop.close()

####################################################################################################
#
# End
#
####################################################################################################