Support to get link on boundary

This commit is contained in:
wqy
2023-07-21 18:40:27 +08:00
parent 4c6e257d1d
commit fb347ba03a
5 changed files with 77 additions and 14 deletions

View File

@@ -138,7 +138,7 @@ from .s31_scada_element import get_scada_element_schema, get_scada_element, set_
from .s31_scada_element import get_all_scada_element_ids, get_all_scada_elements
from .clean_api import clean_scada_element
from .s32_region_util import get_nodes_in_boundary, get_nodes_in_region, calculate_convex_hull, calculate_boundary, inflate_boundary, inflate_region
from .s32_region_util import get_nodes_in_boundary, get_nodes_in_region, get_links_on_region_boundary, calculate_convex_hull, calculate_boundary, inflate_boundary, inflate_region
from .s32_region import get_region_schema, get_region, set_region, add_region, delete_region
from .s33_dma_cal import PARTITION_TYPE_RB, PARTITION_TYPE_KWAY

View File

@@ -46,13 +46,62 @@ def get_nodes_in_boundary(name: str, boundary: list[tuple[float, float]]) -> lis
return nodes
def _get_links_on_boundary(name: str, nodes: list[str]) -> list[str]:
links: list[str] = []
for node in nodes:
node_links = get_node_links(name, node)
for link in node_links:
if link in links:
continue
link_nodes = get_link_nodes(name, link)
if link_nodes[0] in nodes and link_nodes[1] not in nodes:
links.append(link)
elif link_nodes[0] not in nodes and link_nodes[1] in nodes:
links.append(link)
return links
# if region is general or wda => get_nodes_in_boundary
# if region is dma, sa or vd => get stored nodes in table
def get_nodes_in_region(name: str, region_id: str) -> list[str]:
nodes: list[str] = []
row = try_read(name, f"select r_type from region where id = '{region_id}'")
if row == None:
return nodes
r_type = str(row['r_type'])
if r_type == 'DMA' or r_type == 'SA' or r_type == 'VD':
table = ''
if r_type == 'DMA':
table = 'region_dma'
elif r_type == 'SA':
table = 'region_sa'
elif r_type == 'VD':
table = 'region_vd'
if table != '':
row = try_read(name, f"select nodes from {table} where id = '{region_id}'")
if row != None:
nodes = eval(str(row['nodes']))
if nodes == []:
for row in read_all(name, f"select c.node from coordinates as c, region as r where ST_Intersects(c.coord, r.boundary) and r.id = '{region_id}'"):
nodes.append(row['node'])
return nodes
def get_links_on_region_boundary(name: str, region_id: str) -> list[str]:
nodes = get_nodes_in_region(name, region_id)
print(nodes)
return _get_links_on_boundary(name, nodes)
def calculate_convex_hull(name: str, nodes: list[str]) -> list[tuple[float, float]]:
write(name, f'delete from temp_node')
for node in nodes:

9
dev.py
View File

@@ -1,11 +1,10 @@
from tjnetwork import *
p = 'dev'
read_inp(p, './inp/net3.inp', '3')
read_inp(p, f'./inp/net3.inp', '3')
open_project(p)
sass = calculate_service_area(p)
assert len(sass) == 25
print(sass[0])
print(sass[1])
add_region(p, ChangeSet({'id': 'r', 'boundary': [(24.614,13.087), (24.835,11.069), (26.144,10.747), (27.290,11.543), (25.726,12.987), (24.614,13.087)]}))
links = get_links_on_region_boundary(p, 'r')
print(links)

View File

@@ -5680,11 +5680,27 @@ class TestApi:
boundary = calculate_boundary(p, vds[0]['nodes'])
boundary = inflate_boundary(p, boundary)
add_region(p, ChangeSet({'id': 'r', 'boundary': boundary}))
add_region(p, ChangeSet({'id': 'r1', 'boundary': boundary}))
nodes = get_nodes_in_region(p, 'r')
nodes = get_nodes_in_region(p, 'r1')
assert nodes == ['10', '101', '103', '105', '107', '109', '111', '115', '117', '119', '120', '257', '259', '261', '263', 'Lake']
add_district_metering_area(p, ChangeSet({'id': 'r2', 'boundary': boundary, 'nodes': ['10', '101', '103']}))
nodes = get_nodes_in_region(p, 'r2')
assert nodes == ['10', '101', '103']
self.leave(p)
def test_get_links_on_boundary(self):
p = 'get_links_on_boundary'
read_inp(p, f'./inp/net3.inp', '3')
open_project(p)
add_region(p, ChangeSet({'id': 'r', 'boundary': [(24.614,13.087), (24.835,11.069), (26.144,10.747), (27.290,11.543), (25.726,12.987), (24.614,13.087)]}))
links = get_links_on_region_boundary(p, 'r')
assert links == ['183', '185', '229', '313', '315']
self.leave(p)

View File

@@ -984,16 +984,15 @@ def get_all_scada_elements(name: str) -> list[dict[str, Any]]:
# general_region 32
############################################################
# pure geometry function, test point is in polygon
def get_nodes_in_boundary(name: str, boundary: list[tuple[float, float]]) -> list[str]:
return api.get_nodes_in_boundary(name, boundary)
# if region is general or wda => get_nodes_in_boundary
# if region is dma, sa or vd => get stored nodes in table
# TODO: more test
def get_nodes_in_region(name: str, region_id: str) -> list[str]:
return api.get_nodes_in_region(name, region_id)
def get_links_on_region_boundary(name: str, region_id: str) -> list[str]:
return api.get_links_on_region_boundary(name, region_id)
def calculate_convex_hull(name: str, nodes: list[str]) -> list[tuple[float, float]]:
return api.calculate_convex_hull(name, nodes)