63 lines
2.2 KiB
Python
63 lines
2.2 KiB
Python
import networkx as nx
|
|
import math
|
|
|
|
def compute_distance(t1, t2):
|
|
"""
|
|
Compute Euclidean distance between two towers in the horizontal plane.
|
|
"""
|
|
dx = t1['position_x'] - t2['position_x']
|
|
dz = t1['position_z'] - t2['position_z']
|
|
return math.sqrt(dx**2 + dz**2)
|
|
|
|
def compute_mst_fiber_paths(towers):
|
|
"""
|
|
Given a list of tower dictionaries, compute a Minimum Spanning Tree (MST)
|
|
and return a list of fiber paths connecting the towers.
|
|
"""
|
|
G = nx.Graph()
|
|
# Add towers as nodes
|
|
for tower in towers:
|
|
G.add_node(tower['id'], **tower)
|
|
|
|
# Add edges: compute pairwise distances
|
|
n = len(towers)
|
|
for i in range(n):
|
|
for j in range(i+1, n):
|
|
d = compute_distance(towers[i], towers[j])
|
|
G.add_edge(towers[i]['id'], towers[j]['id'], weight=d)
|
|
|
|
# Compute MST
|
|
mst = nx.minimum_spanning_tree(G)
|
|
|
|
fiber_paths = []
|
|
for edge in mst.edges(data=True):
|
|
id1, id2, data = edge
|
|
# Find towers corresponding to these IDs
|
|
tower1 = next(t for t in towers if t['id'] == id1)
|
|
tower2 = next(t for t in towers if t['id'] == id2)
|
|
|
|
fiber_paths.append({
|
|
'id': len(fiber_paths) + 1,
|
|
'start_x': tower1['position_x'],
|
|
'start_z': tower1['position_z'],
|
|
'end_x': tower2['position_x'],
|
|
'end_z': tower2['position_z'],
|
|
'mid_x': (tower1['position_x'] + tower2['position_x']) / 2,
|
|
'mid_y': 0.1, # Slightly above the ground
|
|
'mid_z': (tower1['position_z'] + tower2['position_z']) / 2,
|
|
'length': data['weight'],
|
|
# Optionally, compute the angle in degrees if needed:
|
|
'angle': math.degrees(math.atan2(tower2['position_x'] - tower1['position_x'],
|
|
tower2['position_z'] - tower1['position_z'])),
|
|
'status': 'Connected',
|
|
'color': '#4682b4'
|
|
})
|
|
return fiber_paths
|
|
|
|
def compute_network_summary(towers, fiber_paths, wifi_hotspots):
|
|
total_fiber = sum(fiber['length'] for fiber in fiber_paths)
|
|
return {
|
|
'num_towers': len(towers),
|
|
'total_fiber_length': total_fiber,
|
|
'num_wifi': len(wifi_hotspots),
|
|
} |