Quickstart⚓︎
There are three ways to read a GeoTIFF with cog3pio's Python bindings into CPU memory,
and two ways to read it into CUDA GPU memory.
Take your pick:
| Output | CUDA-acceleration | DLPack protocol | coordinates | any dtype |
|---|---|---|---|---|
| PyCapsule | ✅ | ✅ | ❌ | ✅ |
| xarray | ✅ | ❓ | ✅ | ✅ |
| numpy | ❌ | ✅ | ❌ | ❌ |
Notes:
- DLPack - an in-memory tensor structure
- Coordinates in xarray are computed from the GeoTIFF's affine transformation
- Currently supported dtypes include:
- On CPU: uint (u8/u16/u32/u64), int (i8/i16/i32/i64) and float (f16/f32/f64)
- On CUDA: uint (u8/u16/u32/u64), int (i8/i16/i32/i64) and float (f32/f64)
PyCapsule (DLPack)⚓︎
Read a GeoTIFF file from a HTTP url via the CudaCogReader or
CogReader class into an object that conforms to the
Python Specification for DLPack,
whereby the __dlpack__() method returns a
PyCapsule object containing
a DLManagedTensorVersioned
object.
import cupy as cp
from cog3pio import CudaCogReader
cog = CudaCogReader(
path="https://github.com/OSGeo/gdal/raw/v3.11.0/autotest/gcore/data/float32.tif",
device_id=0
)
assert hasattr(cog, "__dlpack__")
assert hasattr(cog, "__dlpack_device__")
array: cp.ndarray = cp.from_dlpack(cog)
assert array.shape == (400,) # (1, 20, 20)
assert array.dtype == "float32"
# or with Pytorch>=2.9.0, after https://github.com/pytorch/pytorch/pull/145000
# tensor: torch.Tensor = torch.from_dlpack(cog)
# ...
import numpy as np
from cog3pio import CogReader
cog = CogReader(
path="https://github.com/OSGeo/gdal/raw/v3.11.0/autotest/gcore/data/float16.tif"
)
assert hasattr(cog, "__dlpack__")
assert hasattr(cog, "__dlpack_device__")
array: np.ndarray = np.from_dlpack(cog)
assert array.shape == (1, 20, 20)
assert array.dtype == "float16"
# or with Pytorch>=2.9.0, after https://github.com/pytorch/pytorch/pull/145000
# tensor: torch.Tensor = torch.from_dlpack(cog)
# ...
Xarray⚓︎
Read GeoTIFF file from a HTTP url via the
Cog3pioBackendEntrypoint engine
into an xarray.DataArray object (akin to
rioxarray).
Set the
device
parameter to (2, 0) to read into CUDA (default), or None to read into CPU memory.
import cupy as cp
import xarray as xr
# Read GeoTIFF into an xarray.DataArray
dataarray: xr.DataArray = xr.open_dataarray(
filename_or_obj="https://github.com/cogeotiff/rio-tiler/raw/7.8.0/tests/fixtures/cog_dateline.tif",
engine="cog3pio",
device=(2, 0), # cuda:0
)
assert dataarray.sizes == {'band': 1, 'y': 2355, 'x': 2325}
assert dataarray.dtype == "uint16"
assert isinstance(dataarray.data, cp.ndarray)
import numpy as np
import xarray as xr
# Read GeoTIFF into an xarray.DataArray
dataarray: xr.DataArray = xr.open_dataarray(
filename_or_obj="https://github.com/cogeotiff/rio-tiler/raw/7.8.0/tests/fixtures/cog_dateline.tif",
engine="cog3pio",
device=None, # or (1, 0) for cpu
)
assert dataarray.sizes == {'band': 1, 'y': 2355, 'x': 2325}
assert dataarray.dtype == "uint16"
assert isinstance(dataarray.data, np.ndarray)
NumPy⚓︎
Read a GeoTIFF file from a HTTP url via the read_geotiff
function into a numpy.ndarray (akin to
rasterio).
import numpy as np
from cog3pio import read_geotiff
# Read GeoTIFF into a numpy array
array: np.ndarray = read_geotiff(
path="https://github.com/cogeotiff/rio-tiler/raw/6.4.0/tests/fixtures/cog_nodata_nan.tif"
)
assert array.shape == (1, 549, 549) # bands, height, width
assert array.dtype == "float32"
Note
The read_geotiff function supports reading single or
multi-band GeoTIFF files into a float32 array only. If you wish to read into other
dtypes (e.g. uint16), please use the Xarray or DLPack methods instead which supports reading into different
dtypes.