Recipe-driven spatial data downloader for Dutch geo-data
Project description
GISKit
Recipe-driven spatial data downloader for Netherlands geo-data
What is GISKit?
GISKit is a Python tool for downloading Dutch spatial data using simple JSON "recipes". Define what data you need and where you need it - GISKit handles the downloads and combines everything into a single GeoPackage.
Perfect for:
- Creating project underlays for construction/infrastructure projects
- Downloading base maps for GIS analysis
- Collecting spatial context data for locations
- Automating repetitive spatial data downloads
Key Features
- Recipe-Driven: Define your data needs in simple JSON
- PDOK Integration: Access to 50+ Dutch government spatial datasets
- Smart Downloads: Automatic bbox calculation from addresses
- Single Output: Everything combined in one GeoPackage
- CRS Handling: Automatic coordinate transformation
- Export Options: GeoPackage, GeoJSON, CityJSON, optional IFC/GLB
Quick Start
Installation
From PyPI (recommended):
pip install pygiskit
# With IFC export support (Python 3.10-3.12 only)
pip install pygiskit[ifc]
From source:
git clone https://github.com/sanderboer/py-giskit.git
cd py-giskit
pip install -e .
Your First Recipe
Create dam_square.json:
{
"name": "Dam Square Buildings",
"location": {
"type": "address",
"value": "Dam 1, Amsterdam",
"radius": 500
},
"datasets": [
{
"provider": "pdok",
"service": "bgt",
"layers": ["pand", "wegdeel"]
}
],
"output": {
"path": "./dam_square.gpkg",
"crs": "EPSG:28992"
}
}
Run it:
giskit run dam_square.json
Result: dam_square.gpkg with buildings and roads around Dam Square!
Recipe Examples
All examples are in the recipes/ directory. Try them out:
# Download buildings and infrastructure around Curieweg, Spijkenisse
giskit run recipes/curieweg_multi_service.json
# Amsterdam Dam Square with buildings
giskit run recipes/amsterdam_dam_square.json
# Simple bbox example
giskit run recipes/bbox_simple.json
Urban Planning Dataset
Comprehensive data for a project location:
{
"name": "Curieweg Project Underlay",
"location": {
"type": "address",
"value": "Curieweg 7a, Spijkenisse",
"radius": 1000
},
"datasets": [
{"provider": "pdok", "service": "bgt", "layers": ["pand", "wegdeel", "waterdeel"]},
{"provider": "pdok", "service": "bag", "layers": ["pand", "verblijfsobject"]},
{"provider": "pdok", "service": "cbs-wijken-buurten-2024", "layers": ["buurten"]},
{"provider": "pdok", "service": "bestuurlijkegebieden", "layers": ["gemeenten"]}
],
"output": {
"path": "./curieweg.gpkg",
"crs": "EPSG:28992"
}
}
Location Types
Address with buffer:
{
"location": {
"type": "address",
"value": "Curieweg 7a, Spijkenisse",
"radius": 1000
}
}
Point coordinates:
{
"location": {
"type": "point",
"value": [4.89, 52.37],
"crs": "EPSG:4326",
"radius": 500
}
}
Bounding box:
{
"location": {
"type": "bbox",
"value": [120700, 487000, 120950, 487250],
"crs": "EPSG:28992"
}
}
Available Data Sources
PDOK (Platform Digitale Overheid - Netherlands)
GISKit provides access to 50+ Dutch government datasets via PDOK's OGC API Features:
Base Registries (Basisregistraties):
- BGT - Large Scale Topography (54 layers: buildings, roads, water, terrain, etc.)
- BAG - Buildings and Addresses (buildings, addresses, residence objects)
- BAG3D - 3D Building Models (LoD 1.2, 1.3, 2.2 in CityJSON format)
- BRK - Cadastral Parcels
Infrastructure:
- NWB Roads - National Road Database (road segments, junctions)
- NWB Waterways - Waterway network
Statistics & Administration:
- CBS Neighborhoods 2024 - Statistical areas (neighborhoods, districts, municipalities)
- Administrative Boundaries - Municipalities, provinces, water boards
Environment:
- Protected Areas - Nature reserves, Natura 2000
- Soil Data - Soil types, contamination
See docs/PDOK_SERVICES.md for complete catalog with all layers.
Planned Providers
- OpenStreetMap - Global POI, buildings, roads via Overpass API
- AHN Elevation - Dutch elevation data via WCS
- Aerial Imagery - Luchtfoto via WMTS
CLI Commands
Run recipes:
# Execute a recipe
giskit run recipe.json
# Validate recipe syntax
giskit recipe validate recipe.json
Explore providers:
# List available providers and services
giskit providers list
# Show PDOK service details
giskit providers info pdok
# Search for specific data
giskit search "buildings"
Monitor API quirks:
# Show known API quirks for providers
giskit quirks list
# Show details for specific provider
giskit quirks show pdok ogc-features
# Monitor which quirks are being applied
giskit quirks monitor
Export Formats
Built-in formats:
- GeoPackage (
.gpkg) - default, recommended - GeoJSON (
.geojson) - Shapefile (
.shp) - CityJSON (
.json) - for 3D data
Optional IFC/GLB export:
Requires pip install giskit[ifc] (Python 3.10-3.12 only)
# Export GeoPackage to IFC
giskit export ifc data.gpkg output.ifc
# Convert IFC to GLB (for web viewers)
giskit export glb data.ifc output.glb
See notes/EXPORT_GUIDE.md for details.
How It Works
- Define - Write a JSON recipe with location and datasets
- Geocode - GISKit converts addresses to coordinates
- Download - Fetches data from PDOK OGC API Features
- Transform - Converts to target CRS if needed
- Combine - Merges all layers into single GeoPackage
┌──────────────┐
│ JSON Recipe │
└──────┬───────┘
│
▼
┌──────────────┐ ┌─────────────┐
│ Geocoding │─────▶│ PDOK Lookup │
└──────┬───────┘ └─────────────┘
│
▼
┌──────────────┐
│ Download │──────┬────────────────┐
└──────┬───────┘ │ │
│ ┌────▼────┐ ┌────▼────┐
│ │ BGT │ │ BAG │
│ │ (54 lyr)│ │ (3 lyr) │
│ └────┬────┘ └────┬────┘
▼ │ │
┌──────────────┐ │ │
│ Transform │◀─────┴────────────────┘
└──────┬───────┘
│
▼
┌──────────────┐
│ GeoPackage │
│ (.gpkg) │
└──────────────┘
Project Structure
giskit/
├── cli/ # Command-line interface
├── core/ # Recipe parsing, geocoding, spatial ops
├── protocols/ # OGC Features, WMTS, WCS protocols
├── providers/ # PDOK, OSM provider implementations
├── exporters/ # IFC/GLB export (optional)
└── config/ # YAML configurations for services
recipes/ # Example recipes ready to use
tests/ # 110+ unit and integration tests
Development
Running Tests
# All tests (110 passing)
pytest
# With coverage report
pytest --cov=giskit --cov-report=html
# Specific test suites
pytest tests/unit/
pytest tests/integration/
Code Quality
# Lint code
ruff check .
# Format code
ruff format .
Documentation
- docs/PDOK_SERVICES.md - Complete PDOK service catalog
- notes/EXPORT_GUIDE.md - IFC/GLB export instructions
- notes/QUIRKS_SYSTEM.md - API compatibility handling
- notes/BAG3D_ARCHITECTURE.md - 3D data handling
- CHANGELOG.md - Version history
For Contributors
- docs/publishing/ - PyPI publication guides
- notes/ - Technical implementation notes
Use Cases
Urban Planning:
- Project site context data (buildings, infrastructure, parcels)
- Statistical area boundaries for reports
- Base maps for presentations
Construction:
- Site underlay generation
- Existing infrastructure mapping
- Environmental constraints (protected areas, water)
GIS Analysis:
- Batch download base data for multiple locations
- Standardized data collection workflows
- Automated updates of project data
Research:
- Reproducible spatial data downloads
- Consistent data collection methodology
- Share data requirements via recipes
Contributing
Contributions welcome! This project is in active development.
- Check PLAN.md for current priorities
- Create an issue for discussion
- Submit a pull request
Credits
Built with:
- GeoPandas - Spatial data handling
- Shapely - Geometry operations
- httpx - Async HTTP client
- Typer - CLI framework
- Pydantic - Data validation
Data sources:
License
MIT License - See LICENSE
Made by A190
Simple recipes for Dutch spatial data
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file pygiskit-0.1.1.tar.gz.
File metadata
- Download URL: pygiskit-0.1.1.tar.gz
- Upload date:
- Size: 83.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
954b2d6b09420642cf538943e3ab45db677d1b7d59a9066ae492e019eca3c2fa
|
|
| MD5 |
ea5aa1e8ebe4099c00ec9285dc6d594f
|
|
| BLAKE2b-256 |
ad33808e16d4a3e7fbb3995bbf06010e917aaa76b40dbaf664d4fb1a5ebf8239
|
Provenance
The following attestation bundles were made for pygiskit-0.1.1.tar.gz:
Publisher:
publish-pypi.yml on sanderboer/py-giskit
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pygiskit-0.1.1.tar.gz -
Subject digest:
954b2d6b09420642cf538943e3ab45db677d1b7d59a9066ae492e019eca3c2fa - Sigstore transparency entry: 718862950
- Sigstore integration time:
-
Permalink:
sanderboer/py-giskit@d65ad937e995fe16a9c0476a9d5386ebbae4be5b -
Branch / Tag:
refs/heads/main - Owner: https://github.com/sanderboer
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-pypi.yml@d65ad937e995fe16a9c0476a9d5386ebbae4be5b -
Trigger Event:
push
-
Statement type:
File details
Details for the file pygiskit-0.1.1-py3-none-any.whl.
File metadata
- Download URL: pygiskit-0.1.1-py3-none-any.whl
- Upload date:
- Size: 102.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
612c81c1def3768e4e1f46edcbe07bf7090b1cc5ff5bcad7c30a813dd62af760
|
|
| MD5 |
f56f99861a13912c3ce4e86a5eb84e9b
|
|
| BLAKE2b-256 |
484aab8e4b6b93f91acac4931aaec727cf0933a316eae5928ebbd8d6ef6be570
|
Provenance
The following attestation bundles were made for pygiskit-0.1.1-py3-none-any.whl:
Publisher:
publish-pypi.yml on sanderboer/py-giskit
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pygiskit-0.1.1-py3-none-any.whl -
Subject digest:
612c81c1def3768e4e1f46edcbe07bf7090b1cc5ff5bcad7c30a813dd62af760 - Sigstore transparency entry: 718862959
- Sigstore integration time:
-
Permalink:
sanderboer/py-giskit@d65ad937e995fe16a9c0476a9d5386ebbae4be5b -
Branch / Tag:
refs/heads/main - Owner: https://github.com/sanderboer
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-pypi.yml@d65ad937e995fe16a9c0476a9d5386ebbae4be5b -
Trigger Event:
push
-
Statement type: