Concepts
Understand the core concepts behind spatial data in Python before diving into tasks and workflows.
Every practical GIS workflow rests on a small set of foundational ideas. What is a GeoDataFrame? What does a CRS actually do? How do raster and vector data differ, and when should you use each? These guides answer those questions directly — without padding, without assumed expertise.
If you're just starting with Python GIS, work through these pages first. They'll give you the vocabulary and mental models that make all the how-to guides easier to follow. If you're already working in the field, these pages make useful references when a concept needs refreshing.
The collection now runs the length of the learning paths. Alongside the starting points — GeoPandas, Shapely, CRS, EPSG codes, Rasterio, vector versus raster — you will find the concepts that decide whether a workflow survives production: what makes a geometry valid, why slivers and gaps appear, how doubles store coordinates, what GDAL actually is, how a spatial index makes a join fast, what the GIL does and does not block, what a pipeline is made of, and how the QGIS Processing framework and its data providers fit together.
Browse by topic
The fastest way in. Each topic page pairs these concepts with the tasks that use them and the errors they cause.
- Getting started Fundamentals 9 concepts
- Files & formats Fundamentals 9 concepts
- Geometry & topology Geometry & space 11 concepts
- CRS & projections Geometry & space 6 concepts
- Joins & relationships Geometry & space 5 concepts
- Data cleaning Analysis 8 concepts
- Raster & rasterio Analysis 4 concepts
- Maps & visualisation Analysis 4 concepts
- Batch processing Production 4 concepts
- Pipelines & automation Production 12 concepts
- Performance & scale Production 7 concepts
- Testing, CI & Docker Production 4 concepts
- QGIS & PyQGIS Tools 7 concepts
- PostGIS & databases Tools 4 concepts
Or follow a learning path
Curated routes in the order that builds on itself — concepts first, then each task, then the errors it produces.
-
Raster Analysis
Read, reproject, clip and summarise raster data in Python.
3 of its 14 steps are concepts → -
Spatial SQL & PostGIS
Move the heavy lifting from Python into the database.
4 of its 15 steps are concepts → -
Making Maps
Turn a GeoDataFrame into a map someone else can read.
3 of its 13 steps are concepts → -
GIS Data Cleaning
Turn messy spatial data into analysis-ready datasets.
5 of its 33 steps are concepts → -
Batch Processing
Process many files at once, reliably.
5 of its 26 steps are concepts → -
Automation & Pipelines
Build repeatable, config-driven GIS pipelines.
6 of its 26 steps are concepts → -
QGIS Automation
Automate QGIS with PyQGIS and Processing models.
7 of its 25 steps are concepts →
Every concept, A–Z
58 guides in total. Showing 1–30, page 1 of 2.
- Attribute Join or Spatial Join? Choosing How to Combine Two Layers attribute join vs spatial join
- Choosing a Map Projection for Display: What Web Mercator Distorts map projection for display python
- Choosing the Unit of Work in a Batch Job: File, Layer, Feature or Tile batch unit of work gis
- Choropleth Classification Explained: Quantiles, Equal Interval and Natural Breaks choropleth classification schemes
- Configuration vs Code: What Belongs in a Config File configuration vs code
- Coordinate Precision and Floating Point in GIS Explained coordinate precision gis floating point
- Coordinate Reference Systems (CRS) Explained for Python GIS coordinate reference systems python
- Cron, systemd, Airflow or CI? Choosing a Scheduler for GIS Jobs choosing a scheduler for python jobs
- EPSG Codes Explained: How to Choose the Right CRS in Python epsg codes python gis
- Expressions, Scripts, Models or Plugins? QGIS Extension Points Explained qgis plugin vs script vs model
- Failure Policy in Batch Processing: Fail Fast, Skip or Quarantine batch error handling policy
- Fiona vs pyogrio: How GeoPandas Reads and Writes Files fiona vs pyogrio
- GeoPandas Basics: Working with Spatial Data in Python geopandas basics
- GeoParquet and Columnar Storage Explained: Why It Reads So Much Faster geoparquet explained python
- GIS Vector File Formats Compared: Shapefile, GeoPackage, GeoJSON, Parquet gis vector file formats compared
- How PostGIS Stores Geometry: SRID, EWKB and the Typed Column postgis geometry column srid
- How QGIS Styling Works: Renderers, Symbols and Rules qgis renderer symbol explained
- How to Automate QGIS with Python (PyQGIS): The Complete Workflow automate qgis with python
- How to Create Interactive Maps in Python with Folium folium interactive maps python
- How to Make a GIS Workflow Reproducible in Python reproducible gis workflow python
- Idempotency Explained: Why a GIS Job Must Be Safe to Re-run idempotency data pipeline explained
- Incremental Processing: How a Batch Job Knows What Changed incremental batch processing gis
- Introduction to Rasterio: Reading Raster Data in Python rasterio python tutorial
- Logs, Metrics and Alerts: Observability for GIS Pipelines observability data pipeline logs metrics
- Nearest-Neighbour Joins Explained: Distance, Ties and Search Radius nearest neighbour join explained
- Null, Empty, Missing and Invalid: Four Kinds of Broken Geometry empty geometry geopandas
- Overlay Operations in GeoPandas: Union, Intersection, Difference Explained geopandas overlay operations
- PostGIS Explained: When a Spatial Database Beats a Folder of Files postgis vs shapefile when to use
- PostGIS Spatial Indexes Explained: GiST and the Two-Phase Filter postgis gist spatial index
- Projected vs Geographic CRS: What Actually Changes When You Reproject projected vs geographic crs