Synchroniser l'animation de zoom du fond et du relief, dater les tuiles à l'horloge précise
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@ -389,8 +389,28 @@ const map = L.map('map', {
|
||||
map.attributionControl.setPrefix('');
|
||||
L.control.scale({ metric: true, imperial: false, position: 'bottomleft' }).addTo(map);
|
||||
|
||||
const base = L.tileLayer('https://tile.openstreetmap.org/{z}/{x}/{y}.png', {
|
||||
// Pendant l'animation de zoom, transformations SEULES (aucun niveau créé,
|
||||
// tuiles chargées à la fin) : un niveau neuf n'est pas composé par Chrome
|
||||
// (vide au départ, il est animé sur le thread principal, gelé ~90 ms par le
|
||||
// chargement). Le fond sautait alors que le relief orienté, qui garde son
|
||||
// niveau pair, glissait normalement — les deux couches se désynchronisaient.
|
||||
// Leaflet 1.9 déclenche aussi « zoom » dès le DÉBUT de l'animation : même
|
||||
// garde dans _resetView tant que la carte anime.
|
||||
const ZoomAnimTileLayer = L.TileLayer.extend({
|
||||
_animateZoom(e) { this._setView(e.center, e.zoom, true, true); },
|
||||
_resetView(e) {
|
||||
if (this._map && this._map._animatingZoom) {
|
||||
this._setView(this._map.getCenter(), this._map.getZoom(), true, true);
|
||||
return;
|
||||
}
|
||||
L.TileLayer.prototype._resetView.call(this, e);
|
||||
}
|
||||
});
|
||||
|
||||
const base = new ZoomAnimTileLayer('https://tile.openstreetmap.org/{z}/{x}/{y}.png', {
|
||||
maxZoom: 22, maxNativeZoom: 19, keepBuffer: 2, className: 'base-dark',
|
||||
// Sinon _setView recrée un niveau en cours d'animation malgré noUpdate.
|
||||
updateWhenZooming: false,
|
||||
attribution: '© <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a>'
|
||||
}).addTo(map);
|
||||
|
||||
@ -545,7 +565,7 @@ function tileUrl(key) {
|
||||
// réduites de moitié (nettes) ; au-delà du zoom natif, le niveau inférieur.
|
||||
// Le niveau de tuile Leaflet est ici la numérotation standard (zoomOffset −1
|
||||
// avec des tuiles de 512 px).
|
||||
const EvenLevelTileLayer = L.TileLayer.extend({
|
||||
const EvenLevelTileLayer = ZoomAnimTileLayer.extend({
|
||||
_clampZoom(zoom) {
|
||||
let z = L.TileLayer.prototype._clampZoom.call(this, zoom);
|
||||
if (this.options.evenLevels && z % 2) {
|
||||
|
||||
Reference in New Issue
Block a user