/// <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); }
/// <summary> /// Converts this line location to features. /// </summary> public static Coordinate ToCoordinate(this OpenLR.Model.Coordinate coordinate) { return(new Coordinate(coordinate.Longitude, coordinate.Latitude)); }