double GetExactApproach(MerkelData merkelData)
        {
            double approach;
            double delta = 1.0;

            //---------------------------------------------------------------------
            // Find approach within .001
            //---------------------------------------------------------------------
            for (approach = 0.0; approach < 100.0; approach += delta)
            {
                merkelData.Approach = approach;
                double kavl = CalculationLibrary.CalculateMerkel(merkelData);

                if (delta > 0.9)
                {
                    if (kavl < merkelData.KaV_L)
                    {
                        delta = -0.001;
                    }
                    else
                    {
                        break; // calculation error?
                    }
                }
                else
                {
                    if (kavl >= merkelData.KaV_L)
                    {
                        approach = Math.Round(approach, 3, MidpointRounding.ToEven);
                        break;
                    }
                }
            }
            return(approach);
        }
示例#2
0
        public bool MerkelCalculation(MerkelData data, out string errorMessage)
        {
            data.Range    = data.HotWaterTemperature - data.ColdWaterTemperature;
            data.Approach = data.ColdWaterTemperature - data.WetBulbTemperature;

            CalculationLibrary.CalculateMerkel(data);

            return(Merkel_CheckCalculationValues(data, out errorMessage));
        }
        public bool Psychrometrics_DryBulbTemperature_RelativeHumidity_Calculation(PsychrometricsData data, out string errorMessage)
        {
            if (data.IsInternationalSystemOfUnits_IS_)
            {
                //    p = Elevation2KPA(m_dblElevation);
                //    SIWBsearch(p, TWB / 100, TDB, TWB);
                //    CalcSIProperties(p, TWB, TDB, HumidRatio, RelHumid, Enthalpy, SpVolume, Density, DEWPoint);
                //    UnitsTemperature = pszSITemp;
                //    UnitsEnthalpy = pszSIEnthrapy;
                //    UnitsDensity = pszSIDensity;
                //    UnitsVolume = pszSISPVolume;
                //    UnitsHumidity = pszSIHumidityRatio;

                if (data.IsElevation)
                {
                    data.BarometricPressure = UnitConverter.ConvertElevationInMetersToKilopascal(data.Elevation);
                }

                data.WetBulbTemperature = CalculationLibrary.CalculateTemperatureWetBulbSI(data.BarometricPressure, data.RelativeHumidity / 100, data.DryBulbTemperature);

                CalculationLibrary.CalculatePropertiesSI(data);
            }
            else
            {
                //    p = Elevation2PSI(m_dblElevation);
                //    IPWBsearch(p, TWB / 100, TDB, TWB);
                //    CalcIPProperties(p, TWB, TDB, HumidRatio, RelHumid, Enthalpy, SpVolume, Density, DEWPoint);
                //    UnitsTemperature = pszIPTemp;
                //    UnitsEnthalpy = pszIPEnthrapy;
                //    UnitsDensity = pszIPDensity;
                //    UnitsVolume = pszIPSPVolume;
                //    UnitsHumidity = pszIPHumidityRatio;


                if (data.IsElevation)
                {
                    data.BarometricPressure = UnitConverter.ConvertElevationInFeetToBarometricPressure(data.Elevation);
                }

                data.WetBulbTemperature = CalculationLibrary.CalculateTemperatureWetBulbIP(data.BarometricPressure, data.RelativeHumidity / 100, data.DryBulbTemperature);
                //data.TemperatureWetBulb = CalculationLibrary.CalculateTemperatureWetBulbIP(data);

                CalculationLibrary.CalculatePropertiesIP(data);

                data.BarometricPressure = UnitConverter.CalculatePressureFahrenheit(data.BarometricPressure);
            }

            return(Psychrometrics_CheckCalculationValues(data, out errorMessage));
        }
        public override void Process()
        {
            var srtmStorage = MilSpaceConfiguration.DemStorages.SrtmStorage;
            IEnumerable <string> errorMessages = new List <string>();

            CalculationLibrary.RasterToOtherFormat(files, srtmStorage, out errorMessages);


            var fileUsage = files.ToDictionary(f => new FileInfo(f), t => false);

            foreach (var fi in fileUsage.Keys.ToArray())
            {
                var flNm = fi.Name;
                fileUsage[fi] = errorMessages.Any(m => m.EndsWith(flNm, StringComparison.CurrentCultureIgnoreCase));
            }

            returnResult.Result.Log         = errorMessages;
            returnResult.Result.CopoedFiles = fileUsage.Where(f => f.Value).Select(f => f.Key.FullName);
        }
        void InitializeApproachList(DemandCurveData data)
        {
            MerkelData merkelData = new MerkelData()
            {
                WetBulbTemperature = data.WetBulbTemperature,
                Range            = data.Range,
                Elevation        = data.Elevation,
                LiquidToGasRatio = 0.1
            };

            foreach (double approachValue in InitialApproachXValues)
            {
                merkelData.Approach = approachValue;

                double KaVL            = CalculationLibrary.CalculateMerkel(merkelData);
                bool   approachInRange = (KaVL > 0.1) && (KaVL < 5.0);
                ApproachInRange.Add(approachInRange);
                ApproachOutOfRange.Add(!approachInRange);
            }
        }
示例#6
0
        public override void Process()
        {
            result = new StringCollectionResult();
            try
            {
                IEnumerable <string> mesasges = null;
                if (!CalculationLibrary.GenerateProfileData(featureClass, profileSource, tableName, mesasges))
                {
                    result.Exception = new MilSpaceVisibilityCalcFailedException();
                }
                if (mesasges != null && mesasges.Any())
                {
                    mesasges.ToList().ForEach(m => logger.InfoEx(m));
                }

                result.Result = mesasges;
            }
            catch (Exception ex)
            {
                result.Exception = ex;
            }
        }
示例#7
0
        public static bool GenerateTiles(IEnumerable <string> filesToCombine, string resultFileName)
        {
            bool processing = true;

            //var pathToTempFile = IO.Path.GetTempPath();
            var pathToTempFile = IO.Path.Combine(MilSpaceConfiguration.DemStorages.SentinelStorage, "Temp");

            if (!IO.Directory.Exists(pathToTempFile))
            {
                IO.Directory.CreateDirectory(pathToTempFile);
            }

            IEnumerable <string> messages = new List <string>();

            log.InfoEx("Starting MosaicToRaster...");

            var list = filesToCombine.ToList();

            var tempFilesToDelete = new List <string>();
            var commonMessages    = new List <string>();

            var tempFilePath = string.Empty;
            var tileount     = 3;

            while (list.Count > 0)
            {
                var tempFileName = $"{MilSpace.DataAccess.Helper.GetTemporaryNameSuffix()}.tif";
                tempFilePath = IO.Path.Combine(pathToTempFile, tempFileName);


                var temp = list.Take(list.Count < tileount ? list.Count : tileount);
                list = list.Except(temp).ToList();
                if (list.Count > 0)
                {
                    tempFilesToDelete.Add(tempFilePath);
                    list.Add(tempFilePath);
                }
                else
                {
                    var fileInfo = new IO.FileInfo(resultFileName);
                    tempFileName   = fileInfo.Name;
                    pathToTempFile = fileInfo.DirectoryName;
                    tempFilePath   = resultFileName;
                }


                processing = CalculationLibrary.MosaicToRaster(temp, pathToTempFile, tempFileName, out messages, IO.Path.Combine(MilSpaceConfiguration.DemStorages.SentinelStorage, "Temp"));
                commonMessages.AddRange(messages);
                if (!processing)
                {
                    break;
                }
            }

            commonMessages.ForEach(m => { if (processing)
                                          {
                                              log.InfoEx(m);
                                          }
                                          else
                                          {
                                              log.ErrorEx(m);
                                          } });

            if (!processing)
            {
                return(false);
            }

            if (!IO.File.Exists(tempFilePath))
            {
                processing = false;
                (messages.ToList()).Add($"ERROR:  Об'єднаний файл  {tempFilePath} не було знайдено!");
                return(false);
            }

            //IO.File.Copy(tempFilePath, resultFileName, true);

            IEnumerable <string> messagesToClip;

            processing = false;
            messages   = commonMessages;

            tempFilesToDelete.ForEach(f =>
            {
                var fl = new IO.FileInfo(f);
                string templateToDel = $"{fl.Name.Substring(0, fl.Name.Length - 3)}*";

                fl.Directory.GetFiles(templateToDel).ToList().ForEach(fd =>
                {
                    try
                    {
                        IO.File.Delete(fd.FullName);
                    }
                    catch (Exception ex)
                    {
                        log.ErrorEx($"Cannot delete {fd.FullName}");
                        log.ErrorEx(ex.Message);
                    }
                });
            });

            return(true);
        }
        void CalculateApproaches(DemandCurveData data)
        {
            //StreamWriter fs = new StreamWriter("new.txt");

            MerkelData merkelData = new MerkelData()
            {
                WetBulbTemperature = 80, // data.WetBulbTemperature,
                Range            = data.Range,
                Elevation        = data.Elevation,
                LiquidToGasRatio = data.LiquidToGasRatio
            };

            double       kaVL = 0;
            double       calculatedWaterAirRatio = 0.0;
            const double waterAirRatio_MIN = 0.01, waterAirRatio_MAX = 5.0;
            double       calculatedWaterAirRatio_MIN = 999.0;

            //ApproachXValues[INDEX_TARGETAPPROACH] = TargetApproach;
            //ApproachXValues[INDEX_USERAPPROACH] = UserApproach;

            for (double waterAirRatio = waterAirRatio_MIN; waterAirRatio < waterAirRatio_MAX; waterAirRatio += .05)
            {
                //fs.WriteLine("\ndLG {0} \n", waterAirRatio.ToString("F6"));
                DataRow dataRow = data.DataTable.NewRow();

                for (int i = 0; i < InitialApproachXValues.Length; i++)
                {
                    //fs.WriteLine("\niIndex {0}  getapp(iIndex) {1} App[iIndex] {2} ", i, 1, (int)ApproachXValues[i]);
                    string approachXValue = ((int)InitialApproachXValues[i]).ToString();

                    if (ApproachInRange[i] && !ApproachOutOfRange[i])
                    {
                        merkelData.LiquidToGasRatio = waterAirRatio;
                        merkelData.Approach         = InitialApproachXValues[i];
                        if (data.IsInternationalSystemOfUnits_IS_)
                        {
                            merkelData.Approach *= 1.8;
                        }

                        if (waterAirRatio > 1.3 && waterAirRatio < 1.4)
                        {
                            //fs.WriteLine();
                        }

                        //fs.WriteLine(" m_dblCurveWBT {0}, m_dblCurveRange {1}, App[iIndex] {2}, dLG {3}, m_dblAltitude {4} ", merkelData.WetBulbTemperature.ToString("F6"), merkelData.Range.ToString("F6"), merkelData.Approach.ToString("F6"), merkelData.WaterAirRatio.ToString("F6"), merkelData.Elevation.ToString("F6"));

                        kaVL = CalculationLibrary.CalculateMerkel(merkelData);

                        //fs.WriteLine(" m_dblCurveWBT {0}, m_dblCurveRange {1}, App[iIndex] {2}, dLG {3}, m_dblAltitude {4} ", merkelData.WetBulbTemperature.ToString("F6"), merkelData.Range.ToString("F6"), merkelData.Approach.ToString("F6"), merkelData.WaterAirRatio.ToString("F6"), merkelData.Elevation.ToString("F6"));
                        //fs.WriteLine("kavl {0} minVal {1} maxVal {2} dLG {3} App[iIndex] {4} ", kaVL.ToString("F6"), waterAirRatio_MIN.ToString("F6"), waterAirRatio_MAX.ToString("F6"), waterAirRatio.ToString("F6"), ApproachXValues[i].ToString("F6"));

                        // ddp
                        if ((kaVL < waterAirRatio_MIN) || (kaVL >= waterAirRatio_MAX))
                        {
                            double dInterp;
                            for (dInterp = waterAirRatio; ((kaVL < waterAirRatio_MIN) || (kaVL >= waterAirRatio_MAX)) && (dInterp > .1); dInterp -= 0.0002)
                            {
                                merkelData.Approach = InitialApproachXValues[i];
                                if (data.IsInternationalSystemOfUnits_IS_)
                                {
                                    merkelData.Approach *= 1.8;
                                }
                                merkelData.LiquidToGasRatio = dInterp;
                                kaVL = CalculationLibrary.CalculateMerkel(merkelData);
                            }
                            calculatedWaterAirRatio = dInterp;
                            ApproachOutOfRange[i]   = true; //DDP This is the last point
                        }
                        else
                        {
                            calculatedWaterAirRatio = waterAirRatio;
                        }

                        //fs.WriteLine("kavl {0} dLG {1} App[iIndex] {2} ", kaVL.ToString("F6"), waterAirRatio.ToString("F6"), ApproachXValues[i].ToString("F6"));

                        if ((calculatedWaterAirRatio_MIN > kaVL) && (kaVL > .1))
                        {
                            calculatedWaterAirRatio_MIN = kaVL;
                        }
                        //fs.Write("sDLG {0} ", calculatedWaterAirRatio.ToString("F6"));
                        //fs.Write("min4Lg {0} \n", min4Lg.ToString("F6"));

                        if ((kaVL <= 10.0) && (kaVL >= .1))
                        {
                            //fs.WriteLine("index {2} m_wndGraph {0} {1}", calculatedWaterAirRatio.ToString("F6"), kaVL.ToString("F6"), i);
                            dataRow[string.Format("L/G-{0}", approachXValue)]  = calculatedWaterAirRatio;
                            dataRow[string.Format("kaVL-{0}", approachXValue)] = kaVL;
                        }
                    }
                }
                data.DataTable.Rows.Add(dataRow);
            }

            ////---------------------------------------------------------------------
            //// Draw Fill Line
            ////---------------------------------------------------------------------
            //if ((data.CurveC1 != 0) && (data.CurveC2 != 0))//&& coef)
            //{
            //    for (double waterAirRatio = data.CurveMinimum; waterAirRatio <= data.CurveMaximum; waterAirRatio += .05)
            //    {
            //        DataRow dataRow = data.DataTable.NewRow();
            //        if ((waterAirRatio >= data.CurveMinimum) && (waterAirRatio <= data.CurveMaximum))
            //        {
            //            double dblK = data.CurveC1 * Math.Pow(waterAirRatio, data.CurveC2);

            //            if ((dblK >= calculatedWaterAirRatio_MIN) && (dblK <= waterAirRatio_MAX))
            //            {
            //                dataRow["kaVL-COEF"] = kaVL;
            //                dataRow["L/G-COEF"] = calculatedWaterAirRatio;
            //                //m_wndGraph.GetSeries(INDEX_COEF).AddXY(waterAirRatio, dblK, NULL, 00099FF);
            //            }
            //        }
            //        data.DataTable.Rows.Add(dataRow);
            //    }
            //}

            //////---------------------------------------------------------------------
            ////// Draw L/G line
            //////---------------------------------------------------------------------
            //if (data.WaterAirRatio > waterAirRatio_MIN && data.WaterAirRatio <= waterAirRatio_MAX)// && Lg)
            //{
            //    DataColumn dataColumn = new DataColumn();
            //    dataColumn.ColumnName = "L/G-X";
            //    dataColumn.DataType = Type.GetType("System.Double");
            //    data.DataTable.Columns.Add(dataColumn);
            //    dataColumn = new DataColumn();
            //    dataColumn.ColumnName = "L/G-Y";
            //    dataColumn.DataType = Type.GetType("System.Double");
            //    data.DataTable.Columns.Add(dataColumn);

            //    DataRow dataRow = data.DataTable.NewRow();
            //    dataRow["L/G-Y"] = data.WaterAirRatio;
            //    dataRow["L/G-X"] = calculatedWaterAirRatio_MIN;
            //    data.DataTable.Rows.Add(dataRow);

            //    dataRow = data.DataTable.NewRow();
            //    dataRow["L/G-Y"] = data.WaterAirRatio;
            //    dataRow["L/G-X"] = waterAirRatio_MAX;
            //    data.DataTable.Rows.Add(dataRow);
            //}

            //////---------------------------------------------------------------------
            ////// Draw KaV/L line
            //////---------------------------------------------------------------------
            //if ((data.KaV_L > 0.1) && (data.KaV_L <= waterAirRatio_MAX)) // && m_bShowKaVLLine)
            //{
            //    DataRow dataRow = data.DataTable.NewRow();
            //    dataRow[string.Format("kaVL-{0}", INDEX_KAVL)] = waterAirRatio_MIN;
            //    dataRow[string.Format("L/G-{0}", INDEX_KAVL)] = data.KaV_L;
            //    data.DataTable.Rows.Add(dataRow);
            //    dataRow = data.DataTable.NewRow();
            //    dataRow[string.Format("kaVL-{0}", INDEX_KAVL)] = waterAirRatio_MAX;
            //    dataRow[string.Format("L/G-{0}", INDEX_KAVL)] = data.KaV_L;
            //    data.DataTable.Rows.Add(dataRow);
            data.DataTable.Rows[0][string.Format("kaVL-{0}", INDEX_KAVL)] = waterAirRatio_MAX;
            //    data.DataTable.Rows[0][columnName] = waterAirRatio_MAX;
            //    data.DataTable.Rows[1][columnName] = waterAirRatio_MAX;
            //}

            //fs.Flush();
            //fs.Close();
        }
示例#9
0
        private IEnumerable <string> ProcessObservationPoint(List <string> results)
        {
            logger.InfoEx($"> ProcessObservationPoint START with parameters {calcResults}");


            Dictionary <int, List <string> > generatedResults = null;

            if (!showAllResults)
            {
                logger.InfoEx("Show all results was not set");
                generatedResults = new Dictionary <int, List <string> >();
            }


            int iStepNum = 1;
            IEnumerable <string> messages = null;

            string oservStationsFeatureClassName = null;
            //Used to clip the base immge to make it smaller and reduce the culculation time
            int currentPointIdForBestParamsCalculations = pointsFilteringIds.Last();

            //Handle Observation Objects
            if (calcResults.HasFlag(VisibilityCalculationResultsEnum.ObservationObjects))
            {
                oservStationsFeatureClassName = VisibilityTask.GetResultName(VisibilityCalculationResultsEnum.ObservationObjects, outputSourceName);
                logger.InfoEx($"Export observation objects to {oservStationsFeatureClassName}");
                //Add result To Delete if not to show all results. Add OP result
                if (!showAllResults)
                {
                    //pointResults =
                    generatedResults.Add(-1, new List <string>()
                    {
                        oservStationsFeatureClassName
                    });
                }
                var exportedFeatureClass = GdbAccess.Instance.ExportObservationFeatureClass(
                    observStationsfeatureClass as IDataset,
                    oservStationsFeatureClassName,
                    stationsFilteringIds);
                if (!string.IsNullOrWhiteSpace(exportedFeatureClass))
                {
                    logger.InfoEx($"Observation points feature class  was created:{exportedFeatureClass}");
                    results.Add(iStepNum.ToString() + ". " + "Створено копію ОН для розрахунку: " + exportedFeatureClass);
                    iStepNum++;
                }
                else
                {
                    string errorMessage = $"The feature calss {oservStationsFeatureClassName} was not exported";
                    result.ErrorMessage = errorMessage;
                    logger.ErrorEx("> ProcessObservationPoint ERROR ExportObservationFeatureClass (1). errorMessage:{0}", errorMessage);
                    messages.Append(errorMessage);
                    results.Add("Помилка: " + errorMessage);
                    return(messages);
                }
            }
            else if (calcResults.HasFlag(VisibilityCalculationResultsEnum.BestParametersTable))
            {
                oservStationsFeatureClassName = observStationsfeatureClass.AliasName;
                logger.InfoEx($"Export observation objects to {oservStationsFeatureClassName}");
            }


            //Handle Observation Points
            List <KeyValuePair <VisibilityCalculationResultsEnum, int[]> > pointsIDs =
                new List <KeyValuePair <VisibilityCalculationResultsEnum, int[]> >();

            if (calcResults.HasFlag(VisibilityCalculationResultsEnum.VisibilityAreaRaster) &&
                !calcResults.HasFlag(VisibilityCalculationResultsEnum.BestParametersTable))
            {
                pointsIDs.Add(
                    new KeyValuePair <VisibilityCalculationResultsEnum, int[]>(
                        VisibilityCalculationResultsEnum.ObservationPoints,
                        pointsFilteringIds));
            }

            if (calcResults.HasFlag(VisibilityCalculationResultsEnum.ObservationPointSingle))
            {
                if (pointsFilteringIds.Length > 1)
                {
                    pointsIDs.AddRange(
                        pointsFilteringIds.Select(
                            id => new KeyValuePair <VisibilityCalculationResultsEnum, int[]>(
                                VisibilityCalculationResultsEnum.ObservationPointSingle, new int[] { id }))
                        .ToArray());
                }
                else
                {
                    calcResults &= ~VisibilityCalculationResultsEnum.ObservationPointSingle;
                    calcResults &= ~VisibilityCalculationResultsEnum.VisibilityAreaRasterSingle;
                }
            }

            if (calcResults.HasFlag(VisibilityCalculationResultsEnum.BestParametersTable))
            {
                pointsIDs.AddRange(
                    pointsFilteringIds.Select(
                        id => new KeyValuePair <VisibilityCalculationResultsEnum, int[]>(
                            VisibilityCalculationResultsEnum.ObservationPointSingle, new int[] { id }))
                    .ToArray());
            }

            int  index = -1;
            bool removeFullImageFromresult = false;

            int[] objIds = null;
            if (calcResults.HasFlag(VisibilityCalculationResultsEnum.ObservationObjects))
            {
                objIds = stationsFilteringIds;
            }

            var coverageTableManager = new CoverageTableManager();
            BestOPParametersManager bestOPParametersManager = null;

            if (calcResults.HasFlag(VisibilityCalculationResultsEnum.BestParametersTable))
            {
                bestOPParametersManager = new BestOPParametersManager(visibilityPercent, currentPointIdForBestParamsCalculations, showAllResults);
            }

            // There is no reason to clip image for the BestParameters mode, since the point just shance its Z value
            var clipSourceImageForEveryPoint = true;

            //Used to define a result layer name;
            int pointIndex = -1;


            var orifinalResterSource = rasterSource;

            foreach (var curPoints in pointsIDs)
            {
                int pointId;

                if (calcResults.HasFlag(VisibilityCalculationResultsEnum.BestParametersTable))
                {
                    pointId    = currentPointIdForBestParamsCalculations;
                    pointIndex = pointId - 1;
                }
                else
                {
                    pointId    = curPoints.Key == VisibilityCalculationResultsEnum.ObservationPoints ? -1 : ++index;
                    pointIndex = pointId;
                }

                logger.InfoEx($"Start processing point id {pointId} with index {pointIndex}");

                if (!showAllResults)// Cretae the list to add datasets to delete
                {
                    generatedResults.Add(pointId, new List <string>());
                }

                int[] curPointsValue = (calcResults.HasFlag(VisibilityCalculationResultsEnum.BestParametersTable)) ?
                                       new int[] { pointId } : curPoints.Value;

                var observPointFeatureClassName = VisibilityTask.GetResultName(curPoints.Key, outputSourceName, pointIndex);
                logger.InfoEx($"Processing point(s) into {observPointFeatureClassName}");
                //Add result To Delete if not to show all results. Add OP result
                if (!showAllResults && generatedResults.ContainsKey(pointId))
                {
                    generatedResults[pointId].Add(observPointFeatureClassName);
                }

                var exportedFeatureClass = GdbAccess.Instance.ExportObservationFeatureClass(
                    observPointsfeatureClass as IDataset,
                    observPointFeatureClassName,
                    curPointsValue);

                results.Add(iStepNum.ToString() + ". " + "Створено копію ПС для розрахунку: " + exportedFeatureClass);
                logger.InfoEx($"Point(s) was exported into {observPointFeatureClassName} to process visibility");
                iStepNum++;

                if (string.IsNullOrWhiteSpace(exportedFeatureClass))
                {
                    string errorMessage = $"The feature calss {observPointFeatureClassName} was not exported";
                    result.Exception    = new MilSpaceVisibilityCalcFailedException(errorMessage);
                    result.ErrorMessage = errorMessage;
                    logger.ErrorEx("> ProcessObservationPoint ERROR ExportObservationFeatureClass. errorMessage:{0}", errorMessage);
                    results.Add("Помилка: " + errorMessage + " ПС: " + pointId.ToString());
                    return(messages);
                }

                bool clipSoutceImageByPotentialArea = clipSourceImageForEveryPoint && (curPoints.Key == VisibilityCalculationResultsEnum.ObservationPoints || curPoints.Key == VisibilityCalculationResultsEnum.ObservationPointSingle);

                if (clipSoutceImageByPotentialArea)
                {
                    logger.InfoEx($"Clipping calc image to potential area");
                    string featureClassName = exportedFeatureClass;
                    if (calcResults.HasFlag(VisibilityCalculationResultsEnum.BestParametersTable) && curPoints.Value.First() == 1)
                    {
                        featureClassName = observPointsfeatureClass.AliasName;
                    }
                    logger.InfoEx($"Calculate potential area for observation point in {featureClassName} and objects from {oservStationsFeatureClassName}");
                    coverageTableManager.SetCalculateAreas(featureClassName, oservStationsFeatureClassName, !calcResults.HasFlag(VisibilityCalculationResultsEnum.BestParametersTable));

                    clipSourceImageForEveryPoint = false;// !calcResults.HasFlag(VisibilityCalculationResultsEnum.BestParametersTable);

                    var visibilityPotentialAreaFCName = VisibilityCalcResults.GetResultName(VisibilityCalculationResultsEnum.VisibilityAreasPotential, outputSourceName);

                    coverageTableManager.AddPotentialArea(
                        visibilityPotentialAreaFCName,
                        (curPoints.Key == VisibilityCalculationResultsEnum.ObservationPoints ||
                         curPoints.Key == VisibilityCalculationResultsEnum.ObservationPointSingle), pointIndex + 1);

                    results.Add(iStepNum.ToString() + ". " + "Розраховано потенційне покриття: " + visibilityPotentialAreaFCName + " ПС: " + pointId.ToString());

                    //Calc protentilly visiblw area as Image
                    var fc = GenerateWorknArea(visibilityPotentialAreaFCName, observPointFeatureClassName, outputSourceName);

                    results.Add(iStepNum.ToString() + ". " + "Розраховано потенційне покриття для розрахунку: " + fc.AliasName + " ПС: " + pointId.ToString());


                    //Try to clip the raster source by visibilityPotentialAreaFCName
                    var visibilityPotentialAreaImgName =
                        VisibilityCalcResults.GetResultName(pointIndex > -1 ?
                                                            VisibilityCalculationResultsEnum.VisibilityRastertPotentialAreaSingle :
                                                            VisibilityCalculationResultsEnum.VisibilityRastertPotentialArea,
                                                            outputSourceName, pointIndex);
                    //Add result To Delete if not to show all results. Add OP result
                    if (!showAllResults && generatedResults.ContainsKey(pointId))
                    {
                        generatedResults[pointId].Add(visibilityPotentialAreaImgName);
                    }

                    if (!CalculationLibrary.ClipVisibilityZonesByAreas(
                            rasterSource,
                            visibilityPotentialAreaImgName,
                            fc.AliasName,
                            out messages, "NONE"))
                    {
                        string errorMessage = $"The result {visibilityPotentialAreaImgName} was not generated";
                        result.Exception    = new MilSpaceVisibilityCalcFailedException(errorMessage);
                        result.ErrorMessage = errorMessage;
                        logger.ErrorEx("> ProcessObservationPoint ERROR ClipVisibilityZonesByAreas. errorMessage:{0}", errorMessage);
                        results.Add("Помилка: " + errorMessage + " ПС: " + pointId.ToString());
                        return(messages);
                    }
                    else
                    {
                        results.Add(iStepNum.ToString() + ". " + "Розраховано покриття для розрахунку на основі потенційноі видимості: " + visibilityPotentialAreaImgName + " ПС: " + pointId.ToString());
                        rasterSource = visibilityPotentialAreaImgName;
                        //Delete temporary Featureclass usewd for clipping the base image by potential area
                        GdbAccess.Instance.RemoveFeatureClass(fc.AliasName);
                    }
                }

                //Generate Visibility Raster
                string featureClass = observPointFeatureClassName;
                string outImageName = VisibilityTask.GetResultName(
                    curPoints.Key == VisibilityCalculationResultsEnum.ObservationPoints ?
                    VisibilityCalculationResultsEnum.VisibilityAreaRaster :
                    VisibilityCalculationResultsEnum.VisibilityAreaRasterSingle,
                    outputSourceName,
                    pointIndex);

                //Add result To Delete if not to show all results. Add Visibility raster result
                if (!showAllResults && generatedResults.ContainsKey(pointId))
                {
                    generatedResults[pointId].Add(outImageName);
                }

                if (!CalculationLibrary.GenerateVisibilityData(
                        rasterSource,
                        featureClass,
                        VisibilityAnalysisTypesEnum.Frequency,
                        outImageName,
                        out messages))
                {
                    string errorMessage = $"The result {outImageName} was not generated";
                    result.Exception    = new MilSpaceVisibilityCalcFailedException(errorMessage);
                    result.ErrorMessage = errorMessage;
                    logger.ErrorEx("> ProcessObservationPoint ERROR ConvertRasterToPolygon. errorMessage:{0}", errorMessage);
                    logger.ErrorEx("> ProcessObservationPoint ERROR ConvertRasterToPolygon. errorMessage:{0}", errorMessage);
                    results.Add("Помилка: " + errorMessage + " ПС: " + pointId.ToString());
                    return(messages);
                }
                else
                {
                    results.Add(iStepNum.ToString() + ". " + "Розраховано видимість: " + outImageName + " ПС: " + pointId.ToString());
                    iStepNum++;
                    logger.InfoEx($"Visibility image {outImageName} for point {pointId} was generated");

                    string visibilityArePolyFCName = null;
                    //ConvertToPolygon full visibility area
                    if (calcResults.HasFlag(VisibilityCalculationResultsEnum.VisibilityAreaPolygons) &&
                        !calcResults.HasFlag(VisibilityCalculationResultsEnum.ObservationObjects))
                    {
                        logger.InfoEx($"Calculation of {VisibilityCalculationResultsEnum.VisibilityAreaPolygons} (Convert visible areas to polygon) was swithced on");
                        visibilityArePolyFCName =
                            VisibilityTask.GetResultName(pointIndex > -1 ?
                                                         VisibilityCalculationResultsEnum.VisibilityAreaPolygonSingle :
                                                         VisibilityCalculationResultsEnum.VisibilityAreaPolygons, outputSourceName, pointIndex);

                        //Add result To Delete if not to show all results. Add Visibility polygon result
                        if (!showAllResults && generatedResults.ContainsKey(pointId))
                        {
                            generatedResults[pointId].Add(visibilityArePolyFCName);
                        }

                        if (!CalculationLibrary.ConvertRasterToPolygon(outImageName, visibilityArePolyFCName, out messages))
                        {
                            if (!messages.Any(m => m.StartsWith("ERROR 010151"))) // Observatioj areas dont intersect Visibility aresa
                            {
                                string errorMessage = $"The result {visibilityArePolyFCName} was not generated";
                                result.Exception    = new MilSpaceVisibilityCalcFailedException(errorMessage);
                                result.ErrorMessage = errorMessage;
                                logger.ErrorEx("> ProcessObservationPoint ERROR ConvertRasterToPolygon. errorMessage:{0}", errorMessage);
                                results.Add("Помилка: " + errorMessage + " ПС: " + pointId.ToString());
                                return(messages);
                            }

                            results.Add(iStepNum.ToString() + ". " + "Видимисть відсутня. Полігони не були конвертовані: " + visibilityArePolyFCName + " ПС: " + pointId.ToString());
                            visibilityArePolyFCName = string.Empty;
                            logger.InfoEx($"There is no visibile areas for OP {pointId}");
                        }
                        else
                        {
                            results.Add(iStepNum.ToString() + ". " + "Конвертовано у полігони: " + visibilityArePolyFCName + " ПС: " + pointId.ToString());
                            logger.InfoEx($"Visibile areas for OP {pointId} was converted into {visibilityArePolyFCName} ");
                        }
                        iStepNum++;
                    }

                    //Clip
                    if (!string.IsNullOrEmpty(oservStationsFeatureClassName))
                    {
                        var inClipName = outImageName;

                        var resultLype =
                            pointId > -1 ?
                            VisibilityCalculationResultsEnum.VisibilityObservStationClipSingle :
                            VisibilityCalculationResultsEnum.VisibilityObservStationClip;

                        var outClipName = VisibilityTask.GetResultName(resultLype,
                                                                       outputSourceName, pointIndex);
                        //Add result To Delete if not to show all results. Add Visibility polygon result
                        if (!showAllResults && generatedResults.ContainsKey(pointId))
                        {
                            generatedResults[pointId].Add(outClipName);
                        }

                        logger.InfoEx($"Try to clip the visible areas {inClipName} by orservation  object {oservStationsFeatureClassName}");

                        if (!CalculationLibrary.ClipVisibilityZonesByAreas(
                                inClipName,
                                outClipName,
                                oservStationsFeatureClassName,
                                out messages))
                        {
                            string errorMessage = $"The result {outClipName} was not generated";
                            result.Exception    = new MilSpaceVisibilityCalcFailedException(errorMessage);
                            result.ErrorMessage = errorMessage;
                            logger.ErrorEx("> ProcessObservationPoint ERROR ClipVisibilityZonesByAreas. errorMessage:{0}", errorMessage);
                            results.Add("Помилка: " + errorMessage + " ПС: " + pointId.ToString());
                            return(messages);
                        }
                        else
                        {
                            results.Add(iStepNum.ToString() + ". " + "Зона видимості зведена до дійсного розміру: " + outClipName + " ПС: " + pointId.ToString());
                            logger.InfoEx($"Visible area {inClipName} was clipped by orservation objects {oservStationsFeatureClassName}");

                            iStepNum++;

                            if (!calcResults.HasFlag(resultLype))
                            {
                                calcResults |= resultLype;
                            }

                            //Change to VisibilityAreaPolygonForObjects
                            var curCulcRResult =
                                pointId > -1 ?
                                VisibilityCalculationResultsEnum.VisibilityAreaPolygonSingle :
                                VisibilityCalculationResultsEnum.VisibilityAreaPolygons;


                            visibilityArePolyFCName = VisibilityTask.GetResultName(curCulcRResult, outputSourceName, pointIndex);

                            var rasterDataset = GdbAccess.Instance.GetDatasetFromCalcWorkspace(
                                outClipName, VisibilityCalculationResultsEnum.VisibilityAreaRaster);
                            bool isEmpty = EsriTools.IsRasterEmpty((IRasterDataset2)rasterDataset);

                            if (isEmpty)
                            {
                                if (calcResults.HasFlag(curCulcRResult))
                                {
                                    calcResults &= ~curCulcRResult;
                                }
                                results.Add($"{iStepNum.ToString()}. Видимість відсутня. Полігони {visibilityArePolyFCName} не було сформовано. ПС: {pointId.ToString()}");
                                logger.InfoEx($"There is no visible areas in {visibilityArePolyFCName}. Point {pointId}");
                            }
                            else
                            {
                                if (!CalculationLibrary.ConvertRasterToPolygon(outClipName, visibilityArePolyFCName, out messages))
                                {
                                    if (!messages.Any(m => m.StartsWith("ERROR 010151"))) // Observatioj areas dont intersect Visibility area
                                    {
                                        string errorMessage = $"The result {visibilityArePolyFCName} was not generated";
                                        result.Exception    = new MilSpaceVisibilityCalcFailedException(errorMessage);
                                        result.ErrorMessage = errorMessage;
                                        logger.ErrorEx("> ProcessObservationPoint ERROR ConvertRasterToPolygon. errorMessage:{0}", errorMessage);
                                        results.Add("Помилка: " + errorMessage + " ПС: " + pointId.ToString());
                                        return(messages);
                                    }
                                    results.Add(iStepNum.ToString() + ". " + "Видимість відсутня. Полігони не було сформовано: " + visibilityArePolyFCName + " ПС: " + pointId.ToString());
                                    logger.InfoEx($"There is no visible areas. {visibilityArePolyFCName} was not generated. Point {pointId}");
                                }
                                else
                                {
                                    //Add result To Delete if not to show all results. Add Visibility polygon result
                                    if (!showAllResults && generatedResults.ContainsKey(pointId))
                                    {
                                        generatedResults[pointId].Add(visibilityArePolyFCName);
                                    }
                                    results.Add(iStepNum.ToString() + ". " + "Конвертовано у полігони: " + visibilityArePolyFCName + " ПС: " + pointId.ToString());
                                }
                            }
                            iStepNum++;
                        }
                    }
                    else if (calcResults.HasFlag(VisibilityCalculationResultsEnum.VisibilityAreasTrimmedByPoly) &&
                             !string.IsNullOrEmpty(visibilityArePolyFCName))
                    {
                        //Clip visibility images to valuable extent
                        var inClipName  = outImageName;
                        var outClipName = VisibilityTask.GetResultName(pointIndex > -1 ?
                                                                       VisibilityCalculationResultsEnum.VisibilityAreaTrimmedByPolySingle :
                                                                       VisibilityCalculationResultsEnum.VisibilityAreasTrimmedByPoly, outputSourceName, pointIndex);


                        if (!CalculationLibrary.ClipVisibilityZonesByAreas(
                                inClipName,
                                outClipName,
                                visibilityArePolyFCName,
                                out messages,
                                "NONE"))
                        {
                            string errorMessage = $"The result {outClipName} was not generated";
                            result.Exception    = new MilSpaceVisibilityCalcFailedException(errorMessage);
                            result.ErrorMessage = errorMessage;
                            logger.ErrorEx("> ProcessObservationPoint ERROR ClipVisibilityZonesByAreas. errorMessage:{0}", errorMessage);
                            results.Add("Помилка: " + errorMessage + " ПС: " + pointId.ToString());
                            return(messages);
                        }
                        else
                        {
                            //Add result To Delete if not to show all results. Add Visibility polygon result
                            if (!showAllResults && generatedResults.ContainsKey(pointId))
                            {
                                generatedResults[pointId].Add(outClipName);
                            }
                            results.Add(iStepNum.ToString() + ". " + "Зона видимості зведена до дійсного розміру: " + outClipName + " ПС: " + pointId.ToString());
                            iStepNum++;
                            removeFullImageFromresult = true;
                        }
                    }

                    if (calcResults.HasFlag(VisibilityCalculationResultsEnum.CoverageTable))
                    {
                        var pointsCount = pointsFilteringIds.Where(id => id > -1).Count();
                        coverageTableManager.CalculateCoverageTableDataForPoint(
                            (pointId == -1),
                            visibilityArePolyFCName,
                            pointsCount,
                            exportedFeatureClass,
                            pointIndex + 1);

                        results.Add(iStepNum.ToString() + ". " + "Сформовані записи таблиці покриття. для ПС: " + pointId.ToString());
                        iStepNum++;
                    }

                    if (calcResults.HasFlag(VisibilityCalculationResultsEnum.BestParametersTable))
                    {
                        if (pointId != -1)
                        {
                            currentPointIdForBestParamsCalculations = bestOPParametersManager.FindVisibilityPercent(visibilityArePolyFCName, observStationsfeatureClass,
                                                                                                                    stationsFilteringIds, pointId);

                            results.Add(iStepNum.ToString() + ". " + "Знайдено відсоток покриття для кроку " + pointId.ToString());
                            iStepNum++;
                            if (currentPointIdForBestParamsCalculations < 0)
                            {
                                break;
                            }
                        }
                    }
                }
            }

            if (calcResults.HasFlag(VisibilityCalculationResultsEnum.CoverageTable))
            {
                var coverageTable = VisibilityTask.GetResultName(VisibilityCalculationResultsEnum.CoverageTable, outputSourceName);
                coverageTableManager.SaveDataToCoverageTable(coverageTable);

                results.Add(iStepNum.ToString() + ". " + "Збережена загальна таблиця покриття: " + coverageTable);
                iStepNum++;
            }

            if (calcResults.HasFlag(VisibilityCalculationResultsEnum.BestParametersTable))
            {
                var bestParamsTableName = VisibilityTask.GetResultName(VisibilityCalculationResultsEnum.BestParametersTable, outputSourceName);

                if (bestOPParametersManager.CreateVOTable(observPointsfeatureClass,
                                                          visibilityPercent, bestParamsTableName))
                {
                    //Delete unnecessary datasets
                    if (!showAllResults && bestOPParametersManager.AppropriateedParams != null)
                    {
                        foreach (var key in generatedResults.Keys)
                        {
                            if (!bestOPParametersManager.AppropriateedParams.Any(k => k.Key == key))
                            {
                                foreach (var fc in generatedResults[key])
                                {
                                    //try to remove feature class
                                    if (!GdbAccess.Instance.RemoveFeatureClass(fc))
                                    {
                                        // it is not FC try to remove raster
                                        GdbAccess.Instance.RemoveRasterDataset(fc);
                                    }
                                }
                            }
                        }
                    }

                    results.Add(iStepNum.ToString() + ". " + "Збережена таблиця накращих параметрів ПН для мінімальної видимості " + visibilityPercent + "%: " + bestParamsTableName);
                    iStepNum++;
                }
                else
                {
                    results.Add(iStepNum.ToString() + ". " + "Відсутні результати для видимості " + visibilityPercent +
                                "%. Збережена таблиця з накращими можливими параметрами ПН: " + bestParamsTableName);
                    iStepNum++;
                }
            }

            //Set real results to show
            if (removeFullImageFromresult)
            {
                if (calcResults.HasFlag(VisibilityCalculationResultsEnum.VisibilityAreaRaster))
                {
                    calcResults &= ~VisibilityCalculationResultsEnum.VisibilityAreaRaster;
                }
                if (calcResults.HasFlag(VisibilityCalculationResultsEnum.VisibilityAreaRasterSingle))
                {
                    calcResults &= ~VisibilityCalculationResultsEnum.VisibilityAreaRasterSingle;
                }
            }

            session.CalculatedResults = (int)calcResults;

            logger.InfoEx("> ProcessObservationPoint END");
            return(messages);
        }
        public bool Psychrometrics_WetBulbTemperature_DryBulbTemperature_Calculation(PsychrometricsData data, out string errorMessage)
        {
            //if (TPropPageBase::CheckData()) return;

            //double p;
            //double altitude = m_dblElevation;
            //double TWB = m_dblPsychWBT;
            //double TDB = m_dblPsychDBT;
            //double HumidRatio;
            //double RelHumid;
            //double Enthalpy;
            //double SpVolume;
            //double Density;
            //double DEWPoint;

            if (data.IsInternationalSystemOfUnits_IS_)
            {
                // metric
                //{
                //    p = Elevation2KPA(m_dblElevation);
                //    CalcSIProperties(p, TWB, TDB, HumidRatio, RelHumid, Enthalpy, SpVolume, Density, DEWPoint);
                //    UnitsTemperature = pszSITemp;
                //    UnitsEnthalpy = pszSIEnthrapy;
                //    UnitsDensity = pszSIDensity;
                //    UnitsVolume = pszSISPVolume;
                //    UnitsHumidity = pszSIHumidityRatio;
                //    if (Enthalpy > 6030) Enthalpy = -999;
                //}

                if (data.IsElevation)
                {
                    data.BarometricPressure = UnitConverter.ConvertElevationInMetersToKilopascal(data.Elevation);
                }

                CalculationLibrary.CalculatePropertiesSI(data);

                if (data.Enthalpy > 6030)
                {
                    data.Enthalpy = -999.0;
                }
            }
            else
            {
                //{
                //    p = Elevation2PSI(m_dblElevation);
                //    CalcIPProperties(p, TWB, TDB, HumidRatio, RelHumid, Enthalpy, SpVolume, Density, DEWPoint);
                //    UnitsTemperature = pszIPTemp;
                //    UnitsEnthalpy = pszIPEnthrapy;
                //    UnitsDensity = pszIPDensity;
                //    UnitsVolume = pszIPSPVolume;
                //    UnitsHumidity = pszIPHumidityRatio;
                //    if (Enthalpy > 2758) Enthalpy = -999;
                //}


                if (data.IsElevation)
                {
                    data.BarometricPressure = UnitConverter.ConvertElevationInFeetToBarometricPressure(data.Elevation);
                }

                CalculationLibrary.CalculatePropertiesIP(data);

                if (data.Enthalpy > 2758)
                {
                    data.Enthalpy = -999.0;
                }

                data.BarometricPressure = UnitConverter.CalculatePressureFahrenheit(data.BarometricPressure);
            }

            return(Psychrometrics_CheckCalculationValues(data, out errorMessage));
        }
        public bool Psychrometrics_Enthalpy_Calculation(PsychrometricsData data, out string errorMessage)
        {
            data.SpecificVolume     = -999;
            data.Density            = -999;
            data.DewPoint           = -999;
            data.DryBulbTemperature = data.Enthalpy;

            if (data.IsInternationalSystemOfUnits_IS_)
            {
                //TWB = 0;
                //p = Elevation2KPA(m_dblElevation);
                //void SIEnthalpysearch (int sat,
                //                       double p,
                //                       double RootEnthalpy,
                //                       double&OutputEnthalpy,
                //                       double & TWB,
                //                       double & TDB,
                //                       double HumidRatio,
                //                       double RelHumid,
                //                       double SpVolume,
                //                       double Density,
                //                       double DEWPoint
                //   )
                //SIEnthalpysearch(1, p, TDB, OutH, TWB, TDB, IPHR, IPRH, SpVolume, Density, DEWPoint);
                //SIEnthalpysearch(1, BarometricPressure, EnthalpyIn, ref EnthalpyOut, ref TWB, ref TDB, IPHR, IPRH, SpecificVolume, Density, DewPoint);
                //CalcSIProperties(p, TWB, TDB, HumidRatio, RelHumid, Enthalpy, SpVolume, Density, DEWPoint);
                //Enthalpy = m_dblEnthalpy;
                //UnitsTemperature = pszSITemp;
                //UnitsEnthalpy = pszSIEnthrapy;
                //UnitsDensity = pszSIDensity;
                //UnitsVolume = pszSISPVolume;
                //UnitsHumidity = pszSIHumidityRatio;

                if (data.IsElevation)
                {
                    data.BarometricPressure = UnitConverter.ConvertElevationInMetersToKilopascal(data.Elevation);
                }

                CalculationLibrary.EnthalpySI(1, data);
                //CalculationLibrary.EnthalpySI(1,
                //    data.BarometricPressure,
                //    data.Enthalpy,
                //    ref dataEnthalpy,
                //    ref dataTemperatureWetBulb,
                //    ref dataTemperatureDryBulb,
                //    data.HumidityRatio,
                //    data.RelativeHumidity,
                //    data.SpecificVolume,
                //    data.Density,
                //    data.DewPoint);

                CalculationLibrary.CalculatePropertiesSI(data);
            }
            else
            {
                //p = Elevation2PSI(m_dblElevation);
                //void IPEnthalpysearch (int sat,
                //                       double p,
                //                       double RootEnthalpy,
                //                       double&OutputEnthalpy,
                //                       double & TWB,
                //                       double & TDB,
                //                       double HumidRatio,
                //                       double RelHumid,
                //                       double SpVolume,
                //                       double Density,
                //                       double DEWPoint)
                //IPEnthalpysearch(1, p, TDB, OutH, TWB, TDB, IPHR, IPRH, SpVolume, Density, DEWPoint);
                //CalcIPProperties(p, TWB, TDB, HumidRatio, RelHumid, Enthalpy, SpVolume, Density, DEWPoint);
                //Enthalpy = m_dblEnthalpy;
                //UnitsTemperature = pszIPTemp;
                //UnitsEnthalpy = pszIPEnthrapy;
                //UnitsDensity = pszIPDensity;
                //UnitsVolume = pszIPSPVolume;
                //UnitsHumidity = pszIPHumidityRatio;


                if (data.IsElevation)
                {
                    data.BarometricPressure = UnitConverter.ConvertElevationInFeetToBarometricPressure(data.Elevation);
                }

                CalculationLibrary.EnthalpyIP(1, data);

                //CalculationLibrary.EnthalpyIP(1,
                //    data.BarometricPressure,
                //    data.Enthalpy,
                //    ref dataEnthalpy,
                //    ref dataTemperatureWetBulb,
                //    ref dataTemperatureDryBulb,
                //    data.HumidityRatio,
                //    data.RelativeHumidity,
                //    data.SpecificVolume,
                //    data.Density,
                //    data.DewPoint);

                CalculationLibrary.CalculatePropertiesIP(data);

                data.BarometricPressure = UnitConverter.CalculatePressureFahrenheit(data.BarometricPressure);
            }

            return(Psychrometrics_CheckCalculationValues(data, out errorMessage));
        }