2024-10-17 12:25:25 +02:00
import argparse
import json
import pandas as pd
# définir le parseur d'arguments
parser = argparse . ArgumentParser ( description = " Convertir un fichier GeoJSON en CSV et ajouter des colonnes latitude et longitude " )
parser . add_argument ( " geojson " , help = " Le chemin du fichier GeoJSON à convertir " )
parser . add_argument ( " -o " , " --output " , default = None , help = " Le nom du fichier de sortie CSV (par défaut: le même nom que le fichier GeoJSON avec l ' extension CSV) " )
args = parser . parse_args ( )
2024-10-28 16:55:11 +01:00
# charger le fichier GeoJSON en tant que liste de features
2024-10-17 13:04:07 +02:00
with open ( args . geojson , " r " ) as f :
data = json . load ( f )
2024-10-17 12:25:25 +02:00
2024-10-17 13:04:07 +02:00
# afficher le décompte des éléments
2024-10-18 11:10:19 +02:00
print ( " Nombre d ' éléments dans le fichier GeoJSON : " , len ( data [ " features " ] ) )
2024-10-17 12:25:25 +02:00
2024-10-28 16:55:11 +01:00
# initialiser un ensemble pour stocker les clés de toutes les features
all_keys = set ( )
# parcourir chaque feature pour trouver les clés de tag
for feature in data [ " features " ] :
# ajouter les clés de la feature à l'ensemble
all_keys . update ( feature [ " properties " ] [ " tags " ] . keys ( ) )
2024-10-17 12:25:25 +02:00
2024-10-28 16:55:11 +01:00
# convertir l'ensemble en liste et trier les clés
columns = sorted ( list ( all_keys ) )
2024-10-17 13:04:07 +02:00
# initialiser le dataframe avec les colonnes définies ci-dessus
2024-10-28 16:55:11 +01:00
df = pd . DataFrame ( columns = [ " id " , " latitude " , " longitude " ] + columns )
# parcourir chaque feature pour ajouter une nouvelle ligne au dataframe avec les valeurs de chaque tag
for feature in data [ " features " ] :
# définir la latitude et la longitude selon la première coordonnée si la géométrie est de type Linestring
if feature [ " geometry " ] [ " type " ] == " LineString " :
latitude = feature [ " geometry " ] [ " coordinates " ] [ 0 ] [ 1 ]
longitude = feature [ " geometry " ] [ " coordinates " ] [ 0 ] [ 0 ]
else :
latitude = feature [ " geometry " ] [ " coordinates " ] [ 1 ]
longitude = feature [ " geometry " ] [ " coordinates " ] [ 0 ]
row = {
" id " : feature [ " properties " ] [ " id " ] ,
" latitude " : latitude ,
" longitude " : longitude
}
# ajouter les valeurs de chaque tag à la ligne
for key in columns :
row [ key ] = feature [ " properties " ] [ " tags " ] . get ( key , " " )
df = df . _append ( row , ignore_index = True )
# définir le nom du fichier de sortie CSV
2024-10-17 12:25:25 +02:00
if args . output :
output_file = args . output
else :
output_file = os . path . splitext ( args . geojson ) [ 0 ] + " .csv "
2024-10-17 13:14:08 +02:00
print ( ' fichier csv converti : ' , output_file )
2024-10-17 12:25:25 +02:00
# convertir le dataframe en CSV en incluant toutes les colonnes
2024-10-28 16:55:11 +01:00
df . to_csv ( output_file , sep = " ; " , index = False )