Een technische deep-dive in de werking van geocoding: van adres parsing tot coördinaat matching. Begrijp wat er gebeurt wanneer je een adres omzet.
Wanneer je een adres invoert en binnen milliseconden de exacte coördinaten terugkrijgt, lijkt het bijna magie. Maar achter de schermen vindt een complex proces plaats. In dit artikel nemen we je mee door de technische werking van geocoding.

Het geocoding proces in 5 stappen
Elke geocoding request doorloopt de volgende stappen:
- Parsing - Het adres wordt opgesplitst in componenten
- Normalisatie - Variaties worden gestandaardiseerd
- Matching - Componenten worden vergeleken met de database
- Scoring - Matches krijgen een betrouwbaarheidsscore
- Coördinaat lookup - De beste match levert coördinaten
Stap 1: Address Parsing
De eerste uitdaging is het correct splitsen van een vrije tekst adres in gestructureerde componenten. Neem dit voorbeeld:
"Kalverstraat 1A, 1012 NX Amsterdam"
De parser moet herkennen:
{"street": "Kalverstraat","house_number": "1","house_number_addition": "A","postcode": "1012 NX","city": "Amsterdam"}
NLP en patroonherkenning
Moderne geocoders gebruiken een combinatie van regelgebaseerde parsing (regex patronen) en machine learning modellen om adressen te interpreteren.
Uitdagingen bij parsing
| Uitdaging | Voorbeeld | Oplossing |
|---|---|---|
| Afkortingen | str. i.p.v. straat | Afkortingenwoordenboek |
| Typfouten | Amstterdam | Fuzzy matching |
| Ontbrekende info | Damrak Amsterdam | Context inference |
| Meerdere formaten | 1012NX vs 1012 NX | Normalisatie regels |
Stap 2: Normalisatie
Na parsing worden alle componenten genormaliseerd naar een standaard formaat:
const normalize = (parsed) => {return {// Straat: lowercase, verwijder "straat"/"laan" variatiesstreet: parsed.street.toLowerCase().replace(/str\.?$/i, 'straat').replace(/ln\.?$/i, 'laan'),// Postcode: geen spaties, uppercasepostcode: parsed.postcode.replace(/\s/g, '').toUpperCase(),// Stad: hoofdletter, verwijder "gemeente"city: parsed.city.replace(/^gemeente\s*/i, '').toLowerCase().replace(/^\w/, c => c.toUpperCase())};};
Stap 3: Database Matching
De genormaliseerde componenten worden vergeleken met een adressendatabase. In Nederland is dit vaak de BAG (Basisregistratie Adressen en Gebouwen).
Matching strategieën
- Exacte match - Alle componenten komen exact overeen
- Fuzzy match - Kleine verschillen worden getolereerd (Levenshtein distance)
- Partial match - Sommige componenten matchen, andere ontbreken
- Phonetic match - Klanken worden vergeleken (Soundex/Metaphone)

const levenshteinDistance = (str1, str2) => {const matrix = [];for (let i = 0; i <= str1.length; i++) {matrix[i] = [i];}for (let j = 0; j <= str2.length; j++) {matrix[0][j] = j;}for (let i = 1; i <= str1.length; i++) {for (let j = 1; j <= str2.length; j++) {if (str1[i-1] === str2[j-1]) {matrix[i][j] = matrix[i-1][j-1];} else {matrix[i][j] = Math.min(matrix[i-1][j-1] + 1, // substitutionmatrix[i][j-1] + 1, // insertionmatrix[i-1][j] + 1 // deletion);}}}return matrix[str1.length][str2.length];};// "Amstterdam" vs "Amsterdam" = distance 1const distance = levenshteinDistance('amstterdam', 'amsterdam');const similarity = 1 - (distance / Math.max('amstterdam'.length, 'amsterdam'.length));// similarity = 0.9 (90% match)
Stap 4: Confidence Scoring
Elke potentiële match krijgt een confidence score. Deze score is gebaseerd op meerdere factoren:
| Factor | Gewicht | Toelichting |
|---|---|---|
| Postcode match | 40% | Exact matchen van postcode is kritiek |
| Straatnaam match | 25% | Fuzzy matching met normalisatie |
| Huisnummer match | 20% | Inclusief toevoegingen |
| Stad match | 10% | Vaak redundant bij postcode match |
| Data kwaliteit | 5% | Hoe recent is de bron? |
const calculateConfidence = (input, candidate) => {let score = 0;// Postcode (40%)if (input.postcode === candidate.postcode) {score += 0.4;}// Straatnaam (25%)const streetSimilarity = calculateSimilarity(input.street,candidate.street);score += streetSimilarity * 0.25;// Huisnummer (20%)if (input.house_number === candidate.house_number) {score += 0.15;if (input.addition === candidate.addition) {score += 0.05;}}// Stad (10%)if (normalizeCity(input.city) === normalizeCity(candidate.city)) {score += 0.1;}// Data kwaliteit bonus (5%)if (candidate.source === 'BAG' && candidate.updated_recently) {score += 0.05;}return score;};
Stap 5: Coördinaat Bepaling
De beste match(es) leveren coördinaten. Hoe specifiek deze zijn hangt af van de match kwaliteit:
- Huisnummer niveau - Exacte locatie van het gebouw (meest nauwkeurig)
- Straat niveau - Centrum van de straat
- Postcode niveau - Centrum van het postcode gebied
- Stad niveau - Centrum van de stad (minst nauwkeurig)
Match type in response
GeoRex geeft altijd het match niveau terug in de response. Gebruik dit om te bepalen of de nauwkeurigheid voldoende is voor jouw use case.
Performance optimalisaties
Om geocoding snel te houden worden diverse optimalisaties toegepast:
- Spatial indexing - R-trees voor snelle geografische lookups
- In-memory caching - Veelvoorkomende adressen worden gecached
- Prefix trees (Tries) - Voor snel matchen van straatnamen
- Bloom filters - Snel uitsluiten van non-matches
- Sharding - Database verdeeld over regio's
Samenvatting
Geocoding is een complex proces dat parsing, normalisatie, fuzzy matching, scoring en ruimtelijke lookups combineert. Het resultaat - coördinaten binnen milliseconden - is het product van jarenlange optimalisatie en data engineering. Begrijpen hoe het werkt helpt je betere beslissingen te maken over hoe je geocoding in je applicatie implementeert.
Gerelateerde artikelen

Geocoding vs Reverse Geocoding: Wat is het verschil?
Ontdek het verschil tussen geocoding en reverse geocoding, wanneer je welke methode gebruikt, en hoe je beide implementeert met praktische voorbeelden.
Lees meer
Van adres naar coördinaten: een complete handleiding
Een uitgebreide stap-voor-stap handleiding voor het converteren van Nederlandse adressen naar GPS-coördinaten, inclusief edge cases en validatie.
Lees meer
Nauwkeurigheid in geocoding: wat betekent het echt?
Wat betekent een confidence score van 0.95? Leer over precisieniveaus, wanneer resultaten betrouwbaar zijn, en hoe je kwaliteit meet.
Lees meer