首页 > 代码库 > AQI算法(原创)

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 = http://www.mamicode.com/((Convertd(IHIGH) - Convertd(ILOW)) / (Convertd(CHIGH) - Convertd(CLOW))) * (Indata - CLOW) + ILOW;"d"></param>        /// <returns></returns>        private decimal Convertd(decimal d)        {            return Convert.ToDecimal(d);        }    }}

  

AQI算法(原创)