osm-labo/counting_osm_objects/get_all_polys.py
2025-07-27 18:01:24 +02:00

167 lines
4.7 KiB
Python
Executable file

#!/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())