Créer des cartes d'élevation en python avec ridge-map

— 5 minute read

En faisant ma veille technique je suis tombé sur la librairie ridge-map qui permet de tracer en python des cartes d’élévation en récupérant les données SRTM d'une zone donnée. Merci à Lisa Hornung pour la découverte !

Je suis plutôt fan du rendu artistique obtenu sur les quelques tests que j'ai pu faire.

Quelques exemples de rendus : permalink

Chaîne des Puys
Chaîne des Puys

La région de Beaufort
La région de Beaufort

Le Mont Fuji
Le Mont Fuji

Le script python pour générer les cartes permalink

les imports : ridge_map bien sûr, matplotlib et datetime

import matplotlib.pyplot as plt
from ridge_map import RidgeMap
from matplotlib import rcParams
from datetime import datetime

la déclaration de variables utilisées avec matplotlib : couleur de texte, de fond, police, titre de la carte, l’échelle de couleur pour l’élévation et les dimensions de la figure.

Je crée également une variable date qui sera utilisée pour la sauvegarde du rendu.

Et surtout les variables pour ridge-map : nombre de lignes à tracer, nombre de points d'élévation, l'exagération de l'élévation et bien sur les coordonnées de la zone à tracer. Celles-ci sont récupérables via le site http://bboxfinder.com

now = datetime.now() # current date and time
date = now.strftime("%Y%m%d_%H%M")
cmaps ="Greys_r"
textcolor= '#FAFAFA'
bgcolor = '#1c1c1c'
rcParams['font.family'] = 'Consolas'
title = "Chaîne des Puys"
width=8
height=12
coords =(2.900391,45.623643,3.004761,45.917721) # récupérées via http://bboxfinder.com/
nlines = 50 #le nombre de lignes tracées
elpts =100 #le nombre de points d'élevation à utiliser par ligne
vratio = 30 # l'exagération de l'élévation. Plus c'est élevé plus c'est éxagéré

Le tracé avec ridge-map :

rm = RidgeMap(coords, font="Consolas")
values = rm.get_elevation_data(num_lines=nlines, elevation_pts=elpts)
fig,ax = plt.subplots(figsize=(width, height))
fig.set_facecolor(bgcolor)
ridges = rm.plot_map(
values=rm.preprocess(values=values, vertical_ratio=vratio, water_ntile=1,lake_flatness=1),
ax=ax, kind='elevation', label=None,
linewidth=1.2,
line_color = plt.get_cmap(cmap),
background_color = bgcolor
)

On rajoute le titre, les coordonnées de la zone et quelques informations avec matplotlib :

plt.figtext(0.5, 0.06 , title, fontsize=28, fontweight='bold', ha='center', color=textcolor)
plt.figtext(0.5, 0.04 , coords, fontsize=8, fontweight='light', ha='center', color=textcolor)
plt.figtext(0.5, 0.03 , 'Data: NASA via ridge-map.py | Code & Design by Nicolas Birckel ', fontsize=8, fontweight='regular', ha='center', color=textcolor)

et pour finir on sauvegarde l'image, toujours avec matplotlib. J'ai choisi d'utiliser un nom de fichier plutôt verbeux intégrant les différentes variables pour pouvoir retrouver des réglages au besoin.

filename = date+"_"+title+"_"+cmap+"_l"+str(nlines)+"_e"+str(elpts)+"_v"+str(vratio)+"_w"+str(width)+"_h"+str(height)+".png"
plt.savefig(filename, dpi=120, bbox_inches='tight',pad_inches=0.2, facecolor=bgcolor)

D'autre ressources pour jouer avec des cartes sur le web ou en python : permalink


Webmentions permalink

3 Retweets permalink

Coralie Mercier Mamuuuuth tzi