diff --git a/api/__init__.py b/api/__init__.py index 5bf55a3..8f0ba39 100644 --- a/api/__init__.py +++ b/api/__init__.py @@ -117,7 +117,7 @@ from .s23_options_util import OPTION_V3_QUALITY_UNITS_HRS, OPTION_V3_QUALITY_UNI from .s23_options_util import get_option_v3_schema, get_option_v3 from .batch_api import set_option_v3_ex -from .s24_coordinates import get_node_coord +from .s24_coordinates import get_node_coord, get_nodes_in_extent, get_links_in_extent from .s25_vertices import get_vertex_schema, get_vertex, set_vertex, add_vertex, delete_vertex from .s25_vertices import get_all_vertex_links, get_all_vertices diff --git a/api/s24_coordinates.py b/api/s24_coordinates.py index 6b9e4ac..ba0fa21 100644 --- a/api/s24_coordinates.py +++ b/api/s24_coordinates.py @@ -1,5 +1,5 @@ from .database import * - +from .s0_base import get_link_nodes def sql_update_coord(node: str, x: float, y: float) -> str: coord = f"st_geomfromtext('point({x} {y})')" @@ -29,6 +29,7 @@ def get_node_coord(name: str, node: str) -> dict[str, float]: # DingZQ 2025-01-03, get nodes in extent # return node id list +# node_id:junction:x:y def get_nodes_in_extent(name: str, x1: float, y1: float, x2: float, y2: float) -> list[str]: nodes = [] objs = read_all(name, 'select node, st_astext(coord) as coord_geom from coordinates') @@ -38,9 +39,28 @@ def get_nodes_in_extent(name: str, x1: float, y1: float, x2: float, y2: float) - x = coord['x'] y = coord['y'] if x1 <= x <= x2 and y1 <= y <= y2: - nodes.append(node_id) + nodes.append(f"{node_id}:{x}:{y}") return nodes +# DingZQ 2025-01-03, get links in extent +# return link id list +# link_id:pipe:node_id1:node_id2 +def get_links_in_extent(name: str, x1: float, y1: float, x2: float, y2: float) -> list[str]: + node_ids = set([s.split(':')[0] for s in get_nodes_in_extent(name, x1, y1, x2, y2)]) + + all_link_ids = [] + with conn[name].cursor(row_factory=dict_row) as cur: + cur.execute(f"select id from pipes where order by id") + for record in cur: + all_link_ids.append(record['id']) + + links = [] + for link_id in all_link_ids: + nodes = get_link_nodes(name, link_id) + if nodes[0] in node_ids and nodes[1] in node_ids: + links.append(f"{link_id}:pipe:{nodes[0]}:{nodes[1]}") + return links + def node_has_coord(name: str, node: str) -> bool: return try_read(name, f"select node from coordinates where node = '{node}'") != None