Analysis
Getting from a raw download to something you can put in front of someone.
Topics in Analysis
7 topics, 187 guides. Each topic page groups the concepts, the how-to guides and the fixes for that subject.
-
Data cleaning
Turning a messy download into an analysis-ready dataset you can trust.
10 concepts · 24 how-to · 11 fixes → -
Raster & rasterio
Reading, sampling and converting raster data in Python.
8 concepts · 29 how-to · 8 fixes → -
Maps & visualisation
Static plots, choropleths, interactive maps, and exporting images people can use.
8 concepts · 18 how-to · 7 fixes → -
Spatial statistics
Density, clustering, hotspots and autocorrelation — measuring pattern rather than drawing it.
5 concepts · 8 how-to · 4 fixes → -
Terrain & elevation
Working with DEMs: slope, aspect, hillshade, contours, profiles and drainage.
4 concepts · 10 how-to · 4 fixes → -
Movement & time
GPS tracks and trajectories: cleaning them, segmenting them, and measuring what moved where.
4 concepts · 8 how-to · 2 fixes → -
Web maps & tiles
Getting a dataset into a browser: tile pyramids, vector tiles, PMTiles and MapLibre styling.
4 concepts · 8 how-to · 3 fixes →
Every guide in Analysis
Grouped by topic. A guide that spans two topics appears under both.
Data cleaning 45 guides
- How to Remove Null and Empty Geometries in GeoPandas remove null geometries geopandas
- How to Fix Invalid Geometries in Python (GeoPandas) invalid geometries geopandas
- Why Are My Shapefile Column Names Truncated? How to Fix It shapefile column names truncated
- The Python GIS Data Cleaning Checklist: From Raw Download to Analysis-Ready gis data cleaning python
- How to Find and Remove Duplicate Geometries in GeoPandas remove duplicate geometries geopandas
- How to Clean Messy CSV Coordinates into a Reliable GeoDataFrame clean csv coordinates
- How to Standardise and Repair CRS Across a Folder of Files in Python standardise crs across files python
- How to Clean and Normalise Attribute Columns in a GeoDataFrame clean attribute columns geodataframe
- How to Handle Missing and Null Values in Spatial Datasets in Python handle missing values spatial data python
- How to Snap and Align Geometries to Fix Slivers and Gaps in Python snap geometries fix slivers python
- How to Validate a GeoDataFrame Against a Schema Before Analysis validate geodataframe schema python
- How to Build a Repeatable Data-Cleaning Report in GeoPandas data cleaning report geopandas
- buffer(0) Does Not Fix My Invalid Geometry: What to Do Instead buffer 0 not fixing geometry
- Garbled Attribute Text and UnicodeDecodeError from a Shapefile: How to Fix Encoding shapefile encoding error python
- GeoPandas to_file() Fails on a Column Type: How to Fix It geopandas to_file field type error
- How to Split Multipart Geometries into Single Parts in GeoPandas explode multipart geometries geopandas
- How to Fuzzy-Match Place Names When Joining Spatial Data in Python fuzzy match place names python
- How to Find and Remove Spatial Outliers in a Point Dataset remove spatial outliers python
- How to Clean and Standardise Date Columns in Spatial Data clean date columns spatial data python
- Spatial Data Quality: The Six Dimensions That Matter spatial data quality dimensions
- Null, Empty, Missing and Invalid: Four Kinds of Broken Geometry empty geometry geopandas
- How to Explore a Spatial Dataset You Have Never Seen Before explore spatial dataset python
- Rasterio Returns the Wrong Values: NoData, Scaling and dtype Fixes rasterio nodata wrong values
- Topological Coverage: What "Clean" Means for Adjacent Polygons polygon coverage gaps overlaps
- Repair, Reject or Flag? Choosing What Cleaning Should Do gis data cleaning decisions
- How to Find and Fix Gaps and Overlaps in a Polygon Coverage fix gaps overlaps polygons python
- How to Merge Near-Duplicate Features in a Spatial Dataset merge near duplicate features python
- How to Clean a Line Network: Dangles, Overshoots and Disconnects clean road network topology python
- How to Standardise Attribute Values Against a Controlled Vocabulary standardise attribute values python
- My Cleaned Layer Has More Rows Than the Original: How to Fix It geopandas more rows after cleaning
- Choropleth Classification Explained: Quantiles, Equal Interval and Natural Breaks choropleth classification schemes
- My GeoPandas Choropleth Colours Look Wrong: How to Fix It geopandas choropleth colours wrong
- Test Fixtures for GIS Code: Building Spatial Test Data You Can Trust gis test fixtures python
- How to Set, Assign and Convert CRS in GeoPandas (set_crs vs to_crs) set_crs vs to_crs geopandas
- How to Reproject Between Datums Correctly (and Why the Grid File Matters) datum transformation python pyproj
- Spatial Join Cardinality Explained: One-to-One, One-to-Many and What to Do spatial join one to many
- Attribute Join or Spatial Join? Choosing How to Combine Two Layers attribute join vs spatial join
- How to Geocode Addresses in Python geocode addresses python
- Geocoding Returns Wrong or Missing Coordinates geocoding wrong coordinates
- The Modifiable Areal Unit Problem Explained modifiable areal unit problem
- Spatial Autocorrelation Explained spatial autocorrelation explained
- My Time Column Sorts or Joins Wrongly spatial time column timezone errors
- How to Clean a GPS Track: Outliers, Duplicates and Jumps clean gps track python
- My Track Has Impossible Speeds or Teleports track impossible speeds
- How to Resample and Interpolate a Track to a Fixed Interval resample gps track python
Raster & rasterio 45 guides
- Vector vs Raster Data in Python GIS: Key Differences vector raster data python gis
- Introduction to Rasterio: Reading Raster Data in Python rasterio python tutorial
- How to Extract Raster Values at Point Locations with Rasterio extract raster values rasterio
- How to Convert a Raster to a Vector in Python raster to vector python
- RasterioIOError: Not Recognized as a Supported File Format (How to Fix) rasterioioerror supported file format
- How to Batch Process Rasters with Rasterio in Python batch process rasters rasterio python
- Rasterio Returns the Wrong Values: NoData, Scaling and dtype Fixes rasterio nodata wrong values
- The Raster Data Model Explained: Bands, dtype, NoData and the Transform raster data model python
- Raster Resampling Explained: Nearest, Bilinear and When Each Is Wrong raster resampling methods
- How to Reproject a Raster in Python with Rasterio reproject raster rasterio
- How to Clip a Raster to a Polygon in Python clip raster to polygon python
- How to Calculate Zonal Statistics in Python zonal statistics python
- How to Rasterize a Vector Layer in Python rasterize vector python
- How to Merge and Mosaic Rasters in Python with Rasterio merge rasters rasterio mosaic
- Raster and Vector Do Not Line Up in Python: How to Fix It raster vector not aligned python
- Rasterio Output GeoTIFF Is Black or Empty: How to Fix It rasterio output black empty
- STAC Explained: How Satellite Imagery Catalogues Work stac explained
- How to Search and Download Satellite Imagery with STAC in Python download satellite imagery python
- Digital Elevation Models Explained: DEM, DSM and DTM dem dsm dtm explained
- Slope and Aspect Explained: How They Are Computed from a Grid slope aspect explained
- How to Calculate Slope and Aspect from a DEM in Python calculate slope python dem
- How to Generate Contour Lines from a DEM in Python generate contours python
- How to Extract an Elevation Profile Along a Line in Python elevation profile python
- How to Fill Sinks and Derive Flow Direction from a DEM fill sinks flow direction python
- How to Calculate a Viewshed in Python viewshed python
- How to Load Sentinel-2 Bands into Python as an Analysis-Ready Array load sentinel2 bands python
- Satellite Bands Have Different Shapes or Do Not Align satellite bands do not align
- How to Resample Satellite Bands to a Common Grid resample satellite bands python
- How to Calculate NDVI from Sentinel-2 in Python calculate ndvi python
- NDVI Values Are Above 1 or Below −1: How to Fix It ndvi values out of range
- How to Mask Clouds in Sentinel-2 Imagery with Python mask clouds sentinel2 python
- How to Build a Cloud-Free Composite from Many Satellite Scenes cloud free composite python
- My Composite Has Holes, Stripes or Grey Patches composite has holes or stripes
- How to Extract a Vegetation Index Time Series for a Polygon ndvi time series polygon python
- How to Detect Change Between Two Satellite Images in Python detect change satellite images python
- How to Rasterise a Point Cloud to a Grid in Python rasterise point cloud python
- Cloud-Optimised GeoTIFF Explained: Tiles, Overviews and Range Requests cloud optimised geotiff explained
- How to Read a COG from a URL Without Downloading the Whole File read cog from url python
- How to Write a Cloud-Optimised GeoTIFF in Python write cloud optimised geotiff python
- How to Sample Training Points from Rasters and Polygons sample training points python
- How to Predict a Continuous Surface with Random Forest random forest spatial prediction python
- How to Turn Model Predictions Back into a Raster predictions to raster python
- My Prediction Raster Is Striped, Blocky or Full of NoData prediction raster artefacts
- How to Interpolate Points to a Grid with IDW in Python idw interpolation python
- How to Choose a Cell Size for an Interpolated Surface choose cell size interpolation
Maps & visualisation 33 guides
- How to Plot Maps in Python with GeoPandas and Matplotlib plot map geopandas matplotlib
- How to Create Interactive Maps in Python with Folium folium interactive maps python
- How to Create a Choropleth Map in Python with GeoPandas choropleth map geopandas
- How to Save a Map as an Image in Python with Matplotlib save map image matplotlib python
- Why Does My GeoPandas Map Look Upside Down? geopandas map upside down
- Why Is My GeoPandas Plot Blank or Empty? How to Fix It geopandas plot blank
- How to Style Layers and Export Map Layouts from PyQGIS qgis export layout python
- My Points Plot in the Ocean: Fixing Swapped Latitude and Longitude points plotting in the ocean geopandas
- How QGIS Styling Works: Renderers, Symbols and Rules qgis renderer symbol explained
- Choosing a Map Projection for Display: What Web Mercator Distorts map projection for display python
- Choropleth Classification Explained: Quantiles, Equal Interval and Natural Breaks choropleth classification schemes
- How to Add a Basemap to a GeoPandas Map with contextily geopandas basemap contextily
- How to Add Legends, Labels and a Scale Bar to a GeoPandas Map geopandas map legend labels
- How to Plot Multiple Layers on One Map in GeoPandas plot multiple layers geopandas
- How to Batch-Generate a Map Image for Every Region in Python batch generate maps python
- My GeoPandas Choropleth Colours Look Wrong: How to Fix It geopandas choropleth colours wrong
- My Folium Map Is Blank or Will Not Display: How to Fix It folium map not showing
- How to Set Up Jupyter for Python GIS Work jupyter python gis setup
- Your First Python GIS Analysis: From Download to Map in One Script first python gis analysis
- Kernel Density Explained: What a Heatmap Actually Shows kernel density explained
- How to Make a Point Density Heatmap in Python point density heatmap python
- Your Heatmap Looks Wrong: KDE Bandwidth and Cell Size kde bandwidth wrong
- How to Find Hotspots with Getis-Ord Gi* in Python getis ord hotspot python
- How to Make a Hillshade from a DEM in Python hillshade python
- Hillshade Looks Flat, Washed Out or Inverted hillshade inverted
- Isochrones Explained: Travel Time Areas and What They Assume isochrones explained
- How to Generate Isochrones in Python generate isochrones python
- Web Map Tiles Explained: XYZ, Zoom Levels and the Tile Pyramid web map tiles explained
- Vector Tiles Explained: MVT, Layers and Why They Are Not GeoJSON vector tiles explained
- How to Prepare a GeoDataFrame for the Web prepare geodataframe for web
- How to Style Data-Driven Colours in a Web Map data driven web map styling
- How to Add Interactivity and Popups to a Web Map web map popups interactivity
- How to Animate Movement Over Time in Python animate movement python
Spatial statistics 17 guides
- The Modifiable Areal Unit Problem Explained modifiable areal unit problem
- Kernel Density Explained: What a Heatmap Actually Shows kernel density explained
- How to Make a Point Density Heatmap in Python point density heatmap python
- Your Heatmap Looks Wrong: KDE Bandwidth and Cell Size kde bandwidth wrong
- How to Bin Points into Hexagons in Python hexbin points python
- Spatial Clustering Explained: DBSCAN, K-Means and What They Assume spatial clustering explained
- How to Cluster Points by Location with DBSCAN in Python dbscan spatial clustering python
- DBSCAN Returns One Giant Cluster or Labels Everything Noise dbscan one cluster
- How to Build a Distance Matrix Between Two Layers in Python distance matrix geopandas
- Spatial Autocorrelation Explained spatial autocorrelation explained
- How to Calculate Moran's I in Python morans i python
- Spatial Weights Warn About Islands or Moran's I Returns nan spatial weights islands warning
- How to Find Hotspots with Getis-Ord Gi* in Python getis ord hotspot python
- How to Build Spatial Features for a Machine Learning Model build spatial features python
- The Variogram Explained: How Far Does a Measurement Reach variogram explained
- How to Fit a Variogram and Krige a Surface in Python kriging python
- My Kriging Fit Fails or Returns a Flat Surface kriging fit fails flat surface
Terrain & elevation 18 guides
- Digital Elevation Models Explained: DEM, DSM and DTM dem dsm dtm explained
- Vertical Datums Explained: Why Your Elevations Are Off vertical datum explained
- Slope and Aspect Explained: How They Are Computed from a Grid slope aspect explained
- How to Calculate Slope and Aspect from a DEM in Python calculate slope python dem
- Slope Values Are Wrong or Absurdly Steep slope values wrong
- How to Make a Hillshade from a DEM in Python hillshade python
- Hillshade Looks Flat, Washed Out or Inverted hillshade inverted
- How to Generate Contour Lines from a DEM in Python generate contours python
- Contours Come Out Jagged or Full of Tiny Rings contours jagged noisy
- How to Extract an Elevation Profile Along a Line in Python elevation profile python
- How to Fill Sinks and Derive Flow Direction from a DEM fill sinks flow direction python
- How to Calculate a Viewshed in Python viewshed python
- DSM, DTM and CHM from LiDAR: How Each Surface Is Derived lidar surfaces dsm dtm chm explained
- How to Create a DTM from LiDAR Ground Points in Python create dtm from lidar python
- My LiDAR DTM Has Holes, Spikes or Terraces lidar dtm holes and spikes
- How to Create a Canopy Height Model from LiDAR canopy height model python
- How to Measure Building Heights from LiDAR in Python building heights from lidar python
- How to Build a TIN and Interpolate Elevations tin interpolation python
Movement & time 14 guides
- Trajectories Explained: What Makes a Track Different from Points trajectories explained
- Sampling Rate and Gaps Explained: How Often Is Often Enough gps sampling rate explained
- GPS Error Explained: Why Your Track Wanders gps error explained
- How to Load GPS Tracks into Python as Trajectories load gps tracks python
- My Time Column Sorts or Joins Wrongly spatial time column timezone errors
- How to Clean a GPS Track: Outliers, Duplicates and Jumps clean gps track python
- My Track Has Impossible Speeds or Teleports track impossible speeds
- How to Calculate Speed, Distance and Direction Along a Track speed distance direction track python
- Stops, Trips and Segmentation Explained stops trips segmentation explained
- How to Split a Track into Trips and Stops in Python split track into trips python
- How to Resample and Interpolate a Track to a Fixed Interval resample gps track python
- How to Map-Match a GPS Track to a Street Network map match gps track python
- How to Aggregate Movement into Flows Between Zones aggregate movement flows python
- How to Animate Movement Over Time in Python animate movement python
Web maps & tiles 15 guides
- Web Map Tiles Explained: XYZ, Zoom Levels and the Tile Pyramid web map tiles explained
- Vector Tiles Explained: MVT, Layers and Why They Are Not GeoJSON vector tiles explained
- Generalisation for Zoom Levels Explained zoom generalisation explained
- How to Prepare a GeoDataFrame for the Web prepare geodataframe for web
- My GeoJSON Is Too Big for the Browser geojson too big for browser
- How to Build Vector Tiles from a GeoDataFrame in Python build vector tiles python
- PMTiles and MBTiles Explained: Tile Archives Without a Server pmtiles mbtiles explained
- How to Serve a Web Map from PMTiles with MapLibre serve pmtiles maplibre
- My Web Map Is Blank or the Layer Never Appears web map layer not appearing
- My Tiles Are Offset or in the Wrong Place tiles are offset or misplaced
- How to Render Raster Tiles from a COG in Python raster tiles from cog
- How to Export a Static Tile Pyramid for Offline Use export static tile pyramid python
- How to Style Data-Driven Colours in a Web Map data driven web map styling
- How to Add Interactivity and Popups to a Web Map web map popups interactivity
- How to Publish a GeoJSON API from a GeoDataFrame with FastAPI geojson api fastapi python