-- Function: public.connect_cost(integer, integer)
-- DROP FUNCTION public.connect_cost(integer, integer);
CREATE OR REPLACE FUNCTION public.connect_cost(arg_traj integer, arg_window integer)
RETURNS void AS
$BODY$
DECLARE
curr_rec record;
segment_1_rec record;
segment_2_rec record;
rp_1 geometry;
adjust_time double precision;
closest_point_1 geometry;
closest_point_2 geometry;
segment2 geometry;
arg_rel1 integer;
arg_rel2 integer;
firstpoint integer;
prev_id integer;
interpoint geometry;
arg_s integer;
arg_t integer;
arg_s1 integer;
arg_t1 integer;
arg_s2 integer;
arg_t2 integer;
dij_tmp integer;
acceleration_limit integer;
arg_s1_geom geometry;
arg_s2_geom geometry;
arg_t1_geom geometry;
arg_t2_geom geometry;
min_dist double precision;
dist double precision;
dist1 double precision;
dist2 double precision;
arg_speed double precision;
gap double precision;
ad_time timestamp;
prev_rec record;
dij_rec record;
dij_segment geometry;
dij_point geometry;
isolate bool;
wrong_point bool;
iso_int integer;
time_gap integer;
counter integer;
s_time bigint;
e_time bigint;
traj_points integer;
default_gap double precision;
error_radius integer;
arg_day_of_week double precision;
arg_slot double precision;
BEGIN
--initializations
firstpoint:=0;
delete from connect_cost where traj_id=arg_traj;
FOR curr_rec IN Select id FROM candidate where traj_id=arg_traj and candidate_id=1 order by epoch_time asc
LOOP
wrong_point := 'f'; dist :=0.0; dist1 :=0.0; dist2 :=0.0;gap =0.0;counter:=1;
IF firstpoint =0 THEN
prev_id := curr_rec.id;
firstpoint :=1;
ELSE
For segment_1_rec IN Select segment_id,segment,candidate_id,epoch_time FROM candidate where id=prev_id and traj_id=arg_traj and candidate_id<=arg_window and candidate_id>0 order by candidate_id asc
LOOP
For segment_2_rec IN Select segment_id,segment,candidate_id,epoch_time FROM candidate where id=curr_rec.id and traj_id=arg_traj and candidate_id<=arg_window and candidate_id>0 order by candidate_id asc
LOOP
--同segment
IF segment_1_rec.segment_id = segment_2_rec.segment_id THEN
Select source INTO arg_s1
From network_tp
Where id= segment_1_rec.segment_id;
INSERT INTO connect_cost VALUES (arg_traj,prev_id,segment_1_rec.candidate_id,segment_1_rec.segment,curr_rec.id,segment_2_rec.candidate_id,0,segment_1_rec.segment_id);
--交一點
ELSIF segment_1_rec.segment_id != segment_2_rec.segment_id AND ST_Intersects(segment_1_rec.segment,segment_2_rec.segment) THEN
Select source INTO arg_s1
From network_tp
Where id= segment_1_rec.segment_id;
Select source INTO arg_t1
From network_tp
Where id= segment_2_rec.segment_id ;
Select target INTO arg_s2
From network_tp
Where id= segment_1_rec.segment_id;
Select target INTO arg_t2
From network_tp
Where id= segment_2_rec.segment_id ;
IF arg_s1 =arg_t1 or arg_s1 =arg_t2 THEN
INSERT INTO connect_cost VALUES (arg_traj,prev_id,segment_1_rec.candidate_id,segment_1_rec.segment,curr_rec.id,segment_2_rec.candidate_id,0,segment_1_rec.segment_id);
ELSE
INSERT INTO connect_cost VALUES (arg_traj,prev_id,segment_1_rec.candidate_id,segment_1_rec.segment,curr_rec.id,segment_2_rec.candidate_id,0,segment_1_rec.segment_id);
END IF;
--無交點
ELSIF segment_1_rec.segment_id != segment_2_rec.segment_id AND NOT ST_Intersects(segment_1_rec.segment,segment_2_rec.segment)THEN
dist :=0;
--raise notice 'log_sp:%',1;
Select source INTO arg_s1
From network_tp
Where id= segment_1_rec.segment_id;
Select source INTO arg_t1
From network_tp
Where id= segment_2_rec.segment_id ;
Select target INTO arg_s2
From network_tp
Where id= segment_1_rec.segment_id;
Select target INTO arg_t2
From network_tp
Where id= segment_2_rec.segment_id ;
Select the_geom INTO arg_s1_geom
From network_tp_vertices_pgr
Where id= arg_s1;
Select the_geom INTO arg_s2_geom
From network_tp_vertices_pgr
Where id= arg_s2;
Select the_geom INTO arg_t1_geom
From network_tp_vertices_pgr
Where id= arg_t1;
Select the_geom INTO arg_t2_geom
From network_tp_vertices_pgr
Where id= arg_t2;
IF (ST_Distance(arg_s1_geom,arg_t1_geom) <1000
2015年10月30日 星期五
connect_cost
訂閱:
張貼留言 (Atom)
沒有留言:
張貼留言