57 lines
2.4 KiB
Python
57 lines
2.4 KiB
Python
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
|
|
with open(args.geojson, "r") as f:
|
|
data = json.load(f)
|
|
|
|
# afficher le décompte des éléments
|
|
print("Nombre d'éléments dans le fichier GeoJSON :", len(data["elements"]))
|
|
# print(json.dumps(data["elements"][0], indent=2))
|
|
|
|
|
|
# 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
|
|
if args.output:
|
|
output_file = args.output
|
|
else:
|
|
output_file = os.path.splitext(args.geojson)[0] + ".csv"
|
|
|
|
print('fichier csv converti : ', output_file)
|
|
# convertir le dataframe en CSV en incluant toutes les colonnes
|
|
df.to_csv(output_file, sep=";", index=False)
|