<div dir="ltr">Hi Steve,<div><br></div><div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">select dmatrix::float8[]<br>
       from pgr_vidstodmatrix(<br>                pgr_pointstovids(<br>                    pgr_texttopoints('-7.50501,40.26310;-7.48864,40.17530;-7.49901,40.13950;-7.57596,40.12350;-7.61591,40.13230;-7.61935,40.13230;-7.67235,40.13580;-7.67087,40.13660;-7.66510,40.13860;-7.74559,40.15640;-7.74588,40.15730;-7.74746,40.15690;-7.74922,40.15540;-7.74926,40.15310;-7.73537,40.14230;-7.63556,40.18920;-7.64849,40.22630;-7.62354,40.25680;-7.62425,40.26280;-7.62223,40.25830;-7.62179,40.25680;-7.62116,40.25580;-7.64803,40.22390;-7.63916,40.20560;-7.63664,40.20250;-7.63767,40.19970;-7.63623,40.20000;-7.56974,40.26710;-7.49104,40.26500;-7.50473,40.26320', 4326),<br>
                    'ways'),<br>                pgr_texttopoints('-7.50501,40.26310;-7.48864,40.17530;-7.49901,40.13950;-7.57596,40.12350;-7.61591,40.13230;-7.61935,40.13230;-7.67235,40.13580;-7.67087,40.13660;-7.66510,40.13860;-7.74559,40.15640;-7.74588,40.15730;-7.74746,40.15690;-7.74922,40.15540;-7.74926,40.15310;-7.73537,40.14230;-7.63556,40.18920;-7.64849,40.22630;-7.62354,40.25680;-7.62425,40.26280;-7.62223,40.25830;-7.62179,40.25680;-7.62116,40.25580;-7.64803,40.22390;-7.63916,40.20560;-7.63664,40.20250;-7.63767,40.19970;-7.63623,40.20000;-7.56974,40.26710;-7.49104,40.26500;-7.50473,40.26320', 4326),<br>
                'ways')</blockquote></div><div><br></div><div><br></div><div>While running the query above, I got the error below.</div><div><br></div><div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
column "id" does not exist<br>LINE 1: select id, source, target, cost from ways where the_geom && ...<br>               ^<br>QUERY:  select id, source, target, cost from ways where the_geom && '0103000020E610000001000000050000002E34D769A4651FC05EBA490C020344402E34D769A4651FC0492EFF21FD2E444076ABE7A4F78D1DC0492EFF21FD2E444076ABE7A4F78D1DC05EBA490C020344402E34D769A4651FC05EBA490C02034440'::geometry<br>
CONTEXT:  PL/pgSQL function pgr_vidstodmatrix(integer[],geometry[],text,double precision) line 57 at FOR over EXECUTE statement</blockquote></div><div><br></div><div>I guess it's some kind of bug, which is something it may happen when we are testing something from the develop branch! :-)</div>
<div><br></div><div>Can you help me with this?</div><div><br></div><div>Thanks!</div><div><br></div><div><br></div><div><br></div><div><br></div></div><div class="gmail_extra"><br clear="all"><div><div dir="ltr"><div>--</div>
<div>Helder Alves <br></div>+351912384076<br></div></div>
<br><br><div class="gmail_quote">On Wed, Oct 9, 2013 at 5:26 PM, Stephen Woodbridge <span dir="ltr"><<a href="mailto:woodbri@swoodbridge.com" target="_blank">woodbri@swoodbridge.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Another common problem is orienting the returned edges so they match up end to end. For example:<br>
<br>
  select st_astext(the_geom) from pgr_tsptrsp(pgr_texttopoints('<u></u>2,0;2,1;3,1;2,2;4,1;4,2;2,3;3,<u></u>2', 0), 'edge_table', true, true) a, edge_table b where a.id2=<a href="http://b.id" target="_blank">b.id</a>;<br>

<br>
"LINESTRING(2 1,2 2)"<br>
"LINESTRING(2 2,3 2)"<br>
"LINESTRING(3 2,4 2)"<br>
"LINESTRING(4 1,4 2)"  -- needs to be flipped<br>
"LINESTRING(3 1,4 1)"  -- needs to be flipped<br>
"LINESTRING(2 1,3 1)"  -- needs to be flipped<br>
"LINESTRING(2 1,2 2)"<br>
"LINESTRING(2 2,2 3)"<br>
"LINESTRING(2 2,2 3)"  -- needs to be flipped<br>
"LINESTRING(2 1,2 2)"  -- needs to be flipped<br>
"LINESTRING(2 0,2 1)"  -- needs to be flipped<br>
"LINESTRING(2 0,2 1)"<br>
<br>
So I wrote a new function pgr_flipedges(ga geometry[]) that can be used like this:<br>
<br>
select st_astext(e) from (<br>
  select unnest(pgr_flipedges(array_<u></u>agg(the_geom))) as e<br>
    from pgr_tsptrsp(pgr_texttopoints('<u></u>2,0;2,1;3,1;2,2;4,1;4,2;2,3;3,<u></u>2', 0), 'edge_table', true, true) a,<br>
         edge_table b<br>
   where a.id2=<a href="http://b.id" target="_blank">b.id</a><br>
) as foo;<br>
<br>
"LINESTRING(2 1,2 2)"<br>
"LINESTRING(2 2,3 2)"<br>
"LINESTRING(3 2,4 2)"<br>
"LINESTRING(4 2,4 1)"<br>
"LINESTRING(4 1,3 1)"<br>
"LINESTRING(3 1,2 1)"<br>
"LINESTRING(2 1,2 2)"<br>
"LINESTRING(2 2,2 3)"<br>
"LINESTRING(2 3,2 2)"<br>
"LINESTRING(2 2,2 1)"<br>
"LINESTRING(2 1,2 0)"<br>
"LINESTRING(2 0,2 1)"<br>
<br>
Notice how all the edges have been flipped to return a continuous path from start to end of each adjacent segment in the path.<br>
<br>
-Steve<br>
All the mentioned code will eventually get checked into pgrouting 2.1 development branch once it is stable and I have test cases and docs written for it.<br>
<br>
-Steve<div class="HOEnZb"><div class="h5"><br>
<br>
On 10/9/2013 10:29 AM, Stephen Woodbridge wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Hi all,<br>
<br>
I have been playing with some tools to allow me  to integrate TSP<br>
optimization into a web application. I thought I would share what I have<br>
come up with for comments. One of the things I did was to try and break<br>
down the process into reusable modular functions. For example there are<br>
two functions to compute the distance matrix based on either Euclidean<br>
or kdijkstra distances. One could add other functions to compute them<br>
based on other algorithms. Also each function does one conversion so it<br>
is simple to understand and easy to test or replace with another<br>
function that does the transformation in a different way. Then the final<br>
function glues all the pieces together to get the final result.<br>
<br>
Goal:<br>
<br>
take a string or points like "x,y;x,y;x,y;..." and compute the TSP<br>
solution to order the points based on either Euclidean distance or<br>
network distances, then compute the route through the network and return<br>
the route geometry.<br>
<br>
Solution in progress:<br>
<br>
1. text to point geometry *<br>
    pgr_texttopoints(pnts text, srid integer DEFAULT(4326))<br>
<br>
2. points to vertex ids *<br>
    pgr_pointtoedgenode(edges text, pnt geometry, tol float8)<br>
    pgr_pointstovids(pnts geometry[], edges text, tol float8 DEFAULT(0.01))<br>
<br>
3. points to edge ids **<br>
<br>
4. points to [edge id, pct] **<br>
<br>
5. points to Euclidean distance matrix *<br>
    pgr_points2dmatrix(pnts geometry[], OUT dmatrix double precision[],<br>
OUT ids integer[])<br>
<br>
6. vertex ids to kdijkstra distance matrix *<br>
    pgr_vidstodmatrix(IN vids integer[], IN pnts geometry[], IN edges<br>
text, tol float8 DEFAULT(0.1), OUT dmatrix double precision[], OUT ids<br>
integer[])<br>
<br>
7. distance matrix to TSP to ordered list ***<br>
select * from pgr_tsp(<br>
     (select dmatrix::float8[]<br>
        from pgr_vidstodmatrix(<br>
                 pgr_pointstovids(<br>
                     pgr_texttopoints('2,0;2,1;3,1;<u></u>2,2;4,1;4,2;2,3;3,2',<br>
0),<br>
                     'edge_table'),<br>
                 pgr_texttopoints('2,0;2,1;3,1;<u></u>2,2;4,1;4,2;2,3;3,2', 0),<br>
                 'edge_table')<br>
     ),<br>
     1<br>
);<br>
<br>
8. reorder vids based on ordered list *<br>
<br>
9. compute trsp for pairs of vids in ordered list *,!<br>
    pgr_trsp(sql text, vids integer[], directed boolean,<br>
has_reverse_cost boolean, turn_restrict_sql text DEFAULT NULL::text)<br>
<br>
    pgr_tsptrsp(pnts geometry[], edges text, directed boolean,<br>
has_reverse_cost boolean, tol float8 DEFAULT(0.1), turn_restrict_sql<br>
text DEFAULT NULL::text)<br>
<br>
    select * from<br>
pgr_tsptrsp(pgr_texttopoints('<u></u>2,0;2,1;3,1;2,2;4,1;4,2;2,3;3,<u></u>2', 0),<br>
'edge_table', true, true);<br>
<br>
<br>
10. output results **<br>
<br>
NOTES:<br>
* - done<br>
** - not done<br>
*** - already part of 2.0<br>
! - computing a route through via points can be optimized in the C/C++<br>
code for better performance, but I currently just prototyped this up in<br>
plpgsql<br>
<br>
Thoughts,<br>
   -Steve<br>
______________________________<u></u>_________________<br>
pgrouting-dev mailing list<br>
<a href="mailto:pgrouting-dev@lists.osgeo.org" target="_blank">pgrouting-dev@lists.osgeo.org</a><br>
<a href="http://lists.osgeo.org/mailman/listinfo/pgrouting-dev" target="_blank">http://lists.osgeo.org/<u></u>mailman/listinfo/pgrouting-dev</a><br>
</blockquote>
<br>
______________________________<u></u>_________________<br>
pgrouting-dev mailing list<br>
<a href="mailto:pgrouting-dev@lists.osgeo.org" target="_blank">pgrouting-dev@lists.osgeo.org</a><br>
<a href="http://lists.osgeo.org/mailman/listinfo/pgrouting-dev" target="_blank">http://lists.osgeo.org/<u></u>mailman/listinfo/pgrouting-dev</a><br>
</div></div></blockquote></div><br></div>