301 lines
7.4 KiB
Markdown
301 lines
7.4 KiB
Markdown
# Mapbox Globe 11: Measles Vaccination Coverage vs. Disease Outbreaks
|
|
|
|
## Setup Instructions
|
|
|
|
### Prerequisites
|
|
- A Mapbox account and access token
|
|
- Modern web browser with WebGL support
|
|
- Local web server (for CORS compatibility)
|
|
|
|
### Quick Start
|
|
|
|
1. **Get a Mapbox Access Token**
|
|
- Visit [mapbox.com](https://www.mapbox.com/)
|
|
- Create a free account
|
|
- Navigate to Account → Access Tokens
|
|
- Copy your default public token
|
|
|
|
2. **Configure the Token**
|
|
- Open `src/index.js`
|
|
- Replace the placeholder token on line 4:
|
|
```javascript
|
|
mapboxgl.accessToken = 'YOUR_MAPBOX_TOKEN_HERE';
|
|
```
|
|
|
|
3. **Run a Local Server**
|
|
|
|
Using Python 3:
|
|
```bash
|
|
python -m http.server 8000
|
|
```
|
|
|
|
Using Node.js (http-server):
|
|
```bash
|
|
npx http-server -p 8000
|
|
```
|
|
|
|
Using PHP:
|
|
```bash
|
|
php -S localhost:8000
|
|
```
|
|
|
|
4. **Open in Browser**
|
|
- Navigate to `http://localhost:8000`
|
|
- The globe should load automatically
|
|
- Allow a few seconds for map tiles to load
|
|
|
|
## File Structure
|
|
|
|
```
|
|
mapbox_globe_11/
|
|
├── index.html # Main HTML with UI and styles
|
|
├── src/
|
|
│ ├── index.js # Mapbox initialization and interaction logic
|
|
│ └── data/
|
|
│ └── data.js # GeoJSON data (85+ countries, 50+ outbreaks)
|
|
├── README.md # Detailed analysis and findings
|
|
└── CLAUDE.md # This file (setup guide)
|
|
```
|
|
|
|
## Architecture
|
|
|
|
### Data Flow
|
|
1. `index.html` loads Mapbox GL JS library and stylesheets
|
|
2. `src/index.js` imports from `src/data/data.js`
|
|
3. GeoJSON features are split into two sources:
|
|
- Countries (Polygon/MultiPolygon) → Coverage choropleth
|
|
- Outbreaks (Point) → Proportional circles
|
|
4. Interactive layers render on globe projection
|
|
5. Event handlers provide click/hover interactions
|
|
|
|
### Key Components
|
|
|
|
**Map Configuration:**
|
|
- Projection: `globe` with fog effects
|
|
- Initial view: Center [15, 25], Zoom 1.5
|
|
- Style: `mapbox://styles/mapbox/dark-v11`
|
|
- Auto-rotation enabled (0.15° per frame)
|
|
|
|
**Data Sources:**
|
|
- `measles-countries`: Polygon features for coverage choropleth
|
|
- `measles-outbreaks`: Point features for outbreak circles
|
|
|
|
**Layers:**
|
|
1. `coverage-layer` (fill): Vaccination coverage choropleth
|
|
2. `borders-layer` (line): Country boundaries
|
|
3. `outbreaks-layer` (circle): Outbreak points (main)
|
|
4. `outbreaks-pulse` (circle): Animated pulse effect
|
|
|
|
**Interactive Controls:**
|
|
- Toggle buttons for each layer
|
|
- Click popups for detailed information
|
|
- Hover cursor changes
|
|
- Automatic rotation with manual override
|
|
|
|
### Color Scales
|
|
|
|
**Coverage Choropleth:**
|
|
```javascript
|
|
0% → #ff6f00 (Deep Orange - Critical)
|
|
60% → #ffb74d (Light Orange - Low)
|
|
75% → #42a5f5 (Light Blue - Moderate)
|
|
85% → #1976d2 (Medium Blue - Good)
|
|
95%+ → #1565c0 (Dark Blue - Excellent)
|
|
```
|
|
|
|
**Outbreak Circles:**
|
|
- Fill: `rgba(239, 83, 80, 0.7)` (Semi-transparent red)
|
|
- Stroke: `#ef5350` (Solid red)
|
|
- Size: Interpolated by case count (6px to 32px)
|
|
|
|
## Data Schema
|
|
|
|
### Country Features
|
|
```javascript
|
|
{
|
|
"type": "Feature",
|
|
"geometry": { "type": "Polygon", "coordinates": [...] },
|
|
"properties": {
|
|
"name": "Country Name",
|
|
"coverage_dose1": 83, // % first dose coverage
|
|
"coverage_dose2": 74, // % second dose coverage
|
|
"income_level": "middle", // low | middle | high
|
|
"cases_2023": 15000, // total cases in 2023
|
|
"deaths_2023": 120 // total deaths in 2023
|
|
}
|
|
}
|
|
```
|
|
|
|
### Outbreak Features
|
|
```javascript
|
|
{
|
|
"type": "Feature",
|
|
"geometry": { "type": "Point", "coordinates": [lng, lat] },
|
|
"properties": {
|
|
"location": "City/Region",
|
|
"country": "Country Name",
|
|
"outbreak_year": 2023,
|
|
"cases": 5000, // outbreak case count
|
|
"deaths": 45, // outbreak death toll
|
|
"coverage_local": 68 // local coverage %
|
|
}
|
|
}
|
|
```
|
|
|
|
## Customization Guide
|
|
|
|
### Adjusting Colors
|
|
|
|
**Change coverage color scheme:**
|
|
Edit `src/index.js` around line 45:
|
|
```javascript
|
|
'fill-color': [
|
|
'interpolate', ['linear'], ['get', 'coverage_dose1'],
|
|
0, '#YOUR_LOW_COLOR',
|
|
50, '#YOUR_MID_COLOR',
|
|
95, '#YOUR_HIGH_COLOR'
|
|
]
|
|
```
|
|
|
|
**Change outbreak circle colors:**
|
|
Edit `src/index.js` around line 70:
|
|
```javascript
|
|
'circle-color': 'rgba(R, G, B, opacity)',
|
|
'circle-stroke-color': '#HEXCOLOR'
|
|
```
|
|
|
|
### Modifying Circle Sizes
|
|
|
|
Edit the circle-radius interpolation in `src/index.js`:
|
|
```javascript
|
|
'circle-radius': [
|
|
'interpolate', ['linear'], ['get', 'cases'],
|
|
MIN_CASES, MIN_RADIUS,
|
|
MAX_CASES, MAX_RADIUS
|
|
]
|
|
```
|
|
|
|
### Adding New Countries/Outbreaks
|
|
|
|
Add features to `src/data/data.js`:
|
|
```javascript
|
|
export const measlesData = {
|
|
"type": "FeatureCollection",
|
|
"features": [
|
|
// ... existing features
|
|
{
|
|
"type": "Feature",
|
|
"geometry": { ... },
|
|
"properties": { ... }
|
|
}
|
|
]
|
|
};
|
|
```
|
|
|
|
### Disabling Auto-Rotation
|
|
|
|
In `src/index.js`, set:
|
|
```javascript
|
|
let spinEnabled = false;
|
|
```
|
|
|
|
Or comment out the `spinGlobe()` function call.
|
|
|
|
## Performance Optimization
|
|
|
|
### For Large Datasets
|
|
- Use `simplify` on polygon geometries to reduce vertices
|
|
- Implement clustering for outbreak points
|
|
- Add zoom-based layer visibility
|
|
- Use vector tiles instead of inline GeoJSON
|
|
|
|
### Rendering Improvements
|
|
```javascript
|
|
// Add to map initialization
|
|
map.setRenderWorldCopies(false); // Disable duplicate globes
|
|
map.setMaxBounds([[-180, -90], [180, 90]]); // Constrain panning
|
|
```
|
|
|
|
## Troubleshooting
|
|
|
|
### Map Not Loading
|
|
1. Check browser console for errors
|
|
2. Verify Mapbox token is valid and not expired
|
|
3. Ensure local server is running (no `file://` protocol)
|
|
4. Check network tab for failed tile requests
|
|
|
|
### Performance Issues
|
|
- Reduce polygon complexity in data
|
|
- Disable fog effects on low-end devices
|
|
- Remove pulse animation layer
|
|
- Increase interpolation steps in color scales
|
|
|
|
### Data Not Displaying
|
|
- Verify GeoJSON syntax in `data.js`
|
|
- Check coordinate order (longitude, latitude)
|
|
- Ensure property names match layer expressions
|
|
- Look for JavaScript errors in console
|
|
|
|
## Browser Compatibility
|
|
|
|
**Supported:**
|
|
- Chrome 80+
|
|
- Firefox 75+
|
|
- Safari 13+
|
|
- Edge 80+
|
|
|
|
**Requirements:**
|
|
- WebGL support
|
|
- ES6 module support
|
|
- Fetch API
|
|
|
|
## Deployment
|
|
|
|
### Static Hosting
|
|
Works with any static host:
|
|
- GitHub Pages
|
|
- Netlify
|
|
- Vercel
|
|
- AWS S3 + CloudFront
|
|
|
|
### Build Process
|
|
No build step required - vanilla HTML/JS/CSS.
|
|
|
|
### Environment Variables
|
|
Store Mapbox token in environment variable:
|
|
```javascript
|
|
mapboxgl.accessToken = process.env.MAPBOX_TOKEN || 'fallback-token';
|
|
```
|
|
|
|
## Research Context
|
|
|
|
This visualization is based on WHO/UNICEF research findings:
|
|
- 60 million lives saved through measles vaccination (2000-2023)
|
|
- 83% first dose, 74% second dose global coverage (2023)
|
|
- 20% increase in cases, outbreaks in 57 countries (2023)
|
|
- 95% coverage required for herd immunity
|
|
- Stark income-level disparities (64% low-income vs 86% middle-income)
|
|
|
|
The dual-layer approach clearly demonstrates the correlation between low vaccination coverage and outbreak occurrence, with special emphasis on conflict zones and fragile states.
|
|
|
|
## License
|
|
|
|
This visualization uses:
|
|
- Mapbox GL JS (BSD-3-Clause)
|
|
- Data from public health sources (WHO, UNICEF)
|
|
|
|
## Support
|
|
|
|
For issues with:
|
|
- **Mapbox**: [docs.mapbox.com](https://docs.mapbox.com/)
|
|
- **Data questions**: Refer to WHO measles surveillance reports
|
|
- **Visualization bugs**: Check browser console and verify data schema
|
|
|
|
---
|
|
|
|
**Generated**: 2025
|
|
**Iteration**: 11
|
|
**Topic**: Measles Vaccination Coverage vs. Disease Outbreaks
|
|
**Technology**: Mapbox GL JS v3.0.1
|
|
**Projection**: Globe with atmospheric effects
|