Skip to content

Instantly share code, notes, and snippets.

@xivk
Created August 9, 2017 11:45
Show Gist options
  • Save xivk/d5543d8be128dfca2ac9d802b8f7c1f0 to your computer and use it in GitHub Desktop.
Save xivk/d5543d8be128dfca2ac9d802b8f7c1f0 to your computer and use it in GitHub Desktop.
A more aggressive resolver function.
/// <summary>
/// Searches for the closest point on the routing network that's routable for the given profiles.
/// </summary>
/// <returns></returns>
public static Result<RouterPoint> TryResolve2(this Router router, IProfileInstance[] profileInstances, float latitude, float longitude,
Func<RoutingEdge, bool> isBetter, float maxSearchDistance = Constants.SearchDistanceInMeter)
{
try
{
if (!router.Db.SupportsAll(profileInstances))
{
return new Result<RouterPoint>("Not all routing profiles are supported.", (message) =>
{
return new Exceptions.ResolveFailedException(message);
});
}
IResolver resolver = null;
// get is acceptable.
var isAcceptable = router.GetIsAcceptable(profileInstances);
if (router.CreateCustomResolver == null)
{ // just use the default resolver algorithm.
Func<GeometricEdge, bool> isBetterGeometric = null;
if (isBetter != null)
{ // take into account isBetter function.
isBetterGeometric = (edge) =>
{
return isBetter(router.Db.Network.GetEdge(edge.Id));
};
}
// create resolver.
resolver = new ResolveAlgorithm(router.Db.Network.GeometricGraph, latitude, longitude,
router.Db.Network.MaxEdgeDistance,
maxSearchDistance, isAcceptable, isBetterGeometric);
}
else
{ // create the custom resolver algorithm.
resolver = router.CreateCustomResolver(latitude, longitude, isAcceptable, isBetter);
}
resolver.Run();
if (!resolver.HasSucceeded)
{ // something went wrong.
return new Result<RouterPoint>(resolver.ErrorMessage, (message) =>
{
return new Exceptions.ResolveFailedException(message);
});
}
return new Result<RouterPoint>(resolver.Result);
}
catch (Exception ex)
{
return new Result<RouterPoint>(ex.Message, (m) => ex);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment