Posted by Yancho on Thu 31 Jan 19:53
report abuse | download | new post
- -- Function: shootingstar_sp_where(character varying, integer, integer, double precision, character varying, boolean, boolean)
- -- Edited shootingstar_sp() function prepared by pgRouting
- -- DROP FUNCTION shootingstar_sp_where(character varying, integer, integer, double precision, character varying, boolean, boolean);
- CREATE OR REPLACE FUNCTION shootingstar_sp_where(character varying, integer, integer, double precision, character varying, BOOLEAN, BOOLEAN)
- RETURNS SETOF geoms AS $_$
- DECLARE
- geom_table ALIAS FOR $1;
- sourceid ALIAS FOR $2;
- targetid ALIAS FOR $3;
- delta ALIAS FOR $4;
- cost_column ALIAS FOR $5;
- dir ALIAS FOR $6;
- rc ALIAS FOR $7;
- rec record;
- r record;
- path_result record;
- v_id integer;
- e_id integer;
- geom geoms;
- srid integer;
- source_x float8;
- source_y float8;
- target_x float8;
- target_y float8;
- ll_x float8;
- ll_y float8;
- ur_x float8;
- ur_y float8;
- query text;
- id integer;
- BEGIN
- id :=0;
- FOR rec IN EXECUTE
- 'select srid(the_geom) from ' ||
- quote_ident(geom_table) || ' limit 1'
- LOOP
- END LOOP;
- srid := rec.srid;
- FOR rec IN EXECUTE
- 'select x(startpoint(the_geom)) as source_x from ' ||
- quote_ident(geom_table) || ' where gid = '||sourceid
- LOOP
- END LOOP;
- source_x := rec.source_x;
- FOR rec IN EXECUTE
- 'select y(startpoint(the_geom)) as source_y from ' ||
- quote_ident(geom_table) || ' where gid = ' ||sourceid
- LOOP
- END LOOP;
- source_y := rec.source_y;
- FOR rec IN EXECUTE
- 'select x(startpoint(the_geom)) as target_x from ' ||
- quote_ident(geom_table) || ' where gid = ' ||targetid
- LOOP
- END LOOP;
- target_x := rec.target_x;
- FOR rec IN EXECUTE
- 'select y(startpoint(the_geom)) as target_y from ' ||
- quote_ident(geom_table) || ' where gid = ' ||targetid
- LOOP
- END LOOP;
- target_y := rec.target_y;
- FOR rec IN EXECUTE 'SELECT CASE WHEN '||source_x||'<'||target_x||
- ' THEN '||source_x||' ELSE '||target_x||
- ' END as ll_x, CASE WHEN '||source_x||'>'||target_x||
- ' THEN '||source_x||' ELSE '||target_x||' END as ur_x'
- LOOP
- END LOOP;
- ll_x := rec.ll_x;
- ur_x := rec.ur_x;
- FOR rec IN EXECUTE 'SELECT CASE WHEN '||source_y||'<'||
- target_y||' THEN '||source_y||' ELSE '||
- target_y||' END as ll_y, CASE WHEN '||
- source_y||'>'||target_y||' THEN '||
- source_y||' ELSE '||target_y||' END as ur_y'
- LOOP
- END LOOP;
- ll_y := rec.ll_y;
- ur_y := rec.ur_y;
- query := 'SELECT gid,the_geom FROM ' ||
- 'shortest_path_shooting_star(''SELECT gid as id, source::integer, ' ||
- 'target::integer, '||cost_column||'::double precision as cost, ' ||
- 'x1::double precision, y1::double precision, x2::double ' ||
- 'precision, y2::double precision, rule::varchar, ' ||
- 'to_cost::double precision ';
- IF rc THEN query := query || ' , reverse_cost ';
- END IF;
- query := query || 'FROM ' || quote_ident(geom_table) || ' where status = 1 AND setSRID(''''BOX3D('||
- ll_x-delta||' '||ll_y-delta||','||ur_x+delta||' '||
- ur_y+delta||')''''::BOX3D, ' || srid || ') && the_geom'', ' ||
- quote_literal(sourceid) || ' , ' ||
- quote_literal(targetid) || ' , '''||text(dir)||''', '''||text(rc)||''' ),' ||
- quote_ident(geom_table) || ' where edge_id = gid ';
- FOR path_result IN EXECUTE query
- LOOP
- geom.gid := path_result.gid;
- geom.the_geom := path_result.the_geom;
- id := id+1;
- geom.id := id;
- RETURN NEXT geom;
- END LOOP;
- RETURN;
- END;
- $_$
- LANGUAGE 'plpgsql' VOLATILE STRICT;
- ALTER FUNCTION shootingstar_sp(character varying, integer, integer, double precision, character varying, BOOLEAN, BOOLEAN) OWNER TO yancho;
Submit a correction or amendment below (click here to make a fresh posting)
After submitting an amendment, you'll be able to view the differences between the old and new posts easily.