개발새발 - IT 기술블로그
article thumbnail

안녕하세요. 기상청에서 제공하는 체감온도 계산 방식을 코틀린과 자바로 작성한 코드를 공유 드립니다.

 

계산 방식은 아래와 같으며, 산출식이 여름과 겨울에 따라 다릅니다.

 

 

10분 평균 풍속인 w는 그냥 현재 풍속을 사용하셔도 무방합니다.

 

그리고 겨울철 체감온도를 계산하는 조건인 기온10℃ 이하, 풍속 1.3m/s 이상은 코드에 반영시키지 않았으니, 실제 데이터를 불러오는 로직에서 조건 처리를 해주시면 될 것 같습니다.

 

 


전체 코드

getSensibleTemp(...) 메서드를 호출하여 사용하시면 됩니다. return type은 double입니다.

 

<Java>

import java.time.LocalDateTime;
import java.lang.Math;

public class Temp {
    /**
     * 여름철 체감온도 (5월 ~ 9월)
     *
     * @param ta 기온
     * @param rh 상대습도
     */
    private double getInSummer(double ta, double rh) {
        double tw = getTw(ta, rh);
        return -0.2442 + (0.55399 * tw) + (0.45535 * ta) - (0.0022 * Math.pow(tw, 2.0)) + (0.00278 * tw * ta) + 3.0;
    }

    /**
     * 겨울철 체감온도 (10월 ~ 익년 4월)
     *
     * @param ta 기온
     * @param v 10분 평균 풍속
     */
    private double getInWinter(double ta, double v) {
        return 13.12 + (0.6215 * ta) - (11.37 * Math.pow(v, 0.16)) + (0.3965 * Math.pow(v, 0.16) * ta);
    }

    /**
     * 지금이 몇월인지에 따라 여름 및 겨울 계산공식 적용
     *
     * @param ta 기온
     * @param rh 상대습도
     * @param v 10분 평균 풍속
     * @return 체감온도
     */
    public double getSensibleTemp(double ta, double rh, double v) {
        int season = getCurrentSeason();
        return (season >= 5 && season <= 9) ? getInSummer(ta, rh) : getInWinter(ta, v);
    }

    /**
     * 습구온도 계산공식
     *
     * @param ta 온도
     * @param rh 상대습도
     */
    private double getTw(double ta, double rh) {
        return ta * Math.atan(0.151977 * Math.pow(rh + 8.313659, 0.5)) +
                Math.atan(ta + rh) - Math.atan(rh - 1.67633) +
                (0.00391838 * Math.pow(rh, 1.5) * Math.atan(0.023101 * rh)) - 4.686035;
    }

    /** 현재 월수 출력 **/
    private int getCurrentSeason() {
        return LocalDateTime.now().getMonthValue();
    }
}

 

 

<Kotlin>

import java.time.LocalDateTime
import kotlin.math.atan
import kotlin.math.pow

class SensibleTempFormula {
    /**
     * 여름철 체감온도 (5월 ~ 9월)
     *
     * @param ta 기온
     * @param rh 상대습도
     */
    private fun getInSummer(ta: Double, rh: Double) : Double {
        val tw = getTw(ta, rh)
        return -0.2442 + (0.55399 * tw) + (0.45535 * ta) - (0.0022 * tw.pow(2.0)) + (0.00278 * tw * ta) + 3.0
    }

    /**
     * 겨울철 체감온도 (10월 ~ 익년 4월)
     *
     * @param ta 기온
     * @param v 10분 평균 풍속
     */
    private fun getInWinter(ta: Double, v: Double) : Double {
        return 13.12 + (0.6215 * ta) - (11.37 * v.pow(0.16)) + (0.3965 * v.pow(0.16) * ta)
    }

    /**
     * 지금이 몇월인지에 따라 여름 및 겨울 계산공식 적용
     *
     * @param ta 기온
     * @param rh 상대습도
     * @param v 10분 평균 풍속
     * @return 체감온도
     */
    fun getSensibleTemp(ta: Double, rh: Double, v: Double) : Double {
   		val season = getCurrentSeason()
        return if (season in 5..9) getInSummer(ta, rh) else getInWinter(ta, v)
    }

    /**
     * 습구온도 계산공식
     *
     * @param ta 온도
     * @param rh 상대습도
     */
    private fun getTw(ta: Double, rh: Double) : Double {
        return ta * atan(0.151977 * (rh + 8.313659).pow(0.5)) +
                atan(ta+rh) - atan(rh-1.67633) +
                (0.00391838 * rh.pow(1.5) * atan(0.023101 * rh)) - 4.686035
    }

    /** 현재 월수 출력 **/
    private fun getCurrentSeason() : Int {
        return LocalDateTime.now().monthValue
    }
}

 

 

 

감사합니다.