Extra Form
CMS XpressEngine

    public static function getAirQualityIndex($aqi, $type = 'obj')
    {
        $scale = new stdClass();
        $scale->val = $aqi;

        if(-999 == $aqi) 
        {
            $scale->bgcolor = '#666';
            $scale->color = '#fff';
            $scale->level = '-';
        }
        elseif(300 < $aqi) 
        {
            $scale->bgcolor = '#7e0023';
            $scale->color = '#fff';
            $scale->level = '위험';
        }
        elseif(200 < $aqi)
        {
            $scale->bgcolor = '#cc0033';
            $scale->color = '#fff';
            $scale->level = '매우나쁨';
        }
        elseif(150 < $aqi)
        {
            $scale->bgcolor = '#cc0033';
            $scale->color = '#fff';
            $scale->level = '매우나쁨';
        }
        elseif(80 < $aqi)
        {
            $scale->bgcolor = '#cc0033';
            $scale->color = '#fff';
            $scale->level = '나쁨';
        }
        elseif(30 < $aqi)
        {
            $scale->bgcolor = '#ffde33';
            $scale->color = '#000';
            $scale->level = '보통';
        }
        else
        {
            $scale->bgcolor = '#009966';
            $scale->color = '#fff';
            $scale->level = '좋음';
        }

        return $type == 'obj' ? $scale : $scale->bgcolor;
    }

 

 

$aqi 에 미세먼지값, 초미세먼지값 2가지 가 모두 있는데.. 저 값이 어떤 값을 기준으로 하는지 갑자기 궁금해졌습니다.

 

뭔가 이상하다는 생각이 들어서요. 초미세먼지의 농도별 단계는 또 다르거든요.

 

 

 

위쪽에서 api에서 가져오는 부분은 

 

if(!$aqi_data)
        {
            // 공기질 : 새 데이터 작성 실패시 혹시 유효기간 지난 캐시라도 있으면 캐시 사용
            $aqi_data = new stdClass();
            self::initData($geo, $aqi_data, 'aqi');

            $aqicn_url = 'https://api.waqi.info/feed/geo:'.$geo->lat.';'.$geo->lng.'/?token='.self::$_aqicn_token;
            if($air = json_decode(self::file_get_contents_curl($aqicn_url, self::$_timeout)))
            {
                if($air->status === 'ok')
                {
                    $is_aqi_new = true;
                    $aqi_data = self::getAirQualityIndex((int)$air->data->aqi);
                    $aqi_data->pm10 = $air->data->iaqi->pm10->v;
                    $aqi_data->pm10_color = self::getAirQualityIndex((int)$aqi_data->pm10, 'color');
                    $aqi_data->pm25 = $air->data->iaqi->pm25->v;
                    $aqi_data->pm25_color = self::getAirQualityIndex((int)$aqi_data->pm25, 'color');
                    $aqi_data->time = date('H:i', strtotime($air->data->time->s));
                    $aqi_data->time_full = $air->data->time->s;
                }
            }
            if($aqi_data->time == '' && $cached_aqi)
            {
                $aqi_data = $cached_aqi;
            }
        }

 

 

이렇습니다. 저는 이걸 미세먼지, 초미세먼지 두개 농도값을 모두 다 적용해서 단계를 표시해 주려고 하는데 코드 자체를 이해하지 못하는 상황이 되어 버렸네요.

  • profile
    $aqicn_url 에서 만든 uri을 가지고 file_get_contents_curl으로 요청한 값을 json 으로 디코딩 하여 오브젝트를 만든 것이 있습니다.

    이 데이터를 $air->data->aqi 으로 인코딩했는것 같은데, 이 값이 integer(순수한 숫자값) 값으로 보여집니다. 그 숫자에 따라 날씨관련 조절이 있는듯 한데요?

    암튼 그걸

    메서드로 호출할때 $aqi 값으로 넘겨서 받는쪽에서 $salce 이라는 변수의 val 이라는 열쇠값에 변수를 저장했다고 보시면되요.
  • profile
    아마도 $aqi 가 미세농도의 그 수치값으로 보여지네요.
    그 수치를 가져와서 어떤 수치값에 따라 미세먼지농도를 결정한다음 return 값으로 보내주는.. 그래서 그 타입이 오브젝트 형태로 넘어가는거예요.
  • profile profile

    $aqi_data->pm10 = $air->data->iaqi->pm10->v; // 이게 미세먼지 농도 입니다.
    $aqi_data->pm25 = $air->data->iaqi->pm25->v; // 이게 초미세먼지 농도 이구요.

    if(-999 == $aqi) 여기서 $aqi 값이 어떤 값인지 모르겠습니다. 저는 미세,초미세 두개를 수치를 다르게 적용하고 싶거든요.

     

    $scale->val = $aqi; 이것의 의미도 궁금하구요....

  • profile profile

    답변자도 결국 코드만 보고는 어떤 값인지 답변드리기는 어려운 질문입니다.

    getAirQualityIndex에서 aqi으로 보내는 값자체가 어떤 수치값으로 보여지고 그 수치를 이용해서 농도의 정도를 구하고 있는듯합니다. 자세한건 api제공하는 제공처의 데이터값들이 어떤것인지를 확인 해봐야 할것같아요

  • profile profile
    결과로만 봐서는 초미세먼지농도 값이 기준이 되는 것 같습니다. 왜 그런지 이유는 잘 모르겠네요.
  • profile profile
    아래에 남겨주신 코드에서 보시면 데이터를 날씨서비스서버에 요청하여 얻은값을 보내주고 있어요.
  • profile profile
    네. 거기서 여러가지 값을 받아올텐데 초미세먼지농도,미세먼지농도 값이 등 여러가지 에디터 중 어느것을 사용하는 건지 기술적으로 이해가 가지 않아서요.
  • profile profile
    다시 값을 조정해 보니 초미세먼지 농도 또는 미세먼지농도가 아닌 다른 기준값이 뭔가 있나 보네요. 이 값과 매치가 안되네요...
  • profile

    $scale->val = $aqi; 이건 그냥 $aqi의 값을 $scale->val에 똑같이 넣어주는 것 뿐입니다. 예를 들어 $a = 123; 이라고 하면 $a에 123이라는 값이 들어가듯이, $a = $b; 라고 하면 $b와 같은 값이 $a에 들어갑니다. 변수의 사본을 만드는 거죠. 원본에는 어떠한 영향도 주지 않습니다.

     

    보여주신 코드에는 이렇게 만든 사본 $scale->val을 사용하는 곳이 보이지 않습니다. 아마 다른 데서 사용하라고 만들어 준 것 같네요.

    $aqi를 여러 숫자와 비교하고 있는 것을 보니, 아마 $aqi에는 숫자 하나가 들어가는 모양입니다. 미세먼지 아니면 초미세먼지, 둘 중 하나겠지요. 두 가지 데이터가 모두 들어 있지는 않을 거예요.

  • profile profile

    api 설명하는 곳 가서 데모로 테스트 해보면

    {
    "status": "ok",
    "data": {
    "aqi": 68,
    "idx": 1437,
    "attributions": [
    {
    "url": "https://china.usembassy-china.org.cn/embassy-consulates/shanghai/air-quality-monitor-stateair/",
    "name": "U.S. Consulate Shanghai Air Quality Monitor"
    },
    {
    "url": "http://www.semc.gov.cn/",
    "name": "Shanghai Environment Monitoring Center(上海市环境监测中心)"
    },
    {
    "url": "http://113.108.142.147:20035/emcpublish/",
    "name": "China National Urban air quality real-time publishing platform (全国城市空气质量实时发布平台)"
    },
    {
    "url": "https://waqi.info/",
    "name": "World Air Quality Index Project"
    }
    ],
    "city": {
    "geo": [
    31.2047372,
    121.4489017
    ],
    "name": "Shanghai (上海)",
    "url": "https://aqicn.org/city/shanghai"
    },
    "dominentpol": "pm25",
    "iaqi": {
    "co": {
    "v": 3.7
    },
    "h": {
    "v": 68.8
    },
    "no2": {
    "v": 13.3
    },
    "o3": {
    "v": 28.9
    },
    "p": {
    "v": 1015.9
    },
    "pm10": {
    "v": 24
    },
    "pm25": {
    "v": 68

    },
    "so2": {
    "v": 3.1
    },
    "t": {
    "v": 16.1
    },
    "w": {
    "v": 0.2
    }
    },
    "time": {
    "s": "2018-11-12 13:00:00",
    "tz": "+08:00",
    "v": 1542027600
    },
    "debug": {
    "sync": "2018-11-12T15:12:41+09:00"
    }
    }
    }


    아마 초미세먼지 값을 참조해서 aqi 에 넣어버리나보네요.

    초미세먼지 농도라고 생각해야 할 것 같습니다. 이것 기준에 맞추면 다 나쁨으로 바뀔 것 같네요.

     

    두개 중에 높은 값을 aqi에 넣는 거라면 이건 제가 생각했던거랑은 완전 다른 상황이 벌어지는 거구요.

    차라리 초미세먼지농도, 미세먼지 농도 두개를 제가 활용하면 좋겠습니다.

  • profile profile
    dominentpol이라는 부분이 눈에 띄네요. 어느 쪽이 더 우세한지(?) 판단하는 모양입니다. 아래를 보면 pm10, pm25 등 다양한 척도가 나오는데 그 중에서 더 나쁜 쪽을 $aqi라는 대표값에 넣어주는 게 아닐까요? 미세먼지가 더 심할 때는 미세먼지가 $aqi에 들어가고, 초미세먼지가 더 심할 때는 초미세먼지가 $aqi에 들어가는 지능적인 API일지도 모른다는 생각이 듭니다. 저희 집 공기청정기도 나쁜 쪽 기준으로 판단하거든요.
  • profile profile
    다른 지역으로 테스트 해보니 우려했던 상황이 맞네요...

    두 값 중 높은 값을 aqi에 넣어버립니다.

    초미세,미세 농도 두가지 단계가 다른데 이걸 하나의 단계로 써버리는 상황이라 지금 뭔가 이상한 상황이 연출되고 있네요.


    제가 의도한대로 초미세먼지농도, 미세먼지농도 값 자체를 사용하려면 어찌 해야할까요 ?
  • profile profile
    네. 맞습니다. 먼저 댓글에 달았듯이 그런 상황인데..

    근데 이건 문제가 있어요. 미세먼지농도,초미세먼지 농도 나쁨 단계가 완전 틀리거든요.
  • profile profile

    소스상에서는
      $aqi_data->pm10
      $aqi_data->pm10_color
      $aqi_data->pm25
      $aqi_data->pm25_color
    를 자세히 구분하고 있네요. 스킨에서 이 변수들을 직접 사용하시면 될 것 같습니다.

  • profile profile
    php 부분에서 단계를 미리 확정짓고 있어요. 위에 코드에 보시면... 그런데 $aqi_data->pm25 로 하면될까요?
    아까 해보니 잘 안되더라구요.
  • profile profile
    public static function getAirQualityIndex($aqi, $type = 'obj')
    {
    $scale = new stdClass();
    $scale->val = $aqi;

    if(-999 == $aqi)
    {
    $scale->bgcolor = '#666';
    $scale->color = '#fff';
    $scale->level = '-';
    }
    elseif(300 < $aqi)
    {
    $scale->bgcolor = '#7e0023';
    $scale->color = '#fff';
    $scale->level = '위험';
    }
    elseif(200 < $aqi)
    {
    $scale->bgcolor = '#cc0033';
    $scale->color = '#fff';
    $scale->level = '매우나쁨';
    }
    elseif(150 < $aqi)
    {
    $scale->bgcolor = '#cc0033';
    $scale->color = '#fff';
    $scale->level = '매우나쁨';
    }
    elseif(80 < $aqi)
    {
    $scale->bgcolor = '#cc0033';
    $scale->color = '#fff';
    $scale->level = '나쁨';
    }
    elseif(30 < $aqi)
    {
    $scale->bgcolor = '#ffde33';
    $scale->color = '#000';
    $scale->level = '보통';
    }
    else
    {
    $scale->bgcolor = '#009966';
    $scale->color = '#fff';
    $scale->level = '좋음';
    }

    return $type == 'obj' ? $scale : $scale->bgcolor;
    }


    위 부분에서 제가 $aqi_data->pm25 로 바꿔봤었거든요.
  • profile profile
    그 함수는 아무리 건드려도 소용없습니다. 숫자를 던져주면 색깔을 반환하는 함수일 뿐이예요. 어떤 숫자를 던져줄지 결정하는 곳은 $aqi_data에 pm10, pm25 등을 넣는 부분입니다.
  • profile profile
    elseif(300 < $aqi) 지금 이렇게 두개중에 높은 값을 넣어버리니 저는 pm25로 넣고 싶은거라서요.
  • profile profile
    아.. api에서 받아오면서 거기서 설정을 바꾸라고 하시는 거군요... 한번 해보겠습니다.
  • profile profile
    감사합니다. 말씀 하신대로 수정해서 해결했습니다. 감사합니다!

    pm25값을 aqi가 가지도록 고쳤고..
    단계도 초미세먼지농도 기준으로 나쁨 단계의 수치를 fix했습니다.
    이제 오락가락이 아닌 정해진 기준에 의해 일관된 판정이 내려지게 되었습니다.

    그런데 이 api에서 제공하는 미세먼지 상태는 에어코리아보다 훨 높아서 완전오염 상태네요.. ㅡㅡ;
  • profile
    ** api 에서 받아오는 값이 농도값이 아닌 농도로 변환한 오염도 수치 aqi 이므로 이를 농도로 판단해 적용하면 안됩니다. **