From 0ac4a882950722dc515bf1fa791c171ff68e043c Mon Sep 17 00:00:00 2001 From: "WQY\\qiong" Date: Sat, 29 Apr 2023 10:09:12 +0800 Subject: [PATCH] Replace coordinate with postgis geometry --- api/s24_coordinates.py | 28 +++++++++++++++++++++------- api/s2_junctions.py | 13 ++++++------- api/s3_reservoirs.py | 13 ++++++------- api/s4_tanks.py | 13 ++++++------- 4 files changed, 39 insertions(+), 28 deletions(-) diff --git a/api/s24_coordinates.py b/api/s24_coordinates.py index 03952af..9e73651 100644 --- a/api/s24_coordinates.py +++ b/api/s24_coordinates.py @@ -1,17 +1,31 @@ from .database import * +def sql_update_coord(node: str, x: float, y: float) -> str: + coord = f"st_geomfromtext('point({x} {y})')" + return f"update coordinates set coord = {coord} where node = '{node}';" + + +def sql_insert_coord(node: str, x: float, y: float) -> str: + coord = f"st_geomfromtext('point({x} {y})')" + return f"insert into coordinates (node, coord) values ('{node}', {coord});" + + +def sql_delete_coord(node: str) -> str: + return f"delete from coordinates where node = '{node}';" + + def _to_client_point(coord: str) -> dict[str, float]: - xy = coord.removeprefix('(').removesuffix(')').split(',') + xy = coord.lower().removeprefix('point(').removesuffix(')').split(' ') return { 'x': float(xy[0]), 'y': float(xy[1]) } -def get_node_coord(name: str, id: str) -> dict[str, float]: - row = try_read(name, f"select * from coordinates where node = '{id}'") +def get_node_coord(name: str, node: str) -> dict[str, float]: + row = try_read(name, f"select st_astext(coord) as coord_geom from coordinates where node = '{node}'") if row == None: - write(name, f"insert into coordinates (node, coord) values ('{id}', '(0.0,0.0)');") + write(name, sql_insert_coord(node, 0.0, 0.0)) return {'x': 0.0, 'y': 0.0} - return _to_client_point(row['coord']) + return _to_client_point(row['coord_geom']) #-------------------------------------------------------------- @@ -30,10 +44,10 @@ def inp_in_coord(line: str) -> str: def inp_out_coord(name: str) -> list[str]: lines = [] - objs = read_all(name, 'select * from coordinates') + objs = read_all(name, 'select node, st_astext(coord) as coord_geom from coordinates') for obj in objs: node = obj['node'] - coord = _to_client_point(obj['coord']) + coord = _to_client_point(obj['coord_geom']) x = coord['x'] y = coord['y'] lines.append(f'{node} {x} {y}') diff --git a/api/s2_junctions.py b/api/s2_junctions.py index cbe3c1b..a09f484 100644 --- a/api/s2_junctions.py +++ b/api/s2_junctions.py @@ -35,7 +35,6 @@ class Junction(object): self.f_type = f"'{self.type}'" self.f_id = f"'{self.id}'" - self.f_coord = f"'({self.x}, {self.y})'" self.f_elevation = self.elevation def as_dict(self) -> dict[str, Any]: @@ -57,9 +56,9 @@ def set_junction_cmd(name: str, cs: ChangeSet) -> DbChangeSet: new = Junction(raw_new) redo_sql = f"update junctions set elevation = {new.f_elevation} where id = {new.f_id};" - redo_sql += f"\nupdate coordinates set coord = {new.f_coord} where node = {new.f_id};" + redo_sql += f"\n{sql_update_coord(new.id, new.x, new.y)}" - undo_sql = f"update coordinates set coord = {old.f_coord} where node = {old.f_id};" + undo_sql = sql_update_coord(old.id, old.x, old.y) undo_sql += f"\nupdate junctions set elevation = {old.f_elevation} where id = {old.f_id};" redo_cs = g_update_prefix | new.as_dict() @@ -81,9 +80,9 @@ def add_junction_cmd(name: str, cs: ChangeSet) -> DbChangeSet: redo_sql = f"insert into _node (id, type) values ({new.f_id}, {new.f_type});" redo_sql += f"\ninsert into junctions (id, elevation) values ({new.f_id}, {new.f_elevation});" - redo_sql += f"\ninsert into coordinates (node, coord) values ({new.f_id}, {new.f_coord});" + redo_sql += f"\n{sql_insert_coord(new.id, new.x, new.y)}" - undo_sql = f"delete from coordinates where node = {new.f_id};" + undo_sql = sql_delete_coord(new.id) undo_sql += f"\ndelete from junctions where id = {new.f_id};" undo_sql += f"\ndelete from _node where id = {new.f_id};" @@ -104,13 +103,13 @@ def add_junction(name: str, cs: ChangeSet) -> ChangeSet: def delete_junction_cmd(name: str, cs: ChangeSet) -> DbChangeSet: old = Junction(get_junction(name, cs.operations[0]['id'])) - redo_sql = f"delete from coordinates where node = {old.f_id};" + redo_sql = sql_delete_coord(old.id) redo_sql += f"\ndelete from junctions where id = {old.f_id};" redo_sql += f"\ndelete from _node where id = {old.f_id};" undo_sql = f"insert into _node (id, type) values ({old.f_id}, {old.f_type});" undo_sql += f"\ninsert into junctions (id, elevation) values ({old.f_id}, {old.f_elevation});" - undo_sql += f"\ninsert into coordinates (node, coord) values ({old.f_id}, {old.f_coord});" + undo_sql += f"\n{sql_insert_coord(old.id, old.x, old.y)}" redo_cs = g_delete_prefix | old.as_id_dict() undo_cs = g_add_prefix | old.as_dict() diff --git a/api/s3_reservoirs.py b/api/s3_reservoirs.py index d3a3d7f..bac215d 100644 --- a/api/s3_reservoirs.py +++ b/api/s3_reservoirs.py @@ -38,7 +38,6 @@ class Reservoir(object): self.f_type = f"'{self.type}'" self.f_id = f"'{self.id}'" - self.f_coord = f"'({self.x}, {self.y})'" self.f_head = self.head self.f_pattern = f"'{self.pattern}'" if self.pattern != None else 'null' @@ -61,9 +60,9 @@ def set_reservoir_cmd(name: str, cs: ChangeSet) -> DbChangeSet: new = Reservoir(raw_new) redo_sql = f"update reservoirs set head = {new.f_head}, pattern = {new.f_pattern} where id = {new.f_id};" - redo_sql += f"\nupdate coordinates set coord = {new.f_coord} where node = {new.f_id};" + redo_sql += f"\n{sql_update_coord(new.id, new.x, new.y)}" - undo_sql = f"update coordinates set coord = {old.f_coord} where node = {old.f_id};" + undo_sql = sql_update_coord(old.id, old.x, old.y) undo_sql += f"\nupdate reservoirs set head = {old.f_head}, pattern = {old.f_pattern} where id = {old.f_id};" redo_cs = g_update_prefix | new.as_dict() @@ -85,9 +84,9 @@ def add_reservoir_cmd(name: str, cs: ChangeSet) -> DbChangeSet: redo_sql = f"insert into _node (id, type) values ({new.f_id}, {new.f_type});" redo_sql += f"\ninsert into reservoirs (id, head, pattern) values ({new.f_id}, {new.f_head}, {new.f_pattern});" - redo_sql += f"\ninsert into coordinates (node, coord) values ({new.f_id}, {new.f_coord});" + redo_sql += f"\n{sql_insert_coord(new.id, new.x, new.y)}" - undo_sql = f"delete from coordinates where node = {new.f_id};" + undo_sql = sql_delete_coord(new.id) undo_sql += f"\ndelete from reservoirs where id = {new.f_id};" undo_sql += f"\ndelete from _node where id = {new.f_id};" @@ -108,13 +107,13 @@ def add_reservoir(name: str, cs: ChangeSet) -> ChangeSet: def delete_reservoir_cmd(name: str, cs: ChangeSet) -> DbChangeSet: old = Reservoir(get_reservoir(name, cs.operations[0]['id'])) - redo_sql = f"delete from coordinates where node = {old.f_id};" + redo_sql = sql_delete_coord(old.id) redo_sql += f"\ndelete from reservoirs where id = {old.f_id};" redo_sql += f"\ndelete from _node where id = {old.f_id};" undo_sql = f"insert into _node (id, type) values ({old.f_id}, {old.f_type});" undo_sql += f"\ninsert into reservoirs (id, head, pattern) values ({old.f_id}, {old.f_head}, {old.f_pattern});" - undo_sql += f"\ninsert into coordinates (node, coord) values ({old.f_id}, {old.f_coord});" + undo_sql += f"\n{sql_insert_coord(old.id, old.x, old.y)}" redo_cs = g_delete_prefix | old.as_id_dict() undo_cs = g_add_prefix | old.as_dict() diff --git a/api/s4_tanks.py b/api/s4_tanks.py index 45341fe..98ce2ea 100644 --- a/api/s4_tanks.py +++ b/api/s4_tanks.py @@ -60,7 +60,6 @@ class Tank(object): self.f_type = f"'{self.type}'" self.f_id = f"'{self.id}'" - self.f_coord = f"'({self.x}, {self.y})'" self.f_elevation = self.elevation self.f_init_level = self.init_level self.f_min_level = self.min_level @@ -89,9 +88,9 @@ def set_tank_cmd(name: str, cs: ChangeSet) -> DbChangeSet: new = Tank(raw_new) redo_sql = f"update tanks set elevation = {new.f_elevation}, init_level = {new.f_init_level}, min_level = {new.f_min_level}, max_level = {new.f_max_level}, diameter = {new.f_diameter}, min_vol = {new.f_min_vol}, vol_curve = {new.f_vol_curve}, overflow = {new.f_overflow} where id = {new.f_id};" - redo_sql += f"\nupdate coordinates set coord = {new.f_coord} where node = {new.f_id};" + redo_sql += f"\n{sql_update_coord(new.id, new.x, new.y)}" - undo_sql = f"update coordinates set coord = {old.f_coord} where node = {old.f_id};" + undo_sql = sql_update_coord(old.id, old.x, old.y) undo_sql += f"\nupdate tanks set elevation = {old.f_elevation}, init_level = {old.f_init_level}, min_level = {old.f_min_level}, max_level = {old.f_max_level}, diameter = {old.f_diameter}, min_vol = {old.f_min_vol}, vol_curve = {old.f_vol_curve}, overflow = {old.f_overflow} where id = {old.f_id};" redo_cs = g_update_prefix | new.as_dict() @@ -113,9 +112,9 @@ def add_tank_cmd(name: str, cs: ChangeSet) -> DbChangeSet: redo_sql = f"insert into _node (id, type) values ({new.f_id}, {new.f_type});" redo_sql += f"\ninsert into tanks (id, elevation, init_level, min_level, max_level, diameter, min_vol, vol_curve, overflow) values ({new.f_id}, {new.f_elevation}, {new.f_init_level}, {new.f_min_level}, {new.f_max_level}, {new.f_diameter}, {new.f_min_vol}, {new.f_vol_curve}, {new.f_overflow});" - redo_sql += f"\ninsert into coordinates (node, coord) values ({new.f_id}, {new.f_coord});" + redo_sql += f"\n{sql_insert_coord(new.id, new.x, new.y)}" - undo_sql = f"delete from coordinates where node = {new.f_id};" + undo_sql = sql_delete_coord(new.id) undo_sql += f"\ndelete from tanks where id = {new.f_id};" undo_sql += f"\ndelete from _node where id = {new.f_id};" @@ -136,13 +135,13 @@ def add_tank(name: str, cs: ChangeSet) -> ChangeSet: def delete_tank_cmd(name: str, cs: ChangeSet) -> DbChangeSet: old = Tank(get_tank(name, cs.operations[0]['id'])) - redo_sql = f"delete from coordinates where node = {old.f_id};" + redo_sql = sql_delete_coord(old.id) redo_sql += f"\ndelete from tanks where id = {old.f_id};" redo_sql += f"\ndelete from _node where id = {old.f_id};" undo_sql = f"insert into _node (id, type) values ({old.f_id}, {old.f_type});" undo_sql += f"\ninsert into tanks (id, elevation, init_level, min_level, max_level, diameter, min_vol, vol_curve, overflow) values ({old.f_id}, {old.f_elevation}, {old.f_init_level}, {old.f_min_level}, {old.f_max_level}, {old.f_diameter}, {old.f_min_vol}, {old.f_vol_curve}, {old.f_overflow});" - undo_sql += f"\ninsert into coordinates (node, coord) values ({old.f_id}, {old.f_coord});" + undo_sql += f"\n{sql_insert_coord(old.id, old.x, old.y)}" redo_cs = g_delete_prefix | old.as_id_dict() undo_cs = g_add_prefix | old.as_dict()