# District and neighbourhood map

The official boundaries of all municipalities, districts and neighbourhoods, as a map service (WFS) and download. The geometry you need to map neighbourhood figures.

- Publisher: Publieke Dienstverlening Op de Kaart, Centraal Bureau voor de Statistiek, Kadaster
- Area: Netherlands · Finest detail: neighbourhood
- Period: 2003 – 2025 · Refreshed: yearly
- Access: Open · Licence: CC BY 4.0
- Join keys: buurtcode (BU), wijkcode (WK), gemeentecode (GM)
- Status: grijs
- URL: https://www.pdok.nl

## What can you do with it?
- **From table to map.** Every CBS table with neighbourhood codes becomes a map once you add the boundaries.
- **Finding neighbours.** Compute which neighbourhoods share a border. Useful for comparisons with the immediate area.

## Interesting combinations
- A map of income per neighbourhood → [cbs-kwb](https://www.opendataindex.nl/en/bron/cbs-kwb.md) via buurtcode (BU). Join on code and use the same year for boundaries and figures.

## Similar sources
- [Gebiedsindelingen (CBS)](https://www.cbs.nl/nl-nl/dossier/nederland-regionaal/geografische-data): Also COROP, health regions, safety regions and more.

## API (OGC WFS 2.0.0)

- Base: https://service.pdok.nl/cbs/wijkenbuurten/2024/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: 14668 features in wijkenbuurten:buurten (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: wijkenbuurten:buurten, wijkenbuurten:wijken, wijkenbuurten:gemeenten (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 (246)
`geom` geometrie, `buurtcode` string, `buurtnaam` string, `wijkcode` string, `gemeentecode` string, `gemeentenaam` string, `indelingswijzigingWijkenEnBuurten` integer, `water` string, `meestVoorkomendePostcode` string, `dekkingspercentage` integer, `omgevingsadressendichtheid` integer, `stedelijkheidAdressenPerKm2` integer, `bevolkingsdichtheidInwonersPerKm2` integer, `aantalInwoners` integer, `mannen` integer, `vrouwen` integer, `percentagePersonen0Tot15Jaar` integer, `percentagePersonen15Tot25Jaar` integer, `percentagePersonen25Tot45Jaar` integer, `percentagePersonen45Tot65Jaar` integer, `percentagePersonen65JaarEnOuder` integer, `percentageOngehuwd` integer, `percentageGehuwd` integer, `percentageGescheid` integer, `percentageVerweduwd` integer, `geboorteTotaal` integer, `geboortesPer1000Inwoners` integer, `sterfteTotaal` integer, `sterfteRelatief` integer, `aantalHuishoudens` integer, `percentageEenpersoonshuishoudens` integer, `percentageHuishoudensZonderKinderen` integer, `percentageHuishoudensMetKinderen` integer, `gemiddeldeHuishoudsgrootte` double, `percentageMetHerkomstlandNederland` integer, `percentageMetHerkomstlandUitEuropaExclNl` integer, `percentageMetHerkomstlandBuitenEuropa` integer, `percentageGebInNlMetHerkomstlandNederland` integer, `percGebInNlMetHerkomstlandInEuropaExNl` integer, `percGebInNlMetHerkomstlandBuitenEuropa` integer, `percGebBuitenNlMetHerkomstlndInEuropaExNl` integer, `percGebBuitenNlMetHerkomstlndBuitenEuropa` integer, `aantalBedrijvenLandbouwBosbouwVisserij` integer, `aantalBedrijvenNijverheidEnergie` integer, `aantalBedrijvenHandelEnHoreca` integer, `aantalBedrijvenVervoerInformatieCommunicatie` integer, `aantalBedrijvenFinancieelOnroerendGoed` integer, `aantalBedrijvenZakelijkeDienstverlening` integer, `aantalBedrijvenOverheidOnderwijsEnZorg` integer, `aantalBedrijvenCultuurRecreatieOverige` integer, `aantalBedrijfsvestigingen` integer, `woningvoorraad` integer, `gemiddeldeWoningwaarde` integer, `percentageEengezinswoning` integer, `percentageMeergezinswoning` integer, `percentageBewoond` integer, `percentageKoopwoningen` integer, `percentageHuurwoningen` integer, `percHuurwoningenInBezitWoningcorporaties` integer, `percHuurwoningenInBezitOverigeVerhuurders` integer, `percentageWoningenMetEigendomOnbekend` integer, `percentageBouwjaarklasseTot2000` integer, `percentageBouwjaarklasseVanaf2000` integer, `percentageLeegstandWoningen` integer, `gemiddeldGasverbruikTotaal` integer, `gemiddeldGasverbruikAppartement` integer, `gemiddeldGasverbruikTussenwoning` integer, `gemiddeldGasverbruikHoekwoning` integer, `gemiddeldGasverbruik2Onder1KapWoning` integer, `gemiddeldGasverbruikVrijstaandeWoning` integer, `gemiddeldGasverbruikHuurwoning` integer, `gemiddeldGasverbruikkoopwoning` integer, `gemiddeldElektriciteitsverbruikTotaal` integer, `gemiddeldElektriciteitsverbruikAppartement` integer, `gemiddeldElektriciteitsverbruikTussenwoning` integer, `gemiddeldElektriciteitsverbruikHoekwoning` integer, `gemElektriciteitsverbruik2Onder1KapWoning` integer, `gemElektriciteitsverbruikVrijstaandeWoning` integer, `gemiddeldElektriciteitsverbruikHuurwoning` integer, `gemiddeldElektriciteitsverbruikkoopwoning` integer, `percentageWoningenMetStadsverwarming` integer, `opleidingsniveauLaag` integer, `opleidingsniveauMiddelbaar` integer, `opleidingsniveauHoog` integer, `nettoArbeidsparticipatie` integer, `percentageWerknemers` integer, `percentageZelfstandigen` integer, `aantalInkomensontvangers` integer, `gemiddeldInkomenPerInkomensontvanger` integer, `gemiddeldInkomenPerInwoner` integer, `percentagePersonenMetHoogInkomen` integer, `percentagePersonenMetLaagInkomen` integer, `percentageHuishoudensMetHoogInkomen` integer, `percentageHuishoudensMetLaagInkomen` integer, `percentageHuishoudensMetLaagsteInkomen` integer, `percentageHuishoudensOnderOfRondSociaalMinimum` integer, `aantalPersonenMetEenAoUitkeringTotaal` integer, `aantalPersonenMetEenWwUitkeringTotaal` integer, `aantalPersonenMetEenAlgBijstandsuitkeringTot` integer, `aantalPersonenMetEenAowUitkeringTotaal` integer, `gemiddeldGestandaardiseerdInkomenVanHuishoudens` double, `huishoudensTot110PercentVanSociaalMinimum` double, `huishoudensTot120PercentVanSociaalMinimum` double, `mediaanVermogenVanParticuliereHuish` double, `aantalJongerenMetJeugdzorgInNatura` integer, `percentageJongerenMetJeugdzorgInNatura` double, `aantalWmoClienten` integer, `aantalWmoClientenPer1000Inwoners` integer, `personenautosTotaal` integer, `personenautosPerHuishouden` double, `personenautosPerKm2` integer, `motortweewielersTotaal` integer, `aantalPersonenautosMetBrandstofBenzine` integer, `aantalPersonenautosMetOverigeBrandstof` integer, `oppervlakteTotaalInHa` integer, `oppervlakteLandInHa` integer, `oppervlakteWaterInHa` integer, `huisartsenpraktijkGemiddeldeAfstandInKm` double, `huisartsenpraktijkGemiddeldAantalBinnen1Km` double, `huisartsenpraktijkGemiddeldAantalBinnen3Km` double, `huisartsenpraktijkGemiddeldAantalBinnen5Km` double, `huisartsenpostGemiddeldeAfstandInKm` double, `apotheekGemiddeldeAfstandInKm` double, `ziekenhuisInclBuitenpolikliniekGemAfstInKm` double, `ziekenhuisInclBuitenpoliGemAantalBinnen5Km` double, `ziekenhuisInclBuitenpoliGemAantalBinnen10Km` double, `ziekenhuisInclBuitenpoliGemAantalBinnen20Km` double, `ziekenhuisExclBuitenpolikliniekGemAfstInKm` double, `ziekenhuisExclBuitenpoliGemAantalBinnen5Km` double, `ziekenhuisExclBuitenpoliGemAantalBinnen10Km` double, `ziekenhuisExclBuitenpoliGemAantalBinnen20Km` double, `groteSupermarktGemiddeldeAfstandInKm` double, `groteSupermarktGemiddeldAantalBinnen1Km` double, `groteSupermarktGemiddeldAantalBinnen3Km` double, `groteSupermarktGemiddeldAantalBinnen5Km` double, `winkelsOvDagelijkseLevensmGemAfstInKm` double, `winkelsOvDagelLevensmGemAantalBinnen1Km` double, `winkelsOvDagelLevensmGemAantalBinnen3Km` double, `winkelsOvDagelLevensmGemAantalBinnen5Km` double, `warenhuisGemiddeldeAfstandInKm` double, `warenhuisGemiddeldAantalBinnen5Km` double, `warenhuisGemiddeldAantalBinnen10Km` double, `warenhuisGemiddeldAantalBinnen20Km` double, `cafeGemiddeldeAfstandInKm` double, `cafeGemiddeldAantalBinnen1Km` double, `cafeGemiddeldAantalBinnen3Km` double, `cafeGemiddeldAantalBinnen5Km` double, `cafetariaGemiddeldeAfstandInKm` double, `cafetariaGemiddeldAantalBinnen1Km` double, `cafetariaGemiddeldAantalBinnen3Km` double, `cafetariaGemiddeldAantalBinnen5Km` double, `restaurantGemiddeldeAfstandInKm` double, `restaurantGemiddeldAantalBinnen1Km` double, `restaurantGemiddeldAantalBinnen3Km` double, `restaurantGemiddeldAantalBinnen5Km` double, `hotelGemiddeldeAfstandInKm` double, `hotelGemiddeldAantalBinnen5Km` double, `hotelGemiddeldAantalBinnen10Km` double, `hotelGemiddeldAantalBinnen20Km` double, `kinderdagverblijfGemiddeldeAfstandInKm` double, `kinderdagverblijfGemiddeldAantalBinnen1Km` double, `kinderdagverblijfGemiddeldAantalBinnen3Km` double, `kinderdagverblijfGemiddeldAantalBinnen5Km` double, `buitenschoolseOpvangGemAfstandInKm` double, `buitenschoolseOpvangGemiddeldAantalBinnen1Km` double, `buitenschoolseOpvangGemiddeldAantalBinnen3Km` double, `buitenschoolseOpvangGemiddeldAantalBinnen5Km` double, `basisonderwijsGemiddeldeAfstandInKm` double, `basisonderwijsGemiddeldAantalBinnen1Km` double, `basisonderwijsGemiddeldAantalBinnen3Km` double, `basisonderwijsGemiddeldAantalBinnen5Km` double, `voortgezetOnderwijsGemAfstandInKm` double, `voortgezetOnderwijsGemiddeldAantalBinnen3Km` double, `voortgezetOnderwijsGemiddeldAantalBinnen5Km` double, `voortgezetOnderwijsGemiddeldAantalBinnen10Km` double, `vmboGemiddeldeAfstandInKm` double, `vmboGemiddeldAantalBinnen3Km` double, `vmboGemiddeldAantalBinnen5Km` double, `vmboGemiddeldAantalBinnen10Km` double, `havoVwoGemiddeldeAfstandInKm` double, `havoVwoGemiddeldAantalBinnen3Km` double, `havoVwoGemiddeldAantalBinnen5Km` double, `havoVwoGemiddeldAantalBinnen10Km` double, `brandweerkazerneGemiddeldeAfstandInKm` double, `opritHoofdverkeerswegGemiddeldeAfstandInKm` double, `treinstationGemiddeldeAfstandInKm` double, `overstapstationGemiddeldeAfstandInKm` double, `zwembadGemiddeldeAfstandInKm` double, `kunstijsbaanGemiddeldeAfstandInKm` double, `bibliotheekGemiddeldeAfstandInKm` double, `poppodiumGemiddeldeAfstandInKm` double, `bioscoopGemiddeldeAfstandInKm` double, `bioscoopGemiddeldAantalBinnen5Km` double, `bioscoopGemiddeldAantalBinnen10Km` double, `bioscoopGemiddeldAantalBinnen20Km` double, `saunaGemiddeldeAfstandInKm` double, `zonnebankGemiddeldeAfstandInKm` double, `attractieparkGemiddeldeAfstandInKm` double, `attractieparkGemiddeldAantalBinnen10Km` double, `attractieparkGemiddeldAantalBinnen20Km` double, `attractieparkGemiddeldAantalBinnen50Km` double, `theaterGemiddeldeAfstandInKm` double, `theaterGemiddeldAantalBinnen5Km` double, `theaterGemiddeldAantalBinnen10Km` double, `theaterGemiddeldAantalBinnen20Km` double, `gemiddeldeAfstandTotMuseum` double, `gemiddeldAantalMuseaBinnen5Km` double, `gemiddeldAantalMuseaBinnen10Km` double, `gemiddeldAantalMuseaBinnen20Km` double, `afstandTotOpenbaarGroenTotaal` double, `afstandTotParkOfPlantsoen` double, `afstandTotDagrcreatiefTerrein` double, `afstandTotBos` double, `afstandTotOpenNatuurTerreinTotaal` double, `afstandTotOpenDroogNatuurTerrein` double, `afstandTotOpenNatNatuurlijkTerrein` double, `afstandTotSemiopenbaarGroenTotaal` double, `afstandTotSportterrein` double, `afstandTotVolkstuin` double, `afstandTotVerblijfsrecreatiefTerrein` double, `afstandTotRecreatiefBinnenwater` double, `afstandTotBegraafplaats` double, `jrstatcode` string, `jaar` integer, `aantalNieuwbouwWoningen` double, `aantalNietWoningvoorraad` integer, `aantalNieuwbouwNietWoningen` integer, `percEengezinswoningTussenwoning` double, `percEengezinswoningHoekwoning` double, `percEengezinswoning2Onder1Kap` double, `percEengezinswoningVrijstaand` double, `percBouwjaarMeerDan10JaarGeleden` double, `percBouwjaarAfgelopen10Jaar` double, `percentageOnbewoond` integer, `gemiddeldAardgasverbruik` integer, `percentageAardgaswoningen` double, `percentageAardgasvrijeWoningen` double, `gemiddeldeElektriciteitslevering` double, `gemiddeldeElektriciteitsteruglevering` double, `percentageWoningenMetZonnestroom` double, `aantalLeerlingenPrimairOnderwijs` integer, `aantalLeerlingenVoortgezetOnderwijs` integer, `aantalStudentenMbo` integer, `aantalStudentenHbo` integer, `aantalStudentenWo` integer, `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)
- Each year is a separate service (…/wijkenbuurten/2024/…). Use the boundaries from the same year as your figures. (experience)
- By default everything comes in RD (EPSG:28992). For a web map, request srsName=EPSG:4326 or EPSG:3857. (experience)
- Negative values such as -99997 are codes (confidential or unknown), not numbers. Remove them before calculating. The first neighbourhood in the service is 'Buitenland' (abroad) with aantalInwoners -99997. (tested)

### Example
```
https://service.pdok.nl/cbs/wijkenbuurten/2024/wfs/v1_0?request=GetFeature&service=WFS&version=2.0.0&typeNames=wijkenbuurten:buurten&outputFormat=application/json&srsName=EPSG:4326&count=1&propertyName=buurtcode,buurtnaam,gemeentenaam,aantalInwoners
```
