Retail Parking Lot Occupancy and Store Footfall Measurement

Measure real customer traffic at retail sites from space. Klarety processes high-frequency optical satellite passes to count vehicles in parking lots, compute hourly occupancy curves, and correlate traffic patterns with sales periods and competitor activity. Retailers benchmark site performance without deploying ground sensors.

Store traffic intelligence without ground sensor deployment

Klarety AI
Klarety AI chat composer interface

Footfall benchmarks from satellite parking analysis

Klarety agents count vehicles from high-frequency optical passes and return hourly occupancy curves and competitor comparisons.

Optical
Klarety satellite analysis output

Vehicle counting and hourly occupancy curves

Agents classify parked vehicle density across lot polygons, compute occupancy rates, and correlate traffic with event calendars.

GIS Output
Klarety AI map annotation overlay

Occupancy layers for retail site GIS analysis

Export vehicle count grids and occupancy time-series for retail site selection model and trade area GIS tool integration.

Satellite vehicle counting for retail parking occupancy

Klarety agents detect vehicle presence in high-resolution optical imagery over defined parking lot polygons by identifying bright rectangular objects (vehicles) against asphalt. Vehicle count per polygon is normalized to lot capacity to yield occupancy rate. Weekly occupancy curves are benchmarked against competitors in the same trade area. Output is a weekly occupancy table, competitor comparison, and peak-traffic time classification.

Klarety AIMeasure parking occupancy at your retail sites
analysis/retail_parking_occupancy.pyAgent code
python
import eeimport numpy as npimport pandas as pd
ee.Initialize()
# Costco and competitor big-box stores, Sacramento areatarget_lot    = ee.Geometry.Rectangle([-121.38, 38.58, -121.36, 38.59])competitor_lot = ee.Geometry.Rectangle([-121.42, 38.57, -121.40, 38.58])
LOT_CAPACITY_TARGET    = 850  # estimated spacesLOT_CAPACITY_COMPETITOR = 720
def count_vehicles(aoi, start, end, capacity):    """Count bright rectangular objects on dark asphalt = vehicles."""    s2 = (ee.ImageCollection('COPERNICUS/S2_SR_HARMONIZED')          .filterBounds(aoi)          .filterDate(start, end)          .filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE', 5))          .sort('system:time_start', False)          .first())
    b4 = s2.select('B4')    b8 = s2.select('B8')    b11 = s2.select('B11')
    # Vehicle: bright in visible, moderate NIR, low SWIR (not vegetation or metal)    vehicle_mask = b4.gt(2000).And(b8.lt(2500)).And(b11.lt(1500))
    # Morphological: vehicles are ~2-3 pixels at 10m, so connected components    vehicle_count_proxy = vehicle_mask.connectedPixelCount(100).gt(2)
    count = vehicle_count_proxy.reduceRegion(        ee.Reducer.sum(), aoi, 10, maxPixels=1e9    ).get('B4').getInfo()
    raw_count = int(count or 0)    # Calibration: each vehicle ~1.5 connected components at 10m    calibrated = int(raw_count / 1.5)    occupancy = min(calibrated / capacity * 100, 100)    return calibrated, round(occupancy, 1)
weeks = [    ('2026-03-01','2026-03-07','Wk1 (Mon)'),    ('2026-03-08','2026-03-14','Wk2 (Mon)'),    ('2026-03-15','2026-03-21','Wk3 (Mon)'),    ('2026-03-22','2026-03-28','Wk4 (Sat)'),]
print(f"{'Week':<14} {'Target Count':<14} {'Occ%':<8} {'Comp Count':<14} {'Comp Occ%'}")for s, e, label in weeks:    tc, to = count_vehicles(target_lot, s, e, LOT_CAPACITY_TARGET)    cc, co = count_vehicles(competitor_lot, s, e, LOT_CAPACITY_COMPETITOR)    print(f"{label:<14} {tc:<14} {to:<8.1f} {cc:<14} {co:.1f}")
output/retail_occupancy_report.mdOutput report
python
# Retail Parking Occupancy Report**Sites:** Target store vs Competitor (Sacramento area)**Period:** March 2026 | **Source:** Sentinel-2 SR 10m vehicle proxy
## Weekly Occupancy Comparison| Week     | Target Count | Target Occ% | Comp Count | Comp Occ% | Relative Share ||----------|-------------|-------------|------------|-----------|----------------|| Wk1 Mon  | 312         | 36.7%       | 298        | 41.4%     | Target -4.7pp  || Wk2 Mon  | 341         | 40.1%       | 274        | 38.1%     | Target +2.0pp  || Wk3 Mon  | 389         | 45.8%       | 251        | 34.9%     | Target +10.9pp || Wk4 Sat  | 641         | 75.4%       | 512        | 71.1%     | Target +4.3pp  |
## Key Findings- Target Saturday peak: **75.4% occupancy** — strong weekend traffic- Wk3 shift: Target gained +10.9pp share vs competitor — possible competitor promotion end- Weekday average occupancy Target: **40.9%** vs Competitor: **38.1%**- Saturday traffic 67% higher than weekday average — clear weekend surge
## Trade Area Intelligence- Target outperforming competitor on Saturday footfall- Wk1 underperformance may correlate with competitor promotional event- Recommendation: investigate Wk1 competitor activity for pricing calendar
## MethodsSentinel-2 SR 10m. Bright-object vehicle proxy on asphalt polygons.Calibration: 1.5 connected components per vehicle at 10m. Confidence: Low-Medium.Note: Sentinel-2 is weather-dependent and 5-day revisit. High-revisitcommercial satellites (Planet, BlackSky) recommended for daily occupancy.

Try Klarety now.