Comment tracer un polygone sur une carte interactive en python avec Bokeh ?

Published: 13 février 2024

Tags: Python; Bokeh;

DMCA.com Protection Status

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:

Comment tracer un polygone sur une carte interactive en python avec Bokeh  ?
Comment tracer un polygone sur une carte interactive en python avec Bokeh ?

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)

Comment tracer un polygone sur une carte interactive en python avec Bokeh  ?
Comment tracer un polygone sur une carte interactive en python avec Bokeh ?

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
Image

of