2024-10-17 12:25:25 +02:00
import argparse
import json
import pandas_geojson as pdg
import pandas as pd
import os
# 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 ( )
# charger le fichier GeoJSON en tant que dataframe
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
print ( " Nombre d ' éléments dans le fichier GeoJSON : " , len ( data [ " elements " ] ) )
2024-10-17 13:14:08 +02:00
# print(json.dumps(data["elements"][0], indent=2))
2024-10-17 12:25:25 +02:00
2024-10-17 13:04:07 +02:00
# initialiser un dataframe vide
# définir les noms des colonnes à partir des propriétés prises dans la boucle append
keys = list ( data [ " elements " ] [ 0 ] [ ' tags ' ] . keys ( ) )
columns = keys
# columns = ["id", "latitude", "longitude", "name", "shop", "opening_hours", "ref:FR:SIRET", "contact:city","contact:housenumber", "contact:street","contact:postcode","contact:website", "check_date", "email", "phone"]
# initialiser le dataframe avec les colonnes définies ci-dessus
df = pd . DataFrame ( columns = columns )
# définir une fonction qui prend en entrée un élément du JSON et renvoie un dictionnaire avec les valeurs correspondantes pour chaque tag
def get_element_tags_values ( element ) :
values = { }
for column in columns [ 1 : ] : # on saute la première colonne "id"
tag = column . split ( " : " ) [ - 1 ] # on prend le nom du tag à partir du nom de la colonne
values [ column ] = element [ " tags " ] . get ( tag , " " )
values [ " id " ] = element [ " id " ]
values [ " latitude " ] = element [ " lat " ]
values [ " longitude " ] = element [ " lon " ]
return values
# parcourir chaque élément dans la clé "elements"
for element in data [ " elements " ] :
# ajouter une nouvelle ligne au dataframe avec les valeurs de chaque tag
df = df . _append ( get_element_tags_values ( element ) , 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-17 13:04:07 +02:00
df . to_csv ( output_file , sep = " ; " , index = False )