Fixes
Targeted fixes for the most frustrating Python GIS errors — from a failed install to a batch job that stops at file seven.
Python GIS errors tend to fall into a small number of repeating patterns. A CRS mismatch silently breaks a spatial join. A Fiona import error stops GeoPandas from loading entirely. A memory error crashes the script halfway through a large dataset. These guides diagnose the root cause and give you a concrete fix.
The collection now follows the learning paths all the way into production. Alongside the classic GeoPandas errors you will find the failures that only appear once a workflow runs unattended: a batch loop that dies on one bad file, outputs that overwrite each other, a scheduled script that works in your terminal and not from cron, a YAML config that will not load, a pipeline that reports success while producing nothing, and PyQGIS scripts that segfault or return an empty layer.
Each guide explains why the error happens — not just what command to run. Understanding the cause means you can avoid the same problem next time and adapt the fix to slightly different situations. If you are hitting an error you have not seen before, start with the guide closest to your symptoms.
Browse by topic
The fastest way in. Each topic page pairs these fixes with the concepts that explain them and the tasks they interrupt.
- Getting started Fundamentals
- Files & formats Fundamentals
- Data sources & downloads Fundamentals
- OpenStreetMap data Fundamentals
- Geocoding & addresses Fundamentals
- Geometry & topology Geometry & space
- CRS & projections Geometry & space
- Coordinates & distance Geometry & space
- Joins & relationships Geometry & space
- Networks & routing Geometry & space
- 3D & buildings Geometry & space
- H3 & global grids Geometry & space
- Satellite imagery Imagery & point clouds
- LiDAR & point clouds Imagery & point clouds
- Radar & SAR Imagery & point clouds
- Gridded & climate data Imagery & point clouds
- Weather data Imagery & point clouds
- Data cleaning Analysis
- Raster & rasterio Analysis
- Maps & visualisation Analysis
- Spatial statistics Analysis
- Census & demographics Analysis
- Housing & property data Analysis
- Terrain & elevation Analysis
- Hydrology & watersheds Analysis
- Movement & time Analysis
- Public transit & GTFS Analysis
- Web maps & tiles Analysis
- Python map libraries Analysis
- Cartography & map design Analysis
- Election maps & cartograms Analysis
- Animated & time-series maps Analysis
- Wildfire mapping Analysis
- Land cover & land change Analysis
- Health & disease mapping Analysis
- Flow maps & origin–destination data Analysis
- Historical maps & georeferencing Analysis
- Snow, ice & glaciers Analysis
- Crime & public safety mapping Analysis
- Road crashes & traffic safety Analysis
- Population grids Analysis
- Sea surface temperature & marine heatwaves Analysis
- Earthquakes & seismic hazard Analysis
- Wind & vector fields Analysis
- Rainfall, radar & storms Analysis
- Coastal & marine Analysis
- Agriculture & vegetation Analysis
- Biodiversity & species data Analysis
- Linear referencing Analysis
- Natural hazards & risk Analysis
- Air quality Analysis
- Renewable energy siting Analysis
- Urban form & morphology Analysis
- Forest monitoring Analysis
- Urban heat Analysis
- Spatial machine learning Modelling & prediction
- Interpolation & surfaces Modelling & prediction
- Location & accessibility Modelling & prediction
- Batch processing Production
- Pipelines & automation Production
- Performance & scale Production
- Cloud-native formats Production
- Testing, CI & Docker Production
- APIs & tile services Delivery & sharing
- Apps & dashboards Delivery & sharing
- Privacy & sensitive locations Governance & trust
- Metadata, licensing & provenance Governance & trust
- QGIS & PyQGIS Tools
- PostGIS & databases Tools
- DuckDB & analytic SQL Tools
Or follow a learning path
Curated routes in the order that builds on itself — concepts first, then each task, then the errors it produces.
-
Finding & Fetching Data
Get the data before you analyse it — from OSM, web services and satellite catalogues.
Follow the path → -
Spatial Statistics
Measure the pattern instead of eyeballing the map.
Follow the path → -
Terrain & Elevation
Turn a grid of heights into slope, shade, contours and drainage.
Follow the path → -
Networks & Routing
Distance along the street, not across the rooftops.
Follow the path → -
Raster Analysis
Read, reproject, clip and summarise raster data in Python.
Follow the path → -
Spatial SQL & PostGIS
Move the heavy lifting from Python into the database.
Follow the path → -
Making Maps
Turn a GeoDataFrame into a map someone else can read.
Follow the path → -
GIS Data Cleaning
Turn messy spatial data into analysis-ready datasets.
Follow the path → -
Batch Processing
Process many files at once, reliably.
Follow the path → -
Automation & Pipelines
Build repeatable, config-driven GIS pipelines.
Follow the path → -
QGIS Automation
Automate QGIS with PyQGIS and Processing models.
Follow the path → -
Satellite Imagery
From a scene on a catalogue to a number you can defend.
Follow the path → -
LiDAR & Point Clouds
Millions of points, and the surfaces worth deriving from them.
Follow the path → -
Cloud-Native GIS
Read the part you need, not the file it lives in.
Follow the path → -
Publishing Web Maps
Get the data into a browser without shipping the whole dataset.
Follow the path → -
Movement & Time
Tracks are not points — the order and the clock are the data.
Follow the path → -
Spatial Machine Learning
Why the usual rules break, and what to do instead.
Follow the path → -
Interpolation & Surfaces
A continuous surface from scattered samples, with its support attached.
Follow the path → -
Geocoding & Addresses
Address text is data too — and it is the messiest data in the file.
Follow the path → -
Cartography & Map Design
The map is correct. Now make it readable.
Follow the path → -
DuckDB for Spatial Data
A spatial database with no server, reading the file you already have.
Follow the path → -
Serving Spatial Data
The dataset is finished. Now other people need it over HTTP.
Follow the path → -
Maps, Apps & Dashboards
Let the reader ask their own question — within a budget.
Follow the path → -
Gridded & Climate Data
A raster with a time axis, a calendar and forty years in one file.
Follow the path → -
H3 & Global Grids
Give every point a cell id and half the geometry work becomes a join.
Follow the path → -
Census & Demographics
The most-used open data there is, and the easiest to map wrongly.
Follow the path → -
Location & Accessibility
Who can reach what — and where the next site should go.
Follow the path → -
Hydrology & Watersheds
A DEM already knows where the water goes. Ask it carefully.
Follow the path → -
Geoprivacy & Anonymisation
A coordinate is an identifier. Release it as if it were one.
Follow the path → -
Metadata, Licensing & Provenance
A layer nobody can describe, cite or re-run is a layer nobody should use.
Follow the path → -
3D & Buildings
A footprint plus a height is not a building, but it is most of one.
Follow the path → -
Coastal & Marine
The shoreline is a choice of datum, not a line on a map.
Follow the path → -
Agriculture & Crops
One field, one season, and a dozen ways to measure it wrong.
Follow the path → -
Public Transit & GTFS
A timetable is a graph that changes every minute.
Follow the path → -
Radar & SAR Imagery
It sees through cloud, and none of the numbers mean what they look like.
Follow the path → -
Biodiversity & Species Data
A map of occurrence records is a map of where people looked.
Follow the path → -
Linear Referencing
The road is one-dimensional, and its data is numbered accordingly.
Follow the path → -
Natural Hazards & Risk
A hazard map is not a risk map, and the difference is arithmetic.
Follow the path → -
Air Quality Data
Every air quality number is a pollutant, a unit, a period and a place — and the place is the hard part.
Follow the path → -
Renewable Energy Siting
The resource picks the country; the grid and the ground pick the field.
Follow the path → -
Urban Morphology
Every measure of a city is a measure of its footprints, its land unit and its boundary.
Follow the path → -
Forest Monitoring
A forest number is a threshold, a release, a pixel area and a period before it is a forest.
Follow the path → -
Urban Heat Mapping
A heat map is a surface, a moment and a reference — and none of them is the air people breathe at night.
Follow the path →
Every fix, A–Z
Page 1 — use the page links below, or browse by topic above.
- A 3D viewer shows nothing or a black screen 3d viewer shows nothing
- A building mesh is not watertight and its volume is wrong mesh not watertight volume
- A coastline or EEZ breaks at the antimeridian antimeridian polygon problem
- A crop classifier confuses two crops every year crop classifier confuses classes
- A downloaded layer has no licence you can find layer has no licence
- A GBIF download is missing records gbif download missing records
- A GTFS query returns no trips, or the wrong trips, on a date gtfs no trips on date
- A hazard raster's nodata is read as zero hazard raster nodata as zero
- A LAZ File Will Not Open in Python laz file will not open
- A point snaps to the wrong carriageway point snaps wrong carriageway
- A prescription map is rejected by the machine controller prescription map not loading
- A range polygon has the wrong shape range polygon wrong shape
- A richness map is a map of sampling effort richness map sampling effort
- A SAR flood map shows water where there is none sar flood map false positives
- A SAR image looks noisy after processing sar image noisy speckle
- A SAR image looks stretched or smeared in mountains sar distortion mountains layover
- A shared file still contains the original coordinates file still contains original coordinates
- A species distribution model scores well and predicts badly sdm auc spatial cross validation
- A STAC item is rejected by the validator stac item validation error
- A yield map has impossible values and stripes yield map stripes impossible values
- Air Quality Data Gaps and Negative Values negative air quality values
- AIS tracks jump across the world ais track jumps
- An event's measure falls outside the route milepost outside route range
- An inundation map floods inland areas that cannot flood bathtub inundation wrong
- Anonymised points still identify individuals anonymised points still identify
- AQI Averaged the Wrong Way average aqi values wrong
- Batch GIS Job Slows Down and Runs Out of Memory: How to Fix It batch job memory leak python
- Batch Job Gives Different Results Each Run: How to Fix It gis batch non deterministic output
- Batch Output Files Keep Overwriting Each Other: How to Fix It batch output files overwriting
- Batch Script Stops at the First Bad File: How to Keep It Running batch script stops on error