Posted by Yancho on Thu 24 Apr 08:49 (modification of post by view diff)
report spam | download | new post
- CREATE OR REPLACE FUNCTION give_nearest_aid_station(accidentloc TEXT, type_of_station TEXT)
- RETURNS SETOF geoms AS
- $_$
- DECLARE
- var_target TEXT;
- var_target_geom GEOMETRY;
- var_target_gid INTEGER;
- var_source_geom GEOMETRY;
- var_select TEXT;
- this_station FLOAT;
- this_route_dist FLOAT;
- rec_nearest_station RECORD;
- distances RECORD;
- var_id INTEGER;
- var_row_count INTEGER;
- var_num_geoms INTEGER;
- var_i INTEGER;
- var_new_line GEOMETRY;
- var_first_linestring GEOMETRY;
- final_geom GEOMETRY;
- var_gid_where_source GEOMETRY;
- var_dist FLOAT;
- var_small_dist FLOAT;
- var_near_linestring INTEGER;
- var_j INTEGER;
- var_params_check_alt TEXT;
- var_text_shootingstar TEXT;
- var_params_shootingstar TEXT;
- rec_shooting_star RECORD;
- rec_path_result GEOMS;
- var_function_result_query TEXT;
- var_text_select TEXT;
- BEGIN
- var_target := 'POINT(' || accidentloc || ')';
- var_target_geom := pointfromtext ( var_target );
- SELECT INTO var_target_gid gid
- FROM streets
- WHERE
- (
- (the_geom && expand ( var_target_geom , 100 )) AND
- distance ( the_geom, var_target_geom ) < 100
- )
- ORDER BY distance ( the_geom, var_target_geom )
- LIMIT 1;
- raise notice ' station is : % , geom : %', type_of_station, astext(var_target_geom);
- -- Making an Expansion of 20 KMs
- var_select := 'SELECT the_geom , gid FROM ' || type_of_station || ' WHERE
- the_geom @ Expand( ' || quote_literal(var_target_geom) || ' ::geometry , 20000::float)';
- RAISE NOTICE 'The QUERY is %', var_select;
- SELECT 'inf'::FLOAT AS dist, NULL::TEXT AS gid INTO rec_nearest_station;
- FOR distances IN
- EXECUTE var_select
- LOOP
- SELECT INTO this_station
- MAX ( LENGTH(the_geom) )
- FROM shootingstar_sp_where_new
- (
- 'streets',
- distances.gid,
- var_target_gid,
- 5000,
- 'length',
- TRUE,
- TRUE,
- 'WHERE accident_access = true'
- );
- IF this_station < rec_nearest_station.dist THEN
- rec_nearest_station.dist := this_station;
- rec_nearest_station.gid := distances.gid;
- END IF;
- END LOOP;
- RAISE NOTICE 'Nearest Hospital has a GID of : % and is % meters far from the accident',
- rec_nearest_station.gid , rec_nearest_station.dist;
- var_text_shootingstar :=
- $qt$
- SELECT gid, the_geom, id
- FROM shootingstar_sp_where_new
- (
- 'streets',
- $qt$ || rec_nearest_station.gid || $qt$,
- $qt$ || var_target_gid || $qt$,
- 5000,
- 'length',
- TRUE,
- TRUE,
- 'WHERE accident_access = true'
- )
- $qt$;
- RAISE NOTICE 'SQL Query : %',var_text_shootingstar;
- var_id := 1;
- SELECT INTO var_source_geom the_geom FROM hospitals WHERE gid = rec_nearest_station.gid;
- FOR rec_shooting_star IN
- EXECUTE var_text_shootingstar
- LOOP
- IF var_id = 1 THEN
- SELECT INTO final_geom the_geom FROM STREETS
- WHERE
- touches(the_geom, rec_shooting_star.the_geom) AND
- distance ( the_geom, var_source_geom ) < 100
- ORDER BY
- distance ( the_geom, var_source_geom )
- LIMIT 1;
- RAISE NOTICE '------------------------- Starting Part Changing ------------------';
- RAISE NOTICE 'Geometry type working on is : %, and as text : %',geometrytype(rec_shooting_star.the_geom), astext(rec_shooting_star.the_geom);
- var_num_geoms := NumGeometries(rec_shooting_star.the_geom);
- RAISE NOTICE 'Total Number of Geometries : %',var_num_geoms;
- var_dist := -1000.00;
- var_small_dist := 40000.00;
- FOR var_j IN 1 .. var_num_geoms LOOP
- var_dist := line_locate_point(geometryN(final_geom, var_j), var_source_geom);
- IF var_dist <= var_small_dist THEN
- var_small_dist := var_dist;
- var_near_linestring := var_j;
- RAISE NOTICE 'Found nearer LINESTRING ==========, Dist : %, And Geom num : %', var_small_dist, var_near_linestring;
- END IF;
- END LOOP;
- var_new_line := line_substring (
- (geometryN (final_geom, var_near_linestring)),
- line_locate_point ( (geometryN (final_geom, var_near_linestring)), var_source_geom ),
- 1
- );
- RAISE NOTICE 'Point to end of Target is : %', astext(var_new_line);
- final_geom := GEOMUNION (var_new_line , rec_shooting_star.the_geom) ;
- END IF;
- IF var_id = 2 THEN
- --RETURN NEXT rec_path_result;
- rec_path_result.id := rec_shooting_star.id;
- --RAISE NOTICE 'Working on ID : % <><> And stored as %',rec_shooting_star.id, rec_path_result.id;
- rec_path_result.gid := rec_shooting_star.gid;
- var_gid_where_source := GEOMUNION ( final_geom , var_new_line );
- rec_path_result.the_geom := GEOMUNION ( var_gid_where_source, rec_shooting_star.the_geom );
- --RETURN NEXT rec_path_result;
- ELSE
- RAISE NOTICE 'Returning result ID : %',rec_path_result.id;
- IF var_id >= 2 THEN RETURN NEXT rec_path_result; END IF;
- rec_path_result.id := rec_shooting_star.id;
- RAISE NOTICE 'Working on ID : % <><> And stored as %',rec_shooting_star.id, rec_path_result.id;
- rec_path_result.gid := rec_shooting_star.gid;
- rec_path_result.the_geom := rec_shooting_star.the_geom;
- END IF;
- var_id := var_id + 1;
- END LOOP;
- RAISE NOTICE 'Modifying the last result, with ID : % and having Gid : %', rec_shooting_star.id, rec_shooting_star.gid ;
- RAISE NOTICE 'Geometry type working on is : %, and as text : %',geometrytype(rec_shooting_star.the_geom), astext(rec_shooting_star.the_geom);
- var_num_geoms := NumGeometries(rec_shooting_star.the_geom);
- RAISE NOTICE 'Total Number of Geometries : %',var_num_geoms;
- var_dist := -1000.00;
- var_small_dist := 40000.00;
- FOR var_j IN 1 .. var_num_geoms LOOP
- var_dist := line_locate_point(geometryN(rec_shooting_star.the_geom, var_j), var_target_geom);
- IF var_dist <= var_small_dist THEN
- var_small_dist := var_dist;
- var_near_linestring := var_j;
- RAISE NOTICE 'Found nearer LINESTRING ==========, Dist : %, And Geom num : %', var_small_dist, var_near_linestring;
- END IF;
- END LOOP;
- RAISE NOTICE 'Nearest Linestring is : % Point is : %', var_near_linestring, astext(var_target_geom);
- var_new_line := line_substring(
- (geometryN (rec_shooting_star.the_geom, var_near_linestring)),
- 0,
- var_small_dist
- );
- rec_path_result.gid := rec_shooting_star.gid;
- RAISE NOTICE 'New line is : %, Text as : %', var_new_line, astext(var_new_line);
- final_geom := Multi ( var_new_line );
- RAISE NOTICE 'The last line is : %',astext(final_geom);
- rec_path_result.the_geom := final_geom;
- RETURN NEXT rec_path_result;
- RETURN;
- END;
- $_$
- LANGUAGE 'plpgsql' VOLATILE;
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.