9
103
Fork
You've already forked web
30

WIP: custom pmtiles protocol to only display even zoom levels #1090

Draft
etienneJr wants to merge 1 commit from hide-odd-zoom-levels into master
pull from: hide-odd-zoom-levels
merge into: cartes:master
cartes:master
cartes:abostats
cartes:SynchroM-master
cartes:gps
cartes:embeddings
cartes:lysios-patch-5
cartes:lysios-patch-4
cartes:lysios-patch-3
cartes:lysios-patch-2
cartes:lysios-patch-1
cartes:abo-serveur2
cartes:clim
cartes:zone-en-favori
cartes:categories_toujours_visibles
cartes:rechercher_ici_avant_resultats
cartes:test-2365
cartes:panoramax-contribution
cartes:add-categories-validations
cartes:gel-bug-prod
cartes:osm-note-2
cartes:broken
cartes:wikidata_booking
cartes:fuse7.3
cartes:lysios-patrimoine-3
cartes:gps2
cartes:atproto-fix-2
cartes:styles-secondaires-mais-maison
cartes:atproto-scopes
cartes:itineraire-printemps-2026
cartes:modal-sheet-5.6
cartes:nlnet-cost-climate-perf
cartes:pb-icones-religieux
cartes:couvoiture
cartes:etiennejr-patch-2
cartes:meteo-fainéante
cartes:logo-static-url
cartes:poc-page-vitrine
cartes:remove-compass
cartes:test-reproduce-1795
cartes:display-cycleway-lanes-2
cartes:poc-image
cartes:add-media-condition
cartes:mapterhorn
cartes:test-indoor-equal
cartes:outdoors-VS-indoorEqual
cartes:hiking-colors
cartes:fix-blog-typing
cartes:poc-next-international
cartes:fix-map-style-modal-not-closing
cartes:i18n
cartes:filter_categories
cartes:resume_wikipedia
cartes:deplacement_bouttons
cartes:fix-1095
cartes:mobile_permettre_selection
cartes:position-carte-initiale
cartes:dégradé-icônes
cartes:better_wikipedia
cartes:affichage_donnees_wikidata
cartes:mobile-permettre-selection
cartes:avis-details
cartes:perf-seo
cartes:modal-sheet-5
cartes:plans-novembre
cartes:display-cycleway-lanes
cartes:fix-1227
cartes:fix-1234
cartes:etiennejr-patch-1
cartes:update-1240
cartes:fix-1236
cartes:fix-1131
cartes:photon-search-street
cartes:fix-1221
cartes:article-avis
cartes:net-haut-zoom
cartes:baies-moins-visibles
cartes:belles-fiches-lieu
cartes:fix-1157
cartes:bug-page-vie-privée
cartes:use-watername
cartes:fix-1176
cartes:carte-du-onde
cartes:fix-1166
cartes:page-news
cartes:tchou
cartes:add-icon-alias
cartes:vitesse
cartes:photon-opensearch
cartes:private-in-italic
cartes:bâtiments-3D
cartes:merge-categories
cartes:handle-private-highway
cartes:improve-findcategory
cartes:injection-pmtiles
cartes:fix-1128
cartes:check-icons
cartes:update-readme
cartes:category-rugby
cartes:bug-position-carte-vs-lieu
cartes:limites-vitesse
cartes:improve-find-category-from-tags-v2
cartes:integrer
cartes:document-osmfeature
cartes:translate-document
cartes:velo-fin-aout-25
cartes:velo-ete-2025
cartes:moins-de-maptiler
cartes:planet-pmtiles-tilemaker
cartes:fix-1048
cartes:panoramax-leger
cartes:plume
cartes:horaires-i18n
cartes:planet
cartes:maj-deps-juillet-2025
cartes:improve-find-category-from-tags
cartes:bug-encart
cartes:interactions-encart-mobile
cartes:clic-on-station
cartes:fix-1028
cartes:fix-1014
cartes:edit
cartes:add-big-rivers
cartes:add-shortbread-tiles
cartes:handle-deleted-osm-elements-v2
cartes:codeberg
cartes:improve-useEffect
cartes:immoloc
cartes:update-dashboard
cartes:analyze
cartes:terradraw
cartes:sombre2
cartes:calendar
cartes:poi-sprites-using-svg
cartes:style-sombre
cartes:sprites
cartes:annuaire
cartes:motis-gtfs-attributes
cartes:next-styled-components
cartes:dev
cartes:cool2
cartes:cool
cartes:panoramax-angle
cartes:env-static-urls
cartes:borders-only
cartes:panoramax2
cartes:intelligence
cartes:debug-iles
cartes:nouveau-serveur
cartes:france-protomaps
cartes:turbo
cartes:fouss/cartes-#338
cartes:blog2
cartes:legislatives
cartes:presentation
cartes:pas-de-geoloc-si-hash-different
cartes:protomaps
cartes:vaul
cartes:carte-trains
cartes:citiz
cartes:maj-paquets
cartes:icones
cartes:ui2
cartes:bblog
cartes:voyagevoyage
cartes:test-image-origine
cartes:bugimagefin
cartes:searchParams
cartes:voyage
cartes:avion
cartes:perf
cartes:studio
cartes:piscine
cartes:journée
cartes:année
cartes:journée-transition
cartes:score-dès-acceuil
cartes:fix-space-problem
cartes:rebase-5août
cartes:correspondance
cartes:règles-séparées
cartes:indeps-acre
cartes:demo
cartes:indeps
cartes:indeps-cachés
cartes:indication-temps-plein
cartes:indeps-refactor-simulations
cartes:indeps-vue-comparaison
cartes:indeps-inversion
cartes:barème-continu
cartes:indeps-démo
cartes:textes-branches-sécu
cartes:engine-enum
cartes:2019
cartes:transport
cartes:publicodes
cartes:as
cartes:infrance-nouvelle-landing
cartes:better-translation
cartes:co2
cartes:simplifATMP
cartes:controle-SMIC
cartes:webi18n
cartes:bug-avantages-en-nature
cartes:revert-352-infrance-navigation-v2
cartes:laem-patch-1
cartes:robots.txt
cartes:improve-perf
cartes:iframe-bugfix
cartes:quickfixes
cartes:lib
cartes:irsimple
cartes:hiringinfrance.com
cartes:dégradé
cartes:refstate
cartes:johan
cartes:zrr
cartes:logo-interactif
cartes:revert-216-improve-tracking
cartes:redesign2
cartes:zrr2
cartes:fixtrad
cartes:correction-salaire-brut
cartes:petit-state
cartes:alien-consolidate
cartes:translate-ui
cartes:npm
cartes:alien-brut-net
cartes:translatable
cartes:différent
cartes:ir18
cartes:fix-typo
cartes:add-tracking
cartes:fix-collect-missing
cartes:défauts-partout
cartes:fix-double-unfold-three
cartes:fix-double-unfold
cartes:versement-transport
cartes:blocker-questions

Cette PR sert à tester l'idée évoquée dans #1086 de n'afficher que les niveaux de tuiles pairs.

Elle a vocation à être déployée en dev uniquement, pour pouvoir comparer le ressenti utilisateur avec la prod.

La protocole custom a été préparé avec l'aide de wipfll suite à question sur repo pmtiles.

Dans mes essais, la quantité de données de tuiles téléchargées lorsque qu'on zoome on dézoome entre les niveaux 5 et 14 est 2 à 3 fois plus faible.

Pour que maplibre sur- ou sous-zoome dans la dernière tuile, le protocole doit renvoyer une erreur, j'espère que ça ne provoquera pas de crash bleu ?

Cette PR sert à tester l'idée évoquée dans #1086 de n'afficher que les niveaux de tuiles pairs. Elle a vocation à être déployée **en dev** uniquement, pour pouvoir comparer le ressenti utilisateur avec la prod. La protocole custom a été préparé avec l'aide de wipfll suite à [question sur repo pmtiles](https://github.com/protomaps/PMTiles/discussions/591#discussioncomment-14149097). Dans mes essais, la quantité de données de tuiles téléchargées lorsque qu'on zoome on dézoome entre les niveaux 5 et 14 est **2 à 3 fois plus faible**. Pour que maplibre sur- ou sous-zoome dans la dernière tuile, le protocole doit renvoyer une erreur, j'espère que ça ne provoquera pas de crash bleu ?
Author
Member
Copy link

@laem peux tu déployer cette branche hide-odd-zoom-levels en dev ?

@laem peux tu déployer cette branche `hide-odd-zoom-levels` en dev ?
Author
Member
Copy link

Perso en gardant comme ça 1 niveau sur 2, je ne vois pas de différence.

Le seul truc un peu bizarre que j'ai noté, c'est si on est arrivé à un endroit direct à zoom très fort, puis qu'on dézoome jusqu'à zoom 13,xx alors on va avoir un mélange de tuile 14 sous-zoommée (au centre de la carte) et de tuile 12 sur-zoomée. Vous voyez la limite entre les 2 sur cette capture ?

image

Je remarque d'ailleurs que quand maplibre ne trouve pas la tuile de niveau 13, il requête tout seul la tuile de niveau 12, j'en suis moi même surpris. Mais c'est super efficace, il n'y a jamais de trou dans le fond de cartes, même quand on glisse la carte à un zoom qui "n'existe pas" dans les tuiles.

Perso en gardant comme ça 1 niveau sur 2, je ne vois pas de différence. Le seul truc un peu bizarre que j'ai noté, c'est si on est arrivé à un endroit direct à zoom très fort, puis qu'on dézoome jusqu'à zoom 13,xx alors on va avoir un mélange de tuile 14 sous-zoommée (au centre de la carte) et de tuile 12 sur-zoomée. Vous voyez la limite entre les 2 sur cette capture ? ![image](/attachments/30138442-e534-4bdf-8534-102e09cef2e3) Je remarque d'ailleurs que quand maplibre ne trouve pas la tuile de niveau 13, il requête tout seul la tuile de niveau 12, j'en suis moi même surpris. Mais c'est super efficace, il n'y a jamais de trou dans le fond de cartes, même quand on glisse la carte à un zoom qui "n'existe pas" dans les tuiles.
474 KiB
Owner
Copy link

Mince Étienne j'ai complètement zappé ta demande.

Mince Étienne j'ai complètement zappé ta demande.
Owner
Copy link

Voilà @etienneJr j'ai créé dev2.cartes.app juste pour toi :D
En vrai c'est simple dans Dokloy, mais ça demande de faire un nouveau sous-domaine sur la zone DNS donc je n'en ferai pas 36 non plus.

Voilà @etienneJr j'ai créé dev2.cartes.app juste pour toi :D En vrai c'est simple dans Dokloy, mais ça demande de faire un nouveau sous-domaine sur la zone DNS donc je n'en ferai pas 36 non plus.
Author
Member
Copy link

ah génial, merci !
mais il faudrait rebaser cette branche pour qu'on puisse comparer à armes égales.

A première vue (test hyper rapide sur mon tel) ça me parait bien, mais je sais que tu vois beaucoup mieux que moi les petits détails, donc tu me diras ce que tu en penses.

Si on part sur ce fonctionnement, il y aura des petites modifs à faire dans le calcul des tuiles :

  • diminuer un peu le niveau de simplification des lignes
  • inclure les éléments qui apparaissent à zoom impair dans la tuile paire précédente.
    c'est à dire : se permettre d'alourdir un tout petit peu les tuiles paires, vu qu'on gagne énormément grâce au non transfert des tuiles impaires.

@pmiossec tu testeras aussi ?

ah génial, merci ! mais il faudrait rebaser cette branche pour qu'on puisse comparer à armes égales. A première vue (test hyper rapide sur mon tel) ça me parait bien, mais je sais que tu vois beaucoup mieux que moi les petits détails, donc tu me diras ce que tu en penses. Si on part sur ce fonctionnement, il y aura des petites modifs à faire dans le calcul des tuiles : - diminuer un peu le niveau de simplification des lignes - inclure les éléments qui apparaissent à zoom impair dans la tuile paire précédente. c'est à dire : se permettre d'alourdir un tout petit peu les tuiles paires, vu qu'on gagne énormément grâce au non transfert des tuiles impaires. @pmiossec tu testeras aussi ?
Owner
Copy link

D'acc, tu te charges du rebase ou tu veux que je prenne ?

D'acc, tu te charges du rebase ou tu veux que je prenne ?
etienneJr force-pushed hide-odd-zoom-levels from 6d04427863 to f887aaac74 2026年01月21日 15:16:41 +01:00 Compare
Author
Member
Copy link

c'est fait.

c'est fait.
Owner
Copy link

Ah cool on peut préfixer de WIP: pour créer un brouillon, j'avais pas vu :)

Ah cool on peut préfixer de WIP: pour créer un brouillon, j'avais pas vu :)
Owner
Copy link

J'ai redéployé. En quelques secondes de test je ne vois pas de différence.

J'ai redéployé. En quelques secondes de test je ne vois pas de différence.
Owner
Copy link

C'est pas évident à tester, car changer le zoom dans l'URL et taper entrer ne fait pas dans mes tests gagner en poids.

C'est pas évident à tester, car changer le zoom dans l'URL et taper entrer ne fait pas dans mes tests gagner en poids.
Owner
Copy link

En tentant un zoom à la main depuis rennes haut niveau vers rennes zoom 20 je mesure un léger gain de seulement 1mo sur 12mo.

En tentant un zoom à la main depuis rennes haut niveau vers rennes zoom 20 je mesure un léger gain de seulement 1mo sur 12mo.
Author
Member
Copy link

Bizarre, j'avais écrit là haut :

Dans mes essais, la quantité de données de tuiles téléchargées lorsque qu'on zoome on dézoome entre les niveaux 5 et 14 est 2 à 3 fois plus faible.

on demande aux gens de tester sur le forum osm-fr ?

Bizarre, j'avais écrit là haut : >Dans mes essais, la quantité de données de tuiles téléchargées lorsque qu'on zoome on dézoome entre les niveaux 5 et 14 est 2 à 3 fois plus faible. on demande aux gens de tester sur le forum osm-fr ?
Author
Member
Copy link

J'ai investigué : ya un gros pb avec le paramètre experimentalZoomLevelsToOverscale que j'ai introduit dans #1348 : pour pouvoir découper la tuile 14 en petits bouts quand on zoom dedans, bah... maplibre la recharge à chaque fois, dès qu'on bouge ou zoome un petit peu 😭​ ça fait exploser la quantité de données transférées, parce qu'en plus le cache du navigateur n'est pas utilisé (ça je n'ai pas compris pourquoi, un avis @laem ? )

J'ai investigué : ya un gros pb avec le paramètre `experimentalZoomLevelsToOverscale` que j'ai introduit dans #1348 : pour pouvoir découper la tuile 14 en petits bouts quand on zoom dedans, bah... maplibre la recharge à chaque fois, dès qu'on bouge ou zoome un petit peu 😭​ ça fait exploser la quantité de données transférées, parce qu'en plus le cache du navigateur n'est pas utilisé (ça je n'ai pas compris pourquoi, un avis @laem ? )
Author
Member
Copy link

même sans experimentalZoomLevelsToOverscale, il y a un pb de multiples chargements, parce que les tuiles ne sont pas mises en cache dans le navigateur. re 😭

tickets en lien avec le sujet (je n'ai que survolé, c'est trop long et technique)

mais experimentalZoomLevelsToOverscale l'amplifie x4 environ, donc je le désactive de suite tant qu'on n'a pas résolu ce pb.

ça sert à rien de réfléchir à des tuiles plus légères si maplibre les charge des dizaines de fois. ​😤

même sans `experimentalZoomLevelsToOverscale`, il y a un pb de multiples chargements, parce que les tuiles ne sont pas mises en cache dans le navigateur. re 😭 tickets en lien avec le sujet (je n'ai que survolé, c'est trop long et technique) - chez maplibre https://github.com/maplibre/maplibre-gl-js/issues/4074 - et j'ai posé la question ici : https://github.com/maplibre/maplibre-gl-js/discussions/6910 - chez pmtiles https://github.com/protomaps/PMTiles/issues/272 mais `experimentalZoomLevelsToOverscale` l'amplifie x4 environ, donc je le désactive de suite tant qu'on n'a pas résolu ce pb. ça sert à rien de réfléchir à des tuiles plus légères si maplibre les charge des dizaines de fois. ​😤​
Author
Member
Copy link

qq vidéos pour illustrer ce pb de cache
https://cartes.app/#19.41/48.114718/-1.680773

sans experimentalZoomLevelsToOverscale la même tuile est rechargée 9 fois => 3Mo de données pour rien

avec experimentalZoomLevelsToOverscale: 2 la même tuile est rechargée 28 fois => 9Mo

qq vidéos pour illustrer ce pb de cache https://cartes.app/#19.41/48.114718/-1.680773 sans `experimentalZoomLevelsToOverscale` la même tuile est rechargée 9 fois => 3Mo de données pour rien <video src="/attachments/e56d3732-624b-4dca-b2bf-5aa158ac9bb9" title="without" controls></video> avec `experimentalZoomLevelsToOverscale: 2` la même tuile est rechargée 28 fois => 9Mo <video src="/attachments/f6d9b3f1-6f17-46af-9da3-dbedb3641f2d" title="with" controls></video>
Owner
Copy link

Ah la la, je crois que c'est Firefox qui merde dans la mise en cache des appels HTTP range requests sur lesquels sont basés pmtiles. Je viens de confirmer, Chromium met ça en cache. J'imagine que MapLibre repose sur le cache du nav, ce qui est pas bête.

J'avais déjà noté ça ici #1081

Passer à des tuiles x,y,z n'est pas très compliqué à faire, ça nous fait juste un serveur en plus à maintenir, mais ça évite aussi de charger le module protomaps maplibre côté client.

Ah la la, je crois que c'est Firefox qui merde dans la mise en cache des appels HTTP range requests sur lesquels sont basés pmtiles. Je viens de confirmer, Chromium met ça en cache. J'imagine que MapLibre repose sur le cache du nav, ce qui est pas bête. J'avais déjà noté ça ici https://codeberg.org/cartes/web/issues/1081 Passer à des tuiles x,y,z n'est pas très compliqué à faire, ça nous fait juste un serveur en plus à maintenir, mais ça évite aussi de charger le module protomaps maplibre côté client.
Author
Member
Copy link

[edit] ah oui, maintenant que je vois le ticket et le post bsky je m'en souviens, alors qu'hier soit je séchai complètement... 😵

Pour info, j'observe le même comportement sur edge que sur firefox...

Idée à tester : utiliser notre procotol custom pour renvoyer une erreur plutôt que la tuile quand maplibre demande les zooms 15 à 22, il devrait alors utiliser la tuile z14 qu'il a en mémoire.

[edit] ah oui, maintenant que je vois le ticket et le post bsky je m'en souviens, alors qu'hier soit je séchai complètement... 😵 Pour info, j'observe le même comportement sur edge que sur firefox... Idée à tester : utiliser notre procotol custom pour renvoyer une erreur plutôt que la tuile quand maplibre demande les zooms 15 à 22, il devrait alors utiliser la tuile z14 qu'il a en mémoire.
Owner
Copy link

Va falloir que je mette en place la solution toute trouvée : les tuiles xyz via pmtiles serve. Aussi bien ça me prendra moins d'1h.

Va falloir que je mette en place la solution toute trouvée : les tuiles xyz via `pmtiles serve`. Aussi bien ça me prendra moins d'1h.
Author
Member
Copy link

est-ce qu'on pourra encore mettre en place l'astuce de n'afficher que les zooms pairs ?

est-ce qu'on pourra encore mettre en place l'astuce de n'afficher que les zooms pairs ?
Owner
Copy link

Oui je pense, la notion de protocole en maplibre n'est pas liée au fait de taper directement dans un PMTiles. Dans tous les cas, ça me dit bien de tester pour voir si c'est plus rapide.

Oui je pense, la notion de protocole en maplibre n'est pas liée au fait de taper directement dans un PMTiles. Dans tous les cas, ça me dit bien de tester pour voir si c'est plus rapide.
etienneJr force-pushed hide-odd-zoom-levels from f887aaac74 to e114ffa5bd 2026年01月23日 23:36:54 +01:00 Compare
Author
Member
Copy link

J'ai rebase avec une nouvelle version du custom protocol qui utilise le nouveau server xyz qui permet une mise en cache des tuiles par le navigateur

Ce qui permet un nouveau test comparatif
(j'ai gardé le cache actif dans la console, mais je l'ai vidé juste avant chaque test avec la fonction Effacer les cookies et données du site pour mimer une première vue des tuiles)

je regarde uniquement le fichier planet.pmtiles

de z5 France à z18 ... avant après
... au centre d'Orléans 76 requêtes, 6.2 Mo 41 requêtes, 3.2 Mo
... au centre de Rennes 85-93 requêtes, 9.5-10.1 Mo 58 requêtes, 5.6-6.8 Mo
... au centre de Lyon 80 requêtes, 9.8 Mo 46 requêtes, 5.6 Mo

➡️​ on économise environ la moitié des requêtes et la moitié des Mo transférés
(à la première vision des tuiles, car après on économise surtout grâce au cache du navigateur)

J'ai rebase avec une nouvelle version du custom protocol qui utilise le nouveau server xyz qui permet une mise en cache des tuiles par le navigateur Ce qui permet un nouveau test comparatif (j'ai gardé le cache actif dans la console, mais je l'ai vidé juste avant chaque test avec la fonction `Effacer les cookies et données du site` pour mimer une première vue des tuiles) je regarde uniquement le fichier planet.pmtiles | de z5 France à z18 ... | avant | après | |-|-|-| | ... au centre d'Orléans | 76 requêtes, 6.2 Mo | 41 requêtes, 3.2 Mo | | ... au centre de Rennes | 85-93 requêtes, 9.5-10.1 Mo | 58 requêtes, 5.6-6.8 Mo | | ... au centre de Lyon | 80 requêtes, 9.8 Mo | 46 requêtes, 5.6 Mo | ➡️​ on économise environ la moitié des requêtes et la moitié des Mo transférés (à la première vision des tuiles, car après on économise surtout grâce au cache du navigateur)
Author
Member
Copy link

@laem j'imagine qu'il n'y a pas de déploiement auto sur dev2 ? pourras tu le faire ?

@laem j'imagine qu'il n'y a pas de déploiement auto sur `dev2` ? pourras tu le faire ?
Author
Member
Copy link

Retour des utilisateurs sur le forum OSM-FR : c'est trop perturbant.
Donc standby ici pour le cas général, mais on peut garder l'idée pour un futur "mode léger".

Retour des utilisateurs [sur le forum OSM-FR](https://forum.openstreetmap.fr/t/tuiles-vectorielles-plus-legeres-avec-niveaux-pairs-uniquement/40641) : c'est trop perturbant. Donc standby ici pour le cas général, mais on peut garder l'idée pour un futur "mode léger".
This pull request has changes conflicting with the target branch.
  • app/styles/base.ts
View command line instructions

Manual merge helper

Use this merge commit message when completing the merge manually.

Checkout

From your project repository, check out a new branch and test the changes.
git fetch -u origin hide-odd-zoom-levels:hide-odd-zoom-levels
git switch hide-odd-zoom-levels
Sign in to join this conversation.
No reviewers
Labels
Clear labels
🎨 Design
À propos de l'interface et de l'UX
💡 Idée
Nouvelle feature à intégrer
question
Further information is requested
🌍 OSM
À propos de l'affichage et l'édition des éléments OSM
🌱 Amélioration
Amélioration/fix de l'existant
🐞 Bug
Something isn't working
📊 SEO
📋 Catégories
À propos des catégories de recherche et de l'annuaire
📖 Wiki
📝Avis
A propos de la fonction avis et de bluesky
📢 Oyez
📷 Photos
A propos des photos (sources, affichage)
🔍Recherche
A propos de la barre de recherche et de photon
🔥 Actuel
🔧 tech
🖌 Styles
Styles de la carte
🧝i18n
🧪 R&D
🚍 Transports
🚙 Voiture
🚨Prioritaire
Ticket à traiter rapidement
🚲Vélo
Cartes
climat
Communication
demo
Cette branche doit être déployée comme une démo
dependencies
Pull requests that update a dependency file
javascript
Pull requests that update javascript code
Pas urgent
Plein-air
Tuiles
Verso
Vieux
Milestone
Clear milestone
No items
No milestone
Projects
Clear projects
No items
No project
Assignees
Clear assignees
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
cartes/web!1090
Reference in a new issue
cartes/web
No description provided.
Delete branch "hide-odd-zoom-levels"

Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?