Urban Traffic Congestion Pattern Mapping from Satellites

Identify mobility bottlenecks and peak congestion zones without ground sensors. Klarety fuses optical time-series traffic indicators with road network data to map congestion intensity, temporal patterns, and origin-destination corridors. Planners receive weekly heatmaps to prioritize infrastructure investment decisions.

Congestion mapping for urban infrastructure planners

Klarety AI
Klarety AI chat composer interface

Traffic pattern reports without ground sensor networks

Klarety agents fuse optical satellite data with road networks and return weekly congestion heatmaps by corridor.

Optical
Klarety satellite analysis output

Vehicle density and temporal congestion extraction

Agents compute vehicle density proxies from high-revisit optical passes and classify congestion intensity by time-of-day signature.

GIS Output
Klarety AI map annotation overlay

Congestion layers for urban mobility GIS tools

Export congestion heatmaps and origin-destination flow vectors for urban mobility model and GIS planning platform integration.

Optical vehicle density congestion heatmap generation

Klarety agents detect vehicle presence on road segments from Sentinel-2 and Planet imagery by identifying bright linear features consistent with vehicle density. Vehicle count per road segment is compared against off-peak baselines to classify congestion severity. Output is a weekly road-segment congestion GeoJSON and heatmap raster with peak congestion time classification.

Klarety AIMap traffic congestion in your city
analysis/urban_congestion_heatmap.pyAgent code
python
import eeimport numpy as np
ee.Initialize()
# Bangkok urban core AOIaoi = ee.Geometry.Rectangle([100.4, 13.65, 100.65, 13.85])
def get_vehicle_density(start, end, label):    """Proxy vehicle density from Sentinel-2 road brightness."""    s2 = (ee.ImageCollection('COPERNICUS/S2_SR_HARMONIZED')          .filterBounds(aoi)          .filterDate(start, end)          .filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE', 15))          .sort('system:time_start')          .first())
    b4 = s2.select('B4')    b8 = s2.select('B8')    b3 = s2.select('B3')
    # Road surface: high visible reflectance, low NIR (no vegetation)    road_mask = b4.gt(1500).And(b8.lt(2000)).And(b3.gt(1400))
    # Vehicle density proxy: bright objects on road surface    vehicle_proxy = b4.updateMask(road_mask).gt(2200)    density = vehicle_proxy.focal_mean(3).rename('density')
    mean_density = density.reduceRegion(        ee.Reducer.mean(), aoi, 10, maxPixels=1e9    ).get('density').getInfo()
    return round(mean_density or 0, 4)
# Compare peak hour vs off-peak proxy (different acquisition times)periods = [    ('2026-03-02','2026-03-03','Mon morning'),    ('2026-03-06','2026-03-07','Fri morning'),    ('2026-03-07','2026-03-08','Sat morning'),    ('2026-03-08','2026-03-09','Sun morning'),]
baseline_density = get_vehicle_density('2026-02-01','2026-02-07','baseline')print(f"Baseline density: {baseline_density:.4f}")
for s, e, label in periods:    d = get_vehicle_density(s, e, label)    congestion_idx = d / baseline_density if baseline_density > 0 else 1.0    status = 'Heavy' if congestion_idx>1.4 else ('Moderate' if congestion_idx>1.1 else 'Normal')    print(f"{label:<16}: density={d:.4f}, idx={congestion_idx:.2f}, {status}")
output/urban_congestion_report.mdOutput report
python
# Urban Traffic Congestion Report**City:** Bangkok urban core (100.4-100.65°E, 13.65-13.85°N)**Period:** March 2026 | **Source:** Sentinel-2 SR optical vehicle proxy
## Weekly Congestion Summary| Day        | Density Index | vs Baseline | Status   | Peak Corridors      ||------------|--------------|-------------|----------|---------------------|| Mon AM     | 1.61         | +61%        | Heavy    | Sukhumvit, Rama IV  || Fri AM     | 1.58         | +58%        | Heavy    | Silom, Sathorn      || Sat AM     | 1.18         | +18%        | Moderate | Sukhumvit only      || Sun AM     | 0.94         | -6%         | Normal   | —                   |
## Hotspot Corridors- **Sukhumvit Rd:** Density index 1.81 on weekday mornings — worst corridor- **Rama IV / Silom:** 1.64 on Friday morning — CBD ingress- **Lat Phrao interchange:** 1.42 — suburban bottleneck
## Planning Recommendations- Sukhumvit: priority for BTS extension or dedicated bus corridor- Silom/Sathorn: demand management (staggered office hours, congestion pricing)- Lat Phrao: interchange geometry redesign recommended
## MethodsSentinel-2 SR 10m. Bright-on-road vehicle proxy detection.Congestion index = sample_density / off-peak baseline density.Confidence: Low-Medium (Sentinel-2 resolution limits individual vehicle count).

Try Klarety now.