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