Engineering & Technologyarticle2026-10-14

A GeoAI framework for remote-sensing-driven traffic activity and emission intensity in a data-scarce megacity

Open access0 citations

Abstract

================================================================================FRAMEWORK PIPELINE LOGIC – GeoAI for Traffic Activity & Exposure Mapping================================================================================ This document explains how the six core scripts work together to reconstructtraffic emissions and exposure in Kinshasa, a data‑scarce megacity. The pipeline transforms three primary data sources: - Satellite imagery (Airbus 15 cm) → vehicle counts via YOLOv8 - GTFS transit schedules → bus trajectories, speeds, frequencies - OpenStreetMap + VIIRS night‑time lights → land‑use attraction weights ... into hourly, road‑segment‑level NOx and PM2.5 emission maps. ================================================================================OVERVIEW (STEP‑BY‑STEP)================================================================================ Step 0 – YOLOv8 Vehicle Detection (yolo_kinshasa_powerful.py)────────────────────────────────────────────────────────────────- Input: High‑resolution satellite images (train/val split) with YOLO labels (class: bus / priv).- Output: Trained YOLOv8x model + detection counts on validation images.- Purpose: Establish empirical baseline of vehicle counts and compute the bus‑to‑private vehicle ratio. This ratio later calibrates the gravity model. Step 1 – LLM Semantic Classification (llm_classify_landuse.py)────────────────────────────────────────────────────────────────- Input: Raw OSM land‑use polygons and points (chaotic metadata).- Output: Shapefiles with a standardised "traffic_class" attribute (Residential, Market_Trade, CBD_Admin, etc.).- Purpose: Assign diurnal activity weights to each land‑use category, enabling the gravity model to attract vehicles to different areas depending on time of day (morning, midday, evening, night). Step 2 – GTFS to Bus Traffic (gtfs_to_bus_traffic.py)────────────────────────────────────────────────────────────────- Input: Raw GTFS .txt files (trips, shapes, stop_times, frequencies).- Output: Four interval shapefiles (morn, midday, aftnoon, night) with 1 km segmented bus routes, each containing: - buses_per_hour (frequency) - avg_speed_ms (average speed) - traf_load (vehicle‑hours per hour)- Purpose: Create the deterministic layer of public transit activity. Step 3 – Hub‑and‑Spoke Gravity Model (gravity_model.py)────────────────────────────────────────────────────────────────- Inputs: - LLM‑classified land‑use polygons/points (Step 1) - Night‑time lights raster (economic proxy) - Road network shapefile (1 km segmented, snapped) - YOLO‑derived total private vehicle count (from Step 0 ratio)- Output: Roads_24h_Master.shp with hourly private vehicle volumes (V_00h … V_23h) and daily total (Veh_Day).- Purpose: Distribute the city‑wide private fleet across the road network using a potential‑field approach. Attraction weights vary by time block (Morning, Mid‑Day, Evening, Night) based on LLM categories. NTL radiance acts as a wealth/activity proxy. Step 4 – Speed Simulation (speed_simulation.py)────────────────────────────────────────────────────────────────- Inputs: - Roads_24h_Master.shp (private volumes) - GTFS bus shapefiles (road_traffic_h{hh}.shp, from Step 2)- Output: speed_analysis_h{hh}.shp for each hour, containing: - Est_Speed (estimated private vehicle speed, km/h) - Traf_Load (volume × travel time) - Uncert (combined uncertainty index)- Purpose: For hours 05–21, spatially join each private road segment to the nearest bus‑observed segment. If found, car speed = min(bus_speed × 1.64, speed_limit). If not found, apply city‑wide congestion index to the speed limit. For night hours (22–04), speed = 0.9 × speed limit. Step 5 – Emission Calculation (emission_calculation.py)────────────────────────────────────────────────────────────────- Inputs: - speed_analysis_h{hh}.shp (private speeds & volumes) - road_traffic_h{hh}.shp (bus volumes & speeds)- Output: emiss_priv_h{hh}.shp and emiss_bus_h{hh}.shp with: - EF_NOx, EF_PM25 (speed‑dependent COPERT Tier 3 factors) - E_NOx_g, E_PM25_g (mass emitted per segment, grams) - U_Emiss (propagated uncertainty)- Purpose: Convert traffic activity into chemical mass using: NOx_bus = 372.2/v + 12.8 NOx_priv = 1.54 * v^-0.45 PM2.5_bus = 18.5/v + 0.38 PM2.5_priv = 0.015 (constant, high‑sulfur gasoline) ================================================================================DATA FLOW SUMMARY (WHAT PRODUCES WHAT)================================================================================ Raw OSM → LLM script → LLM‑classified polygons (traffic_class)Raw GTFS → GTFS script → Bus route segments (buses_per_hour, speed)Satellite images → YOLO script → Vehicle counts + bus/priv ratioNTL raster + roads → (direct input to gravity model) LLM polygons + NTL + roads + total private count (from YOLO) → Gravity model → Roads_24h_Master.shp (private V_*h) Roads_24h_Master + bus GTFS shapefiles → Speed simulation → speed_analysis_h*.shp (Est_Speed) speed_analysis + bus GTFS shapefiles → Emission calculation → emiss_priv_h*.shp, emiss_bus_h*.shp ================================================================================KEY ASSUMPTIONS & LIMITATIONS (EMBEDDED IN CODE)================================================================================- Speed multiplier (bus→car): 1.64 (Tétreault & El‑Geneidy, 2010).- Night bus headway = afternoon headway × 0.85 (empirical).- Emission factors: Euro II/III for buses, Euro III/IV for private, with elevated PM2.5 constant for private (0.015 g/km) due to high‑sulfur fuel.- Uncertainty: propagated from YOLO (±15%), speed multiplier variation (±6%), gravity model entropy, and road class risk.- No secondary pollutant formation (ozone, secondary PM) – only primary exhaust. ================================================================================HOW TO VERIFY THE PIPELINE (TEST WITH ONE HOUR)================================================================================1. Run YOLO script → get bus/priv ratio.2. Run LLM script → classify land‑use.3. Run GTFS script → produce bus intervals.4. Run gravity model with total private count = (YOLO priv count) × scaling.5. Run speed simulation for e.g., hour 10.6. Run emission calculation for hour 10.7. Compare emiss_priv_h10 and emiss_bus_h10 outputs with manuscript results. All scripts are designed to run sequentially; each one’s output directoryis hard‑coded as input to the next. Adjust paths in each script to matchyour folder structure. ================================================================================CONTACT================================================================================For questions or to report issues: Ju Wang – wangju@jlu.edu.cn

// Source

View paper (DOI)Open access versionOpenAlexGIScience & Remote SensingPublished 2026-10-14

Authors: Benjamin M. Buhendwa, Chunsheng Victor Fang, Ju Wang

Institutions: Jilin University, Jilin Medical University