计算空气指标AQI

推荐链接:blog.sina.com.cn/s/blog_6925c03c0102w3ow.html

这位老哥写的计算公式和原理个人觉得不错,愿意了解的可以去看看!

代码:

 /*
  * 计算空气AQI值
  * params() 和 getDatas()是自己封装的获取传值以及处理返回值的方法
  */
    function calculateAQI(){
    //获取传值
        $PM10 = params('PM10');
        $PM25 = params('PM25');
        $CO = params('CO');
        $SO2 = params('SO2');
        $NO2 = params('NO2');
        $O3 = params('O3');

        //参数区间
//        $PM10_arr = [0,50,150,250,350,420,600];
//        $PM25_arr = [0,35,75,115,150,250,500];
//        $CO_arr = [0,5,10,35,60,90,150];
//        $SO2_arr = [0,150,500,650,800];
//        $NO2_arr = [0,100,200,700,1200,2340,3840];
//        $O3_arr = [0,160,200,300,400,800,1200];

        $PM10_arr = [0,50,150,250,350,420,500,600];
        $PM25_arr = [0,35,75,115,150,250,350,500];
        $CO_arr = [0,2,4,14,24,36,48,60];
        $SO2_arr = [0,150,500,650,800];
        $NO2_arr = [0,50,150,475,800,1600,2100,2620];
        $O3_arr = [0,100,160,215,265,800];

        //获取每个指数的AQI
        $arr = array();
        $arr['PM10'] = self::interval($PM10_arr,$PM10,8);
        $arr['PM25'] = self::interval($PM25_arr,$PM25,8);
        $arr['CO'] = self::interval($CO_arr,$CO,8);
        $arr['SO2'] = self::interval($SO2_arr,$SO2,5);
        $arr['NO2'] = self::interval($NO2_arr,$NO2,8);
        $arr['O3'] = self::interval($O3_arr,$O3,6);

        //结果排序
        $AQI = max($arr);
        
        //包装、处理返回值
        return getDates($AQI);
    }

    //获取指数所处区间
    function interval($arr,$val,$max){
        $IAQI_arr = [0,50,100,150,200,300,400,500];//空气质量分指数
        $result = 0;
        for($i=0;$i<$max;$i++){
            if($i<$max-1){
                if($arr[$i]<$val && $val<=$arr[$i+1]){
                    $ihigh = $IAQI_arr[$i+1];
                    $ilow = $IAQI_arr[$i];
                    $high = $arr[$i+1];
                    $low = $arr[$i];
                    $result = self::calculate($ihigh,$ilow,$high,$low,$val);
                }
            }
        }
        return $result;
    }
    
    function calculate($ihigh,$ilow,$high,$low,$value){

        $AQI = ($ihigh - $ilow) * ($value - $low) / ($high - $low)  + $ilow;

        return round($AQI);
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值