private static RouteFeature[] GetBorderFeatures(RouteFeature[] features, PointPosition[] border) { return(features.Where(f => DistanceHelpers.SplitFeatureIntoLineSegments(border.Select(x => x.ToDoubleArray()).ToArray()).Any(x => DistanceHelpers.IsCloseToLine(x, f.Data.Coordinates.First().ToDoubleArray()) || DistanceHelpers.IsCloseToLine(x, f.Data.Coordinates.Last().ToDoubleArray()))).ToArray()); }
private void RecalculateLength(RouteDTO route) { var length = 0d; foreach (var s in DistanceHelpers.SplitFeatureIntoLineSegments(route.Data.Coordinates)) { length += DistanceHelpers.DistanceBetweenCoordinates(s.Item1, s.Item2); } route.Info.Length = Math.Round(length, 2); }
//private double[][] SorthPath(IList<double[][]> path) //{ // var tempPat = new List<double[][]>(path); // var lastSubPath = tempPat.First(); // tempPat.Remove(lastSubPath); // IEnumerable<double[]> coordinates = lastSubPath; // while (tempPat.Any()) // { // var newLastSubPath = // tempPat.FirstOrDefault(x => DistanceHelpers.AreClose(x.First(), coordinates.First())); // if (newLastSubPath != null) // { // tempPat.Remove(newLastSubPath); // coordinates = newLastSubPath.Reverse().Concat(coordinates); // continue; // } // newLastSubPath = tempPat.FirstOrDefault(x => DistanceHelpers.AreClose(x.First(), coordinates.Last())); // if (newLastSubPath != null) // { // tempPat.Remove(newLastSubPath); // coordinates = coordinates.Concat(newLastSubPath); // continue; // } // newLastSubPath = tempPat.FirstOrDefault(x => DistanceHelpers.AreClose(x.Last(), coordinates.First())); // if (newLastSubPath != null) // { // tempPat.Remove(newLastSubPath); // coordinates = newLastSubPath.Concat(coordinates); // continue; // } // newLastSubPath = tempPat.FirstOrDefault(x => DistanceHelpers.AreClose(x.Last(), coordinates.Last())); // if (newLastSubPath != null) // { // tempPat.Remove(newLastSubPath); // coordinates = coordinates.Concat(newLastSubPath.Reverse()); // continue; // } // throw new Exception("Something went wrong at path sorting"); // } // if (!coordinates.First().SequenceEqual(path.First().First())) coordinates = coordinates.Reverse(); // return coordinates.ToArray(); //} public static IList <RouteFeature> SortFeatures(List <RouteFeature> path, PointPosition startPosition, PointPosition endPosition) { var tempPat = new List <RouteFeature>(path); var lastSubPath = tempPat.First(); tempPat.Remove(lastSubPath); IEnumerable <RouteFeature> routeFeatures = new List <RouteFeature> { lastSubPath }; while (tempPat.Any()) { var newLastSubPath = tempPat.FirstOrDefault(x => DistanceHelpers.AreClose(x.Data.Coordinates.First().ToDoubleArray(), routeFeatures.First().Data.Coordinates.First().ToDoubleArray())); if (newLastSubPath != null) { tempPat.Remove(newLastSubPath); var result = new List <RouteFeature> { newLastSubPath }; result.AddRange(routeFeatures); newLastSubPath.Data.Coordinates = newLastSubPath.Data.Coordinates.Reverse().ToArray(); routeFeatures = result; continue; } newLastSubPath = tempPat.FirstOrDefault(x => DistanceHelpers.AreClose(x.Data.Coordinates.First().ToDoubleArray(), routeFeatures.Last().Data.Coordinates.Last().ToDoubleArray())); if (newLastSubPath != null) { tempPat.Remove(newLastSubPath); var result = new List <RouteFeature>(); result.AddRange(routeFeatures); result.Add(newLastSubPath); routeFeatures = result; continue; } newLastSubPath = tempPat.FirstOrDefault(x => DistanceHelpers.AreClose(x.Data.Coordinates.Last().ToDoubleArray(), routeFeatures.First().Data.Coordinates.First().ToDoubleArray())); if (newLastSubPath != null) { tempPat.Remove(newLastSubPath); var result = new List <RouteFeature> { newLastSubPath }; result.AddRange(routeFeatures); routeFeatures = result; continue; } newLastSubPath = tempPat.FirstOrDefault(x => DistanceHelpers.AreClose(x.Data.Coordinates.Last().ToDoubleArray(), routeFeatures.Last().Data.Coordinates.Last().ToDoubleArray())); if (newLastSubPath != null) { tempPat.Remove(newLastSubPath); var result = new List <RouteFeature>(); result.AddRange(routeFeatures); result.Add(newLastSubPath); newLastSubPath.Data.Coordinates = newLastSubPath.Data.Coordinates.Reverse().ToArray(); routeFeatures = result; continue; } throw new Exception("Something went wrong at feature sorting"); } if (!routeFeatures.First().Data.Coordinates.First().ToDoubleArray() .SequenceEqual(path.First().Data.Coordinates.First().ToDoubleArray())) { routeFeatures = routeFeatures.Reverse(); foreach (var f in routeFeatures) { f.Data.Coordinates = f.Data.Coordinates.Reverse().ToArray(); } } else if (routeFeatures.Count() == 1) { var projectionStart = DistanceHelpers.GetProjectionOnFeature( routeFeatures.First().Data.Coordinates.Select(x => x.ToDoubleArray()).ToArray(), startPosition.ToDoubleArray()); var projectionEnd = DistanceHelpers.GetProjectionOnFeature( routeFeatures.First().Data.Coordinates.Select(x => x.ToDoubleArray()).ToArray(), endPosition.ToDoubleArray()); var featureSegments = DistanceHelpers.SplitFeatureIntoLineSegments(routeFeatures.First().Data .Coordinates.Select(x => x.ToDoubleArray()).ToArray()); var indexStart = FindIndex(projectionStart.Item1, featureSegments); var indexEnd = FindIndex(projectionEnd.Item1, featureSegments); if (indexEnd < indexStart) { routeFeatures.First().Data.Coordinates = routeFeatures.First().Data.Coordinates.Reverse().ToArray(); } } return(routeFeatures.ToArray()); }
public RouteSearchResponseDTO FindRoute2(RouteSearchRequestDTO request) { if (request.Start == null) { throw new Exception("Maršruto pradžios taškas turi būti nurodytas"); } if (request.End == null) { throw new Exception("Maršruto pabaigos taškas turi būti nurodytas"); } if (request.PolygonPoints.Length < 4) { throw new Exception("Turėtų būti bent 3 duomenų ribokliai"); } CheckIfAllPoinsInsidePolygon(request); var line = new[] { request.Start.ToDoubleArray() }.Concat(request.Points.Select(x => x.ToDoubleArray())) .Concat(new[] { request.End.ToDoubleArray() }).ToArray(); var segments = DistanceHelpers.SplitFeatureIntoLineSegments(line); var usedFeatures = new List <RouteFeature>(); RouteDTO route = null; foreach (var s in segments) { var loadedData = Loader.LoadDataBetweenTwoPoints(s.Item1, s.Item2, request.PolygonPoints.Select(x => x.ToDoubleArray()).ToArray()); var graph = new Graph(loadedData.AllFeatures, request.SearchOptions); var path = graph.FindShortestPath(loadedData.StartFeature, loadedData.EndFeature, usedFeatures); if (path == null) { throw new Exception("Kelias nerastas"); } usedFeatures.AddRange(path); var tempRoute = PathToRoute(path, new PointPosition { Latitude = s.Item1[1], Longitude = s.Item1[0] }, new PointPosition { Latitude = s.Item2[1], Longitude = s.Item2[0] }); route = MergeTwoRoutes(route, tempRoute); } RecalculateLength(route); return(new RouteSearchResponseDTO(new[] { route })); }