#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ Script pour récupérer les polygones de toutes les communes françaises listées dans un fichier CSV. Ce script: 1. Ouvre le fichier osm-commerces-villes-export.csv 2. Extrait les codes INSEE (colonne 'zone') 3. Pour chaque code INSEE, vérifie si le polygone existe déjà 4. Si non, utilise get_poly.py pour récupérer le polygone Usage: python get_all_polys.py """ import os import sys import csv from get_poly import query_overpass_api, extract_polygon, save_polygon_to_file # Chemin vers le fichier CSV contenant les codes INSEE CSV_FILE = os.path.join( os.path.dirname(os.path.abspath(__file__)), "osm-commerces-villes-export.csv" ) # Chemin vers le dossier où sont stockés les polygones POLYGONS_DIR = os.path.join(os.path.dirname(os.path.abspath(__file__)), "polygons") def ensure_polygons_dir_exists(): """ Vérifie que le dossier 'polygons' existe, sinon le crée. """ os.makedirs(POLYGONS_DIR, exist_ok=True) print(f"Dossier de polygones: {POLYGONS_DIR}") def polygon_exists(insee_code): """ Vérifie si le polygone pour le code INSEE donné existe déjà. Args: insee_code (str): Le code INSEE de la commune Returns: bool: True si le polygone existe, False sinon """ polygon_file = os.path.join(POLYGONS_DIR, f"commune_{insee_code}.poly") return os.path.isfile(polygon_file) def get_polygon(insee_code): """ Récupère le polygone pour le code INSEE donné. Args: insee_code (str): Le code INSEE de la commune Returns: str: Le chemin du fichier polygone créé, ou None en cas d'erreur """ try: print(f"Récupération du polygone pour la commune {insee_code}...") # Interroger l'API Overpass data = query_overpass_api(insee_code) # Extraire le polygone polygon = extract_polygon(data) # Sauvegarder le polygone dans un fichier output_file = save_polygon_to_file(polygon, insee_code) print(f"Polygone pour la commune {insee_code} sauvegardé dans {output_file}") return output_file except Exception as e: print(f"Erreur lors de la récupération du polygone pour {insee_code}: {e}") return None def read_insee_codes_from_csv(): """ Lit le fichier CSV et extrait les codes INSEE (colonne 'zone'). Returns: list: Liste des codes INSEE """ insee_codes = [] try: print(f"Lecture du fichier CSV: {CSV_FILE}") if not os.path.isfile(CSV_FILE): print(f"Erreur: Le fichier {CSV_FILE} n'existe pas.") return insee_codes with open(CSV_FILE, "r", encoding="utf-8") as csvfile: reader = csv.DictReader(csvfile) for row in reader: if "zone" in row and row["zone"]: insee_codes.append(row["zone"]) print(f"Nombre de codes INSEE trouvés: {len(insee_codes)}") return insee_codes except Exception as e: print(f"Erreur lors de la lecture du fichier CSV: {e}") return insee_codes def main(): """ Fonction principale du script. """ try: # S'assurer que le dossier des polygones existe ensure_polygons_dir_exists() # Lire les codes INSEE depuis le fichier CSV insee_codes = read_insee_codes_from_csv() if not insee_codes: print("Aucun code INSEE trouvé dans le fichier CSV.") return 1 # Compteurs pour les statistiques total = len(insee_codes) existing = 0 created = 0 failed = 0 # Pour chaque code INSEE, récupérer le polygone s'il n'existe pas déjà for i, insee_code in enumerate(insee_codes, 1): print(f"\nTraitement de la commune {i}/{total}: {insee_code}") if polygon_exists(insee_code): print(f"Le polygone pour la commune {insee_code} existe déjà.") existing += 1 continue # Récupérer le polygone result = get_polygon(insee_code) if result: created += 1 else: failed += 1 # Afficher les statistiques print("\nRésumé:") print(f"Total des communes traitées: {total}") print(f"Polygones déjà existants: {existing}") print(f"Polygones créés avec succès: {created}") print(f"Échecs: {failed}") return 0 # Succès except KeyboardInterrupt: print("\nOpération annulée par l'utilisateur.") return 1 # Erreur except Exception as e: print(f"Erreur inattendue: {e}") return 1 # Erreur if __name__ == "__main__": sys.exit(main())