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 minutesHourDay
Without a key20120500
With a key604002,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.

GET No key needed JSON or binary files Up to 30 km square 2-bit classes and pylon list 120 an hour without a key, 400 with one

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.

GEThttps://www.altimetercloud.com/api/power/lat lon size_km

Parameters

ParameterMeaning
lat, lonThe middle of the square, decimal degrees (lng also accepted)
size_kmThe square's side in km, more than 0 and up to 30. Left out, 1. Squares over 10 km come as a file only.
formatOptional. 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.
compressOptional. none (the default), zlib or lzma, as on the Inland Water API.
classesOptional. The line classes to keep, such as 1; the other classes come back as 0. Left out, all.
downloadOptional. 1 makes a browser save a file answer.

The lines

ClassWhatOpenStreetMap
0Nothing
1Transmission linepower=line
2Distribution linepower=minor_line
3Spare, 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 byteTypeValue
0char[4]ACPY
4uint8Version, 1
5uint8Record size, 16
8uint32Records
12int32The square's middle, latitude × 107
16int32The square's middle, longitude × 107
20uint32The square's side, metres
Record byteTypeValue
0int32Latitude × 107
4int32Longitude × 107
8uint16Height, decimetres
10uint16Voltage of its line, kV (0 not known)
12uint160
14uint8Type: 1 pylon
15uint8Flags: 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

CodeMeaning
412A parameter is missing or not valid, the square is more than 30 km, or JSON was asked for over 10 km
413The square has too many cells, which only happens very close to the poles
429Too many requests from your address, or one still being answered
501The 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.