package com.cc.common.utils.aqiutil;import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;import com.ldst.common.entity.Aqi;/*** AQI工具类*/
public class AQIUtlis {/**空气质量分指数*/private static List<Integer> AQIList= Arrays.asList(0,50,100,150,200,300,400,500);/**SO2 1小时 平均(ug/m3)*/private static List<Integer> SO2HOURList= Arrays.asList(0,150,500,650,800);/**SO2 24小时 平均*/private static List<Integer> SO2DAYList= Arrays.asList(0,50,150,475,800,1600,2100,2620);/**NO2 1小时 平均(ug/m3)*/private static List<Integer> NO2HOURList= Arrays.asList(0,100,200,700,1200,2340,3090,3840);/**NO2 24小时 平均*/private static List<Integer> NO2DAYList= Arrays.asList(0,40,80,180,280,565,750,940);/**PM10 24小时 平均*/private static List<Integer> PM10DAYList= Arrays.asList(0,50,150,250,350,420,500,600);/**CO 1小时 平均(mg/m3)*/private static List<Integer> COHOURList= Arrays.asList(0,5,10,35,60,90,120,150);/**CO 24小时 平均(mg/m3)*/private static List<Integer> CODAYList= Arrays.asList(0,2,4,14,24,36,48,60);/**O3 小时 平均(ug/m3)*/private static List<Integer> O3HOURList= Arrays.asList(0,160,200,300,400,800,1000,1200);/**O3 8小时滑动 平均(ug/m3)*/private static List<Integer> O3_8HList= Arrays.asList(0,100,160,215,265,800);/**PM25 24小时平均(ug/m3)*/private static List<Integer> PM25DAYList= Arrays.asList(0,35,75,115,150,250,350,500);private static List<String> listPollute = Arrays.asList("SO2", "NO2", "O3","PM10","PM25","CO");private static final String SO2_TYPE="SO2";private static final String NO2_TYPE="NO2";private static final String O3_TYPE="O3";private static final String PM25_TYPE="PM25";private static final String PM10_TYPE="PM10";private static final String CO_TYPE="CO";public static final String HAQI="H"; //小时aqi标识public static final String DAQI="D"; //日aqi标识/*** 空气质量指数AQI的计算:供AQI计算调用* 注意事项:* 6参值顺序固定* @param  aqiType   静态变量HAQI:小时AQI    DAQI:日AQI* 参数值单位:CO为mg/m3  其它参数 :μg/m3* @param SO2* @param NO2* @param O3 type为D时,使用O3_8H,因计算日综合指数时日中的O3已存为O3_8H,即为日表中的O3* @param PM10* @param PM25* @param CO* @param aqiType* @return  aqi (AQI值和首要污染物)*/public static Aqi getAQIByParam(Double SO2, Double NO2, Double O3,Double PM10,Double PM25,Double CO,String aqiType){List<Integer> list=new ArrayList<>();Aqi aqi=new Aqi();if (null!=SO2 && SO2>0 && SO2<=800){ // 二氧化硫(SO2 )1 小时平均浓度值高于 800 μg/m3 的,不再进行其空气质量分指数计算,二氧化硫(SO2 )空气质量分指数按 24 小时平均浓度计算的分指数报告。list.add(getIAQI(SO2_TYPE,SO2,aqiType));}else {list.add(null);}if(null!=NO2 && NO2>0 && NO2<=3840){list.add(getIAQI(NO2_TYPE,NO2,aqiType));}else {list.add(null);}if(null!=O3 && O3>0 && O3<=1200){list.add(getIAQI(O3_TYPE,O3,aqiType));}else {list.add(null);}if(null!=PM10 && PM10>0 && PM10<=600){//24小时list.add(getIAQI(PM10_TYPE,PM10,aqiType));}else {list.add(null);}if(null!=PM25 && PM25>0 && PM25<=500){//24小时list.add(getIAQI(PM25_TYPE,PM25,aqiType));}else {list.add(null);}if(null!=CO && CO>0 && CO<=150){list.add(getIAQI(CO_TYPE,CO,aqiType));}else {list.add(null);}// list长度可能小于listPollute长度;// 首要污染物为,空气质量指数大于 50 时,空气质量分指数最大的空气污染物。// 多种首要污染物if(null!=list&&list.size()>0){Integer maxAqiValue = null;for (Integer aqiValue : list) { // 全为null(返回null),部分为null,全不为nullif(aqiValue != null) {if(maxAqiValue == null) {maxAqiValue = aqiValue;}else {if( aqiValue> maxAqiValue) {maxAqiValue = aqiValue;}}}}if(maxAqiValue != null && maxAqiValue > 50) {String pollutesJoint = null;for (int i=0; i<list.size(); i++) {Integer aqiValue = list.get(i);if( maxAqiValue == aqiValue) { // 不会空指针异常if(pollutesJoint == null) {pollutesJoint = listPollute.get(i);}else {pollutesJoint += "," + listPollute.get(i);}}}aqi.setAqi(maxAqiValue);aqi.setName(pollutesJoint);}}return aqi;}/*** 分指数计算* @param param* @param paramValue* @param type* @return*/private static Integer getIAQI(String param,Double paramValue,String type){int IAQI=-99;switch (param){case SO2_TYPE:if(HAQI.equals(type)){IAQI=getAQIValue(SO2HOURList,paramValue);break;}else{IAQI=getAQIValue(SO2DAYList,paramValue);break;}case NO2_TYPE:if(HAQI.equals(type)){IAQI=getAQIValue(NO2HOURList,paramValue);break;}else{IAQI=getAQIValue(NO2DAYList,paramValue);break;}case O3_TYPE:if(HAQI.equals(type)){IAQI=getAQIValue(O3HOURList,paramValue);break;}else{IAQI=getAQIValue(O3_8HList,paramValue);break;}case PM10_TYPE:IAQI=getAQIValue(PM10DAYList,paramValue);break;case PM25_TYPE:IAQI=getAQIValue(PM25DAYList,paramValue);break;case CO_TYPE:if(HAQI.equals(type)){IAQI=getAQIValue(COHOURList,paramValue);break;}else{IAQI=getAQIValue(CODAYList,paramValue);break;}}return IAQI;}private static Integer getAQIValue(List<?> list,Double paramValue){int IAQI=-99;int BPL=0;//低位值int BPH=0;//高位值int BPHIndex=0;int IAQIH=0;//BPH对应的空气质量分指数int IAQIL=0;//BPL对应的空气质量分指数for(int i=0;i<list.size();i++){if((Integer)list.get(i)>(new Double(paramValue).intValue())){ // TODO index如何取值? intValue目前是取整;BPH=(Integer)list.get(i);BPL=(Integer)list.get(i-1);BPHIndex=i;break;}}IAQIH=AQIList.get(BPHIndex);IAQIL=AQIList.get(BPHIndex-1);Double AQI=((((IAQIH-IAQIL)*100)/(BPH-BPL))*0.01)*(paramValue-BPL)+IAQIL;if(null!=AQI){IAQI= (int)Math.ceil(AQI);}return IAQI;}/**** @param AQI  aqi值* @return  质量水平*/public static String getAQILevel(int AQI){String level="有毒害";if(AQI<=50)level="良好";else if(AQI<=100)level="中等";else if(AQI<=150)level="对敏感人群不健康";else if(AQI<=200)level="不健康";else if(AQI<=300)level="非常不健康";return level;}public static void main(String[] args) {Double SO2=15.0; Double NO2=27.0; Double O3=162.0;Double PM10=65.0;  Double PM25=30.0;Double CO=0.8;Aqi aqi = getAQIByParam(SO2, NO2, O3,PM10 , PM25,CO,DAQI);System.out.println(aqi.getName());System.out.println(aqi.getAqi());}}

Aqi计算首要污染物工具类相关推荐

  1. 腾讯开放平台接口鉴权(计算签名)工具类 java版

    腾讯开放平台 接口鉴权(签名)工具类 java版 用到了Hutool工具类 package top.seasmall.platform.core.config.nettyws.util;import ...

  2. dateutil 日期计算_时间工具类DateUtil的使用

    ###前言 在Android开发过程中,我们经常会用到时间相关方法.这里我封装一个时间工具类`DateUtil`,以方便使用. 今天涉及内容: 1. DateUtil在MainActivity中的使用 ...

  3. android 经纬度工具类,计算经纬度距离工具类

    public class LocationUtils { private static double EARTH_RADIUS = 6378.137; private static double ra ...

  4. 根据两点经纬度计算两点距离...工具类

    /** * 根据两点经纬度计算距离 * 直接调用使用即可 * @author tarena  *  */ public class DistanceUtil {     public static f ...

  5. Java 根据身份证号计算周岁年龄 工具类

    package com.yao.utils; import java.util.Calendar; /**  * 根据身份证号计算周岁年龄  * @author yaodd  * @date 2021 ...

  6. 猿创征文|Java计算【生日工具类】看这篇就够了

  7. 方差计算工具类--Java版

    方差的计算,如果不太计较精度的话,可以使用 Apache 的 commons-math3(http://commons.apache.org/proper/commons-math/)提供的 Vari ...

  8. hbase 按时刻查询_Hbase查询工具类,根据时间查询数据

    1,需求:已知空气监测数据在hbase中存储,要求按照时间,查询citycode为110000(北京)一个月的数据,数据为每日的监测数据 ID ,CITYCODE,SO2 ,CO,NO2 ,O3, P ...

  9. JAVA获取N个工作日后的时间的工具类、考虑上班时间、时区

    DayWorkTime代表工作时间描述类 HolidayUtils是计算时间的工具类,addSecondByWorkDay用于计算时间加上指定秒后的工作时间,会自动跳过周末.节假日等.其中holida ...

最新文章

  1. 指针02 - 零基础入门学习C语言42
  2. redistemplate.opsforhash设置过期时间_Redis详解(十一)------ 过期删除策略和内存淘汰策略...
  3. 核心(Core) Javascript 学习手记
  4. 怎么判断噎到没噎到_怎么判断噎到没噎到
  5. Entity Framework返回IEnumerable还是IQueryable?
  6. 站长常用广告代码的表达大全
  7. 对C#面向对象三大特性的一点总结
  8. python微信群管理开禁言_微信群群主可不可以设置禁言?群主设置禁言别人方法...
  9. 【解决方案】HIKSDK/大华SDK/Ehome协议视频融合平台EasyCVR在危化行业的监控系统搭建应用
  10. 小米手机电池测试软件哪个比较好,教你查看小米8电池损耗
  11. axis2弱密码漏洞复现
  12. axio get传参。
  13. 在ODBC 中 应 用DDX 和RFX (转)
  14. 蓝牙BQB认证的过程与方式(SIG)
  15. element UI dialog点击dialog区域外会关闭dialog
  16. Android 小知识:startActivity 与 finish 的调用顺序
  17. java第五章:面向对象(oop)三大特性之多态
  18. 【数据库迁移系列】从MySQL到openGauss的数据库对象迁移实践
  19. MongoShake数据灾备与迁移
  20. 通过PaddleOCR识别PDF

热门文章

  1. 新底座、新产品、新方案,2022用友BIP技术大会三大数智化突破
  2. Axure 元件属性
  3. 华为s5720默认用户名和密码_华为S5720常用命令
  4. WIN7 shutdown 定时/倒计时 命令关机
  5. 乐视笔试算法题美团算法笔试题
  6. 为什么下载的破解游戏和软件经常会被报毒?
  7. The inferior stopped because it received a signal from the Operating System.
  8. Qt ERROR : The inferior stopped because it received a signal from the operating system.
  9. 动态代理ip的测试步骤有哪些?
  10. PS中的颜色模式,8位、16位、32位区别、以及背景内容的区别