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; }