167 lines
4.7 KiB
Python
Executable file
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())
|