Power Lines API
Access & limitsPublic, no key needed · Heavy▾
Open to everyone. A free API key from your profile raises the limits: send it in an X-API-Key header, or as api_key= in the address.
| 5 minutes | Hour | Day | |
|---|---|---|---|
| Without a key | 20 | 120 | 500 |
| With a key | 60 | 400 | 2,000 |
Each 100 square km of area counts as one request, so a 10 km square is 1 and a 30 km square is 9.
Log in to create a free key on your profile page.
Every answer carries X-RateLimit-Remaining and X-RateLimit-Reset. Over a limit, the answer is error 429 with retry_after in seconds. Refused requests do not count.
Where the overhead power lines are over a square around a point, and every pylon on them with its height, the same data the Power Lines Map draws. Ask for it as JSON for a web page or script, or as small binary files a flight computer or ground station can carry.
lat lon size_kmParameters
| Parameter | Meaning |
|---|---|
lat, lon | The middle of the square, decimal degrees (lng also accepted) |
size_km | The square's side in km, more than 0 and up to 30. Left out, 1. Squares over 10 km come as a file only. |
format | Optional. json (the default): the grid as base64 and the pylons as a list. bin: the grid as a file. pylons: the pylons as a file. |
compress | Optional. none (the default), zlib or lzma, as on the Inland Water API. |
classes | Optional. The line classes to keep, such as 1; the other classes come back as 0. Left out, all. |
download | Optional. 1 makes a browser save a file answer. |
The lines
| Class | What | OpenStreetMap |
|---|---|---|
| 0 | Nothing | |
| 1 | Transmission line | power=line |
| 2 | Distribution line | power=minor_line |
| 3 | Spare, not used yet |
Any cell a line crosses at all takes its class, so each line comes back as an unbroken band of cells however it runs; where the two meet, transmission is kept. Lines mapped as underground or underwater are left out. The grid is the Inland Water API's: cells of 1/12000 of a degree, row 0 the north edge and column 0 the west edge, two bits a cell, four cells a byte, the first cell in the highest bits, each row starting on a whole byte.
The pylons
Every pylon (power=tower) in the square, nearest the middle first, with its height in metres, the voltage of the line it carries in kV, and whether the height is estimated. Where OpenStreetMap records a pylon's height, that is used. Most have none, so the height is estimated from the voltage: 50 m for 380 kV and up, 45 m for 220 kV and up, 30 m for 110 kV and up, 22 m for 60 kV and up, 15 m for 30 kV and up, 12 m below that, and 30 m where the voltage is not known either. The wires hang from the pylon tops and sag lower between them, so a pylon's height is the most its wires can reach.
The JSON answer
{
"success": true,
"lat", "lon", "size_km", "bits", bits is 2
"rows", "cols", "cells", "row_bytes", the grid, as above
"cells_per_degree", "north_edge_cell", "west_edge_cell",
"north", "south", "west", "east",
"line_pct", "class_pct", "classes", "kept",
"coverage_pct",
"data_b64", the grid rows, row 0 first
"pylon_count",
"pylons": [ { "lat", "lon", "distance_m",
"height_m", "kv", "height_estimated" } ],
"credits": { "power", "licence", "data_licence", "full" }
}
The binary files
format=bin: the grid, with the same 32 byte header as the water, roads and tree canopy files, named ACPW, version 1, 2 bits a cell. format=pylons: a 32 byte header then 16 byte records, little endian, nearest the middle first.
| Header byte | Type | Value |
|---|---|---|
| 0 | char[4] | ACPY |
| 4 | uint8 | Version, 1 |
| 5 | uint8 | Record size, 16 |
| 8 | uint32 | Records |
| 12 | int32 | The square's middle, latitude × 107 |
| 16 | int32 | The square's middle, longitude × 107 |
| 20 | uint32 | The square's side, metres |
| Record byte | Type | Value |
|---|---|---|
| 0 | int32 | Latitude × 107 |
| 4 | int32 | Longitude × 107 |
| 8 | uint16 | Height, decimetres |
| 10 | uint16 | Voltage of its line, kV (0 not known) |
| 12 | uint16 | 0 |
| 14 | uint8 | Type: 1 pylon |
| 15 | uint8 | Flags: bit 0, height estimated from the voltage; bit 1, voltage not known either |
Examples
https://www.altimetercloud.com/api/power/?lat=54.35&lon=-2.95&size_km=3
https://www.altimetercloud.com/api/power/?lat=54.35&lon=-2.95&size_km=10&format=bin&compress=zlib
https://www.altimetercloud.com/api/power/?lat=54.35&lon=-2.95&size_km=10&format=pylons
Reading the files
The grid reads exactly as the Inland Water API's 2 bit grid: (row[i >> 2] >> (6 - 2 * (i & 3))) & 3 for column i. The pylons:
// C
typedef struct __attribute__((packed)) {
int32_t lat_e7, lon_e7;
uint16_t height_dm, kv, reserved;
uint8_t type, flags; // flags bit 0: height estimated
} Pylon;
# Python
import requests, struct
f = requests.get('https://www.altimetercloud.com/api/power/',
params={'lat': 54.35, 'lon': -2.95, 'size_km': 10, 'format': 'pylons'}).content
n = struct.unpack('<I', f[8:12])[0]
for i in range(n):
la, lo, h, kv, _, typ, fl = struct.unpack('<iiHHHBB', f[32 + 16 * i: 48 + 16 * i])
print(la / 1e7, lo / 1e7, h / 10, kv, 'estimated' if fl & 1 else 'mapped')
Errors
| Code | Meaning |
|---|---|
412 | A parameter is missing or not valid, the square is more than 30 km, or JSON was asked for over 10 km |
413 | The square has too many cells, which only happens very close to the poles |
429 | Too many requests from your address, or one still being answered |
501 | The compression asked for is not available just now |
Try it
The Power Lines Map has a download panel: move the map so the cross sits on your launch site, choose the lines grid or the pylons, and it saves the file from this API.
Power lines data credits
Contains OpenStreetMap data © OpenStreetMap contributors, available under the Open Database Licence (ODbL), through the regional extracts published by Geofabrik. The lines are reduced here to a class a cell, and pylon heights are estimated from their line's voltage where none is mapped, which changes them: this is not the original data.
Licence of this data. Because it contains OpenStreetMap data, the data this API gives out is made available under the Open Database License (ODbL) 1.0. You may use it freely, commercially too, as long as you credit it as above and share any database you make from it under the same licence.
Crediting AltimeterCloud
Free to use. If you use this API, or anything made from the answers, in a commercial product or service, credit AltimeterCloud with a link to www.altimetercloud.com at the point of use: on the screen, page or printout where the data appears, for example “Data from AltimeterCloud.com”. Any credits the data's own sources ask for, listed on this page, apply as well.



















