Diagnostic Tools¶
pgRouting is a large black box to most users. When things are working nobody has a problem, but when it is not working as expected what do you do? One of the most common problems is issues with the routing data. I built the following tools that aew easy to implement and use and can reveal a lot about your data. I assume that you are working with OpenLayers as you map viewer and we will build two visualization tools.
- View just the streets in the routing database
- View intersections and detect deadends
You can see these tools in action at http://imaptools.com/leaddog/routing/dd.html Zoom into a city, open the layerswitcher and select “Just the Streets” and “Dead Ends”.
1. View just the streets in the routing database¶
Create a mapfile that displays the street segments from the routing database and add this as an optional base layer. You might want to add color oneway streets a different color, but in general keep the display simple and probably single pixel lines. You might label the segments with their UID so you can go back to the database and query them in detail.
LAYER
NAME "Streets"
STATUS DEFAULT
TYPE LINE
CONNECTIONTYPE postgis
CONNECTION "user=postgres dbname=routing host=centos port=5432"
DATA "the_geom from (select gid, the_geom from st) as foo
using SRID=4326 using unique gid"
LABELITEM "gid"
MAXLABELSCALEDENOM 25000
CLASS
STYLE
COLOR 87 87 87
WIDTH 1
END
LABEL
FONT "arial"
TYPE TRUETYPE
ANGLE AUTO
SIZE 7
COLOR 1 1 1
END
END
END
symbol
name "one_way_from"
type truetype
font arial-bold
character ">"
gap -40
end
symbol
name "one_way_to"
type truetype
font arial-bold
character "<"
gap -40
end
LAYER
NAME "One_Way_Arrows"
STATUS DEFAULT
TYPE LINE
MAXSCALEDENOM 25000
CONNECTIONTYPE postgis
CONNECTION "user=postgres dbname=routing host=centos port=5432"
DATA "the_geom from (select gid, one_way, the_geom from st
where one_way is not null and length(one_way)>0) as foo
using SRID=4326 using unique gid"
CLASSITEM 'one_way'
CLASS
NAME 'From'
EXPRESSION "FT"
STYLE
SYMBOL "one_way_from"
COLOR 80 80 80
SIZE 8
END
END
CLASS
NAME 'To'
EXPRESSION "TF"
STYLE
SYMBOL "one_way_to"
COLOR 80 80 80
SIZE 8
END
END
END
2. View intersections and detect deadends¶
Add a column cnt integer to the vertices_tmp table and update it with the count of segments that reference that node. Maybe something like this:
alter table vertices_tmp add column cnt integer;
update vertices_tmp set cnt=0;
update vertices_tmp set cnt=cnt+1 where streets.source=id;
update vertices_tmp set cnt=cnt+1 where streets.target=id;
Now create a mapfile layer for points and display the vertices_tmp
LAYER
NAME "deadends"
TYPE POINT
CONNECTIONTYPE "postgis"
CONNECTION ...
DATA ...
CLASSEXPRESSION "cnt"
CLASS
EXPRESSION "cnt=1"
STYLE
SYMBOL "circle"
SIZE 5
COLOR 255 0 0
END
END
CLASS
EXPRESSION "cnt>2"
STYLE
SYMBOL "circle"
SIZE 3
COLOR 0 255 0
END
END
END
This will display red dots at dead ends and green dots as good connections be segments. If you have a lot of red dots between segments that should be joined, you probably need to rebuild your vertices_tmp table with a larger tolerance.
It is very hard to debug a large black box like a router without having some tools that can give you some better insight as to what is going on.