Comment tracer des points (définis par leurs longitudes et latitudes) sur une carte avec Bokeh et python ?


Introduction

Bokeh offre un cadre puissant pour créer des visualisations de données interactives. Grâce à l'importation de kits d'outils géographiques comme GeoPandas, Bokeh permet de cartographier des points sur un canevas avec une interface simple et efficace.

En supposant que vous ayez installé les packages nécessaires (Bokeh, Pandas et Geopandas), voici un guide étape par étape pour ajouter des points définis par une longitude et une latitude sur une carte en utilisant Bokeh :

Création d'une carte avec Bokeh

Pour commencer, créons une carte en utilisant Bokeh. Il existe plusieurs approches et cartes disponibles. Pour cet exemple, utilisons la carte "OpenStreetMap Mapnik".

from bokeh.plotting import figure, show, output_file

p = figure(x_range=(-2000000, 6000000), y_range=(4000000, 7000000),
           x_axis_type="mercator", y_axis_type="mercator")

p.add_tile("OpenStreetMap Mapnik")

p.grid.visible = False

show(p)

Le graphique ci-dessus générera la visualisation suivante :

Comment tracer des points (définis par leurs longitudes et latitudes) sur une carte Bokeh ?
Comment tracer des points (définis par leurs longitudes et latitudes) sur une carte Bokeh ?

Pour pouvoir tracer avec précision des points sur une carte, il est crucial de déterminer le système de projection utilisé. Dans ce cas, notre carte utilise la projection Mercator. Pour tracer nos points correctement, nous devons convertir les longitudes et latitudes dans le système de coordonnées approprié. Un outil très efficace pour y parvenir en Python est un dataframe geopandas. Dans l'exemple suivant, nous allons vous montrer comment stocker vos données dans un dataframe geopandas et convertir le système de coordonnées pour finalement tracer nos points.

Création d'une collection de coordonnées en utilisant des valeurs de latitude et de longitude.

Par exemple, nous pouvons générer un ensemble de données qui inclut les coordonnées (latitude et longitude) de différentes villes :

data = {'city_name':['Paris','London','Moscow', 'Istanbul'],
       'longitude':[2.3522,-0.1276,37.6173,28.9784],
       'latitude':[48.8566,51.5072,55.7558,41.0082]}

Création d'un dataframe geopandas.

Nous pouvons alors stocker nos données dans une DataFrame pandas :

import pandas as pd

df = pd.DataFrame(data)

et convertir notre Dataframe en Geodataframe

import geopandas

gdf = geopandas.GeoDataFrame(
    df, 
    geometry=geopandas.points_from_xy(df.longitude, df.latitude), 
    crs="EPSG:4326"
)

Pour déterminer le système de coordonnées CRS associé à notre dataframe, nous pouvons exécuter la commande suivante :

print( gdf.crs )

Le code présenté ici ne correspond pas à Mercator.

EPSG:4326

Afin de mettre nos données dans la projection Mercator, nous pouvons faire :

gdf = gdf.to_crs("epsg:3857") # Mercator-projection

Enfin, notre ensemble de données s'est transformé dans le format suivant :

  city_name  longitude  latitude                         geometry
0     Paris     2.3522   48.8566   POINT (261845.706 6250564.350)
1    London    -0.1276   51.5072   POINT (-14204.367 6711506.705)
2    Moscow    37.6173   55.7558  POINT (4187538.681 7509955.142)
3  Istanbul    28.9784   41.0082  POINT (3225860.732 5013551.237)

À la dernière étape, nous pouvons extraire les coordonnées dans la projection Mercator qui correspondent aux longitudes et latitudes données:

gdf['longitude_x'] = gdf['geometry'].x
gdf['latitude_y'] = gdf['geometry'].y

Maintenant, le geodataframe a deux nouvelles colonnes qui seront utilisées pour tracer nos points :

  city_name  longitude  latitude                         geometry  \
0     Paris     2.3522   48.8566   POINT (261845.706 6250564.350)   
1    London    -0.1276   51.5072   POINT (-14204.367 6711506.705)   
2    Moscow    37.6173   55.7558  POINT (4187538.681 7509955.142)   
3  Istanbul    28.9784   41.0082  POINT (3225860.732 5013551.237)

    longitude_x    latitude_y  
0  2.618457e+05  6.250564e+06  
1 -1.420437e+04  6.711507e+06  
2  4.187539e+06  7.509955e+06  
3  3.225861e+06  5.013551e+06

Création d'une "bokeh ColumnDataSource"

Nous pouvons maintenant stocker nos données dans un Bokeh ColumnDataSource. Pour cela, nous pouvons utiliser une dataframe pandas. En conséquence, nous devons convertir notre dataframe geopandas mentionné précédemment et supprimer la colonne "geometry" car Bokeh ne reconnaît pas cette colonne.

df_new = pd.DataFrame(gdf.drop(columns='geometry'))

Maintenant, nous pouvons créer une bokeh ColumnDataSource.

from bokeh.models import ColumnDataSource

source = ColumnDataSource(df_new)

Traçer des points sur une carte avec Bokeh

Maintenant, nous pouvons visualiser nos données sur la carte en traçant les points à l'aide de la fonction p.circle().

from bokeh.plotting import figure, show, output_file

p = figure(x_range=(-2000000, 6000000), y_range=(4000000, 7000000),
           x_axis_type="mercator", y_axis_type="mercator")

p.add_tile("OpenStreetMap Mapnik")

p.circle(x='longitude_x', y='latitude_y', size=15, alpha=0.7, source=source)

p.grid.visible = False

show(p)

Cela créera des cercles d'une taille de 15, une valeur alpha de 0.7 et la source de données spécifiée comme étant 'source'.

Comment tracer des points (définis par leurs longitudes et latitudes) sur une carte Bokeh ?
Comment tracer des points (définis par leurs longitudes et latitudes) sur une carte Bokeh ?

Références

Liens Site
tile_demo docs.bokeh.org
Mapping geo data docs.bokeh.org
circle docs.bokeh.org
Image

of