| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186 |
- 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__)
|