Fundamentals
What the objects, files and libraries actually are.
Topics in Fundamentals
4 topics, 162 guides. Each topic page groups the concepts, the how-to guides and the fixes for that subject.
-
Getting started
A working install, your first GeoDataFrame, and what Python GIS is for.
10 concepts · 9 how-to · 5 fixes → -
Files & formats
Reading and writing shapefiles, GeoPackages, GeoJSON and CSV — and what breaks in each.
19 concepts · 39 how-to · 24 fixes → -
Data sources & downloads
Getting the data in the first place: OpenStreetMap, web services, satellite catalogues and geocoders.
10 concepts · 16 how-to · 7 fixes → -
Geocoding & addresses
Turning address text into coordinates, and coordinates back into places — with the match quality attached.
6 concepts · 11 how-to · 6 fixes →
Every guide in Fundamentals
Grouped by topic. A guide that spans two topics appears under both.
Getting started 24 guides
- What Is a GeoDataFrame? Structure and Key Concepts geodataframe python
- Shapely Basics: Working with Geometry Objects in Python shapely python geometry
- 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
- GeoPandas Installation Fails: How to Fix Common Errors geopandas installation error
- Fiona ImportError When Using GeoPandas: How to Fix It fiona importerror geopandas
- Python for GIS: What It Is and When to Use It python for gis
- GeoPandas Basics: Working with Spatial Data in Python geopandas basics
- PyQGIS vs GeoPandas: Which to Use for GIS Automation pyqgis vs geopandas
- What GDAL and OGR Actually Are (and Why Everything Depends on Them) what is gdal ogr
- How to Set Up a Python GIS Environment That Actually Works python gis environment setup
- How to Explore a Spatial Dataset You Have Never Seen Before explore spatial dataset python
- Reproducible GIS Environments Explained: conda, pip, Lockfiles and Docker reproducible gis environment python
- GDAL and GeoPandas Fail Inside Docker: How to Fix the Build geopandas gdal docker build fails
- How to Open Any Spatial File in Python When You Do Not Know the Format open any spatial file python
- 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
- GIS Data Sources Explained: Where Spatial Data Comes From gis data sources
- How to Download Administrative Boundaries in Python download administrative boundaries python
- How to Install and Load the DuckDB Spatial Extension install duckdb spatial
- How to Move Data Between DuckDB and GeoPandas duckdb geopandas
- How to Open a NetCDF File in Python with xarray open netcdf python xarray
- Fixing xarray's "Did Not Find a Match in Any of xarray's Installed Backends" xarray did not find a match installed backends
- Fixing H3 AttributeError After Upgrading: the v3 to v4 API Rename h3 has no attribute geo_to_h3
Files & formats 82 guides
- How to Read GeoJSON in Python with GeoPandas read geojson python geopandas
- How to Read a CSV with Coordinates as a GeoDataFrame csv to geodataframe python
- How to Read and Write GeoPackage Files in Python geopackage python geopandas
- How to Connect GeoPandas to PostGIS geopandas postgis connection
- Fiona ImportError When Using GeoPandas: How to Fix It fiona importerror geopandas
- How to Read a Shapefile in Python with GeoPandas read shapefile geopandas
- How to Export GeoJSON in Python with GeoPandas export geojson geopandas
- GeoPandas Not Reading Shapefile: Common Causes and Fixes geopandas not reading shapefile
- Why Are My Shapefile Column Names Truncated? How to Fix It shapefile column names truncated
- RasterioIOError: Not Recognized as a Supported File Format (How to Fix) rasterioioerror supported file format
- GeoPandas "No Geometry Column" Error: How to Fix It geopandas no geometry column
- How to Clean Messy CSV Coordinates into a Reliable GeoDataFrame clean csv coordinates
- How to Batch Convert Shapefiles to GeoPackage in Python batch convert shapefile to geopackage python
- How to Merge Many Shapefiles into One File in Python merge multiple shapefiles python geopandas
- How to Batch Export a GeoDataFrame to Multiple Formats in Python export geodataframe multiple formats python
- How to Move Data Between QGIS and GeoPandas qgis geopandas data exchange
- Python glob Is Not Finding All My Shapefiles: How to Fix It glob not finding files python
- 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
- Mixed Geometry Types Error When Saving a GeoDataFrame: How to Fix It mixed geometry types geopandas
- How to Reduce GIS File Size in Python Without Wrecking the Data reduce gis file size python
- How to Package GIS Deliverables into Zipped Bundles with Python package gis deliverables zip python
- WKT, WKB and GeoJSON: How Geometry Is Actually Stored wkt wkb geojson difference
- GIS Vector File Formats Compared: Shapefile, GeoPackage, GeoJSON, Parquet gis vector file formats compared
- What GDAL and OGR Actually Are (and Why Everything Depends on Them) what is gdal ogr
- Fiona vs pyogrio: How GeoPandas Reads and Writes Files fiona vs pyogrio
- QGIS Data Providers Explained: How QGIS Reads Any Data Source qgis data provider explained
- PostGIS Explained: When a Spatial Database Beats a Folder of Files postgis vs shapefile when to use
- How to Write a GeoDataFrame to PostGIS write geodataframe to postgis
- How PostGIS Stores Geometry: SRID, EWKB and the Typed Column postgis geometry column srid
- How to Set Up a Python GIS Environment That Actually Works python gis environment setup
- How to Standardise Attribute Values Against a Controlled Vocabulary standardise attribute values python
- The Raster Data Model Explained: Bands, dtype, NoData and the Transform raster data model python
- Rasterio Output GeoTIFF Is Black or Empty: How to Fix It rasterio output black empty
- PostGIS "relation does not exist" and Permission Errors: How to Fix Them postgis relation does not exist
- How to Test a GIS Script That Reads and Writes Files test gis file io pytest
- GeoParquet and Columnar Storage Explained: Why It Reads So Much Faster geoparquet explained python
- How to Work with a Custom or Local CRS in Python custom crs proj string python
- How to Open Any Spatial File in Python When You Do Not Know the Format open any spatial file python
- The OpenStreetMap Data Model Explained for Python Users openstreetmap data model
- How to Download OpenStreetMap Data in Python with OSMnx download openstreetmap python
- How to Query the Overpass API from Python overpass api python
- Spatial Web Services Explained: WFS, WMS and OGC API Features wfs wms explained
- How to Download Data from a WFS Service in Python download wfs python
- GeoJSON Downloaded from an API Is Empty or Truncated api geojson truncated
- LAS, LAZ and COPC Explained: How Point Clouds Are Stored las laz copc explained
- How to Read a LAS or LAZ File in Python with laspy read las laz python laspy
- A LAZ File Will Not Open in Python laz file will not open
- GDAL Cannot Open an S3 or HTTPS Path gdal cannot open s3 url
- How to Write Partitioned GeoParquet and Query It with Filters partitioned geoparquet python
- PMTiles and MBTiles Explained: Tile Archives Without a Server pmtiles mbtiles explained
- How to Load GPS Tracks into Python as Trajectories load gps tracks python
- Fixing Addresses That Break on Accents and Encoding address encoding accents
- Fixing Missing or Substituted Fonts in an Exported Map PDF map pdf fonts missing
- How to Read Shapefiles, GeoJSON and GeoParquet in DuckDB duckdb read spatial files
- Fixing ST_Read Failures on Spatial Files in DuckDB duckdb st_read fails
- Fixing a Geometry Column Lost on Export from DuckDB duckdb geometry lost export
- GeoJSON, Vector Tiles or Parquet: Choosing an API Response Format api response format geojson
- How to Add a Download Button for Filtered Spatial Data download button spatial data app
- Fixing an Uploaded File That Breaks a Map App uploaded file breaks map app
- NetCDF and Gridded Data Explained: Dimensions, Variables and Attributes netcdf explained
- CF Conventions Explained: How a NetCDF File Says What Its Numbers Mean cf conventions netcdf
- How to Open a NetCDF File in Python with xarray open netcdf python xarray
- How to Convert NetCDF to GeoTIFF in Python netcdf to geotiff python
- GRIB, NetCDF or Zarr: Choosing a Format for Gridded Data grib netcdf zarr difference
- How to Read GRIB Weather Forecast Data in Python read grib python cfgrib
- Fixing xarray's "Did Not Find a Match in Any of xarray's Installed Backends" xarray did not find a match installed backends
- How to Compact an H3 Cell Set to Store a Region Cheaply h3 compact cells
- How to Download Census Boundaries in Python download census tract shapefile python
- Fixing Census Joins That Fail Because Leading Zeros Were Dropped census geoid leading zeros join fails
- How to strip GPS coordinates from photo metadata in Python strip exif gps python
- A shared file still contains the original coordinates file still contains original coordinates
- How to write a metadata record for a dataset in Python write spatial metadata python
- How to read the metadata already inside your spatial files read gis file metadata python
- How to store metadata inside a GeoPackage geopackage metadata python
- Metadata disappears when you convert the file metadata lost format conversion
- Level of detail explained for 3D city models lod 3d city model
- CityJSON and CityGML explained cityjson citygml explained
- How to read a CityJSON city model in Python read cityjson python
- How to export a 3D city model to glTF in Python export gltf python gis
- How to write a variable-rate prescription map variable rate prescription map
- A prescription map is rejected by the machine controller prescription map not loading
Data sources & downloads 33 guides
- GIS Data Sources Explained: Where Spatial Data Comes From gis data sources
- The OpenStreetMap Data Model Explained for Python Users openstreetmap data model
- How to Download OpenStreetMap Data in Python with OSMnx download openstreetmap python
- How to Query the Overpass API from Python overpass api python
- OSMnx Download Fails, Hangs or Times Out osmnx timeout error
- Spatial Web Services Explained: WFS, WMS and OGC API Features wfs wms explained
- How to Download Data from a WFS Service in Python download wfs python
- How to Download Administrative Boundaries in Python download administrative boundaries python
- GeoJSON Downloaded from an API Is Empty or Truncated api geojson truncated
- How to Geocode Addresses in Python geocode addresses python
- Geocoding Returns Wrong or Missing Coordinates geocoding wrong coordinates
- STAC Explained: How Satellite Imagery Catalogues Work stac explained
- How to Search and Download Satellite Imagery with STAC in Python download satellite imagery python
- How to Cache Downloaded GIS Data So You Fetch It Once cache downloaded gis data
- How to Build a Street Network Graph in Python with OSMnx street network graph python
- Your Street Network Graph Is Disconnected or Missing Streets osmnx graph disconnected
- Sentinel-2 or Landsat? Choosing a Satellite Imagery Source sentinel 2 vs landsat explained
- How to Read Spatial Data from S3 and Other Object Storage read spatial data from s3 python
- Geocoding Explained: From an Address String to a Coordinate geocoding addresses explained
- Choosing a Geocoder: Coverage, Licence and Cost Compared choosing a geocoder
- How to Geocode with Nominatim from Python Without Being Blocked nominatim python geocode
- How to Read GRIB Weather Forecast Data in Python read grib python cfgrib
- Census Geographies Explained: Blocks, Tracts, Output Areas and Why They Nest census geography hierarchy explained
- How to Download Census Boundaries in Python download census tract shapefile python
- How to Download Census Tables from an API in Python census api python acs
- Fixing Census API Values Like −666666666 and Other Sentinels census api -666666666
- Fixing Census Data That Does Not Match the Boundary File Year census data boundaries mismatch year
- Open data licences explained for spatial data open data licence gis
- How to check licence compatibility before combining datasets licence compatibility gis python
- How to publish a dataset with a citable identifier publish dataset doi python
- A downloaded layer has no licence you can find layer has no licence
- How to fetch and align tide gauge data in Python tide gauge data python
- Field boundary data explained: where it comes from field boundary data
Geocoding & addresses 23 guides
- How to Fuzzy-Match Place Names When Joining Spatial Data in Python fuzzy match place names python
- How to Geocode Addresses in Python geocode addresses python
- Geocoding Returns Wrong or Missing Coordinates geocoding wrong coordinates
- Geocoding Explained: From an Address String to a Coordinate geocoding addresses explained
- The Address Data Model: Why an Address Is Not a String address data model
- How to Parse and Normalise Addresses in Python parse addresses python
- Choosing a Geocoder: Coverage, Licence and Cost Compared choosing a geocoder
- How to Geocode with Nominatim from Python Without Being Blocked nominatim python geocode
- Match Quality Explained: Reading a Geocoder's Confidence Score geocoder match quality
- Rooftop, Interpolated or Centroid: Geocoding Precision Levels geocoding precision levels
- How to Batch Geocode Thousands of Addresses in Python batch geocode addresses python
- How to Cache Geocoding Results So a Rerun Costs Nothing cache geocoding results
- How to Validate Geocoding Results Before You Trust Them validate geocoding results
- How to Reverse Geocode Points to Addresses and Areas in Python reverse geocode python
- Address Matching Explained: Why Exact String Equality Fails address matching explained
- How to Match Addresses Against a Reference File in Python match addresses reference file
- How to Deduplicate an Address List in Python deduplicate addresses python
- How to Build an Offline Geocoder from Open Address Data offline geocoder python
- My Geocoder Returns No Match for Addresses That Exist geocoder returns no match
- Fixing 429 Too Many Requests When Geocoding geocoding 429 rate limit
- Fixing Geocodes That All Land in the Country Centroid geocodes country centroid
- Fixing Addresses That Break on Accents and Encoding address encoding accents
- Fixing a Geocoder That Matches the Wrong Town geocoder wrong town