9 points par GN⁺ 2026-01-19 | 3 commentaires | Partager sur WhatsApp
  • Outil open source en Python permettant de générer des affiches artistiques minimalistes à partir de plans de villes du monde entier
  • S’appuie sur les données OpenStreetMap (OSMnx) pour visualiser les routes, voies d’eau, parcs et autres éléments géographiques, avec un rendu via matplotlib
  • Propose 17 styles de thèmes (par ex. neon_cyberpunk, blueprint, japanese_ink) et permet d’ajouter des thèmes personnalisés via des fichiers JSON
  • Depuis la ligne de commande, il suffit de définir le nom de la ville, le pays, le rayon et le thème pour générer et enregistrer automatiquement une affiche
  • Outil qui combine design et visualisation de données afin de permettre aux développeurs et designers d’explorer la structure urbaine de manière artistique

Aperçu du projet

  • MapToPoster est un script Python qui génère des affiches au design minimaliste à partir de la carte d’une ville choisie par l’utilisateur
    • Les affiches générées sont automatiquement enregistrées dans le répertoire posters/
    • Distribué sous licence MIT, il peut être librement modifié et redistribué
  • Le dépôt compte environ 2,7k étoiles et 164 forks

Fonctionnalités principales

  • Génération d’affiches via une interface en ligne de commande (CLI) en renseignant le nom de la ville (--city), le pays (--country), le thème (--theme) et la distance (--distance)
  • L’option --list-themes permet d’afficher la liste de tous les thèmes disponibles
  • Définition d’un rayon adapté à la taille de la ville selon la valeur de distance
    • 4 000–6 000 m : petite ville
    • 8 000–12 000 m : ville moyenne
    • 15 000–20 000 m : grande ville

Composition des thèmes

  • Le répertoire themes/ contient 17 fichiers JSON de thème
    • Exemples : noir, blueprint, neon_cyberpunk, warm_beige, forest, terracotta
  • Chaque thème définit des propriétés de couleur pour l’arrière-plan, les routes, les surfaces d’eau, les parcs, etc.
  • L’utilisateur peut ajouter lui-même de nouveaux thèmes au format JSON
    • Exemple : "bg": "#FFFFFF", "road_primary": "#1A1A1A"

Exemples d’utilisation

  • Il est possible de générer des affiches en combinant différentes villes et différents thèmes
    • python create_map_poster.py -c "Tokyo" -C "Japan" -t japanese_ink -d 15000
    • python create_map_poster.py -c "Barcelona" -C "Spain" -t warm_beige -d 8000
    • python create_map_poster.py -c "Dubai" -C "UAE" -t midnight_blue -d 15000
  • Parmi les affiches d’exemple figurent des villes comme San Francisco, Venice, Marrakech et Singapore

Structure interne et architecture

  • Les principaux composants sont le parseur CLI, le géocodage (Nominatim), la récupération des données (OSMnx) et le rendu (matplotlib)
  • L’ordre de rendu (z-order) est : arrière-plan → eau → parcs → routes → dégradé → texte
  • Fonctions principales
    • get_coordinates() : récupère la latitude et la longitude à partir du nom de la ville
    • create_poster() : pipeline complet de rendu
    • get_edge_colors_by_type() : attribue les couleurs selon le type de route
    • get_edge_widths_by_type() : définit l’épaisseur selon l’importance des routes
    • load_theme() : charge un thème JSON

Extension et personnalisation

  • Pour ajouter de nouvelles couches cartographiques (par ex. les voies ferrées), il est possible de charger les données OSMnx puis de les rendre dans create_poster()
  • En cas d’ajout de nouvelles propriétés de thème, elles doivent être définies à la fois dans le JSON et dans le code (load_theme())
  • Règles de placement du texte
    • Nom de la ville : y=0.14
    • Nom du pays : y=0.10
    • Coordonnées : y=0.07
    • Mention de la source : y=0.02

Conseils d’optimisation des performances

  • Si la valeur de dist dépasse 20 km, la vitesse de téléchargement diminue et l’utilisation mémoire augmente
  • La mise en cache des coordonnées permet d’éviter les limites de requêtes de Nominatim
  • Le réglage network_type='drive' améliore la vitesse de rendu
  • Pour des aperçus rapides, il est possible d’abaisser le dpi à 150

Stack technique et licence

  • Écrit à 100 % en Python
  • Bibliothèques principales : OSMnx, matplotlib, argparse
  • Distribué sous licence MIT, avec usage commercial et modification autorisés

Résumé

  • MapToPoster est un outil de création artistique de plans de ville basé sur le code, un projet open source qui combine visualisation de données et design
  • Un outil utile pour les développeurs, designers et spécialistes de la visualisation de données souhaitant explorer la structure urbaine sous une forme artistique

3 commentaires

 
kunggom 2026-01-20

L’avis côté Hacker News mentionnait aussi city-roads, qui avait déjà été partagé ici auparavant.

 
xguru 2026-01-20

J’ai essayé d’en créer pour Séoul/Busan, et comme le résultat était sympa, je les ai joints au compte Twitter de GeekNews.
Séoul : https://x.com/GeekNewsHada/status/2013410000031395905
Busan : https://x.com/GeekNewsHada/status/2013412083749265695

 
GN⁺ 2026-01-19
Commentaires sur Hacker News
  • Il existe un projet similaire que j’ai utilisé plusieurs fois
    c’est city-roads (GitHub), qui prend en charge la sortie SVG et peut aussi être essayé directement en ligne
    Son créateur, Anvaka, réalise aussi beaucoup d’autres superbes projets de visualisation de données
  • C’est vraiment un super projet
    En revanche, régler les paramètres des rues est un peu délicat
    Parmi les idées d’amélioration : permettre de saisir des coordonnées au lieu du nom de la ville pour centrer sur un point précis, et ajouter une fonction pour générer plusieurs styles à la fois afin de choisir visuellement
    Quoi qu’il en soit, c’est un excellent travail
  • L’image de San Francisco est superbe, mais sur certains exemples, il semble y avoir un problème de projection
    On dirait une projection sphérique globale plutôt qu’une UTM, ce qui n’est pas adapté à un rendu local
    L’absence de mention de la projection dans le README paraît un peu suspecte
    • C’est un projet artistique destiné à créer des posters amusants et esthétiques, donc la projection n’a pas vraiment d’importance
      En plus, c’est open source, donc ce serait une bonne idée de mettre à profit ton expérience en cartographie pour proposer une amélioration via une pull request
    • L’image finale comporte un effet de vignettage, ce qui donne l’impression que les bords s’estompent naturellement
      Ça ressemble probablement à des tuiles OSM récupérées puis retravaillées en post-traitement
      Le rendu est franchement réussi
  • J’ai jeté un coup d’œil rapide au code, et grâce à matplotlib, il semble qu’avec très peu de modifications, une sortie SVG serait possible
    Je me demande s’il y a une raison particulière d’avoir choisi PNG par défaut
    • Bonne remarque. plt.savefig(output_file, format='svg', facecolor=THEME['bg']) permet de le faire
      Je vais ajouter un paramètre --format pour l’intégrer
    • En exportant une grande ville en PDF/SVG, c’est très lent
      Rien qu’une ville de 500 000 habitants prend énormément de temps
  • Je me demande quelle serait la meilleure façon d’imprimer ces images en poster
    • El-co Color, dans le New Jersey, imprime des posters 20x30 pouces à bas prix
      El-co Color Poster Special
    • Il existait aussi autrefois un service qui transformait ce type de cartes en cartes en relief imprimées en 3D, à encadrer
    • J’utilise Vistaprint. Je n’ai pas fait énormément de comparaisons, mais le prix et la qualité me conviennent
    • Si vous voulez le faire vous-même, Rasterbator.net permet de créer un poster DIY en assemblant plusieurs feuilles
      En revanche, ça demande pas mal de travail manuel
    • Aux États-Unis, la qualité d’impression chez Staples était plutôt bonne
  • Ce dépôt est vraiment excellent
    Le README pourrait servir d’exemple de bonnes pratiques OSS, et le résultat est étonnamment beau
  • Ça vaut aussi le coup de jeter un œil à prettymapp
  • Je me demande ce qui se passe quand plusieurs villes portent le même nom
    Par exemple Salem (OR/MA), Portland (OR/ME), Springfield (IL/MO) ou Dallas (TX/GA)
    • Si on saisit simplement « Salem », le système choisit une ville arbitrairement
      Si on saisit « Salem, Oregon » ou « Salem, MA », on obtient le résultat souhaité, et le texte saisi est utilisé comme légende
    • Il y a aussi beaucoup de villes américaines qui portent des noms de grandes villes du monde, comme Paris, London ou Athens
    • Je n’y avais même pas pensé. Il faudra probablement ajouter une fonction permettant de saisir aussi le pays
  • Je me demande si ce projet repose sur une approche basée sur les graphes, ou s’il s’agit plutôt d’une génération d’image plus classique
    J’ai déjà vu un résultat similaire sur Picxstudio, qui est une plateforme de génération d’images par IA
  • J’aurais aimé transformer une carte routière de Sydney en puzzle pour m’amuser tout en apprenant la structure des routes
    Ça pourrait réduire ma dépendance aux applis de navigation et me faire redevenir un conducteur à l’ancienne
    • Il y a une raison pour laquelle Where 2, à Sydney, a fini par devenir Google Maps
      Il y a énormément de sens uniques, et la structure du port et des tunnels est si complexe qu’apprendre les routes de Sydney est une tâche de toute une vie