OpenStreetMap-derived data: method and offer
CEAtlas draws several map layers from OpenStreetMap, which is © OpenStreetMap contributors and licensed under the Open Database Licence. The OpenStreetMap-derived data in those layers is under the ODbL. Where a layer also carries other sources, we credit those under their own licences and supply the OpenStreetMap-derived part on request. Whether such a layer is one database or a collection of databases under the ODbL is not settled. This page is our notice under ODbL s.4.6: for every such layer it gives the exact queries and the processing rules that produce it from OpenStreetMap — enough to recreate it — and it offers a machine-readable copy of the layer's OpenStreetMap-derived data free of charge on request.
How to read the queries
Each block is the Overpass QL text the ETL sends to the public Overpass API, copied from the source. Sections 1–3 go through
etl/download_global.py::overpass_query; the other sections' downloaders each carry their own copy of the retry loop.
The server list and the user agent of each are read from its source:
| Sections | Downloader (the retry loop that sends the query) | Overpass servers, in order | User agent |
|---|---|---|---|
| 1a, 1b, 1d, 1e, 2a, 2c, 2d, 2e, 3a, 3b | etl/download_global.py::overpass_query — 1c (etl/download_eu_33kv.py) and 2b (etl/download_us_substations.py) call the same function | overpass-api.de | ATLAS-ETL/1.0 (+https://atlas.compoundingenergy.com; hello@compoundingenergy.com) |
| 4 | etl/download_planned.py::overpass_query | overpass-api.de | ATLAS-ETL/1.0 (+https://atlas.compoundingenergy.com; hello@compoundingenergy.com) |
| 5 | etl/download_gas.py::overpass_query | overpass-api.de | ATLAS-ETL/1.0 (+https://atlas.compoundingenergy.com; hello@compoundingenergy.com) |
| 6a, 6c | etl/_gas_geo.py::overpass — called by etl/build_gas_facilities.py and etl/build_gas_pipeline_projects.py | overpass-api.de, then maps.mail.ru | CEAtlas-ETL/1.0 (Compounding Energy; gas fuel-supply layers; hello@compoundingenergy.com) |
| 7a–7c, 9a | etl/download_water_fiber.py::overpass_query | overpass-api.de | ATLAS-ETL/1.0 (+https://atlas.compoundingenergy.com; hello@compoundingenergy.com) |
| 7d | etl/fetch_water_pipelines.py::overpass_query | overpass-api.de | ATLAS-ETL/1.0 (+https://atlas.compoundingenergy.com; hello@compoundingenergy.com) |
| 8 | etl/download_telecom.py::overpass_query | overpass-api.de | ATLAS-ETL/1.0 (+https://atlas.compoundingenergy.com; hello@compoundingenergy.com) |
| 9b, 9c | etl/download_fiber_routes.py::_overpass | overpass-api.de, then maps.mail.ru | ATLAS-ETL/1.0 (+https://atlas.compoundingenergy.com; hello@compoundingenergy.com) |
| 9d | etl/download_us_fiber.py::_overpass_query | overpass-api.de, then maps.mail.ru | ATLAS-ETL/1.0 (+https://atlas.compoundingenergy.com; hello@compoundingenergy.com) |
| 10 | etl/download_offshore_cables.py::overpass_query | overpass-api.de | ATLAS-ETL/1.0 (+https://atlas.compoundingenergy.com; hello@compoundingenergy.com) |
| 11a | etl/download_suitability.py::overpass_query | overpass-api.de | ATLAS-ETL/1.0 (+https://atlas.compoundingenergy.com; hello@compoundingenergy.com) |
| 11b | etl/build_wecc_exclusions.py::layer_airports — one request, no retry loop | overpass-api.de | ATLAS-ETL/1.0 (+https://atlas.compoundingenergy.com; hello@compoundingenergy.com) |
Every list starts with overpass-api.de; a list that names a second server moves to it only after a failed attempt.
A query that runs once per region is shown once, with its
{s},{w},{n},{e} placeholders (south, west, north, east, decimal degrees) and the region table it runs over.
Raw answers are cached under data/raw/; each section's refresh line says how its files are renewed — a rolling
refresh in the nightly (the lines, substations and GB groups: the stalest files of a group each night, a full cycle in about 30 days),
a fetch only when the cached file is missing (planned upgrades, gas pipelines, data centres), or a static release that is re-fetched by
hand (the EU 33 kV cells, gas facilities and projects, water, fibre, offshore cables, the WECC rasters). The rules describe the current
ETL code; the served tiles are rebuilt by the nightly, so the map can lag a rule change by one build and a new extract by one refresh.
Processing rules are given in plain words with the module and function that implements them; the properties listed are the ones the
served tile carries.
1. Transmission lines
served layer: Transmission lines (lines.pmtiles, free) · raw files: osm_<region>_hv_lines.json, osm_<region>_all_lines.json, osm_gb_lines_cables.json, osm_<region>_hv_cables.json · modules: etl/download_global.py, etl/download_eu_33kv.py, etl/process_global.py, etl/_hifld_gapfill.py · refresh: 1a, 1b, 1d, 1e rolling: each nightly re-fetches the stalest files of the group, a full cycle in about 30 days (etl/_osm_refresh.py); 1c a static release — the downloader is not in any workflow; re-fetched by hand
Four kinds of extract feed one layer, which also carries PyPSA-Eur gridkit lines (220 kV and up in the PyPSA-Eur countries; not OpenStreetMap-derived) and, in the United States, HIFLD lines where no served line has the line (the gap-fill rule below) in the same tile.
1a. World HV lines — download_global_lines (one query per region)
[out:json][timeout:240];
(
way["power"="line"]["voltage"~"{V_REGEX_HV}"]({s},{w},{n},{e});
);
out geom;
{V_REGEX_HV} = ([3-9][0-9]{4}|[1-9][0-9]{5,}) (a voltage tag of 30,000 V or more, as text). {s},{w},{n},{e} is the
region's bounding box from this table (south, west, north, east; regions overlap a little and the processor dedupes):
| key | description | south | west | north | east |
|---|---|---|---|---|---|
| eu_west | W Europe (FR/BE/NL/LU) | 42 | -5 | 52 | 8 |
| eu_central | Central Europe (DE/AT/CH/CZ/PL) | 46 | 5 | 55 | 25 |
| eu_iberia | Iberia (ES/PT) | 35 | -10 | 44 | 4 |
| eu_italy | Italy + Balkans | 36 | 6 | 48 | 22 |
| eu_nordics | Nordics + Baltics | 54 | 4 | 72 | 32 |
| eu_east | E Europe (RO/HU/BG/GR/UA) | 35 | 19 | 52 | 42 |
| eu_gb_ie | GB + Ireland | 49 | -11 | 62 | 3 |
| eu_iceland | Iceland | 62 | -26 | 67 | -12 |
| na_east | N America East | 24 | -100 | 50 | -60 |
| na_west | N America West | 24 | -130 | 50 | -100 |
| na_central | N America Central | 24 | -105 | 50 | -85 |
| na_canada | Canada | 48 | -140 | 70 | -52 |
| na_alaska | Alaska West | 51 | -180 | 72 | -130 |
| na_hawaii | Hawaii | 18 | -161 | 23 | -154 |
| na_mexico | Mexico + C America | 14 | -118 | 33 | -86 |
| na_caribbean | Caribbean + C America South | 7 | -90 | 27 | -59 |
| sa_brazil_se | Brazil SE | -30 | -55 | -15 | -35 |
| sa_brazil_ne | Brazil NE + N | -15 | -75 | 5 | -35 |
| sa_south | Argentina/Chile/Uruguay | -56 | -76 | -20 | -50 |
| sa_andean | Colombia/Peru/Ecuador/Bolivia | -20 | -82 | 12 | -58 |
| as_india_n | India North | 20 | 68 | 36 | 90 |
| as_india_s | India South + Sri Lanka | 5 | 72 | 22 | 88 |
| as_china_e | China East | 20 | 104 | 42 | 125 |
| as_china_w | China West | 25 | 75 | 48 | 110 |
| as_japan | Japan + Korea | 30 | 124 | 46 | 146 |
| as_se_mainland | SE Asia Mainland | 5 | 90 | 24 | 110 |
| as_se_islands | SE Asia Islands | -10 | 95 | 8 | 142 |
| as_philippines | Philippines (Luzon+Visayas) | 4 | 115 | 22 | 128 |
| as_middle_east | Middle East | 12 | 32 | 45 | 60 |
| as_central | Central Asia | 35 | 50 | 55 | 88 |
| af_north | North Africa | 20 | -18 | 38 | 35 |
| af_west | West Africa | 0 | -18 | 22 | 18 |
| af_east | East Africa | -12 | 28 | 18 | 52 |
| af_south | Southern Africa | -36 | 10 | 0 | 42 |
| af_madagascar | Madagascar + Mauritius | -27 | 42 | -10 | 60 |
| oc_australia | Australia | -44 | 112 | -10 | 154 |
| oc_nz | New Zealand | -48 | 165 | -34 | 179 |
| oc_pacific | PNG + SI + Vanuatu + NC + Fiji | -23 | 142 | -1 | 180 |
| ru_west | Russia West | 45 | 28 | 70 | 60 |
| ru_siberia | Russia Siberia | 45 | 55 | 72 | 110 |
| ru_east | Russia Far East | 42 | 105 | 72 | 180 |
1b. Sparse-region fill — download_sparse_region_fill (no voltage filter)
[out:json][timeout:240];
(
way["power"="line"]({s},{w},{n},{e});
way["power"="cable"]["location"="underground"]({s},{w},{n},{e});
);
out geom;
Run over the bounding boxes of these regions only: af_madagascar, eu_iceland, na_alaska, na_hawaii, oc_pacific.
1c. European 33 kV supplement — etl/download_eu_33kv.py::_fetch_region (the same HV query, cell by cell)
[out:json][timeout:170];
(way["power"="line"]["voltage"~"{dg.V_REGEX_HV}"]({cs},{cw},{cn},{ce}););
out geom;
{dg.V_REGEX_HV} is the regex of 1a. Each region below is cut into 2.0° × 2.0° cells ({cs},{cw},{cn},{ce}); the cells are merged and deduplicated by element id
into osm_<region>_hv_lines.json, replacing the one-shot regional file of 1a for that region.
| key | description | south | west | north | east |
|---|---|---|---|---|---|
| eu_west | 42 | -5 | 52 | 8 | |
| eu_central | 46 | 5 | 55 | 25 | |
| eu_iberia | 35 | -10 | 44 | 4 | |
| eu_italy | 36 | 6 | 48 | 22 | |
| eu_nordics | 54 | 4 | 72 | 32 | |
| eu_east | 35 | 19 | 52 | 42 | |
| eu_gb_ie | 49 | -11 | 62 | 3 |
1d. Great Britain lines and cables — download_global.py::gb_lines_cables_query, the gb_full group
[out:json][timeout:300]; area["ISO3166-1"="GB"]["admin_level"="2"]->.uk; ( way["power"="line"](area.uk); way["power"="cable"](area.uk); ); out geom;
Every power=line and every power=cable way (any location, any voltage) in the United Kingdom area (the
country relation: land and the 12-nautical-mile territorial sea). Written to osm_gb_lines_cables.json; it replaces the
earlier osm_gb_all_lines.json, which was fetched but never processed. It serves Great Britain's sub-220 kV supplement
from the first nightly build after this change (dated 2026-10-03); until that build, and whenever the file is absent, the GB supplement comes from the GB + Ireland
extract of 1c as before. From the first nightly build after the GB backbone switch of 2026-10-04 it also serves Great Britain's
220 kV-and-up backbone (the rules below).
1e. United States underground HV cables — download_us_hv_cables (the us_cables group)
[out:json][timeout:240];
(
way["power"="cable"]["voltage"~"{V_REGEX_HV100}"]["location"!~"^(underwater|submarine|sea|offshore)"]["submarine"!="yes"]({s},{w},{n},{e});
);
out geom;
{V_REGEX_HV100} = ([1-9][0-9]{5,}) (a voltage tag of 100,000 V or more). Run over the 1a bounding boxes of
these regions (the contiguous United States; the boxes also reach southern Canada and northern Mexico, whose cables are served like
their overhead lines): na_east, na_west, na_central. Written to osm_<region>_hv_cables.json and read with the HV line files
under the same rules, plus the cable floor of the PyPSA-Eur countries: a cable below 100 kV is not served (collector and distribution
cabling — wind-farm array cables are often tagged location=underground even on the seabed). Served as
power_kind=cable. Underwater and submarine cables are not fetched here: they are the Offshore cables layer's (§10), which
from 2026-11-03 draws OpenStreetMap's underwater power cables worldwide (until then only inside its US East Coast box,
24–45° N, 82–65° W — the Trans Bay Cable under San Francisco Bay, for one, was on neither layer and
came from the HIFLD gap-fill below; the gap-fill's own comparison set is the copy of the 2026-04 layer named in its rule, unchanged).
Alaska and Hawaii already receive cables from the sparse fill of 1b. Served from the first nightly build after this change (dated 2026-10-13).
Processing rules (etl/process_global.py::process_osm_lines_non_europe, process_lines)
- Voltage —
parse_voltage_levels_kv: thevoltagetag is split on;and,, every value is read as volts and divided by 1,000, values below 1 kV and above 2,000 kV are ignored; the way's kV is the highest level kept, and every level is remembered for the multi-voltage rule below. - Not route — a way tagged
line=busbarorline=bay(conductors inside a substation), or carrying a lifecycle state (proposed,planned,construction,disused,abandoned,dismantled,demolished,razed,removed,ruins— as<prefix>:power=*or a bare<prefix>=yes; a date inconstruction=*is not a state), is dropped from every OpenStreetMap line file worldwide (osm_line_exclusion). - Floor — ways with no usable voltage or under 33 kV are dropped (except in the sparse-fill regions of 1b, where every way is kept).
- PyPSA-Eur countries (continental Europe, Great Britain and Ireland) — OpenStreetMap supplies only the 33–219 kV supplement:
a way at 220 kV and above is dropped there because PyPSA-Eur gridkit owns the backbone — unless its voltage list also carries a 33–219 kV level,
in which case the way is served at its highest such level (a 132 kV circuit on a 400 kV tower is a 132 kV circuit) with
shared_kv= the ≥ 220 kV level it shares the route with. In the continental and Ireland files apower=cableway below 100 kV is dropped too (OSM_SUPPLEMENT_CABLE_MIN_KV: 33 / 66 kV cable is distribution and offshore inter-array cabling; 33 / 66 kV overhead lines are kept). In the GB extract (1d) a cable is kept from 33 kV, like a line (GB_SUPPLEMENT_CABLE_MIN_KV; since 2026-10-12, from the first nightly build after this change), except a cable below 100 kV that runs under water —location= underwater or submarine (in a;list too) orsubmarine=yes: offshore-wind inter-array and island cabling (supplement_cable_exclusion); a cable at 100 kV and up is kept under water or not. A way taggedfrequency=0is left to PyPSA-Eur's HVDC links — outside Great Britain. So in Great Britain the supplement is lines at 33–219 kV and cables at 100–219 kV, with cables at 33–99 kV on land, and the ≥ 220 kV network is the backbone rule below. - Great Britain ≥ 220 kV — the backbone switch of 2026-10-04 (
GB_BACKBONE_MIN_KV; served from the first nightly build after it). A way of the GB extract (1d) whose highest level is 220 kV or more, operating and not a substation connector (line=busbar/bay/substation/internal,GB_BACKBONE_EXCLUDED_LINE_TAGS), is served at that level withcountry=GB, its length and our capacity estimate — overhead lines and cables alike, so the 220 kV offshore-wind export cables are in (they also appear on the Offshore Cables layer); a way carrying a lower level too is served as two rows (the backbone row carriesvoltage_levels, e.g.275;132; the sub-220 kV circuit keeps the rule above). Northern Ireland: a way whose first, middle and last vertex lie on the island of Ireland (etl/_gb_geometry.py, the pilot's polygon) is not served from this file — gridkit's Northern Ireland lines stay. HVDC (frequency=0): the way is first looked up in the interconnector tableGB_HVDC_INTERCONNECTORS(wikidata tag, else name / ref): a link PyPSA-Eur gridkit already serves as a cross-border link (BritNed, IFA, Nemo, Moyle, the East-West Interconnector, North Sea Link) is left to gridkit — its sea cable and its onshore segments — so a link is never drawn twice; a link gridkit lacks (Viking Link, IFA2, ElecLink, Greenlink) is served from OpenStreetMap, as whole ways (Viking's Danish waters included); a way in neither row is served when both its end vertices are in Great Britain or UK waters (the Western HVDC Link, Caithness–Moray, Shetland, the Dogger Bank / Sofia / East Anglia THREE / Hornsea 3 export links) and skipped, named in the build log, when an end is foreign; a named way of 1 km or more in neither table (GB_HVDC_INTERNAL_NAMESlists the Great Britain-internal links we expect) is served but flagged in the build log, because OpenStreetMap splits interconnector ways at the UK boundary. The gridkit side: every gridkit line or link with both ends in Great Britain (by the same geometry, on the end buses) leaves the served layer, except (a) the reviewed exception tableGB_GRIDKIT_KEEP— eleven 275 kV circuits (North Hyde–Chessington, North Hyde–Willesden, Sheffield City / Wincobank / Norton Lees–Jordanthorpe, Lambhill / West George Street–Charlotte Street, Whitehouse–Currie, Whitelee Extension–East Kilbride and –Whitelee ×2; 92 km: London, Sheffield, Glasgow and Edinburgh city routes and three Whitelee wind-farm connections) that OpenStreetMap does not map continuously at 275 kV, kept with their PyPSA-Eur credit until the compare run finds the route, and (b) a link that continues one of gridkit's cross-border links at a shared bus (gridkit splits Nemo Link at a sea joint: its Richborough half has both ends in Great Britain and stays, or the link would end mid-sea). Cross-border links, Northern Ireland, Ireland and the continent are untouched. Fallback: when the GB extract is absent, unreadable or substantially short — fewer thanGB_BACKBONE_MIN_WAYS(2,000) backbone ways or underGB_BACKBONE_MIN_HV_KM(9,500) km of 275 / 400 kV route (the 2026-10-02 extract: 2,646 ways, 10,063 km) — the backbone rows are withheld and gridkit serves Great Britain exactly as before — never a Great Britain with no backbone. The engines' network bundles are not read from this layer and keep gridkit. - Capacity —
capacity_mwis our estimate from the voltage class × circuits (or cables ÷ 3). For a multi-voltage way kept at its sub-220 kV level it is estimated for one circuit at that level, unless thecircuits/cablestag is a;-list aligned with the voltage tag, whose matching element is used; the way-totalcircuits/cablestags are not served for those ways (they count the ≥ 220 kV circuits too). - Deduplication — by OpenStreetMap way id across extracts (the GB file is read first, so its copy of a way wins over the GB + Ireland bbox copy); then an OpenStreetMap way whose endpoints and voltage match a PyPSA-Eur line (endpoints within 2 km, either orientation) is dropped; then within-OSM near-duplicates are dropped when both endpoints lie within 100 m, the voltage bucket is the same and the lengths are within 10 %. For a pair in which at least one way comes from the GB lines-and-cables file (1d) a fourth test applies: the two routes must coincide (mean offset within 20 m, both directions) — parallel GB circuits mapped as separate ways, a second tower line tens of metres away, are kept. Everywhere else the three-test rule of before 2026-10-03 stands unchanged until the route test's world-wide effect on the layer has been measured (on the GB extract it kept 43 % of the endpoint-matched pairs).
- Properties kept —
voltage_kv, a voltage bucket,capacity_mw,operator,name,ref,cables,circuits,source=OSM,osm_id,shared_kv(multi-voltage ways only),power_kind=cable(cable ways only). - HIFLD gap-fill (United States) —
etl/_hifld_gapfill.py, after every rule above: a line of the HIFLD Open Electric Power Transmission Lines file (its final public issue, frozen 2025-08-26, as archived by SeerAI; CC BY 4.0) is drawn only where no line the map already shows has it: the lines of this layer and the Offshore cables layer's North American ways (§10, copied toetl/seed/offshore_cables_na.geojson) — not all of OpenStreetMap. Each HIFLD line is sampled every 250 m. A sample is covered by a line within 250 m at any voltage; by one further off — within 2 km at the same voltage class (or with either voltage unknown), within 1 km one class away — only where the route holds on both sides: such a run counts when it has a sample within 250 m on at least one side and an uncovered sample on neither (so where two lines fork, or a different line runs alongside, the HIFLD line is drawn from where it leaves the line it shares); an uncovered run shorter than 1 km between covered samples (a bend, the end of one OpenStreetMap way) does not break the route, one at the HIFLD line's own end does. A line covers a sample only when it runs within 45° of the HIFLD line there, and never one that lies more than 250 m beyond its end. A line with no covered sample is drawn whole (unless it is under 50 m long); an uncovered stretch of 1 km or more is drawn on its own and runs on along the HIFLD route (at most 2 km) to the line it leaves, ending on it. A HIFLD line drawn twice in HIFLD's own file (within 5 m along 85 % of its length) is drawn once; a piece within 200 m of the map's lines along 75 % of its length (stubs at substations) is not drawn; nor is a piece that is HIFLD's own copy of a line the map shows on another route (a city cable HIFLD draws as a chord): a served line of its voltage class whose name carries both of the HIFLD line's end-station names (case, punctuation, St / Street, Rd / Road, kV figures and words such as substation aside) reaches both of its ends, and HIFLD has no row of its own along that line. Inactive and under-construction HIFLD lines are not drawn, nor six rows named inDENY_IDS: Neptune and the Cross Sound Cable, which the Offshore cables layer draws and HIFLD maps 0.2–6 km away from it; East Garden City – Sprain Brook (Y-49) and the two Gloucester – Camden circuits, which the US cables draw and HIFLD maps 1.4–3.8 km away from them; and a 0.24 km line HIFLD mislabels DC. These lines keep HIFLD's geometry and attributes (source=HIFLD,hifld_fill); a line with no recorded voltage is shown as "voltage unknown". HIFLD's file is the United States'; two of its lines run on about 4 km into Canada and are drawn there too. Which HIFLD lines and stretches are drawn is decided by comparing them with the served OpenStreetMap lines, so we supply them with the layer's OpenStreetMap-derived data on request (the offer below). - Seeded lines —
etl/_seed_lines.py, last of all (from the first nightly build after 2026-10-31): a line neither OpenStreetMap nor HIFLD has, drawn from the reviewed recordetl/seed/line_additions.geojson(the operator's published description of the line: owner, voltage, declared capacity, in-service date, the stations it runs between, with the source named on every row). The record is sampled every 250 m and a seed is drawn only while no served line covers it: a served line of the same or a higher voltage class within 2 km, or any served AC line within 250 m, covers a sample, and a seed 80 % covered is not drawn, so the night OpenStreetMap gains the line the seed leaves on its own. A seed drawn station to station says so in its popup (seed_schematic): the alignment is not mapped. These rows carrysource=Seed,seed_id,seed_basisandseed_date; they are not OpenStreetMap-derived and are not part of the offer below. They are served as their own small file,public/data/lines_seed.geojson, which the Transmission layer draws besidelines.pmtileswith the same styling and popup (the nightly writes it from the served lines; nothing is added to the tile). A seed a source has since gained is retired in the record (aretiredsentence naming the source) and never drawn again; with no live seed the served file is empty. The first seed, Western Spirit, PNM's 345 kV, 800 MW line across Torrance County, New Mexico (energised December 2021), which the HIFLD file predates, was retired the evening it was added: OpenStreetMap maps the line (way 1104844306 and its continuation), and the served tile of 30 October 2026 already carried it.
2. Substations
served layer: Substations (substations.pmtiles, free) · raw files: osm_subs_<cc>.json, osm_subs_us_chunk_NN.json, osm_fr_subs_tile_NN.json, osm_gb_substations.json · modules: etl/download_global.py, etl/download_us_substations.py, etl/process_global.py · refresh: rolling: each nightly re-fetches the stalest files of the group, a full cycle in about 30 days (etl/_osm_refresh.py)
2a. One area query per country — download_global_substations
[out:json][timeout:120];
area["ISO3166-1"="{cc}"]->.a;
(
node["power"="substation"](area.a);
way["power"="substation"](area.a);
relation["power"="substation"](area.a);
);
out center;
{cc} runs over 137 ISO 3166-1 codes: GB, FR, DE, ES, IT, NL, BE, AT, CH, PL, CZ, SE, NO, DK, FI, IE, PT, GR, RO, HU, SK, HR, BG, SI, LT, LV, EE, LU, RS, BA, ME, MK, AL, UA, MD, BY, IS, MT, CY, US, CA, MX, GT, HN, SV, NI, CR, PA, CU, DO, JM, TT, PR, BR, AR, CL, CO, PE, VE, EC, BO, PY, UY, GY, SR, JP, KR, CN, TW, IN, PK, BD, LK, NP, TH, VN, MY, SG, ID, PH, MM, KH, LA, TR, SA, AE, IL, JO, IQ, IR, KW, QA, BH, OM, YE, LB, SY, KZ, UZ, TM, KG, TJ, GE, AM, AZ, MN, ZA, EG, MA, DZ, TN, LY, NG, GH, KE, TZ, ET, CI, SN, CM, CD, AO, MZ, ZM, ZW, BW, NA, UG, RW, MG, MU, SD, AU, NZ, FJ, PG, RU. (The US entry times out; the US file comes from 2b. France's file is the merge of 2e's tiles.)
2b. United States in strips — etl/download_us_substations.py::build_query
[out:json][timeout:170];
(
node["power"="substation"]({south},{west},{north},{east});
way["power"="substation"]({south},{west},{north},{east});
relation["power"="substation"]({south},{west},{north},{east});
);
out center;
| key | description | south | west | north | east |
|---|---|---|---|---|---|
| West Coast | 24.0 | -125.0 | 49.0 | -114.9 | |
| Mountain | 24.0 | -115.0 | 49.0 | -104.9 | |
| Plains | 24.0 | -105.0 | 49.0 | -94.9 | |
| Midwest | 24.0 | -95.0 | 49.0 | -84.9 | |
| East Central | 24.0 | -85.0 | 49.0 | -74.9 | |
| Atlantic | 24.0 | -75.0 | 49.0 | -65.0 | |
| Alaska | 51.0 | -180.0 | 72.0 | -130.0 | |
| Hawaii | 18.0 | -161.0 | 23.0 | -154.0 |
2c. Great Britain, every substation — download_global.py::gb_substations_query, the gb_full group
[out:json][timeout:120]; area["ISO3166-1"="GB"]["admin_level"="2"]->.uk; ( node["power"="substation"](area.uk); way["power"="substation"](area.uk); relation["power"="substation"](area.uk); ); out center;
Processing rules (etl/process_global.py::process_osm_substations_global)
- A node's own coordinates, else the element's Overpass
center; coordinates rounded to 5 decimals. - Voltage by the same rule as the lines (maximum of the list, volts ÷ 1,000); no voltage floor — every node, way and relation is kept, with or without a voltage, unless a rule below leaves it out.
- A node or way with a state that takes it out of service (
disused=yes,abandoned=yes,construction=yes,disused:power=*and the like, the lines' rule) is left out (since 2026-11-07). - A relation with a state that takes it out of service (
disused=yes,abandoned=yes,disused:power=*and the like, the lines' rule) is left out, and so is a relation that is not an outline of a station (onlytype=multipolygonortype=siteis read). Nodes and ways are not judged by these rules. - A relation can repeat a station a node or way already holds, or another relation. They count as one station when the relation lists it as a member, other than an inner one and under no other name; or it has the relation's name within 1 km; or, with a name missing on either side, the same top voltage within 300 m. A place no project can connect to, such as a cable transition or a converter, and a place one can are never one station.
- A relation gives way only to one neighbour that has both its voltage and its name. Otherwise the relation stays, and a neighbour at or below its voltage goes; a neighbour at a higher voltage stays beside it. A relation of
type=sitewith member substations is their site: the members stay and the relation does not. - Deduplicated by OpenStreetMap (element type, id) across the files — node, way and relation ids are separate sequences. The two GB
files (2a's
osm_subs_gb.jsonand 2c'sosm_gb_substations.json) overlap almost entirely and are merged; the served GB set is their union, deduplicated by (element type, id); the GB area file is read first. - Properties kept:
name,voltage_kv, a voltage bucket,operator,substation_type(thesubstationtag),country,frequency,source=OSM,osm_id. PyPSA-Eur buses are drawn in the same tile withsource=PyPSA-Eur. - Zoom (
SUBS_MINZOOM_BY_BUCKET): the tile carries a substation from the zoom of its voltage bucket — 735 kV and up from zoom 4; 500–734 kV from zoom 5; 345–499 kV from zoom 6; 220–344 kV from zoom 7; 100–219 kV from zoom 7; 31–99 kV from zoom 9; below 31 kV from zoom 12; no voltage tag from zoom 9. Since 2026-10-12 (from the first nightly build after this change) 100–219 kV from zoom 7 (was 9) and 31–99 kV from zoom 9 (was 11), the zooms the map's style draws them from.
2d. Great Britain HV substation polygons — gb_substations_hv_geom_query: fetched, not served
[out:json][timeout:300];
area["ISO3166-1"="GB"]["admin_level"="2"]->.uk;
(
nwr["power"="substation"]["voltage"~"([1-9][0-9]{5,})"](area.uk);
nwr["power"="substation"]["substation"~"^(transmission|generation|converter)$"](area.uk);
);
out geom;
Written to osm_gb_substations_hv_geom.json (the gb_full group). An input of the GB network topology work; no served layer
reads it today. It is listed so the inventory is complete; it is included in the offer below.
2e. France in tiles — download_global.py::fr_substations_tile_query, the fr_subs_tiles group
[out:json][timeout:180]; area["ISO3166-1"="FR"]->.a; ( node["power"="substation"](area.a)(41.0,-5.8,44.5,0.5); way["power"="substation"](area.a)(41.0,-5.8,44.5,0.5); relation["power"="substation"](area.a)(41.0,-5.8,44.5,0.5); ); out center;
France's area query (2a with {cc} = FR) outgrew Overpass's time limit, so France is fetched as 13 tiles: 2a's selection
cut by bounding box. The query above is tile 01; every other tile is the same query with its own box, and tile 13 is one
query with all of its boxes. The tiles' boxes cover the whole globe and the area filter keeps only France, so together they return what 2a returns
for France. Each tile is cached as osm_fr_subs_tile_NN.json; once all 13 hold data they are merged, deduplicated by
(element type, id), into osm_subs_fr.json, the file the processing rules above read.
| tile | description | south | west | north | east |
|---|---|---|---|---|---|
| 01 | south-west: Pays basque, Béarn, Landes | 41.0 | -5.8 | 44.5 | 0.5 |
| 02 | south: Toulouse, Occitanie west | 41.0 | 0.5 | 44.5 | 4.5 |
| 03 | south-east: Provence, Côte d'Azur, Corsica | 41.0 | 4.5 | 44.5 | 10.0 |
| 04 | Bordeaux, Charentes, Vendée | 44.5 | -5.8 | 47.0 | 0.5 |
| 05 | Limousin, Auvergne, Berry | 44.5 | 0.5 | 47.0 | 4.5 |
| 06 | Rhône, Alpes, Bourgogne south | 44.5 | 4.5 | 47.0 | 10.0 |
| 07 | Bretagne, Pays de la Loire, Maine | 47.0 | -5.8 | 49.0 | 0.5 |
| 08 | Île-de-France, Centre | 47.0 | 0.5 | 49.0 | 4.5 |
| 09 | Champagne south, Lorraine, Alsace, Franche-Comté | 47.0 | 4.5 | 49.0 | 10.0 |
| 10 | Normandie west, Cotentin | 49.0 | -5.8 | 51.5 | 0.5 |
| 11 | Normandie east, Picardie, Nord | 49.0 | 0.5 | 51.5 | 4.5 |
| 12 | Ardennes, Lorraine north, Alsace north | 49.0 | 4.5 | 51.5 | 10.0 |
| 13 | outside the metropolitan envelope (overseas) | -90.0 | -180.0 | 41.0 | 180.0 |
| 13 | outside the metropolitan envelope (overseas) | 51.5 | -180.0 | 90.0 | 180.0 |
| 13 | outside the metropolitan envelope (overseas) | 41.0 | -180.0 | 51.5 | -5.8 |
| 13 | outside the metropolitan envelope (overseas) | 41.0 | 10.0 | 51.5 | 180.0 |
3. GB wind turbines and farms (new layer)
served layer: GB wind turbines (OpenStreetMap) — a separate, all-OpenStreetMap layer (gb_wind_turbines.pmtiles), UK regional cut; served since 2026-10-03 — the first tile, built that day from a fetch with the widened sea boxes, went out with the deploy; the nightly refreshes it · raw files: osm_gb_wind_generators.json, osm_gb_wind_plants.json · group: gb_wind (etl/download_global.py) · builder: etl/build_gb_wind_turbines.py · refresh: rolling: each nightly re-fetches the stalest files of the group, a full cycle in about 30 days (etl/_osm_refresh.py; the layer's data window shows the extract date)
3a. Turbines — every wind generator in the UK area plus the offshore boxes (gb_wind_generators_query)
[out:json][timeout:300]; area["ISO3166-1"="GB"]["admin_level"="2"]->.uk; ( nwr["power"="generator"]["generator:source"="wind"](area.uk); nwr["power"="generator"]["generator:source"="wind"](51.25,0.7,51.95,2.4); nwr["power"="generator"]["generator:source"="wind"](50.4,-1.5,51.25,0.7); nwr["power"="generator"]["generator:source"="wind"](51.8,-0.5,56.6,2.95); nwr["power"="generator"]["generator:source"="wind"](55.8,-3.6,61.0,0.5); nwr["power"="generator"]["generator:source"="wind"](53.0,-5.6,54.95,-2.9); ); out center tags;
3b. Wind farms — every wind plant, with member geometry (gb_wind_plants_query)
[out:json][timeout:300]; area["ISO3166-1"="GB"]["admin_level"="2"]->.uk; ( nwr["power"="plant"]["plant:source"~"wind"](area.uk); nwr["power"="plant"]["plant:source"~"wind"](51.25,0.7,51.95,2.4); nwr["power"="plant"]["plant:source"~"wind"](50.4,-1.5,51.25,0.7); nwr["power"="plant"]["plant:source"~"wind"](51.8,-0.5,56.6,2.95); nwr["power"="plant"]["plant:source"~"wind"](55.8,-3.6,61.0,0.5); nwr["power"="plant"]["plant:source"~"wind"](53.0,-5.6,54.95,-2.9); ); out geom;
The United Kingdom area is land plus the 12-nautical-mile territorial sea; offshore farms beyond it are reached through these boxes, chosen to reach the UK offshore wind areas; where a box overlaps a neighbour's waters, the screen below refuses those points:
| key | description | south | west | north | east |
|---|---|---|---|---|---|
| box 1 | Thames / outer estuary: London Array, Kentish Flats, Thanet, Gunfleet, Greater Gabbard, Galloper | 51.25 | 0.7 | 51.95 | 2.4 |
| box 2 | Channel (Rampion) | 50.4 | -1.5 | 51.25 | 0.7 |
| box 3 | southern + central North Sea | 51.8 | -0.5 | 56.6 | 2.95 |
| box 4 | Scottish North Sea / Moray / Shetland | 55.8 | -3.6 | 61.0 | 0.5 |
| box 5 | Irish Sea (points in the Isle of Man box 54.04–54.42 N, 4.85–4.30 W are dropped) | 53.0 | -5.6 | 54.95 | -2.9 |
Processing rules (the UK regional cut — method version 1.0, read from the builder's PROCESSING_RULES)
- The layer is OpenStreetMap only: turbine points are
power=generator+generator:source=windelements (a way's centre stands for the turbine), farms arepower=plantwind relations / ways and, for turbines in no plant, a spatial clustering of the turbines themselves. No value from any other source is mixed into the layer. - Regional cut: points inside the Isle of Man box (54.04, -4.85, 54.42, -4.3) (south, west, north, east) are dropped; points in the neighbours' waters — coarse median-line polygons for FR, BE, NL, DE, DK, NO, IE — are refused and logged by name; a point outside the UK envelope (49.8, -8.7, 61.1, 2.95) is dropped and logged. The served set is checked again.
- Lifecycle: operating unless a lifecycle prefix sits on a feature-defining key (construction:power, proposed:power, disused:power, demolished:power, planned:generator:source …) or operational_status / disused / abandoned / construction / proposed says otherwise; removed, demolished, razed or dismantled turbines are dropped; the rest are drawn as operating / under construction / proposed / disused. A prefixed non-defining key (was:name, was:operator) carries no lifecycle.
- Duplicates: generator elements within 3 m of each other with identical tags are one turbine; the lower id is kept and the count is reported.
- Rating: generator:output:electricity is read as MW (W / kW / MW / GW; a ';'-list is summed; '2,500 kW' is thousands, '2,5 MW' a decimal comma); a value above 20 MW on one turbine is treated as a farm total and not used; 'yes', 'yes/kW' and 'small_installation' keep the text and no figure.
- Offshore: offshore=yes, floating=yes or location=offshore on the turbine; a lit seamark (seamark:light* / seamark:fog_signal*); a seamark windmotor landmark with another within 3 km (a lone one is an onshore landmark); or membership of an offshore plant (offshore=yes, a seamark production area, 'Offshore' in its name). location=roof / rooftop is onshore.
- Farms: a turbine belongs to the first power=plant relation in the extract that lists it as a member (role generator or blank), else to the closed plant way or multipolygon outer ring that contains it; a nested or overlapping relation whose turbines another relation already holds is served with n=0, n_shared and the name of the farm that draws them. The farm point is the centroid of its member turbines (else of the shared ones, else of its polygon, else the element's centre). Heights are metres (0 < h < 1000).
- Groups: turbines in no plant are grouped by single linkage at 1 km onshore and 2.5 km offshore and served as unnamed groups (kind 'group') for the country-zoom view.
- repd:id is the OpenStreetMap tag as mapped (a turbine's own, else its plant's) — a reference key, never a REPD value. Legend classes: lt1, 1to2, 2to3, 3to4, ge4, offshore, unknown (rated-size bands in MW, offshore, unknown).
- Zoom: farm and group points at z3–7, individual turbines from z8; the tile is z3–12. Every property in the tile is OpenStreetMap-derived; the tile metadata names the licence (https://opendatacommons.org/licenses/odbl/1-0/), the copyright page (https://www.openstreetmap.org/copyright) and the method-and-offer page (https://atlas.compoundingenergy.com/osm-data.html).
- Tags carried (
CARRIED_TAGS): name; operator; generator:output:electricity; manufacturer / generator:manufacturer; model / generator:model; height; height:hub; rotor:diameter; start_date; ref; wikidata; repd:id; generator:type (vertical_axis); offshore / floating / location; seamark:* (offshore flag only); plant:output:electricity; turbines; the lifecycle prefixes and operational_status / disused / abandoned / construction / proposed; and the OpenStreetMap element id. - The other direction is closed: no OpenStreetMap coordinate or attribute enters the REPD plant register, the GB fleet census, the BM-unit location table, the GB wind validation sites, any API answer or any download of those products. OpenStreetMap is an internal cross-check for them ("compare, never take"), and every correction they receive comes from a non-OpenStreetMap source.
4. Proposed lines (OpenStreetMap)
served layer: Proposed lines (OpenStreetMap) (osm_proposed_lines.pmtiles; a FREE layer since 2026-11-03 — until then the planned_lines source-layer of the paid Planned upgrades tile, which now carries no OpenStreetMap data) · raw files: osm_planned_lines.json, osm_planned_subs.json · modules: etl/download_planned.py, etl/process_planned.py · refresh: fetched by the nightly when the cached raw file is missing or older than 28 days (ATLAS_PLANNED_MAX_AGE_DAYS; a re-pull replaces the cache only above the OSM rolling-refresh retention floor), otherwise kept as is
4a. Proposed / under-construction lines (worldwide, no bounding box)
[out:json][timeout:300]; ( way["proposed:power"="line"]; way["construction:power"="line"]; way["power"="line"]["construction"="yes"]; way["power"="line"]["planned"="yes"]; ); out geom;
4b. Proposed / under-construction substations (worldwide)
[out:json][timeout:120]; ( node["proposed:power"="substation"]; way["proposed:power"="substation"]; relation["proposed:power"="substation"]; node["construction:power"="substation"]; way["construction:power"="substation"]; relation["construction:power"="substation"]; ); out center;
Processing rules (etl/process_planned.py::process_planned_lines)
- Ways with fewer than two points are skipped; elements are deduplicated by OpenStreetMap id.
- Voltage: the
voltagetag, elseproposed:voltage; an integer above 1,000 is volts (÷ 1,000), otherwise it is read as kV already; unparseable → 0. - Status from the lifecycle tag that matched (proposed / construction / planned). Properties: name, operator, voltage_kv, status,
source=OSM,osm_id. - Since 2026-11-03 the OpenStreetMap features are cut into their own tile (
osm_proposed_lines.pmtiles, source-layerosm_proposed_lines); the paidplanned.pmtileskeeps only the EIA-860M planned generators (source=EIA-860M), which are not OpenStreetMap-derived.
5. Gas pipelines
served layer: Gas pipelines (gas_pipelines.pmtiles, free) · raw files: osm_gas_<region>.json, gas_pbf_manifest.json · modules: etl/download_gas.py, etl/process_gas.py · refresh: the served tile is the WORLD build (below), re-made by hand from fresh Geofabrik extracts; the Overpass boxes roll through the staggered refresh (the stalest region re-pulled each night, a partial answer never replacing a cached one) but do not tile while the world build stands
The world build (served from the first deploy after 2026-11-03)
Not an Overpass query: etl/download_gas.py --from-pbf reads the Geofabrik continent extracts
(.osm.pbf; Europe and the United States of 2026-11-02, the other continents of 2026-10-16) through
osmium tags-filter w/man_made=pipeline and osmium export (GeoJSON sequence, linestrings, way ids), keeps every way whose
substance is in the gas family — the same list the Overpass query below takes — and writes each extract in the Overpass answer
shape, so etl/process_gas.py classifies it exactly as a box answer; a closed way tagged area=yes (a facility outline, never a
pipeline) is not taken. A manifest (gas_pbf_manifest.json) names the files the
processor reads; the committed stamp etl/seed/gas_pipelines_world.json records the build (extracts, sizes, md5, 108,566 ways) and
keeps a box-only nightly from tiling over it. Nothing from any other source enters the OpenStreetMap part of the tile.
The Overpass boxes (the layer until 2026-11-03; still fetched for the suitability scorer)
[out:json][timeout:300];
(
way["man_made"="pipeline"]["substance"~"^(gas|natural_gas|cng|lpg|ngl|hydrocarbons)$"]({s},{w},{n},{e});
);
out geom;
| key | description | south | west | north | east |
|---|---|---|---|---|---|
| gas_europe | Europe | 35 | -12 | 72 | 42 |
| gas_na | North America | 14 | -140 | 72 | -52 |
| gas_sa | South America | -56 | -82 | 12 | -35 |
| gas_asia_east | East Asia | 18 | 72 | 55 | 150 |
| gas_middle_east | Middle East | 12 | 32 | 42 | 60 |
| gas_africa | Africa | -36 | -18 | 38 | 52 |
| gas_russia | Russia | 42 | 28 | 72 | 180 |
| gas_oceania | Oceania | -48 | 110 | -10 | 180 |
Processing rules (etl/process_gas.py)
- Every
man_made=pipelineway whosesubstanceis in the gas family (gas, natural_gas, cng, lpg, ngl, hydrocarbons); untagged pipelines are not taken. A way with fewer than two points is skipped. - Deduplicated by OpenStreetMap way id across the regions / extracts (an extract that overlaps another — Moldova inside Europe — adds only the ways not yet seen); length in km computed from the geometry.
- Properties: name, operator, substance, diameter, pressure, country, length_km,
osm_id, region (the box key, orgas_<extract>in the world build). The US EIA interstate / intrastate network is drawn in the same layer from EIA's own tile (gas_eia.pmtiles, not OpenStreetMap).
6. Gas facilities, LNG sites and pipeline projects
served layers: Gas facilities (gas_facilities.pmtiles: compressor stations; LNG site locations) and Gas pipeline projects (gas_pipeline_projects.pmtiles), both free · modules: etl/build_gas_facilities.py, etl/build_gas_pipeline_projects.py, etl/_gas_facilities.py · refresh: a static release — the downloader is not in any workflow; re-fetched by hand (release 2026-09-29; the builders query Overpass when they run)
6a. Compressor stations — build_gas_facilities.py::osm_compressors
[out:json][timeout:300];(nwr["substation"="compression"]({s},{w},{n},{e});nwr["pipeline"="substation"]["substance"~"gas",i]({s},{w},{n},{e}););out center tags;
| key | description | south | west | north | east |
|---|---|---|---|---|---|
| tile 1 | 24 | -125 | 37 | -104 | |
| tile 2 | 37 | -125 | 50 | -104 | |
| tile 3 | 24 | -104 | 37 | -90 | |
| tile 4 | 37 | -104 | 50 | -90 | |
| tile 5 | 24 | -90 | 37 | -66 | |
| tile 6 | 37 | -90 | 50 | -66 | |
| tile 7 | 14 | -120 | 24 | -86 | |
| tile 8 | 50 | -141 | 72 | -52 | |
| tile 9 | 40 | -170 | 72 | -141 | |
| tile 10 | 44 | -66 | 50 | -52 |
Rules: every OpenStreetMap compressor station in North America is matched to the EPA Greenhouse Gas Reporting Program facility on the same
site — within 1.5 km always; within 3 km when the names share a place word or station number; within 5 km when the operator or the full name
also agrees — and the matched row carries both (src=OSM + GHGRP); an unmatched station stays an OpenStreetMap-only row
(src=OSM); EPA-only stations sit at their reported coordinates. Tiles overlap at their edges only; the (type, id) key dedupes.
6b. LNG terminals
No Overpass query: each site's location comes from one documented public source named per row in etl/seed/lng_terminals.csv
(EIA, EPA GHGRP, EPA Facility Registry Service, Wikidata or OpenStreetMap). The rows whose source is OpenStreetMap carry that credit; a
machine-readable list of them is part of the offer.
6c. Gas pipeline projects — build_gas_pipeline_projects.py::osm_named_ways then osm_way_geometry
[out:json][timeout:300];(way["man_made"="pipeline"]["name"]["substance"~"gas",i]({s},{w},{n},{e});way["construction:man_made"="pipeline"]["name"]({s},{w},{n},{e});way["proposed:man_made"="pipeline"]["name"]({s},{w},{n},{e});way["man_made"="pipeline"]["construction"="yes"]["name"]({s},{w},{n},{e}););out tags center;
[out:json][timeout:300];way(id:{','.join(map(str, chunk))});out geom;
| key | description | south | west | north | east |
|---|---|---|---|---|---|
| tile 1 | 24 | -125 | 37 | -104 | |
| tile 2 | 37 | -125 | 50 | -104 | |
| tile 3 | 24 | -104 | 37 | -90 | |
| tile 4 | 37 | -104 | 50 | -90 | |
| tile 5 | 24 | -90 | 37 | -66 | |
| tile 6 | 37 | -90 | 50 | -66 | |
| tile 7 | 50 | -170 | 72 | -129 |
Rules: the US EIA Natural Gas Pipeline Projects tracker supplies the project list and attributes; a project is drawn only where OpenStreetMap maps a pipeline way of the same name in one of the project's states (names normalised; a name match against the wrong operator is rejected and logged); the geometry of the matched ways is then fetched by way id and the popup says how many miles are drawn. Every drawn geometry is OpenStreetMap-derived.
7. Water infrastructure
served layer: Water infrastructure (water_infrastructure.pmtiles, free; the map calls the layer Waterways) · raw files: <stem>-latest.osm.pbf (Geofabrik), osm_water_dams_<key>.json, osm_water_treatment_<key>.json, osm_water_towers_<key>.json, osm_water_pipes_<key>.json · modules: etl/process_water_fiber.py, etl/download_water_fiber.py, etl/fetch_water_pipelines.py · refresh: a static release — the downloader is not in any workflow; re-fetched by hand
7·0. Worldwide from the Geofabrik extracts (the served tile since 2026-11-03) — process_water_fiber.py --pbf
The served tile is built from the Geofabrik continent extracts (<stem>-latest.osm.pbf of 2026-11-02: africa, asia,
australia-oceania, central-america, south-america, russia, europe, the four eastern-Europe country extracts, north-america canada / mexico
and us — every continent but Antarctica; Greenland's own extract was not fetched), not from Overpass: osmium tags-filter with the
expressions below (referenced nodes kept, so ways have geometry), then osmium export and the processing rules of this section.
The expressions are the union of the tags the Overpass queries of 7a–7d ask for, plus man_made=reservoir_covered (the
legend's Reservoirs, which no Overpass query fetched); man_made=water_well is left out. The Overpass queries remain the
documented fallback and define the tag set.
nwr/man_made=dam,reservoir_covered,water_works,desalination_plant,wastewater_plant,pumping_station,water_tower nwr/waterway=dam,pipeline w/man_made=pipeline w/communication=line w/telecom=cable w/utility=telecom
7a. Dams
[out:json][timeout:120];
(
node["waterway"="dam"]({s},{w},{n},{e});
way["waterway"="dam"]({s},{w},{n},{e});
);
out center;
7b. Water treatment, desalination, wastewater
[out:json][timeout:120];
(
node["man_made"="water_works"]({s},{w},{n},{e});
way["man_made"="water_works"]({s},{w},{n},{e});
node["man_made"="desalination_plant"]({s},{w},{n},{e});
way["man_made"="desalination_plant"]({s},{w},{n},{e});
node["man_made"="wastewater_plant"]({s},{w},{n},{e});
way["man_made"="wastewater_plant"]({s},{w},{n},{e});
);
out center;
7c. Water towers and pumping stations (the first seven regions below — Europe only)
[out:json][timeout:120];
(
node["man_made"="pumping_station"]({s},{w},{n},{e});
node["man_made"="water_tower"]({s},{w},{n},{e});
);
out;
| key | description | south | west | north | east |
|---|---|---|---|---|---|
| gb | 49.9 | -10.5 | 60.9 | 1.8 | |
| fr | 42.0 | -5.5 | 51.1 | 9.6 | |
| de | 47.2 | 5.8 | 55.1 | 15.1 | |
| nl_be | 49.5 | 2.5 | 53.6 | 7.2 | |
| iberia | 36.0 | -10.0 | 44.0 | 4.0 | |
| italy | 36.0 | 6.5 | 47.1 | 18.5 | |
| nordics | 54.0 | 4.0 | 71.0 | 31.0 | |
| na_east | 24 | -100 | 50 | -60 | |
| na_west | 24 | -130 | 50 | -100 |
7d. Water and sewage pipelines — fetch_water_pipelines.py::download_all
[out:json][timeout:180];
(
way["man_made"="pipeline"]["substance"="water"]({s},{w},{n},{e});
way["man_made"="pipeline"]["substance"="drinking_water"]({s},{w},{n},{e});
way["man_made"="pipeline"]["substance"="rainwater"]({s},{w},{n},{e});
way["man_made"="pipeline"]["substance"="sewage"]({s},{w},{n},{e});
way["man_made"="pipeline"]["substance"="wastewater"]({s},{w},{n},{e});
way["waterway"="pipeline"]({s},{w},{n},{e});
);
out geom;
| key | description | south | west | north | east |
|---|---|---|---|---|---|
| gb | 49.9 | -10.5 | 60.9 | 1.8 | |
| fr | 42.0 | -5.5 | 51.1 | 9.6 | |
| de | 47.2 | 5.8 | 55.1 | 15.1 | |
| nl_be | 49.5 | 2.5 | 53.6 | 7.2 | |
| iberia | 36.0 | -10.0 | 44.0 | 4.0 | |
| italy | 36.0 | 6.5 | 47.1 | 18.5 | |
| nordics | 54.0 | 4.0 | 71.0 | 31.0 | |
| ch_at | 45.0 | 5.5 | 49.5 | 17.5 | |
| pl_cz | 48.0 | 12.0 | 55.5 | 25.0 | |
| us_ne | 37.0 | -81.0 | 45.5 | -67.0 | |
| us_ca | 32.0 | -125.0 | 42.5 | -114.0 | |
| us_tx | 25.0 | -107.0 | 37.0 | -93.5 |
Processing rules (etl/process_water_fiber.py::process_water_infrastructure)
- Every
osm_water_*.jsonfile is read; elements deduplicated by OpenStreetMap id; a way with geometry becomes a line, a node or a centre a point. - The infrastructure type is taken from the file (dam, treatment, tower / pump, pipe); properties: name, type, operator, feature type,
osm_id. - From the extracts (
classify_water, the same rules):waterway=dam→ Dam;man_made=pipelinewithsubstancesewage / wastewater → Sewage Pipeline, water / drinking_water / rainwater → Water Pipeline (any other substance dropped);waterway=pipeline→ Water Pipeline; the otherman_madevalues by the type table. A node is a point; a way or multipolygon area becomes the centre of its bounding box (Overpassout center); pipelines keep the way geometry. Features are deduplicated by typed OpenStreetMap id across the extracts (they overlap along their borders). - The tile has one source layer,
water_infra, and every feature in it is OpenStreetMap-derived. Rivers and lakes are a separate Natural Earth tile.
8. Data centres and the DC pipeline
served layers: Data centres (datacenters.pmtiles) and the DC pipeline (dc_pipeline.pmtiles), both free · raw file: osm_datacenters.json · modules: etl/download_telecom.py, etl/process_telecom.py, etl/process_dc_pipeline.py · refresh: fetched by the nightly only when the cached raw file is missing, otherwise kept as is (no age check; a layer can be months behind OpenStreetMap)
[out:json][timeout:300]; ( node["telecom"="data_center"]; way["telecom"="data_center"]; node["building"="data_centre"]; way["building"="data_centre"]; node["man_made"="data_center"]; way["man_made"="data_center"]; ); out center;
Processing rules
process_telecom.py::process_data_centers: a node's coordinates or the element's centre; propertiesname,operator,country,power_mw,cooling,building_levels,type=datacenter(no element id is kept; the CSV export credits these rows by layer and type). Internet exchanges in the same tile come from PeeringDB, not OpenStreetMap.process_dc_pipeline.py::process_osm_datacenters: the same elements becomesource=OpenStreetMaprows of the DC pipeline, conflated with Epoch AI, PNNL IM3 (itself ODbL), Wikidata and hyperscaler disclosures — a site reported by a richer source keeps that source's record and the OpenStreetMap point fills where no other source has it.
9. Telecom and fibre
served layers: Terrestrial fibre (terrestrial_fiber.pmtiles), Fibre routes (fiber_routes.pmtiles), US fibre (us_fiber.pmtiles), all free · modules: etl/download_water_fiber.py, etl/download_fiber_routes.py, etl/download_us_fiber.py, etl/process_water_fiber.py, etl/process_fiber_routes.py, etl/process_us_fiber.py · refresh: a static release — the downloader is not in any workflow; re-fetched by hand
9a. Terrestrial fibre — download_water_fiber.py::download_terrestrial_fiber (the tag set) and process_water_fiber.py --pbf (the served tile since 2026-11-03, worldwide)
[out:json][timeout:300];
(
way["communication"="line"]["telecom:medium"="fibre"]({s},{w},{n},{e});
way["telecom"="cable"]({s},{w},{n},{e});
way["utility"="telecom"]({s},{w},{n},{e});
);
out geom;
| key | description | south | west | north | east |
|---|---|---|---|---|---|
| fiber_gb | GB fiber | 49.9 | -10.5 | 60.9 | 1.8 |
| fiber_fr | France fiber | 42.0 | -5.5 | 51.1 | 9.6 |
| fiber_de | Germany fiber | 47.2 | 5.8 | 55.1 | 15.1 |
| fiber_nl_be | Netherlands+Belgium | 49.5 | 2.5 | 53.6 | 7.2 |
| fiber_nordics | Nordics fiber | 54.0 | 4.0 | 71.0 | 31.0 |
| fiber_iberia | Spain+Portugal fiber | 36.0 | -10.0 | 44.0 | 4.0 |
| fiber_italy | Italy fiber | 36.0 | 6.5 | 47.1 | 18.5 |
Since 2026-11-03 the served tile comes from the Geofabrik continent extracts of 2026-11-02 (the same files and osmium steps as
section 7·0), not from these seven Overpass boxes: a way matches when it carries one of the three clauses above
(communication=line with telecom:medium=fibre, telecom=cable, or utility=telecom —
classify_fiber); the filter expressions are the w/communication=line, w/telecom=cable and
w/utility=telecom lines of:
nwr/man_made=dam,reservoir_covered,water_works,desalination_plant,wastewater_plant,pumping_station,water_tower nwr/waterway=dam,pipeline w/man_made=pipeline w/communication=line w/telecom=cable w/utility=telecom
Rules (process_water_fiber.py::process_terrestrial_fiber / process_from_pbf): every matching way kept, deduplicated by OpenStreetMap id; properties name, operator, medium (telecom:medium, fibre when absent), location, osm_id.
9b. US confirmed fibre — download_fiber_routes.py::download_osm_fiber
[out:json][timeout:300];
(
way["communication"="line"]({s},{w},{n},{e});
way["telecom:medium"="fibre"]({s},{w},{n},{e});
way["telecom"="cable"]({s},{w},{n},{e});
way["utility"="telecom"]({s},{w},{n},{e});
);
out geom;
| key | description | south | west | north | east |
|---|---|---|---|---|---|
| us_west | 24 | -130 | 50 | -100 | |
| us_central | 24 | -100 | 50 | -85 | |
| us_east | 24 | -85 | 50 | -60 |
9c. European mainline rail (a fibre-corridor proxy) — download_fiber_routes.py::download_eu_rail
[out:json][timeout:300];
(
way["railway"="rail"]["usage"~"main|branch"]["service"!~"siding|spur|yard"]({s},{w},{n},{e});
);
out geom;
| key | description | south | west | north | east |
|---|---|---|---|---|---|
| eu_gb_ie | 49 | -11 | 61 | 2 | |
| eu_france | 42 | -5 | 51 | 8 | |
| eu_iberia | 35 | -10 | 44 | 4 | |
| eu_benelux_de | 47 | 2 | 55 | 15 | |
| eu_nordics | 54 | 4 | 72 | 32 | |
| eu_italy | 36 | 6 | 47 | 19 | |
| eu_central | 46 | 12 | 52 | 24 | |
| eu_east | 42 | 19 | 56 | 30 | |
| eu_baltics | 53 | 20 | 60 | 29 | |
| eu_greece_tr | 35 | 19 | 42 | 30 |
Rules (process_fiber_routes.py): OpenStreetMap fibre ways are route_type=confirmed_fiber, source=OpenStreetMap; rail
corridors are proxies (route_type=rail_proxy) with an estimated bandwidth class by rail class — the EU rail proxies are OpenStreetMap-derived,
the US ones come from BTS / FRA. Elements deduplicated by OpenStreetMap id.
9d. US telecom exchanges — download_us_fiber.py::download_osm_telecom_exchanges
[out:json][timeout:300]; ( node["telecom"="exchange"](24,-130,50,-60); way["telecom"="exchange"](24,-130,50,-60); node["telecom"="central_office"](24,-130,50,-60); way["telecom"="central_office"](24,-130,50,-60); ); out center;
Rules (process_us_fiber.py::process_osm_exchanges): points (node or centre), deduplicated by id, type=exchange (no element id is kept;
the CSV export credits these rows by layer and type); the colocation facilities (PeeringDB) and FCC BDC tract points in the same tile are not
OpenStreetMap-derived.
10. Offshore cables
served layer: Submarine Power Cables (OSM) (offshore_cables.pmtiles, free) · raw files: osm_ow_pbf/<extract>.geojsonseq (+ .prov.json), osm_ow_<key>.json · modules: etl/download_offshore_cables.py, etl/process_offshore_cables.py · refresh: a static release — rebuilt by hand; worldwide from 2026-11-03 (Geofabrik extracts: Europe and the United States as of 2026-11-01, the other continents as of 2026-10-15), the eight Overpass boxes below until then
10a. Worldwide — the OpenStreetMap extracts through osmium (from 2026-11-03)
Geofabrik's continent extracts (africa, asia, australia-oceania, central-america, south-america, russia, north-america's canada / mexico / us,
europe with its belarus / georgia / moldova / ukraine files; nothing for Antarctica — OpenStreetMap as of 2026-11-01 for europe and us,
2026-10-15 for the rest), each first reduced to the tags this site's OpenStreetMap
layers read, then osmium tags-filter with the union of the four selections of the query below and osmium export
(-f geojsonseq --geometry-types=linestring -a id: every kept way as a line with all its tags and its id):
osmium tags-filter -o <stem>.filtered.osm.pbf <extract>.osm.pbf w/power=cable w/location=underwater,submarine w/submarine=yes w/seamark:type
The processor then applies the query's AND conditions to every exported way (process_offshore_cables.is_offshore_cable:
power=cable with location=underwater or submarine, or with submarine=yes;
power=line with location=overhead and a seamark:type), so the extracts admit exactly the ways the
Overpass query admits. 2026-11-03 build: 218,188 ways exported, 2,621 served (2,359 from the europe extract, 136 asia, 44 australia-oceania,
40 us, 21 canada, 11 south-america, 9 africa, 1 central-america; mexico, russia, belarus, georgia, moldova and ukraine 0 — OpenStreetMap maps
no submarine power cable there under these tags). A cable tagged location=underground on the seabed, or with no location
tag, is not served (215 such ways carry seamark:type=cable_submarine; the selection is the 2026-04 build's, unchanged).
10b. The eight Overpass boxes (the 2026-04 build; still read, adding only ways the extracts lack)
[out:json][timeout:300];
(
way["power"="cable"]["location"="underwater"]({s},{w},{n},{e});
way["power"="cable"]["location"="submarine"]({s},{w},{n},{e});
way["power"="line"]["location"="overhead"]["seamark:type"]({s},{w},{n},{e});
way["power"="cable"]["submarine"="yes"]({s},{w},{n},{e});
);
out geom;
| key | description | south | west | north | east |
|---|---|---|---|---|---|
| ow_gb | GB offshore | 49 | -10 | 62 | 3 |
| ow_ne_atlantic | NW Europe Atlantic | 50 | -5 | 62 | 12 |
| ow_baltic | Baltic Sea | 53 | 8 | 66 | 30 |
| ow_med | Mediterranean | 35 | -10 | 46 | 36 |
| ow_us_east | US East Coast | 24 | -82 | 45 | -65 |
| ow_china_e | China East Coast | 18 | 105 | 42 | 125 |
| ow_japan | Japan offshore | 30 | 128 | 46 | 146 |
| ow_taiwan | Taiwan Strait | 21 | 117 | 26 | 123 |
Rules: every way kept, deduplicated by OpenStreetMap id (the extracts first, then the boxes); properties name, operator, voltage
(parsed as for the lines), cables, frequency, location, osm_id; the tile carries the credit
"© OpenStreetMap contributors, ODbL 1.0" in its metadata.
The 2026-04 layer's North American ways (west of 50° W) were copied to etl/seed/offshore_cables_na.geojson, which the HIFLD
gap-fill of §1 compares HIFLD lines with (2026-10-13); that copy is pinned by checksum and did not change with the worldwide build.
11. Aerodromes: exclusion zones, suitability, WECC CEM screening
served: Exclusion zones (exclusions.pmtiles, the airports source-layer, free); Site suitability (suitability.pmtiles); WECC CEM screening rasters (excl_airports.cog.tif, combined_exclusion, bitmask bit 3) and the downloads bundle; the global route finder's grids on US land (cats.tif's airport bit, from 2026-11-04) and in Great Britain and Europe (from 2026-11-05); the 1 km and 100 m route grids (cats.tif, fine.tif: these aerodrome points from 2026-10-15, the aerodromes of the seeds below from 2026-11-05); Site Development Cost, Grid Connection by Size and Site Value through those bits · modules: etl/download_suitability.py, etl/process_exclusions.py, etl/score_suitability.py, etl/build_wecc_exclusions.py, etl/publish_wecc_cem_inputs.py, etl/build_route_global.py, etl/build_route_finder.py, etl/build_route_fine.py, etl/build_site_cost_ext.py, etl/_airport_outlines.py, etl/build_airport_outlines.py, etl/seed/us_airport_outlines.geojson, etl/seed/airport_outlines.geojson, etl/build_airport_point_names.py, etl/seed/airport_point_names.json · refresh: the weekly suitability workflow (Mondays 03:00 UTC) runs the downloader, which fetches the aerodrome file only when its cached copy is missing; the exclusions tile was built 2026-04 and rebuilt 2026-11-05 from the same points and the seeds below; the WECC CEM rasters are a static release (2026-09-11)
11a. Aerodromes worldwide — download_suitability.py::download_airports
[out:json][timeout:300]; ( node["aeroway"="aerodrome"]; way["aeroway"="aerodrome"]; relation["aeroway"="aerodrome"]; ); out center;
process_exclusions.py::process_airports: one point per aerodrome (node or centre), properties name, type = airport, the IATA code where tagged → the exclusions tile, with a marker at the centre of each aerodrome of the seeds below that has no point yet.build_route_global.py::file_airports: on the global route grids that hold the US or Europe designations (§12), these points on that land set the airport bit: the cells a 1.5 km disc touches round a point with aniatatag, and the cell a point falls in for any other. A point on a sea cell of the grid stands on the nearest land cell within two cells, and takes that cell; with none it sets nothing. On the 5 km world grid only a point whoseiatatag holds three capital letters, alone or among several codes, sets the bit, as the tag also holds other identifiers, and it does so on that land and on Europe's small territories it leaves out (Kosovo, the Isle of Man, Jersey, Guernsey, Åland, the Faroes, northern Cyprus and the British bases), and in Melilla's cell. No name or code is kept on the grids; the names seed below holds names apart from them. The query has asked for relations too since 2026-11-05; the file in use was fetched in April 2026 with nodes and ways only, so an aerodrome mapped only as a relation is not among these points, and the seeds below hold it; a closed way is one point here, at the middle of its bounds, and the seed below holds the outline of one larger than that point's square.etl/seed/us_airport_outlines.geojson: the aerodrome relations in Alaska east of 180° and in Hawaii, Honolulu, Juneau and Sitka among them, 21 outlines, 12 of which also have a point above, with name andiatatag and no element id, cut from Geofabrik's US extract (2026-11-01) withosmium tags-filteronr/aeroway=aerodromeandosmium export --geometry-types=polygon.file_airportscounts each as a point at its representative point, by the rule above, and it also sets the cells its outline touches on US land; on the 5 km world grid only those whoseiatatag is three capital letters count.etl/seed/airport_outlines.geojson: the aerodrome relations of the contiguous US, Puerto Rico and the US Virgin Islands, Great Britain, Northern Ireland and Europe, O'Hare, Heathrow, Frankfurt and San Juan among them, and the closed ways of those places and of Alaska east of 180° and Hawaii, Denver, Orlando, Madrid and Paris Charles de Gaulle among them, when the square a point above gets on the 100 m grid (2.1 km across with aniatatag, 0.7 km without) does not hold the way's whole outline, as with one larger than that or with no point there: 7205 outlines, 785 relations and 6420 ways, with element id (osm_id), name,iataandicaotags, country and centre, byetl/build_airport_outlines.pyfrom Geofabrik's US and Europe extracts (2026-11-01) and Central America extract (2026-10-15):osmium tags-filteronw/aeroway=aerodromeandr/aeroway=aerodrome,osmium export --geometry-types=polygon; a relation whose rings do not close, or a closed way that crosses itself, takes the convex hull of its nodes, up to 200 km², else a point at their centre; simplified to 0.0003°. Heliports, gliding sites and microlight strips stay when they are taggedaeroway=aerodrome, as the points above keep them; those tagged or named closed, abandoned, disused or historic are left out, and the file lists them, apart from three working airfields kept by element id (College Park, Stanton, Southern California Logistics), and most closed fields keep their point above, as those points do not test the tags; so are the 117 outlines with no name under 0.05 km², which it counts, and a named one stays however small. Each counts as a point at its centre by the reader's own rule for a point, and also sets the cells its outline touches on land, on the route grids, on the same land of the 5 km grid for aniatacode (build_route_finder.py::_airports,build_route_fine.py::_airport_mask,file_airports) and on the Site Development Cost grids of Alaska, Hawaii and Puerto Rico (build_site_cost_ext.py::_airports); both seeds add markers to the exclusions tile. The Site Development Cost, Grid Connection by Size and Site Value rasters take the route grids' bits, so they are Produced Works of these aerodromes too.etl/seed/airport_point_names.json: the names of the aerodromes above, 43453 rows, byetl/build_airport_point_names.py: each named point above, coded or not, and each namedaeroway=aerodromeof the regional Geofabrik extracts the 2 km and 5 km grids read (§12) that no point of that name stands near, as the points leave out relations. A row holds the name, its longitude and latitude to four decimal places, whether itsiatatag holds three capital letters (no code is kept), and for an area the distance from the middle of its bounds, where the row stands, to their corner. No element id and no outline. Only the route finder reads it, and only for its words: to name the airport a line on the 2 km or 5 km grids may cross where that is the only way through, and the airport a click stands on. No grid, tile or raster reads it.score_suitability.py: the Site Suitability Score is computed from distances to the nearest features of our processed layers — substations, transmission lines, gas pipelines, data centres, water infrastructure, European terrestrial fibre and US fibre points (all of which carry OpenStreetMap-derived features, sections 1, 2, 5, 7, 8 and 9) — and from the aerodrome points above (a 5 % weight, with a 2–5 km exclusion distance by technology). A score or verdict quoted in a site report is a Produced Work of these derived databases, and the site report prints the OpenStreetMap credit when it quotes one. The suitability tile (suitability.pmtiles, a vector tile of grid cells) also carries each cell's distance fields —sub_dist_km,line_dist_km,water_dist_km,gas_dist_km,fiber_dist_km,airport_dist_km— which are derived from the layers above: under the ODbL for their OpenStreetMap-derived part and covered by the offer below (the CSV export credits every row of this layer), as are the aerodrome points and the other layers' OpenStreetMap-derived parts.- The Suitability score and the WECC screening rasters (§11b) still read nodes and ways only: the score reads the cached file of nodes and ways until it is refreshed, and the rasters were built from their own cache. An aerodrome mapped only as a relation carries no airport distance in the score and no mask in the rasters, and one mapped as a closed way counts as one point there.
11b. WECC aerodromes — build_wecc_exclusions.py::layer_airports
[out:json][timeout:300];(node["aeroway"="aerodrome"]({s},{w},{n},{e});way["aeroway"="aerodrome"]({s},{w},{n},{e});relation["aeroway"="aerodrome"]({s},{w},{n},{e}););out center;
{s},{w},{n},{e} is the bounding box of the eleven WECC states. Rules: the aerodrome points inside the WECC footprint are buffered by
airport_buffer_km (3.0 km by default; the value is recorded in each raster's .prov sidecar) and burned into a 250 m uint8 mask
(excl_airports.cog.tif; bit 3 of bitmask.cog.tif; part of combined_exclusion.cog.tif and of the per-state airport km²
in screening_summary.csv). The published COGs are Produced Works of this derived database; the buffered aerodrome polygons and the source
points are included in the offer, and the downloads bundle's README carries the credit and this page's address. The query has asked for relations too since 2026-11-05; the published rasters were built from a cache of nodes and ways, fetched before that.
12. The global route finder's constraints: protected areas, military land, aerodromes
served: Exclusion zones (route_constraints_global.pmtiles, the constraints source-layer, free; from 2026-11-03) and the global route finder's 2 km grids (the cats.tif no-go / sensitive bands and the route card's designation names) · modules: etl/build_route_global.py, etl/build_route_constraints_global.py · refresh: a static release — the extracts were downloaded 2026-10-16; re-fetched by hand with the global route grids
12a. Geofabrik extracts — build_route_global.osm_extract
Not Overpass: the continent extracts central-america-latest.osm.pbf, europe_moldova-latest.osm.pbf, europe_georgia-latest.osm.pbf, europe_belarus-latest.osm.pbf, europe_ukraine-latest.osm.pbf, north-america_mexico-latest.osm.pbf, australia-oceania-latest.osm.pbf, russia-latest.osm.pbf, south-america-latest.osm.pbf, north-america_canada-latest.osm.pbf, africa-latest.osm.pbf, asia-latest.osm.pbf from
download.geofabrik.de, each filtered with
osmium tags-filter and exported with osmium export --geometry-types=polygon,point (multipolygons assembled by osmium):
nwr/boundary=protected_area,national_park nwr/leisure=nature_reserve nwr/landuse=military nwr/military=airfield,base,danger_area,naval_base,range,training_area nwr/aeroway=aerodrome
12b. Classification — build_route_global.osm_class
Rules, the same for the route grids and the map: no-go (type=nogo) = boundary=national_park, or
protect_class in 1, 1a, 1b, 2 on a boundary=protected_area / leisure=nature_reserve;
sensitive = the other protected areas and nature reserves, except protect_class 7–29 (cultural, resource and social
protection are not nature designations); military = landuse=military or military=airfield / base / danger_area / naval_base / range / training_area;
airport = aeroway=aerodrome areas, and a 1.5 km disc round an aerodrome mapped as a point with an iata or
icao code (an uncoded aerodrome point is left out). Properties kept: type, name (name:en, else
name), kind (protection_title or designation, else "National park" / "Nature reserve" /
"Protected area" / "Military land" / "Airport"). No element id is kept.
Where: only outside the countries whose designations the route grids take from the US / Europe route builds (PAD-US; Natura 2000,
the nationally designated areas and the UK agencies — build_route_global.DESIG_COUNTRIES: the United States and its territories;
the EU27, the UK, Norway, Iceland, Switzerland, Liechtenstein, the Balkans and Turkey), judged per feature by its representative point (the route grids judge each 2 km cell, so an area straddling such a border may differ at the line)
(a feature is kept when any continental grid holding it reads OpenStreetMap there, else by the 5 km world grid's rule) with the feature's
country from Natural Earth; one geometry exported twice (a way and its relation, or a border park in two extracts) is kept once. The
route grids rasterise the same features at 2 km (a cell by its centre; airports by any touch). Aerodromes are the exception on the route grids: every one
these rules keep from an extract is rasterised there, inside those countries too (Puerto Rico's, for one), while route_constraints_global.pmtiles leaves them out.
The extracts barely reach US land and hold little of Europe, so the grids that hold the US or Europe designations also rasterise the aerodrome points of §11a there, and the outlines beside them (§11a says how); the map draws those points and a marker for each outline in the exclusions tile, not in
route_constraints_global.pmtiles, and does not draw the outlines. US land on a grid holding no US designations reads the extracts alone: the far Aleutians, west of 180°, on the grid of Russia and Mongolia, and Guam and the Northern Marianas on their Asian grids.
13. Wind turbines — Mexico (the wind turbines layer's OpenStreetMap part)
served: the Wind turbines layer's Mexican turbines and projects (wind_turbines.pmtiles, source layers wind_turbines and wind_projects, free; from 2026-11-03) — the United States (USWTDB) and Canada (CWTD) in the same tile come from their own public sources, not from OpenStreetMap · modules: etl/build_wind_turbines.py --mexico-osm, etl/_gen_pipeline.py · refresh: a static release — rebuilt by hand with the layer; the extract was downloaded 2026-11-02
13a. The extract through osmium (not Overpass)
Geofabrik's north-america/mexico extract (as of 2026-11-02), through osmium tags-filter with the
expression below, then osmium cat -f opl, parsed by the builder (nodes, ways and relations):
nwr/power=generator nwr/power=plant nwr/generator:source=wind nwr/plant:source=*wind
13b. Processing rules (the builder's mexico_features)
- A turbine is a
power=generator+generator:source=windnode; a way or relation generator is not taken (none existed in the extract). - A farm is a
power=plant+plant:source~windsite relation or way; a turbine takes the name of the plant it is a member of, else its own name, else "unknown <state>". - The rating, the hub height, the rotor diameter, the tip height, the manufacturer, the model, the operator and the lifecycle are read from the element's own tags with the GB layer's rules (§3): a turbine whose lifecycle is not operating is dropped; two generator nodes within 3 m with identical tags are one turbine mapped twice.
- Clipped to Mexico with Natural Earth's 1:10m states: a node in no Mexican state and more than 3.0 km from every state outline is dropped and counted (the extract bleeds across the United States border, where the USWTDB already holds the turbines; a border check keeps the two sources apart).
- Properties kept:
country=MX,src=OSM,id= the OpenStreetMap node id,name,state, the rating in kW, the size class,manu,model,hub,rotor,tip,operator,plant. The project points (wind_projects) are the layer's own clustering of the turbines by plant name, as for the United States and Canada; a Mexican project point carriescountry=MX. - The other direction is closed: no OpenStreetMap coordinate or attribute enters the USWTDB or CWTD rows, the plant registers or any API answer.
The offer (ODbL s.4.6)
For every dataset above, and for anything this page has missed, CEAtlas will supply on request, free of charge and without restriction beyond the ODbL itself:
- a machine-readable copy of the layer's OpenStreetMap-derived data as served (GeoJSON), or
- the raw Overpass answer the release was built from (the files named above), together with this page's version, which is the method.
Write to hello@compoundingenergy.com. The layers that mix OpenStreetMap with other sources (transmission lines, substations, planned upgrades, gas pipelines, gas facilities, the DC pipeline, fibre routes, US fibre, site suitability, wind turbines (Mexico)) are supplied as their OpenStreetMap-derived part; the analysis rasters built over the served lines, substations and aerodromes — Site Development Cost, Grid Connection by Size, the civil works adders, Site Value — in the United States (Alaska, Hawaii and Puerto Rico included), Great Britain and Europe are Produced Works of those datasets (§1, §2, §11), and the OpenStreetMap-derived data they were built from is the same served data, supplied on the same request; the other sources are credited under their own licences, listed on the licences page. Whether such a layer is one database or a collection of databases under the ODbL is not settled.
Licence and attribution
OpenStreetMap data is © OpenStreetMap contributors, available under the Open Database Licence (ODbL) 1.0; www.openstreetmap.org/copyright. The map shows “© OpenStreetMap contributors” in its credit, the CSV export writes it on every OpenStreetMap-derived row (by element id, source field, or layer and type where a layer keeps no id), the site report prints it in its footer when it quotes these layers, and the licences page lists them. Map images, rasters, charts and reports made from these layers are Produced Works and may be used under CEAtlas's terms with that credit (the paid analysis rasters — Site Development Cost, Grid Connection by Size, civil works, Site Value — are such Produced Works on every grid they cover, the United States included, and say so in their layer information); the OpenStreetMap-derived data in the vector map tiles, in the CSV rows and in the copies offered here is under the ODbL.
What is not OpenStreetMap-derived, so that the boundary is clear: the plant registers (EIA, REPD, powerplantmatching,
the national registries), the GB fleet census and BM-unit tables, PyPSA-Eur gridkit lines and buses, the HIFLD Open territory
and grid-region polygons, the Natural Earth features, the weather and capacity-factor products, and every Compounding Energy
forecast. The GridFinder predicted grid is a published model output (CC BY 4.0) whose inputs included OpenStreetMap topology; the
lines it marks source=osm are excluded from what we serve. OpenStreetMap is used as an internal cross-check for the GB
plant and unit locations, and nothing is copied from it into them.
Change log
| Date | Version | Change |
|---|---|---|
| 2026-11-07 | 1.11 | A substation node or way with a state that takes it out of service (disused, abandoned, under construction, demolished and the like, the lines' rule) is left out of the served substations (§2), as a relation already was. |
| 2026-11-06 | 1.10 | The substation queries for the United States, every other country and France (§2), and the planned substations (§4), ask for relations as well as nodes and ways, as the Great Britain query already did. A station mapped as a relation sits on its centre; one that repeats a node or way counts as one station with it, and one out of service is left out (§2's rules). They join the Substations layer from the first nightly build after this change, as each file's refresh comes round. The paid analysis rasters read them at their next rebuild, and the Connection Study when its list of connection points is next rebuilt with them. |
| 2026-11-05 | 1.9 | A new seed of aerodrome names and places (§11a), from the points of §11a and the regional extracts of §12. The route finder reads it only to name, in its words, the airport a line on the 2 km or 5 km grids may cross or a click stands on. |
| 2026-11-05 | 1.8 | The aerodromes mapped as relations in the contiguous US, Puerto Rico, Great Britain, Northern Ireland and Europe, and those mapped as closed ways larger than the square their point gets, in the same places and in Alaska and Hawaii, join these readers from a new seed (§11a): the route grids at 100 m, 1 km and 2 km, the 5 km grid for those with an iata tag, Site Development Cost in Alaska, Hawaii and Puerto Rico, the Site Development Cost, Grid Connection by Size and Site Value rasters through the route grids' bits, and the exclusions tile's markers. The Suitability score and the WECC screening rasters still read nodes and ways only, a closed way as one point. Both queries ask for relations too, for their next refresh. |
| 2026-11-04 | 1.7 | The global route finder's grids that hold the US designations read the aerodrome points of §11a on US land,
Alaska and Hawaii included, where the extracts of §12 barely reach, and in Alaska and Hawaii the outlines of the aerodromes mapped as relations, from Geofabrik's US extract (§11a, §12); on the 5 km world grid only those with an iata tag. The query did not change. |
| 2026-11-03 | 1.6 | The offer and the licence paragraph name the paid analysis rasters (Site Development Cost, Grid Connection by Size, civil works, Site Value) as Produced Works of the served lines, substations and aerodromes on every grid they cover — the United States with Alaska, Hawaii and Puerto Rico, Great Britain, Europe — whose OpenStreetMap-derived inputs are the served datasets of §1, §2 and §11, supplied on the same request. No query or rule changed. |
| 2026-11-03 | 1.6 | The Offshore cables layer (§10) is rebuilt worldwide as Submarine Power Cables (OSM): Geofabrik's extracts of every continent (Europe and the United States as of 2026-11-01, the other continents as of 2026-10-15) through osmium (10a), the same selection and properties as the eight Overpass boxes of 2026-04 (10b, still read); 2,621 ways served, 2,252 before. Nothing else changed. |
| 2026-11-03 | 1.6 | The Wind turbines layer (§13) gains Mexico: OpenStreetMap's wind generators and wind plants from Geofabrik's Mexico extract (osmium, not Overpass), beside the United States and Canadian turbines from their own public sources; the layer joins the mixed-source list of the offer. Nothing else changed. |
| 2026-11-03 | 1.5 | The global route finder's OpenStreetMap constraints (§12) are drawn in the
Exclusion Zones layer worldwide, outside the countries the US / Europe route builds cover: route_constraints_global.pmtiles,
from Geofabrik's continent extracts (not Overpass) through the route grids' own classification. Nothing else changed. |
| 2026-10-13 | 1.4 | United States (from the first nightly build after this change): the underground HV cables are fetched (1e) and served in the Transmission lines layer with the overhead lines; HIFLD lines are drawn only where no line on this layer or the Offshore cables layer has the line (the HIFLD gap-fill rule above). Which HIFLD lines are drawn is decided against the OpenStreetMap lines, so the offer covers them too. |
| 2026-10-12 | 1.3 | Great Britain's 33–99 kV cables on land (from the first nightly build after this change): in the GB extract a cable is now kept from 33 kV, like a line, unless it runs under water below 100 kV (offshore-wind inter-array and island cabling stays out); the continental and Ireland files keep the 100 kV cable floor (§1). Substations: 100–219 kV from zoom 7 (was 9) and 31–99 kV from zoom 9 (was 11) in the tile (§2). The queries are unchanged. |
| 2026-10-08 | 1.2 | France's substations in tiles (2e; from the first nightly build after this change): France's area query (2a) outgrew Overpass's time limit, so France is fetched as 13 bounding-box tiles with 2a's selection and merged into the same file. A cached substation extract with no elements is now fetched again rather than kept. The other countries' queries, the processing rules and the served properties are unchanged. |
| 2026-10-04 | 1.1 | The GB backbone switch (served from the first nightly build after this change): Great Britain's lines and cables at 220 kV and up now come from the GB lines-and-cables extract (1d) — 400 kV, 275 kV and the 220 kV offshore-wind export cables, a dual-voltage way as two rows — with Great Britain's internal HVDC links and the four interconnectors gridkit lacks (Viking Link, IFA2, ElecLink, Greenlink) as whole OpenStreetMap ways; PyPSA-Eur gridkit's lines and links with both ends in Great Britain leave the served layer except eleven 275 kV circuits (92 km) OpenStreetMap does not map continuously at 275 kV and the Great Britain half of Nemo Link (it continues gridkit's cross-border link), and gridkit keeps its cross-border links (never drawn twice), Northern Ireland, Ireland and the continent. Rules in §1 (the backbone bullet); the fallback keeps gridkit whenever the extract is absent or substantially short. On the pilot extract of 2026-10-02 the switch serves, before de-duplication, 7,000 km of 400 kV, 3,067 km of 275 kV (the 250–344 kV class, which includes the 254 kV Hornsea ONE export cable) and 1,020 km of 220 kV route from OpenStreetMap in place of 457 gridkit features (11,880 km); the in-app question “transmission lines in the UK” now counts these rows. The licences page, the Transmission layer card and the manual carry the same wording. The GB substations layer is unchanged (gridkit buses stay). |
| 2026-10-03 | 1.0 | First publication. The page lists the GB datasets of the 2026-10-03 change as they enter service (the lines-and-cables extract from the first nightly build after this change; the wind layer with the deploy of 2026-10-03): the lines-and-cables extract replaces the all-lines file (lines 33–219 kV and cables 100–219 kV served; a multi-voltage way kept at its sub-220 kV level); the GB wind turbines layer (OpenStreetMap only, UK regional cut with the widened offshore boxes); the HV substation polygons fetched for the network topology work (not served). Worldwide, busbars, bays and lifecycle-tagged ways leave the lines layer; the near-duplicate rule gains the route-coincidence test for pairs with a GB-file way (the rule elsewhere is unchanged). The map credit reads “© OpenStreetMap contributors”, the CSV export, the site report and the WECC CEM downloads README carry the credit, and the Terms carve ODbL data out of their restrictions. |