326 lines
9.9 KiB
Markdown
326 lines
9.9 KiB
Markdown
# CLAUDE.md - Globe Visualization 4 Development Context
|
|
|
|
## Project Overview
|
|
|
|
This is **Iteration 4** in a progressive Mapbox GL JS learning series. Each iteration builds upon previous learnings while introducing new techniques. This iteration focuses on **multi-layer composition** combining choropleth maps with circles, lines, and symbols.
|
|
|
|
## Development Assignment
|
|
|
|
**Task**: Create a multi-layer globe visualization demonstrating synthesis of all previous learnings plus choropleth techniques.
|
|
|
|
**Theme**: Global Digital Infrastructure & Connectivity
|
|
- Internet penetration by country (choropleth/fill layer)
|
|
- Major tech hubs and internet exchanges (circle layer)
|
|
- International connectivity links (line layer)
|
|
- City labels (symbol layer)
|
|
|
|
## Learning Progression Context
|
|
|
|
### Iteration 1: Foundation
|
|
- Single layer visualization
|
|
- Circle type with basic styling
|
|
- Population data
|
|
- Globe projection basics
|
|
- Simple hover interactions
|
|
|
|
### Iteration 2: Gradients
|
|
- Single layer with heatmap type
|
|
- Color gradient techniques
|
|
- Temperature/climate data
|
|
- Opacity control
|
|
- Visual layering concepts
|
|
|
|
### Iteration 3: Expressions
|
|
- Single layer with advanced expressions
|
|
- Data-driven styling with conditionals
|
|
- Economic/GDP data
|
|
- Match and interpolate expressions
|
|
- Property-based styling
|
|
|
|
### Iteration 4: Multi-Layer (This Iteration)
|
|
- **Multiple simultaneous layers** (fill/circle, circle, line, symbol)
|
|
- **Choropleth techniques** learned from web research
|
|
- **Layer composition and ordering**
|
|
- **Coordinated visibility controls**
|
|
- **Cross-layer filtering**
|
|
- **Comprehensive UI for layer management**
|
|
|
|
## Web Research Integration
|
|
|
|
**Source**: Mapbox GL JS Choropleth Documentation
|
|
**URL**: https://docs.mapbox.com/mapbox-gl-js/example/updating-choropleth/
|
|
|
|
### Key Techniques Extracted:
|
|
|
|
1. **Fill Layer Configuration**
|
|
- Using `type: 'fill'` for geographic regions
|
|
- Filter expressions for selective display
|
|
- Zoom-based layer visibility (minzoom/maxzoom)
|
|
|
|
2. **Data Joining**
|
|
- Vector tilesets with pre-joined data
|
|
- Property-based filtering (e.g., 'isState', 'isCounty')
|
|
- Feature attribute access via `['get', 'property']`
|
|
|
|
3. **Color Interpolation for Choropleth**
|
|
```javascript
|
|
'fill-color': [
|
|
'interpolate',
|
|
['linear'],
|
|
['get', 'population'],
|
|
// color stops
|
|
]
|
|
```
|
|
|
|
4. **Opacity Management**
|
|
- `fill-opacity` for semi-transparent regions
|
|
- Allows layering with other visual elements
|
|
- Value typically 0.6-0.8 for good visibility
|
|
|
|
5. **Interactive Features**
|
|
- Zoom event listeners for dynamic updates
|
|
- Legend switching based on zoom level
|
|
- Dynamic layer show/hide
|
|
|
|
## Adaptation Strategy
|
|
|
|
Since we're using GeoJSON point data rather than vector tiles with polygons, we adapted choropleth techniques:
|
|
|
|
**Traditional Choropleth**: Fill polygons for countries
|
|
**Our Implementation**: Circles sized by population, colored by data metric
|
|
|
|
This maintains choropleth concepts (data-driven fill colors, regional visualization) while working within our point-based data structure.
|
|
|
|
## Technical Implementation Highlights
|
|
|
|
### Multi-Source Architecture
|
|
```javascript
|
|
// Three separate data sources
|
|
map.addSource('countries', { type: 'geojson', data: countriesData });
|
|
map.addSource('cities', { type: 'geojson', data: citiesData });
|
|
map.addSource('connections', { type: 'geojson', data: connections });
|
|
```
|
|
|
|
### Layer Stack (Bottom to Top)
|
|
1. **country-fills**: Circle layer representing countries with choropleth-style coloring
|
|
2. **hub-connections**: Line layer for international links
|
|
3. **tech-hubs**: Circle layer for cities
|
|
4. **city-labels**: Symbol layer for top hub names
|
|
|
|
### Advanced Expressions Used
|
|
|
|
**Interpolate** (smooth gradients):
|
|
- Country colors by internet penetration
|
|
- Circle radius by importance
|
|
- Line width by connection strength
|
|
- Text size by city importance
|
|
|
|
**Match** (categorical):
|
|
- City colors by hub type
|
|
- Conditional styling based on categories
|
|
|
|
**Zoom-based** (responsive):
|
|
- Circle radius scaling with zoom
|
|
- Visibility thresholds for labels
|
|
|
|
### Interactive Controls Implementation
|
|
|
|
**Layer Toggles**:
|
|
```javascript
|
|
map.setLayoutProperty('layer-id', 'visibility', checked ? 'visible' : 'none');
|
|
```
|
|
|
|
**Region Filtering**:
|
|
```javascript
|
|
// Country filter
|
|
map.setFilter('country-fills', ['==', ['get', 'region'], region]);
|
|
|
|
// City filter (cross-reference with countries)
|
|
const regionCountries = countriesData.features
|
|
.filter(f => f.properties.region === region)
|
|
.map(f => f.properties.country);
|
|
map.setFilter('tech-hubs', ['in', ['get', 'country'], ['literal', regionCountries]]);
|
|
```
|
|
|
|
**Metric Switching**:
|
|
```javascript
|
|
map.setPaintProperty('country-fills', 'circle-color', newColorExpression);
|
|
updateLegend(metric);
|
|
```
|
|
|
|
**Opacity Control**:
|
|
```javascript
|
|
map.setPaintProperty('layer-id', 'circle-opacity', opacity);
|
|
```
|
|
|
|
## Data Structure
|
|
|
|
### Countries (100+ entries)
|
|
```javascript
|
|
{
|
|
country: "USA",
|
|
name: "United States",
|
|
internetPenetration: 91, // 0-100%
|
|
digitalIndex: 88, // 0-100 score
|
|
population: 331900000,
|
|
region: "North America"
|
|
}
|
|
```
|
|
|
|
### Cities (80 entries)
|
|
```javascript
|
|
{
|
|
city: "San Francisco",
|
|
country: "USA",
|
|
importance: 100, // 45-100 score
|
|
type: "Tech Hub", // or "Internet Exchange"
|
|
connections: 850, // number of connections
|
|
datacenters: 42 // infrastructure count
|
|
}
|
|
```
|
|
|
|
### Connections (Generated)
|
|
- Automatically created between Tier 1 hubs (importance ≥ 85)
|
|
- Only cross-country connections
|
|
- Strength calculated from hub metrics
|
|
|
|
## UI/UX Design Patterns
|
|
|
|
**Glassmorphism Theme**:
|
|
- `backdrop-filter: blur(10px)`
|
|
- Semi-transparent backgrounds `rgba(0, 0, 0, 0.85)`
|
|
- Subtle borders `rgba(255, 255, 255, 0.1)`
|
|
|
|
**Control Panels**:
|
|
- Right-side controls for layer management
|
|
- Bottom legend for data interpretation
|
|
- Top title for context
|
|
- Bottom-right info panel for statistics
|
|
|
|
**Responsive Design**:
|
|
- Mobile: Controls move to bottom, legend/info hidden
|
|
- Desktop: Full multi-panel layout
|
|
- Scrollable controls for long content
|
|
|
|
**Visual Feedback**:
|
|
- Opacity sliders show percentage values
|
|
- Real-time updates on all controls
|
|
- Smooth transitions between states
|
|
|
|
## Color Schemes
|
|
|
|
### Internet Penetration (8-stop gradient)
|
|
- 0-30%: Dark red (#cc0000) - Very low
|
|
- 30-40%: Red-orange (#ff3300) - Low
|
|
- 40-50%: Dark orange (#ff6600) - Below average
|
|
- 50-60%: Orange (#ff9900) - Average
|
|
- 60-70%: Yellow (#ffcc00) - Above average
|
|
- 70-80%: Light green (#33cc33) - Good
|
|
- 80-90%: Green (#00b300) - Very good
|
|
- 90-100%: Dark green (#004d00) - Excellent
|
|
|
|
### Digital Infrastructure Index (4-stop gradient)
|
|
- 0-25: Very dark gray (#1a1a1a)
|
|
- 25-50: Dark gray (#4d4d4d)
|
|
- 50-75: Medium gray (#808080)
|
|
- 75-100: Light gray (#b3b3b3)
|
|
|
|
### City Types
|
|
- Tech Hub: Cyan (#4ecdc4)
|
|
- Internet Exchange: Red (#ff6b6b)
|
|
|
|
### Connections
|
|
- Gradient: Cyan to green (#00d4ff → #00ffaa)
|
|
|
|
## Globe Behavior
|
|
|
|
**Auto-Rotation**:
|
|
- Rotates when user not interacting
|
|
- 0.05° per frame (smooth motion)
|
|
- Pauses on mouse interaction
|
|
|
|
**Atmosphere**:
|
|
- Horizon blend for realistic edge
|
|
- Star field in space
|
|
- Color gradient from horizon to space
|
|
|
|
**Interaction States**:
|
|
- Mouse down: Stop rotation
|
|
- Drag/pitch/rotate: User control
|
|
- End interaction: Resume auto-rotation
|
|
|
|
## Statistics Calculation
|
|
|
|
Real-time metrics displayed:
|
|
- Total countries count
|
|
- Average internet penetration (calculated)
|
|
- Total tech hubs count
|
|
- Tier 1 hubs count (importance ≥ 90)
|
|
- International connection count (dynamic)
|
|
|
|
## Quality Standards Met
|
|
|
|
✅ **Multi-layer composition** - 4 distinct layer types
|
|
✅ **Choropleth techniques** - Data-driven fill colors via interpolation
|
|
✅ **Web research integration** - Techniques from Mapbox docs applied
|
|
✅ **Comprehensive interactivity** - Toggles, filters, sliders
|
|
✅ **Professional design** - Glassmorphism, gradients, responsive
|
|
✅ **Realistic data** - 100+ countries, 80 cities, real metrics
|
|
✅ **Advanced expressions** - Interpolate, match, zoom-based
|
|
✅ **Layer management UI** - Complete control suite
|
|
✅ **Synthesis demonstration** - All 4 iterations' learnings combined
|
|
✅ **Educational documentation** - Complete README with techniques
|
|
|
|
## Files Created
|
|
|
|
1. **index.html** - Main visualization with UI controls
|
|
2. **src/index.js** - Multi-layer orchestration and interactivity
|
|
3. **src/data/countries-data.js** - 100+ countries with metrics and helpers
|
|
4. **src/data/cities-data.js** - 80 tech hubs with connection generation
|
|
5. **README.md** - Comprehensive documentation and learning summary
|
|
6. **CLAUDE.md** - This development context file
|
|
|
|
## Validation Checklist
|
|
|
|
- [x] Uses Mapbox GL JS v3.0.1
|
|
- [x] Globe projection enabled
|
|
- [x] Atmosphere effects configured
|
|
- [x] Multiple data sources (3 total)
|
|
- [x] Multiple layer types (circle, line, symbol)
|
|
- [x] Choropleth-style data visualization
|
|
- [x] Interactive popups for both countries and cities
|
|
- [x] Layer visibility toggles (4 layers)
|
|
- [x] Region filtering (6 regions + all)
|
|
- [x] Metric switching (2 metrics)
|
|
- [x] Opacity controls (3 sliders)
|
|
- [x] Dynamic legend updates
|
|
- [x] Statistics dashboard
|
|
- [x] Auto-rotation with interaction pause
|
|
- [x] Responsive design
|
|
- [x] Professional styling
|
|
|
|
## Learning Outcomes
|
|
|
|
**Student completing this iteration should understand**:
|
|
|
|
1. How to compose multiple Mapbox layers effectively
|
|
2. Choropleth map principles and implementation
|
|
3. Data-driven styling across layer types
|
|
4. Layer visibility and opacity management
|
|
5. Cross-layer filtering and coordination
|
|
6. UI controls for map interactivity
|
|
7. GeoJSON data structuring for multi-layer visualizations
|
|
8. Expression types: interpolate, match, zoom-based
|
|
9. Globe projection with atmosphere effects
|
|
10. Professional map UI/UX patterns
|
|
|
|
**Progressive mastery demonstrated**:
|
|
- Iteration 1 → 2: Single layer complexity increase
|
|
- Iteration 2 → 3: Expression sophistication
|
|
- Iteration 3 → 4: Multi-layer composition
|
|
- Overall: Complete Mapbox GL JS proficiency
|
|
|
|
---
|
|
|
|
*This iteration successfully demonstrates the synthesis of all previous learnings plus new choropleth techniques, resulting in a production-quality multi-layer globe visualization.*
|