গত আঠারো মাসে Google, Maps JavaScript API-র বহুল ব্যবহৃত চারটি অংশকে deprecated ঘোষণা করেছে। এর দুটি, Heatmap Layer ও Drawing Library, মে 2026 থেকে আর পাওয়া যায় না। বাকি দুটি, DirectionsService ও DistanceMatrixService, Legacy ও deprecated, তবে এখনো কাজ করে এবং বন্ধের কোনো তারিখ নেই।
এই গাইডে প্রতিটির বর্তমান অবস্থা Google-এর নিজের পেজের link-সহ দেওয়া হয়েছে এবং কীভাবে বদলাবেন তা দেখানো হয়েছে। যেখানে বিকল্প MapAtlas থেকে আসে, সেখানে code আমাদের আসল endpoint ও response format ব্যবহার করে।
কী deprecated আর কী এখনো চলে
| সেবা | অবস্থা | গুরুত্বপূর্ণ তারিখ | Google-এর বিকল্প |
|---|---|---|---|
| Heatmap Layer | সরানো হয়েছে | 27 মে 2025-এ deprecated, 3.65.1c সংস্করণে (20 মে 2026) বন্ধ | deck.gl-এর মতো third-party library |
| Drawing Library (DrawingManager) | সরানো হয়েছে | আগস্ট 2025-এ deprecated, মে 2026 থেকে অনুপলব্ধ (3.65.3b সংস্করণে নিশ্চিত, 4 জুন 2026) | Terra Draw-এর মতো third-party library |
| DirectionsService | Legacy, deprecated | 1 মার্চ 2025 থেকে Legacy, 25 ফেব্রুয়ারি 2026 থেকে deprecated (3.64.2b সংস্করণ), বন্ধের তারিখ নেই | Routes library-র Route class |
| DistanceMatrixService | Legacy, deprecated | 1 মার্চ 2025 থেকে Legacy, 25 ফেব্রুয়ারি 2026 থেকে deprecated (3.64.2b সংস্করণ), বন্ধের তারিখ নেই | Routes library-র RouteMatrix class |
উৎস: Google Maps Platform deprecations পেজ, Maps JavaScript API release notes এবং Legacy products পেজ।
Legacy-র একটি নির্দিষ্ট অর্থ আছে। Google-এর মতে Legacy সেবায় নতুন feature যোগ হয় না এবং নতুন Cloud project-এ এটি চালু করা যায় না, তবে বিদ্যমান project-এ support চলতে থাকে। Google এমন সেবা বন্ধ করার অন্তত 12 মাস আগে জানানোর প্রতিশ্রুতি দেয়, আর DirectionsService ও DistanceMatrixService-কে deprecated ঘোষণা করা release note বলে এগুলো বন্ধের পরিকল্পনা নেই এবং গুরুতর regression ঠিক করা হবে। 1 মার্চ 2025-এর একই Legacy পরিবর্তনে Directions API ও Distance Matrix API web service, Places API এবং JavaScript Places Service-ও ছিল।
কী ভেঙে যায়
এই code এখন Maps JavaScript API-র বর্তমান সংস্করণে fail করে:
// Removed in 2026: these constructors no longer work
const heatmap = new google.maps.visualization.HeatmapLayer({ data: points });
const drawingManager = new google.maps.drawing.DrawingManager();
এই code বিদ্যমান project-এ এখনো চলে, কিন্তু deprecated এবং নতুন Cloud project-এ কাজ করবে না:
// Legacy and deprecated, no shutdown date yet
const directionsService = new google.maps.DirectionsService();
const distanceMatrixService = new google.maps.DistanceMatrixService();
আপনার সাইটের কোনো heatmap বা drawing tool যদি মে 2026-এ কাজ করা বন্ধ করে থাকে, কারণ এটাই। আগে সেটি ঠিক করুন। তারপর Google কোনো তারিখ ঘোষণা করার আগেই routing মাইগ্রেশনের পরিকল্পনা করুন।
Google-এর বিকল্প
Routing-এর জন্য Google দুটি পথ দেয়, এবং কোনোটিই logic server-এ সরাতে বাধ্য করে না:
- Browser-এ: Maps JavaScript API-র Routes library।
Routeclass, DirectionsService-এর জায়গা নেয় এবংRouteMatrixclass, DistanceMatrixService-এর। - Server-এ: Routes API, Compute Routes ও Compute Route Matrix method-সহ একটি REST সেবা।
Visualisation-এর জন্য Google আর নিজস্ব কোনো বিকল্প দেয় না। এর heatmap পেজ deck.gl-এর দিকে পাঠায়, আর deprecations পেজ drawing-এর জন্য Terra Draw-র নাম দেয়।
মাইগ্রেশন checklist
1. Codebase পরীক্ষা করুন
প্রভাবিত class খুঁজুন:
# Find all files using deprecated Google Maps services
grep -rn "DirectionsService\|DistanceMatrixService\|DirectionsRenderer\|HeatmapLayer\|DrawingManager" \
--include="*.js" --include="*.ts" --include="*.tsx" --include="*.jsx" src/
যেসব file ও component এগুলো ব্যবহার করে তা লিখে রাখুন, এবং প্রতিটি call browser-এ চলে নাকি server-এ।
2. প্রতিটি সেবার ব্যবহার লিখে রাখুন
প্রতিটি ব্যবহারের জন্য লিখুন:
- যাতায়াত মাধ্যম (গাড়ি, হাঁটা, সাইকেল, গণপরিবহন)
- মাঝের যাত্রাবিরতি (সরাসরি A থেকে B, নাকি কয়েকটি stop-সহ route)
- যে response field পড়েন (দূরত্ব, সময়, polyline, ধাপ, ভাড়া)
- পরিমাণ (দৈনিক ও মাসিক request, খরচের হিসাবের জন্য)
- Latency-র প্রয়োজন (ব্যবহারকারীর জন্য real-time, নাকি batch)
3. লক্ষ্য বেছে নিন
বিকল্প A: Google-এর সঙ্গেই থাকুন। Route ও RouteMatrix class বা Routes API-তে যান। যে field ব্যবহার করেন সেগুলো migration guide-এর সঙ্গে মিলিয়ে নিন, কারণ response format Legacy class থেকে আলাদা।
বিকল্প B: provider বদলান। Integration তো আবার লিখতেই হবে, তাই ধাপ 2-এর প্রয়োজনের ভিত্তিতে provider তুলনা করুন।
4. পুরোনো ও নতুন পাশাপাশি চালান
সরাসরি জায়গায় মাইগ্রেট করবেন না। কিছুদিন দুটি implementation পাশাপাশি চালান এবং switch করার আগে নিজের আসল route-এ দূরত্ব, সময় ও latency তুলনা করুন।
5. Error handling আপডেট করুন
Legacy class callback-এর status value দিয়ে error জানাত। REST বিকল্প HTTP status code ও error body ফেরত দেয়, তাই error handling-ও বদলাতে হবে।
প্রতিটি সেবা MapAtlas দিয়ে বদলানো
MapAtlas-এর routing endpoint হলো gateway.mapmetrics-atlas.net-এ চলা REST সেবা, যার বিবরণ MapAtlas API docs-এ আছে। এগুলো token-কে query parameter হিসেবে নেয়, তাই নিজের backend থেকে call করুন।
DirectionsService থেকে MapAtlas Directions API
আগে (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);
}
}
);
পরে (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);
মূল পার্থক্য:
- JavaScript class-এর বদলে REST call, যা আপনার backend থেকে হয়।
- মাঝের যাত্রাবিরতি হলো
locations-এর মাঝের entry। - Response-এর গঠন আলাদা। মোট হিসাব
trip.summary-তে থাকে, আর প্রতিটি অংশেরshape-এ একটি encoded polyline থাকে। Route আঁকার আগে সেটি decode করুন (নিচের backend উদাহরণ দেখুন)।
DistanceMatrixService থেকে MapAtlas Matrix API
MapAtlas Matrix API একটি call-এ প্রতিটি origin ও destination জোড়ার যাত্রার সময় ও দূরত্ব ফেরত দেয়। আমাদের endpoint প্রতিটি জোড়াকে 400 km route দূরত্বে সীমিত রাখে, তাই উদাহরণে বার্লিনের আশপাশের জায়গা ব্যবহার করা হয়েছে।
আগে (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);
});
});
}
}
);
পরে (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");
});
});
এই grid Google-এর rows ও elements-এর মতোই। দূরত্ব আপনার চাওয়া এককে সংখ্যা হিসেবে এবং সময় সেকেন্ডে আসে, তাই formatting নিজেকেই করতে হবে।
Heatmap Layer-এর বিকল্প
বিকল্প 1: MapLibre GL JS-এ heatmap layer (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,
},
});
});
Heatmap map library নিজেই render করে, কোনো বাড়তি সেবা লাগে না।
বিকল্প 2: deck.gl-এর HeatmapLayer, যা Google-এর documentation সুপারিশ করে:
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,
});
দুটিই কাজ করে। MapLibre GL JS সরাসরি MapAtlas style পড়ে, আর deck.gl যেকোনো base map-এর ওপর বসানো যায়।
Drawing Library-র বিকল্প
DrawingManager দিয়ে ব্যবহারকারীরা map-এ marker, line, circle ও polygon আঁকতে পারতেন। Google-এর deprecations পেজ যে library-র নাম দেয়, সেই Terra Draw একই mode দেয় এবং Google Maps ও MapLibre GL JS-সহ কয়েকটি map library-র জন্য adapter রাখে। আঁকা আকারগুলো GeoJSON হিসেবে ফেরত আসে, যা আপনি হুবহু সংরক্ষণ করতে বা geofencing বা isochrone সেবায় পাঠাতে পারেন।
খরচের তুলনা
Routing-এর Legacy SKU আর সেগুলোর জায়গায় আসা Essentials SKU-র জন্য Google-এর list price একই। নিচের সব দাম Google Maps Platform pricing পেজ ও MapAtlas pricing পেজ থেকে নেওয়া, দুটিই 26 সেপ্টেম্বর 2026-এ যাচাই করা।
| সেবা | Google, মাসে বিনামূল্যে | Google, তারপর প্রতি 1,000 (প্রথম স্তর) | MapAtlas, মাসে বিনামূল্যে | MapAtlas, তারপর প্রতি 1,000 (প্রথম স্তর) |
|---|---|---|---|---|
| Directions (Legacy) বা Compute Routes Essentials | 10,000 | $5.00 | 100,000 navigation request | €1.53 |
| Directions Advanced (Legacy) বা Compute Routes Pro | 5,000 | $10.00 | একই navigation স্তর | €1.53 |
| Distance Matrix (Legacy) বা Compute Route Matrix Essentials | 10,000 element | $5.00 | Pricing পেজ দেখুন | Pricing পেজ দেখুন |
| Geocoding | 10,000 | $5.00 | 25,000 | €3.90 |
Google মার্কিন ডলারে আর MapAtlas ইউরোতে বিল করে, তাই তুলনার আগে মুদ্রা রূপান্তর করুন। দুজনেই বেশি পরিমাণে কম দর নেয়। মাসে 500,000 route request-এর একটি উদাহরণ:
- Google Compute Routes Essentials: 10,000 বিনামূল্যে, 90,000 প্রতি হাজার $5.00 এবং 400,000 প্রতি হাজার $4.00, মোট $2,050।
- MapAtlas navigation: 100,000 বিনামূল্যে এবং 400,000 প্রতি হাজার €1.53, মোট প্রায় €610।
পূর্ণ উদাহরণ: backend route ও map
এই পদ্ধতিতে API key server-এ থাকে এবং browser-এ শুধু route-এর geometry পাঠানো হয়।
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,
});
}
Map component (React ও 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" }} />;
}
মাইগ্রেশন কীভাবে পরীক্ষা করবেন
ধাপ 1: দুটি implementation তুলনা করুন
পরীক্ষার সময় একই request দিয়ে পুরোনো ও নতুন দুটি সেবাই call করুন। দুটির দূরত্ব ও সময় log করুন এবং নিজের আসল route-এ পার্থক্য দেখুন, বিশেষ করে ফেরি, টোল ও সীমাবদ্ধ রাস্তায়।
ধাপ 2: feature flag ব্যবহার করুন
Provider-কে একটি flag-এর পেছনে রাখুন, যাতে deploy ছাড়াই ফিরে যেতে পারেন:
const useMapAtlasDirections = process.env.FEATURE_MAPATLAS_DIRECTIONS === "true";
const directions = useMapAtlasDirections
? await fetchMapAtlasDirections(origin, destination)
: await fetchGoogleDirections(origin, destination);
ধাপ 3: error-এর হার নজরে রাখুন
Switch-এর পরে নজর রাখুন:
- নতুন API থেকে HTTP 4xx ও 5xx-এর হার
- Latency-র পরিবর্তন
- আপনার UI যা পড়ে এমন হারানো field
- ফেরি, টোল রাস্তা ও সীমাবদ্ধ এলাকার মতো বিশেষ ক্ষেত্রে route-এর পার্থক্য
ধাপ 4: চালুর আগে load test
আপনার traffic-এ যদি peak থাকে, যেমন কোনো logistics platform-এ সকালের dispatch-এর সময়, তাহলে নতুন API-র ওপর নির্ভর করার আগে peak volume-এর দ্বিগুণে load test করুন।
এখন কী করবেন
- যদি এখনো Heatmap Layer বা Drawing Library load করেন: আগে এগুলো বদলান। Maps JavaScript API-র বর্তমান সংস্করণে এগুলো আর কাজ করে না।
- Routing code পরীক্ষা করুন: DirectionsService, DirectionsRenderer ও DistanceMatrixService-এর প্রতিটি call খুঁজে বের করুন।
- বিকল্প বেছে নিন:
RouteওRouteMatrixclass, Routes API, অথবা অন্য কোনো provider। - একবারে একটি সেবা মাইগ্রেট করুন, feature flag-এর পেছনে, এবং switch-এর আগে ফলাফল তুলনা করুন।
- Google-এর deprecations পেজ নজরে রাখুন, যাতে বন্ধের তারিখ এলে জানতে পারেন। Legacy সেবার জন্য Google অন্তত 12 মাস আগে জানানোর প্রতিশ্রুতি দিয়েছে।
MapAtlas-এর routing API চেষ্টা করতে বিনামূল্যে account খুলুন এবং API documentation পড়ুন। মাইগ্রেশনে সাহায্যের জন্য যোগাযোগ পেজ ব্যবহার করুন।
সাধারণ জিজ্ঞাসা
Google Maps-এর Drawing Library কি এখনো পাওয়া যায়?
না। Google DrawingManager-সহ Drawing Library-কে আগস্ট 2025-এ deprecated ঘোষণা করে, এবং deprecations পেজে লেখা আছে এটি মে 2026 থেকে আর পাওয়া যায় না। Maps JavaScript API-র 3.65.3b সংস্করণের (4 জুন 2026) release notes নিশ্চিত করে যে DrawingManager আর পাওয়া যায় না। Google বিকল্প হিসেবে Terra Draw-এর নাম দেয়।
Heatmap Layer কি এখনো পাওয়া যায়?
না। Google 27 মে 2025-এ Heatmap Layer-কে deprecated ঘোষণা করে, এবং 20 মে 2026-এর 3.65.1c সংস্করণে জানানো হয় যে এটি পুরোপুরি বন্ধ। এর বদলে Google deck.gl-এর HeatmapLayer-এর মতো third-party library ব্যবহারের পরামর্শ দেয়।
DirectionsService ও DistanceMatrixService কবে কাজ করা বন্ধ করবে?
Google কোনো তারিখ ঠিক করেনি। দুটিই 1 মার্চ 2025 থেকে Legacy অবস্থায় এবং 25 ফেব্রুয়ারি 2026 থেকে deprecated। Google-এর release notes অনুযায়ী এগুলো বন্ধের কোনো পরিকল্পনা নেই, গুরুতর regression-এর fix আসতে থাকবে, এবং support শেষ হওয়ার অন্তত 12 মাস আগে জানানো হবে। Legacy সেবা নতুন Cloud project-এ পাওয়া যায় না, তাই নতুন project-এর জন্য Route ও RouteMatrix class বা অন্য কোনো provider লাগবে।
ধাপে ধাপে মাইগ্রেট করা যায়, নাকি সব একসঙ্গে বদলাতে হবে?
একবারে একটি সেবা মাইগ্রেট করা যায়। প্রতিটি deprecated class আলাদা। আগে Drawing Library ও Heatmap Layer বদলান, কারণ এগুলো ইতিমধ্যে কাজ করছে না, তারপর নিজের সময়সূচি অনুযায়ী DirectionsService ও DistanceMatrixService বদলান।
MapAtlas কি মাঝের যাত্রাবিরতি আর একাধিক যাতায়াত মাধ্যম সমর্থন করে?
হ্যাঁ। MapAtlas Directions API অবস্থানের একটি ক্রমানুসারী তালিকা নেয়, তাই প্রথম ও শেষের মাঝের প্রতিটি বিন্দু একটি যাত্রাবিরতি। এটি auto, bicycle, pedestrian, bus, truck, taxi ও motor_scooter costing model সমর্থন করে। এটি একটি REST endpoint, তাই API key যাতে client-এ না পৌঁছায় সেজন্য নিজের backend থেকে call করুন।

