Fix map center drift by using geographic center instead of bounds center

Problem: Map position drifted north/higher on each reload because
bounds.getCenter() returns a visually offset center when pitch is applied

Solution:
- Use map.getCenter() for accurate geographic center (not affected by pitch)
- Save and restore bearing (rotation) along with pitch
- Store: lat, lon, zoom, pitch, bearing

Before: bounds.getCenter() → visual center (offset by 3D tilt)
After: map.getCenter() → true geographic center

This ensures the map returns to the exact same position after reload,
regardless of the 3D tilt angle.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
Your Name 2025-12-22 23:05:44 -05:00
parent f22b9dfe06
commit 2c3722146a
1 changed files with 11 additions and 4 deletions

View File

@ -84,6 +84,10 @@ export function useMapCore(theme) {
map.setZoom(v.zoom);
// Restore pitch from storage, default to 45 if not saved
map.setPitch(typeof v.pitch === "number" ? v.pitch : 45);
// Restore bearing (rotation) if saved
if (typeof v.bearing === "number") {
map.setBearing(v.bearing);
}
hadLastView = true;
}
}
@ -114,14 +118,17 @@ export function useMapCore(theme) {
const vp = getViewFromMap(map);
setViewParams(vp);
try {
const center = vp.center;
// Use map.getCenter() directly for accurate geographic center
// (bounds.getCenter() can be offset when pitch is applied)
const center = map.getCenter();
localStorage.setItem(
LAST_VIEW_KEY,
JSON.stringify({
lat: center[1],
lon: center[0],
lat: center.lat,
lon: center.lng,
zoom: map.getZoom(),
pitch: map.getPitch()
pitch: map.getPitch(),
bearing: map.getBearing()
})
);
} catch {}