신원형

implemented weather forecast (2)

1 +{
2 + "env": {
3 + "browser": true,
4 + "es2021": true
5 + },
6 + "extends": "eslint:recommended",
7 + "parserOptions": {
8 + "ecmaVersion": "latest",
9 + "sourceType": "module"
10 + },
11 + "rules": {
12 + }
13 +}
1 +import * as mocha from 'mocha'
2 +import * as weater from '../weather.js'
3 +
4 +mocha.describe('weather', () => {
5 + mocha.it('get tomorrow weather', async () => {
6 + weater.get_weather_forecast(new Date())
7 + .then(it => console.log(it))
8 + .catch(it => console.log(it))
9 + })
10 +
11 + mocha.it('get 7 days later weather', async () => {
12 + const date = new Date()
13 + date.setDate(new Date().getDate() + 7)
14 +
15 + weater.get_weather_forecast(date)
16 + .then(it => console.log(it))
17 + .catch(it => console.log(it))
18 + })
19 +});
...\ No newline at end of file ...\ No newline at end of file
1 +//@ts-check
2 +/* eslint-disable no-unused-vars */
3 +import * as axios from 'axios';
4 +
5 +
6 +// 최대 7 일간 예보를 반환합니다. 경희대 국제캠퍼스 정문 앞 삼거리 기준으로 호출됩니다.
7 +// 5/27일에 호출했을 경우 6/3일까지의 정오 (한국표준시 기준) 결과를 반환할 수 있습니다.
8 +// 정오 기준, 가장 가까운 날짜의 예보를 반환합니다.
9 +// 예) 호출한 날짜로부터 한 달 뒤 호출 => 호출한 날짜로부터 일주일 뒤 날짜 반환 (최대가 일주일이므로)
10 +// 예) 6/2일 오후 4시 호출 => 6/2일 정오 날씨 반환 (정오 기준이므로)
11 +// 온도의 경우 단위는 섭씨입니다.
12 +
13 +/*example
14 +
15 + "dt": 1653620400,
16 + "sunrise": 1653596132,
17 + "sunset": 1653648142,
18 + "moonrise": 1653589560,
19 + "moonset": 1653637140,
20 + "moon_phase": 0.9,
21 + "temp": {
22 + "day": 21.75,
23 + "min": 15.7,
24 + "max": 22.85,
25 + "night": 16.88,
26 + "eve": 21.29,
27 + "morn": 15.7
28 + },
29 + "feels_like": {
30 + "day": 21.13,
31 + "night": 16.35,
32 + "eve": 20.57,
33 + "morn": 15.41
34 + },
35 + "pressure": 1001,
36 + "humidity": 44,
37 + "dew_point": 8.88,
38 + "wind_speed": 5.88,
39 + "wind_deg": 273,
40 + "wind_gust": 12.32,
41 + "weather": [
42 + {
43 + "id": 500,
44 + "main": "Rain",
45 + "description": "light rain",
46 + "icon": "10d"
47 + }
48 + ],
49 + "clouds": 9,
50 + "pop": 0.2, //Probability of precipitation. The values of the parameter vary between 0 and 1, where 0 is equal to 0%, 1 is equal to 100%
51 + "rain": 0.13, //Precipitation volume, mm
52 + "uvi": 7.71 //The maximum value of UV index for the day
53 +
54 +*/
55 +export async function get_weather_forecast(date) {
56 + const lat = 37.24764302276268 //위도
57 + const lon = 127.0783992268606 //경도
58 + const api_key = "336ddd01d3d6f78782eed90d3921bc7e"
59 +
60 + const target = `https://api.openweathermap.org/data/2.5/onecall?lat=${lat}&lon=${lon}&exclude=minutely,hourly,alerts&appid=${api_key}&units=metric`
61 +
62 + return await axios.default.get(target).then(it => { return extract_from(date, it.data) })
63 +}
64 +
65 +function extract_from(date, json_response) {
66 + const time_zone = date.getTimezonOffset() * 60 * 1000
67 + const target_timestamp = Math.floor(date.getTime() / 1000) + time_zone
68 +
69 + const target_index = find_min_index(json_response.daily.map(it => Math.abs(it.dt - target_timestamp)))
70 +
71 + return json_response.daily[target_index]
72 +}
73 +
74 +function find_min_index(array) {
75 + let lowest_index = 0
76 + for (var i = 0; i < array.length; i++) {
77 + if (array[lowest_index] > array[i]) {
78 + lowest_index = i
79 + }
80 + }
81 +
82 + return lowest_index
83 +}
...\ No newline at end of file ...\ No newline at end of file