Created
August 9, 2017 11:45
-
-
Save xivk/d5543d8be128dfca2ac9d802b8f7c1f0 to your computer and use it in GitHub Desktop.
A more aggressive resolver function.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/// <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