From 5c861eee12bf119c50437d0b295578095bd66002 Mon Sep 17 00:00:00 2001 From: Jeff Albrecht Date: Sun, 13 Sep 2020 21:26:57 -0500 Subject: [PATCH] wip stac reader --- aiocogeo/stac.py | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 aiocogeo/stac.py diff --git a/aiocogeo/stac.py b/aiocogeo/stac.py new file mode 100644 index 0000000..366bd63 --- /dev/null +++ b/aiocogeo/stac.py @@ -0,0 +1,41 @@ +import asyncio +from dataclasses import dataclass +from typing import List +from urllib.parse import urlsplit + +import aiohttp + +from .cog import COGReader + + +@dataclass +class STACReader: + filepath: str + readers: List[COGReader] = None + + async def __aenter__(self): + splits = urlsplit(self.filepath) + if splits.scheme in {"http", "https"}: + async with aiohttp.ClientSession() as session: + async with session.get(self.filepath) as resp: + resp.raise_for_status() + item = await resp.json() + else: + # TODO: support s3 + pass + + reader_futs = [] + for asset in item["assets"]: + if item["assets"][asset]["type"] == "image/x.geotiff": + reader = COGReader(item["assets"][asset]["href"]).__aenter__() + reader_futs.append(reader) + self.readers = await asyncio.gather(*reader_futs) + return self + + async def __aexit__(self, exc_type, exc_val, exc_tb): + for reader in self.readers: + await reader._file_reader._close() + + async def get_tile(self, x: int, y: int, z: int): + futs = [reader.get_tile(x, y, z) for reader in self.readers] + return await asyncio.gather(*futs)