Skip to main content

isobands

An easy way to make filled contour maps with Python.

isobands converts a regular two-dimensional xarray raster into filled contour polygons backed by a GeoPandas GeoDataFrame.

Install

isobands needs an installed, matching osgeo.gdal Python binding. If your Conda or system-managed environment already provides one of the tested baselines, install the package directly:

pip install isobands

For a pip-managed binding, first install the matching native GDAL 3.13.2 development files — the PyPI GDAL package is source-only, and without them the build fails with gdal-config: No such file or directory — then use the recommended newest tested and installable extra:

pip install "isobands[gdal313]"

GDAL 3.10.2, 3.11.5, and 3.12.2 remain tested compatibility choices through the matching gdal310, gdal311, and gdal312 extras. See the installation guide for exact versions and platform instructions.

After installation, verify the active GDAL bindings and run a small in-memory contour test:

python -m isobands check

Python callers can inspect the same structured report with isobands.check(). Use python -m isobands check --json for machine-readable output.

Quick start

import numpy as np
import xarray as xr

import isobands

data = xr.DataArray(
    np.array([[0.0, 1.0, 2.0], [1.0, 2.0, 3.0], [2.0, 3.0, 4.0]]),
    dims=("y", "x"),
    coords={"x": [0.0, 1.0, 2.0], "y": [2.0, 1.0, 0.0]},
)
bands = isobands.from_raster(data, levels=[1.5, 2.5], crs="EPSG:4326")
print(bands[["min_value", "max_value", "geometry"]])

The result always has the stable min_value, max_value, and geometry columns and a GeoPandas CRS. Exactly one of levels or interval is required. Use levels for strictly increasing interior thresholds, or interval for integral thresholds. Values equal to a threshold belong to the upper band.

Regular one-dimensional rectilinear coordinates are required, and coordinate names do not imply a CRS. Pass crs= explicitly when metadata is absent or ambiguous. Explicit finite nodata takes precedence over _FillValue and missing_value; otherwise nonfinite cells are excluded. Dask-backed arrays are materialized eagerly for GDAL's in-memory dataset. See the guide for usage examples and the API reference.

Real-world example

The runnable NOAA/NCEP example uses the pinned fixture in examples/data/, calls from_raster() with Kelvin levels and EPSG:4326, checks the schema, CRS, and geometry validity, and dissolves components with GeoPandas:

python examples/air_temperature.py

The ERA5 MapLibre example downloads the global daily high temperature for August 16, 2020, creates five-degree Celsius isobands, and writes GeoJSON for the accompanying era5_maplibre.html page. It requires a Copernicus Climate Data Store API key and the optional cdsapi, h5netcdf, and h5py packages.

Documentation

The hosted documentation is intended for palewi.re/docs/isobands/. The source is in docs/, with a single-page guide covering installation, quick start, the API reference, and the MapLibre example. Benchmarks and their reference data remain in benchmarks/.

Metadata

Release files for isobands 0.2.3

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for isobands 0.2.3
File Size Uploaded
isobands-0.2.3.tar.gz 2.7 MB Details

Built distribution (wheel)

Table of built distributions (wheels) for isobands 0.2.3
File Interpreter ABI Platform
isobands-0.2.3-py3-none-any.whl Python 3 none any Details

Total release size: 2.7 MB

Release files / isobands-0.2.3.tar.gz

Download URL isobands-0.2.3.tar.gz
Size 2.7 MB
Tags Source
SHA-256 checksum
How to use checksums
e0b4195533dd93ecc75461aa1af771681de9a7549c5e8d5283e9ab842419190a
BLAKE2b-256 checksum
How to use checksums
88c9fe03666c68ff660377e4261e3e2b743dcce6b697b9fc13221ec8b3078088
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 Aug 21, 2026.

Transparency log

Release files / isobands-0.2.3-py3-none-any.whl

Download URL isobands-0.2.3-py3-none-any.whl
Size 23.7 kB
Tags Python 3
SHA-256 checksum
How to use checksums
4b555450393dddce34159a067cc7288aea481384510d6967a9747413fa537cd0
BLAKE2b-256 checksum
How to use checksums
f9bfbca71b226fdaaad44e7c21c93e6258870c1bf7defbb8a5f46ad4469bba44
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 Aug 21, 2026.

Transparency log
Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page