Google son on sekiz ayda Maps JavaScript API'nin çok kullanılan dört parçasını kullanımdan kaldırdı. Bunlardan ikisi, Heatmap Layer ve Drawing Library, Mayıs 2026'dan beri kullanılamıyor. Diğer ikisi, DirectionsService ve DistanceMatrixService, Legacy durumunda ve kullanımdan kaldırılmış olsa da hâlâ çalışıyor ve bir kapanış tarihleri yok.
Bu rehber her birinin güncel durumunu Google'ın kendi sayfalarına bağlantılarla listeliyor ve nasıl değiştirileceğini gösteriyor. Alternatif MapAtlas'tan geldiğinde kod, gerçek uç noktalarımızı ve yanıt biçimlerimizi kullanıyor.
Ne kaldırıldı, ne hâlâ çalışıyor
| Hizmet | Durum | Önemli tarihler | Google'ın alternatifi |
|---|---|---|---|
| Heatmap Layer | Kaldırıldı | 27 Mayıs 2025'te kullanımdan kaldırıldı, 3.65.1c sürümünde (20 Mayıs 2026) devre dışı bırakıldı | deck.gl gibi üçüncü taraf kütüphaneler |
| Drawing Library (DrawingManager) | Kaldırıldı | Ağustos 2025'te kullanımdan kaldırıldı, Mayıs 2026'dan beri kullanılamıyor (3.65.3b sürümünde doğrulandı, 4 Haziran 2026) | Terra Draw gibi üçüncü taraf kütüphaneler |
| DirectionsService | Legacy, kullanımdan kaldırıldı | 1 Mart 2025'ten beri Legacy, 25 Şubat 2026 itibarıyla kullanımdan kaldırıldı (3.64.2b sürümü), kapanış tarihi yok | Routes kütüphanesindeki Route sınıfı |
| DistanceMatrixService | Legacy, kullanımdan kaldırıldı | 1 Mart 2025'ten beri Legacy, 25 Şubat 2026 itibarıyla kullanımdan kaldırıldı (3.64.2b sürümü), kapanış tarihi yok | Routes kütüphanesindeki RouteMatrix sınıfı |
Kaynaklar: Google Maps Platform kullanımdan kaldırmaları, Maps JavaScript API sürüm notları ve Legacy ürünler sayfası.
Legacy'nin belirli bir anlamı var. Google'a göre Legacy bir hizmet yeni özellik almaz ve yeni Cloud projelerinde etkinleştirilemez, ancak mevcut projelerde desteklenmeye devam eder. Google böyle bir hizmeti kapatmadan önce en az 12 ay önceden haber vermeyi taahhüt ediyor. DirectionsService ve DistanceMatrixService'i kullanımdan kaldıran sürüm notu da kapatılmalarının planlanmadığını ve ciddi gerilemelerin düzeltilmeye devam edeceğini söylüyor. 1 Mart 2025'teki aynı Legacy değişikliği Directions API ve Distance Matrix API web hizmetlerini, Places API'yi ve JavaScript Places Service'i de kapsadı.
Ne bozuluyor
Bu kod, Maps JavaScript API'nin güncel sürümlerinde bugün hata veriyor:
// Removed in 2026: these constructors no longer work
const heatmap = new google.maps.visualization.HeatmapLayer({ data: points });
const drawingManager = new google.maps.drawing.DrawingManager();
Bu kod mevcut projelerde hâlâ çalışıyor, ancak kullanımdan kaldırıldı ve yeni bir Cloud projesinde çalışmaz:
// Legacy and deprecated, no shutdown date yet
const directionsService = new google.maps.DirectionsService();
const distanceMatrixService = new google.maps.DistanceMatrixService();
Sitenizdeki bir ısı haritası ya da çizim aracı Mayıs 2026'da çalışmayı bıraktıysa nedeni budur. Önce bunu düzeltin. Ardından, Google bir tarih duyurmadan önce rotalama geçişini planlayın.
Google'ın alternatifleri
Rotalama için Google iki yol sunuyor ve ikisi de mantığı sunucuya taşımanızı zorunlu kılmıyor:
- Tarayıcıda: Maps JavaScript API'deki Routes kütüphanesi.
Routesınıfı DirectionsService'in,RouteMatrixsınıfı da DistanceMatrixService'in yerini alıyor. - Sunucuda: Compute Routes ve Compute Route Matrix yöntemlerine sahip bir REST hizmeti olan Routes API.
Görselleştirme için Google artık kendi seçeneğini sunmuyor. Isı haritası sayfası deck.gl'ye yönlendiriyor, kullanımdan kaldırmalar sayfası da çizim için Terra Draw'u gösteriyor.
Geçiş kontrol listesi
1. Kod tabanınızı tarayın
Etkilenen sınıfları arayın:
# Find all files using deprecated Google Maps services
grep -rn "DirectionsService\|DistanceMatrixService\|DirectionsRenderer\|HeatmapLayer\|DrawingManager" \
--include="*.js" --include="*.ts" --include="*.tsx" --include="*.jsx" src/
Bunları kullanan her dosyayı ve bileşeni not edin. Her çağrının tarayıcıda mı yoksa sunucuda mı çalıştığını da yazın.
2. Her hizmeti nasıl kullandığınızı kaydedin
Her kullanım için şunları not edin:
- Ulaşım modları (araba, yürüyüş, bisiklet, toplu taşıma)
- Ara noktalar (A'dan B'ye basit rota ya da çok duraklı rotalar)
- Okuduğunuz yanıt alanları (mesafe, süre, polyline, adımlar, ücret)
- Hacim (günlük ve aylık istek sayısı, maliyet tahmini için)
- Gecikme gereksinimleri (kullanıcıya gerçek zamanlı ya da toplu işlem)
3. Hedefinizi seçin
Seçenek A: Google'da kalın. Route ve RouteMatrix sınıflarına ya da Routes API'ye geçin. Kullandığınız alanları geçiş rehberleriyle karşılaştırın, çünkü yanıt biçimleri Legacy sınıflardan farklı.
Seçenek B: sağlayıcı değiştirin. Entegrasyonu zaten yeniden yazacaksınız, bu yüzden sağlayıcıları 2. adımdaki gereksinimlere göre karşılaştırın.
4. Eskiyi ve yeniyi yan yana çalıştırın
Yerinde geçiş yapmayın. İki uygulamayı bir süre paralel çalıştırın ve geçmeden önce gerçek rotalarınızda mesafe, süre ve gecikmeyi karşılaştırın.
5. Hata yönetimini güncelleyin
Legacy sınıflar hataları bir callback içindeki durum değeriyle bildiriyordu. REST alternatifleri HTTP durum kodları ve hata gövdeleri döndürür, bu yüzden hata yönetiminiz de değişmeli.
Her hizmeti MapAtlas ile değiştirmek
MapAtlas rotalama uç noktaları gateway.mapmetrics-atlas.net üzerindeki REST hizmetleridir ve MapAtlas API belgelerinde anlatılır. Token'ı sorgu parametresi olarak alırlar, bu yüzden onları backend'inizden çağırın.
DirectionsService'ten MapAtlas Directions API'ye
Önce (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);
}
}
);
Sonra (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);
Başlıca farklar:
- JavaScript sınıfı yerine REST çağrısı, backend'inizden yapılır.
- Ara noktalar,
locationsdizisinin ortadaki öğeleridir. - Farklı yanıt yapısı. Toplamlar
trip.summaryiçindedir ve her bacağınshapeiçinde kodlanmış bir polyline'ı vardır. Rotayı çizmeden önce bunu çözün (aşağıdaki backend örneğine bakın).
DistanceMatrixService'ten MapAtlas Matrix API'ye
MapAtlas Matrix API, her başlangıç ve varış çifti için yolculuk süresini ve mesafeyi tek çağrıda döndürür. Uç noktamız her çifti 400 km rota mesafesiyle sınırlar, bu yüzden örnekte Berlin çevresindeki yerler kullanılıyor.
Önce (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);
});
});
}
}
);
Sonra (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");
});
});
Izgara, Google'ın rows ve elements yapısına karşılık gelir. Mesafeler istediğiniz birimde sayı olarak, süreler de saniye cinsinden gelir, biçimlendirmeyi siz yaparsınız.
Heatmap Layer yerine
Seçenek 1: MapLibre GL JS'te bir ısı haritası katmanı (açık kaynak)
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,
},
});
});
Isı haritası ek bir hizmete gerek kalmadan harita kütüphanesinin kendisinde çizilir.
Seçenek 2: Google belgelerinin önerdiği deck.gl HeatmapLayer:
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,
});
İkisi de çalışır. MapLibre GL JS MapAtlas stillerini doğrudan okur, deck.gl ise herhangi bir altlık haritanın üzerine yerleşebilir.
Drawing Library yerine
DrawingManager, kullanıcıların haritaya işaretçi, çizgi, daire ve poligon çizmesini sağlıyordu. Google'ın kullanımdan kaldırmalar sayfasının gösterdiği kütüphane olan Terra Draw, aynı modları sunar ve aralarında Google Maps ile MapLibre GL JS'in de bulunduğu birçok harita kütüphanesi için adaptörlere sahiptir. Şekiller GeoJSON olarak döner, bunları olduğu gibi saklayabilir ya da bir geofencing veya izokron hizmetine gönderebilirsiniz.
Maliyet karşılaştırması
Google'ın liste fiyatları, Legacy rotalama SKU'ları ile onların yerine gelen Essentials SKU'ları için aynıdır. Aşağıdaki tüm fiyatlar Google Maps Platform fiyat sayfasından ve MapAtlas fiyat sayfasından alındı ve 26 Eylül 2026'da kontrol edildi.
| Hizmet | Google, aylık ücretsiz | Google, sonrasında 1.000 başına (ilk kademe) | MapAtlas, aylık ücretsiz | MapAtlas, sonrasında 1.000 başına (ilk kademe) |
|---|---|---|---|---|
| Directions (Legacy) veya Compute Routes Essentials | 10.000 | 5,00 $ | 100.000 navigasyon isteği | 1,53 € |
| Directions Advanced (Legacy) veya Compute Routes Pro | 5.000 | 10,00 $ | Aynı navigasyon kademesi | 1,53 € |
| Distance Matrix (Legacy) veya Compute Route Matrix Essentials | 10.000 öğe | 5,00 $ | Fiyat sayfasına bakın | Fiyat sayfasına bakın |
| Geocoding | 10.000 | 5,00 $ | 25.000 | 3,90 € |
Google ABD doları, MapAtlas ise euro ile faturalandırır, bu yüzden karşılaştırmadan önce çevirin. İkisi de yüksek hacimlerde daha düşük fiyat uygular. Ayda 500.000 rota isteği için bir örnek hesap:
- Google Compute Routes Essentials: 10.000 ücretsiz, 90.000 istek 5,00 $'dan ve 400.000 istek 4,00 $'dan, toplam 2.050 $.
- MapAtlas navigasyon: 100.000 ücretsiz ve 400.000 istek 1,53 €'dan, toplam yaklaşık 610 €.
Tam örnek: backend rotası ve harita
Bu yapı API anahtarınızı sunucuda tutar ve tarayıcıya yalnızca rota geometrisini gönderir.
Backend API rotası (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,
});
}
Harita bileşeni (React ve 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" }} />;
}
Geçişi nasıl test edersiniz
1. adım: iki uygulamayı karşılaştırın
Bir test süresi boyunca eski ve yeni hizmeti aynı isteklerle çağırın. İkisinden gelen mesafe ve süreyi kaydedin ve gerçek rotalarınızdaki farkları inceleyin, özellikle feribot, ücretli yol ve erişimi kısıtlı yollarda.
2. adım: bir feature flag kullanın
Sağlayıcıyı bir flag'in arkasına koyun, böylece deploy yapmadan geri dönebilirsiniz:
const useMapAtlasDirections = process.env.FEATURE_MAPATLAS_DIRECTIONS === "true";
const directions = useMapAtlasDirections
? await fetchMapAtlasDirections(origin, destination)
: await fetchGoogleDirections(origin, destination);
3. adım: hata oranlarını izleyin
Geçişten sonra şunları izleyin:
- Yeni API'den gelen HTTP 4xx ve 5xx oranları
- Gecikme değişiklikleri
- Arayüzünüzün okuduğu eksik alanlar
- Feribot, ücretli yol ve kısıtlı bölge gibi uç durumlarda rota farklılıkları
4. adım: canlıya çıkmadan önce yük testi
Trafiğinizde zirveler varsa, örneğin bir lojistik platformunda sabah dağıtımı sırasında, yeni API'ye güvenmeden önce onu zirve hacminizin iki katında yük testinden geçirin.
Şimdi ne yapmalı
- Hâlâ Heatmap Layer veya Drawing Library yüklüyorsanız: önce bunları değiştirin. Maps JavaScript API'nin güncel sürümlerinde artık çalışmıyorlar.
- Rotalama kodunu tarayın: DirectionsService, DirectionsRenderer ve DistanceMatrixService'e yapılan her çağrıyı bulun.
- Alternatifi seçin:
RouteveRouteMatrixsınıfları, Routes API ya da başka bir sağlayıcı. - Hizmetleri tek tek taşıyın, bir feature flag arkasında, ve geçmeden önce sonuçları karşılaştırın.
- Google'ın kullanımdan kaldırmalar sayfasını takip edin, bir kapanış tarihi gelirse görün. Google, Legacy hizmetler için en az 12 ay önceden haber vermeyi taahhüt etti.
MapAtlas rotalama API'lerini denemek için ücretsiz bir hesap açın ve API belgelerini okuyun. Geçiş konusunda yardım için iletişim sayfasını kullanın.
Sıkça Sorulan Sorular
Google Maps Drawing Library hâlâ kullanılabiliyor mu?
Hayır. Google, DrawingManager dahil Drawing Library'yi Ağustos 2025'te kullanımdan kaldırdı ve kullanımdan kaldırmalar sayfasında Mayıs 2026'dan beri kullanılamaz olarak listeliyor. Maps JavaScript API'nin 3.65.3b sürüm notları (4 Haziran 2026), DrawingManager'ın artık kullanılamadığını doğruluyor. Google alternatif olarak Terra Draw'u gösteriyor.
Heatmap Layer hâlâ kullanılabiliyor mu?
Hayır. Google, Heatmap Layer'ı 27 Mayıs 2025'te kullanımdan kaldırdı ve 20 Mayıs 2026 tarihli 3.65.1c sürümü tamamen devre dışı bırakıldığını bildiriyor. Google bunun yerine deck.gl'nin HeatmapLayer'ı gibi üçüncü taraf kütüphaneleri öneriyor.
DirectionsService ve DistanceMatrixService ne zaman çalışmayı bırakacak?
Google bir tarih belirlemedi. İkisi de 1 Mart 2025'ten beri Legacy durumunda ve 25 Şubat 2026'dan beri kullanımdan kaldırılmış durumda. Google'ın sürüm notlarına göre kapatılmaları planlanmıyor, ciddi gerilemeler için düzeltme almaya devam edecekler ve destek bitmeden en az 12 ay önce duyuru yapılacak. Legacy hizmetler yeni Cloud projelerinde kullanılamıyor, bu yüzden yeni bir proje Route ve RouteMatrix sınıflarına ya da başka bir sağlayıcıya ihtiyaç duyar.
Aşamalı mı geçmeliyim, yoksa her şeyi bir kerede mi değiştirmeliyim?
Hizmetleri tek tek taşıyabilirsiniz. Kullanımdan kaldırılan her sınıf birbirinden bağımsızdır. Zaten çalışmayan Drawing Library ve Heatmap Layer'ı önce değiştirin, ardından DirectionsService ve DistanceMatrixService'i kendi takviminize göre taşıyın.
MapAtlas ara noktaları ve farklı ulaşım modlarını destekliyor mu?
Evet. MapAtlas Directions API sıralı bir konum listesi alır, yani ilk ve son nokta arasındaki her nokta bir ara noktadır. auto, bicycle, pedestrian, bus, truck, taxi ve motor_scooter maliyet modellerini destekler. Bu bir REST uç noktasıdır, API anahtarı istemciye gitmesin diye onu backend'inizden çağırın.

