Learning Report: Al Karama Urban Climate Analysis

Location: Al Karama, Dubai, UAE
Purpose: Understand urban heat, vegetation, and pedestrian comfort using freely available data
Date: February 2026

Table of Contents

1. Project Overview

What We Did

We analyzed the urban climate and pedestrian comfort of Al Karama district using two complementary data sources:

  1. Street View Images (Mapillary) - Ground-level perspective of what pedestrians see
  2. Satellite Imagery (Landsat, Sentinel-2) - Bird's eye view of temperature and vegetation
┌─────────────────────────────────────────────────────────────┐
│                    DATA SOURCES                              │
├─────────────────────────┬───────────────────────────────────┤
│   STREET VIEW           │         SATELLITE                 │
│   (Mapillary)           │    (Landsat + Sentinel-2)         │
│                         │                                   │
│   • 11,651 images       │    • 90,300 grid cells            │
│   • Ground-level view   │    • 10m resolution               │
│   • What pedestrians    │    • Temperature (LST)            │
│     actually see        │    • Vegetation (NDVI)            │
└────────────┬────────────┴─────────────────┬─────────────────┘
             │                              │
             ▼                              ▼
┌─────────────────────────┐    ┌─────────────────────────────┐
│  Green View Index (GVI) │    │  Land Surface Temp (LST)    │
│  Sky View Factor (SVF)  │    │  Vegetation Index (NDVI)    │
│                         │    │  Built-up Index (NDBI)      │
└────────────┬────────────┘    └─────────────────┬───────────┘
             │                                   │
             └─────────────┬─────────────────────┘
                           ▼
              ┌─────────────────────────┐
              │   COMBINED ANALYSIS     │
              │  • Heat Mitigation      │
              │  • Pedestrian Comfort   │
              │  • Network Centrality   │
              │  • Climate Clusters     │
              └─────────────────────────┘
        

Why This Matters

Urban heat is a major issue in Dubai. By identifying where heat stress is worst and where interventions would help the most people, planners can make better decisions about:

2. Data Sources

2.1 Mapillary Street View Images

PropertyValue
SourceMapillary (crowdsourced street imagery)
Images downloaded11,651
CoverageAl Karama district boundary
CostFree (API access)
Tool usedZenSVI Python library
# How we downloaded images from zensvi.download import MLYDownloader mly = MLYDownloader(log_path="logs") mly.download_svi( dir_output="data/mapillary_svi", input_shp="data/al_karama.geojson", lat=None, lon=None, id_columns=None )

2.2 Satellite Imagery

See the full interactive analysis: Satellite Analysis Report

SatelliteDataSeasonDate RangeResolutionUse
Landsat 8/9Thermal infraredSummer 2025Jun–Sep 202530m (100m native)Land Surface Temperature
Landsat 8/9Thermal infraredWinter 2025/26Dec 2025–Feb 202630m (100m native)Land Surface Temperature
Sentinel-2MultispectralSummer 2025Jun–Sep 202510mNDVI, NDBI vegetation/built-up
Sentinel-2MultispectralWinter 2025/26Dec 2025–Feb 202610mNDVI, NDBI vegetation/built-up
GHSL (JRC)Built-up height classes & continuous heights2018 (P2023A release)10m / 100mBuilding height estimation
Google Earth Engine (GEE): We used GEE to access and process satellite data. It's free for research/academic use. You need to register at earthengine.google.com. GEE also hosts the JRC Global Human Settlement Layer (GHSL), which provides satellite-derived building height data globally. We used the GHSL Built-C (10m categorical height classes) and Built-H (100m continuous heights) datasets to fill in the majority of building heights that were missing from OpenStreetMap (see Section 5).
Seasonal satellite analysis: Both Landsat and Sentinel-2 are filtered per season — summer 2025 (Jun–Sep) and winter 2025/26 (Dec–Feb) — so that all satellite indices reflect the same time window. Filtering by season (vs. a full-year composite) is important because vegetation indices like NDVI are season-dependent, and comparing summer vs. winter reveals how the urban heat island effect shifts with solar geometry. The viewers include a season dropdown to switch between summer and winter data.

2.3 OpenStreetMap

DataCountUse
Buildings3,2433D visualization, height data
Street network5,975 edgesCentrality analysis
Points of Interest1,290Amenity overlay on 3D shade map

2.4 Overpass API (Points of Interest)

PropertyValue
SourceOverpass API (OpenStreetMap query interface)
Query areaAl Karama bounding box (25.238–25.259°N, 55.292–55.313°E)
OSM tags queriedamenity, shop, tourism, office, leisure, healthcare
Raw elements returned1,419
After noise filtering1,290
Categories8 (Food, Shopping, Hotel, Health, Religious, Services, Leisure, Education)
CostFree (public API, rate-limited)
Cachingpois_cache.json — avoids repeat API calls on re-run
Noise filtering: 18 OSM types are excluded as "urban furniture" that would clutter the map: bench, waste_basket, parking, shelter, bollard, fire_hydrant, street_lamp, etc. This reduces the raw 1,419 elements to 1,290 meaningful PoIs.

3. Street View Analysis

3.1 Green View Index (GVI)

What it measures: The percentage of green pixels (vegetation) visible in a street view image.

GVI = (Green pixels in image) / (Total pixels in image) × 100%

How it's calculated:

  1. Take a street view image
  2. Convert to a color space that separates green vegetation
  3. Use a vegetation index formula to identify green pixels
  4. Count the percentage of green pixels
Al Karama Result: Mean GVI = 3.55%
This is very low - most streets have minimal visible vegetation.
View GVI on 2D Viewer →

3.2 Sky View Factor (SVF)

What it measures: The percentage of sky visible from a point on the street. Lower SVF = more shading from buildings/trees.

SVF = (Sky pixels in image) / (Total pixels in upper hemisphere) × 100%

Interpretation:

Al Karama Result: Mean SVF = 31.4%
Moderate sky exposure - some shading from buildings but not dense urban canyon.
View SVF on 2D Viewer →

Note: Monocular depth estimation was explored but not adopted in the final analysis. See Appendix A: Unused Methodology — Depth Estimation for details.

4. Satellite Analysis

4.1 Land Surface Temperature (LST)

What it measures: The temperature of the ground/surface as seen from space.

Important: LST is NOT air temperature. It measures how hot surfaces (roads, buildings, sand) are. LST is typically higher than air temperature during the day.

How it's calculated from Landsat:

LST = Brightness Temperature / (1 + (λ × BT / ρ) × ln(ε)) Where: λ = wavelength of thermal band (10.8 μm) BT = brightness temperature from satellite ρ = h × c / σ (Planck's constant × speed of light / Boltzmann) ε = surface emissivity (assumed 0.95 for urban areas)
Al Karama Result:
Mean LST = 48.3°C (summer)
Range: 36°C to 55°C
The 18°C variation shows some areas are significantly cooler (likely parks/vegetation).
View LST on 2D Viewer →

4.2 NDVI (Normalized Difference Vegetation Index)

What it measures: Vegetation health/density from satellite perspective.

NDVI = (NIR - Red) / (NIR + Red) Where: NIR = Near-infrared reflectance (Sentinel-2 Band 8) Red = Red reflectance (Sentinel-2 Band 4)

Interpretation:

NDVI ValueMeaning
-1.0 to 0Water, bare soil, buildings
0 to 0.2Sparse vegetation, dry grass
0.2 to 0.4Moderate vegetation
0.4 to 0.6Dense vegetation
0.6 to 1.0Very dense, healthy vegetation
Al Karama Result: Mean NDVI = 0.096
Very low - mostly built-up with sparse vegetation.
View NDVI on 2D Viewer →

4.3 NDBI (Normalized Difference Built-up Index)

What it measures: Built-up/urban density.

NDBI = (SWIR - NIR) / (SWIR + NIR) Where: SWIR = Short-wave infrared (Sentinel-2 Band 11) NIR = Near-infrared (Sentinel-2 Band 8)

High NDBI = more buildings/concrete. Low NDBI = vegetation or water.

View NDBI on 2D Viewer →

4.4 Thermal Sharpening (30m → 10m)

What it does: Downscales coarse Landsat thermal data (30m) to match Sentinel-2 resolution (10m) using the correlation between temperature and vegetation.

Why it's needed: Landsat thermal bands have 100m native resolution (resampled to 30m). For detailed urban analysis, we want finer resolution to see temperature variations at street level.

Method: Linear regression of LST vs NDVI at 30m → Apply model to 10m NDVI 1. Sample both LST (30m) and NDVI (10m aggregated to 30m) at random points 2. Fit regression: LST = a + b × NDVI 3. Apply to 10m NDVI: LST_10m = a + b × NDVI_10m 4. Add residuals from nearest 30m pixel for local calibration
Al Karama Result:
Regression: LST = 49.02 + (-3.66 × NDVI)
R² = 0.045 (weak correlation)
RMSE = 0.32°C (difference between 30m and 10m)

Note: Weak R² is expected in urban areas where impervious surfaces dominate. The method works better in areas with more vegetation variation.

5. Building Height Enhancement (GEE)

5.1 The Problem

OpenStreetMap provides building footprints for Al Karama (3,243 buildings), but only 78 buildings (2.4%) have real height data. The remaining 3,165 buildings default to 9m (assumed 3 floors), which produces an unrealistic 3D model where most buildings appear the same height.

Goal: Use freely available global datasets from Google Earth Engine to estimate building heights for the 97.6% of buildings missing real data.

5.2 Datasets Evaluated

We tested multiple GEE datasets for coverage over Dubai/Al Karama:

DatasetResolutionCoverageWhat it provides
Open Buildings 2.5D Temporal~2.5mNot available (0 images)Would have had individual building heights
GHSL Built-C10m84,182 pixelsHeight classes (categorical)
GHSL Built-H100m883 pixelsContinuous heights (meters)
nDSM (ALOS-SRTM)30m10,416 pixelsSurface model difference

5.3 GHSL Built-C (10m) - Height Classes

Source: JRC Global Human Settlement Layer (GHSL), 2018 epoch

Collection: JRC/GHSL/P2023A/GHS_BUILT_C/2018

This dataset classifies built-up areas into height bands at 10m resolution. Each pixel encodes both building type (residential, non-residential, mixed) and height class:

Height ClassRangeMidpoint Used
1≤3m3.0m
23-6m4.5m
36-15m10.5m
415-30m22.5m
5>30m45.0m

Method: For each OSM building polygon, we used reduceRegions with a mode reducer to extract the dominant height class within the footprint, then converted to the midpoint height.

# Extract height class per building polygon image = ee.Image("JRC/GHSL/P2023A/GHS_BUILT_C/2018") band = image.select('built_characteristics') reduced = band.reduceRegions( collection=building_polygons, reducer=ee.Reducer.mode(), scale=10, ) # Convert class to height: height_band = class_value % 10 # Then map to midpoint heights

5.4 GHSL Built-H (100m) - Continuous Heights

Collection: JRC/GHSL/P2023A/GHS_BUILT_H/2018

Provides continuous building height estimates in meters at 100m resolution. Less spatial detail but gives actual meter values rather than classes.

Method: reduceRegions with mean reducer per building polygon.

Limitation: GHSL Built-H caps at ~40m for this area (mean 13.5m). Al Karama has buildings taller than 40m, so GHSL may underestimate the tallest buildings. OSM real heights (up to 230m) are preserved where available.

5.5 nDSM: Normalized Digital Surface Model (30m)

What it is: The difference between a Digital Surface Model (DSM, which includes buildings/trees) and a Digital Elevation Model (DEM, bare ground only).

nDSM = DSM - DEM Where: DSM = ALOS AW3D30 (JAXA, 2006-2011, 30m resolution) DEM = SRTM (NASA, 2000, 30m resolution)

Positive nDSM values indicate above-ground structures (buildings, trees). However, this approach is noisy because the two datasets were acquired years apart (2000 vs 2006-2011), and both have their own measurement uncertainties.

Limitation: The temporal mismatch between SRTM (2000) and ALOS (2006-2011) means buildings constructed between these dates will appear in the nDSM, but pre-existing terrain changes or demolitions can produce artifacts. We applied a threshold of >2m to filter out noise.

5.6 Priority Merge System

We merged heights from all sources using a priority system that preserves the most reliable data:

PrioritySourceResolutionRationale
1 (highest)OSM real height (≠9m)IndividualSurveyed or mapped by contributors
2GHSL Built-C10mBest spatial resolution, height classes
3GHSL Built-H100mContinuous values but coarser
4nDSM30mNoisy but independent measurement
5 (lowest)Defaultn/aKeep 9m assumption

5.7 Results

Coverage improved from 2.4% to 99.5%:
SourceBuildingsPercentage
OSM real height782.4%
GHSL Built-C (10m)3,05594.2%
GHSL Built-H (100m)802.5%
nDSM (30m)140.4%
Default (9m)160.5%
Total with data3,22799.5%

GHSL Built-C dominated because its 10m resolution matches well with building footprint sizes, and it had near-complete coverage of the study area. The 3D visualization now includes a "Color by Source" toggle to show which dataset provided each building's height.

Height distribution by source:
OSM real: 6-230m (median 36m) - includes known tall buildings
GHSL Built-C: 3-45m (median 10.5m) - 5 height classes
GHSL Built-H: 2.5-33.7m (median 10.3m) - continuous
nDSM: 2.7-10.8m (median 4.0m) - low-rise buildings only

6. Combined Analysis

6.1 Heat Mitigation Priority

Goal: Identify locations where interventions (tree planting, shade) would have the most impact.

Method: Combine multiple factors into a priority score:

Priority Score = 0.40 × LST_normalized + 0.25 × (1 - GVI_normalized) [low greenery = high priority] + 0.20 × (1 - NDVI_normalized) [low vegetation = high priority] + 0.15 × SVF_normalized [high exposure = high priority]
Result (varies by season):
Season Critical High Total Intervention
Summer 2025 16.3% 67.4% 83.7%
Winter 2025 26.5% 58.6% 85.1%
Priority scores now use seasonal LST data, so the map updates when you switch seasons in the viewer.
View Heat Priority on 2D Viewer →

6.2 Pedestrian Comfort Index (PCI)

Goal: Rate streets by walking comfort.

PCI = 0.40 × Temperature_comfort (inverse of LST) + 0.35 × Shade (1 - SVF) + 0.25 × Vegetation_comfort (GVI)

Interpretation:

PCIComfort Level
> 0.6Very Comfortable
0.45 - 0.6Comfortable
0.3 - 0.45Moderate
< 0.3Uncomfortable
Result: Only 29% of streets are comfortable for pedestrians.
View Pedestrian Comfort on 2D Viewer →

7. Network Analysis

7.1 What is Network Centrality?

Network analysis treats streets as a graph (nodes = intersections, edges = street segments) to understand which streets are most important for movement.

7.2 Betweenness Centrality

What it measures: How often a street lies on the shortest path between other locations.

Betweenness(v) = Σ (σst(v) / σst) Where: σst = total number of shortest paths from node s to node t σst(v) = number of those paths that pass through v

Interpretation: High betweenness = many people pass through this street to get from A to B. These are main corridors.

View Betweenness on 2D Viewer →

7.3 Closeness Centrality

What it measures: How close (accessible) a location is to all other locations.

Closeness(v) = (n-1) / Σ d(v,u) Where: n = number of nodes d(v,u) = shortest path distance from v to u

Interpretation: High closeness = easy to reach from anywhere. Central, accessible locations.

View Closeness on 2D Viewer →

7.4 Intervention Priority

We combined centrality with comfort to find streets where improvements help the most people:

Intervention Priority = Centrality × (1 - Comfort) High priority = busy street that is uncomfortable
Result: 51 streets identified as high priority - heavily used but uncomfortable.

7.5 Edge Effects

Important caveat: Centrality calculations are affected by study area boundaries. Streets at the edge appear less important because paths can't continue beyond our boundary. We addressed this by expanding the analysis area (+500m buffer) and then clipping results back to Al Karama.

8. Cluster Analysis

8.1 K-Means Clustering

Goal: Group locations into distinct "urban climate zones" based on their characteristics.

Method:

  1. Select features: GVI, SVF, LST, NDVI
  2. Standardize features (z-scores) so they're comparable
  3. Run K-means algorithm with k=4 clusters
  4. Label clusters based on their characteristics
Result - 4 Urban Climate Zones:
ZoneCountGVISVFLSTCharacter
Hot & Exposed3,9622.5%46%50.6°COpen areas, full sun
Hot & Shaded3,3861.6%19%50.2°CBuildings block sun but no trees
Green & Shaded1,08315.3%30%50.1°CBest areas - has vegetation
Mixed/Cool1,6672.4%32%48.5°CCooler but reason unclear
View Clusters on 2D Viewer →

8.2 Green Space Accessibility

Method: For each street view point, calculate distance to nearest "green space" (cells with NDVI > 0.3).

Result:
Mean distance to green: 90m
95.7% of streets within 200m of green space

Note: "Green space" here means satellite-detected vegetation, not necessarily public parks.
View Green Access on 2D Viewer →

9. Building & Tree Canopy Shade Analysis

9.1 Objective

Quantify how much shade buildings and tree canopies cast on streets during peak summer, and identify which streets are most exposed to direct sun. This extends the building height data (Section 5) and integrates tree canopy data from the Meta 1m Global Canopy Height Map.

View shade simulation in 3D Digital Twin →

9.2 Solar Position (NOAA Algorithm)

Method: Implemented the NOAA solar position spreadsheet algorithm using pure numpy/math (no external solar libraries). The algorithm computes solar altitude and azimuth from Julian Day, solar declination, hour angle, and observer coordinates.

Julian Day → Solar Declination → Hour Angle → Altitude & Azimuth

Analysis dates: July 15 (peak summer) and January 15 (mid-winter), 7 time slots from 6 AM to 6 PM.

Summer (July 15):

Local TimeAltitudeAzimuthShadow Length Factor
06:003.8°68.0° (ENE)15.23× height
08:0029.7°78.6° (E)1.75×
10:0056.7°88.9° (E)0.66×
12:0083.2°122.4° (SE)0.12× (near overhead)
14:0067.9°265.0° (W)0.41×
16:0040.8°277.3° (W)1.16×
18:0014.3°287.3° (WNW)3.93×

Winter (January 15):

Local TimeAltitudeAzimuthShadow Length Factor
06:00−14.9°106.7° (ESE)Below horizon
08:0010.1°119.3° (ESE)5.61× height
10:0031.3°138.9° (SE)1.64×
12:0043.2°171.0° (S)1.07×
14:0038.6°207.7° (SSW)1.25×
16:0020.8°232.8° (SW)2.63×
18:00−2.8°248.0° (WSW)Below horizon
Key insight — summer: At noon in July, the sun is nearly overhead (83.2° altitude) so shadows are minimal (0.12× building height). Early morning and late afternoon produce extremely long shadows — at 6 AM the sun is only 3.8° above the horizon, casting shadows over 15× building height.
Key insight — winter: In January, the sun never climbs above 43.2° (at noon), meaning shadows are always at least 1× building height even at midday. At 6 AM and 6 PM the sun is below the horizon entirely — no direct sun exposure. The sun's arc shifts south, with azimuth ranging from ESE (119°) to SW (233°) instead of summer's nearly east–west path (68°–287°). This produces fundamentally different shadow patterns that favour north-facing streets.

9.3 Shadow Projection Method

For each building and tree canopy polygon at each time:

  1. Calculate shadow length: shadow_length = height / tan(altitude)
  2. Determine shadow direction: opposite to sun azimuth
  3. Create shadow polygon: convex hull of footprint + translated tip footprint
  4. All calculations in UTM Zone 40N (EPSG:32640) for metric accuracy
shadow_length = height / tan(solar_altitude)
shadow_direction = sun_azimuth + 180°

Shadow sources include 3,243 buildings and 1,033 tree canopy polygons, producing ~30,000 individual shadow projections across 7 time slots.

9.4 Tree Canopy Integration

Data source: Meta 1m Global Canopy Height Map, accessed via Google Earth Engine. The canopy data was processed in three stages:

  1. Canopy polygon extraction: The raster canopy height image was thresholded (>2m) and converted to 1,033 vector polygons representing tree canopy areas.
  2. Height sampling: 183 sample points with canopy height values were extracted from the raster.
  3. IDW height interpolation: Each polygon centroid was assigned a height using Inverse Distance Weighting (IDW) interpolation from the 3 nearest sample points (within 500m). Polygons with no nearby samples received the median height (3.0m).
height_polygon = Σ(wi × hi) / Σ(wi),   where wi = 1 / di²
Canopy MetricValue
Total canopy polygons1,033
Height range1.0 – 11.9 m
Mean height3.2 m
Median height2.7 m
Sample points used for IDW183

9.5 Street Shade Calculation

Method: For each time slot, union all building and tree canopy shadows using a chunked spatial approach (200m grid tiles), then calculate the fraction of each street segment that falls within shadow.

shade_fraction = shaded_length / total_length

Daily average shade is computed across all 7 time slots. Performance is managed via spatial indexing (STRtree) and chunked union operations.

9.6 Results

TimeAvg ShadeWell-shaded (≥50%)Exposed (<20%)
06:00 AM93.8%5,339 / 5,656155
08:00 AM39.4%2,250 / 5,6561,842
10:00 AM19.9%1,106 / 5,6563,249
12:00 PM5.9%288 / 5,6565,052
02:00 PM13.2%722 / 5,6563,907
04:00 PM26.6%1,511 / 5,6562,570
06:00 PM51.6%3,015 / 5,6561,309
Daily summary (buildings + trees combined):
• Average shade coverage across 7 time slots: 35.8%
• Well-shaded streets (≥50% daily average): 1,208 / 5,656 (21%)
• Exposed streets (<20% daily average): 1,639 / 5,656 (29%)
• Most shade at 6 AM (93.8%) and 6 PM (51.6%) — long shadows from low sun angle
• Least shade at noon (5.9%) — sun nearly overhead at 83°
Key outputs:
• Shadow polygons for each of the 7 time slots (GeoJSON) — separate building and tree shadow layers
• Shade percentage per street per hour (CSV, 5,656 streets × 7 hours)
• Interactive 2D map with time slider, building shadow toggle, and tree shadow toggle
• Interactive 3D map with extruded buildings (gray) and tree canopy (green), projected shadow overlays, and GPU-rendered sun shadows
• Streets colored by shade coverage (red=exposed, green=shaded)

9.7 Visualisation

Two interactive HTML maps are provided:

9.8 Points of Interest (Overpass API)

Objective: Overlay a rich, categorized layer of Points of Interest on the 3D shade map so users can see which amenities (restaurants, shops, clinics, schools, etc.) exist in relation to shade coverage.

Data Source

PoIs are fetched from the Overpass API, the public query interface for OpenStreetMap. A single bounding-box query retrieves all nodes and ways tagged with amenity, shop, tourism, office, leisure, or healthcare within the Al Karama study area.

// Overpass QL query (simplified) [out:json][timeout:60]; ( node["amenity"](25.238,55.292,25.259,55.313); way["amenity"](25.238,55.292,25.259,55.313); node["shop"](25.238,55.292,25.259,55.313); // ... + tourism, office, leisure, healthcare ); out center;

Processing Pipeline

  1. Fetch: HTTP POST to overpass-api.de; returned 1,419 raw elements
  2. Parse positions: Nodes use lat/lon directly; ways use center.lat/center.lon (via out center)
  3. Filter noise: Remove "urban furniture" types (bench, waste_basket, parking, shelter, bollard, etc.) — 18 noise types excluded
  4. Categorize: Map ~50 OSM tag values to 8 categories using a lookup table; unmapped shop=* tags default to "shopping"; all others default to "services"
  5. Label: Use the name tag if available; otherwise title-case the OSM type (e.g., fast_food → "Fast Food")
  6. Cache: Results saved to pois_cache.json (146 KB); subsequent runs load from cache without an API call
Result: 1,290 PoIs across 8 categories:
CategoryEmojiCountExample OSM tags
Shopping🛍️462supermarket, clothes, electronics, jewelry
Services🏦362bank, atm, laundry, hairdresser, police
Food🍛282restaurant, cafe, fast_food, bakery
Hotel🏨64hotel, guest_house, apartment
Leisure51park, sports_centre, cinema, playground
Health⚕️48pharmacy, clinic, hospital, dentist
Religious🕌12place_of_worship
Education🎓9school, kindergarten, driving_school

Visualisation

PoIs are rendered on the 3D map as emoji icons using deck.gl's IconLayer. Each category emoji is pre-rendered onto a 64×64 HTML canvas and converted to a PNG data URL at page load, which the IconLayer displays as a full-color bitmap texture.

Design decision — emoji over colored dots: Initial implementation used colored circles, but 8 categories produced too many similar colors (e.g., orange food vs amber education; green leisure vs green tree canopy). Emoji icons (🍛 🛍️ 🏨 etc.) are instantly distinguishable without relying on color differentiation.

9.9 Caveats

1. Flat terrain assumed: No elevation model used — all buildings and trees assumed on same ground plane.
2. Trees modeled as solid polygons: Real tree canopies are porous — light filters through leaves. Our model treats each canopy polygon as a solid shadow caster, overestimating tree shade somewhat.
3. Canopy heights via IDW interpolation: Only 183 sample points were available for 1,033 polygons. Heights were interpolated using IDW (k=3), introducing spatial smoothing. The 1m resolution of the source raster is reduced.
4. Quantized building heights: GHSL height classes produce discrete height values, leading to quantized shadow lengths.
5. No diffusion: Shadow boundaries are binary (shaded/not shaded) — no partial shade or penumbra modeled.

10. Seasonal & Temporal Comparison

10.1 Why Compare Seasons?

Dubai experiences extreme heat in summer but mild, pleasant winters. Comparing the two seasons reveals how solar geometry, temperature, and vegetation change — and whether shade infrastructure designed for summer also benefits winter pedestrians. The analysis pipeline now supports a --season flag, and both the 3D and 2D viewers include a season dropdown to switch between datasets.

In addition to comparing seasons within a single year, we now include Summer 2020 and Winter 2020/21 data, enabling a 5-year temporal comparison to observe how urban heat, vegetation, and built-up indices have changed over time. The viewer dropdown presents all four seasons: Summer 2020, Winter 2020/21, Summer 2025, and Winter 2025/26.

The Sentinel-2 true-colour images below show the same area (Al Karama, 10m resolution) five years apart. Each is the single clearest scene (lowest cloud cover) from the respective summer window. Click to enlarge.

Sentinel-2 RGB — 10 September 2020
10 September 2020 — Sentinel-2B, 0.16% cloud cover. 10m true-colour RGB.
Sentinel-2 RGB — 11 June 2025
11 June 2025 — Sentinel-2C, 0.01% cloud cover. 10m true-colour RGB.

10.2 Solar Geometry

The most striking difference between seasons is the sun's path across the sky:

MetricSummer (Jul 15)Winter (Jan 15)Difference
Peak solar altitude (noon)83.2°43.2°−40.0°
Noon shadow factor0.12×1.07×~9× longer shadows
Sunrise/sunset (local)~5:30 AM / 7:10 PM~7:00 AM / 5:40 PM~2.5 h shorter day
Usable analysis hours (sun > 0°)7 (6 AM–6 PM)5 (8 AM–4 PM)−2 hours
Sun azimuth range68°–287° (E–WNW)119°–233° (ESE–SW)Narrower, shifted south
Key implication: In summer, the sun passes nearly overhead, so only tall buildings cast meaningful noon shadows. In winter, even a 10m building casts a 10.7m shadow at noon. This means winter pedestrians benefit significantly more from existing building shade, especially on streets running east–west with buildings on the south side.

10.3 Shadow Coverage

The shadow projection analysis (Section 9) was run for both seasons. The lower winter sun produces dramatically more shade at midday, while summer's longer daylight hours produce shade at dawn and dusk when the winter sun is below the horizon:

TimeSummer ShadeWinter ShadeChange
06:00 AM93.8%0.0% (sun below horizon)
08:00 AM39.4%60.3%+20.9 pp
10:00 AM19.9%35.6%+15.7 pp
12:00 PM5.9%27.9%+22.0 pp
02:00 PM13.2%25.2%+12.0 pp
04:00 PM26.6%48.6%+22.0 pp
06:00 PM51.6%0.0% (sun below horizon)
Key finding: Winter noon shade (27.9%) is nearly 5× the summer noon shade (5.9%). At the most critical midday hours (10 AM–2 PM), winter shade coverage averages 29.6% versus summer's 13.0%. This confirms that existing building geometry provides substantial passive shade in winter, while summer remains the season of greatest pedestrian heat stress.

10.4 Satellite Metric Differences

The satellite analysis was run for both seasons using Landsat 8/9 and Sentinel-2 data. The table below shows measured values (not projections):

MetricSummer 2025Winter 2025/26Difference
LST mean48.3°C27.1°C−21.2°C
LST range35.9–54.8°C21.4–33.0°C~15°C lower across board
NDVI mean0.0960.114+0.018 (slightly greener)
NDVI range−0.14 to 0.78−0.27 to 0.88Wider range in winter
NDBI mean0.0330.010−0.023
What this means for pedestrians:

The Land Surface Temperature (LST) heatmaps below illustrate the seasonal contrast. Note that each map uses its own dynamic colour scale to highlight spatial variation within that season:

LST heatmap — Summer 2025
Summer 2025 — LST range 35–55°C. The district is dominated by red/orange, with hot-spots exceeding 54°C in dense built-up areas. Cooler blue patches correspond to parks and irrigated vegetation.
LST heatmap — Winter 2025/26
Winter 2025/26 — LST range 21–33°C. The same district appears far cooler, with widespread blue tones. Relative hot-spots still align with dense impervious surfaces, but at 21°C lower than summer.

10.5 3D Viewer: Summer vs Winter

The 3D Digital Twin viewer reflects seasonal differences in real-time GPU sun shadows, pre-computed shadow overlays, and shade coverage charts. The screenshots below show the same noon south-facing view with GPU Sun Shadows and Building Shadows enabled:

3D viewer — Summer 2025, noon, south view
Summer 2025 — Sun at 83.2° altitude. Shadows fall almost directly beneath buildings; rooftops and facades are uniformly lit.
3D viewer — Winter 2025/26, noon, south view
Winter 2025/26 — Sun at 43.2° altitude. Long shadows extend northward from buildings, creating shaded streets between blocks.
How to explore: Open the 3D Digital Twin and use the season dropdown in the top navigation bar. The time slider at the bottom animates the sun through the day — try comparing 8 AM shadows between seasons to see how winter's low sun creates long east-facing shadows.

10.7 Temporal Comparison: 2020 vs 2025

By adding Summer 2020 and Winter 2020/21 to the analysis, we can observe how Al Karama's urban microclimate has evolved over five years. The 2020 seasons use Landsat 8 and Sentinel-2 imagery (Landsat 9 was not available until late 2021); the pipeline merges available collections gracefully.

Summer: 2020 vs 2025

MetricSummer 2020Summer 2025Change
LST mean49.1°C48.3°C−0.8°C
LST max55.4°C54.8°C−0.6°C
NDVI mean0.0820.096+0.014
NDBI mean0.0280.033+0.005

Winter: 2020/21 vs 2025/26

MetricWinter 2020/21Winter 2025/26Change
LST mean27.0°C27.0°C~0°C (unchanged)
LST max31.9°C33.0°C+1.1°C
NDVI mean0.1030.114+0.012
NDBI mean0.0170.010−0.007
Key findings over 5 years:

Overall the changes are modest and within the range of year-to-year variability. The NDVI increase is the most consistent finding across both seasons.

Methodology notes

Interactive Change Detection Map

In addition to comparing seasons via the dropdown, both viewers offer a dedicated 5-Year Change layer that computes and visualises pixel-by-pixel differences between Summer 2020 and Summer 2025. For each of the 90,300 grid points the layer displays:

Clicking any point shows both years' original values alongside the delta, making it easy to distinguish areas of genuine change from noise. The layer is season-independent (it always compares the same two summer composites) and persists when switching the season dropdown.

How to explore: Use the season dropdown in either the 3D Digital Twin or the 2D map viewer to switch between all four seasons. Compare the same metric (e.g., LST heatmap) across Summer 2020 vs Summer 2025 to isolate temporal changes from seasonal effects. Alternatively, enable the 5-Year Change layer for a direct pixel-by-pixel difference map with diverging colour scales.

10.6 Season-Independent Data

Some data layers do not change between seasons and are shared across both:

11. Key Findings

11.1 Correlations

RelationshipCorrelation (r)Interpretation
GVI ↔ NDVI0.501Street greenery matches satellite vegetation - data validates!
SVF ↔ LST0.136More sky exposure = slightly hotter
GVI ↔ LST-0.039More greenery = slightly cooler (weak)
NDVI ↔ LST-0.040Vegetation cools surfaces (weak)
Why are temperature correlations weak?
Satellite LST measures surface temperature, but pedestrians experience air temperature and radiant heat. Also, our measurements are at different times (satellite = specific overpass time, street view = whenever image was captured).

11.2 Main Takeaways

  1. Al Karama is hot: Mean surface temperature of 48.3°C in summer
  2. Very little vegetation: Only 3.55% green view, 0.096 NDVI
  3. Most streets uncomfortable: 71% have low pedestrian comfort
  4. Shade helps: Areas with low SVF are more comfortable
  5. 78% needs intervention: High or critical priority for heat mitigation

12. Limitations

1. Temporal mismatch: Street view images are from various dates, satellite data is from summer 2025 (Jun–Sep) and winter 2025/26 (Dec–Feb). Both Landsat and Sentinel-2 are filtered to matching seasonal windows, but street view images were captured at different times and are reused across seasons.
2. LST ≠ Air temperature: Satellite measures surface temperature, not what pedestrians feel. Actual thermal comfort depends on air temperature, humidity, wind, and radiant heat.
3. Resolution limits: Satellite data is 10-30m resolution. Fine-scale variations (individual trees, building shadows) are smoothed out.
4. Street view sampling bias: Mapillary images are crowdsourced, so coverage depends on where people drove/walked with cameras. Some areas may have gaps.
5. Two seasons only: We analyze summer (Jun–Sep) and winter (Dec–Feb). Transitional seasons (spring, autumn) are not covered. Additionally, winter satellite data may have fewer cloud-free scenes than summer in this region.
6. GHSL height classes are coarse: The GHSL Built-C dataset provides 5 height bands, not precise heights. Buildings are assigned midpoint values (e.g., all 6-15m buildings get 10.5m). This means 94% of buildings share one of only 5 possible height values. GHSL Built-H caps at ~40m, underestimating the tallest buildings in Al Karama.

13. Output Files Reference

Interactive Viewers

FileDescription
index.htmlMain dashboard with links to all visualizations
viewer.html3D Digital Twin — buildings, shade, thermal, mobility, POIs (deck.gl, 13 layers)
viewer_2d.html2D Analysis Viewer — centrality, comfort, priority, SVI, satellite, clusters, green access (Leaflet, 7 layers)
gvi_point_map.htmlGVI point map with clustered markers and image popups
segmentation_gallery.htmlSample segmentation images (high vs low vegetation)

Data Files (data/al_karama/)

Season-independent files (shared root):

FileDescriptionRecords
area.jsonArea manifest with seasons metadata, sun info, layer paths
buildings.geojsonBuilding footprints with GEE-enhanced heights3,243
canopy.geojsonTree canopy polygons with IDW-interpolated heights1,033
streets.geojsonStreet network with centrality, PCI, LST, priority5,656
pois.jsonPoints of interest (8 categories, Overpass API)1,290
street_metrics.jsonStreet-level aggregated metrics5,656
segment_comfort.jsonPedestrian comfort by street segment420

Season-specific files (under summer_2025/ and winter_2025/):

FileDescriptionRecords
combined_svi.jsonStreet-level GVI/SVF + satellite LST/NDVI10,098
satellite_grid.jsonSatellite LST/NDVI/NDBI grid (30m, subsampled)20,000
priority_points.jsonHeat mitigation priority scores and levels11,576
clusters.jsonK-means climate cluster assignments10,098
distance_to_green.jsonDistance to nearest green space11,576
street_shade.csvShade % per street per hour5,656
shadows/shadows_HH.geojsonShadow polygons per hour (×7 files)

Python Scripts

ScriptPurpose
setup_gee.pyTest Google Earth Engine connection
satellite_analysis.pyDownload and analyze satellite data (--season flag)
satellite_full_area.pyFull area grid analysis at 10m (--season flag)
thermal_sharpening.pyDownscale LST from 30m to 10m using NDVI regression (--season flag)
combined_analysis.pyMerge street-level GVI/SVF with satellite thermal data (--season flag)
heat_mitigation_priorities.pyCalculate intervention priorities
walking_route_analysis.pyPedestrian comfort analysis
network_analysis_v3.pyStreet network centrality
quick_analyses.pyCorrelations, clusters, accessibility
gee_building_heights.pyExtract GHSL/nDSM building heights from GEE, merge with OSM
shade_analysis.pyBuilding + tree canopy shadow projection and street shade coverage analysis (--season flag)
seasons_config.pySeason definitions (dates, solar params) — shared config module
fetch_canopy_height.pyFetch Meta 1m canopy height data from GEE, extract polygons, and assign heights via IDW interpolation

14. Field Survey Guide

14.1 Objective

Validate estimated building heights by conducting on-site measurements using clinometer-based distance-angle methods. A 50m-radius test area was selected around a central Mapillary camera location.

14.2 Test Area

PropertyValue
LocationAl Karama, Dubai (25.2421°N, 55.3048°E)
Radius50m
Camera positions8 Mapillary camera locations within the test area
Center camera ID827604215891753

14.3 Measurement Protocol

Buildings to measure:

  1. Select 3–5 buildings for calibration
  2. Vary heights: include low-rise, mid-rise, and high-rise
  3. Note GPS coordinates for each building
  4. Take reference photos

For each building:

Building Height = Distance × tan(Angle) + Observer Height

14.4 Recommended Apps

PlatformApps
iOSMeasure (built-in), Theodolite
AndroidSmart Measure, Clinometer
BothGPS Coordinates app
Tip: Measure buildings visible from the Mapillary camera positions. The center point (camera 827604215891753) is at 25.242071°N, 55.304779°E. Measurement points at the NE, NW, SE, and SW corners of the 50m radius provide good vantage points for surveying nearby buildings.

Tools & Libraries Used

ToolPurposeLicense
ZenSVIDownload Mapillary images, calculate GVI/SVFOpen source
Google Earth EngineAccess satellite imageryFree for research
OSMnxDownload OpenStreetMap street networksMIT
NetworkXGraph/network analysisBSD
scikit-learnK-means clusteringBSD
GeoPandasGeospatial data handlingBSD
Leaflet.jsInteractive web mapsBSD
deck.gl3D WebGL map visualisation with GPU shadow renderingMIT
SciPySpatial KD-tree for IDW canopy height interpolationBSD

Report generated February 2026

← Back to Dashboard

Appendix A: Unused Methodology — Depth Estimation

A.1 Concept

Monocular depth estimation uses a neural network to predict a per-pixel depth map from a single image. We tested DepthAnythingV2, a foundation model that produces a relative depth map where each pixel is assigned a value indicating its distance from the camera (blue = far, red = near).

The initial hypothesis was that depth maps from street-view images could be used to estimate building heights, supplementing or replacing satellite-derived height data.

A.2 What Was Done

26 test images from a 50m-radius area (centred on Mapillary camera 827604215891753) were processed as a proof-of-concept. The model successfully produced visually plausible depth maps distinguishing foreground elements (cars, people) from background structures (buildings, sky).

A.3 Why It Was Dropped

Fundamental limitation: relative depth only. Monocular depth estimation produces relative distances (pixel A is closer than pixel B), not absolute distances in metres. Without camera calibration parameters (focal length, sensor size) — which Mapillary images do not reliably provide — there is no way to convert the depth map into real-world measurements.

This means depth estimation cannot answer "this building is 25m tall" — only "this building is farther away than this car." Building heights require absolute measurements, which this technique cannot provide from the available data.

A.4 What Would Make It Viable

RequirementWhat It Enables
Stereo image pairs (two images of the same scene from known positions)Triangulation for absolute distance
Camera intrinsics (focal length, sensor size)Metric depth from single images
LiDAR ground truthCalibration of relative depth to absolute values

None of these were available from the Mapillary dataset. Adding more single-view images would not resolve the limitation — the problem is the absence of calibration data, not the quantity of images.

A.5 Alternative Used

Building heights were instead derived from satellite sources via Google Earth Engine (see Section 5), achieving 99.5% coverage across 3,243 buildings using GHSL Built-C, GHSL Built-H, nDSM (ALOS–SRTM), and OSM survey data.

← Back to Dashboard