/// <summary> /// Searches for the closest point on the routing network that's routable for the given profiles. /// </summary> /// <returns></returns> public sealed override Result <RouterPoint> TryResolve(IProfileInstance[] profileInstances, float latitude, float longitude, Func <RoutingEdge, bool> isBetter, float maxSearchDistance = Constants.SearchDistanceInMeter) { try { if (!_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 = this.GetIsAcceptable(profileInstances); if (this.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(_db.Network.GetEdge(edge.Id))); }; } // create resolver. resolver = new ResolveAlgorithm(_db.Network.GeometricGraph, latitude, longitude, _db.Network.MaxEdgeDistance / 2, maxSearchDistance, isAcceptable, isBetterGeometric); } else { // create the custom resolver algorithm. resolver = this.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)); } }