testEnregistreFrance.py 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. import requests
  2. import json
  3. import os
  4. import time
  5. from multiprocessing import Pool, cpu_count
  6. # Paramètres globaux
  7. MIN_LAT, MAX_LAT = 41.0, 51.0
  8. MIN_LON, MAX_LON = -5.0, 8.0
  9. RESOLUTION = 0.000003 # Environ 30 cm
  10. BATCH_SIZE = 175
  11. MAX_FILE_SIZE = 2 * 1024 * 1024 # 2 Mo
  12. SECTIONS_FILE = 'sections.json'
  13. STATE_FILE = 'progress_state.json'
  14. def generate_sections(lat_step=0.1, lon_step=0.1):
  15. """Génère une liste de sections couvrant la France avec affichage de la progression."""
  16. sections = []
  17. total_steps = int((MAX_LAT - MIN_LAT) / lat_step) * int((MAX_LON - MIN_LON) / lon_step)
  18. completed_steps = 0
  19. lat = MIN_LAT
  20. while lat < MAX_LAT:
  21. lon = MIN_LON
  22. while lon < MAX_LON:
  23. sections.append((lat, lon))
  24. lon += lon_step
  25. completed_steps += 1
  26. percentage = (completed_steps / total_steps) * 100
  27. print(f"Progression de la création des sections : {percentage:.2f}%")
  28. lat += lat_step
  29. return sections
  30. def save_sections(sections):
  31. """Sauvegarde les sections dans un fichier JSON."""
  32. with open(SECTIONS_FILE, 'w') as f:
  33. json.dump(sections, f)
  34. print(f"Sections saved to {SECTIONS_FILE}")
  35. def load_sections():
  36. """Charge les sections à partir du fichier JSON."""
  37. if os.path.exists(SECTIONS_FILE):
  38. with open(SECTIONS_FILE, 'r') as f:
  39. sections = json.load(f)
  40. else:
  41. sections = generate_sections()
  42. save_sections(sections)
  43. return sections
  44. def req(longitude, latitude):
  45. """Envoie une requête à l'API pour obtenir les altitudes."""
  46. longi = "|".join(map(str, longitude))
  47. latti = "|".join(map(str, latitude))
  48. url = f'https://wxs.ign.fr/calcul/alti/rest/elevation.json?lon={longi}&lat={latti}&zonly=true'
  49. while True:
  50. try:
  51. response = requests.get(url)
  52. if response.status_code == 200:
  53. data = response.json()
  54. if 'elevations' in data:
  55. return data['elevations']
  56. else:
  57. print("Impossible d'obtenir l'altitude pour les coordonnées spécifiées.")
  58. return []
  59. else:
  60. print(f"Erreur de réponse de l'API. Code de statut : {response.status_code}")
  61. time.sleep(1)
  62. except requests.exceptions.RequestException as e:
  63. print(f"Une erreur s'est produite lors de la requête : {e}")
  64. time.sleep(1)
  65. def is_section_in_france(lat, lon):
  66. """Vérifie si une section est en France en testant les altitudes aux quatre coins."""
  67. coords = [
  68. (lat, lon),
  69. (lat + 0.1, lon),
  70. (lat, lon + 0.1),
  71. (lat + 0.1, lon + 0.1)
  72. ]
  73. for coord in coords:
  74. elevation = req([coord[1]], [coord[0]])
  75. if elevation and elevation[0] == -99999.0:
  76. return False
  77. return True
  78. def filter_sections_in_france(sections):
  79. """Filtre les sections pour ne conserver que celles en France."""
  80. total_sections = len(sections)
  81. valid_sections = []
  82. for i, section in enumerate(sections):
  83. if is_section_in_france(section[0], section[1]):
  84. valid_sections.append(section)
  85. percentage = (i + 1) / total_sections * 100
  86. print(f"Progression de la vérification des sections : {percentage:.2f}%")
  87. save_sections(valid_sections)
  88. return valid_sections
  89. def process_section(section):
  90. """Récupère les altitudes pour une section donnée avec une résolution fine."""
  91. lat, lon = section
  92. data = []
  93. current_lat = lat
  94. while current_lat < lat + 0.1 and current_lat < MAX_LAT:
  95. current_lon = lon
  96. while current_lon < lon + 0.1 and current_lon < MAX_LON:
  97. latitudes = [current_lat]
  98. longitudes = [current_lon]
  99. new_data = req(longitudes, latitudes)
  100. if new_data:
  101. data += new_data
  102. current_lon += RESOLUTION
  103. current_lat += RESOLUTION
  104. return data
  105. def save_section(data, file_index):
  106. """Sauvegarde les données dans un fichier JSON."""
  107. filename = f'data_part_{file_index}.json'
  108. with open(filename, 'w') as f:
  109. json.dump(data, f)
  110. print(f"Data saved to {filename}")
  111. def load_progress():
  112. """Charge l'état du programme à partir du fichier d'état."""
  113. if os.path.exists(STATE_FILE):
  114. with open(STATE_FILE, 'r') as f:
  115. state = json.load(f)
  116. else:
  117. state = {
  118. "current_section_index": 0,
  119. "file_index": 0
  120. }
  121. return state
  122. def save_state(state):
  123. """Sauvegarde l'état du programme dans un fichier d'état."""
  124. with open(STATE_FILE, 'w') as f:
  125. json.dump(state, f)
  126. def process_and_save(section, file_index):
  127. """Traite une section et sauvegarde le résultat."""
  128. data = process_section(section)
  129. if data:
  130. save_section(data, file_index)
  131. file_index += 1
  132. return file_index
  133. def main():
  134. sections = load_sections()
  135. sections = filter_sections_in_france(sections)
  136. state = load_progress()
  137. current_section_index = state["current_section_index"]
  138. file_index = state["file_index"]
  139. total_sections = len(sections)
  140. num_cores = max(1, cpu_count() - 1) # Utiliser tous les cœurs sauf un pour le parallélisme local
  141. while current_section_index < total_sections:
  142. end_index = min(current_section_index + num_cores, total_sections)
  143. sections_to_process = sections[current_section_index:end_index]
  144. with Pool(num_cores) as pool:
  145. results = pool.starmap(process_and_save, [(section, file_index) for section in sections_to_process])
  146. # Mettre à jour file_index
  147. file_index = max(results)
  148. current_section_index = end_index
  149. # Mettre à jour l'état
  150. state["current_section_index"] = current_section_index
  151. state["file_index"] = file_index
  152. save_state(state)
  153. if __name__ == "__main__":
  154. main()
  155. # Vérification des versions installées
  156. import requests
  157. import urllib3
  158. print("Requests version:", requests.__version__)
  159. print("Urllib3 version:", urllib3.__version__)