# Heat potential maps (WarmteAtlas)

Four map services from RVO's WarmteAtlas: the potential for underground heat and cold storage (WKO) per neighbourhood and municipality, biogas and woody biomass per municipality, a map of 2,283 business sites with their CO2 emissions for estimating residual heat, and a raster map of WKO potential in GJ per hectare per year. Mind the age: the neighbourhood and municipal figures are for 2014 (403 municipalities, the boundaries of that time) and the CO2 figures run to 2013. The dates on PDOK (2024 and 2025) are publication dates, not reference dates.

- Publisher: Rijksdienst voor Ondernemend Nederland, Publieke Dienstverlening Op de Kaart
- Area: Netherlands · Finest detail: neighbourhood (2014 boundaries)
- Period: cijfers 1990 tot en met 2014; gepubliceerd op PDOK 2024 en 2025 · Refreshed: every few years
- Access: Open · Licence: CC0 1.0 (omgevingswarmte, restwarmte, WKO-potentieel), Public Domain Mark 1.0 (reststromen)
- Join keys: cbs_buurtcode_1 (BU… en GM…, indeling 2014), gemeentenaam, coördinaten
- Status: ok (2025-10-16) · publicatiedatum op PDOK; de cijfers zelf zijn van 2013/2014
- URL: https://www.pdok.nl/introductie/-/article/potentiekaart-omgevingswarmte

## What can you do with it?
- **Where could a neighbourhood switch to ground heat?.** Each neighbourhood has the potential for open and closed WKO systems in GJ per hectare per year, next to household heat use. Compare the two. Use the figures as a first sketch: they are from 2014.
- **Where is the residual heat?.** The residual heat map has 2,283 business sites with sector, SBI code and CO2 emissions in 1990, 1995, 2000, 2005, 2010, 2012 and 2013. Most are wastewater treatment plants (832); the biggest emitter in 2013 is E.On on the Maasvlakte (7.2 megatonnes), followed by Essent Amer and Tata Steel IJmuiden.
- **Biogas from manure and organic waste per municipality.** Residual flows gives the biogas potential per municipality from liquid manure, arable residues and organic waste, in GJ per hectare of land. Highest: Renswoude, Boekel and Sint Anthonis (2014 municipalities).
- **Then and now.** Compare the 2013 CO2 emissions on the residual heat map with current figures from the Emissieregistratie. Which large emitters have closed since?

## How to process it
1. **Get neighbourhood figures.** Each neighbourhood collection has the same fields: residents, dwellings, heat use and all potentials. At most 1,000 per page, the next link gives the following; 12,005 neighbourhoods.
   `https://api.pdok.nl/rvo/potentiekaart-omgevingswarmte/ogc/v1/collections/warmteopenwkobuurt/items?f=json&limit=1000`
2. **All residual heat sites.** Two pages of 1,000 and a third of 283. The fields kgco2_1990 to kgco2_2013 are in kilograms; 0 sometimes means unknown (Shell Moerdijk has 0 in 2000).
   `https://api.pdok.nl/rvo/potentiekaart-restwarmte/ogc/v1/collections/liggingindustrieco2/items?f=json&limit=1000`
3. **Join to the 2014 CBS neighbourhoods.** cbs_buurtcode_1 is the 2014 neighbourhood code (BU…) or municipal code (GM…). Join to the 2014 district and neighbourhood map, not the current one: many municipalities have merged since.
   `https://api.pdok.nl/rvo/potentiekaart-reststromen/ogc/v1/collections/totaalpotentieelbiogas/items?f=json&limit=1000`
4. **Counting with the WFS.** Each API also has a WFS. resultType=hits returns the number of objects.
   `https://service.pdok.nl/rvo/potentiekaart-omgevingswarmte/wfs/v1_0?service=WFS&version=2.0.0&request=GetFeature&resultType=hits&typeNames=warmteopenwkobuurt`

## Interesting combinations
- Potential versus current gas use → [cbs-kwb](https://www.opendataindex.nl/en/bron/cbs-kwb.md) via buurtcode (indeling 2014). Join the WKO potential per neighbourhood to the average gas use from the CBS key figures. Use the 2014 CBS table for the same neighbourhood codes.
- Which 2013 emitters still exist? → [emissieregistratie](https://www.opendataindex.nl/en/bron/emissieregistratie.md) via bedrijfsnaam en ligging. Look up the largest sites of the residual heat map in the Emissieregistratie and compare 2013 emissions with today.

## Similar sources
- [emissieregistratie](https://www.opendataindex.nl/en/bron/emissieregistratie.md): Current emissions per sector and year; the residual heat map stops in 2013 but gives the location per company.
- [WarmteAtlas Nederland](https://www.warmteatlas.nl): RVO's own map viewer, with more layers than PDOK offers.
- [klimaateffectatlas](https://www.opendataindex.nl/en/bron/klimaateffectatlas.md): Maps of heat, drought and flooding; no energy potential.

## What to watch out for
- **Old figures with a new date.** The collections show updated 2024-11-21 (residual heat), 2025-06-26 (ambient heat), 2025-07-03 (residual flows) and 2025-10-16 (WKO potential). The content is older: field jaar is 2014 and the CO2 fields run to 2013. According to the NGR the WKO map was last revised on 25 May 2018.
- **Municipalities of 2014.** The municipal collections have 403 municipalities, including Bedum, Maasdonk and Littenseradiel, which no longer exist. Do not join to the current municipal map.
- **No field descriptions.** The collections' /schema gives only field names and types, no units or explanation. tj_warmte on the residual heat map is presumably heat in terajoules, but it is not stated.
- **Truncated names.** Some text fields are truncated, such as the sector 'Riolering en waterzuiveringsinstallat'.

## API (OGC WFS 2.0.0)

- Base: https://service.pdok.nl/rvo/potentiekaart-restwarmte/wfs/v1_0
- Access: No key. Fees: none; access constraints: https://creativecommons.org/publicdomain/zero/1.0/deed.nl. (from the description)
- Formats: application/gml+xml; version=3.2, text/xml; subtype=gml/3.2.1, text/xml; subtype=gml/3.1.1, application/json; subtype=geojson, application/json
- Size: 2283 features in restwarmte:liggingindustrieco2 (tested)
- Filtering: OGC Filter Encoding (FES 2.0); PropertyIsEqualTo, PropertyIsNotEqualTo, PropertyIsLessThan, PropertyIsGreaterThan, PropertyIsLessThanOrEqualTo, PropertyIsGreaterThanOrEqualTo, PropertyIsLike, PropertyIsBetween, PropertyIsNull, Equals, Disjoint, Touches, Within, Overlaps, Crosses, Intersects, Contains, DWithin, Beyond, BBOX, During

### Endpoints
- `GET ?request=GetCapabilities`: service description
- `GET ?request=DescribeFeatureType`: fields of a layer (XSD)
- `GET ?request=GetFeature`: the features themselves, with geometry
- `GET ?request=ListStoredQueries`: stored queries
- `GET ?request=DescribeStoredQueries`: stored query details

### Parameters
- `typeNames`: which layer: restwarmte:liggingindustrieco2 (from the description)
- `outputFormat`: e.g. application/json for GeoJSON (from the description)
- `srsName`: projection, e.g. EPSG:4326 for web maps (default EPSG:28992, RD) (from the description)
- `count / startIndex`: paging (from the description)
- `filter`: FES XML filter on fields or geometry (from the description)
- `bbox`: box in the chosen projection (platform)

### Fields (18)
`geom` geometrie, `gid` integer, `nic` integer, `bedrijf` string, `sbiCode` double, `sbi` string, `doelgroep` string, `subdoelgr` string, `kgco21990` double, `kgco21995` double, `kgco22000` double, `kgco22005` double, `kgco22010` double, `kgco22012` double, `kgco22013` double, `tjWarmte` double, `weergave` double, `fuuid` string

### Limits and pitfalls
- At most 1,000 features per request (CountDefault). (from the description)
- Paging supported: count and startIndex (ImplementsResultPaging). (from the description)
- In the WFS fields are named differently from the OGC API: tjWarmte and kgco22013 versus tj_warmte and kgco2_2013. (tested)
- The four OGC APIs: potentiekaart-omgevingswarmte (8 collections), potentiekaart-reststromen (7), potentiekaart-restwarmte (1) and potentieel-warmte-koude-opslagsystemen (3), all under https://api.pdok.nl/rvo/. (tested)

### Example
```
https://service.pdok.nl/rvo/potentiekaart-restwarmte/wfs/v1_0?request=GetFeature&service=WFS&version=2.0.0&typeNames=restwarmte:liggingindustrieco2&outputFormat=application/json&srsName=EPSG:4326&count=1&propertyName=bedrijf,doelgroep,tjWarmte,kgco22013
```

## How to fetch it

### curl
```bash
curl "https://api.pdok.nl/rvo/potentiekaart-restwarmte/ogc/v1/collections/liggingindustrieco2/items?f=json&limit=5"
```

### python
```python
import requests, collections

url = "https://api.pdok.nl/rvo/potentiekaart-restwarmte/ogc/v1/collections/liggingindustrieco2/items?f=json&limit=1000"
teller = collections.Counter()
while url:
    d = requests.get(url).json()
    teller.update(f["properties"]["doelgroep"] for f in d["features"])
    url = next((l["href"] for l in d["links"] if l["rel"] == "next"), None)
print(teller.most_common())
```

## What you can build with it
- [Solar panel check for your own roof](https://www.opendataindex.nl/en/bouwen/zonnepanelen-check.md): Type a postcode and house number and see how large your roof surfaces are, which way they face, how much sun falls on them and roughly what panels would yield, using open data from BAG, AHN, KNMI and RVO.


## Examples with real figures (1)

For each example the finding, the reference date and the call that fetches exactly these figures.

- **Sites on the residual heat map by sector: most sewerage and wastewater treatment (832 sites), then other industry and chemical industry** (november 2024). Table potentiekaart-restwarmte: liggingindustrieco2. [Example](https://www.opendataindex.nl/en/voorbeeld/rvo-restwarmte-locaties-doelgroep)
  - `https://api.pdok.nl/rvo/potentiekaart-restwarmte/ogc/v1/collections/liggingindustrieco2/items?f=json&limit=1000`
