예제 #1
0
        /// <summary>
        /// Encodes a bearing based on the list of coordinates and the BEARDIST parameter.
        /// </summary>
        public static float EncodeBearing(List <OpenLR.Model.Coordinate> coordinates)
        {
            var distance = 0.0;
            var previous = coordinates[0];

            OpenLR.Model.Coordinate bearingPosition = null;
            for (int idx = 1; idx < coordinates.Count; idx++)
            {
                var current = new OpenLR.Model.Coordinate()
                {
                    Latitude  = coordinates[idx].Latitude,
                    Longitude = coordinates[idx].Longitude
                };
                var currentSegmentDistance = Coordinate.DistanceEstimateInMeter((float)current.Latitude, (float)current.Longitude,
                                                                                (float)previous.Latitude, (float)previous.Longitude);
                var currentDistance = currentSegmentDistance + distance;
                if (currentDistance > Parameters.BEARDIST)
                { // the coordinate to calculate the beardist is in this segment!
                    // calculate where.
                    var relativeDistance = Parameters.BEARDIST - distance;
                    var relativeOffset   = relativeDistance / currentSegmentDistance;

                    bearingPosition = new OpenLR.Model.Coordinate()
                    {
                        Latitude  = (float)(previous.Latitude + ((current.Latitude - previous.Latitude) * relativeOffset)),
                        Longitude = (float)(previous.Longitude + ((current.Longitude - previous.Longitude) * relativeOffset))
                    };
                    break;
                }
                distance = currentDistance;
                previous = current;
            }
            if (bearingPosition == null)
            { // use the toCoordinate as the last 'current'.
                // if edge is too short use target coordinate.
                bearingPosition = coordinates[coordinates.Count - 1];
            }

            var north = new Coordinate((float)coordinates[0].Latitude + 1, (float)coordinates[0].Longitude);

            var angleRadians = DirectionCalculator.Angle(new Coordinate((float)bearingPosition.Latitude, (float)bearingPosition.Longitude),
                                                         new Coordinate((float)coordinates[0].Latitude, (float)coordinates[0].Longitude), north);
            var angleDegrees = (float)(angleRadians * (180 / Math.PI));

            return(angleDegrees);
        }
예제 #2
0
 /// <summary>
 /// Converts this line location to features.
 /// </summary>
 public static Coordinate ToCoordinate(this OpenLR.Model.Coordinate coordinate)
 {
     return(new Coordinate(coordinate.Longitude, coordinate.Latitude));
 }