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);
}
}
}
原文:http://www.cnblogs.com/lierjie/p/3958505.html