CMS/프레임워크 | XE 1.x |
---|---|
개발 언어 | 사용안함 |
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;
}
}
이렇습니다. 저는 이걸 미세먼지, 초미세먼지 두개 농도값을 모두 다 적용해서 단계를 표시해 주려고 하는데 코드 자체를 이해하지 못하는 상황이 되어 버렸네요.
댓글 21
이 데이터를 $air->data->aqi 으로 인코딩했는것 같은데, 이 값이 integer(순수한 숫자값) 값으로 보여집니다. 그 숫자에 따라 날씨관련 조절이 있는듯 한데요?
암튼 그걸
메서드로 호출할때 $aqi 값으로 넘겨서 받는쪽에서 $salce 이라는 변수의 val 이라는 열쇠값에 변수를 저장했다고 보시면되요.
그 수치를 가져와서 어떤 수치값에 따라 미세먼지농도를 결정한다음 return 값으로 보내주는.. 그래서 그 타입이 오브젝트 형태로 넘어가는거예요.
$aqi_data->pm10 = $air->data->iaqi->pm10->v; // 이게 미세먼지 농도 입니다.
$aqi_data->pm25 = $air->data->iaqi->pm25->v; // 이게 초미세먼지 농도 이구요.
if(-999 == $aqi) 여기서 $aqi 값이 어떤 값인지 모르겠습니다. 저는 미세,초미세 두개를 수치를 다르게 적용하고 싶거든요.
$scale->val = $aqi; 이것의 의미도 궁금하구요....
답변자도 결국 코드만 보고는 어떤 값인지 답변드리기는 어려운 질문입니다.
getAirQualityIndex에서 aqi으로 보내는 값자체가 어떤 수치값으로 보여지고 그 수치를 이용해서 농도의 정도를 구하고 있는듯합니다. 자세한건 api제공하는 제공처의 데이터값들이 어떤것인지를 확인 해봐야 할것같아요
$scale->val = $aqi; 이건 그냥 $aqi의 값을 $scale->val에 똑같이 넣어주는 것 뿐입니다. 예를 들어 $a = 123; 이라고 하면 $a에 123이라는 값이 들어가듯이, $a = $b; 라고 하면 $b와 같은 값이 $a에 들어갑니다. 변수의 사본을 만드는 거죠. 원본에는 어떠한 영향도 주지 않습니다.
보여주신 코드에는 이렇게 만든 사본 $scale->val을 사용하는 곳이 보이지 않습니다. 아마 다른 데서 사용하라고 만들어 준 것 같네요.
$aqi를 여러 숫자와 비교하고 있는 것을 보니, 아마 $aqi에는 숫자 하나가 들어가는 모양입니다. 미세먼지 아니면 초미세먼지, 둘 중 하나겠지요. 두 가지 데이터가 모두 들어 있지는 않을 거예요.
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에 넣는 거라면 이건 제가 생각했던거랑은 완전 다른 상황이 벌어지는 거구요.
차라리 초미세먼지농도, 미세먼지 농도 두개를 제가 활용하면 좋겠습니다.
근데 이건 문제가 있어요. 미세먼지농도,초미세먼지 농도 나쁨 단계가 완전 틀리거든요.
두 값 중 높은 값을 aqi에 넣어버립니다.
초미세,미세 농도 두가지 단계가 다른데 이걸 하나의 단계로 써버리는 상황이라 지금 뭔가 이상한 상황이 연출되고 있네요.
제가 의도한대로 초미세먼지농도, 미세먼지농도 값 자체를 사용하려면 어찌 해야할까요 ?
소스상에서는
$aqi_data->pm10
$aqi_data->pm10_color
$aqi_data->pm25
$aqi_data->pm25_color
를 자세히 구분하고 있네요. 스킨에서 이 변수들을 직접 사용하시면 될 것 같습니다.
아까 해보니 잘 안되더라구요.
{
$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 로 바꿔봤었거든요.
pm25값을 aqi가 가지도록 고쳤고..
단계도 초미세먼지농도 기준으로 나쁨 단계의 수치를 fix했습니다.
이제 오락가락이 아닌 정해진 기준에 의해 일관된 판정이 내려지게 되었습니다.
그런데 이 api에서 제공하는 미세먼지 상태는 에어코리아보다 훨 높아서 완전오염 상태네요.. ㅡㅡ;