private static Task <IList <Tree> > ExecuteFromRaw(DetectTreesCommand command, ILogger logger) { using var streamReader = FileFormatDetector.GetCloudStreamReader(command.Input); if (streamReader == null) { logger.Fatal("Not supported data format."); Environment.Exit(0); } var cloud = new Cloud(streamReader); var terrain = new Terrain(cloud, command.Resolution); foreach (var point in cloud) { point.Z -= terrain.GetHeight(point); } var slices = cloud .Slice(command.SliceHeight.GetValueOrDefault(0.1)) .Where(slice => slice != null).OrderBy(slice => slice.Height) .ToList(); var pointSetGroups = FilteringFlow.GetFilteredPointSetGroups(command.FiltersConfigurationFile, logger, slices); var pointSetGroup = new PointSetGroup(pointSetGroups.SelectMany(p => p.PointSets).ToList()); var trees = Detect(pointSetGroup); return(Task.FromResult(trees)); }
/// <summary> /// </summary> /// <param name="cloud"></param> /// <param name="detectionParameters"></param> /// <param name="mergingParameters"></param> /// <returns></returns> public IList <Tree> DetectPotentialTrees(Cloud cloud, DetectionParameters detectionParameters, MergingParameters mergingParameters) { var pointSets = DetectTrunkPointSets(cloud, detectionParameters).SelectMany(group => group.PointSets).ToList(); var pointSetGroup = new PointSetGroup(pointSets); var potentialTrees = pointSetGroup.BuildTrees(mergingParameters); return(FilterTrees(potentialTrees, detectionParameters.TreeFilters)); }
private static Task <IList <Tree> > ExecuteFromProcessed(DetectTreesCommand command, ILogger logger) { using var reader = new GpdReader(command.Input); var cloud = reader.ReadPointSlices().SelectMany(slice => slice.PointSets).ToList(); var pointSetGroup = new PointSetGroup(cloud); var trees = Detect(pointSetGroup); return(Task.FromResult(trees)); }
private static IList <Tree> Detect(PointSetGroup pointSetGroup) { var mergingParameters = new MergingParameters { MinimumRegressionGroupingDistance = 0.09, MaximumGroupingEmptyHeight = 20, MinimumGroupingDistance = 0.35, }; var treeFilters = new List <ITreeFilter> { new TreeHeightFilter { MinimalTreeHeight = 4 } }; var potentialTrees = pointSetGroup.BuildTrees(mergingParameters); return(FilterTrees(potentialTrees, treeFilters)); }