I was thinking of printing one that's like the California example (https://github.com/open-energy-transition/grid2poster/blob/m...). Where do people print posters nowadays?
Generate print-ready posters of electrical grid infrastructure from OpenStreetMap data.
Transmission lines for a country or continent are downloaded and rendered with GeoPandas, OSMnx, and Matplotlib. The project is heavily inspired and reused styling from maptoposter.
Grid2Poster supports countries, states, provinces and continents, as well as predefined regions.
Grid2Poster uses OpenStreetMap features tagged as:
power=linepower=minor_line when enabledpower=cable when enabledFeature completeness depends on OpenStreetMap coverage in the selected country or region.
Coverage and quality in your country can be improved by mapping transmission infrastructure directly in OpenStreetMap. MapYourGrid is a community initiative that coordinates this work. It provides tutorials, country-level completeness/quality statistics and mapping tools for tracing power lines, generators and substations from imagery.
python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
By default every run writes both a PNG and an SVG:
python create_grid_poster.py --country Portugal
For large countries, reduce the Overpass query tile size:
python create_grid_poster.py --country Vietnam --tile-size-km 150
Include distribution grids if available. Coverage various significatly across the globe:
python create_grid_poster.py --country Germany --include-minor-lines
List available themes. Create a new theme JSON file in the 'themes' directory to find your own style.
python create_grid_poster.py --list-themes
Use a local GeoJSON file as the boundary instead of geocoding (handy for custom regions or sub-national areas). All polygonal features in the file are dissolved into a single boundary. The --country value is still used for the poster title and output filename. --landscape will render in landscape (horizontal) orientation.
python create_grid_poster.py --country "Middle East and North Africa" --boundary-geojson ./regions/mena.geojson --landscape --theme neon_cyberpunk

Render an entire continent. Continent boundaries come from the Natural Earth admin-0 dataset (downloaded and cached on first use) because Nominatim does not resolve continent names. Accepted values are Africa, Antarctica, Asia, Europe, North America, Oceania, and South America. The aggregate name Global combines every inhabited continent.
python create_grid_poster.py --country Africa --tile-size-km 500
Continent-scale runs hit the Overpass API hundreds of times and can take several hours. A larger --tile-size-km cuts the number of queries; pick a value that still stays under the Overpass per-query size limit.
| Option | Default | Description |
|---|---|---|
--country |
- | Country or region name resolvable by Nominatim, a continent name (Africa, Antarctica, Asia, Europe, North America, Oceania, South America), or the aggregate Global |
--boundary-geojson |
- | Path to a local GeoJSON file with polygonal boundary features. Overrides the Nominatim/Natural Earth lookup. Useful for custom regions, sub-national areas, or offline workflows. |
--display-country |
value of --country |
Text to print on the poster. Useful when the geocoder name differs from the desired title. |
--subtitle |
ELECTRICAL TRANSMISSION GRID (or ELECTRICAL GRID with --include-minor-lines) |
Override the subtitle printed under the country/region name. |
--padding |
0.10 |
Fractional padding around the boundary bounds. Lower values zoom in (0 = tight fit, -0.05 = crop slightly into the bounds); higher values pull the view out. |
--theme |
paper_grid |
Theme ID from the themes/ directory. |
--list-themes |
- | List available themes and exit. |
--include-minor-lines |
off | Also fetch power=minor_line features. |
--include-cables / --no-include-cables |
on | Fetch power=cable features (underground/submarine). On by default; pass --no-include-cables to skip. |
--include-outlying |
off | Keep overseas territories and other polygons far from the main landmass. By default the geocoded boundary is filtered to the mainland (and nearby islands), so posters for countries like the Netherlands or France do not include Aruba, Curaçao, French Guiana, etc. |
--paper-size |
- | Named preset, portrait orientation. Overrides --width/--height. Choices: a5, a4, a3, a2, a1, a0, letter, legal, tabloid. Combine with --landscape to flip. |
--width |
297.0 |
Poster width in millimeters (default: A3 short side). |
--height |
420.0 |
Poster height in millimeters (default: A3 long side). |
--landscape |
off | Render in landscape (horizontal) orientation. Swaps width and height if width < height. |
--dpi |
300 |
Raster output DPI (applies to PNG output). |
--title-size |
auto | Title font size in points. Auto-scaled from poster size by default; set to override. |
--tile-size-km |
200 |
Overpass query tile size in kilometers. Use smaller values for very large countries or busy servers. |
--format |
png svg |
Output format(s): any combination of png, svg, pdf. Multiple values are written in one run. |
--output |
auto-generated in posters/ |
Output file path. When set, only a single file is written and its format is inferred from the extension. |
--crs |
EPSG:3857 |
Projection used for rendering. EPSG:3857 (Pseudo-Mercator) works well for country posters. |
--hide-metadata |
off | Do not print segment counts on the poster. |
--export-geojson |
off | Also save all transmission lines as a single GeoJSON in WGS84 (EPSG:4326). Pass a path to override the default location in posters/. |
--verbose-osmnx |
off | Print OSMnx request logs. |
Generated posters are written to the posters/ directory by default. Intermediate OSM responses and processed geometries are cached in cache/ to avoid repeated downloads.
| Poster | Country | Theme |
|---|---|---|
![]() |
China | paper_grid |
![]() |
South America | japanese_ink |
![]() |
India | japanese_ink |
![]() |
Pakistan | electric_midnight |
![]() |
Vietnam | midnight_blue |
![]() |
California | warm_beige |
![]() |
Mexico | forest |
![]() |
Italy | autumn |
![]() |
Zambia | sunset |
![]() |
Morocco | autumn |
![]() |
Latin America | emerald |
The regions/ directory ships with multi-country boundaries that map to common power-system groupings. Pass any of them via --boundary-geojson and set --country to the title you want printed on the poster:
python create_grid_poster.py --country "Continental Europe" --boundary-geojson ./regions/continental_europe.geojson --tile-size-km 300
| File | Coverage |
|---|---|
regions/continental_europe.geojson |
Continental Europe Synchronous Area - 31 countries: Albania, Austria, Belgium, Bosnia and Herzegovina, Bulgaria, Croatia, Czech Republic, Estonia, France, Germany, Greece, Hungary, Italy, Kosovo, Latvia, Lithuania, Luxembourg, Moldova, Montenegro, Netherlands, North Macedonia, Poland, Portugal, Romania, Serbia, Slovakia, Slovenia, Spain, Switzerland, Turkey, Ukraine. Includes Moldova and Ukraine (synchronized with CE in March 2022) and the Baltic states (Estonia, Latvia, Lithuania, synchronized in February 2025); excludes the Nordic, GB, Ireland, and Cyprus synchronous areas. |
regions/iberia.geojson |
Spain and Portugal. |
regions/latin_america.geojson |
Latin America and the Caribbean - 48 entries from Mexico south through Argentina and Chile, plus the Caribbean islands and overseas territories (e.g. Puerto Rico, French Guiana, Guadeloupe). |
regions/mediterranean.geojson |
22 countries bordering the Mediterranean: Albania, Algeria, Bosnia and Herzegovina, Croatia, Cyprus, Egypt, France, Greece, Israel, Italy, Lebanon, Libya, Malta, Monaco, Montenegro, Morocco, Palestine, Slovenia, Spain, Syria, Tunisia, Turkey. |
regions/mena.geojson |
Middle East and North Africa - 18 countries: Algeria, Bahrain, Egypt, Iraq, Israel, Jordan, Kuwait, Lebanon, Libya, Morocco, Oman, Palestine, Qatar, Saudi Arabia, Syria, Tunisia, United Arab Emirates, Yemen. |
regions/southeast_asia.geojson |
Brunei, Cambodia, Indonesia, Laos, Malaysia, Myanmar, Philippines, Singapore, Thailand, Timor-Leste, Vietnam. |
regions/uk_no_shetland.geojson |
United Kingdom with the Shetland Islands trimmed off for tighter framing. |
regions/us_canada_mainland.geojson |
Continental United States and Canadian mainland south of 60°N - excludes Alaska, the Canadian Arctic, Hawaii and offshore islands. |
regions/wapp.geojson |
West African Power Pool members - Benin, Burkina Faso, Côte d'Ivoire, Gambia, Ghana, Guinea, Guinea-Bissau, Liberia, Mali, Niger, Nigeria, Senegal, Sierra Leone, Togo. |
For ad-hoc areas (a single state, a metro region, a custom polygon), supply your own GeoJSON via --boundary-geojson. All polygonal features in the file are dissolved into one boundary.
Map data © OpenStreetMap contributors.