Search code examples
postgresqlpostgispgrouting

pgr_dijkstra returns an empty set


I'm trying to write a function that is able to find the shortest way between two points using pgr_dijkstra function. I'm following this guide. With data provided in the guide everything works fine. But when I try to apply the same steps (build a topology using pgr_createTopology and then test it with pgr_dijkstra) to another data set, pgr_dijkstra returns an empty result. I've also noticed that the guide's data set has a LineString geometry column, while I have a MultiLineString geometry column. What could be the reason?

My table's structure:

                                        Table "public.roads"
 Column |              Type              | Collation | Nullable |              Default
--------+--------------------------------+-----------+----------+------------------------------------  
 id     | integer                        |           | not null | nextval('roads_gid_seq'::regclass)
 geom   | geometry(MultiLineString,4326) |           |          |
 source | integer                        |           |          |
 target | integer                        |           |          |
Indexes:
    "roads_pkey" PRIMARY KEY, btree (id)
    "roads_geom_idx" gist (geom)
    "roads_source_idx" btree (source)
    "roads_target_idx" btree (target)

Topology creation query:

SELECT pgr_createTopology('roads', 0.00001, 'geom', 'id');

Shortest way test:

SELECT seq, node, edge, cost as cost, agg_cost, geom
FROM pgr_dijkstra(
   'SELECT id, source, target, st_length(geom, true) AS cost FROM roads',
   -- Some random points
   1, 200
) AS pt
JOIN roads rd ON pt.edge = rd.id;

Solution

  • The problem was actually related to geometry data types. The function doesn't work properly with MultiLineString, though it doesn't produce any errors. So, I've converted MultiLineString to LineString and now everything seems to be OK.