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); }
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); }
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})"); }