private void DrawDynamicResult(byte[] bytes, int width, int height)
        {
            var currentFolder = _dataFolders.Last();

            //ДО того, что было
            var             oldImageFolder     = _dataFolders.First();
            var             oldDescription     = new LandsatDataDescription(oldImageFolder);
            CuttedImageInfo oldCuttedImageInfo = ClipImageHelper.GetCuttedImageInfoByPolygon(oldDescription.Channel4.Raw, _polygon);

            DrawLib.DrawNaturalColor(oldDescription.Channel4.Normalized
                                     , oldDescription.Channel3.Normalized
                                     , oldDescription.Channel2.Normalized,
                                     oldCuttedImageInfo, _pathToVisibleImage + "-old.png");



            var landsatDescription = new LandsatDataDescription(currentFolder);

            CuttedImageInfo cuttedImageInfo = ClipImageHelper.GetCuttedImageInfoByPolygon(landsatDescription.Channel4.Raw, _polygon);

            DrawLib.DrawMask(bytes, width, height, _pathToDynamicFile);

            DrawLib.DrawEdges(_pathToDynamicFile, _pathToEdgedDynamicFile);

            DrawChannelsAccordingToPhenomenonType(_phenomenon, landsatDescription, cuttedImageInfo);

            DrawLib.DrawMask(_pathToEdgedDynamicFile, _pathToVisibleImage + "4-3-2.png", _pathToVisibleDynamicFile);
        }
Exemple #2
0
        public override string[] Process(IGeographicPoint leftUpper, IGeographicPoint rigthLower, string dataFolder,
                                         string resultFolder)
        {
            var folderDescription = new LandsatDataDescription(dataFolder);

            var                  path             = folderDescription;
            LandsatMetadata      metadataFile     = JsonHelper.Deserialize <LandsatMetadata>(folderDescription.MetadataMtlJson);
            TirsThermalConstants thermalConstants = metadataFile.L1MetadataFile.TirsThermalConstants;
            var                  cuttedImageInfo  =
                ClipImageHelper.GetCuttedImageInfoByPolygon(folderDescription.Channel10.Raw,
                                                            new GeographicPolygon
            {
                UpperLeft  = leftUpper,
                LowerRight = rigthLower
            });

            using (var ds = Gdal.Open(folderDescription.Channel10.Raw, Access.GA_ReadOnly))
            {
                CalculateTemperature(ds.GetRasterBand(1),
                                     metadataFile.L1MetadataFile.RadiometricRescaling.RadianceMultBand11,
                                     metadataFile.L1MetadataFile.RadiometricRescaling.RadianceAddBand11,
                                     thermalConstants.K1ConstantBand11,
                                     thermalConstants.K2ConstantBand11,
                                     resultFolder,
                                     cuttedImageInfo
                                     );
            }

            return(new[] { resultFolder + "\\temperature.png" });
        }
        public override string[] Process(IGeographicPoint leftUpper, IGeographicPoint rigthLower, string dataFolder,
                                         string resultFolder)
        {
            var landsatDecription = new LandsatDataDescription(dataFolder);
            var cuttedImageInfo   =
                ClipImageHelper.GetCuttedImageInfoByPolygon(landsatDecription.Channel5.Raw,
                                                            new GeographicPolygon
            {
                UpperLeft  = leftUpper,
                LowerRight = rigthLower
            });


            try
            {
                string[] filePaths = Directory.GetFiles(@"C:\diplom\EMS.net\EMS\Services\CharacterizationService\CharacterizationService\Content");
                File.Copy(filePaths.Where(x => x.Contains("NDWI_legend.png")).First(), resultFolder + "\\NDWI_legend.png");
            }
            catch (Exception e)
            {
                Console.WriteLine("Файл уже существует");
            }

            CalculateNDWI(landsatDecription.Channel5.Normalized, landsatDecription.Channel6.Normalized,
                          cuttedImageInfo, resultFolder);

            return(new[] { resultFolder + "\\ndwi.png" });
        }
        public override string[] Process(IGeographicPoint leftUpper, IGeographicPoint rigthLower, string dataFolder, string resultFolder)
        {
            LandsatDataDescription landsatDescription = new LandsatDataDescription(dataFolder);

            CuttedImageInfo cuttedImageInfo =
                ClipImageHelper.GetCuttedImageInfoByPolygon(landsatDescription.Channel4.Raw,
                                                            new GeographicPolygon
            {
                UpperLeft  = leftUpper,
                LowerRight = rigthLower
            });

            string resultFileName;
            string redChannelFileName;
            string blueChannelFileName;
            string greenChannelFileName;

            switch (_characteristicType)
            {
            case CharacteristicType.Channels543:
            {
                redChannelFileName   = landsatDescription.Channel5.Normalized;
                greenChannelFileName = landsatDescription.Channel4.Normalized;
                blueChannelFileName  = landsatDescription.Channel3.Normalized;
                resultFileName       = resultFolder + "5-4-3.jpg";
                break;
            }

            case CharacteristicType.Channels753:
            {
                redChannelFileName   = landsatDescription.Channel7.Normalized;
                greenChannelFileName = landsatDescription.Channel5.Normalized;
                blueChannelFileName  = landsatDescription.Channel3.Normalized;
                resultFileName       = resultFolder + "7-5-3.jpg";
                break;
            }

            case CharacteristicType.Channels432:
            case CharacteristicType.Unknown:
            default:
            {
                redChannelFileName   = landsatDescription.Channel4.Normalized;
                greenChannelFileName = landsatDescription.Channel3.Normalized;
                blueChannelFileName  = landsatDescription.Channel2.Normalized;
                resultFileName       = resultFolder + "4-3-2.jpg";
                break;
            }
            }

            DrawLib.DrawNaturalColor(redChannelFileName
                                     , greenChannelFileName
                                     , blueChannelFileName,
                                     cuttedImageInfo, resultFileName);

            return(new string[] { resultFileName });
        }
        private void SaveDynamicGeoPoints()
        {
            var dynamicPoints         = DrawLib.GetMaskIndexes(_pathToEdgedDynamicFile);
            var landsatDescription    = new LandsatDataDescription(_dataFolders.Last());
            var currentTemporaryImage = landsatDescription.Channel4.Raw;

            var geographicPoints = ClipImageHelper.GetGeographicPointsByPointsIndexes(dynamicPoints, currentTemporaryImage, _polygon);

            JsonHelper.Serialize(_pathToDynamicPointsJson, geographicPoints);
        }
Exemple #6
0
        public static bool CloudValidation(string[] folders, GeographicPolygon polygon, string resultCloudMaskTifFilename, string resultCloudMaskPngFilename)
        {
            byte[]           cloudMask     = null;
            int              width         = 0;
            SpatialReference tifProjection = null;
            int              height        = 0;
            var              utmPolygon    = new UtmPolygon();

            foreach (var folder in folders)
            {
                var landsatData = new LandsatDataDescription(folder);
                var qaFile      = landsatData.ChannelBqa;

                using (var ds = Gdal.Open(qaFile, Access.GA_ReadOnly))
                {
                    double[] geotransform = new double[6];
                    ds.GetGeoTransform(geotransform);

                    utmPolygon = Helper.ConvertGeographicPolygonToUtm(polygon, ds);

                    using (var band = ds.GetRasterBand(1))
                    {
                        var projectionRef = ds.GetProjectionRef();
                        tifProjection = new SpatialReference(projectionRef);

                        var cuttedImageInfo = ClipImageHelper.GetCuttedImageInfoByPolygonData(utmPolygon, geotransform);

                        cloudMask = cloudMask ?? new byte[cuttedImageInfo.Width * cuttedImageInfo.Height];
                        cloudMask = GetCloudMaskByBandAndCoordinates(band, cuttedImageInfo, cloudMask);

                        width  = cuttedImageInfo.Width;
                        height = cuttedImageInfo.Height;
                    }
                }
            }

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

            double cloudedPointCount = cloudMask.Count(x => x != 0);

            var percentOfCloudedPoints = cloudedPointCount / cloudMask.Count();

            bool isValidCloudy = percentOfCloudedPoints < 0.14;

            tifProjection.ExportToWkt(out var inputShapeSrs);
            double[] argin = { polygon.UpperLeft.Latitude, 30, 0, polygon.UpperLeft.Longitude, 0, -30 };

            Helper.SaveDataInFile(resultCloudMaskTifFilename, cloudMask, width, height, DataType.GDT_Byte, argin, inputShapeSrs);
            DrawLib.DrawMask(cloudMask, width, height, resultCloudMaskPngFilename);

            return(isValidCloudy);
        }
        public bool Proccess()
        {
            //если невалидно, то говорим пользователю о том, что невозможно обнаружить явление и подсчитать его характеристики.
            _logger.Info($"Сервис обнаружения явления. Статус: валидация облачности.");
            var isValidCloudy = ValidationHelper.CloudValidation(_dataFolders, _polygon, _pathToCloudMaskTiffFile,
                                                                 _pathToCloudMaskPngFile);

            if (!isValidCloudy)
            {
                _logger.Info($"Сервис обнаружения явления. Статус: валидация на облачность не пройдена. Явление не обнаружено.");
            }

            var clusteringManager = new ClusteringManager();

            List <TemporaryData> temporaryDatas = new List <TemporaryData>();

            foreach (var folder in _dataFolders)
            {
                List <string> necessaryDataFiles = new List <string>();

                var landsatData = new LandsatDataDescription(folder);

                //  if (_phenomenon == PhenomenonType.ForestPlantationsDeseases)
                //  {
                //пока 5 6
                necessaryDataFiles.AddRange(
                    new[] { landsatData.Channel4.Normalized, landsatData.Channel5.Normalized });
                // }

                using (var isodataPointsReader = new LandsatIsodataPointsReader(necessaryDataFiles.ToArray()))
                {
                    List <Cluster> clusters             = new List <Cluster>();
                    var            jsonClustersFilename = string.Empty;

                    //if (_phenomenon == PhenomenonType.ForestPlantationsDeseases)
                    //{
                    jsonClustersFilename = FilenamesConstants.B4B5Clusters;
                    // }

                    if (landsatData.ClustersJson.Any())
                    {
                        var fullPathToClustersJson =
                            landsatData.ClustersJson.FirstOrDefault(f => f.Contains(jsonClustersFilename));

                        if (!string.IsNullOrEmpty(fullPathToClustersJson))
                        {
                            clusters = JsonHelper.Deserialize <List <Cluster> >(fullPathToClustersJson);
                        }
                    }
                    else
                    {
                        _pathToClustersFolder = $@"{folder}{FilenamesConstants.PathToClustersFolder}";
                        _logger.Info($"Сервис обнаружения явления. Текущее действие: кластеризация данных {string.Join(",", necessaryDataFiles)}");
                        clusters = clusteringManager.Process(isodataPointsReader, new NdviIsodataProfile());
                        JsonHelper.Serialize($"{_pathToClustersFolder}{jsonClustersFilename}", clusters);
                        _logger.Info($"Сервис обнаружения явления. Текущее действие: данные прошли кластеризацию. Кол-во кластеров: {clusters.Count}");
                    }

                    var temporaryData = new TemporaryData
                    {
                        Clusters        = clusters,
                        DataDescription = landsatData
                    };
                    temporaryDatas.Add(temporaryData);
                }
            }

            var cloudMask = Helper.GetCloudMaskFromFile(_pathToCloudMaskTiffFile);

            return(CalculateDynamic(temporaryDatas, cloudMask, _phenomenon));
        }
        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 async Task ProcessRequest(IDataNormalizationRequest request)
        {
            Logger.Info($"Получен запрос (RequestId = {request.RequestId}) на нормализацию данных в папке {request.Folder}");
            if (request.SatelliteType != SatelliteType.Landsat8)
            {
                throw new ArgumentException("Неверно задан тип спутника");
            }

            var folderDescription = new LandsatDataDescription(request.Folder);

            LandsatMetadata metadataFile                       = JsonHelper.Deserialize <LandsatMetadata>(folderDescription.MetadataMtlJson);
            LandsatNormalizationProcessor processor            = new LandsatNormalizationProcessor(Logger);
            RadiometricRescaling          radiometricRescaling = metadataFile.L1MetadataFile.RadiometricRescaling;
            ImageAttributes   imageAttributes                  = metadataFile.L1MetadataFile.ImageAttributes;
            MinMaxRadiance    minMaxRadiance                   = metadataFile.L1MetadataFile.MinMaxRadiance;
            MinMaxReflectance minMaxReflectance                = metadataFile.L1MetadataFile.MinMaxReflectance;

            #region Channel normalization

            var normalizationDataFolder = $@"{request.Folder}{FilenamesConstants.PathToNormalizedDataFolder}";

            if (!Directory.Exists(normalizationDataFolder))
            {
                Directory.CreateDirectory(normalizationDataFolder);
            }

            processor.Normalization(folderDescription.Channel1.Raw, normalizationDataFolder,
                                    radiometricRescaling.RadianceMultBand1, radiometricRescaling.RadianceAddBand1,
                                    imageAttributes.SunElevation, imageAttributes.EarthSunDistance,
                                    minMaxRadiance.RadianceMaximumBand1, minMaxReflectance.ReflectanceMaximumBand1);

            processor.Normalization(folderDescription.Channel2.Raw, normalizationDataFolder,
                                    radiometricRescaling.RadianceMultBand2, radiometricRescaling.RadianceAddBand2,
                                    imageAttributes.SunElevation, imageAttributes.EarthSunDistance,
                                    minMaxRadiance.RadianceMaximumBand2, minMaxReflectance.ReflectanceMaximumBand2);

            processor.Normalization(folderDescription.Channel3.Raw, normalizationDataFolder,
                                    radiometricRescaling.RadianceMultBand3, radiometricRescaling.RadianceAddBand3,
                                    imageAttributes.SunElevation, imageAttributes.EarthSunDistance,
                                    minMaxRadiance.RadianceMaximumBand3, minMaxReflectance.ReflectanceMaximumBand3);

            processor.Normalization(folderDescription.Channel4.Raw, normalizationDataFolder,
                                    radiometricRescaling.RadianceMultBand4, radiometricRescaling.RadianceAddBand4,
                                    imageAttributes.SunElevation, imageAttributes.EarthSunDistance,
                                    minMaxRadiance.RadianceMaximumBand4, minMaxReflectance.ReflectanceMaximumBand4);

            processor.Normalization(folderDescription.Channel5.Raw, normalizationDataFolder,
                                    radiometricRescaling.RadianceMultBand5, radiometricRescaling.RadianceAddBand5,
                                    imageAttributes.SunElevation, imageAttributes.EarthSunDistance,
                                    minMaxRadiance.RadianceMaximumBand5, minMaxReflectance.ReflectanceMaximumBand5);

            processor.Normalization(folderDescription.Channel6.Raw, normalizationDataFolder,
                                    radiometricRescaling.RadianceMultBand6, radiometricRescaling.RadianceAddBand6,
                                    imageAttributes.SunElevation, imageAttributes.EarthSunDistance,
                                    minMaxRadiance.RadianceMaximumBand6, minMaxReflectance.ReflectanceMaximumBand6);

            processor.Normalization(folderDescription.Channel7.Raw, normalizationDataFolder,
                                    radiometricRescaling.RadianceMultBand7, radiometricRescaling.RadianceAddBand7,
                                    imageAttributes.SunElevation, imageAttributes.EarthSunDistance,
                                    minMaxRadiance.RadianceMaximumBand7, minMaxReflectance.ReflectanceMaximumBand7);

            processor.Normalization(folderDescription.Channel8.Raw, normalizationDataFolder,
                                    radiometricRescaling.RadianceMultBand8, radiometricRescaling.RadianceAddBand8,
                                    imageAttributes.SunElevation, imageAttributes.EarthSunDistance,
                                    minMaxRadiance.RadianceMaximumBand8, minMaxReflectance.ReflectanceMaximumBand8);

            processor.Normalization(folderDescription.Channel9.Raw, normalizationDataFolder,
                                    radiometricRescaling.RadianceMultBand9, radiometricRescaling.RadianceAddBand9,
                                    imageAttributes.SunElevation, imageAttributes.EarthSunDistance,
                                    minMaxRadiance.RadianceMaximumBand9, minMaxReflectance.ReflectanceMaximumBand9);


            #endregion

            await _busManager.Send <IDataNormalizationResponse>(BusQueueConstants.DataNormalizationResponsesQueueName, new
            {
                RequestId = request.RequestId
            });

            Logger.Info($"Запрос обработан (RequestId = {request.RequestId})");
        }