@mytec: iter10.4 start
This commit is contained in:
170
RFCP-Iteration10.4-Fix-Stadia-Maps-401.md
Normal file
170
RFCP-Iteration10.4-Fix-Stadia-Maps-401.md
Normal file
@@ -0,0 +1,170 @@
|
|||||||
|
# RFCP Iteration 10.4 — Fix Stadia Maps 401 Error on Mobile
|
||||||
|
|
||||||
|
**Date:** 2025-01-30
|
||||||
|
**Status:** Ready for Implementation
|
||||||
|
**Priority:** Medium
|
||||||
|
**Estimated Effort:** 10-15 minutes
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Problem Statement
|
||||||
|
|
||||||
|
On mobile Safari (iOS), the Topo/Elev map tiles show:
|
||||||
|
```
|
||||||
|
401 Error
|
||||||
|
Invalid Authentication
|
||||||
|
docs.stadiamaps.com/authentication
|
||||||
|
```
|
||||||
|
|
||||||
|
**Root Cause:** Stadia Maps requires API key authentication for production use. Desktop browsers may work due to referrer/caching, but mobile Safari enforces stricter policies.
|
||||||
|
|
||||||
|
**Affected Features:**
|
||||||
|
- Topo button (topographic map layer)
|
||||||
|
- Elev button (elevation/terrain layer)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Solution
|
||||||
|
|
||||||
|
Replace Stadia Maps tiles with **OpenTopoMap** — a free, open-source topographic map that requires no authentication.
|
||||||
|
|
||||||
|
### Why OpenTopoMap?
|
||||||
|
|
||||||
|
| Feature | Stadia (Stamen) | OpenTopoMap |
|
||||||
|
|---------|-----------------|-------------|
|
||||||
|
| API Key Required | Yes | **No** |
|
||||||
|
| Rate Limits | 200k/month | None (fair use) |
|
||||||
|
| Mobile Support | Requires auth | **Works everywhere** |
|
||||||
|
| Contour Lines | Stylized | **More detailed** |
|
||||||
|
| Style | Artistic | Technical/Professional |
|
||||||
|
| Best For | Design | **RF Planning** ✓ |
|
||||||
|
|
||||||
|
OpenTopoMap is actually **better suited** for RF coverage planning — more technical appearance with detailed elevation contours.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Implementation
|
||||||
|
|
||||||
|
### File to Modify
|
||||||
|
|
||||||
|
`/opt/rfcp/frontend/src/components/map/Map.tsx`
|
||||||
|
|
||||||
|
### Find Current Stadia URLs
|
||||||
|
|
||||||
|
Look for URLs containing:
|
||||||
|
- `tiles.stadiamaps.com`
|
||||||
|
- `stamen_terrain`
|
||||||
|
- `stamen_toner`
|
||||||
|
|
||||||
|
### Replace With OpenTopoMap
|
||||||
|
|
||||||
|
**Before (Stadia Maps):**
|
||||||
|
```typescript
|
||||||
|
const topoLayer = L.tileLayer(
|
||||||
|
'https://tiles.stadiamaps.com/tiles/stamen_terrain/{z}/{x}/{y}{r}.png',
|
||||||
|
{
|
||||||
|
attribution: '© Stamen Design, © OpenMapTiles, © OpenStreetMap',
|
||||||
|
maxZoom: 18,
|
||||||
|
}
|
||||||
|
);
|
||||||
|
```
|
||||||
|
|
||||||
|
**After (OpenTopoMap):**
|
||||||
|
```typescript
|
||||||
|
const topoLayer = L.tileLayer(
|
||||||
|
'https://tile.opentopomap.org/{z}/{x}/{y}.png',
|
||||||
|
{
|
||||||
|
attribution: 'Map data: © <a href="https://openstreetmap.org">OpenStreetMap</a> contributors, <a href="http://viewfinderpanoramas.org">SRTM</a> | Map style: © <a href="https://opentopomap.org">OpenTopoMap</a> (<a href="https://creativecommons.org/licenses/by-sa/3.0/">CC-BY-SA</a>)',
|
||||||
|
maxZoom: 17, // OpenTopoMap max zoom is 17
|
||||||
|
}
|
||||||
|
);
|
||||||
|
```
|
||||||
|
|
||||||
|
### Also Check for Elevation Layer
|
||||||
|
|
||||||
|
If there's a separate elevation/terrain layer, replace similarly:
|
||||||
|
|
||||||
|
**Before:**
|
||||||
|
```typescript
|
||||||
|
'https://tiles.stadiamaps.com/tiles/stamen_terrain_background/{z}/{x}/{y}{r}.png'
|
||||||
|
```
|
||||||
|
|
||||||
|
**After:**
|
||||||
|
```typescript
|
||||||
|
'https://tile.opentopomap.org/{z}/{x}/{y}.png'
|
||||||
|
```
|
||||||
|
|
||||||
|
### Alternative: Keep Both Options
|
||||||
|
|
||||||
|
If you want to keep Stadia as an option (for desktop users who like the style), you could:
|
||||||
|
|
||||||
|
1. Try OpenTopoMap first
|
||||||
|
2. Fallback to Stadia if user has API key configured
|
||||||
|
3. Or just replace completely (simpler)
|
||||||
|
|
||||||
|
**Recommendation:** Just replace completely — OpenTopoMap is better for this use case anyway.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Testing Checklist
|
||||||
|
|
||||||
|
- [ ] Desktop Chrome: Topo button shows OpenTopoMap tiles
|
||||||
|
- [ ] Desktop Chrome: Elev button works (if separate from Topo)
|
||||||
|
- [ ] Mobile Safari: No 401 errors
|
||||||
|
- [ ] Mobile Safari: Topo/terrain tiles load correctly
|
||||||
|
- [ ] Mobile Chrome: Same tests
|
||||||
|
- [ ] Zoom levels 1-17 work correctly
|
||||||
|
- [ ] Attribution displays properly
|
||||||
|
- [ ] Coverage heatmap overlays correctly on new tiles
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Verification Commands
|
||||||
|
|
||||||
|
After implementation:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd /opt/rfcp/frontend
|
||||||
|
|
||||||
|
# Check for any remaining Stadia references
|
||||||
|
grep -r "stadiamaps" src/
|
||||||
|
|
||||||
|
# Should return empty (no matches)
|
||||||
|
|
||||||
|
# Build and deploy
|
||||||
|
npm run build
|
||||||
|
sudo systemctl reload caddy
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Rollback Plan
|
||||||
|
|
||||||
|
If OpenTopoMap has issues (unlikely), can switch to other free providers:
|
||||||
|
|
||||||
|
1. **Esri World Topo:**
|
||||||
|
```
|
||||||
|
https://server.arcgisonline.com/ArcGIS/rest/services/World_Topo_Map/MapServer/tile/{z}/{y}/{x}
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **CartoDB Voyager:**
|
||||||
|
```
|
||||||
|
https://{s}.basemaps.cartocdn.com/rastertiles/voyager/{z}/{x}/{y}{r}.png
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Notes
|
||||||
|
|
||||||
|
- OpenTopoMap maxZoom is 17 (not 18 like Stadia)
|
||||||
|
- OpenTopoMap servers are in Germany — may be slightly slower for Ukraine, but still fast
|
||||||
|
- Fair use policy: don't hammer the servers with excessive requests
|
||||||
|
- HTTPS required (already using it)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Reference
|
||||||
|
|
||||||
|
- OpenTopoMap: https://opentopomap.org/
|
||||||
|
- Leaflet Providers: https://leaflet-extras.github.io/leaflet-providers/preview/
|
||||||
|
- Previous iteration: RFCP-Iteration10.3.2-Fix-Boundary-Rendering.md
|
||||||
Reference in New Issue
Block a user