Google hat in den letzten achtzehn Monaten vier viel genutzte Teile der Maps JavaScript API abgekündigt. Zwei davon, der Heatmap Layer und die Drawing Library, sind seit Mai 2026 nicht mehr verfügbar. Die anderen beiden, DirectionsService und DistanceMatrixService, sind Legacy und abgekündigt, funktionieren aber weiterhin und haben kein Abschaltdatum.
Dieser Leitfaden zeigt den aktuellen Status jedes Dienstes mit Links zu Googles eigenen Seiten und erklärt, wie Sie sie ersetzen. Wo der Ersatz von MapAtlas kommt, nutzt der Code unsere echten Endpunkte und Antwortformate.
Was abgekündigt ist und was noch funktioniert
| Dienst | Status | Wichtige Daten | Ersatz von Google |
|---|---|---|---|
| Heatmap Layer | Entfernt | Abgekündigt am 27. Mai 2025, stillgelegt in Release 3.65.1c (20. Mai 2026) | Drittanbieter-Bibliotheken wie deck.gl |
| Drawing Library (DrawingManager) | Entfernt | Abgekündigt im August 2025, nicht verfügbar seit Mai 2026 (bestätigt in Release 3.65.3b, 4. Juni 2026) | Drittanbieter-Bibliotheken wie Terra Draw |
| DirectionsService | Legacy, abgekündigt | Legacy seit 1. März 2025, abgekündigt zum 25. Februar 2026 (Release 3.64.2b), kein Abschaltdatum | Klasse Route in der Routes-Bibliothek |
| DistanceMatrixService | Legacy, abgekündigt | Legacy seit 1. März 2025, abgekündigt zum 25. Februar 2026 (Release 3.64.2b), kein Abschaltdatum | Klasse RouteMatrix in der Routes-Bibliothek |
Quellen: Google Maps Platform Deprecations, die Release Notes der Maps JavaScript API und die Seite zu Legacy-Produkten.
Legacy hat eine feste Bedeutung. Laut Google ist ein Legacy-Dienst funktional eingefroren und lässt sich in neuen Cloud-Projekten nicht aktivieren, bleibt für bestehende Projekte aber unterstützt. Google sagt mindestens 12 Monate Vorlauf zu, bevor ein solcher Dienst stillgelegt wird, und die Release Note zur Abkündigung von DirectionsService und DistanceMatrixService sagt, dass keine Einstellung geplant ist und schwere Regressionen weiter behoben werden. Dieselbe Legacy-Umstellung am 1. März 2025 betraf auch die Webdienste Directions API und Distance Matrix API sowie die Places API und den JavaScript Places Service.
Was bricht
Dieser Code schlägt in aktuellen Versionen der Maps JavaScript API fehl:
// Removed in 2026: these constructors no longer work
const heatmap = new google.maps.visualization.HeatmapLayer({ data: points });
const drawingManager = new google.maps.drawing.DrawingManager();
Dieser Code läuft in bestehenden Projekten weiter, ist aber abgekündigt und funktioniert in einem neuen Cloud-Projekt nicht:
// Legacy and deprecated, no shutdown date yet
const directionsService = new google.maps.DirectionsService();
const distanceMatrixService = new google.maps.DistanceMatrixService();
Wenn eine Heatmap oder ein Zeichenwerkzeug auf Ihrer Website im Mai 2026 aufgehört hat zu funktionieren, liegt es daran. Beheben Sie das zuerst. Planen Sie danach die Routing-Migration, bevor Google ein Datum ankündigt.
Googles Ersatzlösungen
Für Routing bietet Google zwei Wege, und keiner zwingt Sie, Logik auf einen Server zu verlagern:
- Im Browser: die Routes-Bibliothek in der Maps JavaScript API. Die Klasse
Routeersetzt DirectionsService, und die KlasseRouteMatrixersetzt DistanceMatrixService. - Auf dem Server: die Routes API, ein REST-Dienst mit den Methoden Compute Routes und Compute Route Matrix.
Für Visualisierungen liefert Google keine eigene Lösung mehr. Die Heatmap-Seite verweist auf deck.gl, und die Abkündigungsseite nennt Terra Draw zum Zeichnen.
Migrations-Checkliste
1. Codebasis prüfen
Suchen Sie nach den betroffenen 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/
Halten Sie jede Datei und jede Komponente fest, die sie nutzt. Notieren Sie, ob der Aufruf im Browser oder auf einem Server läuft.
2. Nutzung pro Dienst dokumentieren
Notieren Sie für jede Verwendung:
- Verkehrsmittel (Auto, zu Fuß, Fahrrad, ÖPNV)
- Wegpunkte (einfach von A nach B oder Routen mit mehreren Stopps)
- Gelesene Antwortfelder (Distanz, Dauer, Polyline, Schritte, Fahrpreis)
- Volumen (Anfragen pro Tag und Monat, für die Kostenschätzung)
- Latenzanforderungen (Echtzeit für Nutzer oder Batch)
3. Ziel wählen
Option A: bei Google bleiben. Wechseln Sie zu den Klassen Route und RouteMatrix oder zur Routes API. Gleichen Sie die genutzten Felder mit den Migrationsleitfäden ab, denn die Antwortformate unterscheiden sich von den Legacy-Klassen.
Option B: Anbieter wechseln. Sie schreiben die Integration ohnehin neu. Vergleichen Sie Anbieter also anhand der Anforderungen aus Schritt 2.
4. Alt und Neu parallel betreiben
Migrieren Sie nicht direkt im Bestand. Betreiben Sie beide Implementierungen eine Zeit lang parallel und vergleichen Sie Distanz, Dauer und Latenz auf Ihren echten Routen, bevor Sie umstellen.
5. Fehlerbehandlung anpassen
Die Legacy-Klassen meldeten Fehler über einen Statuswert im Callback. REST-Ersatzlösungen liefern HTTP-Statuscodes und Fehlermeldungen im Body, Ihre Fehlerbehandlung muss sich also ändern.
Jeden Dienst durch MapAtlas ersetzen
Die Routing-Endpunkte von MapAtlas sind REST-Dienste auf gateway.mapmetrics-atlas.net und in der MapAtlas-API-Dokumentation beschrieben. Sie erwarten ein Token als Query-Parameter, rufen Sie sie also aus Ihrem Backend auf.
DirectionsService zur MapAtlas Directions API
Vorher (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);
}
}
);
Nachher (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);
Die wichtigsten Unterschiede:
- REST-Aufruf statt JavaScript-Klasse, ausgeführt aus Ihrem Backend.
- Wegpunkte sind die mittleren Einträge von
locations. - Anderes Antwortformat. Die Summen stehen in
trip.summary, und jeder Abschnitt hat eine kodierte Polyline inshape. Dekodieren Sie sie, bevor Sie die Route zeichnen (siehe das Backend-Beispiel weiter unten).
DistanceMatrixService zur MapAtlas Matrix API
Die MapAtlas Matrix API liefert Fahrzeit und Distanz für jedes Paar aus Start und Ziel in einem Aufruf. Unser Endpunkt begrenzt jedes Paar auf 400 km Routendistanz, deshalb nutzt das Beispiel Orte rund um Berlin.
Vorher (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);
});
});
}
}
);
Nachher (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");
});
});
Das Raster entspricht Googles rows und elements. Distanzen kommen als Zahlen in der angefragten Einheit zurück, Zeiten in Sekunden. Die Formatierung übernehmen Sie selbst.
Ersatz für den Heatmap Layer
Option 1: ein Heatmap-Layer 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,
},
});
});
Die Heatmap wird direkt in der Kartenbibliothek gerendert, ohne zusätzlichen Dienst.
Option 2: der HeatmapLayer von deck.gl, den Googles Dokumentation vorschlägt:
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 funktionieren. MapLibre GL JS liest MapAtlas-Styles direkt, und deck.gl lässt sich über jede Basiskarte legen.
Ersatz für die Drawing Library
Mit DrawingManager konnten Nutzer Marker, Linien, Kreise und Polygone auf die Karte zeichnen. Terra Draw, die Bibliothek, die Googles Abkündigungsseite nennt, bietet dieselben Modi und hat Adapter für mehrere Kartenbibliotheken, darunter Google Maps und MapLibre GL JS. Die Formen kommen als GeoJSON zurück, das Sie unverändert speichern oder an einen Geofencing- oder Isochronen-Dienst schicken können.
Kostenvergleich
Googles Listenpreise sind für die Legacy-Routing-SKUs und die Essentials-SKUs ihrer Nachfolger gleich. Alle Preise unten stammen von der Preisseite der Google Maps Platform und der MapAtlas-Preisseite, beide geprüft am 26. September 2026.
| Dienst | Google, frei pro Monat | Google, pro 1.000 danach (erste Stufe) | MapAtlas, frei pro Monat | MapAtlas, pro 1.000 danach (erste Stufe) |
|---|---|---|---|---|
| Directions (Legacy) oder Compute Routes Essentials | 10.000 | 5,00 $ | 100.000 Navigationsanfragen | 1,53 € |
| Directions Advanced (Legacy) oder Compute Routes Pro | 5.000 | 10,00 $ | Gleiche Navigationsstufe | 1,53 € |
| Distance Matrix (Legacy) oder Compute Route Matrix Essentials | 10.000 Elemente | 5,00 $ | Siehe Preisseite | Siehe Preisseite |
| Geocoding | 10.000 | 5,00 $ | 25.000 | 3,90 € |
Google rechnet in US-Dollar ab, MapAtlas in Euro, rechnen Sie also vor dem Vergleich um. Beide senken die Preise bei höheren Volumen. Ein Rechenbeispiel mit 500.000 Routenanfragen pro Monat:
- Google Compute Routes Essentials: 10.000 frei, 90.000 zu 5,00 $ und 400.000 zu 4,00 $, also 2.050 $.
- MapAtlas-Navigation: 100.000 frei und 400.000 zu 1,53 €, also rund 610 €.
Vollständiges Beispiel: Backend-Route und Karte
Dieses Muster hält Ihren API-Schlüssel auf dem Server und schickt nur die Routengeometrie an den 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,
});
}
Kartenkomponente (React und 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" }} />;
}
So testen Sie die Migration
Schritt 1: beide Implementierungen vergleichen
Rufen Sie für einen Testzeitraum den alten und den neuen Dienst mit denselben Anfragen auf. Protokollieren Sie Distanz und Dauer beider Antworten und prüfen Sie die Unterschiede auf Ihren echten Routen, besonders bei Fähren, Mautstrecken und gesperrten Straßen.
Schritt 2: Feature-Flag nutzen
Legen Sie den Anbieter hinter ein Flag, damit Sie ohne Deployment zurückschalten können:
const useMapAtlasDirections = process.env.FEATURE_MAPATLAS_DIRECTIONS === "true";
const directions = useMapAtlasDirections
? await fetchMapAtlasDirections(origin, destination)
: await fetchGoogleDirections(origin, destination);
Schritt 3: Fehlerquoten überwachen
Achten Sie nach der Umstellung auf:
- HTTP-4xx- und 5xx-Quoten der neuen API
- Latenzänderungen
- Fehlende Felder, die Ihre Oberfläche liest
- Routenunterschiede in Sonderfällen wie Fähren, Mautstraßen und Sperrgebieten
Schritt 4: Lasttest vor dem Go-live
Wenn Ihr Traffic Spitzen hat, etwa bei der morgendlichen Disposition einer Logistikplattform, testen Sie die neue API mit dem Doppelten Ihres Spitzenvolumens, bevor Sie sich darauf verlassen.
Was jetzt zu tun ist
- Wenn Sie noch den Heatmap Layer oder die Drawing Library laden: ersetzen Sie sie zuerst. Sie funktionieren in aktuellen Versionen der Maps JavaScript API nicht mehr.
- Routing-Code prüfen: Finden Sie jeden Aufruf von DirectionsService, DirectionsRenderer und DistanceMatrixService.
- Ersatz wählen: die Klassen
RouteundRouteMatrix, die Routes API oder einen anderen Anbieter. - Einen Dienst nach dem anderen migrieren, hinter einem Feature-Flag, und die Ergebnisse vor der Umstellung vergleichen.
- Googles Abkündigungsseite im Blick behalten, falls ein Abschaltdatum kommt. Google hat für Legacy-Dienste mindestens 12 Monate Vorlauf zugesagt.
Um die Routing-APIs von MapAtlas auszuprobieren, legen Sie ein kostenloses Konto an und lesen Sie die API-Dokumentation. Hilfe bei einer Migration erhalten Sie über die Kontaktseite.
Häufig gestellte Fragen
Ist die Google Maps Drawing Library noch verfügbar?
Nein. Google hat die Drawing Library einschließlich DrawingManager im August 2025 abgekündigt, und die Abkündigungsseite führt sie seit Mai 2026 als nicht mehr verfügbar. Die Release Notes der Maps JavaScript API zu Version 3.65.3b (4. Juni 2026) bestätigen, dass DrawingManager nicht mehr verfügbar ist. Google nennt Terra Draw als Alternative.
Ist der Heatmap Layer noch verfügbar?
Nein. Google hat den Heatmap Layer am 27. Mai 2025 abgekündigt, und Release 3.65.1c vom 20. Mai 2026 meldet ihn als stillgelegt. Google empfiehlt stattdessen Drittanbieter-Bibliotheken wie den HeatmapLayer von deck.gl.
Wann funktionieren DirectionsService und DistanceMatrixService nicht mehr?
Google hat kein Datum festgelegt. Beide haben seit dem 1. März 2025 Legacy-Status und sind seit dem 25. Februar 2026 abgekündigt. Laut Googles Release Notes ist keine Einstellung geplant, schwere Regressionen werden weiter behoben, und vor dem Ende des Supports gibt es mindestens 12 Monate Vorlauf. Legacy-Dienste stehen neuen Cloud-Projekten nicht zur Verfügung. Neue Projekte brauchen daher die Klassen Route und RouteMatrix oder einen anderen Anbieter.
Kann ich schrittweise migrieren oder muss alles auf einmal umgestellt werden?
Sie können einen Dienst nach dem anderen migrieren. Jede abgekündigte Klasse ist unabhängig. Ersetzen Sie zuerst die entfernte Drawing Library und den Heatmap Layer, weil sie bereits nicht mehr funktionieren, und dann DirectionsService und DistanceMatrixService nach Ihrem eigenen Zeitplan.
Unterstützt MapAtlas Wegpunkte und mehrere Verkehrsmittel?
Ja. Die MapAtlas Directions API nimmt eine geordnete Liste von Orten entgegen. Jeder Punkt zwischen dem ersten und dem letzten ist ein Wegpunkt. Unterstützt werden die Costing-Modelle auto, bicycle, pedestrian, bus, truck, taxi und motor_scooter. Es ist ein REST-Endpunkt, rufen Sie ihn also aus Ihrem Backend auf, damit der API-Schlüssel nicht im Client landet.

