Exemplo n.º 1
0
        private static SkimValue GetValue(int origin, int destination, RosterEntry entry, int minute)
        {
            if (entry.Name == null)
            {
                return(new SkimValue());
            }

            SkimMatrix skimMatrix = _skimMatrices[entry.MatrixIndex];

            if (skimMatrix.IsEmpty())
            {
                return(new SkimValue {
                    Variable = 0, BlendVariable = 0
                });
            }
            if (skimMatrix == null)
            {
                throw new SkimMatrixNotFoundException(string.Format("There is not a skim matrix defined for the combination of variable: {0}, mode: {1}, path type: {2}, and minute: {3}. Please adjust the roster accordingly.", entry.Variable, entry.Mode, entry.PathType, minute));
            }

            SkimValue skimValue = new SkimValue {
                Variable = entry.Transpose ? skimMatrix.GetValue(destination, origin) : skimMatrix.GetValue(origin, destination)
            };

            skimValue.Variable = skimValue.Variable / entry.Scaling;

            skimValue.Variable = skimValue.Variable * entry.Factor;

            return(skimValue);
        }
Exemplo n.º 2
0
        public static SkimValue GetValue(string variable, int mode, int pathType, double vot, int minute, int origin, int destination)
        {
            int         votGroup  = GetVotGroup(vot);
            RosterEntry entry     = GetEntry(variable, mode, pathType, votGroup, minute);
            SkimValue   skimValue = GetValue(origin, destination, entry, minute);

            //mb fix for 0 intrazonals
            if (origin == destination && skimValue.Variable < Constants.EPSILON)
            {
                if (variable == "distance")
                {
                    skimValue.Variable = 0.25 * Global.Settings.DistanceUnitsPerMile;
                }
                else if (variable == "ivtime" || variable == "time" || variable == "ivtfree")
                {
                    skimValue.Variable =
                        (mode == Global.Settings.Modes.Walk) ? 5 :
                        (mode == Global.Settings.Modes.Bike) ? 2 :
                        (mode > Global.Settings.Modes.Bike && mode < Global.Settings.Modes.Transit) ? 1 : 0;
                }
            }

            if (string.IsNullOrEmpty(entry.BlendVariable))
            {
                return(skimValue);
            }

            RosterEntry blendEntry =
                entry.BlendPathType == Global.Settings.PathTypes.None
                    ? GetEntry(entry.BlendVariable, entry.Mode, entry.PathType, votGroup, minute)
                    : GetEntry(entry.BlendVariable, entry.Mode, entry.BlendPathType, votGroup, minute);
            SkimValue blendSkimValue = GetValue(origin, destination, blendEntry, minute);

            skimValue.BlendVariable = blendSkimValue.Variable;

            //mb fix for 0 intrazonals. Assumes blend variable is distance
            if (origin == destination && skimValue.BlendVariable < Constants.EPSILON)
            {
                skimValue.BlendVariable = 0.25 * Global.Settings.DistanceUnitsPerMile;
            }

            return(skimValue);
        }
Exemplo n.º 3
0
        public static SkimValue GetValue(string variable, int mode, int pathType, double vot, int minute, IPoint origin, IPoint destination, double circuityDistance = Constants.DEFAULT_VALUE)
        {
            int         votGroup  = GetVotGroup(vot);
            RosterEntry entry     = GetEntry(variable, mode, pathType, votGroup, minute);
            SkimValue   skimValue = GetValue(origin.ZoneId, destination.ZoneId, entry, minute);

            //mb fix for 0 intrazonals
            if (Global.Configuration.DestinationScale == Global.Settings.DestinationScales.Zone && origin.ZoneId == destination.ZoneId && skimValue.Variable < Constants.EPSILON)
            {
                if (variable == "distance")
                {
                    skimValue.Variable = 0.25 * Global.Settings.DistanceUnitsPerMile;
                }
                else if (variable == "ivtime" || variable == "time" || variable == "ivtfree")
                {
                    skimValue.Variable =
                        (mode == Global.Settings.Modes.Walk) ? 5 :
                        (mode == Global.Settings.Modes.Bike) ? 2 :
                        (mode > Global.Settings.Modes.Bike && mode < Global.Settings.Modes.Transit) ? 1 : 0;
                }
            }


            if (string.IsNullOrEmpty(entry.BlendVariable))
            {
                return(skimValue);
            }


            RosterEntry blendEntry =
                entry.BlendPathType == Global.Settings.PathTypes.None
                    ? GetEntry(entry.BlendVariable, entry.Mode, entry.PathType, votGroup, minute)
                    : GetEntry(entry.BlendVariable, entry.Mode, entry.BlendPathType, votGroup, minute);
            SkimValue blendSkimValue = GetValue(origin.ZoneId, destination.ZoneId, blendEntry, minute);

            if (Global.Configuration.DestinationScale == Global.Settings.DestinationScales.Zone)
            {
                //skimValue.BlendVariable = blendSkimValue.BlendVariable;
                skimValue.BlendVariable = blendSkimValue.Variable; //JLB replaced above line 20130628

                //mb fix for 0 intrazonals. Assumes blend variable is distance
                if (origin.ZoneId == destination.ZoneId && skimValue.BlendVariable < Constants.EPSILON)
                {
                    skimValue.BlendVariable = 0.25 * Global.Settings.DistanceUnitsPerMile;
                }

                return(skimValue);
            }

            double networkDistance = blendSkimValue.Variable;
            double networkFraction = networkDistance / Global.Configuration.MaximumBlendingDistance;

            if (networkFraction > 1)
            {
                networkFraction = 1;
            }
            //intrazonals - use network fraction = 0, so blend distance is XY distance
            if (origin.ZoneId == destination.ZoneId)
            {
                networkFraction = 0;
            }

            double xyDistance;

            if (networkFraction >= 1)
            {
                // no blending
                xyDistance = networkDistance;
            }
            else if (circuityDistance > Constants.DEFAULT_VALUE + Constants.EPSILON)
            {
                // blending with circuity value
                //Global.PrintFile.WriteLine("Distances: Network {0} Circuity {1} Orthogonal {2}", networkDistance, circuityDistance,
                //    (Math.Abs(origin.XCoordinate - destination.XCoordinate) + Math.Abs(origin.YCoordinate - destination.YCoordinate)) / 5280D);
                xyDistance = circuityDistance;
            }
            else
            {
                if (Global.Configuration.DataType == "Actum")
                {
                    xyDistance = (Math.Abs(origin.XCoordinate - destination.XCoordinate) + Math.Abs(origin.YCoordinate - destination.YCoordinate)) / 5280D;
                }
                else
                {
                    // default is orthogonal distance, with a miniumum of 300 feet for intra-microzone
                    xyDistance = Math.Max(300D, (Math.Abs(origin.XCoordinate - destination.XCoordinate) + Math.Abs(origin.YCoordinate - destination.YCoordinate))) / 5280D;
                }
            }

            if (networkDistance >= Constants.EPSILON && xyDistance >= Constants.EPSILON)
            {
                skimValue.BlendVariable = networkFraction * networkDistance + (1 - networkFraction) * xyDistance;
            }
            else if (xyDistance >= Constants.EPSILON)
            {
                skimValue.BlendVariable = xyDistance;
            }
            else if (networkDistance >= Constants.EPSILON)
            {
                skimValue.BlendVariable = networkDistance;
            }
            else
            {
                skimValue.BlendVariable = 0;
            }

            if (!skimValue.BlendVariable.AlmostEquals(Constants.DEFAULT_VALUE))
            {
                //new code for intrazonals allows overriding use of speed from skims
                if (Global.Configuration.DataType != "Actum" && (origin.ZoneId == destination.ZoneId))
                {
                    double minutesPerMile =
                        (mode == Global.Settings.Modes.Walk && Global.Configuration.IntrazonalWalkMinutesPerMile_OverrideSkims > Constants.EPSILON) ? Global.Configuration.IntrazonalWalkMinutesPerMile_OverrideSkims
            : (mode == Global.Settings.Modes.Bike && Global.Configuration.IntrazonalBikeMinutesPerMile_OverrideSkims > Constants.EPSILON) ? Global.Configuration.IntrazonalBikeMinutesPerMile_OverrideSkims
            : (mode >= Global.Settings.Modes.Sov && mode <= Global.Settings.Modes.Hov3 && Global.Configuration.IntrazonalAutoMinutesPerMile_OverrideSkims > Constants.EPSILON) ? Global.Configuration.IntrazonalAutoMinutesPerMile_OverrideSkims
            : networkDistance >= Constants.EPSILON ? skimValue.Variable / networkDistance
            : mode == Global.Settings.Modes.Walk ? 20.0
            : mode == Global.Settings.Modes.Bike ? 6.0 : 3.0;

                    skimValue.Variable = skimValue.BlendVariable * minutesPerMile;
                }
                else if (networkDistance >= Constants.EPSILON)
                {
                    double minutesPerMile = skimValue.Variable / networkDistance;
                    skimValue.Variable = skimValue.BlendVariable * minutesPerMile;
                }
                else // if networkDistance is 0 or tiny, cannot use pivot method, multiply blend distance by default speed depending on mode
                // TODO: Make these constants for minutesPerMile configurable.
                {
                    double minutesPerMile = entry.Mode == Global.Settings.Modes.Walk ? 20.0 :
                                            entry.Mode == Global.Settings.Modes.Bike ? 6.0 : 3.0;
                    skimValue.Variable = skimValue.BlendVariable * minutesPerMile;
                }
            }

            return(skimValue);
        }