Skip to main content
Deprecation Google Maps API Berlaku Mei 2026: Checklist Migrasi untuk
Guides

Deprecation Google Maps API Berlaku Mei 2026: Checklist Migrasi untuk

DirectionsService, DistanceMatrixService, Heatmap Layer, dan Drawing Library semuanya deprecated. Berikut checklist migrasi lengkap, API pengganti

Brent van der Heiden12 min read
#Google Maps API#API Migration#Geocoding#Routing#Developer Guide

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:

LayananDeprecatedTanggal PenghapusanPengganti (Google)
Heatmap Layer (Maps JS API)Agustus 2025Mei 2026Maps Datasets API + deck.gl
Drawing Library (Maps JS API)Mei 2025Mei 2026Extended Component Library
DirectionsService (Maps JS API)25 Februari 2026Mei 2026Routes API (REST)
DistanceMatrixService (Maps JS API)25 Februari 2026Mei 2026Routes 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:

LayananGoogle (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:

  1. Minggu ini: Audit codebase. Identifikasi setiap penggunaan empat layanan yang deprecated.
  2. Minggu ke-2: Buat akun MapAtlas dan dapatkan API key. Free tier mencakup 10.000 request untuk testing.
  3. Minggu ke-3: Implementasikan pengganti untuk layanan paling kritis, biasanya DirectionsService.
  4. Minggu ke-4: Migrasikan layanan yang tersisa dan jalankan pengujian paralel.
  5. 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.

Merasa ini berguna? Bagikan.

Tentang penulis

Brent van der Heiden

Ditulis oleh

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. He writes about geospatial infrastructure, AI search visibility, and how location data powers the products people rely on every day.

Lihat semua artikel
Kembali ke blog