document.addEventListener('DOMContentLoaded', function() { // Initialize any interactive elements initDemoSimulation(); // Smooth scroll for anchor links document.querySelectorAll('a[href^="#"]').forEach(anchor => { anchor.addEventListener('click', function (e) { e.preventDefault(); document.querySelector(this.getAttribute('href')).scrollIntoView({ behavior: 'smooth' }); }); }); }); async function initTransportSystem() { console.log("Initializing Delhi Metro system..."); try { // Load static GTFS data from GitHub repository const routes = await fetch('https://raw.githubusercontent.com/emote-warrior/GTFSDelhi/main/routes.txt') .then(res => res.text()); const trips = await fetch('https://raw.githubusercontent.com/emote-warrior/GTFSDelhi/main/trips.txt') .then(res => res.text()); const stops = await fetch('https://raw.githubusercontent.com/emote-warrior/GTFSDelhi/main/stops.txt') .then(res => res.text()); // Parse CSV data const routesData = parseCSV(routes); const tripsData = parseCSV(trips); const stopsData = parseCSV(stops); // Process and visualize data visualizeNetwork(routesData, tripsData, stopsData); updateRealTimeStatus(); } catch (error) { console.error('Error loading transport data:', error); document.querySelector('#network-visualization').innerHTML = `
Error loading data. Please try again later.
`; } } function parseCSV(csvText) { const lines = csvText.split('\n'); const headers = lines[0].split(','); const result = []; for (let i = 1; i < lines.length; i++) { if (!lines[i]) continue; const obj = {}; const currentline = lines[i].split(','); for (let j = 0; j < headers.length; j++) { obj[headers[j]] = currentline[j]; } result.push(obj); } return result; } let map; let routeLayers = {}; let stopMarkers = {}; let tripLines = {}; function visualizeNetwork(routes, trips, stops) { // Initialize map centered on Delhi map = L.map('network-visualization').setView([28.6139, 77.2090], 12); // Add base tile layer L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', { attribution: '© OpenStreetMap contributors' }).addTo(map); // Process stops data (need to convert stop_lat/stop_lon to numbers) stops.forEach(stop => { stop.stop_lat = parseFloat(stop.stop_lat); stop.stop_lon = parseFloat(stop.stop_lon); }); // Group stops by route (simplified - in real app you'd use trips.txt and stop_times.txt) const stopsByRoute = {}; routes.forEach(route => { stopsByRoute[route.route_id] = stops.slice(0, 10); // Just show first 10 stops per route for demo }); // Create route layers routes.forEach(route => { const routeStops = stopsByRoute[route.route_id] || []; const routeCoordinates = routeStops.map(stop => [stop.stop_lat, stop.stop_lon]); routeLayers[route.route_id] = L.polyline(routeCoordinates, { color: `#${route.route_color || '333'}`, weight: 5, opacity: 0.7 }).bindPopup(`${route.route_long_name}