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

  

原文地址:https://www.cnblogs.com/lierjie/p/3958505.html