Skip to main content

OSM Power Plants

CI PyPI version License: MIT Python 3.10+

Extract power plant data from OpenStreetMap for energy system modeling.

Installation

pip install osm-powerplants

Quick Start

Command Line

osm-powerplants process Germany France -o europe.csv

Python API

from osm_powerplants import process_units, get_config, get_cache_dir

df = process_units(
    countries=["Chile", "Greece"],
    config=get_config(),
    cache_dir=str(get_cache_dir(get_config())),
)

Why some plants are excluded

OSM is a crowd-sourced dataset, and many power=plant elements lack the metadata needed to plug them into an energy system model. Every OSM element that cannot be resolved into a usable unit is dropped from the output and recorded in a rejection report. The dominant reasons are:

Reason What it means
Missing output tag Plant has power=plant but no plant:output:electricity (and no source-specific capacity-estimation default in config.yaml). Very common on solar and geothermal farms.
Capacity placeholder value plant:output:electricity is set to a stub like yes instead of a number.
Capacity regex no match / Capacity non-numeric Capacity tag exists but cannot be parsed (unusual units, free-form text).
Missing source tag / Missing technology tag Cannot classify the plant — these can be relaxed with missing_technology_allowed: True in config.
Element within existing plant geometry A generator polygon lies inside an already-processed plant boundary (deduplication).

If a country returns fewer plants than you expected from overpass-turbo, set rejected_output_path to see exactly what was dropped and why:

config = get_config()
config["force_refresh"] = True  # rejection data is only populated on API fetches

df = process_units(
    countries=["Kenya"],
    config=config,
    cache_dir=str(get_cache_dir(config)),
    output_path="kenya.csv",
    rejected_output_path="kenya_rejected.csv",  # writes CSV + .geojson
)

The CSV lists each rejection with the OSM URL, coordinates, and reason code; the sibling GeoJSON can be loaded in JOSM or QGIS so OSM contributors can triage the gaps directly.

Output Format

Column Description
projectID OSM-based identifier
Name Plant name
Country Country name
lat, lon Coordinates
Fueltype Solar, Wind, Hydro, Nuclear, Natural Gas, etc.
Technology PV, Onshore, Run-Of-River, Steam Turbine, etc.
Set PP (power plant), Store (storage)
Capacity MW
DateIn Commissioning year

Documentation

Full documentation: https://open-energy-transition.github.io/osm-powerplants

Global dataset

A ready-to-use global dataset, regenerated monthly by CI, lives at the repo root:

Per-region outputs (one triplet per region) live under datasets/. Region definitions are in src/osm_powerplants/regions.py.

The CI workflow (.github/workflows/data.yml) runs on the 1st of each month: one parallel job per region (uploads artifacts) followed by a merge job that commits the global outputs.

Local regeneration:

python scripts/extract_region.py --region europe --clear-cache
python scripts/merge_global.py

Integration with powerplantmatching

This package provides OSM data for powerplantmatching. osm_global.csv is consumed by PPM's matching pipeline. The evaluation that selected which countries should include OSM by default lives in evaluation/ — see evaluation/osm_global_report.md for the methodology and findings.

The legacy osm_europe.csv at the repo root is frozen: it is retained only while the current PPM config still points to it and will be removed after the PPM PR that re-points to osm_global.csv merges.

Development

git clone https://github.com/open-energy-transition/osm-powerplants.git
cd osm-powerplants
pip install -e ".[dev]"
pre-commit install
pytest

Acknowledgments

This project is developed and maintained by Open Energy Transition, a company dedicated to accelerating the global energy transition through open-source tools and data.

License

MIT License - see LICENSE for details.

Data sourced from OpenStreetMap © OpenStreetMap contributors.

Release files for osm-powerplants 0.1.5

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for osm-powerplants 0.1.5
File Size Uploaded
osm_powerplants-0.1.5.tar.gz 203.3 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for osm-powerplants 0.1.5
File Interpreter ABI Platform
osm_powerplants-0.1.5-py3-none-any.whl Python 3 none any Details

Total release size: 286.6 kB

Release files / osm_powerplants-0.1.5.tar.gz

Download URL osm_powerplants-0.1.5.tar.gz
Size 203.3 kB
Tags Source
SHA-256 checksum
How to use checksums
9d92d81da80da6af411939a3252e605f1b0d39dd8fd9e4a471d4c8206a0fbfed
BLAKE2b-256 checksum
How to use checksums
bc2554c92f737942f077176fe69b865bfd1123b00d7018d66a28eea17fd7977a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.12

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Apr 23, 2026.

Transparency log

Release files / osm_powerplants-0.1.5-py3-none-any.whl

Download URL osm_powerplants-0.1.5-py3-none-any.whl
Size 83.3 kB
Tags Python 3
SHA-256 checksum
How to use checksums
13b5663cff9074733dfaf92fd665882563f8a2ead9ee2ba4d3f24c105cbe6a57
BLAKE2b-256 checksum
How to use checksums
5f763bf9d0ac80529b24eb189425b57d13f6f1dcaa6bac44cb84a3f392e06f93
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.12

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Apr 23, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.1.5 This release

2 release files

0.1.4

2 release files

0.1.3

2 release files

0.1.2

2 release files

0.1.1

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page