public static Task Execute(ConvertVerb command, ILogger logger)
        {
            if (File.Exists(command.InputFile) == false)
            {
                logger.Fatal("Input file does not exist!");
                Environment.Exit(0);
            }

            var baseOutput = string.Join(".", command.InputFile.Split(".").SkipLast(1));
            var reader     = FileFormatDetector.GetCloudStreamReader(command.InputFile, command.InputFormat);

            using var writer = FileFormatDetector.GetCloudStreamWriter(
                      command.OutputFile ?? $"{baseOutput}.{command.OutputFormat.ToString().ToLower()}",
                      command.OutputFormat
                      );

            var ps = reader.ReadPointSet();

            while (ps != null)
            {
                writer.WritePointSet(ps);
                ps = reader.ReadPointSet();
            }

            return(Task.CompletedTask);
        }
Exemple #2
0
        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));
        }
        public void TestDetectStreamNotAt0()
        {
            using (var stream = new MemoryStream())
            {
                var data = new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
                stream.Write(data, 0, data.Length);
                stream.Position = 4;

                var matcher = new SimpleLogFileFormatMatcher(null);

                var detector = new FileFormatDetector(matcher);
                detector.TryDetermineFormat("", stream, Encoding.Default);

                matcher.Header.Should().NotBeNull("because the matcher should have been called");
                matcher.Header.Length.Should().Be(data.Length, "because the detector should have first repositioned the stream to 0 and forwarded all first 512 bytes to the matcher");
            }
        }
        public static Task Execute(SliceCommand command, ILogger logger)
        {
            if (File.Exists(command.Input) == false)
            {
                logger.Fatal("Provided cloud point data file does not exist!");
                Environment.Exit(0);
            }

            using var streamReader = FileFormatDetector.GetCloudStreamReader(command.Input);
            if (streamReader == null)
            {
                logger.Fatal("Not supported data format.");
                Environment.Exit(0);
            }

            if (File.Exists(command.TerrainPath) == false)
            {
                logger.Fatal("Terrain file does not exist!");
                Environment.Exit(0);
            }

            var cloud   = new Cloud(streamReader);
            var terrain = Terrain.Import(command.TerrainPath);


            var slices = cloud.Slice(command.SliceHeight).Where(slice => slice != null).OrderBy(slice => slice.Height).ToList();

            foreach (var pointSlice in slices)
            {
                foreach (var pointSet in pointSlice.PointSets)
                {
                    foreach (var point in pointSet)
                    {
                        point.Z -= terrain.GetHeight(point);
                    }
                }
            }
            using var writer = new GpdWriter(command.Output, null, (float)command.SliceHeight);
            writer.WriteSlices(slices);

            return(Task.CompletedTask);
        }
        public static Task Execute(TerrainCommand command, ILogger logger)
        {
            if (File.Exists(command.Input) == false)
            {
                logger.Fatal("Provided cloud point data file does not exist!");
                Environment.Exit(0);
            }

            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, command.MaxHeight);

            terrain.Export(command.Output);

            return(Task.CompletedTask);
        }
        public void TestSkipDetectionAfterCertaintySure()
        {
            using (var stream = new MemoryStream())
            {
                var data = new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
                stream.Write(data, 0, data.Length);
                stream.Position = 4;

                var matcher = new SimpleLogFileFormatMatcher(null, Certainty.None);

                var detector = new FileFormatDetector(matcher);
                detector.TryDetermineFormat("", stream, Encoding.Default).Should().Be(LogFileFormats.GenericText, "because our detector couldn't find a format so the fallback should be generic text");
                matcher.NumInvocations.Should().Be(1, "because the detector should try at least once");

                matcher.Format    = LogFileFormats.Csv;
                matcher.Certainty = Certainty.Sure;
                detector.TryDetermineFormat("", stream, Encoding.Default).Should().Be(LogFileFormats.Csv, "because now our detector could find a match and this should have been forward instead of generic text");
                matcher.NumInvocations.Should().Be(2, "because the last invocation our matcher was uncertain and thus the detector should have asked again");

                detector.TryDetermineFormat("", stream, Encoding.Default).Should().Be(LogFileFormats.Csv);
                matcher.NumInvocations.Should().Be(2, "because our matcher was certain it is a CSV file so the detector shouldn't have bothered to ask the matcher again");
            }
        }