535
536 // --- flights.geojson: flights only (no trains, buses, cars) ---
537 var flightSegments = allSegments.filter(function(s) { return isFlightMode(s.mode) })
538 var flightFeatures = []
539 var flightStops = {} // name → { coord, transitCount, totalCount }
539 var flightStops = {} // name → { coord, transitCount, totalCount, trips }
540 for (var i = 0; i < flightSegments.length; i++) {
541 var seg = flightSegments[i]
542 var isTransitSeg = seg.mode.toLowerCase().indexOf('transit') !== -1
543 flightFeatures.push({
547 from: seg.from, to: seg.to, date: seg.date, mode: seg.mode, trip: seg.trip,
548 },
549 geometry: { type: 'LineString', coordinates: flightCoordinates(seg.fromCoord, seg.toCoord) },
550 })
551 if (!flightStops[seg.from]) flightStops[seg.from] = { coord: seg.fromCoord, transitCount: 0, totalCount: 0 }
552 if (!flightStops[seg.to]) flightStops[seg.to] = { coord: seg.toCoord, transitCount: 0, totalCount: 0 }
551 if (!flightStops[seg.from]) flightStops[seg.from] = { coord: seg.fromCoord, transitCount: 0, totalCount: 0, trips: {} }
552 if (!flightStops[seg.to]) flightStops[seg.to] = { coord: seg.toCoord, transitCount: 0, totalCount: 0, trips: {} }
553 flightStops[seg.from].totalCount++
554 flightStops[seg.to].totalCount++
555 // track trips per airport (keyed by trip filename to deduplicate)
556 if (seg.trip && !flightStops[seg.from].trips[seg.trip]) flightStops[seg.from].trips[seg.trip] = seg.date || ''
557 if (seg.trip && !flightStops[seg.to].trips[seg.trip]) flightStops[seg.to].trips[seg.trip] = seg.date || ''
558 if (isTransitSeg) { flightStops[seg.from].transitCount++; flightStops[seg.to].transitCount++ }
559 }
560 var flightStopNames = Object.keys(flightStops)
561 for (var i = 0; i < flightStopNames.length; i++) {
562 var st = flightStops[flightStopNames[i]]
563 var isTransit = st.transitCount === st.totalCount && st.totalCount > 0
564 // build trips array from collected trip map
565 var stopTrips = []
566 var tripFiles = Object.keys(st.trips)
567 for (var j = 0; j < tripFiles.length; j++) {
568 var tf = tripFiles[j]
569 var tripTitle = tf.replace(/\.md$/, '').replace(/-/g, ' ').replace(/\b\w/g, function(c) { return c.toUpperCase() })
570 stopTrips.push({ file: tf, title: tripTitle, date: st.trips[tf] })
571 }
572 // sort by date descending
573 stopTrips.sort(function(a, b) { return b.date.localeCompare(a.date) })
574 flightFeatures.push({
575 type: 'Feature',
563 properties: { layer: 'stop', name: flightStopNames[i], transit: isTransit },
576 properties: { layer: 'stop', name: flightStopNames[i], transit: isTransit, visitCount: stopTrips.length, trips: stopTrips },
577 geometry: { type: 'Point', coordinates: st.coord },
578 })
579 }
580 try {