refactor: reuse routing and remove unused analysis helpers
This commit is contained in:
@@ -188,74 +188,6 @@ def _build_area_map_by_topology(
|
||||
return area_map, areas, node_coords
|
||||
|
||||
|
||||
def _build_area_node_map(area_map: dict[str, str]) -> dict[str, list[str]]:
|
||||
area_node_map: dict[str, list[str]] = {}
|
||||
for node_id, area_id in area_map.items():
|
||||
area_node_map.setdefault(area_id, []).append(node_id)
|
||||
for area_id in list(area_node_map.keys()):
|
||||
area_node_map[area_id] = sorted(area_node_map[area_id])
|
||||
return area_node_map
|
||||
|
||||
|
||||
def _build_node_visual_payload(
|
||||
area_map: dict[str, str],
|
||||
node_coords: dict[str, dict[str, float]],
|
||||
rows: list[dict[str, Any]],
|
||||
) -> dict[str, Any]:
|
||||
area_leakage_map = _build_area_leakage_map(rows)
|
||||
max_leakage = max(area_leakage_map.values(), default=0.0)
|
||||
features: list[dict[str, Any]] = []
|
||||
for node_id, area_id in area_map.items():
|
||||
coord = node_coords.get(node_id)
|
||||
if not coord:
|
||||
continue
|
||||
leakage_flow = float(area_leakage_map.get(area_id, 0.0))
|
||||
leakage_level = _classify_leakage_level(leakage_flow, max_leakage)
|
||||
features.append(
|
||||
{
|
||||
"type": "Feature",
|
||||
"properties": {
|
||||
"node_id": node_id,
|
||||
"area_id": area_id,
|
||||
"leakage_flow_m3_per_s": leakage_flow,
|
||||
"leakage_level": leakage_level,
|
||||
},
|
||||
"geometry": {
|
||||
"type": "Point",
|
||||
"coordinates": [float(coord["x"]), float(coord["y"])],
|
||||
},
|
||||
}
|
||||
)
|
||||
return {"type": "FeatureCollection", "features": features}
|
||||
|
||||
|
||||
def _build_area_leakage_map(rows: list[dict[str, Any]]) -> dict[str, float]:
|
||||
area_leakage_map: dict[str, float] = {}
|
||||
for row in rows:
|
||||
area_id = str(row.get("Area", "")).strip()
|
||||
if not area_id:
|
||||
continue
|
||||
area_leakage_map[area_id] = float(row.get("LeakageFlow_m3_per_s", 0.0))
|
||||
return area_leakage_map
|
||||
|
||||
|
||||
def _classify_leakage_level(leakage_flow: float, max_leakage: float) -> str:
|
||||
if max_leakage <= 0:
|
||||
return "normal"
|
||||
ratio = leakage_flow / max_leakage
|
||||
if ratio >= 0.75:
|
||||
return "high"
|
||||
if ratio >= 0.4:
|
||||
return "medium"
|
||||
if ratio > 0:
|
||||
return "low"
|
||||
return "normal"
|
||||
|
||||
|
||||
def _build_drawing_payload(node_visual_payload: dict[str, Any]) -> dict[str, Any]:
|
||||
return node_visual_payload
|
||||
|
||||
|
||||
def _build_observed_pressure_from_scada(
|
||||
network: str,
|
||||
sensor_nodes: list[str],
|
||||
|
||||
Reference in New Issue
Block a user