9 points par GN⁺ 2024-04-22 | 1 commentaires | Partager sur WhatsApp
  • tinyworldmap est une carte du monde conçue pour les web apps offline-first et à faible bande passante, pensée pour être utilisée avec Leaflet
  • Elle prend en charge tous les niveaux de zoom, et sa version la plus complète pèse 450 KB en gzip ; le rendu côté client a été profilé et testé pour éviter toute latence perceptible, même sur des téléphones anciens et peu puissants datant d’il y a 10 ans
  • La carte de base affiche les 10 000 villes les plus peuplées ajoutées à OpenStreetMap, ce qui inclut, au moment de la rédaction, toutes les villes et localités de plus de 48 000 habitants
  • Deux modes d’utilisation sont prévus : comme carte de base en remplacement des tuiles OpenStreetMap, ou comme carte de secours qui remplace hors ligne les requêtes de tuiles OSM par des tuiles générées localement
  • Les données cartographiques sont publiées sous licence ODBL, comme OpenStreetMap, et nécessitent une attribution à OpenStreetMap et à tinyworldmap, par exemple dans le pied de page Leaflet

Objectif et périmètre de tinyworldmap

  • tinyworldmap est une carte du monde destinée aux web apps offline-first et à faible bande passante
  • Elle est conçue pour fonctionner avec Leaflet et prend en charge tous les niveaux de zoom
  • Sa version la plus complète pèse 450 KB en gzip et 1.1 MB une fois décompressée
  • Le rendu côté client a été largement profilé et testé sur des téléphones anciens et peu performants datant d’il y a 10 ans, sans latence perceptible
  • Des démonstrations sont disponibles : Nightly demo, Stable demo, v3 announcement

Données cartographiques de base

  • Par défaut, la carte affiche les 10 000 villes les plus peuplées ajoutées à OpenStreetMap
  • Au moment de la rédaction, cela couvre toutes les villes et localités de plus de 48 000 habitants

Deux façons de l’utiliser avec Leaflet

  • Utilisation comme carte de base

    • Pour utiliser tinyworldmap comme carte de base Leaflet, il faut ajouter le script de distribution dans la balise head
    • Le script de la version stable est https://tinyworldmap.com/dist/v3/tiny-world-all-10000.js et inclut toutes les données nécessaires à l’affichage de la carte
    • À la place d’une couche de tuiles Leaflet, il faut ajouter L.GridLayer.TinyWorld sous cette forme
    new L.GridLayer.TinyWorld({maxZoom: 19}).addTo(map)
    
  • Utilisation comme carte de secours hors ligne

    • Dans une web app offline-first, mettre en cache une carte basée sur des images à tous les niveaux de zoom est impossible à cause du très grand nombre de tuiles, et la taille totale atteint souvent des téraoctets
    • Ce dépôt fournit un service worker pour les fonctions hors ligne des web apps qui intègrent une carte
    • Une fois le service worker installé, la carte de secours est préchargée
    • Les pages visitées sont mises en cache
    • La carte de base est exclue du cache
    • Si le serveur est accessible, les données en cache ne sont pas utilisées
    • Si l’utilisateur est hors ligne, le site est servi depuis le cache et le service worker intercepte les requêtes vers le serveur de tuiles OSM pour les remplacer par des tuiles tinyworldmap générées localement
    • Avant d’enregistrer le service worker, il faut modifier toutes les sections marquées IMPORTANT dans ce dernier
    • Après l’enregistrement, l’attribution de la couche de tuiles Leaflet doit inclure à la fois OpenStreetMap et tinyworldmap
    • Hitchmap est un exemple d’application en production utilisant tinyworldmap comme solution de secours
    • Sur un navigateur compatible avec les service workers, il suffit d’ouvrir le site, d’attendre un moment, puis de couper Internet et d’actualiser pour que l’app continue normalement à fonctionner avec la carte de secours
    • L’installation du service worker peut prendre du temps

Style de carte et cartes personnalisées

  • Le constructeur accepte une option render pour modifier l’apparence de la carte
  • L’option style de chaque couche s’applique à CanvasRenderingContext2D du Canvas
  • Par exemple, on peut modifier le style en définissant fillStyle pour la couche state_borders
let render = {
    state_borders: {
        style: {fillStyle: '#f00'}
    }
}

new L.GridLayer.TinyWorld({maxZoom: 19, render}).addTo(map)
  • Si votre organisation a besoin d’une carte personnalisée avec carte routière, carte urbaine, carte dans d’autres langues, ou d’un contenu incluant des données OSM ou non-OSM, vous pouvez demander un devis à business@tinyworldmap.com

Options de fichiers de carte encore plus petits

  • Version sans frontières

    • tiny-world-cities-10000.js(on) contient, par rapport à la version complète, des données sans frontières d’États, frontières nationales ni littoraux
    • Cette version réduit la taille de 300 KB en gzip et de 825 KB une fois décompressée
    • Son avantage est que toutes les données incluses y sont précises
    • Dans la version complète, les frontières nationales ne sont pas exactes aux niveaux de zoom élevés, ce qui peut donner un rendu étrange si l’on superpose des formes alignées sur des frontières nationales ou des littoraux
    • Dans ce cas, la version sans frontières est souvent plus esthétique
  • Version sans libellés de villes

    • Il existe deux fichiers sans libellés de villes
    • tiny-world-borders.js(on) : sans frontières d’États
    • tiny-world-nocities.js(on) : avec frontières d’États conservées
    • Les libellés de villes occupent 410 KB décompressés et 172 KB compressés
  • Version avec moins de villes

    • Des fichiers avec libellés de villes sont aussi proposés en versions 2 000 et 4 000 villes
    • Il suffit de remplacer 10000 par 2000 ou 4000 dans le nom du fichier
    • | Nombre de villes incluses | Seuil de population |
    • | --- | --- |
    • | 10,000 | plus de 48 000 habitants |
    • | 4,000 | plus de 137 000 habitants |
    • | 2,000 | plus de 287 000 habitants |

Licence et attribution

  • Les données de tinyworldmap sont publiées sous licence ODBL, comme les données OpenStreetMap
  • L’ODBL impose une attribution
  • Si la configuration a été faite comme indiqué, le pied de page Leaflet doit inclure l’attribution à OpenStreetMap et à tinyworldmap
  • Sinon, il faut ajouter séparément l’attribution à OpenStreetMap et à tinyworldmap

1 commentaires

 
GN⁺ 2024-04-22
Avis sur Hacker News
  • J’aime l’idée. C’est bien parce que ça résout le problème où, quand on dézoome trop, il faut attendre que le serveur rende la tuile du continent qu’on vient de demander.
    En revanche, je vois bien la position relative de West Bloomfield Township et de Waterford Charter Township, dans la banlieue de Detroit, mais je ne vois pas trop quel cas d’usage a besoin de ça sans savoir dans quel État ils se trouvent, ni même que les Grands Lacs existent.
    J’aimerais qu’il y ait beaucoup plus de données pour les côtes, et beaucoup moins pour les subdivisions des grandes aires urbaines.

    • La direction est bonne, mais il me semble indispensable d’inclure les grands éléments géographiques, du genre les 100 plus grandes îles, les 50 plus grands lacs et les 200 plus grands fleuves.
    • Même chose pour les routes et les voies ferrées. C’est utile pour une carte routière qu’on garde dans la voiture, mais en dehors de ça, on a rarement besoin de connaître l’emplacement des routes.
      Elles masquent trop d’autres informations possibles.
    • Par curiosité, j’ai cliqué à quelques endroits : Alexandria, en Virginie, aux États-Unis, est de l’autre côté du fleuve, et Bahreïn est assez catastrophique.
    • Ce point a été amélioré dans la v2.
  • C’est sympa, mais le niveau de détail des côtes est beaucoup trop faible. Quelques villes britanniques flottent au-dessus de la mer, tandis que le Groenland et le nord du Canada accaparent tous les sommets.
    Le niveau de détail lié à la projection de Mercator semble déjà avoir été pris en compte, mais il faudrait moins prioriser les zones où presque personne ne vit.

    • Bon projet. Pour choisir les lieux à inclure, utiliser aussi le QRank de Wikidata permettrait peut-être de faire apparaître des îles célèbres même peu peuplées.
      La base SQLite de QRank est déjà passée sur HN auparavant.
      [1] https://qrank.wmcloud.org/
      [2] https://github.com/hikeratlas/qrank
    • Le ratio entre le détail des villes et celui des côtes est étrangement biaisé en faveur des villes. On dirait que la carte préfère inclure davantage de villes plutôt que des frontières ou des côtes exactes.
      Une province des Pays-Bas apparaît comme une île, détachée du territoire continental du pays, alors qu’elle ne l’est pas en réalité. Pourtant, la carte connaît cinq noms de villes dans cette province, dont certains se chevauchent presque.
      À l’inverse, l’ajout de l’Afsluitdijk me paraît personnellement être un détail inutile, mais je comprends qu’il soit difficile, par programme, de distinguer les terres à dessiner d’une simple infrastructure maritime.
      Je devrais ouvrir un ticket dans l’issue tracker, mais comme je ne suis pas connecté sur mobile, un commentaire HN est ce que je peux faire de mieux pour l’instant. Si d’autres ressentent la même chose, ils peuvent s’appuyer sur ce commentaire pour proposer des améliorations comme ajuster le ratio, introduire une distance minimale entre les villes ou réduire la taille globale du fichier.
    • À cause de ça, la carte devient presque inutilisable pour les îles et les régions d’archipels. Les Philippines ont certes beaucoup d’îles, mais plusieurs sont assez grandes, et pourtant la carte n’est pas vraiment utilisable.
      La Polynésie française n’existe même pas sur la carte.
    • Une version nightly a été publiée, avec les fjords supprimés et davantage de détail ailleurs. La résolution est aussi globalement plus élevée.
      La raison pour laquelle ce n’était pas fait au départ, c’est que sur de vieux téléphones, en particulier avec Firefox for Android, dessiner beaucoup de polygones pouvait provoquer des crashs. Depuis, la procédure de dessin a été optimisée, mais il faut rester prudent.
      [1] https://tinyworldmap.com/beta.html
    • La simplification est globalement bâclée. Dans les Caraïbes, des pays entiers manquent.
      C’est le genre de chose qui devrait être détecté par un contrôle qualité de base.
  • J’ai créé quelque chose de similaire. Priorité à l’offline, très petit, basé sur du vectoriel, avec un accent mis sur l’internationalisation.
    C’est disponible dans toutes les langues de l’ONU. En revanche, l’espagnol manque parce que je l’ai tout simplement oublié, ce qui est embarrassant, alors que je pourrais probablement le faire en quelques heures.
    Les noms de pays et de villes utilisent les dénominations officielles enregistrées auprès de l’ONU. Donc le nom court officiel du Royaume-Uni est « United Kingdom of Great Britain and Northern Ireland ».
    https://map.ache.one/en

    • C’est pas mal, mais il y a pas mal de bugs. « Cape town » apparaît au Soudan du Sud, alors que le nom du pays lui-même n’apparaît pas, et l’Érythrée n’a pas non plus de nom. Le bloc de la Somalie est divisé en deux parties de couleurs différentes.
      Dessiner une carte légère et gérer l’internationalisation était relativement facile, parce qu’il existe plusieurs sources de données ouvertes et bibliothèques pour ça.
      La partie vraiment difficile, ce sont les définitions administratives pures. Si vous avez des données associées à la plupart des pays, elles finiront forcément par diverger de la source cartographique, et il faut au final créer une carte sur mesure à la main.
      Il n’existe pas de consensus sur ce qu’est un « pays ». Le Sahara occidental est officiellement un pays, mais en pratique le Maroc l’occupe depuis longtemps ; la Somalie comprend le Somaliland et le Puntland, qui fonctionnent de fait comme des États indépendants, sans reconnaissance officielle. Le Groenland, Niue, etc. se situent quelque part entre les deux.
    • Je n’ai pas trouvé d’explication sur la façon dont ça a été créé, mais la carte est belle. Tiny World Maps contient aussi des informations à ce sujet, mais là non plus, l’explication du processus de création n’est pas suffisante.
      D’après mon expérience au niveau des pays, c’était un processus manuel rempli de hacks sales, et le plus difficile était de tester si tout était correctement aligné. En particulier, trouver le bon niveau de généralisation et l’apparence que les gens attendent de la carte de leur région était compliqué.
      Je me demande si l’effort nécessaire pour améliorer fortement cette carte en vaut la peine à vos yeux.
    • Je ne sais pas si l’astérisque indique la plus grande ville ou la capitale, mais si c’est la seconde option, alors la Tanzanie est incorrecte.
      L’astérisque est sur Dar Es Salaam, mais l’étiquette indique Dodoma. Dodoma est bien la capitale réelle, mais elle se trouve plutôt vers le centre du pays.
    • L’abréviation « i18n » elle-même n’est pas très internationalisée.
  • C’est mignon. J’avais fait quelque chose de pas tout à fait identique, mais similaire, il y a longtemps.
    https://web.archive.org/web/20020611095429/http://www.cs.man.ac.uk/~hancockd/CityZen/index.html
    20 000 segments, 3 350 lieux, le tout — viewer et quiz compris — faisait 162 Ko.

  • Merci pour le retour. Pour expliquer le contexte du choix, jusqu’à récemment, l’objectif principal de ce projet n’était pas la forme des pays
    Pendant longtemps, la version sans frontières présente dans le README était la seule version, et je ne pensais pas qu’il serait possible d’ajouter le monde entier. Mais ça l’était
    J’ai publié une version nightly qui supprime les fjords et ajoute davantage de détails ailleurs, notamment les îles très demandées. Globalement, la résolution est aussi plus élevée
    La raison pour laquelle je ne l’avais pas fait au départ, c’est que sur les anciens téléphones, en particulier avec Firefox for Android, dessiner beaucoup de polygones pouvait provoquer un crash. Depuis, j’ai optimisé la procédure de dessin, mais il faut rester prudent
    [1] https://tinyworldmap.com/beta.html

  • Je ne suis pas sûr que les 10 000 villes les plus peuplées soient le meilleur filtre
    Cette approche favorise les villes des grands pays, et les petits pays risquent de voir la plupart de leurs villes exclues
    Il faudrait un filtre complémentaire qui inclue les X principales villes de chaque pays. Cela permettrait probablement de couvrir aussi les principales villes des petits pays

    • Il existe aussi d’autres critères pour mesurer l’importance d’une ville
      Des critères comme capitale nationale, capitale régionale, ville mondiale ou centralité régionale pourraient utilement compléter les conditions de base
      Sur ce sujet, des géographes et cartographes pourraient sans doute donner des conseils plus pertinents
  • J’ai trouvé intéressant que choisir les 10 000 plus grandes agglomérations du monde fasse descendre jusqu’à 48 000 habitants
    Je ne sais pas encore si ce chiffre est surprenant ou non

    • Je savais depuis longtemps que si l’on prend environ les 100 premières villes des États-Unis par population, on descend grosso modo jusqu’à 200 000 habitants
      Même en passant à 200, on reste au-dessus de 100 000. Selon Wikipedia, Daly City, CA, classée #333, compte 100 007 habitants : <https://en.wikipedia.org/wiki/List_of_United_States_cities_b...>
      Comme dans beaucoup d’autres situations de mise à l’échelle, ce type de distribution est généralement proche d’une droite sur un graphique log-log
      En China, il faut descendre jusqu’au 106e rang avant de trouver une ville de moins d’un million d’habitants. Aux États-Unis, il n’y en a que 9 de ce type
      Pour India, je viens de vérifier : il y a 46 villes de plus d’un million d’habitants ; Malegaon, 100e, compte 471 000 habitants, et Aurangabad, 300e, dépasse encore les 100 000
      Cela dit, la notion de « ville » est très arbitraire. Certaines des plus grandes villes du monde correspondraient, selon les critères d’autres pays, à des aires métropolitaines, voire à des États ou des provinces
      Les plus grandes villes par superficie ont au contraire une population très faible. Sermersooq, au Greenland, compte 24 148 habitants pour 575 300 km², soit environ 144 fois Rhode Island ; parmi les États américains, seuls Texas et Alaska sont plus grands. Alaska n’est lui aussi qu’environ 12 % plus grand
      La géographie urbaine est un domaine complexe : on compare généralement plusieurs échelles et définitions, comme les aires statistiques métropolitaines, la surface bâtie et la population. Cela permet d’atténuer l’arbitraire des frontières politiques et de mieux refléter la population totale ainsi que l’impact économique
  • C’est assez étonnant que la taille du fichier soit de cet ordre alors que les frontières sont aussi grossières
    La taille totale des données semble bien en dessous du point d’équilibre entre utilité et taille de fichier. Par exemple, avec une taille doublée, les frontières n’auraient sans doute pas été aussi irrégulières

    • Le fichier complet fait environ 700 Ko sans compression gzip
      D’après l’explication indiquant que « toutes les données de la version complète, à l’exception des frontières et des littoraux, sont présentes, ce qui réduit la taille de 200 Ko », environ 29 % correspondent aux données de frontières et de côtes, et 71 % aux noms et positions des villes
      Personnellement, je pense qu’on pourrait supprimer beaucoup de villes. En particulier, les villes qui se superposent ne deviennent visibles que lorsqu’on zoome assez pour voir la masse terrestre grise et les noms de villes ; à la place, il vaudrait mieux rendre les côtes plus précises
      Je ne sais pas non plus à quelle fréquence on a besoin de la position sur une carte du monde générale. Par exemple, sur le site web d’un point d’intérêt que l’on consulte, une carte légère montrant les autoroutes et lignes de transport public à proximité pour s’y rendre ne serait-elle pas plus souvent utile ?
      Si l’on créait une version qui découpe toute la Terre en unités de quelques km², on pourrait probablement obtenir un niveau de détail assez utile avec une taille dix fois plus faible. Une carte low-poly de toute la planète peut aussi servir à des usages comme le suivi de la Station spatiale internationale, mais cela semble beaucoup plus rare
  • Même si la population est inférieure à 40 000 habitants, les capitales devraient impérativement être incluses, et signalées d’une manière ou d’une autre par un astérisque

  • Vraiment génial. C’est impressionnant de voir à quelle vitesse ça se charge sur téléphone
    L’idée de compresser les données spatiales sous forme de Paths est excellente
    Pour éviter la licence ODbL, utiliser les données Natural Earth plutôt qu’OSM pourrait aussi être une bonne option
    Ce serait vraiment bien d’inclure aussi un outil permettant de convertir les données spatiales en Paths