|
|
@@ -0,0 +1,186 @@
|
|
|
+import requests
|
|
|
+import json
|
|
|
+import os
|
|
|
+import time
|
|
|
+from multiprocessing import Pool, cpu_count
|
|
|
+
|
|
|
+# Paramètres globaux
|
|
|
+MIN_LAT, MAX_LAT = 41.0, 51.0
|
|
|
+MIN_LON, MAX_LON = -5.0, 8.0
|
|
|
+RESOLUTION = 0.000003 # Environ 30 cm
|
|
|
+BATCH_SIZE = 175
|
|
|
+MAX_FILE_SIZE = 2 * 1024 * 1024 # 2 Mo
|
|
|
+SECTIONS_FILE = 'sections.json'
|
|
|
+STATE_FILE = 'progress_state.json'
|
|
|
+
|
|
|
+def generate_sections(lat_step=0.1, lon_step=0.1):
|
|
|
+ """Génère une liste de sections couvrant la France avec affichage de la progression."""
|
|
|
+ sections = []
|
|
|
+ total_steps = int((MAX_LAT - MIN_LAT) / lat_step) * int((MAX_LON - MIN_LON) / lon_step)
|
|
|
+ completed_steps = 0
|
|
|
+
|
|
|
+ lat = MIN_LAT
|
|
|
+ while lat < MAX_LAT:
|
|
|
+ lon = MIN_LON
|
|
|
+ while lon < MAX_LON:
|
|
|
+ sections.append((lat, lon))
|
|
|
+ lon += lon_step
|
|
|
+ completed_steps += 1
|
|
|
+ percentage = (completed_steps / total_steps) * 100
|
|
|
+ print(f"Progression de la création des sections : {percentage:.2f}%")
|
|
|
+ lat += lat_step
|
|
|
+ return sections
|
|
|
+
|
|
|
+def save_sections(sections):
|
|
|
+ """Sauvegarde les sections dans un fichier JSON."""
|
|
|
+ with open(SECTIONS_FILE, 'w') as f:
|
|
|
+ json.dump(sections, f)
|
|
|
+ print(f"Sections saved to {SECTIONS_FILE}")
|
|
|
+
|
|
|
+def load_sections():
|
|
|
+ """Charge les sections à partir du fichier JSON."""
|
|
|
+ if os.path.exists(SECTIONS_FILE):
|
|
|
+ with open(SECTIONS_FILE, 'r') as f:
|
|
|
+ sections = json.load(f)
|
|
|
+ else:
|
|
|
+ sections = generate_sections()
|
|
|
+ save_sections(sections)
|
|
|
+ return sections
|
|
|
+
|
|
|
+def req(longitude, latitude):
|
|
|
+ """Envoie une requête à l'API pour obtenir les altitudes."""
|
|
|
+ longi = "|".join(map(str, longitude))
|
|
|
+ latti = "|".join(map(str, latitude))
|
|
|
+
|
|
|
+ url = f'https://wxs.ign.fr/calcul/alti/rest/elevation.json?lon={longi}&lat={latti}&zonly=true'
|
|
|
+
|
|
|
+ while True:
|
|
|
+ try:
|
|
|
+ response = requests.get(url)
|
|
|
+ if response.status_code == 200:
|
|
|
+ data = response.json()
|
|
|
+ if 'elevations' in data:
|
|
|
+ return data['elevations']
|
|
|
+ else:
|
|
|
+ print("Impossible d'obtenir l'altitude pour les coordonnées spécifiées.")
|
|
|
+ return []
|
|
|
+ else:
|
|
|
+ print(f"Erreur de réponse de l'API. Code de statut : {response.status_code}")
|
|
|
+ time.sleep(1)
|
|
|
+ except requests.exceptions.RequestException as e:
|
|
|
+ print(f"Une erreur s'est produite lors de la requête : {e}")
|
|
|
+ time.sleep(1)
|
|
|
+
|
|
|
+def is_section_in_france(lat, lon):
|
|
|
+ """Vérifie si une section est en France en testant les altitudes aux quatre coins."""
|
|
|
+ coords = [
|
|
|
+ (lat, lon),
|
|
|
+ (lat + 0.1, lon),
|
|
|
+ (lat, lon + 0.1),
|
|
|
+ (lat + 0.1, lon + 0.1)
|
|
|
+ ]
|
|
|
+ for coord in coords:
|
|
|
+ elevation = req([coord[1]], [coord[0]])
|
|
|
+ if elevation and elevation[0] == -99999.0:
|
|
|
+ return False
|
|
|
+ return True
|
|
|
+
|
|
|
+def filter_sections_in_france(sections):
|
|
|
+ """Filtre les sections pour ne conserver que celles en France."""
|
|
|
+ total_sections = len(sections)
|
|
|
+ valid_sections = []
|
|
|
+ for i, section in enumerate(sections):
|
|
|
+ if is_section_in_france(section[0], section[1]):
|
|
|
+ valid_sections.append(section)
|
|
|
+ percentage = (i + 1) / total_sections * 100
|
|
|
+ print(f"Progression de la vérification des sections : {percentage:.2f}%")
|
|
|
+ save_sections(valid_sections)
|
|
|
+ return valid_sections
|
|
|
+
|
|
|
+def process_section(section):
|
|
|
+ """Récupère les altitudes pour une section donnée avec une résolution fine."""
|
|
|
+ lat, lon = section
|
|
|
+ data = []
|
|
|
+
|
|
|
+ current_lat = lat
|
|
|
+ while current_lat < lat + 0.1 and current_lat < MAX_LAT:
|
|
|
+ current_lon = lon
|
|
|
+ while current_lon < lon + 0.1 and current_lon < MAX_LON:
|
|
|
+ latitudes = [current_lat]
|
|
|
+ longitudes = [current_lon]
|
|
|
+ new_data = req(longitudes, latitudes)
|
|
|
+ if new_data:
|
|
|
+ data += new_data
|
|
|
+ current_lon += RESOLUTION
|
|
|
+ current_lat += RESOLUTION
|
|
|
+
|
|
|
+ return data
|
|
|
+
|
|
|
+def save_section(data, file_index):
|
|
|
+ """Sauvegarde les données dans un fichier JSON."""
|
|
|
+ filename = f'data_part_{file_index}.json'
|
|
|
+ with open(filename, 'w') as f:
|
|
|
+ json.dump(data, f)
|
|
|
+ print(f"Data saved to {filename}")
|
|
|
+
|
|
|
+def load_progress():
|
|
|
+ """Charge l'état du programme à partir du fichier d'état."""
|
|
|
+ if os.path.exists(STATE_FILE):
|
|
|
+ with open(STATE_FILE, 'r') as f:
|
|
|
+ state = json.load(f)
|
|
|
+ else:
|
|
|
+ state = {
|
|
|
+ "current_section_index": 0,
|
|
|
+ "file_index": 0
|
|
|
+ }
|
|
|
+ return state
|
|
|
+
|
|
|
+def save_state(state):
|
|
|
+ """Sauvegarde l'état du programme dans un fichier d'état."""
|
|
|
+ with open(STATE_FILE, 'w') as f:
|
|
|
+ json.dump(state, f)
|
|
|
+
|
|
|
+def process_and_save(section, file_index):
|
|
|
+ """Traite une section et sauvegarde le résultat."""
|
|
|
+ data = process_section(section)
|
|
|
+ if data:
|
|
|
+ save_section(data, file_index)
|
|
|
+ file_index += 1
|
|
|
+ return file_index
|
|
|
+
|
|
|
+def main():
|
|
|
+ sections = load_sections()
|
|
|
+ sections = filter_sections_in_france(sections)
|
|
|
+ state = load_progress()
|
|
|
+
|
|
|
+ current_section_index = state["current_section_index"]
|
|
|
+ file_index = state["file_index"]
|
|
|
+
|
|
|
+ total_sections = len(sections)
|
|
|
+ num_cores = max(1, cpu_count() - 1) # Utiliser tous les cœurs sauf un pour le parallélisme local
|
|
|
+
|
|
|
+ while current_section_index < total_sections:
|
|
|
+ end_index = min(current_section_index + num_cores, total_sections)
|
|
|
+ sections_to_process = sections[current_section_index:end_index]
|
|
|
+
|
|
|
+ with Pool(num_cores) as pool:
|
|
|
+ results = pool.starmap(process_and_save, [(section, file_index) for section in sections_to_process])
|
|
|
+
|
|
|
+ # Mettre à jour file_index
|
|
|
+ file_index = max(results)
|
|
|
+
|
|
|
+ current_section_index = end_index
|
|
|
+
|
|
|
+ # Mettre à jour l'état
|
|
|
+ state["current_section_index"] = current_section_index
|
|
|
+ state["file_index"] = file_index
|
|
|
+ save_state(state)
|
|
|
+
|
|
|
+if __name__ == "__main__":
|
|
|
+ main()
|
|
|
+ # Vérification des versions installées
|
|
|
+ import requests
|
|
|
+ import urllib3
|
|
|
+
|
|
|
+ print("Requests version:", requests.__version__)
|
|
|
+ print("Urllib3 version:", urllib3.__version__)
|