这个算法算是被摒弃了,但是很多自己思考过后留下的成果,虽然不用了,留着做记录。
算法目的是为了发生爆管后找到总阀门,这里分了几个步骤:
1、找到爆管点所在管段
2、通过遍历找到爆管点所有影响的阀门
3、找到影响阀门中的上游阀门
4、在上游阀门中进行遍历,看相互关系,与其他阀门都联通的则视为总阀门
5、找出阀门中的总阀门
考虑了一下,所有与爆点相连的上游阀门其实在爆管发生后都需要关闭。所以算法中4、5步,不需要了。
-- Function: test_getpoint7(character varying, double precision, double precision)
-- DROP FUNCTION test_getpoint7(character varying, double precision, double precision);
CREATE OR REPLACE FUNCTION test_getpoint7(
IN tbl character varying,
IN startx double precision,
IN starty double precision)
RETURNS TABLE(v_gid integer, v_res geometry, v_type integer) AS
$BODY$
declare
v_startLine geometry;--离起点最近的线
v_startTarget integer;--距离起点最近线的终点
v_startSource integer;
v_statpoint geometry;--在v_startLine上距离起点最近的点
v_endpoint geometry;--在v_endLine上距离终点最近的点
v_up_source integer;--游标,记录是否有记录
v_up_idx integer;--记录遍历到多少层级