· 8 years ago · May 27, 2018, 12:20 PM
1CREATE OR REPLACE FUNCTION g_proximity_range(roads_table character varying, start_point character varying, tolerance double precision, range double precision, VARIADIC arr character varying[])
2 RETURNS integer AS
3$BODY$
4DECLARE
5 node_r record;
6 lid_new integer;
7 start_node integer;
8 ftitle varchar(256);
9 ftxt varchar(256);
10 title_in varchar := arr[1];
11 descr_in varchar := arr[2];
12BEGIN
13
14 -- Проверка Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ñ Ñоздаваемого ÑлоÑ
15 IF NOT check_ftitle(title_in) THEN
16 title_in := NULL;
17 END IF;
18
19 -- Формирование Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ñ Ð¸ опиÑÐ°Ð½Ð¸Ñ Ñоздаваемого ÑлоÑ
20 ftitle := COALESCE(title_in, 'g_proximity_range [start='||start_point||'] [range='||range||']');
21 ftxt := 'g_proximity_range('''||roads_table||''', '''||start_point||''', '||tolerance||', '||range||', '||COALESCE(''''||title_in||'''', 'NULL')||', '||COALESCE(''''||descr_in||'''', 'NULL')||')';
22
23 -- Создание ÑлоÑ
24 lid_new := create_glayer(ftitle, COALESCE(descr_in, ftxt), ftxt);
25
26 -- ПоиÑк ближайшего Ñтартового узла
27 start_node := find_nearest_node_within_distance(start_point, tolerance, roads_table);
28 IF start_node IS NULL THEN
29 RETURN -1;
30 END IF;
31
32 DROP TABLE IF EXISTS routes_tmp;
33 CREATE TEMPORARY TABLE routes_tmp(route geometry);
34 FOR node_r IN SELECT * FROM driving_distance('SELECT gid AS id, source AS source, target AS target, length AS cost FROM '||roads_table, start_node, range, false, false) LOOP
35 INSERT INTO routes_tmp (route) SELECT ST_Collect(the_geom) FROM dijkstra_sp(roads_table, start_node, node_r.vertex_id);
36 END LOOP;
37
38 INSERT INTO g_lgeom(lid, geom) SELECT lid_new, ST_Union(route) FROM routes_tmp;
39
40 RETURN lid_new;
41END
42$BODY$
43LANGUAGE plpgsql;