Google heeft zijn Maps Platform de afgelopen jaren steeds verder aangescherpt, maar de deprecation-golf van mei 2026 is de meest ingrijpende tot nu toe. Vier veelgebruikte features worden verwijderd uit de Maps JavaScript API: de Heatmap Layer, de Drawing Library, DirectionsService en DistanceMatrixService. Als je applicatie daarvan afhankelijk is, heb je nog een paar weken om te migreren voordat je code stopt met werken.
Dit is geen zachte deprecation waarbij oude endpoints jarenlang blijven draaien. Google heeft harde verwijderdatums vastgesteld, en de developer console geeft al waarschuwingen. Deze guide behandelt precies wat er verandert, waarom Google dit doet, en hoe je elke service migreert met werkende codevoorbeelden. Heb je een drop-in replacement nodig, dan laten we zien hoe MapAtlas APIs overeenkomen met elke deprecated Google service.
Wat wordt deprecated en wanneer
De complete tijdlijn van getroffen services:
| Service | Deprecated | Verwijderdatum | Vervanging (Google) |
|---|---|---|---|
| Heatmap Layer (Maps JS API) | Augustus 2025 | Mei 2026 | Maps Datasets API + deck.gl |
| Drawing Library (Maps JS API) | Mei 2025 | Mei 2026 | Extended Component Library |
| DirectionsService (Maps JS API) | 25 februari 2026 | Mei 2026 | Routes API (REST) |
| DistanceMatrixService (Maps JS API) | 25 februari 2026 | Mei 2026 | Routes API (REST) |
Het cruciale detail: Google verwijdert routing en afstandsberekeningen niet helemaal. Het verwijdert de JavaScript client-side classes die developers al meer dan een decennium gebruiken en forceert migratie naar de nieuwere Routes API, een server-side REST endpoint. Dit is geen eenvoudige versie-update. Het is een architectuurwijziging die routing-logica van de browser naar je backend verplaatst.
Wat er breekt
Als je codebase een van de volgende bevat, faalt het na de verwijderdatum:
// All of these will stop working in May 2026
const directionsService = new google.maps.DirectionsService();
const distanceMatrixService = new google.maps.DistanceMatrixService();
const heatmap = new google.maps.visualization.HeatmapLayer({ data: points });
const drawingManager = new google.maps.drawing.DrawingManager();
Na verwijdering gooien deze constructors errors. Geen fallback, geen graceful degradation. De map laadt gewoon, maar elke feature die op deze classes leunt, breekt volledig.
Waarom Google dit afdwingt
De officiële reden van Google is performance en modernisering. De Routes API, de vervanging voor DirectionsService en DistanceMatrixService, ondersteunt nieuwere features zoals milieuvriendelijke routing, routing voor tweewielers en tolkostenscatting die de legacy JavaScript classes niet aankunnen.
De echte driver is prijsbeheersing. Door routing naar een server-side REST API te verplaatsen krijgt Google fijnmaziger billing en gebruiksregistratie. De JavaScript DirectionsService stond client-side batching patterns toe die Google moeilijker precies kon meten. De Routes API zorgt dat elke request door een gemeten endpoint gaat.
Voor Heatmap Layer en Drawing Library duwt Google developers richting de Extended Component Library en third-party visualisatietools zoals deck.gl. Dit past in een breder patroon: Google houdt de core map tile rendering in eigen hand en geeft de rest uit aan het ecosysteem.
De praktische impact voor developers: meer backend-infrastructuur, meer API keys te beheren, en in de meeste gevallen hogere kosten per request op de nieuwe prijsniveaus.
Migratie-checklist
Doorloop deze checklist voordat je migratecode schrijft:
1. Audit je codebase
Zoek in je codebase naar verwijzingen naar de deprecated classes:
# Find all files using deprecated Google Maps services
grep -rn "DirectionsService\|DistanceMatrixService\|HeatmapLayer\|visualization.HeatmapLayer\|drawing.DrawingManager\|DrawingManager" \
--include="*.js" --include="*.ts" --include="*.tsx" --include="*.jsx" src/
Documenteer elk bestand en component dat deze services gebruikt. Noteer of de calls client-side (browser) plaatsvinden of in een server-rendered context, zoals Next.js API routes.
2. Identificeer je gebruikspatronen
Documenteer per gebruik:
- Gebruikte travel modes (driving, walking, cycling, transit)
- Waypoint-ondersteuning (simpel A-naar-B of multi-stop routes)
- Geconsumeerde response-velden (afstand, duur, polyline, stappen, tarief)
- Volume (requests per dag/maand, voor kostenschatting)
- Latency-vereisten (real-time voor eindgebruikers of batch-verwerking)
3. Kies je migratiedoel
Je hebt twee opties:
Optie A: Bij Google blijven. Migreren van de deprecated JavaScript classes naar de nieuwe Google Routes API (REST). Dit vereist backend-wijzigingen, nieuwe API key-rechten en bijgewerkte billing.
Optie B: Van provider wisselen. Migreren naar een third-party routing API. Dit is het juiste moment om alternatieven te evalueren, want je herschrijft de integratiecode toch al.
4. Zet een parallelle omgeving op
Migreer nooit in-place. Draai de oude en nieuwe implementatie minimaal twee weken parallel, vergelijk resultaten op nauwkeurigheid en latency voordat je overzet.
5. Update je foutafhandeling
De deprecated services retourneerden errors via callback functions. REST API-vervangingen retourneren HTTP-statuscodes. Je foutafhandelingslogica moet dienovereenkomstig worden aangepast.
API-voor-API vervanggids
DirectionsService naar MapAtlas Directions API
Voor (Google, deprecated):
const directionsService = new google.maps.DirectionsService();
directionsService.route(
{
origin: { lat: 52.52, lng: 13.405 },
destination: { lat: 48.8566, lng: 2.3522 },
travelMode: google.maps.TravelMode.DRIVING,
waypoints: [
{ location: { lat: 50.9375, lng: 6.9603 }, stopover: true }
],
},
(result, status) => {
if (status === "OK") {
const route = result.routes[0];
console.log("Distance:", route.legs[0].distance.text);
console.log("Duration:", route.legs[0].duration.text);
}
}
);
Na (MapAtlas Directions API):
const response = await fetch(
"https://api.mapatlas.com/v1/directions?" +
new URLSearchParams({
origin: "52.52,13.405",
destination: "48.8566,2.3522",
waypoints: "50.9375,6.9603",
mode: "driving",
key: process.env.MAPATLAS_API_KEY!,
})
);
const data = await response.json();
if (data.status === "OK") {
const leg = data.routes[0].legs[0];
console.log("Distance:", leg.distance.text);
console.log("Duration:", leg.duration.text);
// Polyline for map rendering
const polyline = data.routes[0].overview_polyline;
}
Belangrijkste verschillen:
- REST endpoint in plaats van een JavaScript class. Calls gaan van je backend, niet de browser.
- Eenvoudigere authenticatie. Één API key in de query string of header.
- Zelfde response-structuur. Routes, legs, distance, duration en polyline zijn allemaal aanwezig.
DistanceMatrixService naar MapAtlas Matrix API
Voor (Google, deprecated):
const service = new google.maps.DistanceMatrixService();
service.getDistanceMatrix(
{
origins: [
{ lat: 52.52, lng: 13.405 },
{ lat: 48.1351, lng: 11.582 },
],
destinations: [
{ lat: 48.8566, lng: 2.3522 },
{ lat: 51.5074, lng: -0.1278 },
],
travelMode: google.maps.TravelMode.DRIVING,
},
(response, status) => {
if (status === "OK") {
response.rows.forEach((row, i) => {
row.elements.forEach((element, j) => {
console.log(`Origin ${i} -> Dest ${j}:`,
element.distance.text, element.duration.text);
});
});
}
}
);
Na (MapAtlas Matrix API):
const response = await fetch("https://api.mapatlas.com/v1/matrix", {
method: "POST",
headers: {
"Content-Type": "application/json",
Authorization: `Bearer ${process.env.MAPATLAS_API_KEY}`,
},
body: JSON.stringify({
origins: [
{ lat: 52.52, lng: 13.405 },
{ lat: 48.1351, lng: 11.582 },
],
destinations: [
{ lat: 48.8566, lng: 2.3522 },
{ lat: 51.5074, lng: -0.1278 },
],
mode: "driving",
}),
});
const data = await response.json();
data.rows.forEach((row: any, i: number) => {
row.elements.forEach((element: any, j: number) => {
console.log(`Origin ${i} -> Dest ${j}:`,
element.distance.text, element.duration.text);
});
});
De response-structuur is vrijwel identiek. De hoofdwijziging is de stap van een callback-gebaseerde browser-API naar een promise-gebaseerde server-API.
Heatmap Layer vervangen
Voor heatmap-visualisatie hangt het migratiepad af van je vereisten:
Optie 1: MapLibre GL JS met een heatmap layer (open source)
import maplibregl from "maplibre-gl";
const map = new maplibregl.Map({
container: "map",
style: "https://api.mapatlas.com/v1/styles/streets?key=YOUR_KEY",
center: [13.405, 52.52],
zoom: 10,
});
map.on("load", () => {
map.addSource("heat-data", {
type: "geojson",
data: {
type: "FeatureCollection",
features: heatmapPoints.map((point) => ({
type: "Feature",
geometry: { type: "Point", coordinates: [point.lng, point.lat] },
properties: { weight: point.weight },
})),
},
});
map.addLayer({
id: "heatmap-layer",
type: "heatmap",
source: "heat-data",
paint: {
"heatmap-weight": ["get", "weight"],
"heatmap-intensity": 1,
"heatmap-radius": 20,
"heatmap-opacity": 0.7,
},
});
});
Dit geeft je volledige controle over de heatmap-rendering en is niet afhankelijk van Google's tile servers.
Optie 2: deck.gl HeatmapLayer (Google's eigen aanbeveling)
import { Deck } from "@deck.gl/core";
import { HeatmapLayer } from "@deck.gl/aggregation-layers";
const heatmapLayer = new HeatmapLayer({
data: heatmapPoints,
getPosition: (d) => [d.lng, d.lat],
getWeight: (d) => d.weight,
radiusPixels: 30,
});
Beide opties werken. MapLibre GL JS integreert clean met MapAtlas tile styles, terwijl deck.gl over elke basemap heen gelegd kan worden.
Kostenvergelijking: Google Routes API vs. MapAtlas
Migreren naar Google's eigen Routes API is niet alleen een codewijziging. Het brengt nieuwe prijzen mee:
| Service | Google (legacy, per 1.000) | Google Routes API (per 1.000) | MapAtlas (per 1.000) |
|---|---|---|---|
| Directions (basic) | $5,00 | $5,00 | $1,50 |
| Directions (advanced, waypoints/verkeer) | $10,00 | $10,00 | $2,50 |
| Distance Matrix (per element) | $5,00 | $5,00 | $1,00 |
| Distance Matrix (advanced) | $10,00 | $10,00 | $2,00 |
| Geocoding | $5,00 | $5,00 | $1,50 |
Bij 100.000 routing-requests per maand:
- Google Routes API: ~$500-$1.000 (afhankelijk van gebruikte features)
- MapAtlas Directions API: ~$150-$250
De besparing loopt snel op voor applicaties die routing combineren met geocoding en afstandsberekeningen. Een logistiek platform dat 500.000 matrix-elementen per maand verwerkt, betaalt bij Google ruwweg $2.500 tegenover $500 bij MapAtlas.
Zie MapAtlas-prijzen voor alle details.
Code-migratievoorbeelden: volledig voor/na
Een volledig migratievoorbeeld voor een React-component die rijroutes op een kaart toont.
Voor: Google Maps DirectionsService in React
import { useEffect, useRef } from "react";
function DirectionsMap({ origin, destination }: {
origin: google.maps.LatLngLiteral;
destination: google.maps.LatLngLiteral;
}) {
const mapRef = useRef<HTMLDivElement>(null);
useEffect(() => {
const map = new google.maps.Map(mapRef.current!, {
center: origin,
zoom: 7,
});
const directionsRenderer = new google.maps.DirectionsRenderer();
directionsRenderer.setMap(map);
const directionsService = new google.maps.DirectionsService();
directionsService.route(
{
origin,
destination,
travelMode: google.maps.TravelMode.DRIVING,
},
(result, status) => {
if (status === "OK" && result) {
directionsRenderer.setDirections(result);
}
}
);
}, [origin, destination]);
return <div ref={mapRef} style={{ width: "100%", height: "400px" }} />;
}
Na: MapAtlas Directions API met MapLibre GL JS
import { useEffect, useRef } from "react";
import maplibregl from "maplibre-gl";
function DirectionsMap({ origin, destination }: {
origin: { lat: number; lng: number };
destination: { lat: number; lng: number };
}) {
const mapRef = useRef<HTMLDivElement>(null);
useEffect(() => {
const map = new maplibregl.Map({
container: mapRef.current!,
style: "https://api.mapatlas.com/v1/styles/streets?key=YOUR_KEY",
center: [origin.lng, origin.lat],
zoom: 7,
});
map.on("load", async () => {
// Fetch directions from your backend (or directly if CORS allows)
const res = await fetch(
`/api/directions?` +
new URLSearchParams({
origin: `${origin.lat},${origin.lng}`,
destination: `${destination.lat},${destination.lng}`,
mode: "driving",
})
);
const data = await res.json();
if (data.routes?.[0]) {
const coordinates = data.routes[0].geometry.coordinates;
map.addSource("route", {
type: "geojson",
data: {
type: "Feature",
geometry: { type: "LineString", coordinates },
properties: {},
},
});
map.addLayer({
id: "route-line",
type: "line",
source: "route",
paint: {
"line-color": "#4A90D9",
"line-width": 5,
},
});
// Fit map to route bounds
const bounds = coordinates.reduce(
(b: maplibregl.LngLatBounds, coord: [number, number]) =>
b.extend(coord),
new maplibregl.LngLatBounds(coordinates[0], coordinates[0])
);
map.fitBounds(bounds, { padding: 50 });
}
});
return () => map.remove();
}, [origin, destination]);
return <div ref={mapRef} style={{ width: "100%", height: "400px" }} />;
}
Backend API Route (Next.js)
// app/api/directions/route.ts
import { NextRequest, NextResponse } from "next/server";
export async function GET(request: NextRequest) {
const { searchParams } = new URL(request.url);
const origin = searchParams.get("origin");
const destination = searchParams.get("destination");
const mode = searchParams.get("mode") || "driving";
const response = await fetch(
`https://api.mapatlas.com/v1/directions?` +
new URLSearchParams({
origin: origin!,
destination: destination!,
mode,
key: process.env.MAPATLAS_API_KEY!,
})
);
const data = await response.json();
return NextResponse.json(data);
}
Dit pattern houdt je API key op de server en exposeert alleen de route-geometrie aan de client.
Je migratie testen voor de deadline
Stap 1: Draai beide APIs parallel
Twee weken voor de cutover: roep voor elk request zowel de oude Google service als de nieuwe vervanging aan. Log beide responses en vergelijk:
async function getDirectionsWithComparison(
origin: string,
destination: string
) {
const [googleResult, mapatResult] = await Promise.all([
fetchGoogleDirections(origin, destination),
fetchMapAtlasDirections(origin, destination),
]);
// Compare key metrics
const distanceDelta = Math.abs(
googleResult.distance - mapatResult.distance
);
const durationDelta = Math.abs(
googleResult.duration - mapatResult.duration
);
console.log({
route: `${origin} -> ${destination}`,
googleDistance: googleResult.distance,
mapatDistance: mapatResult.distance,
distanceDeltaPercent: ((distanceDelta / googleResult.distance) * 100).toFixed(1),
googleDuration: googleResult.duration,
mapatDuration: mapatResult.duration,
durationDeltaPercent: ((durationDelta / googleResult.duration) * 100).toFixed(1),
});
// Use MapAtlas result in production, Google as validation
return mapatResult;
}
Stap 2: Zet feature flags op
Gebruik een feature flag om te bepalen welke API je applicatie aanroept. Zo kun je direct terugdraaien als er problemen zijn:
const useMapAtlasDirections = process.env.FEATURE_MAPATLAS_DIRECTIONS === "true";
const directions = useMapAtlasDirections
? await fetchMapAtlasDirections(origin, destination)
: await fetchGoogleDirections(origin, destination);
Stap 3: Monitor foutpercentages
Na de switch, monitor op:
- HTTP 4xx/5xx-foutpercentages van de nieuwe API
- Latency-stijgingen (nieuwe provider kan andere responstijden hebben)
- Ontbrekende velden in responses waarvan je UI afhankelijk is
- Route-nauwkeurigheid voor edge cases (veerpont, tolwegen, beperkte zones)
Stap 4: Load test voor go-live
Als je applicatie pieken verwerkt, zoals een logistiek platform tijdens ochtendplanning, load test de nieuwe API op 2x je piekvol. MapAtlas biedt een sandbox-omgeving voor load testing zonder productie-billing.
Tijdlijn: wat je deze week moet doen
Nog niet begonnen? Dit is de prioriteitsvolgorde:
- Deze week: Audit je codebase. Identificeer elk gebruik van de vier deprecated services.
- Week 2: Maak een MapAtlas-account aan en haal API keys op. Het gratis tier dekt 10.000 requests voor testen.
- Week 3: Implementeer de vervanging voor je meest kritieke service, meestal DirectionsService.
- Week 4: Migreer overige services en voer parallelle testen uit.
- Voor de mei-deadline: Zet om, verwijder Google API-afhankelijkheden, update billing.
Migreren is geen keuze. Na mei 2026 worden de deprecated classes verwijderd uit de Maps JavaScript API en gooit elke code die ze aanroept runtime errors. Begin nu en je hebt tijd om goed te testen. Wacht tot de laatste week en je zit production te patchen onder druk.
Voor migratieondersteuning biedt MapAtlas directe developer-assistentie. Neem contact op via de contactpagina of begin met de API-documentatie om de vervangende APIs te evalueren.
Veelgestelde vragen
Wanneer gaan de Google Maps API deprecations precies in?
De Heatmap Layer en Drawing Library zijn respectievelijk in augustus en mei 2025 deprecated, met verwijdering gepland voor mei 2026. DirectionsService en DistanceMatrixService werden op 25 februari 2026 deprecated, ook met verwijdering in mei 2026. Na verwijdering geven API-calls naar deze services errors terug.
Werkt mijn bestaande Google Maps JavaScript API key nog na mei 2026?
Je API key blijft werken voor services die niet deprecated zijn. Maar alle code die DirectionsService, DistanceMatrixService, de Heatmap Layer of de Drawing Library aanroept via de Maps JavaScript API zal breken. Je moet die specifieke calls vóór de deadline migreren naar vervangende APIs.
Wat is het goedkoopste alternatief voor de Google Maps Directions API?
MapAtlas biedt een Directions API aan voor ongeveer 70% minder dan het Google-equivalent. Het gratis tier bevat 10.000 requests per maand, genoeg om je migratie te ontwikkelen en te testen. Andere alternatieven zijn Mapbox, HERE en OpenRouteService, maar MapAtlas heeft het request/response-formaat dat het dichtst bij Google zit, wat de migratie-inspanning vermindert.
Kan ik incrementeel migreren of moet ik alles tegelijk overzetten?
Incrementeel migreren kan prima. Elke deprecated service staat op zichzelf, dus je kunt eerst DirectionsService vervangen, dan DistanceMatrixService, dan de visualisatiebibliotheken. Dat is eigenlijk de aanbevolen aanpak, want zo kun je elke vervanging geïsoleerd testen voordat je verder gaat.
Ondersteunt MapAtlas dezelfde waypoints en travel modes als Google DirectionsService?
Ja. De MapAtlas Directions API ondersteunt driving, walking en cycling, plus tussenliggende waypoints. Het request-formaat is iets anders (RESTful endpoint vs. JavaScript class), maar de kernfunctionaliteit, multi-stop routing met keuze van travel mode, is equivalent.

