To get a path on one line like that:
Please use the following function
CREATE OR REPLACE FUNCTION intersection_on_line(gid_a integer,start geometry,ende geometry)
RETURNS geometry AS
$BODY$
DECLARE
number_of_points integer;
first_point_of_geometry geometry;
j integer;
zaehler integer;
start geometry;
ende geometry;
point_geom geometry;
line text;
line2 text;
mywkt text;
herewego text;
komma text;
mywkt_anfang text;
mywkt_ende text;
p text;
q text;
endgeometry geometry[] := '{}';
BEGIN
RAISE NOTICE 'Here we go........';
-- Give me the number of points of the geometry
number_of_points:=ST_NumPoints(the_geom) from ways where gid=$1;
mywkt:='';
mywkt_anfang:='';
mywkt_ende:='';
line:='';
line2:='';
komma:=',';
herewego:='';
zaehler:=0;
RAISE NOTICE 'Numer of points in that geometry is %',number_of_points;
FOR j IN 1 .. number_of_points LOOP
--Give me the geometry
point_geom:=PointN(c.the_geom,j) from (select (the_geom) from ways where gid=$1)c,ways where gid=$1;
endgeometry[j]:=point_geom;
RAISE NOTICE 'The point is %',astext(point_geom);
--Create lines to see if clickpoint intersects
line:='';
line:= line || X(endgeometry[j])||' '||Y(endgeometry[j])||', '||X(endgeometry[j-1])||' '||Y(endgeometry[j-1]);
-- A line is build
line2:='(' || line || ')';
line:='LINESTRING'||'(' || line || ')';
RAISE NOTICE 'Linie %',line;
SELECT INTO p ST_intersects(line,buffer($2,1));
SELECT INTO q ST_intersects(line,buffer($3,1));
--If clickpoint intersects
IF p='t' OR q='t' AND zaehler!='2' THEN
zaehler:=zaehler+1;
RAISE NOTICE 'treffer......%',zaehler;
herewego:=1;
END IF;
IF zaehler='2'THEN
herewego:=0;
END IF;
--start_point(click)) is first point
IF j=1 THEN
mywkt:= mywkt || X($2)||' '||Y($2) || komma;
END IF;
IF j!=number_of_points THEN
IF herewego='1' THEN
--Filling geonetry
mywkt:= mywkt || X(point_geom)||' '||Y(point_geom) || komma;
END IF;
--Endpoint is clickpoint end
ELSE
mywkt:= mywkt || X($3)||' '||Y($3);
END IF;
RAISE NOTICE '------------------';
END LOOP;
-- The following is the geometry
mywkt:='LINESTRING'||'(' || mywkt || ')';
RAISE NOTICE 'The geometry is %',mywkt;
RETURN mywkt;
END;
$BODY$
LANGUAGE 'plpgsql' IMMUTABLE STRICT;
It is called in routing3.php if startedge-gid and end-edge-gid are equal.
if ($startEdge['gid']==$endEdge['gid']){
$abfrage_path_between_two_points="SELECT astext(intersection_on_line($result_besidegeometrie_begin_gid,'$point_on_line_begin','$point_on_line_ende')) as wkt,ST_length(schnittpunkt_auf_linie($result_besidegeometrie_begin_gid,'$point_on_line_begin','$point_on_line_ende')) as length";
//echo $abfrage_path_between_two_points;
$query7 = pg_query($con,$abfrage_path_between_two_points);
$result_path_between_two_points= pg_fetch_result($query7, 0, wkt);
$result_length_between_two_points= pg_fetch_result($query7, 0, length);
$searching_wkt_begin=$result_path_between_two_points;
$searching_wkt_ende=$result_path_between_two_points;
$length_begin=$result_length_between_two_points;
$length_ende=$result_length_between_two_points;
//echo "Die Strecke ".$result_path_between_two_points;
}
