ट्रैकिंग मैप किसी भी फूड डिलीवरी या राइडशेयर ऐप का सबसे अधिक एनगेज होने वाला स्क्रीन है। यह वह है जो ग्राहक प्रतीक्षा करते समय देखते हैं। इसे सही तरीके से करना, सुगम गति, सटीक ETA, एक स्पष्ट रूट लाइन, एक पेशेवर महसूस करने वाले ऐप और अविश्वसनीय महसूस करने वाले ऐप के बीच का अंतर है।
यह ट्यूटोरियल ग्राहक-सामना करने वाले ट्रैकिंग मैप को पहले सिद्धांतों से बनाता है: एक बैकएंड जो WebSocket के माध्यम से GPS पोजीशन को प्रसारित करता है, एक फ्रंटएंड जो उन्हें प्राप्त करता है और एक ड्राइवर मार्कर को बिना कूदे चलाता है, MapAtlas Routing API से एक रूट लाइन, और एक लाइव ETA डिस्प्ले। संपूर्ण कार्यान्वयन 70 लाइनों से कम क्लाइंट-साइड JavaScript है, जिसे किसी भी बैकएंड के साथ एकीकृत करने के लिए डिज़ाइन किया गया है जो WebSocket संदेश भेज सकता है।
यह आर्किटेक्चर फूड डिलीवरी, किराना, राइडशेयर, फील्ड सर्विस, और किसी भी अन्य उपयोग के मामले के लिए काम करता है जहां एक वाहन एक निश्चित गंतव्य की ओर चलता है और एक ग्राहक इसे वास्तविक समय में घटते हुए देखता है।
आर्किटेक्चर ओवरव्यू
कोड लिखने से पहले, डेटा फ्लो को समझना मदद करता है:
- ड्राइवर ऐप (मोबाइल, GPS हार्डवेयर) हर 3-5 सेकंड में अपने बैकएंड को अक्षांश/देशांतर भेजता है।
- बैकएंड (Node.js, Python, Go, आपकी पसंद) अंतिम ज्ञात स्थिति को बनाए रखता है और इसे WebSocket के माध्यम से सभी जुड़े ऑर्डर सब्सक्राइबर को प्रसारित करता है।
- ग्राहक ब्राउज़र WebSocket संदेश प्राप्त करता है और इंटरपोलेटेड एनिमेशन का उपयोग करके मैप पर एक मार्कर चलाता है।
- Routing API को ऑर्डर बनाने के समय एक बार कॉल किया जाता है ताकि नियोजित रूट प्राप्त किया जा सके। डिकोड किए गए पॉलीलाइन को एक लाइन लेयर के रूप में प्रदर्शित किया जाता है।
- ETA को शेष दूरी की औसत गति से तुलना करके पुनः गणना की जाती है, या ड्राइवर की वर्तमान स्थिति से Routing API को फिर से कॉल करके।
बैकएंड कार्यान्वयन इस ट्यूटोरियल के दायरे से बाहर है, लेकिन कोई भी WebSocket सर्वर जो इस प्रारूप में संदेश भेजता है वह नीचे दिए गए फ्रंटएंड कोड के साथ काम करता है:
{
"type": "position_update",
"orderId": "order-8821",
"lat": 52.3741,
"lng": 4.8952,
"heading": 92,
"speed": 28,
"timestamp": 1738234521000
}
चरण 1: मैप आरंभीकरण
डिलीवरी उत्पत्ति पर केंद्रित मैप सेट करें। Routing API कॉल चरण 4 में होता है, इसलिए अभी के लिए बस कैनवास को शुरू करें।
import mapmetricsgl from '@mapmetrics/mapmetrics-gl';
import '@mapmetrics/mapmetrics-gl/dist/mapmetrics-gl.css';
const map = new mapmetricsgl.Map({
container: 'tracking-map',
style: 'https://tiles.mapatlas.eu/styles/basic/style.json?key=YOUR_API_KEY',
center: [4.9041, 52.3676],
zoom: 14
});
// Destination marker (restaurant or pickup point)
const destination = [4.9001, 52.3791];
new mapmetricsgl.Marker({ color: '#EF4444' })
.setLngLat(destination)
.setPopup(new mapmetricsgl.Popup().setHTML('<strong>Pickup point</strong>'))
.addTo(map);
चरण 2: शीर्षक घुमाव के साथ ड्राइवर मार्कर
ड्राइवर मार्कर को अलग से बनाएं ताकि आप प्रत्येक GPS पिंग पर इसकी स्थिति को अपडेट कर सकें। एक कस्टम HTML एलिमेंट आपको मार्कर आइकन को ड्राइवर की दिशा को प्रतिबिंबित करने के लिए घुमाने देता है, एक छोटी सी विस्तार जो ट्रैकिंग को बहुत अधिक यथार्थवादी बनाती है।
// Custom element so we can rotate it
const driverEl = document.createElement('div');
driverEl.innerHTML = '🚗';
driverEl.style.cssText = 'font-size:28px;transform-origin:center;transition:transform 0.3s';
const driverMarker = new mapmetricsgl.Marker({ element: driverEl, anchor: 'center' })
.setLngLat([4.9041, 52.3676])
.addTo(map);
function setDriverHeading(heading) {
driverEl.style.transform = `rotate(${heading}deg)`;
}
चरण 3: WebSocket कनेक्शन और सुगम इंटरपोलेशन
यह ट्रैकिंग मैप का मूल है। WebSocket से कनेक्ट करना एक लाइन है; दिलचस्प हिस्सा GPS पिंग के बीच मार्कर स्थिति को इंटरपोलेट करना है ताकि यह टेलीपोर्ट करने के बजाय सुगमता से स्लाइड हो।
let prevPos = null; // { lat, lng }
let animFrame = null;
function interpolateMarker(fromLat, fromLng, toLat, toLng, durationMs) {
const startTime = performance.now();
function step(now) {
const elapsed = now - startTime;
const t = Math.min(elapsed / durationMs, 1); // 0 → 1
const lat = fromLat + (toLat - fromLat) * t;
const lng = fromLng + (toLng - fromLng) * t;
driverMarker.setLngLat([lng, lat]);
if (t < 1) {
animFrame = requestAnimationFrame(step);
}
}
if (animFrame) cancelAnimationFrame(animFrame);
animFrame = requestAnimationFrame(step);
}
const ws = new WebSocket('wss://your-backend.example.com/track/order-8821');
ws.addEventListener('message', (event) => {
const msg = JSON.parse(event.data);
if (msg.type !== 'position_update') return;
const { lat, lng, heading } = msg;
if (prevPos) {
// Smooth animation from previous to new position
interpolateMarker(prevPos.lat, prevPos.lng, lat, lng, 400);
} else {
// First ping, place marker immediately
driverMarker.setLngLat([lng, lat]);
map.flyTo({ center: [lng, lat], zoom: 15 });
}
setDriverHeading(heading);
updateETA(lat, lng);
prevPos = { lat, lng };
});
ws.addEventListener('close', () => {
console.log('Driver has arrived or connection closed.');
});
400ms इंटरपोलेशन विंडो 3-5 सेकंड के विशिष्ट GPS पिंग अंतराल के साथ काफी अच्छी तरह मेल खाती है, मार्कर हमेशा वास्तविकता से थोड़ा पीछे रहता है लेकिन कभी ध्यान से नहीं कूदता।
चरण 4: Routing API से नियोजित रूट को ड्रा करें
ऑर्डर असाइन होने पर पूरा रूट प्राप्त करें। पॉलीलाइन निर्देशांक स्टोर करें और उन्हें GeoJSON लाइन लेयर के रूप में ड्रा करें। Route Optimization API ट्यूटोरियल मल्टी-स्टॉप परिदृश्य को कवर करता है; एक सरल A-to-B डिलीवरी के लिए अनुरोध सीधा है।
async function fetchAndDrawRoute(originLat, originLng, destLat, destLng) {
const url = new URL('https://api.mapatlas.eu/v1/routing/route');
url.searchParams.set('origin', `${originLat},${originLng}`);
url.searchParams.set('destination', `${destLat},${destLng}`);
url.searchParams.set('profile', 'driving');
url.searchParams.set('key', 'YOUR_API_KEY');
const res = await fetch(url);
const data = await res.json();
if (!data.routes?.length) return;
const route = data.routes[0];
map.on('load', () => {
map.addSource('route', {
type: 'geojson',
data: {
type: 'Feature',
geometry: route.geometry // GeoJSON LineString
}
});
map.addLayer({
id: 'route-line',
type: 'line',
source: 'route',
layout: { 'line-join': 'round', 'line-cap': 'round' },
paint: {
'line-color': '#3B82F6',
'line-width': 4,
'line-opacity': 0.8
}
});
});
return route.duration; // seconds
}
चरण 5: ETA गणना और डिस्प्ले
ड्राइवर की वर्तमान स्थिति की गंतव्य से तुलना करके ETA की गणना करें। उच्च सटीकता के लिए, ताजी यात्रा समय अनुमान प्राप्त करने के लिए हर 30 सेकंड में ड्राइवर की वर्तमान स्थिति से Routing API को फिर से कॉल करें।
function haversineKm(lat1, lon1, lat2, lon2) {
const R = 6371;
const dLat = ((lat2 - lat1) * Math.PI) / 180;
const dLon = ((lon2 - lon1) * Math.PI) / 180;
const a = Math.sin(dLat / 2) ** 2 +
Math.cos((lat1 * Math.PI) / 180) *
Math.cos((lat2 * Math.PI) / 180) *
Math.sin(dLon / 2) ** 2;
return R * 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
}
let lastRouteFetch = 0;
async function updateETA(driverLat, driverLng) {
const [destLng, destLat] = destination;
const distKm = haversineKm(driverLat, driverLng, destLat, destLng);
// Fast client-side estimate (assume 30 km/h urban average)
const minutesEstimate = Math.ceil((distKm / 30) * 60);
document.getElementById('eta').textContent =
distKm < 0.1
? 'Arriving now'
: `ETA: ${minutesEstimate} min (${distKm.toFixed(1)} km)`;
// Re-fetch from Routing API every 30 seconds for accuracy
const now = Date.now();
if (now - lastRouteFetch > 30_000) {
lastRouteFetch = now;
const url = new URL('https://api.mapatlas.eu/v1/routing/route');
url.searchParams.set('origin', `${driverLat},${driverLng}`);
url.searchParams.set('destination', `${destLat},${destLng}`);
url.searchParams.set('profile', 'driving');
url.searchParams.set('key', 'YOUR_API_KEY');
const res = await fetch(url);
const data = await res.json();
if (data.routes?.length) {
const mins = Math.ceil(data.routes[0].duration / 60);
document.getElementById('eta').textContent = `ETA: ${mins} min`;
}
}
}
ड्राइवर ट्रैकिंग के लिए GDPR विचार
ड्राइवर GPS निर्देशांक GDPR अनुच्छेद 4(1) के तहत व्यक्तिगत डेटा हैं। EU फूड डिलीवरी और राइडशेयर प्लेटफॉर्म को इस बिंदु पर नियंत्रित करने वाले नियम अस्पष्ट नहीं हैं:
डेटा न्यूनतमीकरण: केवल उन्हीं क्षेत्रों को ट्रैक करें जिनकी आपको डिस्पैच के लिए आवश्यकता है, स्थिति, दिशा, गति। परिचालनात्मक रूप से आवश्यक से अधिक raw GPS इतिहास को लॉग न करें।
प्रतिधारण सीमा: दानेदार ट्रिप ट्रैकिंग डेटा को ऑर्डर पूरा होने के बाद हटा दिया जाना चाहिए या अपरिवर्तनीय रूप से अनाम किया जाना चाहिए। नेटवर्क अनुकूलन के लिए समग्र रूट डेटा (किसी व्यक्तिगत ड्राइवर से जुड़े बिना) अधिक समय तक बनाए रखा जा सकता है।
कानूनी आधार: अनुच्छेद 6(1)(f) के तहत वैध हित रीयल-टाइम डिस्पैच ट्रैकिंग को कवर करता है। ट्रैकिंग डेटा के किसी भी माध्यमिक उपयोग (विश्लेषण, बेंचमार्किंग) के लिए, आपको एक अलग आधार दस्तावेज़ करने की आवश्यकता है।
ड्राइवर पारदर्शिता: ड्राइवर ऑनबोर्डिंग में स्पष्ट ट्रैकिंग प्रकटीकरण शामिल करें। ड्राइवर को बताया जाना चाहिए कि क्या एकत्र किया जाता है, यह कितने समय तक बनाए रखा जाता है, और इसे कौन एक्सेस कर सकता है।
डेटा निवास: MapAtlas सभी API अनुरोधों को EU के भीतर संसाधित करता है। यह तीसरे देश के हस्तांतरण की चिंता को समाप्त करता है जो US-आधारित मैपिंग प्रदाताओं के साथ उत्पन्न होती है। संपूर्ण अनुपालन चित्र के लिए EU Developer's Guide to GDPR-Compliant Map APIs देखें।
राइडशेयरिंग और गतिशीलता उद्योग उपयोग के मामले के लिए विशेष रूप से, MapAtlas मानक के रूप में DPA दस्तावेजीकरण और EU सर्वर गारंटी शामिल करता है। लॉजिस्टिक्स और डिलीवरी उद्योग पृष्ठ फ्लीट और मल्टी-ड्राइवर परिदृश्य को कवर करता है।
उत्पादन कठोरीकरण
ग्राहकों को ट्रैकिंग फीचर भेजने से पहले, ये आइटम जांचें:
- WebSocket पुनः कनेक्शन:
ws.addEventListener('close', reconnect)जोड़ें घातीय बैकऑफ के साथ। मोबाइल नेटवर्क अक्सर कनेक्शन छोड़ते हैं। - स्टेल पोजीशन हैंडलिंग: यदि 15 सेकंड में कोई अपडेट नहीं आता है, तो अंतिम स्थिति को दृश्यमान रखने के बजाय एक "locating driver" स्थिति दिखाएं।
- आगमन पहचान: जब
distKm < 0.1, एक "आ गया" स्थिति ट्रिगर करें, WebSocket को बंद करें, और एक पुष्टिकरण स्क्रीन दिखाएं। - कैमरा ड्राइवर का अनुसरण करता है: प्रत्येक पोजीशन अपडेट पर
map.panTo([lng, lat])कॉल करें ड्राइवर को केंद्रित रखने के लिए। उपयोगकर्ताओं को एक "लॉक" टॉगल दें अनुसरण मोड को अक्षम करने के लिए यदि वे मैप की खोज करना चाहते हैं।
अगले कदम
- अपनी मुफ्त MapAtlas API कुंजी के लिए साइन अप करें और निर्माण शुरू करें
- अपनी डिलीवरी ऐप में मल्टी-स्टॉप डिस्पैच जोड़ने के लिए Route Optimization API ट्यूटोरियल पढ़ें
- गतिशील, डेटा-संचालित मैप लेयर्स के एक और उदाहरण के लिए Real Estate Property Map ट्यूटोरियल देखें
Frequently Asked Questions
How do I show a driver's location moving smoothly on a map?
GPS pings arrive every few seconds, creating visible jumps if you update the marker position directly. Smooth interpolation animates the marker between the previous position and the new one over a short duration (300–500ms), using requestAnimationFrame to move the marker in small increments. This gives the appearance of continuous movement even with infrequent GPS updates.
Is driver location data subject to GDPR?
Yes. A driver's real-time GPS coordinates are personal data under GDPR Article 4. EU food delivery and rideshare platforms must minimise retention, tracking data should be deleted or anonymised once the trip is complete. Processing requires a legal basis and must be disclosed in the driver's privacy notice.
Can I use the MapAtlas Routing API to show the planned route on the tracking map?
Yes. Fetch the route from the Routing API when a trip is created, decode the polyline, and add it as a GeoJSON line layer on the map. As the driver moves, you can optionally re-fetch the route from the current position to recalculate the ETA dynamically.
