Où l’on trace un plan du Havre des rues célébrant les navigateurs (et navigatrice).
L’idée m’est venue en apercevant des noms familiers sur les plaques de rues du Havre. J’ai fait une sélection tout à fait personnelle de personnes ayant navigué, tout en m’essayant à la réalisation d’un plan de ville.
Ce plan est généré par un script Python, qui utilise les bibliothèques Geopandas (gestion de données cartographiques), matplotlib (tracé de graphiques) et pandas (import de données en tableaux).
Le script, avec les deux fichiers annexes nécessaires (coordonnées des rues, biographies des personnes) :
Comment j’ai obtenu les données des rues du Havre
Le projet OpenStreetMap (OSM) propose les données cartographiques nécessaires. On peut envoyer des requêtes pour des données précises via l’outil en ligne overpass turbo.
Sur la page overpass turbo, dans la fenêtre de droite, on rédige une requête avec une syntaxe prédéfinie (les caractères // sont pour les commentaires). Ici, le code est :
[out:json]; // format de fichier de sortie des données à droite
{{geocodeArea:le havre}}->.searchArea;// cible : Le Havre
(
way["highway"](area.searchArea);// demander les rues
);
out geom //afficher les données trouvées sur la carte à droite
En cliquant sur le bouton « Exécuter », on obtient :
et sur le bouton « Données » en haut à droite, à côté de « Carte » :
Pour chaque rue, on a un très grand nombre de données (coordonnées géographiques, mais aussi le nom, avec la clé « name ».)
On clique ensuite sur « Exporter » pour télécharger les données obtenues. Je les ai récupérées au format Geojson, un format de données cartographique que le module Geopandas peut interpréter.
Réduction des données
Le fichier obtenu étant assez lourd (8.8 Mo) et long à charger dans le script Python, j’ai d’abord rédigé un petit script qui ne conserve que les coordonnées des rues (colonne « geometry ») et leurs noms (colonne « name »)., et les exporte dans un nouveau fichier.C’est le fichier ruesLH_short.geojson (3.2 Mo) qui se trouve dans le fichier compressé fourni ci-dessus.
Il se présente sous la forme :
name geometry
0 Place Perret POLYGON ((0.10683 49.49173, 0.10678 49.49114, ...
3 Place Georges et Henri Daubenfeld POLYGON ((0.16382 49.48058, 0.16425 49.48079, ...
6 Place Jules Ferry POLYGON ((0.11261 49.49156, 0.11265 49.49213, ...
7 Esplanade Jean-Yves Besselat POLYGON ((0.12158 49.48873, 0.12154 49.48865, ...
8 Le Havre, Gares, Quai A POLYGON ((0.12561 49.49236, 0.12646 49.49256, ...
... ...
11821 Escalier Lechiblier LINESTRING (0.11522 49.50007, 0.11525 49.50013)
11823 Escalier Lechiblier LINESTRING (0.11520 49.50002, 0.11521 49.50004)
11824 Escalier Lechiblier LINESTRING (0.11567 49.50072, 0.11572 49.50076)
11830 Résidence Evasion LINESTRING (0.11131 49.49898, 0.11137 49.49885...
11831 Résidence Evasion LINESTRING (0.11140 49.49877, 0.11138 49.49882)
J’ai ensuite rassemblé dans un fichier ods les noms complets, dates et biographie courte des personnes que j’ai choisies. Ce fichier a été exporté au format csv, que j’ai l’habitude d’utiliser avec le module Pandas (mais un format txt aurait pu suffire, de même que le module Pandas n’était pas indispensable ; c’est uniquement parce que je connais la syntaxe de ce module).
Le script
Les principales fonctions du script sont :
- une fonction rue(nom) qui reçoit une chaîne de caractères présente dans le nom souhaité, recherche la rue concernée dans le tableau de données, trace la rue en trait rouge plus épais que le reste de la ville, renvoie les coordonnées d’un point de la rue et son nom complet.
- une fonction affiche_bio(nom, x, y, ha=’left’, va=’center’) : elle reçoit en argument également une chaîne de caractères du nom de la rue, des coordonnées pour placer du texte sur la carte, et des variables d’alignement du texte. Cette fonction appelle la fonction précédente, et affiche un texte encadré avec les informations sur la personne.
def rue(nom):
"""
Dessine la rue en couleur.
Renvoie les coordonnées de la rue et son nom.
"""
df = gdf[gdf["name"].str.contains(nom)]
df.plot(ax=ax, lw=0.4, color='firebrick')
x0 = df.iloc[0].geometry.centroid.x
y0 = df.iloc[0].geometry.centroid.y
nomrue = df.name.values[0]
return x0, y0, nomrue
def affiche_bio(nom, x, y, ha='left', va='center'):
"""
nom : string
Affiche le nom et la biographie, en tirant un trait
depuis la rue.
"""
df = biodf.loc[biodf["nom"].str.contains(nom)]
fullname = df.nom.values[0]
dates = df.dates.values[0]
bio = df.bio.values[0]
bio = bio.replace('*', '\n')
x0, y0, nomrue = rue(nom)
texte = f"{nomrue}\n-----\n{fullname}\n{dates}\n{bio}"
ax.plot([x, x0], [y, y0], '--', c='firebrick', lw=0.3)
ax.text(x, y, texte, fontsize=5, ha=ha, va=va, color='firebrick',
bbox=dict(facecolor='white', ec='firebrick',
lw=0.3, boxstyle='round',
pad=0.3))
Le choix des personnes dans la catégorie ‘Navigation’ est évidemment personnel, et non exhaustif. De nombreux militaires pourraient être inclus, mais j’ai préféré éviter qu’ils ne soient surreprésentés. J’ai privilégié l’exploration et les personnes ayant notamment contribué à améliorer les techniques de navigation astronomique. Malheureusement, certains se sont illustrés dans la conquête coloniale. Je n’ai trouvé qu’une seule femme navigatrice, Anita Conti (et encore ! la rue Conti du Havre est-elle réellement nommée d’après Anita ?).







Soyez le premier à commenter