[pgrouting-dev] Driving Directions Revisited
Stephen Woodbridge
woodbri at swoodbridge.com
Tue May 17 09:54:04 EDT 2011
Hi Anton,
I need some help with this. I think I have run into a bug. What I am
trying to do is reconstruct the Dijkstra tree from the driving
directions node list.
So I run this query (my driving_distance() is listed below:
SELECT vertex_id, case when b.source=vertex_id then b.target else
b.source end as tid, edge_id, cost
FROM driving_distance(
'SELECT gid AS id, source, target, cost_len::double precision
AS cost
FROM streets
WHERE expand(setsrid(makepoint(-71.38776, 42.62),4326),
800./111120.+0.05) && the_geom', 14350697, 800, false, false) as a,
streets b
WHERE a.edge_id=b.gid
order by cost;
And get back this list of nodes:
vertex_id;tid;edge_id;cost
14350697;14324143;17585631;0
14324152;14350697;17559046;65.7600693996609
14324153;14324155;17525943;151.931780105486
14324154;14333339;17535960;170.771041457689
14324142;14350697;17559045;270.404042264354
14324145;14324142;17525935;312.38892285178
14352132;14357502;17568711;327.943430630889
14324150;14357469;17568653;372.73455007583
14324146;14324145;17525934;385.363174877394
14324140;14324145;17525933;388.831846843193
14357469;14324150;17568653;409.460621733005
14324205;14352132;17561074;438.800178615358
14324143;14350697;17585631;440.463055899486
14324149;14324151;17525953;463.817008548616
14324155;14335807;17539031;505.011855607214
14324141;14350696;17559044;522.697129188522
14324144;14324140;17525932;529.29745870764
14333339;14324154;17535960;538.752343241644
14335807;14335809;17539033;545.433040614225
14350695;14333339;17559042;549.17256774511
14324164;14324155;17525998;608.754587443993
14324151;14324149;17525953;611.133336570719
14335809;14335807;17539033;617.050097622648
14350696;14324141;17559044;624.884390435334
14350693;14350696;17559043;630.386775977662
14350692;14350693;17559040;635.388795958097
14335808;14350705;17559060;676.985348880917
14324206;14324205;17525992;690.86142794178
14324207;14354647;17564505;698.702994306955
14350705;14357566;17568800;725.054574549748
14357566;14361210;17574058;744.377671982209
14324156;14324164;17525954;775.199428174955
14361210;14362309;17575712;785.251952246793
14324165;14324164;17525955;788.303395916384
This looks reason about until I try to reconstruct the tree and find
that I actually have multiple disconnected trees :(
Leaving off the 143 prefix to all the nodes above, I get the following 9
trees. Any ideas why I am not getting a single connected tree? Am I not
interpreting the results correctly? Would it be possible to patch the C
code to just return all the nodes in the tree?
Other thoughts? I really need to be able to get to this data.
Thanks,
-Steve
In these trees, in-dent means child of the the previous out-dent.
50697
+24143
+24152
+24142
+24145
+24146
+24140
+24144
24153
+24155
+35807
+35809
+24164
+24156
+24165
24154
+33339
+50695
52132
+57502
+24205
+24206
24150
+57469
24149
+24151
24207
+54647
24141
+50696
+50693
+50692
35808
+50705
+57566
+61210
+62309
-- this function sets up a call the the pg_routing driving_distance()
-- function and returns the rows without creating polygons
CREATE OR REPLACE FUNCTION driving_distance(table_name character
varying, x double precision, y double precision, maxcost double
precision, bufdist double precision, "cost" character varying,
reverse_cost character varying, directed boolean, has_reverse_cost boolean)
RETURNS SETOF path_result AS
$BODY$
DECLARE
q text;
srid integer;
r record;
source_id integer;
BEGIN
FOR r IN EXECUTE 'SELECT srid FROM geometry_columns WHERE
f_table_name = '''||table_name||'''' LOOP
END LOOP;
srid := r.srid;
RAISE NOTICE 'SRID: %', srid;
RAISE NOTICE 'SELECT id FROM
find_node_by_nearest_link_within_distance(''POINT(% %)'', %, ''%'');',
x, y, bufdist, table_name;
SELECT id INTO source_id
FROM find_node_by_nearest_link_within_distance('POINT('||x||'
'||y||')', bufdist, table_name);
RAISE NOTICE 'SOURCE_ID: %', source_id;
q := 'SELECT gid AS id, source::integer, target::integer,
'||cost||' AS cost'
|| CASE WHEN has_reverse_cost THEN ', '||reverse_cost||' AS
reverse_cost ' ELSE '' END
||' FROM '||table_name||' WHERE setsrid(''BOX3D('||x-bufdist||'
'||y-bufdist||','
||x+bufdist||' '||y+bufdist||')''::BOX3D, '||srid||') && the_geom';
RAISE NOTICE 'Query: %', q;
FOR r IN SELECT * FROM driving_distance(q, source_id, maxcost,
directed, has_reverse_cost)
LOOP
RETURN NEXT r;
END LOOP;
RETURN;
END;
$BODY$
LANGUAGE plpgsql VOLATILE STRICT
COST 100
ROWS 1000;
More information about the pgrouting-dev
mailing list