# aiocogeo [](https://github.com/geospatial-jeff/aiocogeo/actions?query=workflow%3ACI) [](https://codecov.io/gh/geospatial-jeff/aiocogeo) [](https://pypi.org/project/aiocogeo) [](https://github.com/geospatial-jeff/aiocogeo/blob/master/LICENSE) ## Installation ``` pip install aiocogeo # With S3 filesystem pip install aiocogeo[s3] ``` ## Usage COGs are opened using the `COGReader` asynchronous context manager: ```python from aiocogeo import COGReader async with COGReader("http://cog.tif") as cog: ... ``` Several filesystems are supported: - **HTTP/HTTPS** (`http://`, `https://`) - **S3** (`s3://`) - **File** (`/`) ### Metadata Generating a [rasterio-style profile](https://rasterio.readthedocs.io/en/latest/topics/profiles.html) for the COG: ```python async with COGReader("https://async-cog-reader-test-data.s3.amazonaws.com/lzw_cog.tif") as cog: print(cog.profile) >>> {'driver': 'GTiff', 'width': 10280, 'height': 12190, 'count': 3, 'dtype': 'uint8', 'transform': Affine(0.6, 0.0, 367188.0, 0.0, -0.6, 3777102.0), 'blockxsize': 512, 'blockysize': 512, 'compress': 'lzw', 'interleave': 'pixel', 'crs': 'EPSG:26911', 'tiled': True, 'photometric': 'rgb'} ``` #### Lower Level Metadata A COG is composed of several IFDs, each with many TIFF tags: ```python from aiocogeo.ifd import IFD from aiocogeo.tag import Tag async with COGReader("https://async-cog-reader-test-data.s3.amazonaws.com/lzw_cog.tif") as cog: for ifd in cog: assert isinstance(ifd, IFD) for tag in ifd: assert isinstance(tag, Tag) ``` Each IFD contains more granular metadata about the image than what is included in the profile. For example, finding the tilesize for each IFD: ```python async with COGReader("https://async-cog-reader-test-data.s3.amazonaws.com/lzw_cog.tif") as cog: for ifd in cog: print(ifd.TileWidth.value, ifd.TileHeight.value) >>> 512 512 128 128 128 128 128 128 128 128 128 128 ``` More advanced use cases may need access to tag-level metadata: ```python async with COGReader("https://async-cog-reader-test-data.s3.amazonaws.com/lzw_cog.tif") as cog: first_ifd = cog.ifds[0] assert first_ifd.tag_count == 24 for tag in first_ifd: print(tag) >>> Tag(code=258, name='BitsPerSample', tag_type=TagType(format='H', size=2), count=3, length=6, value=(8, 8, 8)) Tag(code=259, name='Compression', tag_type=TagType(format='H', size=2), count=1, length=2, value=5) Tag(code=257, name='ImageHeight', tag_type=TagType(format='H', size=2), count=1, length=2, value=12190) Tag(code=256, name='ImageWidth', tag_type=TagType(format='H', size=2), count=1, length=2, value=10280) ... ``` ### Image Data The reader also has methods for reading internal image tiles and performing partial reads. Currently only jpeg, lzw, deflate, packbits, and webp compressions are supported. #### Image Tiles Reading the top left tile of an image at native resolution: ```python async with COGReader("https://async-cog-reader-test-data.s3.amazonaws.com/webp_cog.tif") as cog: x = y = z = 0 tile = await cog.get_tile(x, y, z) ifd = cog.ifds[z] assert tile.shape == (ifd.bands, ifd.TileHeight.value, ifd.TileWidth.value) ```