# GIS-services Gemeente Eindhoven (ArcGIS REST)

De ArcGIS-server achter de kaarten van de gemeente Eindhoven: 99 kaartdiensten, met een afdelingsvoorvoegsel in de naam (GRN_ groen, VKR_ verkeer, ODS_ openbare ruimte, WTR_ water …). Op 16 oktober 2026 telden we 314 lagen in onze index, waaronder 128.070 bomen met soort en plantjaar, 1.105 openbare laadpalen en 390.723 meldingen openbare ruimte uit 2021 tot en met augustus 2024. Een deel van deze lagen vult ook data.eindhoven.nl, maar hier vraag je elk object rechtstreeks op.

- Uitgever: Gemeente Eindhoven
- Gebied: Nederland · Laagste detail: object (gemeente Eindhoven)
- Periode: actuele stand (geen datums op de server) · Ververst: jaarlijks
- Toegang: Open · Licentie: niet vastgesteld
- Koppelsleutels: dienst + laagnaam, OBJECTID, buurtcode van de gemeente (niet de CBS-code), RD-coördinaten (EPSG:28992)
- Status: grijs · 99 diensten · ArcGIS 11.5
- URL: https://gisservice.eindhoven.nl/arcgis/rest/services

## Wat kun je ermee?
- **Welke bomen staan in jouw straat?.** GRN_Bomen heeft 128.070 bomen met Nederlandse en Latijnse soortnaam, hoogteklasse en plantjaar. De zomereik is met 23.409 bomen veruit de grootste soort; het oudste plantjaar boven 1000 is 1820 (een plataan). Er staan ook foute waarden in, zoals plantjaar 190.
- **Laadpalen per buurt.** VKR_Laadpalen (laag Openbare laadpalen) heeft 1.105 punten met aanbieder, aantal aansluitingen en datum van plaatsing. Tel ze per buurt of per jaar van plaatsing.
- **Waar klagen Eindhovenaren over?.** LOM_MOR_Laatste_Jaren bevat 390.723 meldingen openbare ruimte (2021 tot 23 augustus 2024) met onderwerp, buurt en status. Illegale stort is met 115.545 meldingen het grootste onderwerp, daarna straatverlichting (26.924).
- **Eikenprocessierups in de stad.** De bomenlaag heeft velden over eikenprocessierups (aanwezig, stadium, datum constatering, bestrijdingsmethode). Combineer met de zomereiken om te zien waar de rups terugkomt.

## Zo verwerk je het
1. **Zoek de dienst.** Alle 99 kaartdiensten staan in de hoofdmap. Het voorvoegsel zegt welke afdeling hem bijhoudt; per dienst geeft ?f=json het laagnummer.
   `https://gisservice.eindhoven.nl/arcgis/rest/services?f=json`
2. **Bomen rond een punt, als GeoJSON.** Geef een rechthoek in graden (inSR=4326) en vraag de uitvoer ook in graden (outSR=4326). Het centrum rond het stadhuis levert zo 249 bomen op.
   `https://gisservice.eindhoven.nl/arcgis/rest/services/GRN_Bomen/MapServer/0/query?geometry=5.475,51.437,5.482,51.441&geometryType=esriGeometryEnvelope&inSR=4326&spatialRel=esriSpatialRelIntersects&outFields=BOOMSOORT_NEDERLANDS,PLANTJAAR,HOOGTE&outSR=4326&f=geojson`
3. **Tel per soort.** Met outStatistics en groupByFieldsForStatistics telt de server zelf. Het telveld heet in het antwoord N, ook als je n vraagt.
   `https://gisservice.eindhoven.nl/arcgis/rest/services/GRN_Bomen/MapServer/0/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=BOOMSOORT&orderByFields=n%20DESC&f=json`
4. **Pagineer per 2.000.** maxRecordCount is 2.000. Voor alle bomen loop je met resultOffset in stappen van 2.000 (65 aanroepen); vraag alleen de velden die je nodig hebt.
   `https://gisservice.eindhoven.nl/arcgis/rest/services/GRN_Bomen/MapServer/0/query?where=1%3D1&outFields=OBJECTID,BOOMSOORT,PLANTJAAR&orderByFields=OBJECTID&resultOffset=0&resultRecordCount=2000&outSR=4326&f=geojson`

## Interessante koppelingen
- Bomen per inwoner per buurt → [cbs-kwb](https://www.opendataindex.nl/bron/cbs-kwb.md) via buurtnaam of coördinaten (de buurtcode is die van de gemeente). Tel bomen per CBS-buurt (op ligging) en deel door het aantal inwoners uit de kerncijfers wijken en buurten.
- Hoe hoog zijn de bomen echt? → [ahn](https://www.opendataindex.nl/bron/ahn.md) via coördinaten. De bomenlaag geeft een hoogteklasse (bv. 12-15 m). Vergelijk met de hoogte uit het AHN op dezelfde plek.

## Vergelijkbare bronnen
- [data.eindhoven.nl](https://data.eindhoven.nl): Het open dataportaal van de stad (Opendatasoft), met licentie en downloads. Een deel wordt uit deze server gevuld (Openbaar groen, Plofgevoelig gebied).
- [ams-bomen](https://www.opendataindex.nl/bron/ams-bomen.md): Het bomenregister van Amsterdam, via een eigen API met vergelijkbare velden.
- [ams-meldingen](https://www.opendataindex.nl/bron/ams-meldingen.md): Meldingen openbare ruimte in Amsterdam, actueler en met een eigen API.

## Waar je op moet letten
- **Licentie niet vastgesteld.** De server zegt niets over hergebruik. Eindhoven publiceert in data.overheid.nl en op data.eindhoven.nl vooral als publiek domein, maar voor deze lagen staat het er niet bij.
- **Firewall voor de server.** Een webfirewall (F5) staat ervoor: /robots.txt geeft een pagina 'Request Rejected'. De REST-directory zelf is open; stop als je die melding krijgt en vraag niet te snel achter elkaar.
- **Niet alles is actueel.** Er staan geen datums op de lagen. De meldingenlaag eindigt op 23 augustus 2024; 9.124 bomen hebben geen plantjaar of plantjaar 0.
- **Eigen buurtcodes.** BUURTCODE in de meldingen is het buurtnummer van de gemeente (bv. 611), niet de CBS-code (BU0772…). Koppel op naam of ligging.

## API (ArcGIS REST)

- Basis: https://gisservice.eindhoven.nl/arcgis/rest/services
- Toegang: Geen sleutel of token: de directory en alle aanroepen hieronder werkten anoniem. (getest)
- Formaten: json, geojson, pbf, png (export, WMS)
- Omvang: 312 bladlagen in 99 MapServers (306 unieke namen), plus 8 rasterlagen (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 /{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 /{dienst}/MapServer/find?searchText=…&layers=0&searchFields=…&f=json`: Tekst zoeken in velden van één of meer lagen (deel-overeenkomst), met de laag en het gevonden veld erbij.
- `GET https://gisservice.eindhoven.nl/arcgis/services/{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.

### 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)
- `returnExtentOnly`: true = alleen de omhullende rechthoek van de treffers (met outSR=4326 in graden). (getest)

### Velden van de voorbeeldlaag (10)
`OBJECTID` OID, `BOOMNUMMER` Double, `BOOMSOORT` String, `BOOMSOORT_NEDERLANDS` String, `PLANTJAAR` SmallInteger, `HOOGTE` String, `EIGENAAR` String, `BEHEERDER` String, `EPR_AANWEZIG` String, `EPR_DATUM_CONSTATERING` Date

### Limieten en valkuilen
- Hoogstens 2.000 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)
- Deze server zet namen van statistiekvelden in hoofdletters: outStatisticFieldName 'n' komt terug als 'N', 'gem' als 'GEM'. Lees het veld hoofdletterongevoelig. (getest)
- resultRecordCount wordt bij outStatistics genegeerd (alle groepen komen terug, voor BOOMSOORT_NEDERLANDS 18 KB). (getest)
- find doorzoekt tekstvelden op een deel van de waarde, maar geeft attributen als tekst ('OBJECTID': '71') en kapt af op 2.000 resultaten (searchText=Tilia: 1,8 MB). Voor tellen liever query met LIKE: BOOMSOORT LIKE 'Tilia%' = 7.994. (getest)
- Er staat een F5-firewall voor de server: /robots.txt geeft een pagina 'Request Rejected' (HTTP 200). De REST-API zelf werkte zonder problemen; krijg je die pagina op een API-aanroep, stop dan. (getest)
- Dienstnamen beginnen met een afdelingsprefix (GRN_ groen, VKR_ verkeer, BST_, EHV_, LOM_ …). Een deel van data.eindhoven.nl wordt uit deze server gevuld. (ervaring)
- 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)
- De server geeft geen wijzigingsdatum per dienst of laag (geen editingInfo). Hoe vers een laag is, staat er niet bij. (getest)

### Voorbeeld
```
https://gisservice.eindhoven.nl/arcgis/rest/services/GRN_Bomen/MapServer/0/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=EIGENAAR&orderByFields=n%20DESC&f=json
```

## Zo haal je het op

### curl
```bash
curl "https://gisservice.eindhoven.nl/arcgis/rest/services/VKR_Laadpalen/MapServer/5/query?where=1%3D1&outFields=*&outSR=4326&f=geojson"
```

### python
```python
import requests

laag = "https://gisservice.eindhoven.nl/arcgis/rest/services/GRN_Bomen/MapServer/0/query"
stat = '[{"statisticType":"count","onStatisticField":"OBJECTID","outStatisticFieldName":"n"}]'
r = requests.get(laag, params={"where": "1=1", "outStatistics": stat,
                               "groupByFieldsForStatistics": "BOOMSOORT_NEDERLANDS",
                               "orderByFields": "n DESC", "f": "json"})
for f in r.json()["features"][:10]:
    a = f["attributes"]
    print(a["BOOMSOORT_NEDERLANDS"], a["N"])
```

## Wie gebruikt het
- [data.eindhoven.nl](https://data.eindhoven.nl): Het open dataportaal van de gemeente, deels gevuld uit deze server


## Wat er allemaal in zit: 314 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 304, raster 8, tabel 2
- Met een API-aanroep op de datasetpagina: 314
- Zoeken: https://www.opendataindex.nl/api/catalogus/arcgis-eindhoven?q=… of de MCP-functie zoek_datasets met herkomst=arcgis-eindhoven
- Elke rij heeft een eigen pagina: https://www.opendataindex.nl/dataset/arcgis-eindhoven/<sleutel>

### Mappen
- Bezoek_kaart (1)
- BWV Gebiedsindeling prioriteitennota (2)
- BWV Opslotgebieden Kamerverhuur (1)
- BWV Vergunningen (1)
- CKD Archeologie 2022 (1)
- CKD Cultuurhistorie (9)
- CKD Monumenten (6)
- EHV BGT IMGeo (45)
- EHV Luchtkwaliteit (1)
- EHV Overzichtskaart (17)
- Erfgoedkaart (11)
- Fietsenstallingen en OV-Fietsen (2)
- Gebiedskaders (1)
- Geobasis_Basis_ORAO (3)
- GRN Bomen (1)
- GRN GroeneKaart (7)
- Grondwatermeetpunten (1)
- Hoogtebouten (1)
- Hubs realisatie locatiepunt (1)
- Kansenkaart biodiversiteit (4)
- Kwaliteitsniveaus Openbare Ruimte (9)
- LOM EnergieTransitiePandBuurt (2)
- LOM GESCHUTSMUNITIE (3)
- LOM Verontreiniging (1)
- LOM WKO (4)
- LOM_BEBOUWDE_KOMGRENS (1)
- LuchtfotoActueel (1)
- LuchtfotoCache (1)
- Map (1)
- Map (2)
- Map (2)
- Map (1)
- Map (1)
- Map (1)
- ODS AFVALBAK (1)
- ODS BESTRATING (1)
- ODS BLOEMBOLLEN (1)
- ODS GOTEN (1)
- ODS HONDENLOSLOOPTERREINEN (1)
- ODS LAADPUNT (1)
- … en nog 59 mappen

## Voorbeelden met echte cijfers (1)

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

- **Bomen in het Eindhovense bomenbestand naar soort: het meest zomereik (23.409 bomen), dan berk (Betula pendula) en gewone plataan** (oktober 2026). Tabel https://gisservice.eindhoven.nl/arcgis/rest/services/GRN_Bomen/MapServer/0. [Voorbeeld](https://www.opendataindex.nl/voorbeeld/gisservices-eindhoven-bomen)
  - `https://gisservice.eindhoven.nl/arcgis/rest/services/GRN_Bomen/MapServer/0/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=BOOMSOORT&orderByFields=n%20DESC&f=json`
  - `https://gisservice.eindhoven.nl/arcgis/rest/services/GRN_Bomen/MapServer/0/query?where=1%3D1&returnCountOnly=true&f=json`
