Exemplo n.º 1
0
        private void PrepareGameObjects()
        {
            _gameType = new GameAccountabilityType()
            {
                Name = "Bowling Game"
            };
            _scoreUnit = new Unit()
            {
                Name = "Points"
            };
            _phenomenonType = new PhenomenonType {
                Name = "Score"
            };

            PrepareLanes();
        }
        public DeterminingPhenomenonProcessor(LogWriter logger, string[] dataFolders, string resultFolder, GeographicPolygon polygon,
                                              PhenomenonType phenomenon)
        {
            _logger       = logger;
            _dataFolders  = dataFolders;
            _resultFolder = resultFolder;
            _phenomenon   = phenomenon;
            _polygon      = polygon;

            _pathToCloudMaskTiffFile  = $@"{_resultFolder}{FilenamesConstants.PathToCloudMaskTiffFile}";
            _pathToCloudMaskPngFile   = $@"{_resultFolder}{FilenamesConstants.PathToCloudMaskPngFile}";
            _pathToDynamicFile        = $@"{_resultFolder}{FilenamesConstants.PathToDynamicFile}";
            _pathToEdgedDynamicFile   = $@"{_resultFolder}{FilenamesConstants.PathToEdgedDynamicFile}";
            _pathToVisibleImage       = $@"{_resultFolder}{FilenamesConstants.PathToVisibleImage}";
            _pathToVisibleDynamicFile = $@"{_resultFolder}{FilenamesConstants.PathToVisibleDynamicFile}";
            _pathToDynamicPointsJson  = $@"{_resultFolder}{FilenamesConstants.PathToDynamicGeoPointsJson}";
        }
        private void DrawChannelsAccordingToPhenomenonType(PhenomenonType phenomenonType
                                                           , LandsatDataDescription landsatDescription
                                                           , CuttedImageInfo cuttedImageInfo)
        {
            switch (phenomenonType)
            {
            case PhenomenonType.ForestPlantationsDeseases:
            {
                DrawLib.DrawNaturalColor(landsatDescription.Channel4.Normalized
                                         , landsatDescription.Channel3.Normalized
                                         , landsatDescription.Channel2.Normalized,
                                         cuttedImageInfo, _pathToVisibleImage + "4-3-2.png");

                DrawLib.DrawNaturalColor(landsatDescription.Channel5.Normalized
                                         , landsatDescription.Channel4.Normalized
                                         , landsatDescription.Channel3.Normalized,
                                         cuttedImageInfo, _pathToVisibleImage + "5-4-3.png");

                DrawLib.DrawNaturalColor(landsatDescription.Channel7.Normalized
                                         , landsatDescription.Channel5.Normalized
                                         , landsatDescription.Channel3.Normalized,
                                         cuttedImageInfo, _pathToVisibleImage + "7-5-3.png");
            } break;

            case PhenomenonType.SoilErosion:
            {
                DrawLib.DrawNaturalColor(landsatDescription.Channel7.Normalized
                                         , landsatDescription.Channel5.Normalized
                                         , landsatDescription.Channel3.Normalized,
                                         cuttedImageInfo, _pathToVisibleImage + "7-5-3.png");

                DrawLib.DrawNaturalColor(landsatDescription.Channel4.Normalized
                                         , landsatDescription.Channel3.Normalized
                                         , landsatDescription.Channel2.Normalized,
                                         cuttedImageInfo, _pathToVisibleImage + "4-3-2.png");
            }  break;

            case PhenomenonType.SoilPollutionByOilProducts:
            {
                DrawLib.DrawNaturalColor(landsatDescription.Channel4.Normalized
                                         , landsatDescription.Channel3.Normalized
                                         , landsatDescription.Channel2.Normalized,
                                         cuttedImageInfo, _pathToVisibleImage + "4-3-2.png");
            }  break;

            case PhenomenonType.SurfaceDumps:
            {
                DrawLib.DrawNaturalColor(landsatDescription.Channel4.Normalized
                                         , landsatDescription.Channel3.Normalized
                                         , landsatDescription.Channel2.Normalized,
                                         cuttedImageInfo, _pathToVisibleImage + "4-3-2.png");
            }  break;

            case PhenomenonType.Unknown:
            {
                DrawLib.DrawNaturalColor(landsatDescription.Channel4.Normalized
                                         , landsatDescription.Channel3.Normalized
                                         , landsatDescription.Channel2.Normalized,
                                         cuttedImageInfo, _pathToVisibleImage + "4-3-2.png");
            } break;
            }
        }
        private bool CalculateDynamic(List <TemporaryData> temporaryDatas,
                                      byte[] cloudMask, PhenomenonType phenomenon)
        {
            _logger.Info($"Сервис обнаружения явления. Статус: определение динамики изменений за {temporaryDatas.Count} лет");
            SetTemporaryCuttedBuffers(temporaryDatas);

            if (!ValidationHelper.ValidateBuffers(temporaryDatas.Select(datas => datas.Buffers)))
            {
                return(false);
            }

            //получаем данные за последнюю временную область
            var currentTemporaryBuffers = temporaryDatas.LastOrDefault();

            if (currentTemporaryBuffers == null)
            {
                return(false);
            }

            //получаем любой снимок за последнюю временную область, чтобы определить результирующие ширину и высоту маски динамики
            var currentImageTemporaryDataImage = currentTemporaryBuffers.Buffers.Channels[Landsat8Channel.Channel4];

            var width  = currentImageTemporaryDataImage.GetLength(1);
            var heigth = currentImageTemporaryDataImage.GetLength(0);

            var dymanicMask = new byte[width * heigth];

            var pastTemporaryDatasBuffers = temporaryDatas.Take(temporaryDatas.Count - 1).ToList();

            for (int row = 0; row < heigth; row++)
            {
                for (int col = 0; col < width; col++)
                {
                    if (!ValidationHelper.ValidatePointByCloudMask(cloudMask, row, col, width))
                    {
                        continue;
                    }

                    double pastNdvi = Helper.CalculateAverageNdviForPastTemporaryPoint(pastTemporaryDatasBuffers, row, col);

                    double currentNdvi = Helper.CalculateNdviForCurrentTemporaryPoint(currentTemporaryBuffers, row, col);

                    double dynamic = -1.0;

                    //if (phenomenon == PhenomenonType.ForestPlantationsDeseases)
                    //{
                    dynamic = pastNdvi >= 0.2 && pastNdvi < 1
                            ? (pastNdvi > currentNdvi
                                ? Math.Abs(currentNdvi - pastNdvi) / currentNdvi
                                : 0)
                            : 0;
                    //}

                    dymanicMask[row * width + col] = (byte)(dynamic >= 0.3 ? 1 : 0);
                }
            }

            int amountDynamicPoints = dymanicMask.Count(p => p > 0);

            //if (amountDynamicPoints < 30)
            //{
            //    _logger.Info($"Сервис обнаружения явления. Статус: динамика измнений обнаружена, но имеет очень слабое воздействие на выбранную область.");
            //    return false;
            //}

            _logger.Info($"Сервис обнаружения явления. Статус: отрисовка результатов динамики.");
            DrawDynamicResult(dymanicMask, width, heigth);
            SaveDynamicGeoPoints();

            return(true);
        }