/// <summary>
        /// get prA from intensity
        /// </summary>
        /// <param name="intensity"></param>
        /// <returns></returns>
        public PrA getPrA(Intensity intensity)
        {
            PrA pra = intensity.Project.PrAs.Where(p => p.IKClass.ID == intensity.IKClasses.ID && p.NatHazard.ID == intensity.NatHazard.ID).SingleOrDefault();

            return(pra);
        }
예제 #2
0
        /// <summary>
        /// Computation of all Damage Extent of a Damage Potential in a given Intensity
        /// </summary>
        /// <param name="mapObj">Damage Potential</param>
        /// <param name="intensity"></param>
        /// <returns></returns>
        public static DamageExtent computeDamageExtent(MappedObject mapObj, Intensity intensity)//, List<MappedObject> clippedObjects = null)
        {
            var _damageExtent = new DamageExtent()
            {
                Intensity    = (Intensity)intensity.Clone(),     //make sure shallow copy is used
                MappedObject = (MappedObject)mapObj.Clone(),     //make sure shallow copy is used
                Clipped      = mapObj.IsClipped,
            };

            if (mapObj.point != null)
            {
                _damageExtent.geometry = mapObj.point;
            }
            if (mapObj.line != null)
            {
                _damageExtent.geometry = mapObj.line;
            }
            if (mapObj.polygon != null)
            {
                _damageExtent.geometry = mapObj.polygon;
            }

            int _intensityDegree = intensity.IntensityDegree; //0=high, 1=med, 2=low

            //Merge Objectparameter with Freefillparamter
            var _mergedObjParam = MappedObjectController.getMergedObjectParameter(mapObj);

            //get Objectparameters for NatHazard (Vulnerability, Mortality, indirect costs)
            int _motherObjectID = _mergedObjParam.MotherObjectparameter != null
                                    ? _mergedObjParam.MotherObjectparameter.ID
                                    : _mergedObjParam.ID;

            ObjectparameterPerProcess _objectParamProcess;

            _objectParamProcess = _mergedObjParam.ProcessParameters
                                  .Where(pp => pp.NatHazard.ID == intensity.NatHazard.ID &&
                                         pp.Objectparameter.ID == _motherObjectID)
                                  .SingleOrDefault();

            if (_objectParamProcess == null)
            {
                _damageExtent.Log += $"ERROR: NO PROCESS PARAMETER, count: {_mergedObjParam.ProcessParameters.Count} \n";
                return(_damageExtent);
            }

            //get pra for intensity
            var _intensityController = new IntensityController();
            PrA _prA = _intensityController.getPrA(intensity);

            if (_prA == null)
            {
                _damageExtent.Log += $"ERROR: NO PrA VALUES FOUND FOR PROCESS {intensity.NatHazard.Name.ToUpper()} \n";
                return(_damageExtent);
            }


            // BUILDINGS and SPECIAL BUILDINGS
            if (_mergedObjParam.ObjectClass.ID <= 2)
            {
                //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
                // PERSON DAMAGE

                double _deaths     = _prA.Value * _mergedObjParam.Personcount * _mergedObjParam.Presence / 24.0;
                string _logDeaths1 = $"Deaths = prA * PersonCount * Presence/24";
                string _logDeaths2 = $"Deaths = {_prA.Value:F3} * {_mergedObjParam.Personcount} * {_mergedObjParam.Presence:F1} / 24";

                double _deathProbability = _mergedObjParam.Personcount > 0 ? 1.0d / _mergedObjParam.Personcount : 0;
                string _logDProb1        = _mergedObjParam.Personcount > 0 ? $"IndividualDeathRisk = 1 / PersonCount" : "ERROR: 1 / PersonCount";
                string _logDProb2        = _mergedObjParam.Personcount > 0 ? $"IndividualDeathRisk =  1 / {_mergedObjParam.Personcount}" : $"ERROR: 1 / {_mergedObjParam.Personcount}";
                if (_mergedObjParam.Personcount < 1)
                {
                    _damageExtent.Log = $"{ResModel.DE_PersonCount} = {_mergedObjParam.Personcount} \n";
                }

                //switching on intensity degree
                switch (_intensityDegree)
                {
                case 0:
                    _deaths     *= _objectParamProcess.MortalityHigh;
                    _logDeaths1 += $" * MortalityHigh";
                    _logDeaths2 += $" * {_objectParamProcess.MortalityHigh:F3}";
                    break;

                case 1:
                    _deaths     *= _objectParamProcess.MortalityMedium;
                    _logDeaths1 += $" * MortalityMedium";
                    _logDeaths2 += $" * {_objectParamProcess.MortalityMedium:F3}";
                    break;

                case 2:
                    _deaths     *= _objectParamProcess.MortalityLow;
                    _logDeaths1 += $" * MortalityLow";
                    _logDeaths2 += $" * {_objectParamProcess.MortalityLow:F3}";
                    break;

                default:
                    throw new ArgumentOutOfRangeException(nameof(_intensityDegree), _intensityDegree, "out of range");
                }

                //looking for floors count, if available for this object type
                if (_mergedObjParam.HasProperties.Where(m => m.Property == nameof(_mergedObjParam.Floors)).Any())
                {
                    _deaths     *= _mergedObjParam.Floors;
                    _logDeaths1 += $" * Floors";
                    _logDeaths2 += $" * {_mergedObjParam.Floors}";

                    if (_mergedObjParam.Floors > 0)
                    {
                        _deathProbability /= _mergedObjParam.Floors;
                        _logDProb1        += $" / Floors";
                        _logDProb2        += $" / {_mergedObjParam.Floors}";
                    }
                    else
                    {
                        _damageExtent.Log += $"{ResModel.DE_Floors} = {_mergedObjParam.Floors} \n";
                    }
                }

                _damageExtent.Deaths    = _deaths;
                _damageExtent.LogDeaths = _logDeaths1 + ";\n" + _logDeaths2;

                _deathProbability *= _deaths;
                _logDProb1        += $" * Deaths";
                _logDProb2        += $" * {_deaths:F6}";
                _damageExtent.DeathProbability    = _deathProbability;
                _damageExtent.LogDeathProbability = _logDProb1 + ";\n" + _logDProb2;

                _damageExtent.PersonDamage     = _deaths * WillingnessToPay;
                _damageExtent.LogPersonDamage  = $"PersonDamage = Deaths * WillingnessToPay;\n";
                _damageExtent.LogPersonDamage += $"PersonDamage = {_deaths:F6} * {WillingnessToPay:C}";


                //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
                // PROPERTY DAMAGE

                double _propertyDamage     = _prA.Value * _mergedObjParam.Value;
                string _logPropertyDamage1 = $"PropertyDamage = prA * Value";
                string _logPropertyDamage2 = $"PropertyDamage = {_prA.Value:F3} * {_mergedObjParam.Value:C}";

                switch (_mergedObjParam.FeatureType)
                {
                case 0:     //POINT BASED OBJECT(like communication tower)
                    _damageExtent.Piece  = 1;
                    _logPropertyDamage1 += $" * Piece";
                    _logPropertyDamage2 += $" * 1";
                    if (_damageExtent.Clipped)
                    {
                        _damageExtent.Part = 1.0d;
                    }

                    break;

                case 1:     //LINE BASED OBJECT (like Aduccion)
                    _damageExtent.Length = mapObj.line.Length;
                    if (_damageExtent.Clipped)
                    {
                        var rawMapObject = MappedObjectController.ActiveSession.Load <MappedObject>(mapObj.ID);
                        _damageExtent.Part = mapObj.line.Length / rawMapObject.line.Length;
                    }

                    _propertyDamage     *= mapObj.line.Length;
                    _logPropertyDamage1 += $" * Length";
                    _logPropertyDamage2 += $" * {mapObj.line.Length:F3}";
                    break;

                case 2:     //POLYGON BASED OBJECT
                    _damageExtent.Area = mapObj.polygon.Area;
                    if (_damageExtent.Clipped)
                    {
                        var rawMapObject = MappedObjectController.ActiveSession.Load <MappedObject>(mapObj.ID);
                        _damageExtent.Part = mapObj.polygon.Area / rawMapObject.polygon.Area;
                    }

                    _propertyDamage     *= mapObj.polygon.Area;
                    _logPropertyDamage1 += $" * Area";
                    _logPropertyDamage2 += $" * {mapObj.polygon.Area:F3}";
                    break;

                default:
                    _damageExtent.Log += $"ERROR: BUILDING, FEATURETYPE = {_mergedObjParam.ObjectClass.ID}, {_mergedObjParam.FeatureType} \n";
                    return(_damageExtent);
                }

                //looking for floors count, if available for this object type
                if (_mergedObjParam.HasProperties.Where(m => m.Property == nameof(_mergedObjParam.Floors)).Any())
                {
                    _propertyDamage     *= _mergedObjParam.Floors;
                    _logPropertyDamage1 += $" * Floors";
                    _logPropertyDamage2 += $" * {_mergedObjParam.Floors}";
                }

                switch (_intensityDegree)
                {
                case 0:
                    _propertyDamage     *= _objectParamProcess.VulnerabilityHigh;
                    _logPropertyDamage1 += $" * VulnerabilityHigh";
                    _logPropertyDamage2 += $" * {_objectParamProcess.VulnerabilityHigh:F3}";

                    break;

                case 1:
                    _propertyDamage     *= _objectParamProcess.VulnerabilityMedium;
                    _logPropertyDamage1 += $" * VulnerabilityMedium";
                    _logPropertyDamage2 += $" * {_objectParamProcess.VulnerabilityMedium:F3}";
                    break;

                case 2:
                    _propertyDamage     *= _objectParamProcess.VulnerabilityLow;
                    _logPropertyDamage1 += $" * VulnerabilityLow";
                    _logPropertyDamage2 += $" * {_objectParamProcess.VulnerabilityLow:F3}";
                    break;

                default:
                    throw new ArgumentOutOfRangeException(nameof(_intensityDegree), _intensityDegree, "out of range");
                }

                _damageExtent.PropertyDamage    = _propertyDamage;
                _damageExtent.LogPropertyDamage = _logPropertyDamage1 + ";\n" + _logPropertyDamage2;

                //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
                //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
                //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
            }
            // INFRASTRUCTURE
            else if (_mergedObjParam.ObjectClass.ID == 3)
            {
                //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
                // PERSON DAMAGE

                // STREETS / BRIDGES
                // LINE OBJECT
                if (_mergedObjParam.FeatureType == 1)
                {
                    if (_mergedObjParam.Personcount == 0)
                    {
                        _damageExtent.Deaths    = 0;
                        _damageExtent.LogDeaths = "no person damage";

                        _damageExtent.DeathProbability    = 0;
                        _damageExtent.LogDeathProbability = "no person damage";

                        _damageExtent.PersonDamage    = 0;
                        _damageExtent.LogPersonDamage = "no person damage";
                    }
                    else
                    {
                        _damageExtent.Length = mapObj.line.Length;

                        double _deaths = _prA.Value * _mergedObjParam.Personcount *
                                         (double)_mergedObjParam.NumberOfVehicles * _damageExtent.Length / (double)_mergedObjParam.Velocity / 24000.0d;

                        string _logDeaths1 = $"Deaths = prA * PersonCount * NumberOfVehicles * Length / Velocity / 24000";
                        string _logDeaths2 = $"Deaths = {_prA.Value:F3} * {_mergedObjParam.Personcount} * {_mergedObjParam.NumberOfVehicles} * {_damageExtent.Length:F3} / {_mergedObjParam.Velocity} / 24000";

                        switch (_intensityDegree)
                        {
                        case 0:
                            _deaths     *= _objectParamProcess.MortalityHigh;
                            _logDeaths1 += $" * MortalityHigh";
                            _logDeaths2 += $" * {_objectParamProcess.MortalityHigh:F3}";
                            break;

                        case 1:
                            _deaths     *= _objectParamProcess.MortalityMedium;
                            _logDeaths1 += $" * MortalityMedium";
                            _logDeaths2 += $" * {_objectParamProcess.MortalityMedium:F3}";
                            break;

                        case 2:
                            _deaths     *= _objectParamProcess.MortalityLow;
                            _logDeaths1 += $" * MortalityLow";
                            _logDeaths2 += $" * {_objectParamProcess.MortalityLow:F3}";
                            break;

                        default:
                            throw new ArgumentOutOfRangeException(nameof(_intensityDegree), _intensityDegree, "out of range");
                        }

                        _damageExtent.Deaths    = _deaths;
                        _damageExtent.LogDeaths = _logDeaths1 + ";\n" + _logDeaths2;

                        int    _passagesSamePerson = 4; //TODO: HARD CODED
                        double _deathProbability   = _deaths * _passagesSamePerson / _mergedObjParam.NumberOfVehicles / _mergedObjParam.Personcount;
                        string _logDProb1          = $"IndivudualDeathRisk = Deaths * PassagesSamePerson / NumberOfVehicles / PersonCount";
                        string _logDProb2          = $"IndivudualDeathRisk = {_deaths:F6} * {_passagesSamePerson} / {_mergedObjParam.NumberOfVehicles} / {_mergedObjParam.Personcount}";
                        _damageExtent.DeathProbability    = _deathProbability;
                        _damageExtent.LogDeathProbability = _logDProb1 + ";\n" + _logDProb2;

                        _damageExtent.PersonDamage     = _deaths * WillingnessToPay;
                        _damageExtent.LogPersonDamage  = $"PersonDamage = Deaths * WillingnessToPay;\n";
                        _damageExtent.LogPersonDamage += $"PersonDamage = {_deaths:F6} * {WillingnessToPay:C}";
                    }
                }
                // TOWERS
                // POINT OBJECT
                else if (_mergedObjParam.FeatureType == 0)
                {
                    _damageExtent.Deaths    = 0;
                    _damageExtent.LogDeaths = "no person damage";

                    _damageExtent.DeathProbability    = 0;
                    _damageExtent.LogDeathProbability = "no person damage";

                    _damageExtent.PersonDamage    = 0;
                    _damageExtent.LogPersonDamage = "no person damage";
                }
                // POLYGON NOT IMPLEMENTED
                else
                {
                    _damageExtent.Log += $"ERROR: Feature type not implemented";
                    return(_damageExtent);
                }


                //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
                // PROPERTY DAMAGE

                double _propertyDamage     = _prA.Value * _mergedObjParam.Value;
                string _logPropertyDamage1 = $"PropertyDamage = prA * Value";
                string _logPropertyDamage2 = $"PropertyDamage = {_prA.Value:F3} * {_mergedObjParam.Value:C}";

                switch (_mergedObjParam.FeatureType)
                {
                case 0:     //POINT BASED OBJECT (like towers)
                    _damageExtent.Piece  = 1;
                    _logPropertyDamage1 += $" * Piece";
                    _logPropertyDamage2 += $" * 1";
                    break;

                case 1:     //LINE BASED OBJECT (like streets)
                    _damageExtent.Length = mapObj.line.Length;

                    _propertyDamage     *= mapObj.line.Length;
                    _logPropertyDamage1 += $" * Length";
                    _logPropertyDamage2 += $" * {mapObj.line.Length:F3}";
                    break;

                default:
                    _damageExtent.Log += $"ERROR: Infrastructure, FEATURETYPE = {_mergedObjParam.FeatureType} \n";
                    return(_damageExtent);
                }

                switch (_intensityDegree)
                {
                case 0:
                    _propertyDamage     *= _objectParamProcess.VulnerabilityHigh;
                    _logPropertyDamage1 += $" * VulnerabilityHigh";
                    _logPropertyDamage2 += $" * {_objectParamProcess.VulnerabilityHigh:F3}";
                    break;

                case 1:
                    _propertyDamage     *= _objectParamProcess.VulnerabilityMedium;
                    _logPropertyDamage1 += $" * VulnerabilityMedium";
                    _logPropertyDamage2 += $" * {_objectParamProcess.VulnerabilityMedium:F3}";
                    break;

                case 2:
                    _propertyDamage     *= _objectParamProcess.VulnerabilityLow;
                    _logPropertyDamage1 += $" * VulnerabilityLow";
                    _logPropertyDamage2 += $" * {_objectParamProcess.VulnerabilityLow:F3}";
                    break;

                default:
                    throw new ArgumentOutOfRangeException(nameof(_intensityDegree), _intensityDegree, "out of range");
                }

                _damageExtent.PropertyDamage    = _propertyDamage;
                _damageExtent.LogPropertyDamage = _logPropertyDamage1 + ";\n" + _logPropertyDamage2;

                //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
                //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
                //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
            }
            // AGRICULTURE
            else if (_mergedObjParam.ObjectClass.ID == 4)
            {
                //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
                // PERSON DAMAGE

                _damageExtent.Deaths    = 0;
                _damageExtent.LogDeaths = "no person damage";

                _damageExtent.DeathProbability    = 0;
                _damageExtent.LogDeathProbability = "no person damage";

                _damageExtent.PersonDamage    = 0;
                _damageExtent.LogPersonDamage = "no person damage";

                //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
                // PROPERTY DAMAGE

                double _propertyDamage     = _prA.Value * _mergedObjParam.Value; //value per hectare!!!
                string _logPropertyDamage1 = $"PropertyDamage = prA * Value";
                string _logPropertyDamage2 = $"PropertyDamage = {_prA.Value:F3} * {_mergedObjParam.Value:C}";

                switch (_mergedObjParam.FeatureType)
                {
                case 2:                                                  //POLYGON BASED OBJECT
                    _damageExtent.Area   = mapObj.polygon.Area;
                    _propertyDamage     *= _damageExtent.Area / 10000.0; //in hectare!
                    _logPropertyDamage1 += $" * Area / 10000";
                    _logPropertyDamage2 += $" * {(_damageExtent.Area / 10000.0):F3}";
                    break;

                default:
                    _damageExtent.Log += $"ERROR: Agriculture, FEATURETYPE = {_mergedObjParam.FeatureType} \n";
                    return(_damageExtent);
                }

                switch (_intensityDegree)
                {
                case 0:
                    _propertyDamage     *= _objectParamProcess.VulnerabilityHigh;
                    _logPropertyDamage1 += $" * VulnerabilityHigh";
                    _logPropertyDamage2 += $" * {_objectParamProcess.VulnerabilityHigh:F3}";
                    break;

                case 1:
                    _propertyDamage     *= _objectParamProcess.VulnerabilityMedium;
                    _logPropertyDamage1 += $" * VulnerabilityMedium";
                    _logPropertyDamage2 += $" * {_objectParamProcess.VulnerabilityMedium:F3}";
                    break;

                case 2:
                    _propertyDamage     *= _objectParamProcess.VulnerabilityLow;
                    _logPropertyDamage1 += $" * VulnerabilityLow";
                    _logPropertyDamage2 += $" * {_objectParamProcess.VulnerabilityLow:F3}";
                    break;

                default:
                    throw new ArgumentOutOfRangeException(nameof(_intensityDegree), _intensityDegree, "out of range");
                }

                _damageExtent.PropertyDamage    = _propertyDamage;
                _damageExtent.LogPropertyDamage = _logPropertyDamage1 + ";\n" + _logPropertyDamage2;

                //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
                //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
                //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
            }

            else
            {
                _damageExtent.Log += $"ERROR: OBJECT CLASS = {_mergedObjParam.ObjectClass.ID} \n";
                return(_damageExtent);
            }

            //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
            //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
            //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
            // RESILIENCE FACTOR
            //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

            if (mapObj.ResilienceValues != null && mapObj.ResilienceValues.Any())
            {
                Tuple <double, string> _resilience = MappedObjectController.computeResilienceFactor(mapObj.ResilienceValues.ToList(), intensity);

                _damageExtent.ResilienceFactor    = _resilience.Item1;
                _damageExtent.LogResilienceFactor = _resilience.Item2;
            }
            else
            {
                _damageExtent.ResilienceFactor    = 0;
                _damageExtent.LogResilienceFactor = "no resilience available";
            }

            //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
            //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
            //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
            // INDIRECT DAMAGE
            //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

            double _indirectDamage     = 0;
            string _logIndirectDamage1 = "";
            string _logIndirectDamage2 = "";

            if (_mergedObjParam.ObjectClass.ID <= 3)    //Value = 1$
            {
                _indirectDamage     = _prA.Value;
                _logIndirectDamage1 = $"IndirectDamage = prA";
                _logIndirectDamage2 = $"IndirectDamage = {_prA.Value:F3}";
            }
            else //Value according to DB
            {
                _indirectDamage     = _prA.Value * _objectParamProcess.Value;
                _logIndirectDamage1 = $"IndirectDamage = prA * Value";
                _logIndirectDamage2 = $"IndirectDamage = {_prA.Value:F3} * {_objectParamProcess.Value:C}";
            }

            //if (_mergedObjParam.ObjectClass.ID != 3) //not available for infrastructure
            {
                switch (_intensityDegree) //0=high, 1=med, 2=low
                {
                case 0:
                    _indirectDamage     *= _objectParamProcess.DurationHigh;
                    _logIndirectDamage1 += $" * DurationHigh";
                    _logIndirectDamage2 += $" * {_objectParamProcess.DurationHigh:F0}";
                    break;

                case 1:
                    _indirectDamage     *= _objectParamProcess.DurationMedium;
                    _logIndirectDamage1 += $" * DurationMedium";
                    _logIndirectDamage2 += $" * {_objectParamProcess.DurationMedium:F0}";
                    break;

                case 2:
                    _indirectDamage     *= _objectParamProcess.DurationLow;
                    _logIndirectDamage1 += $" * DurationLow";
                    _logIndirectDamage2 += $" * {_objectParamProcess.DurationLow:F0}";
                    break;

                default:
                    throw new ArgumentOutOfRangeException(nameof(_intensityDegree), _intensityDegree, "out of range");
                }

                //Building and Special Objects
                if (_mergedObjParam.ObjectClass.ID <= 2)
                {
                    // staff property indicates if indirect damage is available
                    if (_mergedObjParam.HasProperties.Where(m => m.Property == nameof(_mergedObjParam.Staff)).Any())
                    {
                        _indirectDamage     *= (double)_mergedObjParam.Staff;
                        _logIndirectDamage1 += $" * Loss/day";
                        _logIndirectDamage2 += $" * {_mergedObjParam.Staff:F0}";

                        if (_damageExtent.Clipped)
                        {
                            _indirectDamage     *= _damageExtent.Part;
                            _logIndirectDamage1 += $" * PartOfLoss";
                            _logIndirectDamage2 += $" * {_damageExtent.Part:F2}";
                        }

                        if (_mergedObjParam.Staff <= 0)
                        {
                            _damageExtent.Log += $"{ResModel.DE_Staff} = {_mergedObjParam.Staff} \n";
                        }
                    }
                    else // Buildings without indirect damage
                    {
                        _indirectDamage     = 0;
                        _logIndirectDamage1 = $"no indirect damage";
                        _logIndirectDamage2 = "";
                    }
                }
                //Agriculture
                else if (_mergedObjParam.ObjectClass.ID == 4)
                {
                    _indirectDamage     *= _damageExtent.Area / 10000.0; //in hectare!
                    _logIndirectDamage1 += $" * Area / 10000";
                    _logIndirectDamage2 += $" * {_damageExtent.Area / 10000.0:F3}";
                }
                //Infrastructure
                else if (_mergedObjParam.ObjectClass.ID == 3)
                {
                    // duration indicates if indirect damage is available
                    if ((_objectParamProcess.DurationHigh + _objectParamProcess.DurationMedium + _objectParamProcess.DurationLow) > 0)
                    {
                        _indirectDamage     *= (double)_mergedObjParam.Staff;
                        _logIndirectDamage1 += $" * Loss/day";
                        _logIndirectDamage2 += $" * {_mergedObjParam.Staff:F0}";

                        //TODO
                    }
                    else // Infrastructure without indirect damage
                    {
                        _indirectDamage     = 0;
                        _logIndirectDamage1 = $"no indirect damage";
                        _logIndirectDamage2 = "";
                    }
                }
            }
            //else //Infrastructure
            //{
            //    _indirectDamage = 0;
            //    _logIndirectDamage1 = $"no indirect damage";
            //    _logIndirectDamage2 = "";
            //}

            _damageExtent.IndirectDamage    = _indirectDamage;
            _damageExtent.LogIndirectDamage = _logIndirectDamage1 + ";\n" + _logIndirectDamage2;

            //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

            // if no errors reported
            if (String.IsNullOrWhiteSpace(_damageExtent.Log))
            {
                _damageExtent.Log = "OK \n";
            }

            return(_damageExtent);
        }
예제 #3
0
        public int ImportProjectThread(string filename)
        {
            try
            {
                ZipFile.ExtractToDirectory(filename, localDirectory + "\\ImportMap");

                // import the project, add it to the database as a new project with new id
                if (File.Exists(localDirectory + "\\ImportMap\\database.sqlite"))
                {
                    RunGdalImport(localDirectory + "\\ImportMap\\database.sqlite", "projectimport", "project");
                }
                using (var context = new DB.ResTBContext())
                {
                    List <Project> importproject = context.Projects
                                                   .SqlQuery("Select * from projectimport")
                                                   .ToList <Project>();

                    if ((importproject != null) && (importproject.Count > 0))
                    {
                        Project p = new Project();
                        p.Description      = importproject[0].Description;
                        p.CoordinateSystem = importproject[0].CoordinateSystem;

                        // check if name is already there...
                        string  name = importproject[0].Name;
                        Project pold = context.Projects.Where(m => m.Name == name).FirstOrDefault();
                        if (pold != null)
                        {
                            name = name + " (import " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + ")";
                        }


                        p.Name   = name;
                        p.Number = importproject[0].Number;
                        context.Projects.Add(p);
                        context.SaveChanges();

                        Events.MapControl_BusyStateChange bc = new Events.MapControl_BusyStateChange();
                        bc.BusyState   = Events.BusyState.Busy;
                        bc.KeyOfSender = "ImportProject";
                        bc.Percent     = 10;
                        bc.Message     = Resources.MapControl_Importing;
                        MapControlTools.On_BusyStateChange(bc);

                        // we have a new project id

                        //import all new Objectparameters
                        RunGdalImport(localDirectory + "\\ImportMap\\database.sqlite", "objectparameterimport", "objectparameter");

                        RunGdalImport(localDirectory + "\\ImportMap\\database.sqlite", "resiliencevaluesimport", "resiliencevalues");

                        RunGdalImport(localDirectory + "\\ImportMap\\database.sqlite", "praimport", "pra");
                        List <PrA> importpra = context.PrAs
                                               .SqlQuery("Select * from praimport")
                                               .ToList <PrA>();
                        foreach (PrA praImp in importpra)
                        {
                            PrA pra = (PrA)praImp.Clone();
                            pra.Project = p;
                            p.PrAs.Add(pra);
                            context.PrAs.Add(pra);
                        }

                        context.SaveChanges();

                        RunGdalImport(localDirectory + "\\ImportMap\\database.sqlite", "protectionmeasureimport", "ProtectionMeasure");
                        List <ProtectionMeasure> importpm = context.ProtectionMeasurements
                                                            .SqlQuery("Select * from protectionmeasureimport")
                                                            .ToList <ProtectionMeasure>();
                        if (importpm?.Count > 0)
                        {
                            ProtectionMeasure pm = (ProtectionMeasure)importpm[0].Clone();
                            pm.Project          = p;
                            p.ProtectionMeasure = pm;
                            context.ProtectionMeasurements.Add(pm);
                            context.SaveChanges();
                        }

                        // create the ids of old objectparameters, so foreign constraint will work.
                        // But don't override existing
                        List <Objectparameter> importop = context.Objektparameter
                                                          .SqlQuery("Select * from objectparameterimport")
                                                          .ToList <Objectparameter>();

                        //
                        foreach (Objectparameter o in importop)
                        {
                            if (context.Objektparameter.Where(m => m.ID == o.ID).ToList().Count == 0)
                            {
                                context.Database.ExecuteSqlCommand("INSERT INTO public.\"Objectparameter\" (\"ID\",\"FeatureType\",\"Value\",\"Floors\",\"Personcount\",\"Presence\",\"NumberOfVehicles\",\"Velocity\",\"Staff\",\"IsStandard\",\"ObjectClass_ID\")\tVALUES (" + o.ID + ",1,0,0,0,0.0,0,0,0,false,1); ");
                            }
                        }



                        ResTBPostGISLayer tempLayer = new ResTBMitigationMeasureLayer(0);
                        if (File.Exists(localDirectory + "\\ImportMap\\" + tempLayer.ExportImportFileName + ".shp"))
                        {
                            RunGdalImport(localDirectory + "\\ImportMap\\" + tempLayer.ExportImportFileName + ".shp", "protectionmeasuregeometryimport");
                            context.Database.ExecuteSqlCommand("insert into \"ProtectionMeasureGeometry\" (project_fk, geometry) select " + p.Id + ", wkb_geometry from protectionmeasuregeometryimport;");
                        }
                        bc             = new Events.MapControl_BusyStateChange();
                        bc.BusyState   = Events.BusyState.Busy;
                        bc.KeyOfSender = "ImportProject";
                        bc.Percent     = 30;
                        bc.Message     = Resources.MapControl_Importing;
                        MapControlTools.On_BusyStateChange(bc);

                        tempLayer = new ResTBPerimeterLayer(0);
                        if (File.Exists(localDirectory + "\\ImportMap\\" + tempLayer.ExportImportFileName + ".shp"))
                        {
                            RunGdalImport(localDirectory + "\\ImportMap\\" + tempLayer.ExportImportFileName + ".shp", "perimeterimport");
                            context.Database.ExecuteSqlCommand("insert into \"Perimeter\" (project_fk, geometry) select " + p.Id + ", wkb_geometry from perimeterimport;");
                        }
                        bc             = new Events.MapControl_BusyStateChange();
                        bc.BusyState   = Events.BusyState.Busy;
                        bc.KeyOfSender = "ImportProject";
                        bc.Percent     = 40;
                        bc.Message     = Resources.MapControl_Importing;
                        MapControlTools.On_BusyStateChange(bc);

                        tempLayer = new ResTBHazardMapLayer(0, false, context.NatHazards.ToList().First(), 0);
                        if (File.Exists(localDirectory + "\\ImportMap\\" + tempLayer.ExportImportFileName + ".shp"))
                        {
                            RunGdalImport(localDirectory + "\\ImportMap\\" + tempLayer.ExportImportFileName + ".shp", "hazardmapimport");
                            context.Database.ExecuteSqlCommand("insert into \"HazardMap\" (\"Project_Id\", \"Index\",\"BeforeAction\",\"NatHazard_ID\",geometry) select " + p.Id + ",\"index\",CASE WHEN beforeacti IS NULL THEN false WHEN beforeacti = 0 THEN false ELSE true END beforeaction ,\"nathazard_\", wkb_geometry from hazardmapimport;");
                        }
                        bc             = new Events.MapControl_BusyStateChange();
                        bc.BusyState   = Events.BusyState.Busy;
                        bc.KeyOfSender = "ImportProject";
                        bc.Percent     = 50;
                        bc.Message     = Resources.MapControl_Importing;
                        MapControlTools.On_BusyStateChange(bc);

                        tempLayer = new ResTBDamagePotentialLayer(0);
                        if (File.Exists(localDirectory + "\\ImportMap\\" + tempLayer.ExportImportFileName + "_Points.shp"))
                        {
                            RunGdalImport(localDirectory + "\\ImportMap\\" + tempLayer.ExportImportFileName + "_Points.shp", "damagepotentialpoints");
                            context.Database.ExecuteSqlCommand("insert into \"MappedObject\" (\"Project_Id\", \"FreeFillParameter_ID\",\"Objectparameter_ID\",point) select " + p.Id + ", freefillpa, objectpara, wkb_geometry from damagepotentialpoints;");
                        }
                        if (File.Exists(localDirectory + "\\ImportMap\\" + tempLayer.ExportImportFileName + "_Lines.shp"))
                        {
                            RunGdalImport(localDirectory + "\\ImportMap\\" + tempLayer.ExportImportFileName + "_Lines.shp", "damagepotentiallines");
                            context.Database.ExecuteSqlCommand("insert into \"MappedObject\" (\"Project_Id\", \"FreeFillParameter_ID\",\"Objectparameter_ID\",line) select " + p.Id + ", freefillpa, objectpara, wkb_geometry from damagepotentiallines;");
                        }

                        List <int> importrvsMOID = context.Database.SqlQuery <int>("select distinct mappedobject_id from resiliencevaluesimport")
                                                   .ToList <int>();


                        bc             = new Events.MapControl_BusyStateChange();
                        bc.BusyState   = Events.BusyState.Busy;
                        bc.KeyOfSender = "ImportProject";
                        bc.Percent     = 60;
                        bc.Message     = Resources.MapControl_Importing;
                        MapControlTools.On_BusyStateChange(bc);



                        if (File.Exists(localDirectory + "\\ImportMap\\" + tempLayer.ExportImportFileName + "_Polygones.shp"))
                        {
                            RunGdalImport(localDirectory + "\\ImportMap\\" + tempLayer.ExportImportFileName + "_Polygones.shp", "damagepotentialpolygones");
                            context.Database.ExecuteSqlCommand("insert into \"MappedObject\" (\"Project_Id\", \"FreeFillParameter_ID\",\"Objectparameter_ID\",polygon) select " + p.Id + ", freefillpa, objectpara, wkb_geometry from damagepotentialpolygones;");
                        }
                        bc             = new Events.MapControl_BusyStateChange();
                        bc.BusyState   = Events.BusyState.Busy;
                        bc.KeyOfSender = "ImportProject";
                        bc.Percent     = 70;
                        bc.Message     = Resources.MapControl_Importing;
                        MapControlTools.On_BusyStateChange(bc);

                        foreach (int moID in importrvsMOID)
                        {
                            string sql = "insert into \"ResilienceValues\" (\"OverwrittenWeight\", \"Value\", \"MappedObject_ID\", \"ResilienceWeight_ID\") " +
                                         "select r.overwrittenweight, r.value, (select \"ID\" " +
                                         "from \"MappedObject\" mo where polygon = ( " +
                                         "select wkb_geometry from damagepotentialpolygones d " +
                                         "where d.id = " + moID + ") " +
                                         "and \"Project_Id\" = " + p.Id + "), r.resilienceweight_id from resiliencevaluesimport r where r.mappedobject_id = " + moID + "; ";
                            context.Database.ExecuteSqlCommand(sql);
                        }



                        List <MappedObject> mos = context.MappedObjects.Where(m => m.Project.Id == p.Id).ToList();

                        // Insert FreeFills and Objectparameters

                        foreach (MappedObject mo in mos)
                        {
                            if (mo.FreeFillParameter != null)
                            {
                                Objectparameter o     = importop.Where(m => m.ID == mo.FreeFillParameter.ID).FirstOrDefault();
                                Objectparameter oCopy = ShallowCopyEntity <Objectparameter>(o);
                                context.Objektparameter.Add(oCopy);
                                mo.FreeFillParameter = oCopy;
                                context.SaveChanges();
                            }
                            if (mo.Objectparameter != null)
                            {
                                Objectparameter o = importop.Where(m => m.ID == mo.Objectparameter.ID).FirstOrDefault();

                                // not a standard objectparameter
                                if (o != null)
                                {
                                    Objectparameter oCopy = ShallowCopyEntity <Objectparameter>(o);

                                    // get the objectclass
                                    int         objClassID = context.Database.SqlQuery <int>("select objectclass_id from objectparameterimport where id = " + o.ID).First();
                                    ObjectClass oc         = context.ObjektKlassen.Find(objClassID);
                                    oCopy.ObjectClass = oc;
                                    // get the motherobject
                                    int             motherObjID = context.Database.SqlQuery <int>("select motherotbjectparameter_id from objectparameterimport where id = " + o.ID).First();
                                    Objectparameter motherObj   = context.Objektparameter.Find(motherObjID);
                                    oCopy.MotherOtbjectparameter = motherObj;

                                    context.Objektparameter.Add(oCopy);
                                    mo.Objectparameter = oCopy;
                                    context.SaveChanges();
                                }
                            }
                        }



                        bc             = new Events.MapControl_BusyStateChange();
                        bc.BusyState   = Events.BusyState.Idle;
                        bc.KeyOfSender = "ImportProject";
                        bc.Percent     = 100;
                        bc.Message     = Resources.MapControl_Importing_Success;
                        MapControlTools.On_BusyStateChange(bc);

                        return(p.Id);
                    }
                }
            }
            catch (Exception e)
            {
                Events.MapControl_Error export_error = new Events.MapControl_Error()
                {
                    ErrorCode = Events.ErrorCodes.ImportExportError, InMethod = "ImportProject", AxMapError = e.ToString()
                };
                On_Error(export_error);
            }
            return(-1);
        }