async-tiff

Fast, low-level async TIFF and GeoTIFF reader for Python.
This documentation is for the Python bindings. Refer here for the Rust crate documentation.
Examples
Reading NAIP
from async_tiff import TIFF
from async_tiff.store import S3Store
store = S3Store("naip-visualization", region="us-west-2", request_payer=True)
path = "ny/2022/60cm/rgb/40073/m_4007307_sw_18_060_20220803.tif"
tiff = await TIFF.open(path, store=store, prefetch=32768)
primary_ifd = tiff.ifds[0]
primary_ifd.geo_key_directory.citation
primary_ifd.geo_key_directory.projected_type
primary_ifd.sample_format
primary_ifd.bits_per_sample
tile = await tiff.fetch_tile(0, 0, 4)
decoded_bytes = await tile.decode_async()
import numpy as np
from rasterio.plot import reshape_as_raster, show
arr = np.frombuffer(decoded_bytes, np.uint8)
arr = arr.reshape(512, 512, 3)
arr = reshape_as_raster(arr)
show(arr, adjust=True)

Reading Sentinel 2 L2A
from async_tiff import TIFF
from async_tiff.store import S3Store
store = S3Store("sentinel-cogs", region="us-west-2", skip_signature=True)
path = "sentinel-s2-l2a-cogs/12/S/UF/2022/6/S2B_12SUF_20220609_0_L2A/B04.tif"
tiff = await TIFF.open(path, store=store, prefetch=32768)
primary_ifd = tiff.ifds[0]
primary_ifd.geo_key_directory.citation
primary_ifd.geo_key_directory.projected_type
primary_ifd.sample_format[0]
primary_ifd.bits_per_sample[0]
tile = await tiff.fetch_tile(0, 0, 0)
decoded_bytes = await tile.decode_async()