-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathverifyBases.py
More file actions
103 lines (92 loc) · 3.4 KB
/
Copy pathverifyBases.py
File metadata and controls
103 lines (92 loc) · 3.4 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
import json
from geopy.distance import geodesic
import folium
# -------------------------------
# CONFIG
# -------------------------------
JSON_PATH = "json/E5N40.json" # chemin vers ton JSON
OUT_HTML = "bases_map.html" # sortie
POINT_RADIUS = 5
HORIZONTAL_STEP = 11 # toutes les 11 bases, on change de ligne
# -------------------------------
# Lire JSON des bases
# -------------------------------
with open(JSON_PATH, "r", encoding="utf-8") as f:
bases = json.load(f)
if not bases:
raise SystemExit("❌ Le JSON ne contient aucune base.")
# -------------------------------
# Extraire les coordonnées
# -------------------------------
geo_centers = [tuple(b["center"]) for b in bases]
# -------------------------------
# Créer la carte centrée
# -------------------------------
latitudes = [c[0] for c in geo_centers]
longitudes = [c[1] for c in geo_centers]
map_center = (sum(latitudes) / len(latitudes), sum(longitudes) / len(longitudes))
m = folium.Map(location=map_center, zoom_start=7, tiles="OpenStreetMap")
# -------------------------------
# Ajouter les points
# -------------------------------
for b in bases:
lat, lon = b["center"]
folium.CircleMarker(
location=(lat, lon),
radius=POINT_RADIUS,
color="red",
fill=True,
fill_opacity=0.8,
popup=f"{b['key']}<br>{b.get('name', '')}",
).add_to(m)
# -------------------------------
# Tracer segments horizontaux et verticaux
# -------------------------------
def midpoint(a, b):
return ((a[0] + b[0]) / 2.0, (a[1] + b[1]) / 2.0)
n = len(bases)
for i in range(n):
lat1, lon1 = bases[i]["center"]
# base voisine sur la même ligne (droite)
if (i + 1) < n and ((i + 1) % HORIZONTAL_STEP) != 0:
lat2, lon2 = bases[i + 1]["center"]
dist_km = geodesic((lat1, lon1), (lat2, lon2)).kilometers
folium.PolyLine(
locations=[(lat1, lon1), (lat2, lon2)],
color="blue",
weight=2,
opacity=0.7,
popup=f"{bases[i]['name']} → {bases[i+1]['name']} : {dist_km:.3f} km"
).add_to(m)
mid = midpoint((lat1, lon1), (lat2, lon2))
folium.map.Marker(
location=mid,
icon=folium.DivIcon(
html=f"""<div style="font-size:10px;background:white;padding:1px;border-radius:3px">
{dist_km:.2f} km</div>"""
)
).add_to(m)
# base voisine sur l'axe vertical (en dessous)
if (i + HORIZONTAL_STEP) < n:
latv, lonv = bases[i + HORIZONTAL_STEP]["center"]
dist_km_v = geodesic((lat1, lon1), (latv, lonv)).kilometers
folium.PolyLine(
locations=[(lat1, lon1), (latv, lonv)],
color="green",
weight=2,
opacity=0.7,
popup=f"{bases[i]['name']} ↓ {bases[i+HORIZONTAL_STEP]['name']} : {dist_km_v:.3f} km"
).add_to(m)
midv = midpoint((lat1, lon1), (latv, lonv))
folium.map.Marker(
location=midv,
icon=folium.DivIcon(
html=f"""<div style="font-size:10px;background:white;padding:1px;border-radius:3px">
{dist_km_v:.2f} km</div>"""
)
).add_to(m)
# -------------------------------
# Sauvegarder la carte
# -------------------------------
m.save(OUT_HTML)
print(f"✅ Carte générée : {OUT_HTML}")