Comment convertir un index H3 en latitude et longitude en Python ?

Introduction

Le système d’indexation géospatiale H3, développé par Uber, attribue une chaîne hexadécimale unique (appelée index H3) à chaque cellule hexagonale de la planète. Il est souvent nécessaire de convertir ces indices en latitude et longitude, que ce soit pour la visualisation ou l’analyse spatiale.

Installer la bibliothèque H3 en Python

Installez la dernière version officielle de la bibliothèque h3 :

1
pip install h3

Vérifier la version

Il existe deux versions principales de la bibliothèque H3 en Python. Pour savoir laquelle vous utilisez :

1
pip show h3
  • Si Version >= 4.0.0 : utilisez cell_to_latlng() et cell_to_boundary()
  • Si Version < 4.0.0 : utilisez h3_to_geo() et h3_to_geo_boundary()

Convertir un index H3 en latitude/longitude

Avec la nouvelle API (h3 >= 4.0.0)

1
2
3
4
5
6
7
8
9
import h3

# Exemple d'index H3
h3_index = '8928308280fffff'

# Conversion en (latitude, longitude)
lat, lon = h3.cell_to_latlng(h3_index)

print(f"Latitude : {lat}, Longitude : {lon}")

Sortie :

1
Latitude: 37.776702349435695, Longitude: -122.41845932318309

Avec l’ancienne API (avant la version 4.0.0)

1
2
3
4
5
6
import h3

h3_index = '8928308280fffff'
lat, lon = h3.h3_to_geo(h3_index)

print(f"Latitude : {lat}, Longitude : {lon}")

Obtenir les sommets de la cellule H3 (polygone hexagonal)

Si vous souhaitez récupérer les coordonnées du contour de la cellule H3 (par exemple, pour les tracer) :

Nouvelle API :

1
2
3
4
5
import h3

boundary = h3.cell_to_boundary(h3_index)
for lat, lon in boundary:
    print(f"Lat : {lat}, Lon : {lon}")

Sortie :

1
2
3
4
5
6
Lat: 37.775197782893386, Lon: -122.41719971841658  
Lat: 37.77688044840227, Lon: -122.41612835779266  
Lat: 37.778385004930925, Lon: -122.41738797617619  
Lat: 37.77820687262237, Lon: -122.41971895414808  
Lat: 37.776524206993216, Lon: -122.42079024541879  
Lat: 37.775019673792606, Lon: -122.41953062807342

Ancienne API :

1
2
3
4
5
import h3

boundary = h3.h3_to_geo_boundary(h3_index, geo_json=True)
for lat, lon in boundary:
    print(f"Lat : {lat}, Lon : {lon}")

Conversion en masse d’indices H3 en lat/lon dans une liste ou un DataFrame

Avec une liste :

1
2
h3_indices = ['8928308280fffff', '8928308280bffff', '89283082807ffff']
latlon_list = [h3.cell_to_latlng(h) for h in h3_indices]

Sortie :

1
2
3
[(37.776702349435695, -122.41845932318309),
 (37.7753758485188, -122.41486876560982),
 (37.77484152121918, -122.42186149457379)]

Avec un DataFrame pandas :

1
2
3
4
5
6
7
import pandas as pd
import h3

df = pd.DataFrame({'h3_index': ['8928308280fffff', '8928308280bffff']})

# Ajout des colonnes latitude et longitude
df[['lat', 'lon']] = df['h3_index'].apply(lambda h: pd.Series(h3.cell_to_latlng(h)))

Sortie :

h3_index lat lon
8928308280fffff 37.776702 -122.418459
8928308280bffff 37.775376 -122.414869

Résumé

Tâche Nouvelle API (>= 4.0.0) Ancienne API (legacy)
Obtenir lat/lon central cell_to_latlng() h3_to_geo()
Obtenir le contour hexagon cell_to_boundary() h3_to_geo_boundary()