Afficher la résolution native 0,2 m au lieu d'étirer le niveau 0,4 m

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Antoine Jacquin
2026-09-27 12:50:53 +02:00
parent 759cb96dcc
commit 34152269aa
4 changed files with 18 additions and 10 deletions

View File

@ -962,7 +962,10 @@ def map_meta():
"tile_size": tiles_mod.TILE_SIZE * 2,
"zoom_offset": -1,
"min_zoom": tiles_mod.TILE_MIN_Z,
"max_native_zoom": tiles_mod.TILE_MAX_NATIVE_Z - 1,
# Numérotation standard, comme le niveau de tuile Leaflet (l'URL @2x
# est un cran en dessous via zoom_offset) : 19 = 0,2 m/px natif,
# servi en 18@2x. Annoncer 18 plafonnait l'affichage à 0,4 m/px.
"max_native_zoom": tiles_mod.TILE_MAX_NATIVE_Z,
"bounds": tiles_mod.grid_bounds_wgs84(OUTPUT_DIR),
"stamp": tiles_mod.tiles_stamp(OUTPUT_DIR),
"attribution": ATTRIBUTION,

View File

@ -565,16 +565,18 @@ function tileUrl(key) {
// Couche à niveaux standard pairs seulement (stockage réduit côté serveur) :
// à un zoom impair, les tuiles du niveau pair SUPÉRIEUR sont affichées
// 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).
// réduites de moitié (nettes). Exception : le niveau natif lui-même (19,
// impair — 0,2 m/px) est demandé tel quel, rendu à la volée par le serveur.
// Le replier sur le niveau pair inférieur plafonnait l'affichage à 0,4 m/px,
// étiré ensuite par le navigateur : la pleine résolution n'était jamais vue.
// Au-delà du natif, Leaflet étire le niveau natif (jamais de tuile agrandie
// côté serveur). Le niveau de tuile Leaflet est ici la numérotation standard
// (zoomOffset −1 avec des tuiles de 512 px).
const EvenLevelTileLayer = ZoomAnimTileLayer.extend({
_clampZoom(zoom) {
let z = L.TileLayer.prototype._clampZoom.call(this, zoom);
if (this.options.evenLevels && z % 2) {
const maxN = this.options.maxNativeZoom;
z = (maxN !== undefined && z + 1 > maxN) ? z - 1 : z + 1;
}
const maxN = this.options.maxNativeZoom;
if (this.options.evenLevels && z % 2 && (maxN === undefined || z < maxN)) z += 1;
return z;
}
});

View File

@ -208,7 +208,7 @@ def test_map_meta(tmp_path, monkeypatch):
assert meta["tile_url"] == "tiles/{layer}/{z}/{x}/{y}@2x.avif"
assert meta["even_levels"] is True
assert meta["tile_size"] == 512 and meta["zoom_offset"] == -1
assert meta["max_native_zoom"] == 18
assert meta["max_native_zoom"] == 19
assert meta["bounds"] and meta["stamp"] > 0
assert meta["default_layers"] == ["relief_oriente"]
@ -409,6 +409,9 @@ def test_ui_uses_standard_tilelayer():
assert "tileSize: META.tile_size" in _MAP_JS
assert "zoomOffset: META.zoom_offset" in _MAP_JS
assert "maxNativeZoom: META.max_native_zoom" in _MAP_JS
# Le niveau natif impair (19 = 0,2 m/px) est demandé tel quel, jamais
# replié sur le pair inférieur (affichage plafonné à 0,4 m/px).
assert "z % 2 && (maxN === undefined || z < maxN)" in _MAP_JS
# Plus aucune mécanique de l'ancienne carte
for banned in ("quadMatrix3d", "FULL_CAP", "ovTick", "layoutTiles"):
assert banned not in _MAP_JS