[pgrouting-users] TRSP: rule vs via_path and other documentation

Max Weninger max.weninger at gmail.com
Sat May 26 14:39:20 PDT 2012


Hi again

I think I found the problem

It seems that trsp is not using such a turn restriction
correctly if the start and end point of the route is
"on" target_id and from_id.

If I "extend" start and end it works as expected.

This does only apply to restrictions with more then
one via_path entry. "Simple" restrictions also work
in such cases.

Can someone confirm this?

Thanks

max

On Sat, 26 May 2012 23:02:16 +0200
Max Weninger <max.weninger at gmail.com> wrote:

> Hi
> 
> Today I tried the first time to add turn restrictions
> which contain of more then one edge in via_path
> 
> I already tried both "orders" but still the turn restriction is
> not correctly evaluated from trsp. So it routes over such
> a restrictions.
> 
> > target_id: 1, via_path: 5,4,3,2
> 
> So just that I understand it correctly :)
> The correct order is for the following simple example
> 
> target_id=1
> from_id=3
> via_id=2
> 
> via_path must be
> 2,3
> 
> correct?
> 
> Thanks
> 
> max
> 
> On Thu, 08 Mar 2012 09:55:55 -0500
> Stephen Woodbridge <woodbri at swoodbridge.com> wrote:
> 
> > Hi all,
> > 
> > For those people that are using or trying to use the new trsp
> > function, I want to highlight the difference between rule and
> > via_path.
> > 
> > I unfortunately implemented via_path to be a list of edges in the 
> > reverse order of rule.
> > 
> > IF for RULE:
> > target_id: 1, rule: 2,3,4,5
> > 
> > THEN for via_path
> > target_id: 1, via_path: 5,4,3,2
> > 
> > What I do in my turn restriction tables is to have both columns and
> > if you already have a rule column here is some SQL to create a
> > via_path column:
> > 
> > -- add a new column via_path
> > alter table my_turns add column via_path text;
> > 
> > -- need a helper function for the update
> > CREATE OR REPLACE FUNCTION array_reverse(anyarray)
> >    RETURNS anyarray AS
> > $BODY$
> > SELECT ARRAY(
> >      SELECT $1[i]
> >      FROM generate_series(
> >          array_lower($1,1),
> >          array_upper($1,1)
> >      ) AS s(i)
> >      ORDER BY i DESC
> > );
> > $BODY$
> >    LANGUAGE sql IMMUTABLE STRICT
> >    COST 100;
> > 
> > -- populate the via_path column
> > update my_turns set 
> > via_path=array_to_string(array_reverse(string_to_array(rule,',')),',');
> > 
> > One more common issue that is easy to get caught up in, is
> > consistency of edge ids. When data is imported via shapefiles, you
> > get a handy "gid" as the primary key and a lot of people use this to
> > reference records. If you also load a restriction table or assemble
> > it from your vendors data edges will typically be referred to be
> > some edge_id that is NOT the "gid" the the shapefile loader
> > dynamically adds when the data is loaded.
> > 
> > So if you vendor data uses a column "object_id" as the edge
> > identifier, then it is likely that your restriction data will be
> > defined in terms of "object_id" also. Therefore when you construct
> > your query it needs to be something like:
> > 
> > select * from turn_restrict_shortest_path(
> >     'select object_id as id, source, target, ...',
> >     1234, -- start NODE_ID
> >     5678, -- end NODE_ID
> >     true,
> >     true,
> >     'select to_cost, object_id as target_id, via_path from
> > my_turns');
> > 
> > I would also recommend the people use the following version of trsp 
> > because it can handle oneway conditions and restrictions at the
> > start and end of the route that can not be detected using the above.
> > 
> > select * from turn_restrict_shortest_path(
> >     'select object_id as id, source, target, ...',
> >     1234, -- start EDGE_ID
> >     0.5,  -- position along edge
> >     5678, -- end EDGE_ID
> >     0.5,  -- position along edge
> >     true,
> >     true,
> >     'select to_cost, object_id as target_id, via_path from
> > my_turns');
> > 
> > Notice that this uses EDGE_IDs and not NODE_IDs as the first does.
> > Also position along the edge is a float from 0.0 to 1.0 where 0.0 is
> > the start of the edge and 1.0 is the end of the edge. The postGIS
> > linear referencing functions will return a value suitable for this
> > by dropping a point on and edge and returning the percentage along
> > that edge.
> > 
> > I hope this helps people use this new function.
> > 
> > Thanks,
> >    -Steve
> > _______________________________________________
> > Pgrouting-users mailing list
> > Pgrouting-users at lists.osgeo.org
> > http://lists.osgeo.org/mailman/listinfo/pgrouting-users
> 



More information about the Pgrouting-users mailing list