1、如果数据处理的很不好,好多阀门点没有在管线上,碍于数据处理工作量大,于是用缓冲区的方式做了个容差范围。
st_intersects(st_buffer('0101000000D34D62709FC66841FA7E6A9C7C4E5241',0.0001),geom)
但是发现这个做法比原来直接判断点是否在线上,效率慢了50倍左右,所以直接放弃,只能处理数据。
ST_intersects(a.geom,b.geom)
2、查找上游阀门的逻辑,是在找到爆管点影响的所有阀门基础上,再用pgRouting的pgr_dijkstraCost函数,判断消耗实现的。
SELECT count(*) FROM pgr_dijkstraCost('select gid as id, source, target, length as cost, reverse_cost from zy',m_cost, ARRAY[v_startSource,v_startTarget], true) where agg_cost >= 9999999 into m_cost_value;
实测这个函数的执行效率太低,如果我查到10个周围阀门,判断从这个阀门到爆管点的消耗(以60w+条管网算),每个遍历平均近3秒,整个查询耗时将近30+秒。
考虑再三,决定换一个思路:在做广度遍历查询管段source/target的时候,带上方向消耗(如果接点为source,则消耗大于等于9999999,为逆向,找到管段头;如果接点为target,则消耗小于9999999,为逆向,找到管段头)
case when zy1.source = any(v_up_where) then 1
when zy1.target = any(v_up_where) then 2
else 0 end as isuptap