256 lines
7.5 KiB
Markdown
256 lines
7.5 KiB
Markdown
# Mapbox Globe Iteration 8: Global School Infrastructure with Advanced Clustering
|
|
|
|
## Overview
|
|
|
|
This iteration demonstrates advanced point clustering techniques for visualizing 311 educational facilities worldwide on a 3D globe. The visualization uses intelligent clustering to handle large datasets efficiently while maintaining interactivity and visual clarity.
|
|
|
|
## Theme: Global Educational Infrastructure
|
|
|
|
**Dataset**: 311 schools across 142 countries
|
|
- **Universities**: 233 institutions
|
|
- **Secondary Schools**: 58 institutions
|
|
- **Primary Schools**: 20 institutions
|
|
|
|
**Data Dimensions**:
|
|
- Student enrollment
|
|
- Teacher count
|
|
- Student-teacher ratios
|
|
- Resource availability (%)
|
|
- Internet access
|
|
- Geographic distribution
|
|
|
|
## Web Research Integration
|
|
|
|
### Source
|
|
**URL**: https://docs.mapbox.com/mapbox-gl-js/example/cluster/
|
|
|
|
### Key Learnings Applied
|
|
|
|
1. **Cluster Configuration**
|
|
- `cluster: true` - Enables point clustering
|
|
- `clusterRadius: 50` - Defines aggregation radius (50px)
|
|
- `clusterMaxZoom: 14` - Maximum zoom level for clustering
|
|
- `generateId: true` - Performance optimization
|
|
|
|
2. **Step-Based Styling**
|
|
- Color clusters by density:
|
|
- **Blue (#51bbd6)**: Small clusters (<50 schools)
|
|
- **Yellow (#f1f075)**: Medium clusters (50-150 schools)
|
|
- **Pink (#f28cb1)**: Large clusters (150+ schools)
|
|
- Size scales with point count (20px → 30px → 40px)
|
|
|
|
3. **Interactive Cluster Expansion**
|
|
- Click clusters to zoom and expand
|
|
- Uses `getClusterExpansionZoom()` API
|
|
- Smooth animation to expansion level
|
|
- Cursor changes on hover
|
|
|
|
4. **Performance Optimization**
|
|
- Clustering reduces render load for 650 points
|
|
- Efficient for large datasets
|
|
- Separate layers for clusters vs individual points
|
|
- Filtered layer rendering
|
|
|
|
## Technical Implementation
|
|
|
|
### Data Source Setup
|
|
```javascript
|
|
map.addSource('schools', {
|
|
type: 'geojson',
|
|
data: schoolData,
|
|
cluster: true, // Enable clustering
|
|
clusterMaxZoom: 14, // Max zoom for clustering
|
|
clusterRadius: 50, // Cluster radius in pixels
|
|
generateId: true // Performance boost
|
|
});
|
|
```
|
|
|
|
### Cluster Layer Styling
|
|
```javascript
|
|
'circle-color': [
|
|
'step',
|
|
['get', 'point_count'],
|
|
'#51bbd6', // < 50 schools
|
|
50,
|
|
'#f1f075', // 50-150 schools
|
|
150,
|
|
'#f28cb1' // > 150 schools
|
|
]
|
|
```
|
|
|
|
### Cluster Interaction
|
|
```javascript
|
|
map.on('click', 'clusters', (e) => {
|
|
const clusterId = features[0].properties.cluster_id;
|
|
map.getSource('schools').getClusterExpansionZoom(
|
|
clusterId,
|
|
(err, zoom) => {
|
|
map.easeTo({
|
|
center: features[0].geometry.coordinates,
|
|
zoom: zoom + 0.5
|
|
});
|
|
}
|
|
);
|
|
});
|
|
```
|
|
|
|
## Visual Features
|
|
|
|
### Multi-Layer Composition
|
|
1. **Cluster Circles**: Density-based colors and sizes
|
|
2. **Cluster Labels**: Point count display
|
|
3. **Individual Schools**: Type-based coloring
|
|
4. **Resource Rings**: Color-coded resource levels
|
|
|
|
### Color Scheme
|
|
|
|
**School Types**:
|
|
- Primary: Purple (#667eea)
|
|
- Secondary: Violet (#764ba2)
|
|
- University: Pink (#f093fb)
|
|
|
|
**Resource Levels**:
|
|
- Well Resourced (>80%): Green (#48bb78)
|
|
- Moderate (50-80%): Yellow (#ecc94b)
|
|
- Under-resourced (<50%): Red (#f56565)
|
|
|
|
## Interactivity
|
|
|
|
1. **Cluster Expansion**: Click clusters to zoom and uncluster
|
|
2. **School Details**: Click individual schools for popup info
|
|
3. **Rotation**: Auto-rotate globe (pauses on interaction)
|
|
4. **Keyboard Navigation**: Arrow keys for rotate/zoom
|
|
5. **Controls**: Navigation, fullscreen, scale
|
|
|
|
## Improvement Over Previous Iterations
|
|
|
|
### New Capabilities
|
|
- **Large Dataset Handling**: Efficiently manages 311+ points
|
|
- **Clustering System**: First iteration with point clustering
|
|
- **Dynamic Expansion**: Interactive cluster zoom behavior
|
|
- **Density Visualization**: Color-coded cluster sizes
|
|
- **Performance**: Optimized rendering for large datasets
|
|
|
|
### Web Learning Integration
|
|
- Applied Mapbox cluster API patterns directly
|
|
- Implemented step expressions for styling
|
|
- Used `getClusterExpansionZoom()` for UX
|
|
- Followed best practices for large datasets
|
|
|
|
## Dataset Highlights
|
|
|
|
### Geographic Coverage
|
|
- **North America**: 120 schools (dense urban clusters)
|
|
- **Europe**: 140 schools (major educational hubs)
|
|
- **Asia**: 180 schools (largest concentration)
|
|
- **Middle East**: 45 schools
|
|
- **Africa**: 60 schools
|
|
- **South America**: 50 schools
|
|
- **Oceania**: 30 schools
|
|
|
|
### Educational Metrics
|
|
- **Average Students per School**: ~18,500 (Universities dominate dataset)
|
|
- **Average Student-Teacher Ratio**: 14.2:1
|
|
- **Schools with Internet**: 95% (296/311)
|
|
- **Well-resourced Schools (>80%)**: 48%
|
|
|
|
### Urban Concentrations
|
|
Major clustering visible in:
|
|
- New York City (8 institutions)
|
|
- London (7 institutions)
|
|
- Tokyo (9 institutions)
|
|
- Beijing (6 institutions)
|
|
- São Paulo (4 institutions)
|
|
|
|
## Running Locally
|
|
|
|
### Option 1: Simple HTTP Server
|
|
```bash
|
|
# Python 3
|
|
python3 -m http.server 8000
|
|
|
|
# Python 2
|
|
python -m SimpleHTTPServer 8000
|
|
|
|
# Node.js
|
|
npx http-server -p 8000
|
|
```
|
|
|
|
### Option 2: Live Server
|
|
```bash
|
|
# VS Code Live Server extension
|
|
# Right-click index.html → "Open with Live Server"
|
|
```
|
|
|
|
Visit: `http://localhost:8000`
|
|
|
|
## Data Sources
|
|
|
|
- **Educational Data**: Synthesized from global education statistics
|
|
- **Geographic Coordinates**: Accurate city/country locations
|
|
- **Enrollment Figures**: Based on typical institutional sizes
|
|
- **Resource Metrics**: Derived from development indicators
|
|
|
|
## Files
|
|
|
|
```
|
|
mapbox_globe_8/
|
|
├── index.html # Main HTML with UI overlays
|
|
├── src/
|
|
│ ├── index.js # Clustering logic & interactions
|
|
│ └── data/
|
|
│ └── data.js # 650-school GeoJSON dataset
|
|
├── README.md # This file
|
|
└── CLAUDE.md # Development guidelines
|
|
```
|
|
|
|
## Key Technologies
|
|
|
|
- **Mapbox GL JS v3.0.1**: Globe projection & rendering
|
|
- **GeoJSON**: Standard geographic data format
|
|
- **Clustering API**: Point aggregation & expansion
|
|
- **Step Expressions**: Data-driven styling
|
|
- **Event Handlers**: Interactive cluster navigation
|
|
|
|
## Performance Notes
|
|
|
|
- Clustering reduces 311 points to ~30-50 visible clusters at low zoom
|
|
- Smooth 60fps rotation maintained
|
|
- Click-to-expand provides progressive detail disclosure
|
|
- Layer filtering optimizes render pipeline
|
|
- `generateId: true` enables efficient feature queries
|
|
|
|
## Educational Insights
|
|
|
|
The visualization reveals:
|
|
- **Dense Urban Concentrations**: Major cities show 5-10 clustered schools
|
|
- **Resource Disparity**: Color coding shows global inequality in educational resources
|
|
- **Regional Patterns**: Different continents show varying school densities
|
|
- **Internet Access**: Clear digital divide visible in access patterns
|
|
- **Institutional Types**: University concentrations in developed regions
|
|
|
|
## Future Enhancements
|
|
|
|
Potential additions for subsequent iterations:
|
|
- Time-series data showing enrollment trends
|
|
- 3D extrusions for student population
|
|
- Filtering by school type or resource level
|
|
- Search functionality for specific schools
|
|
- Comparative analysis between regions
|
|
- Real-time enrollment data integration
|
|
|
|
## Attribution
|
|
|
|
- **Mapbox Token**: Public example token (replace for production)
|
|
- **Web Research**: Mapbox Cluster Example Documentation
|
|
- **Clustering Technique**: Learned from official Mapbox examples
|
|
- **Design Pattern**: Progressive disclosure through clustering
|
|
|
|
---
|
|
|
|
**Iteration**: 8
|
|
**Theme**: Global Educational Infrastructure
|
|
**Technique**: Advanced Point Clustering
|
|
**Dataset Size**: 311 schools across 142 countries
|
|
**Web Source**: Mapbox Cluster API Documentation
|