MapToPoster - Transformer des plans de ville en affiches artistiques
(github.com/originalankur)- 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é
- Les affiches générées sont automatiquement enregistrées dans le répertoire
- 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-themespermet 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"
- Exemple :
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 15000python create_map_poster.py -c "Barcelona" -C "Spain" -t warm_beige -d 8000python 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 villecreate_poster(): pipeline complet de renduget_edge_colors_by_type(): attribue les couleurs selon le type de routeget_edge_widths_by_type(): définit l’épaisseur selon l’importance des routesload_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
distdé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
L’avis côté Hacker News mentionnait aussi city-roads, qui avait déjà été partagé ici auparavant.
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
Commentaires sur Hacker News
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
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
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
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
Ça ressemble probablement à des tuiles OSM récupérées puis retravaillées en post-traitement
Le rendu est franchement réussi
Je me demande s’il y a une raison particulière d’avoir choisi PNG par défaut
plt.savefig(output_file, format='svg', facecolor=THEME['bg'])permet de le faireJe vais ajouter un paramètre
--formatpour l’intégrerRien qu’une ville de 500 000 habitants prend énormément de temps
El-co Color Poster Special
En revanche, ça demande pas mal de travail manuel
Le README pourrait servir d’exemple de bonnes pratiques OSS, et le résultat est étonnamment beau
Par exemple Salem (OR/MA), Portland (OR/ME), Springfield (IL/MO) ou Dallas (TX/GA)
Si on saisit « Salem, Oregon » ou « Salem, MA », on obtient le résultat souhaité, et le texte saisi est utilisé comme légende
J’ai déjà vu un résultat similaire sur Picxstudio, qui est une plateforme de génération d’images par IA
Ça pourrait réduire ma dépendance aux applis de navigation et me faire redevenir un conducteur à l’ancienne
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