terrio
Python bindings for terrio: read, write, convert and reproject geospatial rasters, vector datasets and point clouds in pure Rust, without GDAL. Wheels need only NumPy.
pip install terrio
Rasters
import terrio
dem = terrio.open_raster("dem.tif")
dem.width, dem.height, dem.count, dem.dtype # dtype is a NumPy name: "float32", "uint8"...
dem.crs, dem.transform, dem.bounds, dem.nodata
elevation = dem.read(1) # numpy array (rows, cols) of the raster's own dtype
everything = dem.read() # (bands, rows, cols)
# GeoTIFFs and COGs, local or remote, can be read by window: only the tiles a window needs are
# decoded, and fetched with HTTP range requests.
cog = terrio.open_raster("https://example.com/cog.tif", lazy=True)
cog.overviews # [(width, height), ...] of the overviews, largest first
tile = cog.read(1, window=(1024, 1024, 512, 512)) # (col_off, row_off, width, height)
thumb = cog.read(overview=2)
# PMTiles and MBTiles raster tiles too: zoom levels are overviews (PMTiles read in place).
tiles = terrio.open_raster("https://example.com/tiles.pmtiles", lazy=True)
out = terrio.Raster.from_array(elevation * 3.28084, dem.transform, crs=dem.crs, nodata=dem.nodata)
out.write("dem_feet.tif", compress="DEFLATE")
out.write("dem_feet_cog.tif", driver="COG")
out.write("dem.zarr", options={"FORMAT": "ZARR_V3", "GEOREFERENCING_CONVENTION": "SPATIAL_PROJ"}) # GeoZarr
# STAC: a mosaic of an asset over a search's items (or an item's asset, 'STAC:"item.json":red'), read by window.
red = terrio.open_raster('STACIT:"https://earth-search.aws.element84.com/v1/search?collections=sentinel-2-l2a&bbox=-105.05,40.5,-104.95,40.6&datetime=2023-07-05":asset=red', lazy=True)
terrio.open_raster("landsat.tif").write("landsat.pmtiles") # Byte rasters as tiles (or .mbtiles)
Vector data
ds = terrio.open_vector("countries.gpkg") # or .shp, .geojson, .fgb, .parquet, .kml, .zip...
layer = ds.layers[0] # also ds["countries"]
layer.name, layer.crs, layer.geometry_type, layer.fields, len(layer), layer.bounds
collection = layer.to_geojson() # a GeoJSON FeatureCollection dict
wkb = layer.to_wkb() # one WKB geometry per feature
columns = layer.columns() # attribute values by field
gdf = layer.to_geopandas() # with geopandas installed
terrio.write_vector(layer.to_crs("EPSG:3857"), "countries_3857.fgb")
terrio.write_vector(collection, "countries.geojson") # GeoJSON dicts, GeoDataFrames...
Point clouds
LAS 1.0 to 1.4 (point formats 0 to 10, extra bytes), LAZ and COPC. Remote COPC files are read in place: only the octree nodes a read needs are fetched, with HTTP range requests.
f = terrio.open_points("https://s3.amazonaws.com/hobu-lidar/autzen-classified.copc.laz")
f.format, f.point_count, f.crs, f.bounds, f.header, f.dimensions
f.info(stats=True) # the summary `terrio info --json --stats` prints: classes, returns...
points = f.read(bounds=(637000, 851000, 637500, 851500), max_level=4) # or resolution=, max_points=
points = terrio.read_points("tile.laz", classes=[2], returns=["last", "only"])
z = points["z"] # NumPy arrays: x, y, z (scaled float64), intensity (uint16), classification...
points.to_dict() # {name: array}
points.to_numpy() # a structured array
points.write("ground.copc.laz") # LAS, LAZ or COPC
dem = points.grid(1.0, stat="idw") # a Raster (min, max, mean, idw, count, stdev; like PDAL)
points.to_layer(dimensions=["z", "intensity"]).to_geopandas()
terrio.convert_points("tile.laz", "tile_wgs84.laz", t_srs="EPSG:4326")
terrio.convert_points("tile.laz", "ground.gpkg", classes=[2]) # a layer of points
terrio.PointCloud.from_dict({"x": xs, "y": ys, "z": zs, "intensity": i}, crs="EPSG:32610")
Operations
The operations take the command-line options as keyword arguments. Inputs are paths or objects in memory; outputs are returned, and also written when a destination is given.
terrio.info("dem.tif", stats=True) # the same dict as `terrio info --json`
terrio.convert("countries.shp", "europe.gpkg", where="CONTINENT = 'Europe'", select=["NAME"])
terrio.convert("https://example.com/cog.tif", "window.tif", srcwin=(0, 0, 512, 512))
terrio.translate("dem.tif", "small.tif", outsize=("25%", "25%"), resampling="average")
terrio.warp("dem.tif", "dem_4326.tif", t_srs="EPSG:4326", resampling="bilinear")
terrio.mosaic(["n40w106.tif", "n40w107.tif"], "mosaic.tif")
terrio.rasterize("counties.gpkg", "pop.tif", attribute="POPULATION", tr=(0.01, 0.01), ot="Int32")
polygons = terrio.polygonize("landcover.tif", connectedness=8)
shade = terrio.dem("dem.tif", "hillshade", z=2, multidirectional=True) # like gdaldem
terrio.dem("dem.tif", "color-relief", "relief.tif", color_file="colors.txt", alpha=True)
ndvi = terrio.calc("(B - A * 1.0) / (B + A * 1.0)", A="landsat.tif", A_band=3, B="landsat.tif", B_band=4,
type="Float32") # like gdal_calc.py, with NumPy's typing rules
dist = terrio.proximity("roads.tif", values=[1], distunits="GEO")
clean = terrio.sieve("landcover.tif", threshold=10, connectedness=8)
xs, ys = terrio.transform_points([699960], [3900000], "EPSG:32610", "EPSG:4326")
data = open("dem.tif", "rb").read()
raster = terrio.open_bytes(data, "dem.tif") # from bytes; to bytes with raster.to_bytes("x.tif")
Errors raise terrio.TerrioError subclasses, which also derive from the matching built-in
exceptions: NotFoundError is a FileNotFoundError, TerrioIOError an OSError, and
InvalidArgumentError, CRSError, UnsupportedError and InvalidDataError are ValueErrors.
Development
cd python
uv venv && uv pip install maturin numpy pytest
uv run maturin develop
uv run pytest # synthetic tests
TERRIO_TEST_DATA=../../terrio-data uv run pytest # real files, compared with GDAL when installed
Metadata
Release files for terrio 0.1.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| terrio-0.1.1.tar.gz | 917.6 kB | Details |
Built distributions (wheels)
| File | Reset | |||
|---|---|---|---|---|
| terrio-0.1.1-cp310-abi3-win_amd64.whl | CPython 3.10 | abi3 | Windows x86-64 | Details |
| terrio-0.1.1-cp310-abi3-musllinux_1_2_x86_64.whl | CPython 3.10 | abi3 | Linux musl 1.2+ x86-64 | Details |
| terrio-0.1.1-cp310-abi3-manylinux_2_28_aarch64.whl | CPython 3.10 | abi3 | Linux glibc 2.28+ ARM64 | Details |
| terrio-0.1.1-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl | CPython 3.10 | abi3 | Linux glibc 2.17+ x86-64 | Details |
| terrio-0.1.1-cp310-abi3-macosx_11_0_arm64.whl | CPython 3.10 | abi3 | macOS 11.0+ ARM64 | Details |
| terrio-0.1.1-cp310-abi3-macosx_10_12_x86_64.whl | CPython 3.10 | abi3 | macOS 10.12+ x86-64 | Details |
Total release size: 82.7 MB
Release files / terrio-0.1.1.tar.gz
| Download URL | terrio-0.1.1.tar.gz |
|---|---|
| Size | 917.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
8d76892a82c438aa3ca4189f38d76b4ddd5ba020b25b8e761b8f39aa7dd1118c
|
|
BLAKE2b-256 checksum How to use checksums |
971678021271bdf9fc019bd9e22cc5174035aa22a9af244635f91fa462ab9b46
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 15, 2026.
Transparency logRelease files / terrio-0.1.1-cp310-abi3-win_amd64.whl
| Download URL | terrio-0.1.1-cp310-abi3-win_amd64.whl |
|---|---|
| Size | 12.6 MB |
| Tags | CPython 3.10 Windows x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
ffb97090d6850b9a95c73da60f0dadfa34f58d89abd3af4f0807180e26aa0220
|
|
BLAKE2b-256 checksum How to use checksums |
711edf2d70a3d7ae6110d5189c03eb361bfbd920fdb4cb14a1334f9b93abfbed
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 15, 2026.
Transparency logRelease files / terrio-0.1.1-cp310-abi3-musllinux_1_2_x86_64.whl
| Download URL | terrio-0.1.1-cp310-abi3-musllinux_1_2_x86_64.whl |
|---|---|
| Size | 14.9 MB |
| Tags | CPython 3.10 Linux musl 1.2+ x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
596c8adf63f9cef780b9da461d3ef234030a86b4054f83c130a0eebd1a6446a3
|
|
BLAKE2b-256 checksum How to use checksums |
c1e076420a99411b8d0c2c31d54f81c9c96cfd4cdba2b166e2f762664538b3a2
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 15, 2026.
Transparency logRelease files / terrio-0.1.1-cp310-abi3-manylinux_2_28_aarch64.whl
| Download URL | terrio-0.1.1-cp310-abi3-manylinux_2_28_aarch64.whl |
|---|---|
| Size | 14.1 MB |
| Tags | CPython 3.10 Linux glibc 2.28+ ARM64 abi3 |
|
SHA-256 checksum How to use checksums |
78ea7d6594f9e557609d1959e47f53c297af8502805c78f1692492db4013cc81
|
|
BLAKE2b-256 checksum How to use checksums |
7c0396c1a3577bba97e629e0a1cbfb5c1554a1939070e1a2e8a94beb73853532
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 15, 2026.
Transparency logRelease files / terrio-0.1.1-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
| Download URL | terrio-0.1.1-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl |
|---|---|
| Size | 14.2 MB |
| Tags | CPython 3.10 Linux glibc 2.17+ x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
15ba62b78d031e7107ba068c5a87dda658514660d8542ccc910ccff0935f1023
|
|
BLAKE2b-256 checksum How to use checksums |
c27b05227d83663cf07ca215aa6c7ee13904435bdd821d22a50caad3a7868c3f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 15, 2026.
Transparency logRelease files / terrio-0.1.1-cp310-abi3-macosx_11_0_arm64.whl
| Download URL | terrio-0.1.1-cp310-abi3-macosx_11_0_arm64.whl |
|---|---|
| Size | 12.7 MB |
| Tags | CPython 3.10 abi3 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
7f837fb722369a527dd1c7585600284bf4d6c96acb88572191522fca5c5057ca
|
|
BLAKE2b-256 checksum How to use checksums |
6d10d1c678e10b7e8b74fa471d4fbdf29344a479867c35b80ebec0784fe31db4
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 15, 2026.
Transparency logRelease files / terrio-0.1.1-cp310-abi3-macosx_10_12_x86_64.whl
| Download URL | terrio-0.1.1-cp310-abi3-macosx_10_12_x86_64.whl |
|---|---|
| Size | 13.3 MB |
| Tags | CPython 3.10 abi3 macOS 10.12+ x86-64 |
|
SHA-256 checksum How to use checksums |
b4936c02ee9f8fb6d6c0ef296abb65c76a9b0a6e9913de5188a522967f096e65
|
|
BLAKE2b-256 checksum How to use checksums |
87c6231d1e4136bfdd914fa5aee0a4114d499c1bfc4752c885ffd1a8b104d6f6
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 15, 2026.
Transparency log