public RouteData Split(RouteData routeData, string routingType) { var allRoutePoints = routeData.segments.SelectMany(s => s.latlngzs).ToList(); var coordinates = ToWgs84Coordinates(allRoutePoints); int maximumPoints = Math.Max(3, Math.Min((int)(new LineString(coordinates).Length / MINIMAL_SEGMENT_LENGTH), MAX_SEGMENTS_NUMBER)); var currentTolerance = MINIMAL_TOLERANCE; Coordinate[] simplifiedCoordinates; do { simplifiedCoordinates = DouglasPeuckerLineSimplifier.Simplify(coordinates, currentTolerance); currentTolerance *= 2; } while (simplifiedCoordinates.Length > maximumPoints); var manipulatedRouteData = new RouteData { segments = new List<RouteSegmentData> { new RouteSegmentData { routePoint = allRoutePoints.First(), latlngzs = new List<LatLngZ> { allRoutePoints.First(), allRoutePoints.First() } } }, name = routeData.name }; for (int index = 1; index < simplifiedCoordinates.Length; index++) { var currentIndex = coordinates.ToList().IndexOf(simplifiedCoordinates[index]); coordinates = coordinates.Skip(currentIndex).ToArray(); var latLngz = allRoutePoints.Take(currentIndex + 1).ToList(); allRoutePoints = allRoutePoints.Skip(currentIndex).ToList(); manipulatedRouteData.segments.Add(new RouteSegmentData { latlngzs = latLngz, routePoint = latLngz.Last(), routingType = routingType }); } return manipulatedRouteData; }
public void SimplifyRouteWithTwoPoints_ShouldNotBeSimplified() { var routeToSimplify = new RouteData { segments = new List<RouteSegmentData> { new RouteSegmentData { latlngzs = new List<LatLngZ> { new LatLngZ {lat = 1, lng = 1}, new LatLngZ {lat = 2, lng = 2} } } } }; var route = _service.Split(routeToSimplify, RoutingType.HIKE); Assert.AreEqual(2, route.segments.Count); }
public void SimplifyRoundRoute() { var routeToSimplify = new RouteData { segments = new List<RouteSegmentData> { new RouteSegmentData { latlngzs = new List<LatLngZ> { new LatLngZ {lat = 1, lng = 1}, new LatLngZ {lat = 2, lng = 2}, new LatLngZ {lat = 3, lng = 3}, new LatLngZ {lat = 4, lng = 4}, new LatLngZ {lat = 1, lng = 1}, } } } }; var route = _service.Split(routeToSimplify, RoutingType.HIKE); Assert.IsTrue(route.segments.Count <= 5); }