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);
        }