303.525 datasets geïndexeerd1.419 uitgevers
Open Data IndexDe index van open data over Nederland
Open Data Index›Bouwen›Verkiezingskaart: uitslag, verschuiving en opkomst per gemeente
KaartGevorderdBestuur

Verkiezingskaart: uitslag, verschuiving en opkomst per gemeente

Een kaart van alle 342 gemeenten met de grootste partij, de winst of het verlies sinds de vorige verkiezing en de opkomst, naast het inkomen per inwoner.

Je AI-assistentOpen Data Index MCP aan
De MCP-server van Open Data Index staat aan in je chat. Zo leest de assistent dit project en de bronnen zelf.
Jij plakt de prompt van dit project
De assistent haalt op bij Open Data Index
  • geef_project("verkiezingskaart")
  • geef_bron("kiesraad-verkiezingen")
  • geef_bron("pdok-wijkenbuurten")
  • geef_bron("cbs-kwb")
De assistent

Ik heb het project, de geteste aanroepen en de valkuilen. Ik bouw een kaart met Verkiezingsuitslagen van de Kiesraad, Wijk- en buurtkaart en Kerncijfers wijken en buurten. Zo kan het eruitzien:

Dit bouw je zelf. Kopieer de prompt naar Claude, ChatGPT of Cursor, met de MCP-server aan, of volg de stappen hieronder.

Volg de stappen
NLUitslagen­avondLIVETweede Kamer 2025

Wie won waar

PVV wint 158 van de 342 gemeenten

D66 haalt landelijk de meeste stemmen

  • 158PVV
  • 80D66
  • 42VVD
  • 38CDA
  • 16SGP
  • 8GL-PvdA
Uitslag
D66 wint het meestRozendaal 12,7 → 29,1% · Heemstede 13,2 → 29,5% · Gooise Meren 12,5 → 28,1%◆PVV verliest het meestEdam-Volendam 42,9 → 28,5% · Bunschoten 33,7 → 21,4% · Westland 32,7 → 21,2%◆Laagste opkomstRotterdam 63,3% · Heerlen 65,8% · Almere 67,5%◆Hoogste opkomstSchiermonnikoog 132,6% · Vlieland 112% · Ameland 105,6%◆
Mockup

Dit is een mockup, geen werkende versie, met de uitslag van de Tweede Kamerverkiezing van 29 oktober 2025 uit onze proefdraai van 16 oktober 2026; de kaartkleuren rekenden we op 17 oktober 2026 na met de gemeente-CSV van de Kiesraad. De MCP-server zet je aan met het adres op Voor AI.

Voor wie

Datajournalisten en infographicmakers op verkiezingsavond en daarna, politieke partijen en campagneteams, docenten maatschappijleer en iedereen die wil zien waar een partij groeide of kromp.

Wat je krijgt

Een GeoJSON-bestand met alle 342 gemeenten (grenzen 2025) en per gemeente de grootste partij, het aandeel van D66 en PVV bij de Tweede Kamerverkiezingen van 2023 en 2025, de opkomst in 2025 en het gemiddelde inkomen per inwoner. Dat laad je zo in MapLibre, Leaflet, QGIS of Datawrapper als kleurenkaart.

Proefdraai op 16 oktober 2026 (Tweede Kamer 29 oktober 2025): de PVV was de grootste in 158 gemeenten, D66 in 80, VVD in 42, CDA in 38, SGP in 16 en GroenLinks-PvdA in 8, terwijl D66 landelijk de meeste stemmen had. D66 groeide het sterkst in Rozendaal (12,7 naar 29,1%) en Heemstede (13,2 naar 29,5%); de PVV verloor het meest in Edam-Volendam (42,9 naar 28,5%) en Bunschoten (33,7 naar 21,4%). De opkomst was het laagst in Rotterdam (63,3%), Heerlen (65,8%) en Almere (67,5%). Op Schiermonnikoog werden meer stemmen uitgebracht dan er kiezers wonen (132,6%). Opkomst en inkomen per inwoner hangen per gemeente maar zwak samen (r = 0,24 over 337 gemeenten).

Stemmen op de PVV, Tweede Kamerverkiezing 2025: het hoogst in Rucphen (46,2%), het laagst in Rozendaal (5,1%)

Stemmen op de PVV, Tweede Kamerverkiezing 2025 per gemeente, oktober 2025, in procent van de geldige stemmen. Heel Nederland: 16,7. 342 gemeenten met een cijfer.

Bron: Kiesraad, Databank verkiezingsuitslagen (Tweede Kamer 29 oktober 2025, uitslag per gemeente) · opgehaald 25 oktober 2026 · selectie: partij: PVV (Partij voor de Vrijheid); aandeel in de geldige stemmen op partijenOpen de tabel Los blok

Zo zou je kunnen starten5 stappen

  1. 1

    Download de uitslag per gemeente

    De databank van de Kiesraad geeft per verkiezing een CSV met puntkomma's: gemeente, code, historische code, partij, stemmen (359 kB voor 2025). De verkiezingscode is soort plus datum (TK20251029). Code G0518 wordt in CBS- en PDOK-data GM0518. G9010 (NBSB, briefstemmers uit het buitenland) is geen gemeente: sla codes vanaf G9000 over. Een lege stemmenkolom betekent dat de partij daar niet meedeed.

    https://www.verkiezingsuitslagen.nl/uitslag/verkiezing/TK20251029/gemeenten
    Gemeente;Code;AmsterdamseCode;Partij;AantalStemmen;AantalZetels;
    's-Gravenhage;G0518;11434;D66;49028;;
    's-Gravenhage;G0518;11434;GROENLINKS / Partij van de Arbeid (PvdA);40603;;
    's-Gravenhage;G0518;11434;PVV (Partij voor de Vrijheid);38897;;
    …
    Bergen;G0373;11424;VVD;4107;;
    …
    Bergen;G0893;11281;PVV (Partij voor de Vrijheid);2421;;
    …
    NBSB;G9010;;GROENLINKS / Partij van de Arbeid (PvdA);25110;;
  2. 2

    Dezelfde CSV van de vorige verkiezing

    Voor de verschuiving haal je TK20231122 op. Beide jaren hebben dezelfde 342 gemeentecodes. Partijnamen verschillen wel: 'Nieuw Sociaal Contract' in 2023 heet 'Nieuw Sociaal Contract (NSC)' in 2025, en BVNL en Nederland met een PLAN kregen een andere naam. Twee gemeenten heten 'Bergen' (G0373 in Noord-Holland, G0893 in Limburg): werk altijd met de code.

    https://www.verkiezingsuitslagen.nl/uitslag/verkiezing/TK20231122/gemeenten
    Gemeente;Code;AmsterdamseCode;Partij;AantalStemmen;AantalZetels;
    's-Gravenhage;G0518;11434;PVV (Partij voor de Vrijheid);53202;;
    's-Gravenhage;G0518;11434;GROENLINKS / Partij van de Arbeid (PvdA);47315;;
    's-Gravenhage;G0518;11434;VVD;36948;;
    's-Gravenhage;G0518;11434;DENK;21006;;
    's-Gravenhage;G0518;11434;Nieuw Sociaal Contract;20811;;
  3. 3

    Opkomst uit de CSV-zip op data.overheid.nl

    De databank-CSV heeft geen opkomst. De Kiesraad zet per verkiezing ook een zip op data.overheid.nl; die van 2025 (2,3 MB) bevat TK2025_uitslag.csv in lang formaat: VeldType zegt wat een regel is (Kiesgerechtigden, Opkomst, LijstAantalStemmen …), Waarde het getal. Opkomst is het aantal uitgebrachte stemmen in de gemeente, ook van kiezers van elders met een kiezerspas: op Schiermonnikoog 1.050 stemmen bij 792 kiesgerechtigden. De README noemt het 'onderzoeksdata, geen officiële verkiezingsuitslag'.

    https://data.overheid.nl/sites/default/files/dataset/a16f3352-c9ce-4831-a314-f989d442a258/resources/Verkiezingsuitslag Tweede Kamer 2025 (CSV Formaat).zip
    (zip, 2.299.191 bytes: README_TK2025.txt, TK2025_Stemmen_Per_Lijst_Per_Stembureau.csv, TK2025_uitslag.csv; uit TK2025_uitslag.csv:)
    Regio;RegioCode;OuderRegioCode;GrootOuderRegioCode;Partij;LijstNummer;LijstNaam;…;VeldType;Waarde
    's-Gravenhage;G0518;K12;P28;;;;;;;;;;;Kiesgerechtigden;357702
    's-Gravenhage;G0518;K12;P28;;;;;;;;;;;Opkomst;248100
    Bergen (NH);G0373;K11;P27;;;;;;;;;;;Opkomst;20954
    Bergen (L);G0893;K19;P31;;;;;;;;;;;Opkomst;8436
    Schiermonnikoog;G0088;K2;P21;;;;;;;;;;;Kiesgerechtigden;792
    Schiermonnikoog;G0088;K2;P21;;;;;;;;;;;Opkomst;1050
  4. 4

    Gemeentegrenzen van PDOK

    CBS-gebiedsindelingen bij PDOK heeft per jaar een gegeneraliseerde gemeentekaart: 342 vlakken in WGS84, 1,7 MB, licht genoeg voor een webkaart. statcode is de GM-code. Neem de grenzen van het jaar van de verkiezing (jaarcode=2025 voor oktober 2025). De wijk- en buurtkaart van PDOK heeft precieze grenzen, maar die zijn veel groter.

    https://api.pdok.nl/cbs/gebiedsindelingen/ogc/v1/collections/gemeente_gegeneraliseerd/items?f=json&jaarcode=2025&limit=1000
    {"type":"FeatureCollection","timeStamp":"2026-10-16T21:59:26Z","links":[{"rel":"self","title":"This document as GeoJSON", …}],
     "features":[{"type":"Feature","properties":{"einddatum":"2025-12-31T23:59:59Z","id":1,"jaarcode":2025,
       "jrstatcode":"2025GM0014","rubriek":"gemeente","startdatum":"2025-01-01T00:00:00Z","statcode":"GM0014","statnaam":"Groningen"},
       "geometry":{"type":"MultiPolygon","coordinates":[[[[6.741574269507619,53.311599621027824], …
     … ],"numberReturned":342}
  5. 5

    Inkomen per gemeente uit de Kerncijfers wijken en buurten

    Elke jaargang is een eigen tabel (2024 = 85984NED, 2025 = 86165NED). Inkomen komt pas later: in de tabel van 2025 is GemiddeldInkomenPerInwoner_78 voor alle gemeenten nog leeg, in die van 2024 gevuld voor 339 van de 342 (in 1.000 euro, voorlopig). De sleutel is tot 10 tekens met spaties aangevuld: 'GM0518 '. startswith(WijkenEnBuurten,'GM') geeft alle gemeenten in één keer.

    https://opendata.cbs.nl/ODataApi/OData/85984NED/TypedDataSet?$filter=startswith(WijkenEnBuurten,'GM')&$select=WijkenEnBuurten,GemiddeldInkomenPerInwoner_78&$format=json
    {
      "odata.metadata":"https://opendata.cbs.nl/ODataApi/OData/85984NED/$metadata#Cbs.OData.WebAPI.TypedDataSet&$select=WijkenEnBuurten,GemiddeldInkomenPerInwoner_78","value":[
        {
          "WijkenEnBuurten":"GM1680    ","GemiddeldInkomenPerInwoner_78":35.0
        },{
          "WijkenEnBuurten":"GM0358    ","GemiddeldInkomenPerInwoner_78":38.1
        }, …

Hoe de bronnen samenkomen

  • Verkiezingsuitslagen van de KiesraadWijk- en buurtkaartvia gemeentecode: Kiesraad G0518 = PDOK statcode GM0518

    Vervang de G door GM. Neem de grenzen van het jaar van de verkiezing; na een herindeling bestaan oude gemeenten niet meer op de kaart. Voor TK 2023 en TK 2025 waren het in beide gevallen dezelfde 342 codes.

  • Verkiezingsuitslagen van de KiesraadKerncijfers wijken en buurtenvia gemeentecode: G0518 = WijkenEnBuurten 'GM0518 ' (10 tekens)

    De Kerncijfers wijken en buurten geven per gemeente inwoners, leeftijd, inkomen, WOZ-waarde en koopwoningen: genoeg om uitslag en opkomst naast de bevolking te leggen. Haal de spaties weg voor je koppelt.

Laat AI het bouwen

Plak deze prompt in Claude, ChatGPT, Cursor of Lovable. Hij noemt de echte endpoints, de koppelsleutels en de valkuilen, zodat de assistent meteen werkende code schrijft. Controleer de uitkomst altijd met de bron zelf.

Bouw een interactieve kaart (MapLibre GL of Leaflet, één HTML-bestand, plus een klein Node-script dat de data klaarzet) van de Tweede Kamerverkiezingen per gemeente: grootste partij, verschuiving van een gekozen partij tussen 2023 en 2025, en opkomst.

Data, geen sleutels:
1. Uitslag per gemeente (CSV, puntkomma's): https://www.verkiezingsuitslagen.nl/uitslag/verkiezing/TK20251029/gemeenten en …/TK20231122/gemeenten
   Kolommen: Gemeente;Code;AmsterdamseCode;Partij;AantalStemmen;AantalZetels. Code G0518 -> GM0518. Sla G9010 (NBSB, briefstemmers buitenland) en alle codes vanaf G9000 over. Lege AantalStemmen = partij deed niet mee. Twee gemeenten heten 'Bergen' (G0373, G0893): koppel op code, nooit op naam. Partijnamen verschillen per jaar ('Nieuw Sociaal Contract' en 'Nieuw Sociaal Contract (NSC)'): maak een kleine tabel om ze gelijk te trekken.
2. Opkomst 2025: zip op https://data.overheid.nl/sites/default/files/dataset/a16f3352-c9ce-4831-a314-f989d442a258/resources/Verkiezingsuitslag%20Tweede%20Kamer%202025%20%28CSV%20Formaat%29.zip
   Bestand TK2025_uitslag.csv, lang formaat: kolom VeldType (Kiesgerechtigden, Opkomst, AantalGeldigeStemmen …), kolom Waarde. RegioCode G…= gemeente, K kieskring, P provincie, L land, O openbaar lichaam. Opkomst% = Opkomst / Kiesgerechtigden. Opkomst telt ook kiezers van elders (kiezerspas): Waddeneilanden komen boven 100%. Toon dat met een voetnoot, niet als fout.
3. Grenzen: https://api.pdok.nl/cbs/gebiedsindelingen/ogc/v1/collections/gemeente_gegeneraliseerd/items?f=json&jaarcode=2025&limit=1000 (342 MultiPolygons in WGS84, statcode = GM-code).
4. Inkomen per inwoner: https://opendata.cbs.nl/ODataApi/OData/85984NED/TypedDataSet?$filter=startswith(WijkenEnBuurten,'GM')&$select=WijkenEnBuurten,GemiddeldInkomenPerInwoner_78&$format=json (1.000 euro; sleutels met spaties tot 10 tekens; 3 gemeenten leeg). De nieuwere tabel 86165NED heeft nog geen inkomen.

Wat de kaart moet doen:
- Laag 'grootste partij': elke gemeente in de kleur van de partij met de meeste stemmen; legenda met het aantal gemeenten per partij.
- Laag 'verschuiving': kies een partij; kleur op het verschil in procentpunten tussen 2023 en 2025 (aandeel van de geldige stemmen op partijen in die gemeente), divergerende kleurschaal met 0 in het midden.
- Laag 'opkomst': opkomst 2025 in procenten; gemeenten boven 100% apart gemarkeerd.
- Klik op een gemeente: top 5 partijen 2023 en 2025, opkomst, inwoners en inkomen.
- Kleine eilanden en grote steden zijn even groot op de kaart als hun oppervlak, niet als hun aantal kiezers: zet er een staafgrafiek of cartogram naast.

Zet het resultaat van stap 1 tot en met 4 in één GeoJSON (properties per gemeente) zodat de webpagina alleen dat bestand hoeft te laden.

Probeer het zelf

De kern van het project in een klein script. Nodig: Node 20 of nieuwer (ingebouwde fetch en zlib); draai met: node verkiezingskaart.mjs. Getest op 2026-10-16; hieronder de echte uitvoer van die proefdraai.

// Verkiezingskaart: winnaar, verschuiving en opkomst per gemeente (Tweede Kamer 2023 en 2025), met grenzen en inkomen.
// Bronnen: Kiesraad (databank-CSV en data.overheid.nl), PDOK (CBS-gebiedsindelingen), CBS Kerncijfers wijken en buurten.
// Geen sleutels. Node 20+. Schrijft verkiezingskaart.geojson (open in QGIS, geojson.io of laad in MapLibre/Leaflet).
import { inflateRawSync } from "node:zlib";
import { writeFileSync } from "node:fs";
const UA = { "User-Agent": "mijn-project/1.0 (+jij@voorbeeld.nl)" };
const tekst = async (url) => (await fetch(url, { headers: UA })).text();

// 1. Stemmen per partij per gemeente uit de databank. Code G0518 -> GM0518. G9010 (briefstemmers buitenland) is geen gemeente.
//    Twee gemeenten heten 'Bergen' (G0373 en G0893): werk altijd met de code, nooit met de naam.
async function uitslag(code) {
  const per = {};
  for (const regel of (await tekst(`https://www.verkiezingsuitslagen.nl/uitslag/verkiezing/${code}/gemeenten`)).trim().split("\n").slice(1)) {
    const [naam, g, , partij, stemmen] = regel.split(";");
    if (!stemmen || +g.slice(1) >= 9000) continue;                       // lege stemmen = partij deed daar niet mee
    const gm = "GM" + g.slice(1);
    const p = partij.replace(/ \(NSC\)$/, "");                            // NSC heet in 2023 en 2025 net anders
    (per[gm] ??= { naam, stemmen: {}, totaal: 0 }).stemmen[p] = +stemmen;
    per[gm].totaal += +stemmen;
  }
  return per;
}
const [tk23, tk25] = await Promise.all([uitslag("TK20231122"), uitslag("TK20251029")]);

// 2. Opkomst 2025: in de CSV-zip op data.overheid.nl (TK2025_uitslag.csv, VeldType Kiesgerechtigden en Opkomst).
//    Zip uitpakken zonder pakket: centrale map lezen, dan het bestand met inflateRaw.
const zip = Buffer.from(await (await fetch("https://data.overheid.nl/sites/default/files/dataset/a16f3352-c9ce-4831-a314-f989d442a258/resources/Verkiezingsuitslag%20Tweede%20Kamer%202025%20%28CSV%20Formaat%29.zip", { headers: UA })).arrayBuffer());
function uitZip(buf, naam) {
  const eocd = buf.lastIndexOf(Buffer.from([0x50, 0x4b, 0x05, 0x06]));
  let p = buf.readUInt32LE(eocd + 16);
  for (let i = 0; i < buf.readUInt16LE(eocd + 10); i++) {
    const [lengte, nl, el, cl, lokaal] = [buf.readUInt32LE(p + 20), buf.readUInt16LE(p + 28), buf.readUInt16LE(p + 30), buf.readUInt16LE(p + 32), buf.readUInt32LE(p + 42)];
    if (buf.toString("utf8", p + 46, p + 46 + nl) === naam) {
      const start = lokaal + 30 + buf.readUInt16LE(lokaal + 26) + buf.readUInt16LE(lokaal + 28);
      return inflateRawSync(buf.subarray(start, start + lengte)).toString("utf8");
    }
    p += 46 + nl + el + cl;
  }
}
const opkomst = {};
for (const regel of uitZip(zip, "TK2025_uitslag.csv").split("\n")) {
  const k = regel.split(";");
  if (!/^G\d{4}$/.test(k[1]) || +k[1].slice(1) >= 9000) continue;
  const o = (opkomst["GM" + k[1].slice(1)] ??= {});
  if (k[14] === "Kiesgerechtigden" || k[14] === "Opkomst") o[k[14]] = +k[15];
}

// 3. Inkomen per inwoner uit de Kerncijfers wijken en buurten 2024 (85984NED; in de tabel van 2025 is inkomen nog leeg).
const kwb = JSON.parse(await tekst("https://opendata.cbs.nl/ODataApi/OData/85984NED/TypedDataSet?" + new URLSearchParams({
  $filter: "startswith(WijkenEnBuurten,'GM')", $select: "WijkenEnBuurten,GemiddeldInkomenPerInwoner_78", $format: "json" }))).value;
const inkomen = Object.fromEntries(kwb.map((r) => [r.WijkenEnBuurten.trim(), r.GemiddeldInkomenPerInwoner_78]));  // sleutel 'GM0518    ' (10 tekens)

// 4. Grenzen 2025 (gegeneraliseerd, 1,7 MB) van PDOK; statcode = GM-code.
const grenzen = JSON.parse(await tekst("https://api.pdok.nl/cbs/gebiedsindelingen/ogc/v1/collections/gemeente_gegeneraliseerd/items?f=json&jaarcode=2025&limit=1000"));

const aandeel = (u, gm, p) => (100 * (u[gm]?.stemmen[p] ?? 0)) / (u[gm]?.totaal || 1);
const winnaars = {}, rijen = [];
for (const f of grenzen.features) {
  const gm = f.properties.statcode, u = tk25[gm];
  if (!u) { console.log("geen uitslag voor", gm); continue; }
  const [winnaar] = Object.entries(u.stemmen).sort((a, b) => b[1] - a[1])[0];
  winnaars[winnaar] = (winnaars[winnaar] ?? 0) + 1;
  const o = opkomst[gm], pct = o ? (100 * o.Opkomst) / o.Kiesgerechtigden : null;
  f.properties = { gm, naam: f.properties.statnaam, winnaar, opkomst: pct && +pct.toFixed(1),
    d66_23: +aandeel(tk23, gm, "D66").toFixed(1), d66_25: +aandeel(tk25, gm, "D66").toFixed(1),
    pvv_23: +aandeel(tk23, gm, "PVV (Partij voor de Vrijheid)").toFixed(1), pvv_25: +aandeel(tk25, gm, "PVV (Partij voor de Vrijheid)").toFixed(1),
    inkomen: inkomen[gm] ?? null };
  rijen.push(f.properties);
}
writeFileSync("verkiezingskaart.geojson", JSON.stringify(grenzen));
console.log(`${rijen.length} gemeenten op de kaart. Grootste partij per gemeente, TK 2025:`);
for (const [p, n] of Object.entries(winnaars).sort((a, b) => b[1] - a[1])) console.log(`  ${String(n).padStart(3)}  ${p}`);
const sorteer = (k) => [...rijen].filter((r) => r[k] != null).sort((a, b) => b[k] - a[k]);
const op = sorteer("opkomst");
console.log(`\nOpkomst: hoogst ${op.slice(0, 3).map((r) => `${r.naam} ${r.opkomst}%`).join(", ")}; laagst ${op.slice(-3).map((r) => `${r.naam} ${r.opkomst}%`).join(", ")}`);
const groei = [...rijen].sort((a, b) => (b.d66_25 - b.d66_23) - (a.d66_25 - a.d66_23));
console.log(`D66 grootste winst: ${groei.slice(0, 3).map((r) => `${r.naam} ${r.d66_23}% -> ${r.d66_25}%`).join(", ")}`);
const pvv = [...rijen].sort((a, b) => (a.pvv_25 - a.pvv_23) - (b.pvv_25 - b.pvv_23));
console.log(`PVV grootste verlies: ${pvv.slice(0, 3).map((r) => `${r.naam} ${r.pvv_23}% -> ${r.pvv_25}%`).join(", ")}`);
// Samenhang opkomst en inkomen (Pearson r). Opkomst boven 100% (stemmers van elders, Waddeneilanden) laten we weg.
const xy = rijen.filter((r) => r.opkomst != null && r.opkomst <= 100 && r.inkomen != null);
const gem = (a) => a.reduce((s, x) => s + x, 0) / a.length;
const mx = gem(xy.map((r) => r.inkomen)), my = gem(xy.map((r) => r.opkomst));
const r = xy.reduce((s, q) => s + (q.inkomen - mx) * (q.opkomst - my), 0) /
  Math.sqrt(xy.reduce((s, q) => s + (q.inkomen - mx) ** 2, 0) * xy.reduce((s, q) => s + (q.opkomst - my) ** 2, 0));
console.log(`Opkomst tegen inkomen per inwoner (${xy.length} gemeenten): r = ${r.toFixed(2)}`);
Uitvoer
342 gemeenten op de kaart. Grootste partij per gemeente, TK 2025:
  158  PVV (Partij voor de Vrijheid)
   80  D66
   42  VVD
   38  CDA
   16  Staatkundig Gereformeerde Partij (SGP)
    8  GROENLINKS / Partij van de Arbeid (PvdA)

Opkomst: hoogst Schiermonnikoog 132.6%, Vlieland 112%, Ameland 105.6%; laagst Almere 67.5%, Heerlen 65.8%, Rotterdam 63.3%
D66 grootste winst: Rozendaal 12.7% -> 29.1%, Heemstede 13.2% -> 29.5%, Gooise Meren 12.5% -> 28.1%
PVV grootste verlies: Edam-Volendam 42.9% -> 28.5%, Bunschoten 33.7% -> 21.4%, Westland 32.7% -> 21.2%
Opkomst tegen inkomen per inwoner (337 gemeenten): r = 0.24

Waar het misgaat

  • Twee gemeenten heten 'Bergen' (G0373 Noord-Holland, G0893 Limburg); in de databank-CSV staan ze allebei als 'Bergen', in de zip als 'Bergen (NH)' en 'Bergen (L)'. Koppel altijd op code.
  • G9010 (NBSB) is geen gemeente maar de briefstemmers uit het buitenland: 25.110 stemmen voor GroenLinks-PvdA in 2025. Sla codes vanaf G9000 over, anders heb je 343 'gemeenten' en een gemeente zonder grens.
  • Opkomst boven 100% is geen fout: Opkomst telt alle stemmen die in de gemeente zijn uitgebracht, ook van kiezers van elders met een kiezerspas. Schiermonnikoog kwam op 132,6%, Vlieland op 112%. Laat die gemeenten weg bij correlaties en zet een voetnoot bij de kaart.
  • Partijnamen veranderen tussen verkiezingen ('Nieuw Sociaal Contract' werd 'Nieuw Sociaal Contract (NSC)'; BVNL en Nederland met een PLAN kregen een andere naam). Wie op naam vergelijkt, ziet een partij verdwijnen en een nieuwe opduiken.
  • Elke verkiezing heeft een ander bestandsformaat: de databank-CSV is per gemeente en partij, de zip op data.overheid.nl is lang (VeldType en Waarde) en bij oudere verkiezingen staan er EML- en Excel-bestanden. Schrijf per bron een eigen inleesstap en controleer de totalen met de landelijke uitslag.
  • Een kaart overdrijft dunbevolkte gemeenten: de PVV was de grootste in 158 gemeenten, maar D66 had landelijk de meeste stemmen. Zet het aantal kiezers ernaast (stippen, cartogram of een staafgrafiek).
  • De Kerncijfers wijken en buurten zijn per jaargang een andere tabel, en inkomen komt een jaar of twee later dan inwoners. Vermeld bij het inkomen uit welke tabel het komt (hier 85984NED, voorlopige cijfers).

Verder bouwen

  • Ga naar stembureauniveau: TK2025_Stemmen_Per_Lijst_Per_Stembureau.csv in dezelfde zip heeft per stembureau de postcode. Koppel die aan PDOK-postcodes of buurten en maak een kaart per wijk.
  • Voeg de gemeenteraadsverkiezingen van 18 maart 2026 toe (GR20260318): kijk of lokale partijen groot zijn waar de landelijke opkomst laag was. Let op: die CSV is lang (VeldType en Waarde) en noemt zijn gegevens voorlopig.
  • Maak een schuifbalk door de tijd met alle Tweede Kamerverkiezingen in de databank, op de gemeentegrenzen van dat jaar (PDOK heeft gebiedsindelingen vanaf 2016).
  • Zet meer kerncijfers naast de uitslag (aandeel 65-plussers, WOZ-waarde, koopwoningen) en laat per partij zien met welk kenmerk het aandeel het sterkst samenhangt.

Meer met deze data

Stemmen op D66, Tweede Kamerverkiezing 2025: het hoogst in Heemstede (29,5%), het laagst in Urk (0,7%)

Stemmen op D66, Tweede Kamerverkiezing 2025 per gemeente, oktober 2025, in procent van de geldige stemmen. Heel Nederland: 16,9. 342 gemeenten met een cijfer.

Bron: Kiesraad, Databank verkiezingsuitslagen (Tweede Kamer 29 oktober 2025, uitslag per gemeente) · opgehaald 25 oktober 2026 · selectie: partij: D66; aandeel in de geldige stemmen op partijenOpen de tabel Los blok

De bronnen3

Verkiezingsuitslagen van de Kiesraad

KiesraadNederland, stembureau

De officiële uitslagen van alle verkiezingen: Tweede Kamer, gemeenteraad, Provinciale Staten, waterschap, Europees Parlement en referenda. De Databank Verkiezingsuitslagen gaat terug tot 1848 en heeft per verkiezing een CSV per gemeente. Voor recente verkiezingen staan op data.overheid.nl ook de tellingsbestanden (EML) met stemmen per stembureau en per kandidaat.

OpenDownloadBestuur
Actueel
bijgewerkt in maart 2026

Wijk- en buurtkaart

CBS en Kadaster, via PDOKNederland, buurt

De officiële grenzen van alle gemeenten, wijken en buurten, als kaartlaag (WFS) en als download. De geometrie die je nodig hebt om buurtcijfers op een kaart te zetten.

OpenKaartlaagDownloadWonen en ruimte
Bereikbaar
jaarlijks

Kerncijfers wijken en buurten

CBSNederland, buurt

Ruim honderd cijfers per buurt: inwoners naar leeftijd, huishoudens, WOZ-waarde, inkomen, uitkeringen, auto's en afstand tot voorzieningen. Elk jaar een nieuwe tabel.

OpenAPIDownloadBevolkingWonen en ruimteEconomie
Actueel
bijgewerkt gisteren

Meer om te bouwen