routing1=# create table ruta1 (gid serial, vertex_id integer, geom geometry (MultilineString, 0)); routing1=# insert into ruta1 (vertex_id, geom) select ways.gid, st_multi(ways.the_geom) from pgr_dijkstra ('select gid as id, source, target, abs(cost_s) as cost from ways', 12662, 4721, false), ways where ways.gid = edge; routing1=# create table ruta2 (gid serial, vertex_id integer, geom geometry (MultilineString, 0)); routing1=# insert into ruta2 (vertex_id, geom) select ways.gid, st_multi(ways.the_geom) from pgr_dijkstra ('select gid as id, source, target, cost_s as cost, reverse_cost_s as reverse_cost from ways', 12662, 4721, true), ways where ways.gid = edge;
Se han elegido dos nodos alejados dentro del núcleo urbano. La figura siguiente muestra la cartografía y las dos rutas calculadas.
Por último, el número de tramos, coste total en segundos y longitud total en metros (nótese que utilizamos la función st_length pero convertimos la geometría al tipo geography. La función ST_Length está sobrecargada de forma que si el argumento es de tipo geography calcula la distancia correctamente cuando las unidades son longitud y latitud sobre WGS 84.
routing1=# select count(*),sum(st_length(geom::geography)), sum(coste) from ruta1; count | sum | sum -------+------------------+-------- 103 | 6868.28334086638 | 528.33 routing1=# select count(*),sum(st_length(geom::geography)), sum(coste) from ruta2; count | sum | sum -------+------------------+--------- 149 | 7267.45297072252 | 566.014
Si se desea, también se podrían aplicar pesos a las distancias de los tramos (costes con pesos) con el fin de valorar alguna otra variable (workshop de los congresos FOSS4G[1].
En cualquier caso y lo más importante sin duda, es que el lector trate de averiguar si algunos de los servicios online de navegación (routing) ofertados actualmente[2] (OpenRoute Service, CycleStreets, etc.) con cartografía de OSM cubren sus necesidades, el ejemplo realizado anteriormente solo es una aproximación grosera, ya que habría que establecer correctamente las restricciones de giro y comprobar si los tramos segmentados en realidad solo se cruzaban.
Ver aquí la parte anterior de este taller
Ver aquí la parte siguiente de este taller