/// <summary> /// Resolves a location but also checks if it's connected to the rest of the network. /// </summary> public static Result <RouterPoint> TryResolveConnected(this RouterBase router, IProfileInstance profileInstance, float latitude, float longitude, float radiusInMeter = 2000, float maxSearchDistance = Constants.SearchDistanceInMeter, bool?forward = null) { var isAcceptable = router.GetIsAcceptable(profileInstance); var resolver = new Algorithms.Search.ResolveAlgorithm(router.Db.Network.GeometricGraph, latitude, longitude, radiusInMeter, maxSearchDistance, (edge) => { // check if the edge is acceptable for the profile. if (!isAcceptable(edge)) { return(false); } // create a temp resolved point in the middle of this edge. var tempRouterPoint = new RouterPoint(0, 0, edge.Id, ushort.MaxValue / 2); var connectivityResult = router.TryCheckConnectivity(profileInstance, tempRouterPoint, radiusInMeter, forward); if (connectivityResult.IsError) { // if there is an error checking connectivity, choose not report it, just don't choose this point. return(false); } return(connectivityResult.Value); }); resolver.Run(); if (!resolver.HasSucceeded) { // something went wrong. return(new Result <RouterPoint>(resolver.ErrorMessage, (message) => { return new Itinero.Exceptions.ResolveFailedException(message); })); } return(new Result <RouterPoint>(resolver.Result)); }