On 10/27/2013 6:03 PM, cathal coffey wrote:
Hi,
I want to compute the shortest path between two points
origin=(34.052299,-118.1812657) and destination: (34.141132,-117.853179).
Here is what I tried to do.
*Step 1:* Find the nearest nodes.
_origin: the following returns 590279764_
_
SELECT id
FROM nodes
ORDER BY st_distance(the_geom, st_setsrid(st_makepoint(-118.1812657,
34.052299), 4326))
LIMIT 1
_destination: the following returns 123007528_
SELECT id
FROM nodes
ORDER BY st_distance(the_geom, st_setsrid(st_makepoint(-117.853179,
34.141132), 4326))
LIMIT 1
*Step 2:* Compute shortest path between origin and destination.
SELECT *
FROM pgr_dijkstra(
'SELECT gid as id, source, target, length AS cost FROM ways',
590279764, 123007528, false, false
);
However when I execute this I get the following error.
ERROR: Start vertex was not found.
********** Error **********
ERROR: Start vertex was not found.
SQL state: XX000
Why is this happening?
Just because you have a node in the vertex table, does not mean that you will have it assigned a source ot target field in the edge table.
This is a new function that you can try out. It locates the nearest edge then returns the nearest source or target node id along that edge.
create or replace function pgr_pointtoedgenode(edges text, pnt geometry, tol float8)
returns integer as
$body$
/*
* pgr_pointtoedgenode(edges text, pnt geometry, tol float8)
*
* Given and table of edges with a spatial index on the_geom
* and a point geometry search for the closest edge within tol distance to the edges
* then compute the projection of the point onto the line segment and select source or target
* based on whether the projected point is closer to the respective end and return source or target.
* If no edge is within tol distance then return -1
*/
declare
rr record;
pct float;
begin
-- find the closest edge within tol distance
execute 'select * from ' || pgr_quote_ident(edges) ||
' where st_dwithin(''' || pnt::text ||
'''::geometry, the_geom, ' || tol || ') order by st_distance(''' || pnt::text ||
'''::geometry, the_geom) asc limit 1' into rr;
if rr.the_geom is not null then
-- deal with MULTILINESTRINGS
if geometrytype(rr.the_geom)='MULTILINESTRING' THEN
rr.the_geom := GeometryN(rr.the_geom, 1);
end if;
-- project the point onto the linestring
pct := st_line_locate_point(rr.the_geom, pnt);
-- return the node we are closer to
if pct < 0.5 then
return rr.source;
else
return rr.target;
end if;
else
-- return a failure to find an edge within tol distance
return -1;
end if;
end;
$body$
language plpgsql volatile
cost 5;
Use it like:
select * from pgr_pointtoedgenode('ways',
st_setsrid(st_makepoint(-117.853179, 34.141132), 4326)),
0.0013);
This is a new function that will be added to pgRouting 2.1 in our next major release.
-Steve