From 2c3722146afbcacb6c2c30ecda899a21ef953c25 Mon Sep 17 00:00:00 2001 From: Your Name Date: Mon, 22 Dec 2025 23:05:44 -0500 Subject: [PATCH] Fix map center drift by using geographic center instead of bounds center MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- src/components/Map/useMapCore.js | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/components/Map/useMapCore.js b/src/components/Map/useMapCore.js index 625fbc3..081e837 100644 --- a/src/components/Map/useMapCore.js +++ b/src/components/Map/useMapCore.js @@ -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 {}