A collection of datasets from various Dutch institutions to demonstrate a Spatial Data Infrastructure built on Portolan.
Date: 2026-05-07
Create rich, data-driven Mapbox GL v8 style files for all 19 collections in portolan-nl. Each collection gets a styles/ directory with a default style and, where the data supports it, additional thematic styles highlighting interesting attributes. The goal is a visually diverse catalog where every collection has its own color identity and the most attribute-rich collections offer multiple viewing perspectives.
All styles follow the portolan STAC asset convention (ADR-0044):
{collection}/styles/{name}.json../{filename}.pmtilesportolan:styles manifest (first entry = default)styles/, role ["style"], type application/jsonAfter creating the style files, run portolan add --collection {id} to register them as STAC assets, or manually update collection.json.
Each subcatalog gets a distinct color family to create visual variety across the catalog:
Within each subcatalog, individual collections use variations within their family.
PMTiles: bag-light.pmtiles | Layer: panden | Geometry: polygon
Key fields: bouwjaar (int, construction year), gebruiksdoel (string, usage), status (string)
Styles:
Default style example:
By-age style — key paint expression:
By-use style — key paint expression:
PMTiles: bestuurlijke_gebieden.pmtiles | Layer: gemeenten | Geometry: polygon
Key fields: naam (string), code (string), ligt_in_provincie_naam (string)
Styles:
Only one style — the data is purely boundary/label data with no numeric attributes.
Default style:
PMTiles: buildings.pmtiles | Layer: buildings | Geometry: polygon
Key fields: anyPoint (string, construction date ISO 8601)
Styles:
Default style — distinct from BAG:
PMTiles: bbg2017.pmtiles | Layer: bbg2017 | Geometry: polygon
Key fields: bodemgebruik (string, land use type), categorie (string, category), bg2017 (int, code)
Styles:
Default style — categorie match:
PMTiles: bevolkingsspreiding.pmtiles | Layers: grid, lau, nuts2 | Geometry: polygon
Key fields: obsvalue (float, population count), periodofreference (string, year)
Styles:
Default style — grid layer with population ramp:
PMTiles: existing_landuse.pmtiles | Layer: existing_landuse | Geometry: polygon
Key fields: description (string, English land use type)
Styles:
Default style — description match:
PMTiles: gezondheid.pmtiles | Layers: doctors, deaths | Geometry: polygon
Key fields (doctors): HH_NL_NUTS2_doctors_STATCODE, province-level stats
Key fields (deaths): HH_NL_NUTS2_nrdeath_OBS_VALUE
Styles:
Small dataset (12 provinces) — one style is sufficient.
PMTiles: postcode6.pmtiles | Layer: postcode6 | Geometry: polygon
Key fields: aantal_inwoners (int), gemiddeld_aardgasverbruik_totaal (int), gemiddeld_elektriciteitsverbruik_totaal (int), mediaan_inkomen_huishouden (string), aantal_woningen_bouwjaar_voor_1945 (int)
Styles:
Default style — population ramp:
By-energy style — gas consumption:
PMTiles: wijken_en_buurten.pmtiles | Layers: buurten, wijken, gemeenten | Geometry: polygon
Key fields: aantalInwoners (int), bevolkingsdichtheidInwonersPerKm2 (int), percentagePersonen65JaarEnOuder (int), gemiddeldeHuishoudsgrootte (float), percentageEenpersoonshuishoudens (int)
Styles:
Default style — population density:
PMTiles: bergingsgebieden.pmtiles | Layer: bergingsgebieden | Geometry: polygon
Key fields: bergendvermogen (double, retention capacity), naam (string)
Styles:
PMTiles: fme_disk_tunnels.pmtiles | Layer: fme_disk_tunnels | Geometry: point
Key fields: tunnelnaam (string), wegnummer (string), jaar_openstelling (string), status (string)
Styles:
PMTiles: hectometervakken_vaargeul.pmtiles | Layer: hectometervakken_vaargeul | Geometry: polygon
Key fields: vak_ID (string) — minimal attributes
Styles:
PMTiles: rijksviswegen_2024.pmtiles | Layer: rijksviswegen_2024 | Geometry: line
Key fields: Status2024 (string), MIGR_TYPE (string), NAAM (string)
Styles:
Default style — connectivity status:
PMTiles: sluizen.pmtiles | Layer: sluizen | Geometry: point
Key fields: NAAM (string), NR_KOLKEN (int, number of chambers), BHR_NAAM (string, operator)
Styles:
PMTiles: waterkeringen.pmtiles | Layer: waterkeringen | Geometry: line
Key fields: NORMTYP_O (string, norm type), TRAJECT_ID (string)
Styles:
PMTiles: zero_emissiezones.pmtiles | Layer: zero_emissiezones | Geometry: polygon
Key fields: Naam (string), Soort (string, LEZ/ZES type), Startdatum (timestamp)
Styles:
PMTiles: rijksmonumenten.pmtiles | Layer: rijksmonumenten | Geometry: point
Key fields: hoofdcateg (string, main category), subcategor (string, subcategory), aard_monum (string, archaeological/built)
Styles:
Default style:
By-category — key expression:
PMTiles: nationale_parken.pmtiles | Layer: nationale_parken | Geometry: polygon
Key fields: naam (string), hectares (float), nr (int)
Styles:
PMTiles: natura2000.pmtiles | Layer: natura2000 | Geometry: polygon
Key fields: beschermin (string, protection type: VR/HR/VR+HR), naam_n2k (string)
Styles:
Default style:
By-directive — key expression:
Total: 19 collections, 32 style files
portolan add to register all styles as STAC assetsOpen Sans Regular is used throughout — verify that portolan-browser / ol-mapbox-style can resolve this or provide a glyph source.pmtiles://../{file}.pmtiles. Confirm portolan-browser resolves this relative to the style file location, not the collection.json location.-99997 for suppressed values. Styles should filter these out (add ["!=", ["get", "aantal_inwoners"], -99997] filter) or map them to a neutral color.