# Geoservices Provincie Noord-Holland (ArcGIS REST)

De ArcGIS-server van de provincie Noord-Holland, met bijna 200 diensten in de hoofdmap en zes submappen. Op 16 oktober 2026 telden we 3.843 bladlagen op de server; omdat dezelfde laag in veel verzameldiensten terugkomt, houden we er na ontdubbelen 2.683 bij in onze index. Drie kwart staat in de map oi_op (omgevingsinformatie), met onder meer een tijdreeks van de omgevingsverordening, de provinciale monumenten en de Natuurbeheerplannen per jaar. Bijna niets hiervan staat in data.overheid.nl of het Nationaal Georegister.

- Uitgever: Provincie Noord-Holland
- Gebied: Nederland · Laagste detail: object (provincie Noord-Holland)
- Periode: actuele stand; enkele diensten noemen een publicatiedatum (2024, 2025) · Ververst: jaarlijks
- Toegang: Open · Licentie: niet vastgesteld
- Koppelsleutels: map/dienst + laagnaam, objectid, gemeentenaam (in veel lagen), RD-coördinaten (EPSG:28992)
- Status: grijs · 196 diensten in 7 mappen · ArcGIS 11.5
- URL: https://geoapps.noord-holland.nl/app/dataportaal

## Wat kun je ermee?
- **Provinciale monumenten op de kaart.** De laag Provinciale monumenten INSPIRE heeft 761 objecten: 275 kleine objecten, 224 delen van de Stelling van Amsterdam, 150 keringselementen en 102 waterstaatkundige werken. Haal ze op als GeoJSON en maak een wandelroute.
- **Kaartbeeld zonder code.** Elke MapServer heeft ook een WMS. Plak de GetCapabilities-url in QGIS en je hebt de lagen als kaart.
- **Hoe veranderde de omgevingsverordening?.** De dienst oi_povnh_tijdreeks bevat versies van de provinciale omgevingsverordening naast elkaar. Vergelijk twee versies van dezelfde laag en zie welke gebieden erbij kwamen of verdwenen.

## Zo verwerk je het
1. **Blader per map.** Let op het pad: /ags/rest/services, niet /arcgis/. De map oi_op heeft de meeste diensten; ondergronden bevat luchtfoto's (rasters, niet te bevragen).
   `https://geoservices.noord-holland.nl/ags/rest/services/oi_op?f=json`
2. **Haal een laag op als GeoJSON.** Filter met where en vraag graden met outSR=4326. maxRecordCount verschilt per dienst (meestal 1.000 of 2.000); kijk in de laag-JSON en pagineer met resultOffset.
   `https://geoservices.noord-holland.nl/ags/rest/services/oi_dataservice_alg/MapServer/31/query?where=srt_monume%3D%27Stelling+van+Amsterdam%27&outFields=element,plaats,gemeente&outSR=4326&resultRecordCount=5&f=geojson`
3. **Tel per categorie.** Statistieken werken: één aanroep geeft het aantal monumentobjecten per soort.
   `https://geoservices.noord-holland.nl/ags/rest/services/oi_dataservice_alg/MapServer/31/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=srt_monume&f=json`
4. **Of als WMS.** Dezelfde dienst als WMS 1.3.0 voor QGIS of een webkaart.
   `https://geoservices.noord-holland.nl/ags/services/oi_dataservice_alg/MapServer/WMSServer?request=GetCapabilities&service=WMS`

## Interessante koppelingen
- Welke provinciale monumenten liggen naast rijksmonumenten? → [rijksmonumenten](https://www.opendataindex.nl/bron/rijksmonumenten.md) via coördinaten of adres. Leg de provinciale monumenten naast de rijksmonumenten van de RCE; samen geven ze een vollediger beeld van het erfgoed per gemeente.
- Monumenten per gemeente, met de huidige indeling → [pdok-wijkenbuurten](https://www.opendataindex.nl/bron/pdok-wijkenbuurten.md) via geometrie (ligging in gemeente). De gemeentenamen in de monumentenlaag zijn deels oud (Zeevang, Graft-De Rijp). Bepaal de gemeente opnieuw met de gemeentegrenzen van CBS via PDOK.

## Vergelijkbare bronnen
- [data-overheid](https://www.opendataindex.nl/bron/data-overheid.md): Noord-Holland zet 94 datasets in data.overheid.nl (vooral publiek domein); slechts enkele lagen van deze server staan daar ook.
- [Dataportaal Noord-Holland](https://geoapps.noord-holland.nl/app/dataportaal): De eigen viewer van de provincie op dezelfde diensten, om te kijken en te downloaden zonder API.

## Waar je op moet letten
- **Licentie niet vastgesteld, deels Geo Gedeeld.** De server zegt niets over hergebruik. In het NGR staan 50 van de 61 records van Noord-Holland onder de Geo Gedeeld-licentie, en die is niet open. Controleer per laag.
- **Veel dubbele lagen.** Dezelfde laag zit in meerdere verzameldiensten (oi_dataportaal_geoweb, oi_ilc, oi_gezonde_leefomgeving …). Ontdubbel op laagnaam plus velden: van 3.843 bladlagen blijven er 2.683 over.
- **Datums alleen in de beschrijving.** Lagen hebben geen wijzigingsdatum. Een paar diensten zeggen in de beschrijving 'De publicatie van deze service is scriptmatig gedaan op 07-07-2025'; dat is de publicatie, niet de inhoud.
- **Oude gemeentenamen.** In de monumentenlaag staan gemeenten die niet meer bestaan (Zeevang, Graft-De Rijp) en bij 382 objecten is de gemeente leeg.

## API (ArcGIS REST)

- Basis: https://geoservices.noord-holland.nl/ags/rest/services
- Toegang: Geen sleutel of token: de directory en alle aanroepen hieronder werkten anoniem. (getest)
- Formaten: json, geojson, pbf, png (export, WMS), xml/geojson (WFS)
- Omvang: 3852 bladlagen in 194 bevraagbare diensten; ongeveer 2.140 unieke laagnamen (dezelfde laag zit in meerdere diensten) (getest)
- Filteren: SQL-achtige where-voorwaarde op de velden van de laag, plus een optioneel ruimtelijk filter (geometry). Groeperen en tellen met outStatistics.; =, <>, >, >=, <, <=, LIKE, IN, IS NULL, BETWEEN, AND, OR, NOT

### Endpoints
- `GET ?f=json`: Directory: versie, mappen en diensten (naam + type).
- `GET /{map}?f=json`: Diensten in één map.
- `GET /{dienst}/MapServer?f=json`: Dienst: lagen en tabellen (id, naam, groeplaag of niet), maxRecordCount, capabilities, projectie, beschrijving.
- `GET /{dienst}/MapServer/{laag}?f=json`: Laag: velden (naam, type, alias, lengte), geometrietype, maxRecordCount, supportedQueryFormats en advancedQueryCapabilities (paginering, statistiek, orderBy, distinct).
- `GET /{dienst}/MapServer/{laag}/query`: Objecten opvragen met een where-voorwaarde of ruimtelijk filter; ook tellen (returnCountOnly) en groeperen (outStatistics). Antwoord in JSON, GeoJSON of PBF.
- `GET /{dienst}/MapServer/legend?f=json`: Legenda per laag: labels en symbolen (PNG als base64).
- `GET /{dienst}/MapServer/export?bbox=…&bboxSR=4326&size=600,400&format=png&f=image`: Kaartbeeld als PNG voor een rechthoek; met f=json krijg je een link naar het beeld. Zonder bbox: fout 'bbox must be specified'.
- `GET https://geoservices.noord-holland.nl/ags/services/{map}/{dienst}/MapServer/WMSServer?request=GetCapabilities&service=WMS`: WMS 1.3.0 van dezelfde MapServer: pad zonder /rest/ en met /WMSServer. Alleen bij diensten waar supportedExtensions WMSServer noemt.
- `GET https://geoservices.noord-holland.nl/ags/services/{map}/{dienst}/MapServer/WFSServer?service=WFS&request=GetCapabilities`: WFS 2.0 van dezelfde MapServer (alleen als supportedExtensions WFSServer noemt); GetFeature met outputFormat=GEOJSON.

### Parameters
- `where`: Voorwaarde in SQL-92-stijl: 1=1 voor alles, tekst tussen enkele aanhalingstekens (GEMEENTE='Zwolle'), LIKE met %, AND/OR, datums als DATE 'JJJJ-MM-DD'. Verplicht als er geen ander filter is. (getest)
- `outFields`: Velden in het antwoord, gescheiden door komma's, of * voor alle velden. (getest)
- `returnGeometry`: false = alleen attributen (veel kleiner antwoord). (getest)
- `outSR`: Projectie van de geometrie in het antwoord; 4326 = graden (WGS84). Standaard de projectie van de laag, hier RD (28992). (getest)
- `f`: Formaat: json (Esri-JSON), geojson, pbf (protobuf), pjson (ingesprongen) of html (bladeren in de browser). (getest)
- `resultOffset`: Paginering: aantal objecten overslaan (vanaf 0). Gebruik samen met orderByFields voor een vaste volgorde. (getest)
- `resultRecordCount`: Maximaal aantal objecten in dit antwoord (afgekapt op maxRecordCount van de laag). (getest)
- `orderByFields`: Sorteren, bv. 'OBJECTID' of 'n DESC' (ook op een statistiekveld). (getest)
- `returnCountOnly`: true = alleen het aantal objecten dat aan where voldoet: {"count": …}. (getest)
- `outStatistics`: Statistiek op de server: lijst van {statisticType, onStatisticField, outStatisticFieldName}; statisticType count, sum, min, max, avg, stddev of var. URL-coderen. (getest)
- `groupByFieldsForStatistics`: Velden om op te groeperen bij outStatistics (zoals GROUP BY). (getest)
- `returnDistinctValues`: true met outFields en returnGeometry=false: de unieke waarden van die velden. (getest)
- `geometry`: Ruimtelijk filter: een punt 'x,y' of rechthoek 'xmin,ymin,xmax,ymax', met geometryType (esriGeometryPoint, esriGeometryEnvelope), inSR (projectie van de invoer), spatialRel (esriSpatialRelIntersects) en eventueel distance + units (esriSRUnit_Meter) voor een straal. (platform)

### Velden van de voorbeeldlaag (10)
`objectid` OID, `naam` String, `categorie` String, `gemeentenaam` String, `ingebruikname_jaar` Integer, `netto_opp_park_ha` String, `geschatte_vermogen_mw` String, `geschatte_opbrengst_gwh_jr` String, `sde_vermogen_mw` String, `peildatum` String

### Limieten en valkuilen
- Hoogstens 1.000 tot 2.000.000 (oi_dataportaal_geoweb: 2.000.000; per laag nakijken) objecten per antwoord (maxRecordCount van de laag; verschilt per laag, staat in /{laag}?f=json). Is er meer, dan staat exceededTransferLimit: true in het antwoord: haal de rest op met resultOffset en resultRecordCount. (getest)
- Geen sleutel en geen gedocumenteerde rate limit. Doe rustig aan (een paar verzoeken per seconde) en vraag liever statistieken of tellingen op dan alle objecten. (ervaring)
- Let op /ags/ in het adres (niet /arcgis/). WMS en WFS staan op /ags/services/…/MapServer/WMSServer en /WFSServer, alleen bij diensten waar supportedExtensions ze noemt (oi_dataservice_alg: beide; oi_dataportaal_geoweb: alleen WFS). (getest)
- Op 16 okt 2026 rond 23:30 gaf elke query op oi_dataservice_alg 'Underlying DBMS error [no connection to the server]' (met HTTP 200), terwijl andere diensten werkten. Losse diensten kunnen dus tijdelijk uitvallen. (getest)
- Fouten komen terug met HTTP 200 en een JSON-object {"error": {"code": 400, …}} ('Failed to execute query.' bij een onbekend veld in where). Controleer altijd op een veld error, niet alleen op de statuscode. (getest)
- Getallen staan soms als tekst (Zonneparken: geschatte_vermogen_mw '0.08'): sum in outStatistics werkt dan niet. Tel of groepeer op tekstvelden, reken zelf met de getallen. (getest)
- Dezelfde laag staat in meerdere verzameldiensten (oi_dataportaal_geoweb, oi_dataservice_alg, thematische atlasdiensten). Ontdubbel op laagnaam en velden. (ervaring)
- Datums staan alleen soms in de dienstbeschrijving ('scriptmatig gepubliceerd op 07-07-2025 16:05:15'); verder geen editingInfo. (ervaring)
- Groeplagen (met subLayerIds) hebben geen query; vraag de bladlagen eronder op. Rasterlagen hebben geen velden en geen telling. (platform)

### Voorbeeld
```
https://geoservices.noord-holland.nl/ags/rest/services/oi_op/oi_dataportaal_geoweb/MapServer/23/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=categorie&orderByFields=n%20DESC&f=json
```

## Zo haal je het op

### curl
```bash
curl "https://geoservices.noord-holland.nl/ags/rest/services/oi_dataservice_alg/MapServer/31/query?where=1%3D1&outFields=element,srt_monume,plaats&outSR=4326&resultRecordCount=1000&f=geojson"
```

### python
```python
import requests

laag = "https://geoservices.noord-holland.nl/ags/rest/services/oi_dataservice_alg/MapServer/31/query"
r = requests.get(laag, params={"where": "srt_monume='Stelling van Amsterdam'",
                               "outFields": "element,plaats", "outSR": 4326, "f": "geojson"})
for f in r.json()["features"][:10]:
    print(f["properties"]["element"], "|", f["properties"]["plaats"])
```

## Wie gebruikt het
- [Dataportaal Noord-Holland](https://geoapps.noord-holland.nl/app/dataportaal): De kaartviewer en het dataportaal van de provincie


## Wat er allemaal in zit: 2.732 kaartlagen

Alle diensten en lagen op deze ArcGIS-server, elke nacht opgehaald. Elke laag heeft een eigen pagina met velden, geometrie en een query-aanroep.

- Soorten: kaartlaag 2.616, raster 96, tabel 20
- Laatst gewijzigd: 2025-07-07
- Met een API-aanroep op de datasetpagina: 2.732
- Zoeken: https://www.opendataindex.nl/api/catalogus/arcgis-noord-holland?q=… of de MCP-functie zoek_datasets met herkomst=arcgis-noord-holland
- Elke rij heeft een eigen pagina: https://www.opendataindex.nl/dataset/arcgis-noord-holland/<sleutel>

### Mappen
- F_NATUURBEHEERTYPE_110930 (55)
- igi op (133): AreaalGisib (4), id areaal (93), Map (1), Map (7), Map (3), Map (6), Map (14), Map (1) …
- oi dataservice areamanagement (5)
- oi dataservice povnh2020 (39)
- oi dataservice protected sites (5)
- oi op (1.976): Adreszoeker_17032011 (1), F_REGIOS_110930 (9), klimaatadaptatie signaleringskaart hex (1), LIANDER_TEST (1), Map (21), Map (1), Map (22), Map (35) …
- ondergronden (58): ondergrond kleur vector tiled (40), pnh hgn 1850 tegels (2), pnh hgn 1900 tegels (1), pnh hgn 1930 tegels (1), pnh luchtfoto 2000 (1), pnh luchtfoto 2003 (1), pnh luchtfoto 2006 (1), pnh luchtfoto 2009 (1) …
- P_ATLAS_LEEFOMGEVING (9)
- PGR_categorie3 (36)
- PGR_categorie3 (4)
- pnh op (1): pnh brk percelen (1)
- Publiceren (2)
- thematische services (367): F_REGIOS_110930 (8), Map (8), Map (24), Map (27), Map (2), Map (8), Map (16), Map (17) …

## Voorbeelden met echte cijfers (1)

Per voorbeeld de bevinding, de peildatum en de aanroep die precies deze cijfers ophaalt.

- **Provinciale monumenten in Noord-Holland naar soort: het meest kleine objecten (275 objecten), dan Stelling van Amsterdam en keringselementen** (november 2026). Tabel https://geoservices.noord-holland.nl/ags/rest/services/oi_dataservice_alg/MapServer/31. [Voorbeeld](https://www.opendataindex.nl/voorbeeld/geoservices-noord-holland-monumenten)
  - `https://geoservices.noord-holland.nl/ags/rest/services/oi_dataservice_alg/MapServer/31/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=srt_monume&orderByFields=n%20DESC&f=json`
  - `https://geoservices.noord-holland.nl/ags/rest/services/oi_dataservice_alg/MapServer/31/query?where=1%3D1&returnCountOnly=true&f=json`
