Python Geospatial CI/CD & Wheel Building

GDAL · PROJ · PyProj

Python Geospatial CI/CD & Wheel Building is a technical resource for compiling, testing, and distributing Python geospatial C-extensions — the bindings behind GDAL, PROJ, and PyProj — using modern CI/CD and wheel workflows. It exists to make native spatial packaging reproducible instead of fragile.

The material is organised around two areas. The first covers the binary contracts a compiled wheel has to satisfy: the CPython ABI and the separate NumPy one, shared-library path resolution, symbol visibility, memory ownership, thread safety, cross-compilation, and the trade-offs of vendoring PROJ and GDAL. The second covers the build pipeline that produces the artifact: pyproject.toml, scikit-build-core and CMake, Pixi/conda environment isolation, manylinux and musllinux base images, caching, matrix design, wheel size and import time, reproducible builds with a bill of materials, and the release path onto an index.

It is written for python gis developers, package maintainers, devops, and data platform teams. Every guide ships exact, copy-pasteable configuration and validation commands so you can move from a broken ImportError to a portable, audited wheel — across 2 core areas, 24 topics, and 57 step-by-step deep dives.

Start here

Six guides that between them cover the failures spatial wheel builds hit most often — a wheel that will not import, an ABI that does not hold, a release that reaches nobody.

Newest topics

The most recently added areas, each with its own set of deep-dive guides.

Browse every topic

Two core areas, each broken into focused topics and deep-dive guides.

Geospatial C-Extension Fundamentals & ABI Architecture

Shipping a Python geospatial package means shipping compiled C and C++ across machines you will never see. Bindings for GDAL, PROJ, GEOS, and raster engines are not pure Python…

Open section

Modern Python Build Tooling & Wheel Configuration

Turning a geospatial Python package into a binary wheel is a compilation problem disguised as a packaging problem. Every pip install rasterio or pip install pyproj ultimately…

Open section

Every deep-dive guide

All 57 guides, grouped by the topic they belong to.