Introduction
Bokeh offre un cadre puissant pour créer des visualisations de données interactives. Grâce à l'importation de bibliothèques géographiques telles que GeoPandas, Bokeh permet de mapper des points sur une carte avec une interface simple et efficace.
En supposant que vous avez les packages nécessaires installés (Bokeh, Pandas et Geopandas), voici un guide étape par étape pour tracer un polygone sur une carte à l'aide de Bokeh :
Dans un article précédent, nous avons exploré le processus d'ajout de points à une carte en bokeh. Maintenant, plongeons-nous dans le tracé de polygones. À titre d'exemple, nous allons tracer le Triangle des Bermudes sur une carte.
Création d'une carte en utilisant Bokeh
Pour commencer, créons une carte en utilisant Bokeh. Il existe plusieurs approches et options de cartes disponibles. Pour cet exemple, utilisons la carte "OpenStreetMap Mapnik".
from bokeh.plotting import figure, show, output_file
p = figure(x_range=(-10000000, -6000000), y_range=(-1000000, 6000000),
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:
Pour tracer avec précision un polygone 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 correctement notre polygone, nous devons convertir les longitudes et latitudes dans le système de coordonnées approprié. Un outil très efficace pour accomplir cette tâche en Python est geopandas. Dans l'exemple suivant, nous illustrerons comment stocker vos données dans une dataframe geopandas et convertir le système de coordonnées pour finalement tracer notre polygone.
Définition du Triangle des Bermudes
Le Triangle des Bermudes peut être grossièrement défini par trois points correspondant à trois villes : Miami ([25,7617° N, 80,1918° O]), San Juan, Porto Rico ([18,4671° N, 66,1185° O]) et Hamilton, Bermudes ([32,2951° N, 64,7842° O]) :
data = {'Location':['Miami Florida','San-Juan Puerto-Rico','Hamilton Bermuda'],
'longitude':[-80.1918,-66.118,-64.7842],
'latitude':[25.7617,18.4671,32.2951]}
Création d'une GeoPandas DataFrame
Pour tracer un polygone sur une carte interactive en utilisant Bokeh en Python, nous devons commencer par créer une DataFrame GeoPandas.
D'abord, stockons nos données dans une DataFrame pandas :
import pandas as pd
df = pd.DataFrame(data)
et convertissons la en une DataFrame GeoPandas
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 convertir notre GeoPandas DataaFrame en projection Mercator, nous pouvons faire :
gdf = gdf.to_crs("epsg:3857") # Mercator-projection
Enfin, notre jeu de données s'est transformé en le format suivant :
Location longitude latitude geometry
0 Miami Florida -80.1918 25.7617 POINT (-8926910.342 2969596.279)
1 San-Juan Puerto-Rico -66.1180 18.4671 POINT (-7360222.092 2092294.925)
2 Hamilton Bermuda -64.7842 32.2951 POINT (-7211744.155 3802109.728)
Extraction des coordonnées dans la projection Mercator
Nous allons maintenant extraire les coordonnées dans la projection de Mercator qui correspondent aux longitudes et latitudes données.
gdf['longitude_x'] = gdf['geometry'].x
gdf['latitude_y'] = gdf['geometry'].y
Maintenant, le GeoPandas DataFrame dispose de deux nouvelles colonnes qui seront utilisées pour tracer notre polygone :
Location longitude latitude \
0 Miami Florida -80.1918 25.7617
1 San-Juan Puerto-Rico -66.1180 18.4671
2 Hamilton Bermuda -64.7842 32.2951
geometry longitude_x latitude_y
0 POINT (-8926910.342 2969596.279) -8.926910e+06 2.969596e+06
1 POINT (-7360222.092 2092294.925) -7.360222e+06 2.092295e+06
2 POINT (-7211744.155 3802109.728) -7.211744e+06 3.802110e+06
Tracer un polygone avec une carte Bokeh
Pour y parvenir, nous pouvons stocker les longitudes et latitudes dans une liste comme suit:
gdf['longitude_x'].to_list()
gdf['latitude_y'].to_list()
This will give us the following output:
[-8926910.341796037, -7360222.092269662, -7211744.155449593]
[2969596.2785174837, 2092294.9247172303, 3802109.727954972]
respectivement.
Nous pouvons maintenant visualiser notre polygone sur la carte en utilisant la fonction patches().
from bokeh.plotting import figure, show, output_file
p = figure(x_range=(-10000000, -6000000), y_range=(-1000000, 6000000),
x_axis_type="mercator", y_axis_type="mercator")
p.add_tile("OpenStreetMap Mapnik")
lons = gdf['longitude_x'].to_list()
lats = gdf['latitude_y'].to_list()
p.patches([lons],
[lats],
color=["firebrick"], alpha=[0.4], line_width=4)
p.grid.visible = False
show(p)
Références
Liens | Site |
---|---|
tile_demo | docs.bokeh.org |
Mapping geo data | docs.bokeh.org |
MultiPolygons | docs.bokeh.org |
Plotting with basic glyphs | docs.bokeh.org |
patches() | docs.bokeh.org |