Location: Al Karama, Dubai, UAE
Purpose: Understand urban heat, vegetation, and pedestrian comfort using freely available data
Date: February 2026
We analyzed the urban climate and pedestrian comfort of Al Karama district using two complementary data sources:
┌─────────────────────────────────────────────────────────────┐
│ 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 │
└─────────────────────────┘
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:
| Property | Value |
|---|---|
| Source | Mapillary (crowdsourced street imagery) |
| Images downloaded | 11,651 |
| Coverage | Al Karama district boundary |
| Cost | Free (API access) |
| Tool used | ZenSVI Python library |
See the full interactive analysis: Satellite Analysis Report
| Satellite | Data | Season | Date Range | Resolution | Use |
|---|---|---|---|---|---|
| Landsat 8/9 | Thermal infrared | Summer 2025 | Jun–Sep 2025 | 30m (100m native) | Land Surface Temperature |
| Landsat 8/9 | Thermal infrared | Winter 2025/26 | Dec 2025–Feb 2026 | 30m (100m native) | Land Surface Temperature |
| Sentinel-2 | Multispectral | Summer 2025 | Jun–Sep 2025 | 10m | NDVI, NDBI vegetation/built-up |
| Sentinel-2 | Multispectral | Winter 2025/26 | Dec 2025–Feb 2026 | 10m | NDVI, NDBI vegetation/built-up |
| GHSL (JRC) | Built-up height classes & continuous heights | — | 2018 (P2023A release) | 10m / 100m | Building height estimation |
| Data | Count | Use |
|---|---|---|
| Buildings | 3,243 | 3D visualization, height data |
| Street network | 5,975 edges | Centrality analysis |
| Points of Interest | 1,290 | Amenity overlay on 3D shade map |
| Property | Value |
|---|---|
| Source | Overpass API (OpenStreetMap query interface) |
| Query area | Al Karama bounding box (25.238–25.259°N, 55.292–55.313°E) |
| OSM tags queried | amenity, shop, tourism, office, leisure, healthcare |
| Raw elements returned | 1,419 |
| After noise filtering | 1,290 |
| Categories | 8 (Food, Shopping, Hotel, Health, Religious, Services, Leisure, Education) |
| Cost | Free (public API, rate-limited) |
| Caching | pois_cache.json — avoids repeat API calls on re-run |
What it measures: The percentage of green pixels (vegetation) visible in a street view image.
How it's calculated:
What it measures: The percentage of sky visible from a point on the street. Lower SVF = more shading from buildings/trees.
Interpretation:
Note: Monocular depth estimation was explored but not adopted in the final analysis. See Appendix A: Unused Methodology — Depth Estimation for details.
What it measures: The temperature of the ground/surface as seen from space.
How it's calculated from Landsat:
What it measures: Vegetation health/density from satellite perspective.
Interpretation:
| NDVI Value | Meaning |
|---|---|
| -1.0 to 0 | Water, bare soil, buildings |
| 0 to 0.2 | Sparse vegetation, dry grass |
| 0.2 to 0.4 | Moderate vegetation |
| 0.4 to 0.6 | Dense vegetation |
| 0.6 to 1.0 | Very dense, healthy vegetation |
What it measures: Built-up/urban density.
High NDBI = more buildings/concrete. Low NDBI = vegetation or water.
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.
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.
We tested multiple GEE datasets for coverage over Dubai/Al Karama:
| Dataset | Resolution | Coverage | What it provides |
|---|---|---|---|
| Open Buildings 2.5D Temporal | ~2.5m | Not available (0 images) | Would have had individual building heights |
| GHSL Built-C | 10m | 84,182 pixels | Height classes (categorical) |
| GHSL Built-H | 100m | 883 pixels | Continuous heights (meters) |
| nDSM (ALOS-SRTM) | 30m | 10,416 pixels | Surface model difference |
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 Class | Range | Midpoint Used |
|---|---|---|
| 1 | ≤3m | 3.0m |
| 2 | 3-6m | 4.5m |
| 3 | 6-15m | 10.5m |
| 4 | 15-30m | 22.5m |
| 5 | >30m | 45.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.
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.
What it is: The difference between a Digital Surface Model (DSM, which includes buildings/trees) and a Digital Elevation Model (DEM, bare ground only).
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.
We merged heights from all sources using a priority system that preserves the most reliable data:
| Priority | Source | Resolution | Rationale |
|---|---|---|---|
| 1 (highest) | OSM real height (≠9m) | Individual | Surveyed or mapped by contributors |
| 2 | GHSL Built-C | 10m | Best spatial resolution, height classes |
| 3 | GHSL Built-H | 100m | Continuous values but coarser |
| 4 | nDSM | 30m | Noisy but independent measurement |
| 5 (lowest) | Default | n/a | Keep 9m assumption |
| Source | Buildings | Percentage |
|---|---|---|
| OSM real height | 78 | 2.4% |
| GHSL Built-C (10m) | 3,055 | 94.2% |
| GHSL Built-H (100m) | 80 | 2.5% |
| nDSM (30m) | 14 | 0.4% |
| Default (9m) | 16 | 0.5% |
| Total with data | 3,227 | 99.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.
Goal: Identify locations where interventions (tree planting, shade) would have the most impact.
Method: Combine multiple factors into a priority score:
| Season | Critical | High | Total Intervention |
|---|---|---|---|
| Summer 2025 | 16.3% | 67.4% | 83.7% |
| Winter 2025 | 26.5% | 58.6% | 85.1% |
Goal: Rate streets by walking comfort.
Interpretation:
| PCI | Comfort Level |
|---|---|
| > 0.6 | Very Comfortable |
| 0.45 - 0.6 | Comfortable |
| 0.3 - 0.45 | Moderate |
| < 0.3 | Uncomfortable |
Network analysis treats streets as a graph (nodes = intersections, edges = street segments) to understand which streets are most important for movement.
What it measures: How often a street lies on the shortest path between other locations.
Interpretation: High betweenness = many people pass through this street to get from A to B. These are main corridors.
View Betweenness on 2D Viewer →
What it measures: How close (accessible) a location is to all other locations.
Interpretation: High closeness = easy to reach from anywhere. Central, accessible locations.
We combined centrality with comfort to find streets where improvements help the most people:
Goal: Group locations into distinct "urban climate zones" based on their characteristics.
Method:
| Zone | Count | GVI | SVF | LST | Character |
|---|---|---|---|---|---|
| Hot & Exposed | 3,962 | 2.5% | 46% | 50.6°C | Open areas, full sun |
| Hot & Shaded | 3,386 | 1.6% | 19% | 50.2°C | Buildings block sun but no trees |
| Green & Shaded | 1,083 | 15.3% | 30% | 50.1°C | Best areas - has vegetation |
| Mixed/Cool | 1,667 | 2.4% | 32% | 48.5°C | Cooler but reason unclear |
Method: For each street view point, calculate distance to nearest "green space" (cells with NDVI > 0.3).
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 →
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.
Analysis dates: July 15 (peak summer) and January 15 (mid-winter), 7 time slots from 6 AM to 6 PM.
Summer (July 15):
| Local Time | Altitude | Azimuth | Shadow Length Factor |
|---|---|---|---|
| 06:00 | 3.8° | 68.0° (ENE) | 15.23× height |
| 08:00 | 29.7° | 78.6° (E) | 1.75× |
| 10:00 | 56.7° | 88.9° (E) | 0.66× |
| 12:00 | 83.2° | 122.4° (SE) | 0.12× (near overhead) |
| 14:00 | 67.9° | 265.0° (W) | 0.41× |
| 16:00 | 40.8° | 277.3° (W) | 1.16× |
| 18:00 | 14.3° | 287.3° (WNW) | 3.93× |
Winter (January 15):
| Local Time | Altitude | Azimuth | Shadow Length Factor |
|---|---|---|---|
| 06:00 | −14.9° | 106.7° (ESE) | Below horizon |
| 08:00 | 10.1° | 119.3° (ESE) | 5.61× height |
| 10:00 | 31.3° | 138.9° (SE) | 1.64× |
| 12:00 | 43.2° | 171.0° (S) | 1.07× |
| 14:00 | 38.6° | 207.7° (SSW) | 1.25× |
| 16:00 | 20.8° | 232.8° (SW) | 2.63× |
| 18:00 | −2.8° | 248.0° (WSW) | Below horizon |
For each building and tree canopy polygon at each time:
shadow_length = height / tan(altitude)Shadow sources include 3,243 buildings and 1,033 tree canopy polygons, producing ~30,000 individual shadow projections across 7 time slots.
Data source: Meta 1m Global Canopy Height Map, accessed via Google Earth Engine. The canopy data was processed in three stages:
| Canopy Metric | Value |
|---|---|
| Total canopy polygons | 1,033 |
| Height range | 1.0 – 11.9 m |
| Mean height | 3.2 m |
| Median height | 2.7 m |
| Sample points used for IDW | 183 |
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.
Daily average shade is computed across all 7 time slots. Performance is managed via spatial indexing (STRtree) and chunked union operations.
| Time | Avg Shade | Well-shaded (≥50%) | Exposed (<20%) |
|---|---|---|---|
| 06:00 AM | 93.8% | 5,339 / 5,656 | 155 |
| 08:00 AM | 39.4% | 2,250 / 5,656 | 1,842 |
| 10:00 AM | 19.9% | 1,106 / 5,656 | 3,249 |
| 12:00 PM | 5.9% | 288 / 5,656 | 5,052 |
| 02:00 PM | 13.2% | 722 / 5,656 | 3,907 |
| 04:00 PM | 26.6% | 1,511 / 5,656 | 2,570 |
| 06:00 PM | 51.6% | 3,015 / 5,656 | 1,309 |
Two interactive HTML maps are provided:
_SunLight. Time slider controls shade simulation from 6 AM to 6 PM. Tooltips show building height, tree height, PoI name/category, and per-street shade percentage.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.
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-api.de; returned 1,419 raw elementslat/lon directly; ways use center.lat/center.lon (via out center)shop=* tags default to "shopping"; all others default to "services"name tag if available; otherwise title-case the OSM type (e.g., fast_food → "Fast Food")pois_cache.json (146 KB); subsequent runs load from cache without an API call| Category | Emoji | Count | Example OSM tags |
|---|---|---|---|
| Shopping | 🛍️ | 462 | supermarket, clothes, electronics, jewelry |
| Services | 🏦 | 362 | bank, atm, laundry, hairdresser, police |
| Food | 🍛 | 282 | restaurant, cafe, fast_food, bakery |
| Hotel | 🏨 | 64 | hotel, guest_house, apartment |
| Leisure | ⚽ | 51 | park, sports_centre, cinema, playground |
| Health | ⚕️ | 48 | pharmacy, clinic, hospital, dentist |
| Religious | 🕌 | 12 | place_of_worship |
| Education | 🎓 | 9 | school, kindergarten, driving_school |
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.
CollisionFilterExtension automatically hides overlapping icons, keeping the display clean at any zoom levelTextLayer) only when zoomed past level 18, also with collision filteringparameters: { depthTest: false })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.
The most striking difference between seasons is the sun's path across the sky:
| Metric | Summer (Jul 15) | Winter (Jan 15) | Difference |
|---|---|---|---|
| Peak solar altitude (noon) | 83.2° | 43.2° | −40.0° |
| Noon shadow factor | 0.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 range | 68°–287° (E–WNW) | 119°–233° (ESE–SW) | Narrower, shifted south |
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:
| Time | Summer Shade | Winter Shade | Change |
|---|---|---|---|
| 06:00 AM | 93.8% | 0.0% (sun below horizon) | — |
| 08:00 AM | 39.4% | 60.3% | +20.9 pp |
| 10:00 AM | 19.9% | 35.6% | +15.7 pp |
| 12:00 PM | 5.9% | 27.9% | +22.0 pp |
| 02:00 PM | 13.2% | 25.2% | +12.0 pp |
| 04:00 PM | 26.6% | 48.6% | +22.0 pp |
| 06:00 PM | 51.6% | 0.0% (sun below horizon) | — |
The satellite analysis was run for both seasons using Landsat 8/9 and Sentinel-2 data. The table below shows measured values (not projections):
| Metric | Summer 2025 | Winter 2025/26 | Difference |
|---|---|---|---|
| LST mean | 48.3°C | 27.1°C | −21.2°C |
| LST range | 35.9–54.8°C | 21.4–33.0°C | ~15°C lower across board |
| NDVI mean | 0.096 | 0.114 | +0.018 (slightly greener) |
| NDVI range | −0.14 to 0.78 | −0.27 to 0.88 | Wider range in winter |
| NDBI mean | 0.033 | 0.010 | −0.023 |
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:
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:
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.
| Metric | Summer 2020 | Summer 2025 | Change |
|---|---|---|---|
| LST mean | 49.1°C | 48.3°C | −0.8°C |
| LST max | 55.4°C | 54.8°C | −0.6°C |
| NDVI mean | 0.082 | 0.096 | +0.014 |
| NDBI mean | 0.028 | 0.033 | +0.005 |
| Metric | Winter 2020/21 | Winter 2025/26 | Change |
|---|---|---|---|
| LST mean | 27.0°C | 27.0°C | ~0°C (unchanged) |
| LST max | 31.9°C | 33.0°C | +1.1°C |
| NDVI mean | 0.103 | 0.114 | +0.012 |
| NDBI mean | 0.017 | 0.010 | −0.007 |
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.
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.
Some data layers do not change between seasons and are shared across both:
| Relationship | Correlation (r) | Interpretation |
|---|---|---|
| GVI ↔ NDVI | 0.501 | Street greenery matches satellite vegetation - data validates! |
| SVF ↔ LST | 0.136 | More sky exposure = slightly hotter |
| GVI ↔ LST | -0.039 | More greenery = slightly cooler (weak) |
| NDVI ↔ LST | -0.040 | Vegetation cools surfaces (weak) |
| File | Description |
|---|---|
| index.html | Main dashboard with links to all visualizations |
| viewer.html | 3D Digital Twin — buildings, shade, thermal, mobility, POIs (deck.gl, 13 layers) |
| viewer_2d.html | 2D Analysis Viewer — centrality, comfort, priority, SVI, satellite, clusters, green access (Leaflet, 7 layers) |
| gvi_point_map.html | GVI point map with clustered markers and image popups |
| segmentation_gallery.html | Sample segmentation images (high vs low vegetation) |
Season-independent files (shared root):
| File | Description | Records |
|---|---|---|
| area.json | Area manifest with seasons metadata, sun info, layer paths | — |
| buildings.geojson | Building footprints with GEE-enhanced heights | 3,243 |
| canopy.geojson | Tree canopy polygons with IDW-interpolated heights | 1,033 |
| streets.geojson | Street network with centrality, PCI, LST, priority | 5,656 |
| pois.json | Points of interest (8 categories, Overpass API) | 1,290 |
| street_metrics.json | Street-level aggregated metrics | 5,656 |
| segment_comfort.json | Pedestrian comfort by street segment | 420 |
Season-specific files (under summer_2025/ and winter_2025/):
| File | Description | Records |
|---|---|---|
| combined_svi.json | Street-level GVI/SVF + satellite LST/NDVI | 10,098 |
| satellite_grid.json | Satellite LST/NDVI/NDBI grid (30m, subsampled) | 20,000 |
| priority_points.json | Heat mitigation priority scores and levels | 11,576 |
| clusters.json | K-means climate cluster assignments | 10,098 |
| distance_to_green.json | Distance to nearest green space | 11,576 |
| street_shade.csv | Shade % per street per hour | 5,656 |
| shadows/shadows_HH.geojson | Shadow polygons per hour (×7 files) | — |
| Script | Purpose |
|---|---|
| setup_gee.py | Test Google Earth Engine connection |
| satellite_analysis.py | Download and analyze satellite data (--season flag) |
| satellite_full_area.py | Full area grid analysis at 10m (--season flag) |
| thermal_sharpening.py | Downscale LST from 30m to 10m using NDVI regression (--season flag) |
| combined_analysis.py | Merge street-level GVI/SVF with satellite thermal data (--season flag) |
| heat_mitigation_priorities.py | Calculate intervention priorities |
| walking_route_analysis.py | Pedestrian comfort analysis |
| network_analysis_v3.py | Street network centrality |
| quick_analyses.py | Correlations, clusters, accessibility |
| gee_building_heights.py | Extract GHSL/nDSM building heights from GEE, merge with OSM |
| shade_analysis.py | Building + tree canopy shadow projection and street shade coverage analysis (--season flag) |
| seasons_config.py | Season definitions (dates, solar params) — shared config module |
| fetch_canopy_height.py | Fetch Meta 1m canopy height data from GEE, extract polygons, and assign heights via IDW interpolation |
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.
| Property | Value |
|---|---|
| Location | Al Karama, Dubai (25.2421°N, 55.3048°E) |
| Radius | 50m |
| Camera positions | 8 Mapillary camera locations within the test area |
| Center camera ID | 827604215891753 |
Buildings to measure:
For each building:
| Platform | Apps |
|---|---|
| iOS | Measure (built-in), Theodolite |
| Android | Smart Measure, Clinometer |
| Both | GPS Coordinates app |
| Tool | Purpose | License |
|---|---|---|
| ZenSVI | Download Mapillary images, calculate GVI/SVF | Open source |
| Google Earth Engine | Access satellite imagery | Free for research |
| OSMnx | Download OpenStreetMap street networks | MIT |
| NetworkX | Graph/network analysis | BSD |
| scikit-learn | K-means clustering | BSD |
| GeoPandas | Geospatial data handling | BSD |
| Leaflet.js | Interactive web maps | BSD |
| deck.gl | 3D WebGL map visualisation with GPU shadow rendering | MIT |
| SciPy | Spatial KD-tree for IDW canopy height interpolation | BSD |
Report generated February 2026
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.
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).
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.
| Requirement | What 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 truth | Calibration 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.
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.