Een stippenkaart laat zien hoeveel er van iets is en waar binnen een regio het zit. Strooi één stip per honderd inwoners over een land en de steden verschijnen vanzelf, zonder dat er één grens getekend wordt.
Deze gids behandelt wat een stippenkaart is, hoe je de stipwaarde kiest, het plaatsingsprobleem dat bepaalt of de kaart eerlijk is, en hoe je er een bouwt op een webkaart.
Wat een stippenkaart is
Een stippenkaart, ook wel puntdichtheidskaart of dot distribution map, toont hoeveelheid door voor elk vast aantal eenheden een stip te plaatsen binnen de regio waar die eenheden bij horen.
Drie dingen definiëren er een:
- De stipwaarde. Voor hoeveel eenheden één stip staat. Eén stip is 100 inwoners, 50 hectare wijngaard, 10 bezorgstops.
- De stipgrootte. Hoe groot elke stip getekend wordt, in pixels of millimeters.
- De plaatsingsregel. Waar binnen de regio de stippen terechtkomen.
De lezer telt geen losse stippen. Die leest textuur: massieve inkt waar de hoeveelheid geconcentreerd is, verspreide spikkels waar het dun is. Dat is de kracht van het format, en de reden dat het een eeuw na de eerste met de hand gestippelde papieren kaarten nog bestaat.
Eén-op-één stippenkaarten zijn het bijzondere geval waarin elke stip een echte waarneming op echte coördinaten is: elke windturbine, elke apotheek, elke geregistreerde uitbraak. Dat zijn echte puntkaarten, en anders dan bij de geaggregeerde soort zijn hun posities te vertrouwen.
Stippenkaart versus choroplethenkaart versus heatmap
Drie formats, drie taken.
Een choroplethenkaart vult elke regio met één kleur. Hij leest het snelst en bouwt het makkelijkst, en laat elke regio vanbinnen uniform lijken. Een choroplethenkaart van een landelijke gemeente zegt dat de bevolking gelijkmatig verspreid ligt, terwijl het grootste deel in één dorp woont.
Een stippenkaart houdt het aantal vast en toont de spreiding binnenin. Grote lege regio's blijven visueel leeg, wat de oppervlaktebias oplost die choroplethenkaarten plaagt. De ruil is precisie: je kunt een exacte regiowaarde niet met het oog terughalen.
Een heatmap strijkt punten glad tot een doorlopend vlak. Clusters vindt hij goed, hoeveelheden verbergt hij, omdat niets erop verklaart wat een bepaalde kleur waard is.
De praktische regel: ratio's op een choroplethenkaart, aantallen op stippen, clusters zoeken op heat. Is oppervlaktebias het hoofdprobleem en doet detail binnen de regio er niet toe, dan is een cartogram de andere oplossing.
Voorbeelden van stippenkaarten
Waar het format zijn plek verdient:
- Bevolking per buurt of wijk, het bekendste gebruik, waarbij stipkleur de bevolking in groepen splitst en patronen van scheiding zichtbaar worden zonder dat er één grens te zien is.
- Landbouwproductie. Eén stip per duizend stuks vee of per honderd hectare gewas, het klassieke gebruik in nationale atlassen.
- Klanten of orders per postcode, geaggregeerd voor privacy, zodat geen stip naar een huishouden te herleiden is.
- Woningvoorraad per type, met één kleur voor appartementen en een andere voor eengezinswoningen.
- Winkel- of concurrentiebestand, waar de clustering het inzicht is.
- Aantallen ziektegevallen, als het doel concentratie tonen is in plaats van risico per hoofd.
De versie met meerdere categorieën is wat een choroplethenkaart echt niet kan. Twee tinten passen niet in één polygoon, twee stipkleuren kunnen een regio delen en hun verhouding tonen.
Het plaatsingsprobleem
Hier gaat het bij de meeste stippenkaarten mis.
Stippen worden meestal willekeurig binnen de regiopolygoon gestrooid. Als uitspraak over de regio is dat prima, als uitspraak over een willekeurig punt erin misleidend, want de willekeurige spreiding zet stippen in meren, op bedrijventerreinen, op vliegvelden en op berghellingen waar niemand woont.
Dasymetrische plaatsing is de oplossing. Beperk de stippen niet tot de hele polygoon maar tot de delen waar het gekarteerde daadwerkelijk kan zijn, met een masker: woonbestemming, gebouwcontouren of een landgebruikslaag. De regiototalen blijven gelijk en de stippen landen waar ze plausibel zijn. Gebouwcontouren uit open kaartdata zijn het gangbare masker voor bevolkingswerk, en voor een kaart op landschaal volstaat een grof landgebruiksmasker.
Een tweede regel houdt de kaart eerlijk tussen sessies: zet een seed op de willekeur. Een kaart zonder seed tekent bij elke pagina-lading anders, en een lezer die dat merkt haakt af. Genereer de stippen één keer, sla ze op, en serveer telkens dezelfde set.
De stipwaarde kiezen
De stipwaarde bepaalt of de kaart überhaupt leest. Twee manieren om het fout te doen:
Een te kleine stipwaarde levert zoveel stippen op dat dichte gebieden dichtslaan tot één massieve vlek. Zodra de inkt massief is verandert meer data niets meer, en de kaart onderschat de pieken.
Een te grote stipwaarde laat dunne regio's met nul of één stip achter, waardoor echte verschillen tussen dunne regio's verdwijnen.
Begin met een werkgetal van ruwweg tweeduizend stippen over de hele kaart op het standaardzoomniveau, render dan en stel bij. Het doel: het dichtste cluster toont nog textuur in plaats van een massieve vulling, en de dunste regio met betekenisvolle data krijgt nog een paar stippen.
De stipwaarde hangt af van het zoomniveau waarop de kaart gelezen wordt, en dat is het lastige aan een stippenkaart op het web. Een stipwaarde afgestemd op een landelijk overzicht slaat dicht op stadszoom. Twee gangbare antwoorden: zet de kaart vast op één zoomniveau en stem daarop af, of genereer aparte stipsets per zoombereik en wissel ze om, met de opgegeven stipwaarde altijd zichtbaar in de legenda.
Zo bouw je een stippenkaart
De pijplijn kent vier stappen:
- Haal regiopolygonen op met stabiele identifiers.
- Koppel één aantal per regio aan die identifiers.
- Genereer punten:
count / dotValuestippen per regio, geplaatst binnen de polygoon en het liefst binnen het masker. - Render de punten als een circle layer.
Turf regelt het genereren van de punten:
import randomPoint from '@turf/random';
import booleanPointInPolygon from '@turf/boolean-point-in-polygon';
import bbox from '@turf/bbox';
const DOT_VALUE = 100;
function dotsForRegion(feature, count) {
const target = Math.round(count / DOT_VALUE);
const box = bbox(feature);
const dots = [];
// Rejection sampling: draw inside the bounding box, keep what lands in the polygon
while (dots.length < target) {
const batch = randomPoint(target, { bbox: box }).features;
for (const point of batch) {
if (dots.length >= target) break;
if (booleanPointInPolygon(point, feature)) {
point.properties = { id: feature.properties.id, category: feature.properties.category };
dots.push(point);
}
}
}
return dots;
}
map.addLayer({
id: 'dots',
type: 'circle',
source: 'dot-density',
paint: {
'circle-radius': ['interpolate', ['linear'], ['zoom'], 4, 1.2, 10, 2.6],
'circle-color': ['match', ['get', 'category'], 'residential', '#12813D', 'commercial', '#B7A21F', '#406FBD'],
'circle-opacity': 0.75,
},
});
Twee opmerkingen bij dat fragment. Rejection sampling wordt traag bij lange dunne polygonen, waar het grootste deel van de bounding box mis is; de polygoon trianguleren en per driehoek op oppervlak samplen is sneller zodra je voorbij een paar honderdduizend stippen komt. En de straal groeit licht mee met de zoom, wat de textuur stabiel houdt terwijl de kaart schaalt.
Performance is de andere beperking. Een MapLibre circle layer verwerkt tienduizenden stippen zonder moeite. Daarboven genereer je de stippen serverside, bak je ze in vector tiles en laat je de tile-pijplijn de culling doen. Deck.gl's ScatterplotLayer is de andere route, en die neemt miljoenen punten op de GPU.
Valkuilen om op te letten
Precisie suggereren die er niet is. Zijn de stippen willekeurig geplaatst, zet dat dan in het bijschrift. Anders gaan lezers een losse stip opzoeken.
Een ontbrekende stipwaarde. De legenda moet verklaren wat één stip betekent, met dezelfde prominentie als een schaalbalk krijgt. Zonder die verklaring toont de kaart patroon en geen hoeveelheid. De gids over legenda's behandelt hoe je dat opmaakt.
Overplotting bij hoge zoom. Stippen die op landelijke zoom overlappen gaan op straatzoom uit elkaar en verraden dat het nooit echte adressen waren. Begrens de maximale zoom, of wissel van laag.
Te veel categorieën. Drie of vier stipkleuren is de grens voordat de mix modder wordt. Splits daarboven in kleine reeksen naast elkaar.
Een ratio karteren. Stippen tellen dingen. Een stippenkaart van een percentage heeft geen eerlijke lezing.
Waar MapAtlas past
Een stippenkaart is niet beter dan de geometrie eronder. De Dynamic Maps API levert grenzen van landen, regio's en postcodes als vector tiles op stabiele identifiers, zodat stippen genereren per regio een join is en geen opschoonklus, en dankzij de EU-gehoste, van een versiestempel voorziene grenzen komt een kaart die je volgend kwartaal opnieuw genereert overeen met wat je gepubliceerd hebt.
Voor dasymetrische plaatsing geeft de POI- en plaatsdata achter GeoEnrich je de gebouw- en landgebruikscontext om stippen uit het water en van de vliegvelden te houden, plus aggregaten per regio op dezelfde identifiers om de aantallen te voeden. Heb je ratio-data, gebruik dan de gids over choroplethenkaarten; voor de bredere familie thematische kaarten begin je bij de gids over soorten kaarten.
Veelgestelde vragen
Wat is een stippenkaart?
Een stippenkaart is een thematische kaart die hoeveelheid toont door stippen binnen regio's te plaatsen, waarbij elke stip voor een vast aantal eenheden staat. Eén stip kan 100 mensen betekenen, 10 boerderijen of één klant. De lezer schat de waarde af aan hoe dicht de stippen op elkaar staan, dus de kaart laat zien hoeveel er is en waar binnen de regio het zit.
Wat is het verschil tussen een stippenkaart en een choroplethenkaart?
Een choroplethenkaart vult elke regio met één kleur voor één waarde, waardoor de hele regio uniform oogt. Een stippenkaart strooit stippen binnen de regio, wat variatie binnenin toont en voorkomt dat grote lege regio's belangrijk lijken. Choroplethenkaarten zijn beter voor ratio's en voor snel lezen. Stippenkaarten zijn beter voor aantallen, voor het tonen van clustering en voor het vergelijken van twee of meer categorieën op dezelfde kaart.
Wat is het verschil tussen een stippenkaart en een heatmap?
Een stippenkaart tekent losse stippen op een opgegeven stipwaarde, dus de lezer kan tellen en het onderliggende getal is terug te halen. Een heatmap strijkt puntdata glad tot een doorlopend kleurvlak zonder vaste eenheid, wat sneller leest maar het aantal verbergt. Gebruik stippen als de hoeveelheid telt en heat als je alleen clusters hoeft te vinden.
Hoe kies je de stipwaarde op een stippenkaart?
Kies een stipwaarde die het dichtste gebied dicht maar telbaar houdt en het dunste gebied zichtbaar laat. De gebruikelijke methode is proberen op het zoomniveau waarop de kaart echt gelezen wordt: begin met het totaal gedeeld door ruwweg tweeduizend stippen, render het, en stel bij. Een te kleine stipwaarde maakt steden tot massieve inkt, een te grote laat het platteland leeg lijken.
Staan de stippen op een stippenkaart op de juiste plek?
Alleen bij één-op-één stippenkaarten, waar elke stip een echte waarneming met echte coördinaten is. In het gangbare geval worden stippen willekeurig binnen de regio gestrooid, dus een losse stip markeert geen specifiek adres. De plaatsing kan eerlijker met dasymetrische verfijning, waarbij stippen beperkt worden tot de delen van de regio waar het ding daadwerkelijk kan zijn, zoals woongebied in plaats van meren en vliegvelden.
Wanneer gebruik je een stippenkaart?
Gebruik er een als je data een aantal is en geen ratio, als regio's sterk verschillen in oppervlak, als clustering binnen een regio deel van het verhaal is, of als je meerdere categorieën tegelijk wilt tonen met verschillende stipkleuren. Sla het over als lezers een exacte waarde per regio nodig hebben, als de kaart een seconde lang op een dashboard bekeken wordt, of als je regio's zo klein zijn dat een paar stippen geen patroon dragen.

