[pgrouting-users] Inserting Nodes Into a Network

Hello all!

I am creating drive time radii (or isochrones) by allowing the user to click on a map surface and entering a number of minutes.

Using the driving_distance function in pgrouting I am able to get very close to a good solution, but it is somewhat limited in that you can only route from node to node (vertex to vertex). In order to improve the accuracy, I thought I would try to insert a new node/vertex as close as possible to the coordinates that my user clicked. That way my start node would always be as accurate as it can be.

Has anyone done this? I’m not sure I understand the assign_vertex_id function and how the graph is constructed well enough to come up with a solution myself.

Any help or direction is appreciated!

On 1/9/2012 10:05 AM, Steve Horn wrote:

Hello all!

I am creating drive time radii (or isochrones) by allowing the user to
click on a map surface and entering a number of minutes.

Using the driving_distance function in pgrouting I am able to get very
close to a good solution, but it is somewhat limited in that you can
only route from node to node (vertex to vertex). In order to improve the
accuracy, I thought I would try to insert a new node/vertex as close as
possible to the coordinates that my user clicked. That way my start node
would always be as accurate as it can be.

Has anyone done this? I'm not sure I understand the assign_vertex_id
function and how the graph is constructed well enough to come up with a
solution myself.

Any help or direction is appreciated!

What you would want to do in this case is:

1. take you position and find the nearest edge to that location (EID, ESOURCE, ETARGET, ECOST, EREVERSE_COST)
2. compute the ratio of distance along that edge (RATIO)
3. then add a create a temporary node at that location (NEWNODE)
4. then add edges from the temp node to each of the end points to that edge, paying attention to oneway-ness of that edge and assigning costs as a ratio of the original cost.

So select edges for your query might look like and you would pass NEWNODE as the starting node.

select gid, source, target, cost, reverse_cost from roads
union all
select maxgid+1, ESOURCE, NEWNODE, ECOST*RATIO, EREVERSE_COST*(1-RATIO)
union all
select maxgid+2, NEWNODE, ETARGET, ECOST*(1-RATIO), EREVERSE_COST*RATIO

-Steve