Python GIS
Made Practical
Hands-on guides for working with spatial data in Python. GeoPandas, coordinate reference systems, spatial joins, rasterio — clear answers to real problems.
Built for anyone working with maps and spatial data in Python — from first install to production-ready GIS workflows.
- 689 guides
- 33 learning paths
- 165 error fixes
- 3+ diagrams per guide
What You'll Find Here
Practical & Direct
Every guide starts with the problem and delivers a quick answer, then walks through a step-by-step solution with real Python code. No filler, no detours.
Python-First
All content uses GeoPandas, Shapely, Rasterio, Fiona, and the wider Python GIS ecosystem. Code snippets you can copy and run today.
Beginner-Friendly
Whether you're opening your first shapefile or debugging a spatial join, guides are written for clarity — no GIS PhD required.
Browse by Topic
Every subject on the site. Each topic page gathers the concepts, the how-to guides and the fixes for that subject in one place.
Fundamentals
What the objects, files and libraries actually are.
Geometry & space
The shapes themselves, where they sit on the earth, and how they relate.
Imagery & point clouds
Data that arrives as measurements of a surface rather than as features on it.
Analysis
Getting from a raw download to something you can put in front of someone.
Modelling & prediction
Predicting values where nobody measured them, and deciding where things should go — with the limits of each model attached.
Production
Work that runs without you watching it.
Delivery & sharing
Handing the work to someone else: an API, an app, a link that keeps working.
Governance & trust
What a dataset is allowed to say, who it is allowed to say it about, and how anyone proves where it came from.
Tools
The other software in a Python GIS stack, driven from Python.
Learning Paths
Curated, topic-based routes through the guides — start at the top of a path and work down.
-
Finding & Fetching Data
Get the data before you analyse it — from OSM, web services and satellite catalogues.
14 guides → -
Spatial Statistics
Measure the pattern instead of eyeballing the map.
13 guides → -
Terrain & Elevation
Turn a grid of heights into slope, shade, contours and drainage.
12 guides → -
Networks & Routing
Distance along the street, not across the rooftops.
11 guides → -
Raster Analysis
Read, reproject, clip and summarise raster data in Python.
14 guides → -
Spatial SQL & PostGIS
Move the heavy lifting from Python into the database.
15 guides → -
Making Maps
Turn a GeoDataFrame into a map someone else can read.
13 guides → -
GIS Data Cleaning
Turn messy spatial data into analysis-ready datasets.
33 guides → -
Batch Processing
Process many files at once, reliably.
26 guides → -
Automation & Pipelines
Build repeatable, config-driven GIS pipelines.
26 guides → -
QGIS Automation
Automate QGIS with PyQGIS and Processing models.
25 guides → -
Satellite Imagery
From a scene on a catalogue to a number you can defend.
16 guides → -
LiDAR & Point Clouds
Millions of points, and the surfaces worth deriving from them.
14 guides → -
Cloud-Native GIS
Read the part you need, not the file it lives in.
14 guides → -
Publishing Web Maps
Get the data into a browser without shipping the whole dataset.
15 guides → -
Movement & Time
Tracks are not points — the order and the clock are the data.
14 guides → -
Spatial Machine Learning
Why the usual rules break, and what to do instead.
14 guides → -
Interpolation & Surfaces
A continuous surface from scattered samples, with its support attached.
13 guides → -
Geocoding & Addresses
Address text is data too — and it is the messiest data in the file.
20 guides → -
Cartography & Map Design
The map is correct. Now make it readable.
20 guides → -
DuckDB for Spatial Data
A spatial database with no server, reading the file you already have.
20 guides → -
Serving Spatial Data
The dataset is finished. Now other people need it over HTTP.
20 guides → -
Maps, Apps & Dashboards
Let the reader ask their own question — within a budget.
20 guides → -
Gridded & Climate Data
A raster with a time axis, a calendar and forty years in one file.
20 guides → -
H3 & Global Grids
Give every point a cell id and half the geometry work becomes a join.
20 guides → -
Census & Demographics
The most-used open data there is, and the easiest to map wrongly.
20 guides → -
Location & Accessibility
Who can reach what — and where the next site should go.
20 guides → -
Hydrology & Watersheds
A DEM already knows where the water goes. Ask it carefully.
20 guides → -
Geoprivacy & Anonymisation
A coordinate is an identifier. Release it as if it were one.
20 guides → -
Metadata, Licensing & Provenance
A layer nobody can describe, cite or re-run is a layer nobody should use.
20 guides → -
3D & Buildings
A footprint plus a height is not a building, but it is most of one.
20 guides → -
Coastal & Marine
The shoreline is a choice of datum, not a line on a map.
20 guides → -
Agriculture & Crops
One field, one season, and a dozen ways to measure it wrong.
20 guides →
Concepts
Core concepts and essential knowledge for Python GIS.
- Accessibility Measures Explained: Nearest, Cumulative and Gravity spatial accessibility measures
- The Address Data Model: Why an Address Is Not a String address data model
- Address Matching Explained: Why Exact String Equality Fails address matching explained
- Aggregation and suppression rules explained small count suppression
- GeoJSON, Vector Tiles or Parquet: Choosing an API Response Format api response format geojson
- Reruns and State Explained: Why Your Map App Redraws Everything streamlit rerun state map
How-To Guides
Step-by-step solutions for common GIS tasks.
- How to Add a Basemap to a GeoPandas Map with contextily geopandas basemap contextily
- How to Add Filters and Widgets That Drive a Map map app filters widgets
- How to Add an Inset and Locator Map in Python inset locator map python
- How to add differentially private noise to spatial counts laplace noise counts python
- How to Add a Scale Bar and North Arrow to a Python Map scale bar north arrow python
- How to Aggregate Survey Estimates and Their Margins of Error aggregate acs margin of error python
- How to Aggregate Millions of Points into a Grid with DuckDB duckdb aggregate millions of points
- How to Aggregate Movement into Flows Between Zones aggregate movement flows python
- How to Aggregate Points into H3 Hexagons and Map Them aggregate points h3 hexagons
Fixes
Diagnose and fix common Python GIS errors — installs and CRS problems, broken geometries and failed writes, batch jobs that stop, scheduled scripts that never run, and PyQGIS crashes.
- Fixing Accessibility Scores That Are Wrong Near the Study Area Edge accessibility edge effect
- Fixing Addresses That Break on Accents and Encoding address encoding accents
- AIS tracks jump across the world ais track jumps
- Anonymised points still identify individuals anonymised points still identify
- GeoJSON Downloaded from an API Is Empty or Truncated api geojson truncated
- Fixing Coordinates in the Wrong Order in an API Response api coordinates wrong order
- Fixing an API Worker That Runs Out of Memory api worker out of memory
- Fixing Blank or Grey Tiles in an Embedded Map blank grey tiles map app
- Fixing an App Whose Memory Grows With Every User streamlit app memory grows