Hi Emre, hi list<div><br></div><div>I faced the Driving Direction issue and I wrote a pl/pgsql function.</div><div><br></div><div>It is only an example and it is not optimized. There are some comments in italian language (I&#39;m sorry .. I didn&#39;t have the time to translate them).</div>
<div><br></div><div>It assume the name of the street table as &quot;ways&quot;, use the SPS algorithm and returns a xml containing the Driving Directions and the geometry of the route.</div><div><br></div><div>If you want to see it in action you can visit the demo at <a href="http://routing.geosdi.org">http://routing.geosdi.org</a> (also mentioned in the pgRouting Gallery - thanks to Daniel)</div>
<div><br></div><div>Some information about the algorithm:</div><div><br></div><div>the routing query returns the geometries of the edges composing the shortest path, but they are not oriented. So the first things to do is to analyze every couple ov edge and flip the segments if necessary, so that the final point of the n_th segment coincides with the start point of the n+1_th segment.</div>
<div>than, using the azimuth, evaluate the angle between two consecutive segments to define the maneuver to suggest.</div><div><br></div><div>This is far to be used in a production environment, but it could be an example to start (I could not find any example when I started to face the DD issue !!)</div>
<div><br></div><div>Hope this help.</div><div><br></div><div><br></div><div>Daniel ... we could post it into the contribution with git after I optimize it .. How to do this?</div><div><br></div><div><br></div><div>Here is the not-optimized function.</div>
<div><br></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">-- Function: xml_directions(integer, integer, text)</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><br>
</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">-- DROP FUNCTION xml_directions(integer, integer, text);</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><br>
</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">CREATE OR REPLACE FUNCTION xml_directions(source_id integer, target_id integer, tab_name text)</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">  RETURNS xml AS</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">$BODY$DECLARE</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><br></font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">start_point geometry; --geometria del punto iniziale</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">tab_name text :=$3; -- nome della tabella (ways)</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">s_id integer :=$1; -- source id</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">t_id integer :=$2; -- target id</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">_first boolean :=true; --č il primo step dell&#39;algoritmo </font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">fc real:= 111073.2835905824; -- fattore conversione moltiplicativo per le distanze</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">_A geometry;</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">_B geometry;</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">_C geometry;</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">_D geometry;</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">a1 float; -- azimuth fine prima geometria</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">a2 float; -- azimuth inizio seconda geometria</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">angoli real[]; -- array degli angoli (differenza) da restituire</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">i integer; -- intero per scorrere l&#39;array - NB č definito fuori dal loop perchč serve anche per ottenere la lunghezza degli array</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><br></font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">the_route CURSOR FOR SELECT rt.gid, rt.the_geom, length(rt.the_geom), <a href="http://ways.name">ways.name</a> FROM ways, (SELECT gid, the_geom FROM shootingstar_sp(tab_name, s_id, t_id, 0.1, &#39;cost&#39;, true, true)) AS rt WHERE ways.gid=rt.gid;</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">--variabili per il fetch</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">GID_1 integer;</font></div><div>
<font class="Apple-style-span" face="&#39;courier new&#39;, monospace">GID_2 integer;</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">GEOM_1 geometry; </font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">GEOM_2 geometry;</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">LENGTH_1 real;</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">LENGTH_2 real;</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">NAME_1 text;</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">NAME_2 text;</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><br></font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><br>
</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><br></font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><br></font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">directions text[];<span class="Apple-tab-span" style="white-space:pre">        </span>--vettore contenente i codici relaivi alle manovre</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">lengths real[];<span class="Apple-tab-span" style="white-space:pre">                </span>--vettore contenente le lunghezze dei tratti da percorrere</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">streets text[];<span class="Apple-tab-span" style="white-space:pre">                </span>--vettore contenente i nomi dele strade della rotta</font></div><div>
<font class="Apple-style-span" face="&#39;courier new&#39;, monospace">geoms geometry[];<span class="Apple-tab-span" style="white-space:pre">        </span>--vettore delle singole geometrie</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">line geometry;<span class="Apple-tab-span" style="white-space:pre">                </span>--geometria complessiva della rotta</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">tot_len real :=0;</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">tot_time real:=0;</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">tlu text := &#39;m&#39;;<span class="Apple-tab-span" style="white-space:pre">        </span>-- total length units</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><br></font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">-- var per l&#39;execute della query per la composizione dell&#39;xml</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">pre_string text;</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><br></font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><br>
</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">steps_fragment text:=&#39;XMLELEMENT(NAME step,XMLELEMENT(NAME text,&#39;&#39;Start from &#39;;</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">line_fragment text;</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><br></font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">xml_result xml;</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><br>
</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">BEGIN</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><br></font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">        </span>angoli[0] :=0; -- la prima indicazione č sempre &quot;procedi su via ...&quot; . Il riempimento del vettore angoli deve partire da angoli[1]</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">        </span>i:=0;</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">        </span>OPEN the_route;</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">        </span>FETCH the_route INTO GID_1, GEOM_1, LENGTH_1, NAME_1;</font></div><div><span class="Apple-tab-span" style="white-space:pre"><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">        </font></span></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">        </span>IF NAME_1 IS NOT NULL THEN</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">        </span>streets[0]:= replace(trim(both from NAME_1),&#39;&#39;&#39;&#39;,&#39;&#39;&#39;&#39;&#39;&#39;);</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">        </span>ELSE streets[0]:=&#39;Missing Street Name&#39;;</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">        </span>END IF;</font></div>
<div><span class="Apple-tab-span" style="white-space:pre"><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">        </font></span></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">        </span>lengths[0]:= LENGTH_1*fc;</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">        </span>--tot_len := tot_len + lengths[0];</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">        </span>line:=ST_Union(GEOM_1);</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">        </span>RAISE NOTICE &#39; STREET [0] = %&#39;,streets[0];</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">        </span>RAISE NOTICE &#39; LENGTHS [0] = %&#39;,lengths[0];</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">        </span>LOOP</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                </span>FETCH the_route INTO GID_2, GEOM_2, LENGTH_2, NAME_2;</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                </span>EXIT WHEN NOT FOUND;</font></div><div><span class="Apple-tab-span" style="white-space:pre"><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">                </font></span></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><br></font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                </span>-- caso primo segmento</font></div>
<div><span class="Apple-tab-span" style="white-space:pre"><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">                </font></span></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                </span>IF _first THEN </font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                </span>-- devo capire chi č il punto iniziale</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                </span>_A :=ST_PointN(GEOM_1,1);</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                </span>_B :=ST_PointN(GEOM_1,ST_NumPoints(GEOM_1));</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                </span>_C :=ST_PointN(GEOM_2,1);</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                </span>_D :=ST_PointN(GEOM_2,ST_NumPoints(GEOM_2));</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                        </span>IF (ST_Equals(_A, _C)) THEN</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                        </span>start_point := _B;</font></div><div><span class="Apple-tab-span" style="white-space:pre"><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">                                                        </font></span></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                        </span>ELSIF (ST_Equals(_A, _D)) THEN</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                        </span>start_point := _B;</font></div>
<div><span class="Apple-tab-span" style="white-space:pre"><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">                                                        </font></span></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                        </span>ELSE</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                        </span>start_point := _A;</font></div><div><span class="Apple-tab-span" style="white-space:pre"><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">                                                        </font></span></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                        </span>END IF;</font></div><div><span class="Apple-tab-span" style="white-space:pre"><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">                                                        </font></span></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                </span>--valuto quale endpoint della prima geometria č connessa allo startpoint e se necessario flippo la geometria</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                        </span>IF NOT(ST_Equals(start_point,ST_PointN(GEOM_1,1))) THEN -- lo start point non coincide con il primo punto del primo segmento, quindi il segmento va flippato</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                        </span>GEOM_1 := ST_Reverse(GEOM_1);</font></div><div><span class="Apple-tab-span" style="white-space:pre"><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">        </font></span></div>
<div><span class="Apple-tab-span" style="white-space:pre"><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">                </font></span></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                        </span>END IF;</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                        </span>geoms[i]:= GEOM_1;</font></div><div><span class="Apple-tab-span" style="white-space:pre"><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">                                                        </font></span></div>
<div><span class="Apple-tab-span" style="white-space:pre"><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">                        </font></span></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                        </span>start_point:= ST_PointN(Geom_1,ST_NumPoints(GEOM_1)); --aggiorno lo start point come l&#39;ultimo punto della prima geometria</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><br></font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                        </span>--valuto quale endpoint della seconda geometria č connessa all&#39;ultimo punto della prima geometria (che č giā stata correttamente orientata) e se necessario flippo la seconda geometria</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                        </span>IF NOT(ST_Equals(start_point, ST_PointN(GEOM_2,1))) THEN</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                        </span>GEOM_2 := ST_Reverse(GEOM_2);</font></div>
<div><span class="Apple-tab-span" style="white-space:pre"><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">                                                        </font></span></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                        </span>END IF;</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                        </span>start_point:= ST_PointN(Geom_2,ST_NumPoints(GEOM_2)); -- aggiorno lo start point per lo step successivo del loop</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><br></font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                        </span>-- i segmenti sono orientati; calcolo gli azimuth e definisco la direzione </font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                        </span>a1 := trunc(ST_Azimuth(ST_PointN(GEOM_1,ST_NumPoints(GEOM_1)-1),ST_PointN(GEOM_1,ST_NumPoints(GEOM_1)))/(2*pi())*360);</font></div>
<div><span class="Apple-tab-span" style="white-space:pre"><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">                        </font></span></div><div><span class="Apple-tab-span" style="white-space:pre"><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">                                                        </font></span></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                        </span>a2 := trunc(ST_Azimuth(ST_PointN(GEOM_2,1),ST_PointN(GEOM_2,2))/(2*pi())*360);</font></div>
<div><span class="Apple-tab-span" style="white-space:pre"><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">                                                        </font></span></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                        </span>-- la differenza di questi angoli definisce la manovra da effettuare, quindi VA RITORNATA IN QUALCHE MODO</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                        </span>angoli[i+1] := (a1 - a2);</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                        </span>IF (angoli[i+1] &gt;180.0) THEN angoli[i+1]:=angoli[i+1]-360;</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                        </span>END IF;</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                        </span>IF (angoli[i+1]&lt; -180) THEN angoli[i+1]:=angoli[i+1]+360;</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                        </span>END IF;</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                        </span>IF NAME_2 IS NOT NULL THEN</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                        </span>streets[i+1]:= replace(trim(both from NAME_2),&#39;&#39;&#39;&#39;,&#39;&#39;&#39;&#39;&#39;&#39;);</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                        </span>ELSE </font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                        </span>streets[i+1]:=&#39;nome strada mancante&#39;;</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                        </span>END IF;</font></div><div><span class="Apple-tab-span" style="white-space:pre"><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">                        </font></span></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                        </span>-- Se le strade hanno lo stesso nome</font></div><div><span class="Apple-tab-span" style="white-space:pre"><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">                        </font></span></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                        </span>IF ((streets[i+1] =streets[i])) THEN</font></div><div><span class="Apple-tab-span" style="white-space:pre"><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">                        </font></span></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                        </span>geoms[i]:=ST_Union(geoms[i],GEOM_2);</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                        </span>lengths[i]:=lengths[i]+(LENGTH_2 * fc);</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                        </span>line:=ST_Union(line,GEOM_2);</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                        </span>GEOM_1 := GEOM_2;</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                        </span>NAME_1 := NAME_2;</font></div><div><span class="Apple-tab-span" style="white-space:pre"><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">                        </font></span></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                        </span>ELSE</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                        </span>lengths[i+1]:= LENGTH_2 * fc;</font></div>
<div><span class="Apple-tab-span" style="white-space:pre"><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">                                                </font></span></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                        </span>geoms[i+1]:= GEOM_2;</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                        </span>line:=ST_Union(line,GEOM_2);</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><br>
</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                        </span>i:= i+1;</font></div><div><span class="Apple-tab-span" style="white-space:pre"><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">                        </font></span></div>
<div><span class="Apple-tab-span" style="white-space:pre"><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">                        </font></span></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                        </span>GID_1 := GID_2;</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                        </span>GEOM_1 := GEOM_2;</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                        </span>LENGTH_1 := LENGTH_2 * fc;</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                        </span>NAME_1 := NAME_2;</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                        </span>END IF;</font></div>
<div><span class="Apple-tab-span" style="white-space:pre"><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">                        </font></span></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                        </span>_first := false;</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><br></font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                </span>-- caso segmenti successivi al primo (la prima geometria č giā orientata)</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                </span>ELSE</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                        </span>IF NOT(ST_Equals(start_point, ST_PointN(GEOM_2,1))) THEN</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                        </span>GEOM_2 := ST_Reverse(GEOM_2);</font></div><div><span class="Apple-tab-span" style="white-space:pre"><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">                                                        </font></span></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                        </span>END IF;</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                        </span>start_point:= ST_PointN(Geom_2,ST_NumPoints(GEOM_2)); -- aggiorno lo start point per lo step successivo del loop</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><br></font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                        </span>-- i segmenti sono orientati; calcolo gli azimuth e definisco la direzione </font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                        </span>a1 := trunc(ST_Azimuth(ST_PointN(GEOM_1,ST_NumPoints(GEOM_1)-1),ST_PointN(GEOM_1,ST_NumPoints(GEOM_1)))/(2*pi())*360);</font></div>
<div><span class="Apple-tab-span" style="white-space:pre"><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">                                                        </font></span></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                        </span>a2 := trunc(ST_Azimuth(ST_PointN(GEOM_2,1),ST_PointN(GEOM_2,2))/(2*pi())*360);</font></div>
<div><span class="Apple-tab-span" style="white-space:pre"><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">                                                        </font></span></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                        </span>-- la differenza di questi angoli definisce la manovra da effettuare, quindi VA RITORNATA IN QUALCHE MODO</font></div>
<div><span class="Apple-tab-span" style="white-space:pre"><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">                        </font></span></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                        </span>angoli[i+1] := (a1 - a2);</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                        </span>IF (angoli[i+1] &gt;180) THEN angoli[i+1]:=angoli[i+1]-360;</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                        </span>END IF;</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                        </span>IF (angoli[i+1]&lt; -180) THEN angoli[i+1]:=angoli[i+1]+360;</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                        </span>END IF;</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><br></font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                        </span>IF NAME_2 IS NOT NULL THEN</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                        </span>streets[i+1]:= replace(trim(both from NAME_2),&#39;&#39;&#39;&#39;,&#39;&#39;&#39;&#39;&#39;&#39;);</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                        </span>ELSE</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                        </span>streets[i+1]:=&#39;nome strada mancante&#39;;</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                        </span>END IF;</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><br>
</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                        </span>-- Se le strade hanno lo stesso nome  </font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                        </span>IF ( (streets[i+1] =streets[i])) THEN</font></div>
<div><span class="Apple-tab-span" style="white-space:pre"><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">                        </font></span></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                        </span>geoms[i]:=ST_Union(geoms[i],GEOM_2);</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                        </span>lengths[i]:=lengths[i]+(LENGTH_2 * fc);</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                        </span>line:=ST_Union(line,GEOM_2);</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                        </span>GEOM_1 := GEOM_2;</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                        </span>NAME_1 := NAME_2;</font></div>
<div><span class="Apple-tab-span" style="white-space:pre"><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">                        </font></span></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><br>
</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                        </span>ELSE</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><br>
</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><br></font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                        </span>lengths[i+1]:= LENGTH_2 * fc;</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                        </span>--tot_len := tot_len + lengths[i+1];</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                        </span>geoms[i+1]:=GEOM_2;</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><br></font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                        </span>line:=ST_Union(line,GEOM_2);</font></div>
<div><span class="Apple-tab-span" style="white-space:pre"><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">                        </font></span></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                        </span>i:= i+1;</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                        </span>--GID_1 := GID_2;</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                        </span>GEOM_1 := GEOM_2;</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                        </span>--LENGTH_1 := LENGTH_2 * fc;</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                        </span>NAME_1 := NAME_2;</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                        </span>END IF;</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><br>
</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                </span>END IF;</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><br>
</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">        </span>END LOOP;</font></div><div><span class="Apple-tab-span" style="white-space:pre"><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">        </font></span></div>
<div><span class="Apple-tab-span" style="white-space:pre"><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">        </font></span></div><div><span class="Apple-tab-span" style="white-space:pre"><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">        </font></span></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">        </span>CLOSE the_route;</font></div><div><span class="Apple-tab-span" style="white-space:pre"><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">        </font></span></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><br></font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">        </span>--codifico gli angoli in manovre</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">        </span>for k in 0..i LOOP</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">        </span>CASE</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                </span>WHEN angoli[k]&gt;=-5 AND angoli[k]&lt;=5 THEN</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                </span>directions[k]:=&#39;Go straight along&#39;;</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                </span>--RAISE NOTICE&#39;RAMO 1    %&#39;,directions[k];</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                </span>WHEN angoli[k]&gt;=-45 AND angoli[k]&lt;-5 THEN</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                </span>directions[k]:=&#39;Slight right onto&#39;;</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                </span>--RAISE NOTICE&#39;RAMO 2    %&#39;,directions[k];</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                </span>WHEN angoli[k]&gt;=-100 AND angoli[k]&lt;-45 THEN</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                </span>directions[k]:=&#39;Turn right onto&#39;;</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                </span>--RAISE NOTICE&#39;RAMO 3    %&#39;,directions[k];</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                </span>WHEN angoli[k]&gt;=-135 AND angoli[k]&lt;-100 THEN</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                </span>directions[k]:=&#39;bend to the right on&#39;;</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                </span>--RAISE NOTICE&#39;RAMO 4    %&#39;,directions[k];</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                </span>WHEN angoli[k]&gt;=-180 AND angoli[k]&lt;-135 THEN</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                </span>directions[k]:=&#39;U-turn right onto&#39;;</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                </span>--RAISE NOTICE&#39;RAMO 5    %&#39;,directions[k];</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                </span>WHEN angoli[k]&gt;5 AND angoli[k]&lt;=45 THEN</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                </span>directions[k]:=&#39;Slight left onto&#39;;</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                </span>--RAISE NOTICE&#39;RAMO 6    %&#39;,directions[k];</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                </span>WHEN angoli[k]&gt;45 AND angoli[k]&lt;=100 THEN</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                </span>directions[k]:=&#39;Turn left onto&#39;;</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                </span>--RAISE NOTICE&#39;RAMO 7    %&#39;,directions[k];</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                </span>WHEN angoli[k]&gt;100 AND angoli[k]&lt;=135 THEN</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                </span>directions[k]:=&#39;bend to the left on&#39;;</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                </span>--RAISE NOTICE&#39;RAMO 8    %&#39;,directions[k];</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                </span>WHEN angoli[k]&gt;135 AND angoli[k]&lt;=180 THEN</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                </span>directions[k]:=&#39;U-turn left onto&#39;;</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                </span>--RAISE NOTICE&#39;RAMO 9    %&#39;,directions[k];</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">                </span>ELSE RAISE NOTICE&#39; ELSE%&#39;,directions[k];</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">        </span>END CASE;</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">        </span>tot_len := tot_len + lengths[k];</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">        </span>END LOOP;</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">        </span>tot_len := trunc(tot_len);</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">        </span>tot_time := trunc(tot_len/833.33333); -- si assume velocitā media di 50 km/h</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><br></font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">        </span>IF (tot_len &gt;= 1000) THEN</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">        </span>tot_len := tot_len/1000; --mostro la len in km</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">        </span>tlu := &#39;km&#39;;</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">        </span>END IF; </font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">        </span>pre_string:=&#39;XMLROOT(XMLELEMENT(NAME result, XMLELEMENT(NAME route, XMLELEMENT(NAME total_length, &#39;&#39;circa &#39;||tot_len||&#39; &#39;||tlu||&#39;&#39;&#39;), XMLELEMENT( NAME total_estimated_time, &#39;&#39;about &#39;||tot_time||&#39; min&#39;&#39;), XMLELEMENT(NAME directions,&#39;;</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">        </span>steps_fragment := steps_fragment||streets[0]||&#39;&#39;&#39;))&#39;;</font></div><div>
<font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">        </span>for j in 0..i LOOP</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">--RAISE NOTICE&#39;geometria ------- %/&#39;,ST_AsText(geoms[j]);</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">        </span>steps_fragment := steps_fragment||&#39;,XMLELEMENT(NAME step,XMLELEMENT(NAME text,&#39;||&#39;&#39;&#39;&#39;||directions[j]||&#39; &#39;||streets[j]||&#39; (about &#39;||trunc(lengths[j])||&#39; m)&#39;||&#39;&#39;&#39;&#39;||&#39;),XMLELEMENT(NAME line,&#39;&#39;&#39;||ST_AsText(geoms[j])||&#39;&#39;&#39;))&#39;;</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">        </span>END LOOP;</font></div><div><span class="Apple-tab-span" style="white-space:pre"><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">        </font></span></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">        </span>line_fragment:=&#39;),XMLELEMENT(NAME complete_line,&#39;&#39;&#39;||ST_AsText(line)||&#39;&#39;&#39;))),VERSION 1.0,STANDALONE YES)&#39;;</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">        </span>--RAISE NOTICE&#39;geometria -----------------------\n --------------------------------------- \n\n %\n\n----------------------------------------&#39;,ST_AsText(line);</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><br></font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">EXECUTE  &#39;SELECT &#39;||pre_string||steps_fragment||line_fragment INTO xml_result; </font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><br></font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><span class="Apple-tab-span" style="white-space:pre">        </span>RETURN xml_result;</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><br></font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">END;</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><br>
</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">$BODY$</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">  LANGUAGE &#39;plpgsql&#39; VOLATILE</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">  COST 100;</font></div><div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace">ALTER FUNCTION xml_directions(integer, integer, text) OWNER TO postgres;</font></div>
<div><font class="Apple-style-span" face="&#39;courier new&#39;, monospace"><br></font></div><div><br></div><div><br></div><div> </div><div><br><div class="gmail_quote">2011/1/23 Stephen Woodbridge <span dir="ltr">&lt;<a href="mailto:woodbri@swoodbridge.com">woodbri@swoodbridge.com</a>&gt;</span><br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;"><div><div></div><div class="h5">On 1/23/2011 9:22 AM, Emre Koc wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Hi All,<br>
<br>
Does any one can provide sample functions or any kind of help on driving<br>
directions? I am trying to figure out how to do that but any help would<br>
be very helpful.<br>
<br>
Thank you,<br>
<br>
Emre<br>
</blockquote>
<br></div></div>
Here is the thread where I described it before:<br>
<a href="http://www.google.com/#hl=en&amp;num=100&amp;newwindow=1&amp;q=site%3Ahttp%3A%2F%2Flists.postlbs.org%2Fpipermail%2Fpgrouting-users%2F+swoodbridge+%22directions+problem%22&amp;aq=f&amp;aqi=&amp;oq=&amp;fp=2755c6b3e9b2e9" target="_blank">http://www.google.com/#hl=en&amp;num=100&amp;newwindow=1&amp;q=site%3Ahttp%3A%2F%2Flists.postlbs.org%2Fpipermail%2Fpgrouting-users%2F+swoodbridge+%22directions+problem%22&amp;aq=f&amp;aqi=&amp;oq=&amp;fp=2755c6b3e9b2e9</a><br>

<br>
Also look at the GSoC project at:<br>
<a href="http://sourceforge.net/apps/trac/opengraphrouter/wiki" target="_blank">http://sourceforge.net/apps/trac/opengraphrouter/wiki</a><br>
<a href="http://imaptools.com:8080/maps/gsoc2009/?zoom=4&amp;lat=53.56076&amp;lon=-122.60619&amp;layers=BTTT&amp;start=-131.686064%2058.79915&amp;stop=-114.055306%2049.024077&amp;method=GetDD&amp;lang=eng" target="_blank">http://imaptools.com:8080/maps/gsoc2009/?zoom=4&amp;lat=53.56076&amp;lon=-122.60619&amp;layers=BTTT&amp;start=-131.686064%2058.79915&amp;stop=-114.055306%2049.024077&amp;method=GetDD&amp;lang=eng</a><br>

<br>
This has an initial implementation is C++ but it is not well documented<br>
yet and needs a lot of additional work.<br>
<br>
-Steve<br>
<br>
Looks like the list moved so this might work better:<br>
<a href="http://www.google.com/#hl=en&amp;newwindow=1&amp;safe=off&amp;&amp;sa=X&amp;ei=G2k8TeniA4Kr8Aapg5ylCg&amp;ved=0CBIQBSgA&amp;q=site%3Ahttp%3A//lists.postlbs.org/pipermail/pgrouting-users/+woodbridge+%22directions+problem%22&amp;spell=1&amp;fp=241062ed1d424d73" target="_blank">http://www.google.com/#hl=en&amp;newwindow=1&amp;safe=off&amp;&amp;sa=X&amp;ei=G2k8TeniA4Kr8Aapg5ylCg&amp;ved=0CBIQBSgA&amp;q=site%3Ahttp%3A//lists.postlbs.org/pipermail/pgrouting-users/+woodbridge+%22directions+problem%22&amp;spell=1&amp;fp=241062ed1d424d73</a><br>

_______________________________________________<br>
Pgrouting-users mailing list<br>
<a href="mailto:Pgrouting-users@lists.osgeo.org" target="_blank">Pgrouting-users@lists.osgeo.org</a><br>
<a href="http://lists.osgeo.org/mailman/listinfo/pgrouting-users" target="_blank">http://lists.osgeo.org/mailman/listinfo/pgrouting-users</a><br>
</blockquote></div><br><br clear="all"><br>-- <br>Lorenzo Amato<br><a href="mailto:lorenzo.amato@geosdi.org">lorenzo.amato@geosdi.org</a><br><a href="mailto:lorenzotlc@gmail.com">lorenzotlc@gmail.com</a><br><a href="mailto:lorenzo.amato@nsdi.it">lorenzo.amato@nsdi.it</a><br>
<br>Consiglio Nazionale delle Ricerche<br>Istituto di Metodologie per l&#39;Analisi Ambientale - geoSDI<br>
</div>