Showing
1 changed file
with
20 additions
and
192 deletions
1 | -<!-- | ||
2 | - 휴게소 표준정보의 service area code 의 우측끝 3자리 == 휴게소 날씨 표준정보의 unitCode | ||
3 | ---> | ||
4 | <!DOCTYPE html> | 1 | <!DOCTYPE html> |
5 | <html lang="en"> | 2 | <html lang="en"> |
6 | <head> | 3 | <head> |
... | @@ -14,7 +11,7 @@ | ... | @@ -14,7 +11,7 @@ |
14 | <!-- Bootstrap icons--> | 11 | <!-- Bootstrap icons--> |
15 | <link href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.5.0/font/bootstrap-icons.css" rel="stylesheet" /> | 12 | <link href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.5.0/font/bootstrap-icons.css" rel="stylesheet" /> |
16 | <!-- Core theme CSS (includes Bootstrap)--> | 13 | <!-- Core theme CSS (includes Bootstrap)--> |
17 | - <link href="css/styles.css" rel="stylesheet" /> | 14 | + <link href="css/styles.css" rel="stylesheet" /> |
18 | </head> | 15 | </head> |
19 | 16 | ||
20 | 17 | ||
... | @@ -59,26 +56,11 @@ | ... | @@ -59,26 +56,11 @@ |
59 | <div class="text-center my-5"> | 56 | <div class="text-center my-5"> |
60 | <h1 class="fw-bolder mb-3">휴게소 날씨</h1> | 57 | <h1 class="fw-bolder mb-3">휴게소 날씨</h1> |
61 | <p class="lead fw-normal text-muted mb-4">Just search the name of the rest stop,<br>You'll find out the weather of the rest area.</p> | 58 | <p class="lead fw-normal text-muted mb-4">Just search the name of the rest stop,<br>You'll find out the weather of the rest area.</p> |
62 | - <div class="dropdown"> | 59 | + |
63 | - | 60 | + <!--검색 버튼으로 검색할 휴게소 이름 입력 받기--> |
64 | - <button class ="btn btn-primary dropdown-toggle " id="highway" data-bs-toggle="dropdown"> | 61 | + <p><input type="text" placeholder="휴게소 이름" id="name"><input type="button" onclick="Showweather()" value="확인"></p> |
65 | - 고속도로 선택 | 62 | + |
66 | - </button> | ||
67 | - <div class ="dropdown-menu"> | ||
68 | - <a class="dropdown-item" onclick="addReststop('0010')">경부선</a> | ||
69 | - <a class="dropdown-item" onclick="addReststop('0550')">중앙선</a> | ||
70 | - <a class="dropdown-item" onclick="addReststop('0500')">영동선</a> | ||
71 | - </div> | ||
72 | - <button class ="btn btn-primary dropdown-toggle " id = "rest_stop" data-bs-toggle="dropdown"> | ||
73 | - 휴게소 선택 | ||
74 | - </button> | ||
75 | - <div class ="dropdown-menu" id = "select_restStop"> | ||
76 | - </div> | ||
77 | - </div> | ||
78 | </div> | 63 | </div> |
79 | - | ||
80 | - | ||
81 | - | ||
82 | </div> | 64 | </div> |
83 | </div> | 65 | </div> |
84 | </div> | 66 | </div> |
... | @@ -142,9 +124,8 @@ | ... | @@ -142,9 +124,8 @@ |
142 | </div> | 124 | </div> |
143 | </section> | 125 | </section> |
144 | 126 | ||
145 | - <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script> | 127 | + |
146 | <script> | 128 | <script> |
147 | - | ||
148 | //날씨 오픈 api는 조회 방식이나 끌어오는 데이터가 복잡해서 주석을 자세히 작성함 | 129 | //날씨 오픈 api는 조회 방식이나 끌어오는 데이터가 복잡해서 주석을 자세히 작성함 |
149 | 130 | ||
150 | //* 휴게소 날씨 오픈 api 주의 사항 () | 131 | //* 휴게소 날씨 오픈 api 주의 사항 () |
... | @@ -160,7 +141,7 @@ | ... | @@ -160,7 +141,7 @@ |
160 | let present_date = present.getDate(); | 141 | let present_date = present.getDate(); |
161 | let present_time = ('0'+(present.getHours())).slice(-2); | 142 | let present_time = ('0'+(present.getHours())).slice(-2); |
162 | 143 | ||
163 | - //현재 년도, 월, 날짜를 YYYYMMDD형태로 변형 | 144 | + //현재 년도, 월, 날짜를 YYYYMMDD형태로 변형 |
164 | //날씨 오픈 api의 연일월 입력타입이 YYYYMMDD | 145 | //날씨 오픈 api의 연일월 입력타입이 YYYYMMDD |
165 | let YYYYMMDD = String(present_year)+String(present_month)+String(present_date); | 146 | let YYYYMMDD = String(present_year)+String(present_month)+String(present_date); |
166 | 147 | ||
... | @@ -174,152 +155,11 @@ | ... | @@ -174,152 +155,11 @@ |
174 | 155 | ||
175 | console.log(yesterday_YYYYMMDD) | 156 | console.log(yesterday_YYYYMMDD) |
176 | console.log(YYYYMMDD) | 157 | console.log(YYYYMMDD) |
177 | - | ||
178 | - | ||
179 | 158 | ||
180 | - // 모든 자식요소들을 삭제하는 함수 | ||
181 | - function removeAllchild(div) { | ||
182 | - while (div.hasChildNodes()) { | ||
183 | - div.removeChild(div.firstChild); | ||
184 | - } | ||
185 | - } | ||
186 | - | ||
187 | - var serviceAreaCode= ""; | ||
188 | - | ||
189 | 159 | ||
190 | - // 각 고속도로에 존재하는 휴게소 리스트를 작성하여 드랍다운 메뉴에 추가합니다. | 160 | + //검색창에 휴게소 이름을 입력하면 실행되는 함수 Showweather() |
191 | - function addReststop(lineNumber){ | 161 | + function Showweather() { |
192 | 162 | ||
193 | - // 아래 조건문은 각 고속도로 선택시 해당 고속도로 이름이 버튼(html)에 기록되도록 하기 위함입니다. | ||
194 | - let highway_Area = document.getElementById('highway'); | ||
195 | - if(lineNumber==='0010'){ | ||
196 | - highway_Area.innerHTML = '경부선'; | ||
197 | - } | ||
198 | - else if(lineNumber==='0550'){ | ||
199 | - highway_Area.innerHTML = '중앙선'; | ||
200 | - } | ||
201 | - else if(lineNumber==='0500'){ | ||
202 | - highway_Area.innerHTML = '영동선'; | ||
203 | - } | ||
204 | - let tagArea = document.getElementById('select_restStop'); // 드랍다운 메뉴 추가할 태그 아이디 저장 | ||
205 | - removeAllchild(tagArea); // 고속도로 선택시마다 새로운 휴게소를 불러와야 하므로 현재 드랍다운 메뉴에 존재하는 자식요소 싹다 삭제합니다. | ||
206 | - | ||
207 | - | ||
208 | - | ||
209 | - | ||
210 | - // 아래의 ajax 문을 통해서 휴게소표준 api를 불러옵니다. 각 고속도로에 대한 모든 휴게소이름과 휴게소 코드를 가져오기 위함입니다. | ||
211 | - // 여기서 가져오게되는 휴게소 코드(serviceAreaCode)는 추후에 휴게소별 날씨정보 api에 있는 unitCode와 상응하는 데이터입니다. | ||
212 | - var routeCodes = []; | ||
213 | - var svarAddrs = []; | ||
214 | - var rest_names = []; | ||
215 | - var serviceAreaCodes = []; | ||
216 | - // 페이지 1 | ||
217 | - $.ajax({ | ||
218 | - url: "http://data.ex.co.kr/openapi/business/conveniServiceArea?key=1817997939&type=json&numOfRows=99&pageNo=1", | ||
219 | - async:false, | ||
220 | - success: function(data){ | ||
221 | - //변수 설정 | ||
222 | - userData = data; | ||
223 | - }, | ||
224 | - }).done(function() { | ||
225 | - var routeCode = ""; | ||
226 | - var svarAddr = ""; | ||
227 | - var rest_name = ""; | ||
228 | - var data_count = userData["list"].length // 데이터 개수 얻기 | ||
229 | - | ||
230 | - for (var i =0; i<data_count; i++){ | ||
231 | - routeCode = JSON.stringify(userData["list"][i]["routeCode"]); // 고속도로 번호를 가져옵니다. | ||
232 | - rest_name = JSON.stringify(userData["list"][i]["serviceAreaName"]); // 휴게소 이름을 가져옵니다. | ||
233 | - serviceCode = JSON.stringify(userData["list"][i]["serviceAreaCode"]); // 휴게소코드를 가져옵니다. | ||
234 | - | ||
235 | - if(routeCode.substring(1,5) === lineNumber){ // 고속도로 코드가 같다면 | ||
236 | - rest_names.push(rest_name); //휴게소 이름을 저장해둡니다... | ||
237 | - serviceAreaCodes.push(serviceCode); // 휴게소 코드를 저장해둡니다. | ||
238 | - } | ||
239 | - } | ||
240 | - // 아래 forEach문은 저장한 모든 휴게소에 대해, 드랍다운 버튼을 생성하기 위함입니다. | ||
241 | - rest_names.forEach(function(addr,index){ | ||
242 | - let new_A_Button = document.createElement('a'); // a 속성 생성 | ||
243 | - new_A_Button.setAttribute('class','dropdown-item'); | ||
244 | - new_A_Button.setAttribute('onclick',"Showweather("+serviceAreaCodes[index]+","+rest_names[index]+")"); | ||
245 | - new_A_Button.innerHTML = rest_names[index].substring(1,rest_names[index].length-1); | ||
246 | - tagArea.appendChild(new_A_Button); | ||
247 | - }) | ||
248 | - }) | ||
249 | - | ||
250 | - // 페이지 2, 페이지 1과 모든 과정이 동일하며, 오픈 api 데이터 가져오는 특성상 페이지를 나누었습니다. | ||
251 | - $.ajax({ | ||
252 | - url: "http://data.ex.co.kr/openapi/business/conveniServiceArea?key=1817997939&type=json&numOfRows=99&pageNo=2", | ||
253 | - async:false, | ||
254 | - success: function(data){ | ||
255 | - //변수 설정 | ||
256 | - userData = data; | ||
257 | - }, | ||
258 | - }).done(function() { | ||
259 | - var routeCode = ""; | ||
260 | - var svarAddr = ""; | ||
261 | - var rest_name = ""; | ||
262 | - var data_count = userData["list"].length // 데이터 개수 얻기 | ||
263 | - | ||
264 | - for (var i =0; i<data_count; i++){ | ||
265 | - routeCode = JSON.stringify(userData["list"][i]["routeCode"]); | ||
266 | - rest_name = JSON.stringify(userData["list"][i]["serviceAreaName"]); // 휴게소 이름... | ||
267 | - serviceCode = JSON.stringify(userData["list"][i]["serviceAreaCode"]); | ||
268 | - | ||
269 | - if(routeCode.substring(1,5) === lineNumber){ // 고속도로 코드가 같다면 | ||
270 | - rest_names.push(rest_name); //휴게소 이름... | ||
271 | - serviceAreaCodes.push(serviceCode); | ||
272 | - } | ||
273 | - } | ||
274 | - rest_names.forEach(function(addr,index){ | ||
275 | - let new_A_Button = document.createElement('a'); // a 속성 생성 | ||
276 | - new_A_Button.setAttribute('class','dropdown-item'); | ||
277 | - new_A_Button.setAttribute('onclick',"Showweather("+serviceAreaCodes[index]+","+rest_names[index]+")"); | ||
278 | - new_A_Button.innerHTML = rest_names[index].substring(1,rest_names[index].length-1); | ||
279 | - tagArea.appendChild(new_A_Button); | ||
280 | - }) | ||
281 | - }) | ||
282 | - // 페이지 3 | ||
283 | - $.ajax({ | ||
284 | - url: "http://data.ex.co.kr/openapi/business/conveniServiceArea?key=1817997939&type=json&numOfRows=99&pageNo=3", | ||
285 | - async:false, | ||
286 | - success: function(data){ | ||
287 | - //변수 설정 | ||
288 | - userData = data; | ||
289 | - }, | ||
290 | - }).done(function() { | ||
291 | - var routeCode = ""; | ||
292 | - var svarAddr = ""; | ||
293 | - var rest_name = ""; | ||
294 | - var data_count = userData["list"].length // 데이터 개수 얻기 | ||
295 | - | ||
296 | - for (var i =0; i<data_count; i++){ | ||
297 | - routeCode = JSON.stringify(userData["list"][i]["routeCode"]); | ||
298 | - rest_name = JSON.stringify(userData["list"][i]["serviceAreaName"]); // 휴게소 이름... | ||
299 | - serviceCode = JSON.stringify(userData["list"][i]["serviceAreaCode"]); | ||
300 | - | ||
301 | - if(routeCode.substring(1,5) === lineNumber){ // 고속도로 코드가 같다면 | ||
302 | - rest_names.push(rest_name); //휴게소 이름... | ||
303 | - serviceAreaCodes.push(serviceCode); | ||
304 | - } | ||
305 | - } | ||
306 | - rest_names.forEach(function(addr,index){ | ||
307 | - let new_A_Button = document.createElement('a'); // a 속성 생성 | ||
308 | - new_A_Button.setAttribute('class','dropdown-item'); | ||
309 | - new_A_Button.setAttribute('onclick',"Showweather("+serviceAreaCodes[index]+","+rest_names[index]+")"); | ||
310 | - new_A_Button.innerHTML = rest_names[index].substring(1,rest_names[index].length-1); | ||
311 | - tagArea.appendChild(new_A_Button); | ||
312 | - }) | ||
313 | - }) | ||
314 | - | ||
315 | - } | ||
316 | - | ||
317 | - //검색창에 휴게소 이름을 입력하면 실행되는 함수 Showweather() serviceCode = 휴게소 코드, rest_name = 휴게소 이름 | ||
318 | - function Showweather(serviceCode,rest_name) { | ||
319 | - | ||
320 | - serviceCode = serviceCode.substring(3,serviceCode.length); //가져온 휴게소코드를 여기서 사용하는 휴게소코드인 unitCode와 동일한포맷으로 바꿉니다. | ||
321 | - let rest_stop = document.getElementById('rest_stop'); // 해당 줄과 바로 아랫줄은 드랍다운 버튼선택시 해당 휴게소이름을 html에 적용하기 위함입니다. | ||
322 | - rest_stop.innerHTML =rest_name; | ||
323 | //휴게소 이름을 검색하기 전까지는 기타 html 구성 요소들은 숨기기 위하여 innerHTML사용 | 163 | //휴게소 이름을 검색하기 전까지는 기타 html 구성 요소들은 숨기기 위하여 innerHTML사용 |
324 | //휴게소 이름 검색시 화면에 표시 | 164 | //휴게소 이름 검색시 화면에 표시 |
325 | //bar | 165 | //bar |
... | @@ -337,9 +177,9 @@ | ... | @@ -337,9 +177,9 @@ |
337 | document.querySelector('exp6').innerHTML = '지금으로부터 9시간 전부터 3시간 전까지의 풍속을 조회합니다. '; | 177 | document.querySelector('exp6').innerHTML = '지금으로부터 9시간 전부터 3시간 전까지의 풍속을 조회합니다. '; |
338 | 178 | ||
339 | //사용자가 입력한 휴게소 이름의 값을 name 변수에 할당 | 179 | //사용자가 입력한 휴게소 이름의 값을 name 변수에 할당 |
340 | - name = rest_name | 180 | + name = document.getElementById('name').value |
341 | //bar부분에 휴게소 이름 출력 | 181 | //bar부분에 휴게소 이름 출력 |
342 | - document.querySelector('reststop_name').innerHTML = rest_name; | 182 | + document.querySelector('reststop_name').innerHTML = name; |
343 | 183 | ||
344 | 184 | ||
345 | 185 | ||
... | @@ -352,7 +192,7 @@ | ... | @@ -352,7 +192,7 @@ |
352 | var ttempdata = new Array(10); | 192 | var ttempdata = new Array(10); |
353 | var hhumidata = new Array(10); | 193 | var hhumidata = new Array(10); |
354 | var wwinddata = new Array(10); | 194 | var wwinddata = new Array(10); |
355 | - | 195 | + |
356 | for(let k=5; k>1; k--){ | 196 | for(let k=5; k>1; k--){ |
357 | //present_time-k가 음수인 경우 방지 | 197 | //present_time-k가 음수인 경우 방지 |
358 | if(present_time-k <0){ | 198 | if(present_time-k <0){ |
... | @@ -378,25 +218,17 @@ | ... | @@ -378,25 +218,17 @@ |
378 | index2=text.indexOf(']') | 218 | index2=text.indexOf(']') |
379 | ndata=text.substr(index1+1, index2-index1+1) | 219 | ndata=text.substr(index1+1, index2-index1+1) |
380 | nndata=ndata.split('},'); | 220 | nndata=ndata.split('},'); |
381 | - | 221 | + |
382 | 222 | ||
383 | //ReststopName (휴게소 이름) 데이터 추출 | 223 | //ReststopName (휴게소 이름) 데이터 추출 |
384 | for(let i=0; i<nndata.length; i++){ | 224 | for(let i=0; i<nndata.length; i++){ |
385 | - // 아래 두줄의 코드를 통해서 휴게소코드를 가져옵니다. | ||
386 | - let index1forUnitCode = nndata[i].indexOf('"unitCode":"'); | ||
387 | - unitCode = nndata[i].substr(index1forUnitCode+12,3); | ||
388 | - | ||
389 | index3=nndata[i].indexOf('"unitName":"') | 225 | index3=nndata[i].indexOf('"unitName":"') |
390 | index4=nndata[i].indexOf('"unitCode":"') | 226 | index4=nndata[i].indexOf('"unitCode":"') |
391 | ReststopName=nndata[i].substr(index3+12, index4-index3-14) | 227 | ReststopName=nndata[i].substr(index3+12, index4-index3-14) |
392 | 228 | ||
393 | //데이터에서 추출한 휴게소 이름 ReststopName이 검색창을 통해서 사용자에게 입력받은 이름 name과 일치하는 경우 | 229 | //데이터에서 추출한 휴게소 이름 ReststopName이 검색창을 통해서 사용자에게 입력받은 이름 name과 일치하는 경우 |
394 | //그 데이터 셋에서 weather, temperature, humidity, wind를 추출하도록 함. | 230 | //그 데이터 셋에서 weather, temperature, humidity, wind를 추출하도록 함. |
395 | - | 231 | + if(ReststopName == name){ |
396 | - // 해당 함수의 매개변수로 가져온 휴게소 코드와, 함수 안에서 fetch를 통해 가져온 오픈 api의 휴게소코드가 동일한지 비교합니다. | ||
397 | - if(serviceCode == unitCode){ | ||
398 | - console.log("unitCode access"); | ||
399 | - | ||
400 | //Weather | 232 | //Weather |
401 | index5=nndata[i].indexOf('"weatherContents":"') | 233 | index5=nndata[i].indexOf('"weatherContents":"') |
402 | index6=nndata[i].indexOf('"statusNo":"') | 234 | index6=nndata[i].indexOf('"statusNo":"') |
... | @@ -421,9 +253,8 @@ | ... | @@ -421,9 +253,8 @@ |
421 | ttempdata[k]=bar_temperature; | 253 | ttempdata[k]=bar_temperature; |
422 | hhumidata[k]=bar_humidity; | 254 | hhumidata[k]=bar_humidity; |
423 | wwinddata[k]=bar_wind; | 255 | wwinddata[k]=bar_wind; |
424 | - } | 256 | + } |
425 | - } | 257 | + } |
426 | - | ||
427 | //innerhtml을 이용해서 html화면에 데이터 표기 | 258 | //innerhtml을 이용해서 html화면에 데이터 표기 |
428 | //5시간 전, 4시간 전, 3시간 전, 2시간 전의 데이터 중 가장 최근의 데이터를 출력하도록 함 | 259 | //5시간 전, 4시간 전, 3시간 전, 2시간 전의 데이터 중 가장 최근의 데이터를 출력하도록 함 |
429 | for(let o=5; o>1; o-- ){ | 260 | for(let o=5; o>1; o-- ){ |
... | @@ -468,7 +299,7 @@ | ... | @@ -468,7 +299,7 @@ |
468 | }) | 299 | }) |
469 | }) | 300 | }) |
470 | } | 301 | } |
471 | - | 302 | + |
472 | 303 | ||
473 | //그래프 그리기 | 304 | //그래프 그리기 |
474 | //온도, 습도, 풍속 데이터를 array에 저장하여 그래프에 넘겨줌 | 305 | //온도, 습도, 풍속 데이터를 array에 저장하여 그래프에 넘겨줌 |
... | @@ -476,7 +307,7 @@ | ... | @@ -476,7 +307,7 @@ |
476 | var humidata = new Array(10); | 307 | var humidata = new Array(10); |
477 | var winddata = new Array(10); | 308 | var winddata = new Array(10); |
478 | 309 | ||
479 | - name = rest_name | 310 | + name = document.getElementById('name').value |
480 | 311 | ||
481 | for(let j=0; j<7; j++){ | 312 | for(let j=0; j<7; j++){ |
482 | //present_time-3-j가 음수인 경우 방지 | 313 | //present_time-3-j가 음수인 경우 방지 |
... | @@ -490,7 +321,7 @@ | ... | @@ -490,7 +321,7 @@ |
490 | date2 = YYYYMMDD | 321 | date2 = YYYYMMDD |
491 | } | 322 | } |
492 | 323 | ||
493 | - name = rest_name | 324 | + name = document.getElementById('name').value |
494 | fetch('http://data.ex.co.kr/openapi/restinfo/restWeatherList?key=6806352377&type=json&sdate='+ date2 +'&stdHour=' + ('0'+String(time2)).slice(-2)).then(function(response){ | 325 | fetch('http://data.ex.co.kr/openapi/restinfo/restWeatherList?key=6806352377&type=json&sdate='+ date2 +'&stdHour=' + ('0'+String(time2)).slice(-2)).then(function(response){ |
495 | //testing | 326 | //testing |
496 | // fetch('http://data.ex.co.kr/openapi/restinfo/restWeatherList?key=test&type=json&sdate='+ "20220524" +'&stdHour='+ ('0'+ String(22-j)).slice(-2)).then(function(response){ | 327 | // fetch('http://data.ex.co.kr/openapi/restinfo/restWeatherList?key=test&type=json&sdate='+ "20220524" +'&stdHour='+ ('0'+ String(22-j)).slice(-2)).then(function(response){ |
... | @@ -506,15 +337,12 @@ | ... | @@ -506,15 +337,12 @@ |
506 | 337 | ||
507 | //ReststopName (휴게소 이름) | 338 | //ReststopName (휴게소 이름) |
508 | for(let i=0; i<nndata.length; i++){ | 339 | for(let i=0; i<nndata.length; i++){ |
509 | - let index1forUnitCode = nndata[i].indexOf('"unitCode":"'); | ||
510 | - unitCode = nndata[i].substr(index1forUnitCode+12,3); | ||
511 | - | ||
512 | index3=nndata[i].indexOf('"unitName":"') | 340 | index3=nndata[i].indexOf('"unitName":"') |
513 | index4=nndata[i].indexOf('"unitCode":"') | 341 | index4=nndata[i].indexOf('"unitCode":"') |
514 | ReststopName=nndata[i].substr(index3+12, index4-index3-14) | 342 | ReststopName=nndata[i].substr(index3+12, index4-index3-14) |
515 | 343 | ||
516 | 344 | ||
517 | - if(serviceCode == unitCode){ | 345 | + if(ReststopName == name){ |
518 | //Weather | 346 | //Weather |
519 | index5=nndata[i].indexOf('"weatherContents":"') | 347 | index5=nndata[i].indexOf('"weatherContents":"') |
520 | index6=nndata[i].indexOf('"statusNo":"') | 348 | index6=nndata[i].indexOf('"statusNo":"') | ... | ... |
-
Mentioned in commit 5c886c7b
-
Please register or login to post a comment