Changes to make Analyst web API of OTP - specifically WebMapService and
TileService - aware of and able to use multiple graphs, and produce correct
results based on an input routerId.

in analyst.core:
----------------

GeometryIndex:
 * now builds and manages a pedestrian geometry index for every
   loaded graph in graphService during initialisation.
 * Then later, any requests for indices must specify a routerId so appropriate
   graph is returned.

GeometryIndexService:
 * Specifies the changed API for GeometryIndex where routerId has to be passed
   in to relevant query functions.

SampleSource:
 * When requesting samples using getSample(), must now pass in a routerId.
   This specifies which graph (via updated GeometryIndex class) the samples
   will be taken from.

Tile:
 * In constructor, saves the routerId from the TileRequest arg as an
   attribute, so it can be used later when getting samples.

TemplateTile:
 * In its constructor when generating list of tiles to use, now passes in a
    routerId to getSample() so the samples are from appropriate graph.

DynamicTile:
 * In getSamples function, now uses saved routerId to generate tiles from
   correct routerId graph.

in analyst.request:
-------------------

SPTCache:
 * When generating new SPT on a cache miss, forced the graph context to use
   the routing requests' routerId so SPT is built on appropriate graph.

TileRequest:
 * Constructor now takes in a routerId - to specify which graph the requested
   tiles need to be takes from.
 * Equality check now includes check of new routerId param being equal

HashGridSampler:
 * Per SampleSource changes above, now takes in a routerId in getSample().
 * (TODO: this needs to be modified to create an index for each graph, too!)

SampleCache:
 * Implementing SampleSource() API changes above, getSample() now takes in a
   routerId and uses this when generating new samples.

SampleFactory:
 * Implementing SampleSource() API changes above, getSample() now takes in a
   routerId and uses this (by passing thru to GeometryIndex API calls) when
   generating new samples.

in routing.core:
----------------

RoutingRequest:
 * equality check now includes checking that routerId's match.
   This is necessary since when used as part of an SPTCache, we need the test
   to fail (and hence generate a new SPTCache) when routerIds for different
   graphs, even if all other parameters (time, location etc) are equal.

in api.ws.analyst:
------------------

TileService:
 * Use new TileRequest constructor that passes in the routerId

WebMapService:
 * again use new TileRequest constructor that passes in the routerId

Raster:
 * Updated to use appropriate APIs for TileRequest etc
   (Note:- seems this class is inactive since it tries to pass a (deprecated?)
    SPTRequest to renderer, whereas others pass a routingRequest. So haven't
    yet tried to get this to handle multiple graphs properly).
Updated the HashGridSampler so it should be able to handle multiple graphs.
(Note: not tested yet, seems this class isn't actively used anywhere in 0.10.x
code.)
Changes to multi-graph analyst handling classes to handle case where routerId
passed is "", IE we should use the default router ID / graph.
Merge branch 'allow-selection-graph-rest-wms-tile' into melbprod
Have updated the analyst client to be able to choose the graph to use
(currently hard-coded to list of two).