# Utrecht Province geoservices (ArcGIS REST)

The ArcGIS server of the province of Utrecht. On 16 October 2026 we counted 115 layers in 11 queryable services; the folders medewerkers, review and review_medewerkers return 502. The largest service is Tygron_Basisdata (60 layers), input for the Tygron planning model, including a solar map of 681,784 buildings. Besides that: the Cultural History Atlas (CHAT: military heritage, country estates, agricultural landscape), the Nature Network and the Green contour for the Informatiekaart Nederland, and geographic keys such as 33,162 six-digit postcode areas. The province publishes far more through the National Georegister (495 records).

- Publisher: Provincie Utrecht
- Area: Netherlands · Finest detail: feature (province of Utrecht)
- Period: actuele stand (geen datums op de server) · Refreshed: yearly
- Access: Open · Licence: niet vastgesteld
- Join keys: dienst + laagnaam, objectid, postcode (6 posities), gemeente- en woonplaatsnaam (GeoSleutels), RD-coördinaten (EPSG:28992)
- Status: grijs · 22 diensten in 5 mappen · ArcGIS 11.5
- URL: https://geoservices.provincie-utrecht.nl/arcgis/rest/services

## What can you do with it?
- **Bomb craters and casemates.** The layer CHAT - militair erfgoed (vlakken) has 8,206 features; almost half (3,917) are bomb craters, plus shelters, trenches and 102 casemates. Put them on a map.
- **Postcodes as a key.** GeoSleutels has the boundaries of the province, municipalities, water authorities, towns and 33,162 six-digit postcode areas. Handy for putting your own address data on a map.
- **Solar potential per building.** Tygron_Basisdata contains zonnekaart_panden (681,784 buildings) and energy labels (622,720). These are working files for a planning model: check them against the original source before drawing conclusions.

## How to process it
1. **Read the directory.** The root has the usable services. Folders such as review return a list, but the services inside answer with 502.
   `https://geoservices.provincie-utrecht.nl/arcgis/rest/services?f=json`
2. **Fetch features as GeoJSON.** Filter with where and request degrees with outSR=4326. maxRecordCount is 1,000 for most services; page with resultOffset.
   `https://geoservices.provincie-utrecht.nl/arcgis/rest/services/tercera_ro/MapServer/6/query?where=klasse2%3D%27kazemat%27%20AND%20plaats%3D%27Utrecht%27&outFields=naam,plaats,klasse2,waarde&outSR=4326&resultRecordCount=5&f=geojson`
3. **Count by type.** Statistics work; one call returns the number of features per class of military heritage.
   `https://geoservices.provincie-utrecht.nl/arcgis/rest/services/tercera_ro/MapServer/6/query?where=1%3D1&outStatistics=%5B%7B%22statisticType%22%3A%22count%22%2C%22onStatisticField%22%3A%22objectid%22%2C%22outStatisticFieldName%22%3A%22n%22%7D%5D&groupByFieldsForStatistics=klasse2&orderByFields=n%20DESC&f=json`
4. **The nature network.** WFS_IKN contains the Nature Network Netherlands, the Green contour, quiet areas and six other layers for the Informatiekaart Nederland.
   `https://geoservices.provincie-utrecht.nl/arcgis/rest/services/WFS_IKN/MapServer?f=json`

## Interesting combinations
- Which military heritage is also a national monument? → [rijksmonumenten](https://www.opendataindex.nl/en/bron/rijksmonumenten.md) via coördinaten. Put the CHAT features next to the national monuments and look for overlap; the rest is heritage without national protection.
- Your own data per municipality or postcode → [cbs-kwb](https://www.opendataindex.nl/en/bron/cbs-kwb.md) via gemeentenaam of postcode. Use the boundaries from GeoSleutels to group addresses, then join the CBS key figures per municipality.

## Similar sources
- [Provincie Utrecht in het Nationaal Georegister](https://www.nationaalgeoregister.nl/geonetwork/srv/dut/catalog.search#/search?orgName=Provincie%20Utrecht): 495 records with metadata and licence (mostly public domain), with WMS/WFS. The main entry point for this province's data.
- [data-overheid](https://www.opendataindex.nl/en/bron/data-overheid.md): 426 datasets from the province of Utrecht, almost all public domain.

## What to watch out for
- **Licence not established.** The server says nothing about reuse. In the NGR, Utrecht publishes mostly as public domain, but that is not stated with the layers here.
- **Folders that do not work.** Ten services in medewerkers, review and review_medewerkers return 502. We do not count them or report them as removed.
- **Working files and demos.** Tygron_* are working files for a planning model and SampleWorldCities is an Esri sample service. The layer CHAT - archeologie (punten) has 0 features.
- **Not only the province of Utrecht.** The Cultural History Atlas extends beyond the border: it also has features in places such as Woudrichem and Nederhorst den Berg.

## API (ArcGIS REST)

- Base: https://geoservices.provincie-utrecht.nl/arcgis/rest/services
- Access: No key or token: the directory and all calls below worked anonymously. (tested)
- Formats: json, geojson, pbf, png (export, WMS)
- Size: 118 layers in 12 queryable services (largest: Tygron_Basisdata 60, tercera_ro 20, WFS_IKN 9) (tested)
- Filtering: SQL-like where clause on the layer's fields, plus an optional spatial filter (geometry). Group and count with outStatistics.; =, <>, >, >=, <, <=, LIKE, IN, IS NULL, BETWEEN, AND, OR, NOT

### Endpoints
- `GET ?f=json`: Directory: version, folders and services (name + type).
- `GET /{map}?f=json`: Services in one folder.
- `GET /{dienst}/MapServer?f=json`: Service: layers and tables (id, name, group layer or not), maxRecordCount, capabilities, projection, description.
- `GET /{dienst}/MapServer/{laag}?f=json`: Layer: fields (name, type, alias, length), geometry type, maxRecordCount, supportedQueryFormats and advancedQueryCapabilities (pagination, statistics, orderBy, distinct).
- `GET /{dienst}/MapServer/{laag}/query`: Query features with a where clause or spatial filter; also count (returnCountOnly) and group (outStatistics). Response in JSON, GeoJSON or PBF.
- `GET /{dienst}/MapServer/legend?f=json`: Legend per layer: labels and symbols (PNG as base64).
- `GET /{dienst}/MapServer/export?bbox=…&bboxSR=4326&size=600,400&format=png&f=image`: Map image as PNG for a rectangle; with f=json you get a link to the image. Without bbox: error 'bbox must be specified'.
- `GET https://geoservices.provincie-utrecht.nl/arcgis/services/{dienst}/MapServer/WMSServer?request=GetCapabilities&service=WMS`: WMS 1.3.0 of the same MapServer: path without /rest/ and with /WMSServer. Only for services whose supportedExtensions lists WMSServer.
- `GET https://geoservices.provincie-utrecht.nl/arcgis/services/WFS_IKN/MapServer/WFSServer?service=WFS&request=GetCapabilities`: WFS 2.0 of the same MapServer (only if supportedExtensions lists WFSServer); GetFeature with outputFormat=GEOJSON.

### Parameters
- `where`: Condition in SQL-92 style: 1=1 for everything, text in single quotes (GEMEENTE='Zwolle'), LIKE with %, AND/OR, dates as DATE 'YYYY-MM-DD'. Required when there is no other filter. (tested)
- `outFields`: Fields in the response, comma-separated, or * for all fields. (tested)
- `returnGeometry`: false = attributes only (much smaller response). (tested)
- `outSR`: Projection of the geometry in the response; 4326 = degrees (WGS84). Default is the layer's projection, here RD (28992). (tested)
- `f`: Format: json (Esri JSON), geojson, pbf (protobuf), pjson (indented) or html (browse in the browser). (tested)
- `resultOffset`: Pagination: number of features to skip (from 0). Use together with orderByFields for a stable order. (tested)
- `resultRecordCount`: Maximum number of features in this response (capped at the layer's maxRecordCount). (tested)
- `orderByFields`: Sort order, e.g. 'OBJECTID' or 'n DESC' (also on a statistics field). (tested)
- `returnCountOnly`: true = only the number of features matching where: {"count": …}. (tested)
- `outStatistics`: Server-side statistics: list of {statisticType, onStatisticField, outStatisticFieldName}; statisticType count, sum, min, max, avg, stddev or var. URL-encode it. (tested)
- `groupByFieldsForStatistics`: Fields to group by with outStatistics (like GROUP BY). (tested)
- `returnDistinctValues`: true with outFields and returnGeometry=false: the unique values of those fields. (tested)
- `geometry`: Spatial filter: a point 'x,y' or envelope 'xmin,ymin,xmax,ymax', with geometryType (esriGeometryPoint, esriGeometryEnvelope), inSR (input projection), spatialRel (esriSpatialRelIntersects) and optionally distance + units (esriSRUnit_Meter) for a radius. (platform)

### Fields of the example layer (10)
`objectid` OID, `naam` String, `plaats` String, `klasse1` String, `klasse2` String, `waarde` String, `status` String, `beschrijving` String, `ontstaan` String, `toegevoegd` Date

### Limits and pitfalls
- At most 1.000 features per response (the layer's maxRecordCount; varies per layer, see /{layer}?f=json). If there are more, the response has exceededTransferLimit: true: fetch the rest with resultOffset and resultRecordCount. (tested)
- No key and no documented rate limit. Take it easy (a few requests per second) and prefer statistics or counts over fetching all features. (experience)
- The review and review_medewerkers folders list services, but those services return HTTP 502 (Azure Application Gateway). Only the root and arcgis_online are usable; medewerkers is not public. (tested)
- WFS_IKN has a WFSServer extension with the 9 IKN layers (green contour, NNN, quiet areas …); the other services WMS only. (tested)
- Errors come back with HTTP 200 and a JSON object {"error": {"code": 400, …}} ('Failed to execute query.' for an unknown field in where). Always check for an error field, not just the status code. (tested)
- Tygron_* are working files for a calculation model and SampleWorldCities is an Esri sample; both are public but not a provincial publication. tercera_ro/10 (CHAT archaeology, points) has 0 features. (experience)
- The server gives no modification date per service or layer (no editingInfo). How current a layer is, is not stated. (tested)
- Group layers (with subLayerIds) have no query; query the leaf layers below them. Raster layers have no fields and no count. (platform)

### Example
```
https://geoservices.provincie-utrecht.nl/arcgis/rest/services/tercera_ro/MapServer/6/query?where=1%3D1&outStatistics=%5B%7B%22statisticType%22%3A%22count%22%2C%22onStatisticField%22%3A%22objectid%22%2C%22outStatisticFieldName%22%3A%22n%22%7D%5D&groupByFieldsForStatistics=klasse2&orderByFields=n%20DESC&f=json
```

## How to fetch it

### curl
```bash
curl "https://geoservices.provincie-utrecht.nl/arcgis/rest/services/tercera_ro/MapServer/6/query?where=klasse2%3D%27bomkrater%27&outFields=plaats,klasse2&outSR=4326&resultRecordCount=1000&f=geojson"
```

### python
```python
import requests

laag = "https://geoservices.provincie-utrecht.nl/arcgis/rest/services/tercera_ro/MapServer/6/query"
stat = '[{"statisticType":"count","onStatisticField":"objectid","outStatisticFieldName":"n"}]'
r = requests.get(laag, params={"where": "1=1", "outStatistics": stat,
                               "groupByFieldsForStatistics": "klasse2", "f": "json"})
rijen = sorted((f["attributes"] for f in r.json()["features"]), key=lambda a: -a["n"])
for a in rijen[:10]:
    print(a["klasse2"], a["n"])
```

## Who uses it
- [Informatiekaart Nederland](https://geoservices.provincie-utrecht.nl/arcgis/rest/services/WFS_IKN/MapServer): The WFS_IKN service supplies Utrecht's nature network and Green contour for the national map


## What is in it: 115 map layers

All services and layers on this ArcGIS server, fetched every night. Every layer has its own page with fields, geometry and a query call.

- Kinds: kaartlaag 115
- With an API call on the dataset page: 115
- Search: https://www.opendataindex.nl/api/catalogus/arcgis-provincie-utrecht?q=… or the MCP function zoek_datasets with herkomst=arcgis-provincie-utrecht
- Every row has its own page: https://www.opendataindex.nl/en/dataset/arcgis-provincie-utrecht/<key>

### Folders
- arcgis online (3): Map (1), Resultaten per gemeente (2)
- GeoSleutels (8)
- Groenanalyses Houten en Soest (1)
- IKN (9)
- INSPIRE (5)
- m01 2 bodem (1)
- tercera_ro (20)
- Tygron_Basisdata (60)
- WFS vergunningchecker (4)
- wko tool (4)

## Examples with real figures (1)

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

- **Military heritage in the Utrecht Cultural History Atlas (polygons) by type: most bomkrater (3,916 features), then schuilplaats and militair groen** (november 2026). Table https://geoservices.provincie-utrecht.nl/arcgis/rest/services/tercera_ro/MapServer/6. [Example](https://www.opendataindex.nl/en/voorbeeld/geoservices-provincie-utrecht-militair-erfgoed)
  - `https://geoservices.provincie-utrecht.nl/arcgis/rest/services/tercera_ro/MapServer/6/query?where=1%3D1&outStatistics=%5B%7B%22statisticType%22%3A%22count%22%2C%22onStatisticField%22%3A%22objectid%22%2C%22outStatisticFieldName%22%3A%22n%22%7D%5D&groupByFieldsForStatistics=klasse2&orderByFields=n%20DESC&f=json`
  - `https://geoservices.provincie-utrecht.nl/arcgis/rest/services/tercera_ro/MapServer/6/query?where=1%3D1&returnCountOnly=true&f=json`
