Hoe werkt geocoding onder de motorkap?
Terug naar blog
💡 Concepten

Hoe werkt geocoding onder de motorkap?

GeoRex Team5 december 202510 min leestijd

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.

Geocoding proces flow diagram met 5 stappen: parsing, normalisatie, matching, scoring en coördinaat lookup
Het complete geocoding proces in 5 stappen

Het geocoding proces in 5 stappen

Elke geocoding request doorloopt de volgende stappen:

  1. Parsing - Het adres wordt opgesplitst in componenten
  2. Normalisatie - Variaties worden gestandaardiseerd
  3. Matching - Componenten worden vergeleken met de database
  4. Scoring - Matches krijgen een betrouwbaarheidsscore
  5. 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:

input
"Kalverstraat 1A, 1012 NX Amsterdam"

De parser moet herkennen:

parsed
{
"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

UitdagingVoorbeeldOplossing
Afkortingenstr. i.p.v. straatAfkortingenwoordenboek
TypfoutenAmstterdamFuzzy matching
Ontbrekende infoDamrak AmsterdamContext inference
Meerdere formaten1012NX vs 1012 NXNormalisatie regels

Stap 2: Normalisatie

Na parsing worden alle componenten genormaliseerd naar een standaard formaat:

normalization.js
const normalize = (parsed) => {
return {
// Straat: lowercase, verwijder "straat"/"laan" variaties
street: parsed.street
.toLowerCase()
.replace(/str\.?$/i, 'straat')
.replace(/ln\.?$/i, 'laan'),
// Postcode: geen spaties, uppercase
postcode: 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)
Visualisatie van fuzzy string matching met confidence scores
Fuzzy matching vergelijkt strings en berekent een similarity score
fuzzy-match.js
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, // substitution
matrix[i][j-1] + 1, // insertion
matrix[i-1][j] + 1 // deletion
);
}
}
}
return matrix[str1.length][str2.length];
};
// "Amstterdam" vs "Amsterdam" = distance 1
const 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:

FactorGewichtToelichting
Postcode match40%Exact matchen van postcode is kritiek
Straatnaam match25%Fuzzy matching met normalisatie
Huisnummer match20%Inclusief toevoegingen
Stad match10%Vaak redundant bij postcode match
Data kwaliteit5%Hoe recent is de bron?
scoring.js
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.

geocodingtechnischalgoritmesconcepten
Delen:

Gerelateerde artikelen

Klaar om te beginnen met GeoRex?

Probeer onze geocoding API gratis en ontdek hoe eenvoudig adresverwerking kan zijn.

Cookie-instellingen

Wij gebruiken optionele analytische cookies om onze website te verbeteren. Deze cookies worden alleen geplaatst met uw expliciete toestemming. Meer informatie