Пример #1
0
        /// <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));
            }
        }