mapping-geojson-osm/mappings/extractors/geojson_to_csv.py

59 lines
2.4 KiB
Python

import argparse
import json
import pandas_geojson as pdg
import pandas as pd
import os
###
# 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
###
# 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["features"]))
# initialiser un dataframe vide
# définir les noms des colonnes à partir des propriétés prises dans la boucle append
keys = list(data["features"][0]["properties"]['tags'].keys())
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
values[column] = element["properties"]["tags"].get(tag, "")
values["id"] = element["properties"]["id"]
values["latitude"] = element["geometry"]["coordinates"][0]
values["longitude"] = element["geometry"]["coordinates"][1]
return values
# parcourir chaque élément pour trouver les clés de tag
for element in data["features"]:
# 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)