From daabbc63c7bc0e9908c24fc3d4541a1997bbc0bb Mon Sep 17 00:00:00 2001 From: rouggy Date: Sun, 30 Aug 2026 15:30:30 +0200 Subject: [PATCH] fix(map): Zoom DX clamps its frame to Mercator's edge MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The great-circle arc to a polar entity (Franz Josef Land) peaks near 88°N; fitting the raw arc points framed a band of tile-less white above 85°, where Web Mercator ends. The camera's bounds are clamped to ±85° — the line still draws to wherever it goes, only the framing stays where there is a map. --- changelog.json | 6 ++++-- frontend/src/components/MainMap.tsx | 10 ++++++++-- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/changelog.json b/changelog.json index a3f2410..3b4dd00 100644 --- a/changelog.json +++ b/changelog.json @@ -7,14 +7,16 @@ "Elecraft console: the power meter reads in real watts. The K3’s bargraph is relative to a range that flips at 12 W — calibrated against a real radio’s full table, the PC setting picks the range and the bar converts to watts.", "Watchlist: a visual pass toward DXHunter’s look — pink callsigns, counter pills, quieter cards with a hover, the ⚡ back on the DXpedition badge.", "WSJT-X / JTDX: OpsLog can highlight decodes in the decoder’s own Band Activity window from your log — watchlist members pink, new DXCC green, new band orange (option in Settings → Connections). And a freshly-started decoder is asked to replay its on-screen decodes, so the FT decodes panel starts full.", - "WSJT-X / JTDX / MSHV: only a CHANGED DX Call updates the entry — the decoder re-broadcasts the same call endlessly, and it kept overwriting a spot clicked in OpsLog." + "WSJT-X / JTDX / MSHV: only a CHANGED DX Call updates the entry — the decoder re-broadcasts the same call endlessly, and it kept overwriting a spot clicked in OpsLog.", + "Map: Zoom DX toward a polar entity no longer frames a band of blank white above the top of the world — the camera stays within the map’s ±85°, the path still draws." ], "fr": [ "Les opérations groupées fonctionnent quelle que soit la taille de la sélection — définir un champ, corriger des fréquences, supprimer, marquer les uploads et exporter la sélection échouaient avec « too many SQL variables » au-delà de quelques dizaines de milliers de QSO. Les requêtes sont désormais émises par tranches.", "Console Elecraft : le wattmètre lit en vrais watts. Le bargraph du K3 est relatif à une gamme qui bascule à 12 W — calibré sur la table complète d’une vraie radio, le réglage PC choisit la gamme et la barre se convertit en watts.", "Watchlist : une passe visuelle vers le look DXHunter — indicatifs roses, compteurs en pastilles, cartes plus feutrées avec survol, le ⚡ de retour sur le badge DXpedition.", "WSJT-X / JTDX : OpsLog peut surligner les décodages dans la fenêtre Band Activity du décodeur selon votre log — watchlist en rose, nouveau DXCC en vert, nouvelle bande en orange (option dans Réglages → Connections). Et un décodeur fraîchement détecté rejoue ses décodages à l’écran, donc le panneau FT decodes démarre plein.", - "WSJT-X / JTDX / MSHV : seul un DX Call qui CHANGE met à jour la saisie — le décodeur rediffuse le même call sans fin, et il écrasait un spot cliqué dans OpsLog." + "WSJT-X / JTDX / MSHV : seul un DX Call qui CHANGE met à jour la saisie — le décodeur rediffuse le même call sans fin, et il écrasait un spot cliqué dans OpsLog.", + "Carte : Zoom DX vers une entité polaire ne cadre plus une bande blanche au-dessus du haut du monde — la caméra reste dans les ±85° de la carte, le trajet se dessine toujours." ] }, { diff --git a/frontend/src/components/MainMap.tsx b/frontend/src/components/MainMap.tsx index 4a72b75..13ec91e 100644 --- a/frontend/src/components/MainMap.tsx +++ b/frontend/src/components/MainMap.tsx @@ -370,8 +370,14 @@ export function WorldMap({ fromGrid, toGrid, fromLabel, toLabel, beamAzimuths, b if (autoZoom) { if (from && to && arcPts) { - const bounds = L.latLngBounds([[from.lat, from.lon], [to.lat, to.lon]]); - arcPts.forEach((p) => bounds.extend(p as L.LatLngExpression)); + // Latitudes clamped to Mercator's edge (±85°): the arc to a polar + // entity (Franz Josef Land) peaks near 88°N, and fitting the raw + // points framed a band of tile-less white above the top of the world. + // The line itself still draws to wherever it goes — only the CAMERA + // stays where there is a map to show. + const clamp = (lat: number) => Math.max(-85, Math.min(85, lat)); + const bounds = L.latLngBounds([[clamp(from.lat), from.lon], [clamp(to.lat), to.lon]]); + arcPts.forEach((p) => bounds.extend([clamp(p[0]), p[1]] as L.LatLngExpression)); wm.fitBounds(bounds, { padding: [30, 30], maxZoom: 6 }); } else if (to) { wm.setView([to.lat, to.lon], 3);