Google sudah memperketat Maps Platform-nya selama bertahun-tahun, tapi gelombang deprecation Mei 2026 adalah yang paling disruptif sejauh ini. Empat fitur yang banyak digunakan akan dihapus dari Maps JavaScript API: Heatmap Layer, Drawing Library, DirectionsService, dan DistanceMatrixService. Kalau aplikasimu bergantung pada salah satunya, kamu punya beberapa minggu lagi untuk bermigrasi sebelum kode-mu berhenti bekerja.
Ini bukan deprecation lunak yang mana endpoint lama masih bertahan bertahun-tahun. Google sudah menetapkan tanggal penghapusan yang pasti, dan konsol developer sudah menampilkan peringatan. Panduan ini membahas secara tepat apa yang berubah, mengapa Google melakukan ini, dan bagaimana cara memigrasikan setiap layanan dengan contoh kode yang berfungsi. Kalau kamu butuh pengganti langsung, kami akan tunjukkan bagaimana MapAtlas API berkorespondensi dengan setiap layanan Google yang deprecated.
Apa yang Deprecated dan Kapan
Berikut timeline lengkap layanan yang terdampak:
| Layanan | Deprecated | Tanggal Penghapusan | Pengganti (Google) |
|---|---|---|---|
| Heatmap Layer (Maps JS API) | Agustus 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) |
Detail krusial: Google tidak menghapus routing dan kalkulasi jarak sepenuhnya. Yang dihapus adalah class JavaScript sisi klien yang sudah digunakan developer selama lebih dari satu dekade, dan migrasi ke Routes API yang lebih baru dipaksakan, yakni REST endpoint sisi server. Ini bukan sekadar pembaruan versi biasa, melainkan perubahan arsitektur yang memindahkan logika routing dari browser ke backend kamu.
Apa yang Akan Rusak
Kalau codebase-mu mengandung salah satu dari berikut, ia akan gagal setelah tanggal penghapusan:
// 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();
Setelah penghapusan, constructor ini akan melempar error. Tidak ada perilaku fallback, tidak ada degradasi yang mulus. Peta akan tetap termuat, tapi setiap fitur yang bergantung pada class ini akan rusak sepenuhnya.
Mengapa Google Memaksakan Perubahan Ini
Alasan resmi Google adalah performa dan modernisasi. Routes API, pengganti DirectionsService dan DistanceMatrixService, mendukung fitur-fitur baru seperti eco-friendly routing, routing kendaraan roda dua, dan estimasi biaya tol yang tidak bisa diakomodasi oleh class JavaScript lawas.
Driver sesungguhnya adalah kontrol harga. Dengan memindahkan routing ke REST API sisi server, Google mendapat penagihan lebih terperinci dan pelacakan penggunaan yang lebih akurat. DirectionsService berbasis JavaScript memungkinkan pola batching sisi klien yang lebih sulit diukur secara akurat oleh Google. Routes API memastikan setiap request melewati endpoint yang terukur.
Untuk Heatmap Layer dan Drawing Library, Google mendorong developer ke Extended Component Library dan tools visualisasi pihak ketiga seperti deck.gl. Ini bagian dari pola yang lebih luas: Google mempertahankan rendering core map tile secara in-house dan mengalihdayakan sisanya ke ekosistem.
Dampak praktis bagi developer: infrastruktur backend yang lebih banyak, lebih banyak API key yang harus dikelola, dan dalam kebanyakan kasus, biaya per request yang lebih tinggi di tier harga baru.
Checklist Migrasi
Sebelum menulis kode migrasi apa pun, lalui checklist ini:
1. Audit Codebase Kamu
Cari referensi ke class yang deprecated di codebase-mu:
# 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/
Dokumentasikan setiap file dan komponen yang menggunakan layanan ini. Catat apakah panggilan terjadi di sisi klien (browser) atau dalam konteks server-rendered, misalnya API routes Next.js.
2. Identifikasi Pola Penggunaan
Untuk setiap penggunaan, dokumentasikan:
- Mode perjalanan yang digunakan (driving, walking, cycling, transit)
- Dukungan waypoint (rute A-ke-B sederhana, atau rute multi-stop)
- Field respons yang dikonsumsi (jarak, durasi, polyline, langkah, tarif)
- Volume (request per hari/bulan, untuk estimasi biaya)
- Persyaratan latensi (real-time untuk pengguna, atau pemrosesan batch)
3. Pilih Target Migrasi
Kamu punya dua opsi:
Opsi A: Tetap dengan Google. Migrasi dari class JavaScript yang deprecated ke Google Routes API (REST) yang baru. Ini memerlukan perubahan backend, izin API key baru, dan pembaruan penagihan.
Opsi B: Ganti provider. Migrasi ke API routing pihak ketiga. Ini saat yang tepat untuk mengevaluasi alternatif, karena kamu memang akan menulis ulang kode integrasinya.
4. Siapkan Lingkungan Paralel
Jangan pernah bermigrasi secara in-place. Jalankan implementasi lama dan baru secara bersamaan minimal dua minggu, bandingkan hasilnya dari segi akurasi dan latensi sebelum beralih.
5. Perbarui Error Handling
Layanan yang deprecated mengembalikan error melalui fungsi callback. Pengganti REST API mengembalikan kode status HTTP. Logika penanganan error kamu perlu diubah sesuai ini.
Panduan Penggantian API per API
DirectionsService ke MapAtlas Directions API
Sebelum (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);
}
}
);
Sesudah (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;
}
Perbedaan utama:
- Endpoint REST bukan class JavaScript. Panggilan berasal dari backend, bukan browser.
- Autentikasi lebih sederhana. Satu API key di query string atau header.
- Struktur respons sama. Routes, legs, distance, duration, dan polyline semuanya ada.
DistanceMatrixService ke MapAtlas Matrix API
Sebelum (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);
});
});
}
}
);
Sesudah (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);
});
});
Bentuk respons-nya hampir identik. Perubahan utama adalah beralih dari API browser berbasis callback ke API server berbasis promise.
Penggantian Heatmap Layer
Untuk visualisasi heatmap, jalur migrasi bergantung pada kebutuhanmu:
Opsi 1: MapLibre GL JS dengan 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,
},
});
});
Ini memberikan kontrol penuh atas rendering heatmap dan tidak bergantung pada server tile Google.
Opsi 2: deck.gl HeatmapLayer (rekomendasi Google sendiri)
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,
});
Kedua opsi berfungsi. MapLibre GL JS terintegrasi bersih dengan tile style MapAtlas, sedangkan deck.gl bisa di-overlay di peta dasar mana pun.
Perbandingan Biaya: Google Routes API vs. MapAtlas
Bermigrasi ke Routes API Google sendiri bukan hanya perubahan kode. Ini disertai harga baru:
| Layanan | Google (legacy, per 1.000) | Google Routes API (per 1.000) | MapAtlas (per 1.000) |
|---|---|---|---|
| Directions (dasar) | $5,00 | $5,00 | $1,50 |
| Directions (lanjutan, waypoint/lalu lintas) | $10,00 | $10,00 | $2,50 |
| Distance Matrix (per elemen) | $5,00 | $5,00 | $1,00 |
| Distance Matrix (lanjutan) | $10,00 | $10,00 | $2,00 |
| Geocoding | $5,00 | $5,00 | $1,50 |
Dengan 100.000 request routing per bulan:
- Google Routes API: sekitar $500-$1.000 (tergantung fitur yang digunakan)
- MapAtlas Directions API: sekitar $150-$250
Penghematan bertambah cepat untuk aplikasi yang menggabungkan routing dengan geocoding dan kalkulasi jarak. Platform logistik yang memproses 500.000 elemen matriks per bulan akan membayar sekitar $2.500 di Google versus $500 di MapAtlas.
Untuk detail harga lengkap, lihat harga MapAtlas.
Contoh Migrasi Kode: Lengkap Sebelum/Sesudah
Berikut contoh migrasi lengkap untuk komponen React yang menampilkan arah berkendara di peta.
Sebelum: Google Maps DirectionsService di 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" }} />;
}
Sesudah: MapAtlas Directions API dengan 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" }} />;
}
API Route Backend (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);
}
Pola ini menjaga API key di server dan hanya mengekspos geometri rute ke klien.
Cara Menguji Migrasi Sebelum Deadline
Langkah 1: Jalankan Kedua API Secara Paralel
Dua minggu sebelum beralih, panggil layanan Google lama dan pengganti baru untuk setiap request. Log kedua respons dan bandingkan:
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;
}
Langkah 2: Pasang Feature Flag
Gunakan feature flag untuk mengontrol API mana yang dipanggil aplikasimu. Ini memungkinkan rollback instan jika ada masalah:
const useMapAtlasDirections = process.env.FEATURE_MAPATLAS_DIRECTIONS === "true";
const directions = useMapAtlasDirections
? await fetchMapAtlasDirections(origin, destination)
: await fetchGoogleDirections(origin, destination);
Langkah 3: Pantau Tingkat Error
Setelah beralih, pantau:
- Tingkat error HTTP 4xx/5xx dari API baru
- Peningkatan latensi (provider baru mungkin punya waktu respons berbeda)
- Field yang hilang dalam respons yang diandalkan UI kamu
- Akurasi rute untuk edge case (rute feri, jalan tol, area terbatas)
Langkah 4: Load Test Sebelum Go-Live
Kalau aplikasimu menangani lonjakan traffic, misalnya platform logistik saat dispatch pagi hari, lakukan load test API baru dengan 2x volume puncakmu. MapAtlas menyediakan sandbox environment untuk load testing tanpa tagihan production.
Timeline: Apa yang Harus Dilakukan Minggu Ini
Kalau belum mulai bermigrasi, inilah urutan prioritasnya:
- Minggu ini: Audit codebase. Identifikasi setiap penggunaan empat layanan yang deprecated.
- Minggu ke-2: Buat akun MapAtlas dan dapatkan API key. Free tier mencakup 10.000 request untuk testing.
- Minggu ke-3: Implementasikan pengganti untuk layanan paling kritis, biasanya DirectionsService.
- Minggu ke-4: Migrasikan layanan yang tersisa dan jalankan pengujian paralel.
- Sebelum deadline Mei: Lakukan cutover, hapus dependensi Google API, perbarui penagihan.
Migrasi bukan pilihan. Setelah Mei 2026, class yang deprecated akan dihapus dari Maps JavaScript API, dan kode apa pun yang mereferensikannya akan melempar runtime error. Mulai sekarang dan kamu punya waktu untuk menguji dengan benar. Tunggu sampai minggu terakhir dan kamu akan menambal production di bawah tekanan.
Untuk dukungan migrasi, MapAtlas menyediakan bantuan langsung kepada developer. Hubungi melalui halaman kontak atau mulai dengan dokumentasi API untuk mengevaluasi API pengganti sesuai kebutuhanmu.
Pertanyaan yang Sering Diajukan
Kapan tepatnya deprecation Google Maps API mulai berlaku?
Heatmap Layer dan Drawing Library sudah deprecated masing-masing pada Agustus dan Mei 2025, dengan jadwal penghapusan di Mei 2026. DirectionsService dan DistanceMatrixService deprecated pada 25 Februari 2026, juga dengan target penghapusan Mei 2026. Setelah penghapusan, API call ke layanan-layanan ini akan mengembalikan error.
Apakah API key Google Maps JavaScript saya masih berfungsi setelah Mei 2026?
API key kamu tetap berfungsi untuk layanan yang tidak deprecated. Namun, kode apa pun yang memanggil DirectionsService, DistanceMatrixService, Heatmap Layer, atau Drawing Library melalui Maps JavaScript API akan berhenti bekerja. Kamu perlu memigrasikan panggilan spesifik tersebut ke API pengganti sebelum deadline.
Apa alternatif paling murah untuk Google Maps Directions API?
MapAtlas menawarkan Directions API dengan harga sekitar 70% lebih murah dibandingkan Google. Free tier mencakup 10.000 request per bulan, cukup untuk mengembangkan dan menguji migrasi kamu. Alternatif lain termasuk Mapbox, HERE, dan OpenRouteService, tapi MapAtlas memberikan format request/response yang paling mirip dengan Google sehingga mengurangi effort migrasi.
Bisakah saya bermigrasi secara bertahap atau harus sekaligus?
Kamu bisa bermigrasi secara bertahap. Setiap layanan yang deprecated bersifat independen, sehingga kamu bisa mengganti DirectionsService lebih dulu, lalu DistanceMatrixService, kemudian library visualisasi. Ini justru pendekatan yang direkomendasikan karena memungkinkan kamu menguji setiap pengganti secara terpisah sebelum pindah ke berikutnya.
Apakah MapAtlas mendukung waypoint dan mode perjalanan yang sama dengan Google DirectionsService?
Ya. MapAtlas Directions API mendukung mode driving, walking, dan cycling, plus waypoint perantara. Format request-nya sedikit berbeda (endpoint RESTful vs. class JavaScript), tapi fungsionalitas intinya, routing multi-stop dengan pemilihan mode perjalanan, setara.

