Skip to main content
Google Maps DrawingManager en API-deprecaties: migratiegids 2026
Guides

Google Maps DrawingManager en API-deprecaties: migratiegids 2026

De Drawing Library en de Heatmap Layer zijn uit de Maps JavaScript API verdwenen. DirectionsService en DistanceMatrixService zijn Legacy en deprecated. Actuele status, data en vervangers.

Brent van der HeidenLaatste update 12 min read
#Google Maps API#API-migratie#DrawingManager#DirectionsService#routing#developergids

Google heeft in de afgelopen achttien maanden vier veelgebruikte onderdelen van de Maps JavaScript API deprecated verklaard. Twee daarvan, de Heatmap Layer en de Drawing Library, zijn sinds mei 2026 niet meer beschikbaar. De andere twee, DirectionsService en DistanceMatrixService, zijn Legacy en deprecated, maar werken nog en hebben geen einddatum.

Deze gids zet per dienst de actuele status op een rij, met links naar de pagina's van Google, en laat zien hoe je ze vervangt. Waar de vervanger van MapAtlas komt, gebruikt de code onze echte endpoints en responsformaten.

Wat deprecated is en wat nog werkt

DienstStatusBelangrijke dataVervanger van Google
Heatmap LayerVerwijderdDeprecated op 27 mei 2025, uitgefaseerd in release 3.65.1c (20 mei 2026)Bibliotheken van derden zoals deck.gl
Drawing Library (DrawingManager)VerwijderdDeprecated in augustus 2025, niet beschikbaar sinds mei 2026 (bevestigd in release 3.65.3b, 4 juni 2026)Bibliotheken van derden zoals Terra Draw
DirectionsServiceLegacy, deprecatedLegacy sinds 1 maart 2025, deprecated per 25 februari 2026 (release 3.64.2b), geen einddatumKlasse Route in de Routes-bibliotheek
DistanceMatrixServiceLegacy, deprecatedLegacy sinds 1 maart 2025, deprecated per 25 februari 2026 (release 3.64.2b), geen einddatumKlasse RouteMatrix in de Routes-bibliotheek

Bronnen: Google Maps Platform-deprecaties, de release notes van de Maps JavaScript API en de pagina over Legacy-producten.

Legacy heeft een vaste betekenis. Volgens Google krijgt een Legacy-dienst geen nieuwe functies en kun je hem niet inschakelen in nieuwe Cloud-projecten, maar bestaande projecten blijven ondersteund. Google belooft minstens 12 maanden vooraankondiging voordat zo'n dienst wordt uitgefaseerd, en de release note waarin DirectionsService en DistanceMatrixService deprecated werden, zegt dat stopzetting niet gepland is en dat ernstige regressies nog worden verholpen. Dezelfde overgang naar Legacy op 1 maart 2025 gold ook voor de webdiensten Directions API en Distance Matrix API, de Places API en de JavaScript Places Service.

Wat er stukgaat

Deze code faalt vandaag in de huidige versies van de Maps JavaScript API:

// Removed in 2026: these constructors no longer work
const heatmap = new google.maps.visualization.HeatmapLayer({ data: points });
const drawingManager = new google.maps.drawing.DrawingManager();

Deze code werkt nog in bestaande projecten, maar is deprecated en werkt niet in een nieuw Cloud-project:

// Legacy and deprecated, no shutdown date yet
const directionsService = new google.maps.DirectionsService();
const distanceMatrixService = new google.maps.DistanceMatrixService();

Werkt een heatmap of tekentool op je site sinds mei 2026 niet meer, dan is dit de oorzaak. Los dat eerst op. Plan daarna de routingmigratie, voordat Google een datum aankondigt.

De vervangers van Google

Voor routing biedt Google twee routes, en geen van beide dwingt je om logica naar een server te verplaatsen:

  • In de browser: de Routes-bibliotheek in de Maps JavaScript API. De klasse Route vervangt DirectionsService en de klasse RouteMatrix vervangt DistanceMatrixService.
  • Op een server: de Routes API, een REST-dienst met de methodes Compute Routes en Compute Route Matrix.

Voor visualisatie levert Google geen eigen optie meer. De heatmappagina verwijst naar deck.gl, en de deprecatiepagina noemt Terra Draw voor tekenen.

Migratiechecklist

1. Doorzoek je codebase

Zoek naar de betrokken klassen:

# Find all files using deprecated Google Maps services
grep -rn "DirectionsService\|DistanceMatrixService\|DirectionsRenderer\|HeatmapLayer\|DrawingManager" \
  --include="*.js" --include="*.ts" --include="*.tsx" --include="*.jsx" src/

Noteer elk bestand en elke component die ze gebruikt, en of de aanroep in de browser of op een server draait.

2. Leg per dienst vast hoe je hem gebruikt

Noteer per gebruik:

  • Vervoerswijzen (auto, lopen, fiets, ov)
  • Tussenpunten (simpel van A naar B, of routes met meerdere stops)
  • Responsvelden die je leest (afstand, duur, polyline, stappen, tarief)
  • Volume (requests per dag en per maand, voor de kostenschatting)
  • Latency-eisen (realtime voor gebruikers, of batch)

3. Kies een doel

Optie A: bij Google blijven. Stap over op de klassen Route en RouteMatrix of op de Routes API. Vergelijk de velden die je gebruikt met de migratiegidsen, want de responsformaten wijken af van de Legacy-klassen.

Optie B: van aanbieder wisselen. Je herschrijft de integratie toch al, dus vergelijk aanbieders op de eisen uit stap 2.

4. Draai oud en nieuw naast elkaar

Migreer niet in-place. Draai beide implementaties een tijd naast elkaar en vergelijk afstand, duur en latency op je echte routes voordat je overstapt.

5. Pas de foutafhandeling aan

De Legacy-klassen gaven fouten door via een statuswaarde in een callback. REST-vervangers geven HTTP-statuscodes en foutbodies terug, dus je foutafhandeling moet mee veranderen.

Elke dienst vervangen door MapAtlas

De routing-endpoints van MapAtlas zijn REST-diensten op gateway.mapmetrics-atlas.net, beschreven in de MapAtlas API-documentatie. Ze verwachten een token als queryparameter, dus roep ze aan vanuit je backend.

Van DirectionsService naar de MapAtlas Directions API

Voor (Google, Legacy):

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://gateway.mapmetrics-atlas.net/directions/?token=${process.env.MAPATLAS_API_KEY}`,
  {
    method: "POST",
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify({
      // Ordered stops: origin, waypoints, destination
      locations: [
        { lat: 52.52, lon: 13.405 },
        { lat: 50.9375, lon: 6.9603 },
        { lat: 48.8566, lon: 2.3522 },
      ],
      costing: "auto", // auto, bicycle, pedestrian, bus, truck, taxi, motor_scooter
      units: "kilometers",
    }),
  }
);

const { trip } = await response.json();
console.log("Distance (km):", trip.summary.length);
console.log("Duration (s):", trip.summary.time);
// Each leg carries its geometry as an encoded polyline (precision 6)
const shapes = trip.legs.map((leg) => leg.shape);

De belangrijkste verschillen:

  • REST-aanroep in plaats van een JavaScript-klasse, vanuit je backend.
  • Tussenpunten zijn de middelste items van locations.
  • Andere responsstructuur. De totalen staan in trip.summary en elk deel van de route heeft een gecodeerde polyline in shape. Decodeer die voordat je de route tekent (zie het backendvoorbeeld verderop).

Van DistanceMatrixService naar de MapAtlas Matrix API

De MapAtlas Matrix API geeft reistijd en afstand voor elk paar van vertrekpunt en bestemming in één aanroep. Ons endpoint beperkt elk paar tot 400 km routeafstand, daarom gebruikt het voorbeeld plaatsen rond Berlijn.

Voor (Google, Legacy):

const service = new google.maps.DistanceMatrixService();

service.getDistanceMatrix(
  {
    origins: [
      { lat: 52.52, lng: 13.405 },
      { lat: 52.3906, lng: 13.0645 },
    ],
    destinations: [
      { lat: 51.3397, lng: 12.3731 },
      { lat: 51.0504, lng: 13.7373 },
    ],
    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://gateway.mapmetrics-atlas.net/matrix/?token=${process.env.MAPATLAS_API_KEY}`,
  {
    method: "POST",
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify({
      sources: [
        { lat: 52.52, lon: 13.405 },
        { lat: 52.3906, lon: 13.0645 },
      ],
      targets: [
        { lat: 51.3397, lon: 12.3731 },
        { lat: 51.0504, lon: 13.7373 },
      ],
      costing: "auto",
      units: "kilometers",
    }),
  }
);

const data = await response.json();

// One row per source, one cell per target
data.sources_to_targets.forEach((row: any[], i: number) => {
  row.forEach((cell, j) => {
    console.log(`Origin ${i} -> Dest ${j}:`, cell.distance, "km", cell.time, "s");
  });
});

Het raster komt overeen met rows en elements bij Google. Afstanden komen terug als getallen in de eenheid die je vraagt en tijden in seconden, dus de opmaak doe je zelf.

De Heatmap Layer vervangen

Optie 1: een heatmaplaag in MapLibre GL JS (open source)

import maplibregl from "maplibre-gl";

const map = new maplibregl.Map({
  container: "map",
  style: "https://gateway.mapmetrics-atlas.net/styles/?fileName=YOUR_ACCOUNT_ID/mapstyle.json&token=YOUR_API_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,
    },
  });
});

De heatmap wordt in de kaartbibliotheek zelf gerenderd, zonder extra dienst.

Optie 2: de HeatmapLayer van deck.gl, die de documentatie van Google voorstelt:

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 werken. MapLibre GL JS leest MapAtlas-styles direct, en deck.gl legt zich over elke basiskaart.

De Drawing Library vervangen

Met DrawingManager konden gebruikers markers, lijnen, cirkels en polygonen op de kaart tekenen. Terra Draw, de bibliotheek die de deprecatiepagina van Google noemt, biedt dezelfde modi en heeft adapters voor verschillende kaartbibliotheken, waaronder Google Maps en MapLibre GL JS. De vormen komen terug als GeoJSON, dat je ongewijzigd kunt opslaan of naar een geofencing- of isochronendienst kunt sturen.

Kostenvergelijking

De lijstprijzen van Google zijn gelijk voor de Legacy-routing-SKU's en de Essentials-SKU's van hun vervangers. Alle prijzen hieronder komen van de prijspagina van Google Maps Platform en de prijspagina van MapAtlas, allebei gecontroleerd op 26 september 2026.

DienstGoogle, gratis per maandGoogle, per 1.000 daarna (eerste staffel)MapAtlas, gratis per maandMapAtlas, per 1.000 daarna (eerste staffel)
Directions (Legacy) of Compute Routes Essentials10.000$ 5,00100.000 navigatierequests€ 1,53
Directions Advanced (Legacy) of Compute Routes Pro5.000$ 10,00Zelfde navigatiestaffel€ 1,53
Distance Matrix (Legacy) of Compute Route Matrix Essentials10.000 elementen$ 5,00Zie de prijspaginaZie de prijspagina
Geocoding10.000$ 5,0025.000€ 3,90

Google rekent in Amerikaanse dollars af en MapAtlas in euro's, dus reken om voordat je vergelijkt. Beide hanteren lagere tarieven bij hogere volumes. Een rekenvoorbeeld met 500.000 routerequests per maand:

  • Google Compute Routes Essentials: 10.000 gratis, 90.000 tegen $ 5,00 en 400.000 tegen $ 4,00, samen $ 2.050.
  • MapAtlas-navigatie: 100.000 gratis en 400.000 tegen € 1,53, samen ongeveer € 610.

Volledig voorbeeld: backendroute en kaart

Dit patroon houdt je API-sleutel op de server en stuurt alleen de routegeometrie naar de browser.

Backend-API-route (Next.js)

// app/api/directions/route.ts
import { NextRequest, NextResponse } from "next/server";

// Decode an encoded polyline with precision 6 into [lon, lat] pairs
function decodePolyline6(str: string): [number, number][] {
  const coords: [number, number][] = [];
  let index = 0, lat = 0, lng = 0;
  while (index < str.length) {
    for (const axis of [0, 1]) {
      let result = 0, shift = 0, byte: number;
      do {
        byte = str.charCodeAt(index++) - 63;
        result |= (byte & 0x1f) << shift;
        shift += 5;
      } while (byte >= 0x20);
      const delta = result & 1 ? ~(result >> 1) : result >> 1;
      if (axis === 0) lat += delta; else lng += delta;
    }
    coords.push([lng / 1e6, lat / 1e6]);
  }
  return coords;
}

export async function GET(request: NextRequest) {
  const { searchParams } = new URL(request.url);
  const [oLat, oLon] = searchParams.get("origin")!.split(",").map(Number);
  const [dLat, dLon] = searchParams.get("destination")!.split(",").map(Number);

  const response = await fetch(
    `https://gateway.mapmetrics-atlas.net/directions/?token=${process.env.MAPATLAS_API_KEY}`,
    {
      method: "POST",
      headers: { "Content-Type": "application/json" },
      body: JSON.stringify({
        locations: [{ lat: oLat, lon: oLon }, { lat: dLat, lon: dLon }],
        costing: "auto",
        units: "kilometers",
      }),
    }
  );
  if (!response.ok) {
    return NextResponse.json({ error: "routing failed" }, { status: 502 });
  }

  const { trip } = await response.json();
  const coordinates = trip.legs.flatMap((leg: { shape: string }) => decodePolyline6(leg.shape));
  return NextResponse.json({
    coordinates,
    distanceKm: trip.summary.length,
    durationS: trip.summary.time,
  });
}

Kaartcomponent (React en 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://gateway.mapmetrics-atlas.net/styles/?fileName=YOUR_ACCOUNT_ID/mapstyle.json&token=YOUR_API_KEY",
      center: [origin.lng, origin.lat],
      zoom: 7,
    });

    map.on("load", async () => {
      const res = await fetch(
        "/api/directions?" +
          new URLSearchParams({
            origin: `${origin.lat},${origin.lng}`,
            destination: `${destination.lat},${destination.lng}`,
          })
      );
      if (!res.ok) return;
      const { coordinates } = await res.json();

      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 },
      });

      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" }} />;
}

Zo test je de migratie

Stap 1: vergelijk beide implementaties

Roep in een testperiode de oude en de nieuwe dienst aan met dezelfde requests. Log afstand en duur van beide en bekijk de verschillen op je echte routes, vooral bij veerponten, tolwegen en afgesloten wegen.

Stap 2: gebruik een feature flag

Zet de aanbieder achter een flag, zodat je zonder deploy terug kunt schakelen:

const useMapAtlasDirections = process.env.FEATURE_MAPATLAS_DIRECTIONS === "true";

const directions = useMapAtlasDirections
  ? await fetchMapAtlasDirections(origin, destination)
  : await fetchGoogleDirections(origin, destination);

Stap 3: monitor foutpercentages

Let na de overstap op:

  • HTTP 4xx- en 5xx-percentages van de nieuwe API
  • Veranderingen in latency
  • Ontbrekende velden die je UI leest
  • Routeverschillen bij randgevallen zoals veerponten, tolwegen en afgesloten gebieden

Stap 4: loadtest vóór de go-live

Heeft je verkeer pieken, bijvoorbeeld tijdens de ochtendplanning op een logistiek platform, loadtest de nieuwe API dan op twee keer je piekvolume voordat je erop vertrouwt.

Wat je nu doet

  1. Laad je nog de Heatmap Layer of de Drawing Library? Vervang die eerst. Ze werken niet meer in de huidige versies van de Maps JavaScript API.
  2. Doorzoek je routingcode: vind elke aanroep van DirectionsService, DirectionsRenderer en DistanceMatrixService.
  3. Kies de vervanger: de klassen Route en RouteMatrix, de Routes API of een andere aanbieder.
  4. Migreer één dienst tegelijk, achter een feature flag, en vergelijk de resultaten voordat je overstapt.
  5. Houd de deprecatiepagina van Google in de gaten voor een einddatum. Google heeft voor Legacy-diensten minstens 12 maanden vooraankondiging toegezegd.

Wil je de routing-API's van MapAtlas uitproberen, maak dan een gratis account aan en lees de API-documentatie. Hulp bij een migratie vraag je via de contactpagina.

Veelgestelde vragen

Is de Google Maps Drawing Library nog beschikbaar?

Nee. Google heeft de Drawing Library, inclusief DrawingManager, in augustus 2025 deprecated verklaard, en de deprecatiepagina meldt dat hij sinds mei 2026 niet meer beschikbaar is. De release notes van versie 3.65.3b van de Maps JavaScript API (4 juni 2026) bevestigen dat DrawingManager niet meer beschikbaar is. Google noemt Terra Draw als alternatief.

Is de Heatmap Layer nog beschikbaar?

Nee. Google heeft de Heatmap Layer op 27 mei 2025 deprecated verklaard, en release 3.65.1c van 20 mei 2026 meldt dat hij is uitgefaseerd. Google raadt in plaats daarvan bibliotheken van derden aan, zoals de HeatmapLayer van deck.gl.

Wanneer werken DirectionsService en DistanceMatrixService niet meer?

Google heeft geen datum vastgesteld. Beide hebben sinds 1 maart 2025 de Legacy-status en zijn sinds 25 februari 2026 deprecated. Volgens de release notes van Google is stopzetting niet gepland, krijgen ze nog fixes voor ernstige regressies en komt er minstens 12 maanden vooraankondiging voordat de ondersteuning stopt. Legacy-diensten zijn niet beschikbaar voor nieuwe Cloud-projecten, dus een nieuw project heeft de klassen Route en RouteMatrix of een andere aanbieder nodig.

Kan ik stap voor stap migreren of moet alles in één keer?

Je kunt één dienst tegelijk migreren. Elke deprecated klasse staat los van de andere. Vervang eerst de Drawing Library en de Heatmap Layer, want die werken al niet meer, en daarna DirectionsService en DistanceMatrixService in je eigen tempo.

Ondersteunt MapAtlas tussenpunten en meerdere vervoerswijzen?

Ja. De MapAtlas Directions API krijgt een geordende lijst locaties, dus elk punt tussen het eerste en het laatste is een tussenpunt. Hij ondersteunt de costing-modellen auto, bicycle, pedestrian, bus, truck, taxi en motor_scooter. Het is een REST-endpoint, dus roep hem aan vanuit je backend zodat de API-sleutel niet bij de client terechtkomt.

Was dit nuttig? Deel het.

Over de auteur

Brent van der Heiden

Geschreven door

Brent van der Heiden

Co-Founder & CEO at MapAtlas

Brent built MapAtlas out of a conviction that developers deserve location APIs with fair pricing and genuine end-user privacy. Before that he co-founded MapMetrics, a community mapping and navigation app. He writes about geospatial infrastructure, map data, AI search visibility, and how location data powers the products people rely on every day.

Alle artikelen bekijken →
Terug naar blog