• AQI算法(原创)


    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace GETAQI.Resolution
    {
        //计算空气aqi的值
        public class AQI
        {
            //中国浓度标准
            int[] a = new int[] { 0, 35, 36, 75, 76, 115, 116, 150, 151, 250, 251, 350, 351, 500 };
            //中国AQI标准
            int[] b = new int[] { 0, 50, 51, 100, 101, 150, 151, 200, 201, 300, 301, 400, 401, 500 };
    
            //标准浓度最低值
            public int CLOW { get; set; }
            //标准浓度最高值
            public int CHIGH { get; set; }
            //aqi标准低值
            public int ILOW { get; set; }
            //aqi标准高值
            public int IHIGH { get; set; }
    
    
            //计算所得AQI值
            public decimal AQIValue { get; set; }
    
            //返回给前面的dictory
            Dictionary<string[], decimal> frontDIC = new Dictionary<string[], decimal>();
    
            /// <summary>
            /// 返回要素等
            /// </summary>
            /// <param name="Indata">Dictionary<string, decimal> string 当前的要素 ,decimal 具体的浓度值</param>
            /// <returns>Dictionary<string[], decimal> string[0] 污染等级 string[1] 返回的aqi值</returns>
            public Dictionary<string[], decimal> ReturnDate(Dictionary<string, decimal> dic)
            {
                decimal AQImaxNum = 0.0m;
                ////测试
                //foreach (var iii in dic)
                //{
                //    SetRange(Math.Round((iii.Value), 1));
                //    decimal dada = GetAQI(iii.Value);
                //    Console.WriteLine("浓度"+iii.Value+" "+dada);
                //}
                foreach (KeyValuePair<string, decimal> item in dic)
                {
                    SetRange(Math.Round((item.Value), 1));
                    //获取转换后的aqi
                    decimal Currentaqi = Math.Round(GetAQI(item.Value), 1);
                    //判断最大数
                    if (Currentaqi > AQImaxNum)
                    {
                        AQImaxNum = Currentaqi;
                        string[] s = { GetLevel(Currentaqi), item.Key };
                        frontDIC.Clear();
                        frontDIC.Add(s, AQImaxNum);
                    }
                }
                return frontDIC;
            }
    
            /// <summary>
            /// 返回单一aqi值
            /// </summary>
            /// <param name="Indata">传入的数据</param>
            /// <returns></returns>
            public decimal ReturnDate(decimal Indata)
            {
                //设置范围
                SetRange(Indata);
                //把改变好的加回来
                return Math.Round(GetAQI(Indata), 1);
            }
    
    
            /// <summary>
            /// 返回专家意见以及优良可中差
            /// </summary>
            /// <param name="CurrentAQI"></param>
            /// <returns></returns>
            private string GetLevel(decimal CurrentAQI)
            {
                string returnStr = "";
                //0-50 良好   空气质量令人满意,基本无空气污染,各类人群可正常活动。
                if (CurrentAQI >= 0 && CurrentAQI <= 50)
                {
                    returnStr = "良好,空气质量令人满意,基本无空气污染,各类人群可正常活动";
                }
                //51-100中等  此时空气质量可接受,但某些污染物可能对极少数异常敏感人群健康有较弱影响,建议极少数异常敏感人群应减少户外活动。
                else if (CurrentAQI >= 51 && CurrentAQI <= 100)
                {
                    returnStr = "此时空气质量可接受,但某些污染物可能对极少数异常敏感人群健康有较弱影响,建议极少数异常敏感人群应减少户外活动";
                }
                //101-150对敏感人群不健康 空气质量状况属于轻度污染。此时,易感人群症状有轻度加剧,健康人群出现刺激症状。建议儿童、老年人及心脏病、呼吸系统疾病患者应减少长时间、高强度的户外锻炼。
                else if (CurrentAQI >= 101 && CurrentAQI <= 150)
                {
                    returnStr = "对敏感人群不健康 空气质量状况属于轻度污染。此时,易感人群症状有轻度加剧,健康人群出现刺激症状。建议儿童、老年人及心脏病、呼吸系统疾病患者应减少长时间、高强度的户外锻炼";
                }
                //151-200 不健康 可能对健康人群心脏、呼吸系统有影响,建议疾病患者避免长时间、高强度的户外锻练,一般人群适量减少户外运动。
                else if (CurrentAQI >= 105 && CurrentAQI <= 200)
                {
                    returnStr = "不健康 可能对健康人群心脏、呼吸系统有影响,建议疾病患者避免长时间、高强度的户外锻练,一般人群适量减少户外运动";
                }
                //201-300非常不健康 心脏病和肺病患者症状显著加剧,运动耐受力降低,健康人群普遍出现症状,建议儿童、老年人和心脏病、肺病患者应停留在室内,停止户外运动,一般人群减少户外运动。
                else if (CurrentAQI >= 201 && CurrentAQI <= 300)
                {
                    returnStr = "非常不健康 心脏病和肺病患者症状显著加剧,运动耐受力降低,健康人群普遍出现症状,建议儿童、老年人和心脏病、肺病患者应停留在室内,停止户外运动,一般人群减少户外运动";
                }
                //301-400有毒害 健康人群运动耐受力降低,有明显强烈症状,提前出现某些疾病,建议儿童、老年人和病人应当留在室内,避免体力消耗,一般人群应避免户外活动。
                else if (CurrentAQI >= 301 && CurrentAQI <= 400)
                {
                    returnStr = "有毒害 健康人群运动耐受力降低,有明显强烈症状,提前出现某些疾病,建议儿童、老年人和病人应当留在室内,避免体力消耗,一般人群应避免户外活动";
                }
                //401-500有毒害 健康人群运动耐受力降低,有明显强烈症状,提前出现某些疾病,建议儿童、老年人和病人应当留在室内,避免体力消耗,一般人群应避免户外活动。
                else if (CurrentAQI >= 401 && CurrentAQI <= 500)
                {
                    returnStr = "有毒害 健康人群运动耐受力降低,有明显强烈症状,提前出现某些疾病,建议儿童、老年人和病人应当留在室内,避免体力消耗,一般人群应避免户外活动";
                }
                else
                {
                    return returnStr = "AQI已经严重超出了范围,这个是不正确的!";
                }
                return returnStr;
            }
            /// <summary>
            /// 设置范围
            /// </summary>
            /// <param name="Indata"></param>
            private void SetRange(decimal Indata)
            {
                //循环第一个数组获取相应的参数值
                for (int i = 0; i < a.Length - 1; i++)
                {
                    if (Indata >= a[i] && Indata <= a[i + 1])
                    {
                        CLOW = a[i];
                        CHIGH = a[i + 1];
                        ILOW = b[i];
                        IHIGH = b[i + 1];
                    }
                }
            }
    
    
            /// <summary>
            /// 实际的aqi计算公式
            /// </summary>
            /// <param name="Indata"></param>
            /// <returns></returns>
            private decimal GetAQI(decimal Indata)
            {
                AQIValue = ((Convertd(IHIGH) - Convertd(ILOW)) / (Convertd(CHIGH) - Convertd(CLOW))) * (Indata - CLOW) + ILOW;
                return AQIValue;
            }
    
            /// <summary>
            /// 转换成decimal吧数字
            /// </summary>
            /// <param name="d"></param>
            /// <returns></returns>
            private decimal Convertd(decimal d)
            {
                return Convert.ToDecimal(d);
            }
        }
    }
    

      

  • 相关阅读:
    织梦DEDEcms首页调用文档整篇内容
    dedecms专题列表页不显示标题的解决办法
    怎么让织梦文章按照权重排序
    Codeforces274B
    HDU5693
    HDU2476
    POJ3613
    「LibreOJ NOIP Round #1」旅游路线
    Educational Codeforces Round 48
    组合博弈学习笔记
  • 原文地址:https://www.cnblogs.com/lierjie/p/3958505.html
Copyright © 2020-2023  润新知