2024-10-17 12:25:25 +02:00
import argparse
import json
import pandas_geojson as pdg
import pandas as pd
import os
2024-10-18 12:27:27 +02:00
###
# convertir un jeu de données geojson pris d'openstreetmap, convertit en geojson, pour le convertir en csv
# ce afin de lire facilement les données obtenues depuis overpass sans avoir à spécifier manuellement les colonnes représentant les tags
###
2024-10-17 12:25:25 +02:00
# 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
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-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
2024-10-18 11:10:19 +02:00
keys = list ( data [ " features " ] [ 0 ] [ " properties " ] [ ' tags ' ] . keys ( ) )
2024-10-17 13:04:07 +02:00
columns = keys
# 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
2024-10-18 11:10:19 +02:00
values [ column ] = element [ " properties " ] [ " tags " ] . get ( tag , " " )
values [ " id " ] = element [ " properties " ] [ " id " ]
values [ " latitude " ] = element [ " geometry " ] [ " coordinates " ] [ 0 ]
values [ " longitude " ] = element [ " geometry " ] [ " coordinates " ] [ 1 ]
2024-10-17 13:04:07 +02:00
return values
2024-10-18 11:10:19 +02:00
# parcourir chaque élément pour trouver les clés de tag
for element in data [ " features " ] :
2024-10-17 13:04:07 +02:00
# 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 )