O Google vem apertando sua Maps Platform há anos, mas a onda de deprecações de maio de 2026 é a mais disruptiva até agora. Quatro funcionalidades amplamente utilizadas serão removidas da Maps JavaScript API: Heatmap Layer, Drawing Library, DirectionsService e DistanceMatrixService. Se sua aplicação depende de alguma delas, você tem poucas semanas para migrar antes que seu código pare de funcionar.
Isso não é uma deprecação suave em que os endpoints antigos continuam existindo por anos. O Google definiu datas definitivas de remoção, e o console do desenvolvedor já está exibindo avisos. Este guia cobre exatamente o que está mudando, por que o Google está fazendo isso, e como migrar cada serviço com exemplos de código funcionais. Se você precisar de um substituto direto, vamos mostrar como as APIs do MapAtlas se mapeiam para cada serviço deprecated do Google.
O que está sendo deprecated e quando
Aqui está a cronologia completa dos serviços afetados:
| Serviço | Deprecated | Data de remoção | Substituto (Google) |
|---|---|---|---|
| Heatmap Layer (Maps JS API) | Agosto 2025 | Maio 2026 | Maps Datasets API + deck.gl |
| Drawing Library (Maps JS API) | Maio 2025 | Maio 2026 | Extended Component Library |
| DirectionsService (Maps JS API) | 25 de fevereiro de 2026 | Maio 2026 | Routes API (REST) |
| DistanceMatrixService (Maps JS API) | 25 de fevereiro de 2026 | Maio 2026 | Routes API (REST) |
O detalhe crítico: o Google não está removendo roteamento e cálculos de distância por completo. Está removendo as classes JavaScript do lado do cliente que os devs usam há mais de uma década e forçando a migração para a nova Routes API, um endpoint REST do lado do servidor. Não é um simples bump de versão. É uma mudança arquitetural que move a lógica de roteamento do browser para o seu backend.
O que vai quebrar
Se seu codebase contiver qualquer um dos seguintes, ele vai falhar após a data de remoção:
// 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();
Após a remoção, esses construtores vão lançar erros. Não há comportamento de fallback, nenhuma degradação graciosa. O mapa vai carregar, mas qualquer feature que dependa dessas classes vai quebrar completamente.
Por que o Google está forçando essas mudanças
A justificativa oficial do Google é performance e modernização. A Routes API, que substitui o DirectionsService e o DistanceMatrixService, suporta features mais novas como roteamento eco-friendly, roteamento para veículos de duas rodas e estimativa de pedágios, que as classes JavaScript legadas não conseguem acomodar.
O driver real é o controle de preços. Ao mover o roteamento para uma REST API do lado do servidor, o Google ganha uma cobrança mais granular e rastreamento de uso mais preciso. O DirectionsService JavaScript permitia padrões de batching no lado do cliente que eram mais difíceis para o Google medir com precisão. A Routes API garante que cada requisição passe por um endpoint monitorado.
Para Heatmap Layer e Drawing Library, o Google está empurrando os devs em direção à sua Extended Component Library e ferramentas de visualização de terceiros como deck.gl. Isso faz parte de um padrão mais amplo: o Google mantém o rendering de tiles do mapa internamente e terceiriza todo o resto para o ecossistema.
O impacto prático para a comunidade é mais infraestrutura de backend, mais API keys para gerenciar e, na maioria dos casos, custos por requisição mais altos nos novos níveis de preço.
Checklist de migração
Antes de escrever qualquer código de migração, trabalhe por este checklist:
1. Faça um audit do seu codebase
Busque no seu codebase referências às classes deprecated:
# 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/
Documente cada arquivo e componente que usa esses serviços. Anote se as chamadas acontecem no lado do cliente (browser) ou em um contexto renderizado no servidor, como API routes do Next.js.
2. Identifique seus padrões de uso
Para cada uso, documente:
- Modos de viagem usados (driving, walking, cycling, transit)
- Suporte a waypoints (simples A-a-B ou rotas multi-parada)
- Campos da resposta consumidos (distância, duração, polyline, etapas, tarifa)
- Volume (requisições por dia/mês, para estimativa de custos)
- Requisitos de latência (tempo real para o usuário ou processamento em batch)
3. Escolha seu destino de migração
Você tem duas opções:
Opção A: Ficar com o Google. Migrar das classes JavaScript deprecated para a nova Google Routes API (REST). Isso exige mudanças no backend, novas permissões de API key e atualização do billing.
Opção B: Trocar de provedor. Migrar para uma API de roteamento de terceiros. É o momento certo para avaliar alternativas, já que você vai reescrever o código de integração de qualquer jeito.
4. Monte um ambiente paralelo
Nunca migre in-place. Execute a implementação antiga e a nova em paralelo por pelo menos duas semanas, comparando resultados de precisão e latência antes de fazer o cutover.
5. Atualize o tratamento de erros
Os serviços deprecated retornavam erros por meio de funções callback. Os substitutos REST retornam códigos de status HTTP. Sua lógica de tratamento de erros precisa ser atualizada de acordo.
Guia de substituição API por API
DirectionsService para MapAtlas Directions API
Antes (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);
}
}
);
Depois (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;
}
Diferenças principais:
- Endpoint REST em vez de uma classe JavaScript. As chamadas saem do seu backend, não do browser.
- Autenticação mais simples. Uma única API key no query string ou no header.
- Mesma estrutura de resposta. Routes, legs, distance, duration e polyline estão todos lá.
DistanceMatrixService para MapAtlas Matrix API
Antes (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);
});
});
}
}
);
Depois (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);
});
});
A estrutura da resposta é quase idêntica. A mudança principal é sair de uma API de browser baseada em callbacks para uma API de servidor baseada em promises.
Substituição do Heatmap Layer
Para visualização de heatmap, o caminho de migração depende dos seus requisitos:
Opção 1: MapLibre GL JS com 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,
},
});
});
Isso te dá controle total sobre o rendering do heatmap e não depende dos servidores de tiles do Google.
Opção 2: deck.gl HeatmapLayer (a própria recomendação do Google)
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,
});
As duas opções funcionam. MapLibre GL JS se integra bem com os estilos de tiles do MapAtlas, enquanto deck.gl pode ser sobreposto em qualquer mapa base.
Comparação de custos: Google Routes API vs. MapAtlas
Migrar para a própria Routes API do Google não é só uma mudança de código. Vem com novos preços:
| Serviço | Google (legacy, por 1.000) | Google Routes API (por 1.000) | MapAtlas (por 1.000) |
|---|---|---|---|
| Directions (básico) | $5,00 | $5,00 | $1,50 |
| Directions (avançado, waypoints/tráfego) | $10,00 | $10,00 | $2,50 |
| Distance Matrix (por elemento) | $5,00 | $5,00 | $1,00 |
| Distance Matrix (avançado) | $10,00 | $10,00 | $2,00 |
| Geocoding | $5,00 | $5,00 | $1,50 |
Com 100.000 requisições de roteamento por mês:
- Google Routes API: ~$500-$1.000 (dependendo das features usadas)
- MapAtlas Directions API: ~$150-$250
A economia aumenta rápido para aplicações que combinam roteamento com geocoding e cálculos de distância. Uma plataforma de logística processando 500.000 elementos de matriz por mês pagaria cerca de $2.500 no Google contra $500 no MapAtlas.
Para todos os detalhes de preço, veja os preços do MapAtlas.
Exemplos completos de migração: antes e depois
Um exemplo completo de migração para um componente React que mostra rotas de direção em um mapa.
Antes: Google Maps DirectionsService no 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" }} />;
}
Depois: MapAtlas Directions API com 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 no 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);
}
Esse padrão mantém sua API key no servidor e expõe apenas a geometria da rota ao cliente.
Como testar sua migração antes do prazo
Passo 1: Execute as duas APIs em paralelo
Por duas semanas antes do cutover, chame tanto o serviço antigo do Google quanto o novo substituto para cada requisição. Registre as duas respostas e compare:
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;
}
Passo 2: Configure feature flags
Use um feature flag para controlar qual API sua aplicação chama. Isso permite rollback instantâneo se você encontrar problemas:
const useMapAtlasDirections = process.env.FEATURE_MAPATLAS_DIRECTIONS === "true";
const directions = useMapAtlasDirections
? await fetchMapAtlasDirections(origin, destination)
: await fetchGoogleDirections(origin, destination);
Passo 3: Monitore as taxas de erro
Após o switch, monitore:
- Taxas de erro HTTP 4xx/5xx da nova API
- Aumentos de latência (o novo provedor pode ter tempos de resposta diferentes)
- Campos faltando nas respostas das quais sua UI depende
- Precisão de rota para casos extremos (balsa, rodovias com pedágio, áreas restritas)
Passo 4: Faça load test antes do go-live
Se sua aplicação lida com picos de tráfego, como uma plataforma de logística durante o dispatch matinal, faça load test da nova API com 2x do seu volume de pico. MapAtlas oferece um ambiente sandbox para load testing sem cobranças de produção.
Cronograma: o que fazer essa semana
Se você ainda não começou a migrar, aqui está a ordem de prioridade:
- Essa semana: Faça audit do codebase. Identifique cada uso dos quatro serviços deprecated.
- Semana 2: Crie uma conta no MapAtlas e pegue as API keys. O tier gratuito cobre 10.000 requisições para testes.
- Semana 3: Implemente o substituto para seu serviço mais crítico (geralmente DirectionsService).
- Semana 4: Migre os serviços restantes e execute testes em paralelo.
- Antes do prazo de maio: Faça o cutover, remova as dependências da API do Google, atualize o billing.
A migração não é opcional. Depois de maio de 2026, as classes deprecated serão removidas da Maps JavaScript API, e qualquer código que as referencie vai lançar erros em runtime. Comece agora e você terá tempo para testar direito. Espere até a última semana e vai estar fazendo patch em produção sob pressão.
Para suporte à migração, o MapAtlas oferece assistência direta ao desenvolvedor. Entre em contato pela página de contato ou comece pela documentação da API para avaliar as APIs substitutas com base nos seus requisitos.
Perguntas frequentes
Quando exatamente as deprecações da API do Google Maps entram em vigor?
O Heatmap Layer e a Drawing Library foram deprecados em agosto e maio de 2025 respectivamente, com remoção programada para maio de 2026. DirectionsService e DistanceMatrixService foram deprecados em 25 de fevereiro de 2026, também com remoção prevista para maio de 2026. Após a remoção, chamadas de API a esses serviços retornarão erros.
Minha API key do Google Maps JavaScript ainda vai funcionar depois de maio de 2026?
Sua API key continuará funcionando para os serviços não deprecated. No entanto, qualquer código que chame DirectionsService, DistanceMatrixService, o Heatmap Layer ou a Drawing Library pela Maps JavaScript API vai parar de funcionar. Você precisa migrar essas chamadas específicas para as APIs substitutas antes do prazo.
Qual é a alternativa mais barata à Directions API do Google Maps?
MapAtlas oferece uma Directions API com custo aproximadamente 70% menor do que o equivalente do Google. O tier gratuito inclui 10.000 requisições por mês, suficiente para desenvolver e testar a migração. Outras alternativas incluem Mapbox, HERE e OpenRouteService, mas MapAtlas oferece o formato de request/response mais parecido com o do Google, reduzindo o esforço de migração.
Posso migrar de forma incremental ou preciso mudar tudo de uma vez?
Você pode migrar de forma incremental. Cada serviço deprecated é independente, então você pode substituir o DirectionsService primeiro, depois o DistanceMatrixService e por último as bibliotecas de visualização. Essa é a abordagem recomendada porque permite testar cada substituição de forma isolada antes de avançar para o próximo.
MapAtlas suporta os mesmos waypoints e modos de viagem que o Google DirectionsService?
Sim. A MapAtlas Directions API suporta os modos driving, walking e cycling, além de waypoints intermediários. O formato da requisição é levemente diferente (endpoint RESTful vs. classe JavaScript), mas a funcionalidade principal, roteamento multi-parada com seleção de modo de viagem, é equivalente.

