Prettymaps est une bibliothèque Python qui permet de créer de belles cartes géographiques sur base des données d’OpenStreetMap. Je dirais même que les fonctionnalités de Prettymaps facilitent la création de cartes réellement artistiques, avec notamment :
- Une variété de styles de carte : Prettymaps comprend un certain nombre de styles de carte prédéfinis qui peuvent être utilisés pour créer des cartes belles et visuellement attrayantes. Ces styles peuvent bien sûr être adaptés et personnalisés.
- La possibilité de personnaliser facilement les cartes : avec Prettymaps il est possible d’ajouter des éléments à vos cartes, tels que du texte, des images et des formes. Cela peut être utilisé pour ajouter des informations supplémentaires ou pour créer une carte plus visuellement attrayante.
Comme le montre l’image ci dessous, Prettymaps permet de mettre en évidence avec des palettes de couleurs séparées des informations spécifiques contenues dans des couches (layers) cartographiques des données géographiques. Les résultats peuvent alors être radicalement différents
Les cartes ainsi produites peuvent être exportées vers une variété de formats, y compris HTML, PNG et SVG.
Voici un exemple de premiers pas avec la bibliothèque : comment afficher le centre ville d’Aulnoye-Aymeries (Département du Nord), dans un rayon de 1100 mètres.
Attention : Cet exemple fonctionne avec une ancienne version de prettymaps (v0.1.3) mais plus avec la version actuelle (1.0.0)
Il faut d’abord créer les layers de données géographiques en précisant le nom de l’agglomération à afficher. Prettymaps ira rechercher les informations en se basant sur sur le nom et on évite les erreurs d’homonymie en donnant plus d’information comme le nom d’état (ex : Paris, Texas) ou de pays.
layers = plot(
'Aulnoye Aymeries, France', radius = 1100,
ax = ax,
layers = {
'perimeter': {},
'streets': {
'width': {
'motorway': 5,
'trunk': 5,
'primary': 4.5,
'secondary': 4,
'tertiary': 3.5,
'cycleway': 3.5,
'residential': 3,
'service': 2,
'unclassified': 2,
'pedestrian': 2,
'footway': 1,
},
'circle': False, 'dilate': dilate
},
'building': {'tags': {'building': True, 'landuse': 'construction'}, 'union': True, 'circle': False, 'dilate': dilate},
'water': {'tags': {'natural': ['water', 'bay']}, 'circle': False, 'dilate': dilate},
'forest': {'tags': {'landuse': 'forest'}, 'circle': False, 'dilate': dilate},
'green': {'tags': {'landuse': ['grass', 'orchard'], 'natural': ['island', 'wood'], 'leisure': 'park'}, 'circle': False, 'dilate': dilate},
'beach': {'tags': {'natural': 'beach'}, 'circle': False, 'dilate': dilate},
'parking': {'tags': {'amenity': 'parking', 'highway': 'pedestrian', 'man_made': 'pier'}, 'circle': False}
},
J’ai gardé l’affichage des plages dans les layers : on ne sait jamais ;-)
En passant, on n’oublie pas de citer ses soures :
osm_credit = {'x': .405, 'y': .68, 'color': '#2F3737'}
En exemple de personnalisation de la carte, on ajoute une légende avec la fonte de son choix.
ax.text(
xmin+.39*dx, ymin+.305*dy,
' '*3 + 'Aulnoye-Aymeries,\nFrance',
color = '#2F3737',
zorder = 6, rotation = +1.75,
fontproperties = fm.FontProperties(fname = 'PermanentMarker-Regular.ttf', size = 24)
)
Il ne reste plus qu’à sauvegarder le résultat, par exemple en PNG et en vectoriel SVG.
plt.savefig('aulnoye-aymeries.png')
plt.savefig('aulnoye-aymeries.svg')
Et voici le résultat :
Globalement, Prettymaps est un excellent choix pour quiconque souhaite créer des cartes artistiques qui soient à la fois visuellement attrayantes et informatives.
Le dépôt Github de Prettymaps : https://github.com/marceloprates/prettymaps
Le code complet de l’exemple :
# Adaptation d'un exemple fourni avec prettymaps
#import vsketch
from prettymaps import *
import matplotlib.font_manager as fm
from matplotlib import pyplot as plt
# Paramètres généraux de style
palette = ['#433633', '#FF5E5B']
background_c = '#F2F4CB'
dilate = 100
# Définition de la carte (plot)
fig, ax = plt.subplots(figsize = (12, 12), constrained_layout = True)
layers = plot(
'Aulnoye Aymeries, France', radius = 1100,
ax = ax,
layers = {
'perimeter': {},
'streets': {
'width': {
'motorway': 5,
'trunk': 5,
'primary': 4.5,
'secondary': 4,
'tertiary': 3.5,
'cycleway': 3.5,
'residential': 3,
'service': 2,
'unclassified': 2,
'pedestrian': 2,
'footway': 1,
},
'circle': False, 'dilate': dilate
},
'building': {'tags': {'building': True, 'landuse': 'construction'}, 'union': True, 'circle': False, 'dilate': dilate},
'water': {'tags': {'natural': ['water', 'bay']}, 'circle': False, 'dilate': dilate},
'forest': {'tags': {'landuse': 'forest'}, 'circle': False, 'dilate': dilate},
'green': {'tags': {'landuse': ['grass', 'orchard'], 'natural': ['island', 'wood'], 'leisure': 'park'}, 'circle': False, 'dilate': dilate},
'beach': {'tags': {'natural': 'beach'}, 'circle': False, 'dilate': dilate},
'parking': {'tags': {'amenity': 'parking', 'highway': 'pedestrian', 'man_made': 'pier'}, 'circle': False}
},
drawing_kwargs = {
'perimeter': {'fill': False, 'lw': 0, 'zorder': 0},
'background': {'fc': background_c, 'zorder': -1},
'green': {'fc': '#8BB174', 'ec': '#2F3737', 'hatch_c': '#A7C497', 'hatch': 'ooo...', 'lw': 1, 'zorder': 1},
'forest': {'fc': '#64B96A', 'ec': '#2F3737', 'lw': 1, 'zorder': 2},
'water': {'fc': '#a8e1e6', 'ec': '#2F3737', 'hatch_c': '#9bc3d4', 'hatch': 'ooo...', 'lw': 1, 'zorder': 3},
'beach': {'fc': '#FCE19C', 'ec': '#2F3737', 'hatch_c': '#d4d196', 'hatch': 'ooo...', 'lw': 1, 'zorder': 3},
'parking': {'fc': background_c, 'ec': '#2F3737', 'lw': 1, 'zorder': 3},
'streets': {'fc': '#2F3737', 'ec': '#475657', 'alpha': 1, 'lw': 0, 'zorder': 4},
'building': {'palette': palette, 'ec': '#2F3737', 'lw': .5, 'zorder': 5},
},
osm_credit = {'x': .405, 'y': .68, 'color': '#2F3737'}
)
# Définition des limites de la carte
xmin, ymin, xmax, ymax = layers['perimeter'].bounds
dx, dy = xmax-xmin, ymax-ymin
a = .2
ax.set_xlim(xmin+a*dx, xmax-a*dx)
ax.set_ylim(ymin+a*dy, ymax-a*dy)
# Ajout d'un petit texte de légende.
ax.text(
xmin+.39*dx, ymin+.305*dy,
' '*3 + 'Aulnoye-Aymeries,\nFrance',
color = '#2F3737',
zorder = 6, rotation = +1.75,
fontproperties = fm.FontProperties(fname = 'PermanentMarker-Regular.ttf', size = 24)
)
# Sauvegarde de la carte produite
plt.savefig('aulnoye-aymeries.png')
plt.savefig('aulnoye-aymeries.svg')