weather.html 21 KB
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" />
        <meta name="description" content="" />
        <meta name="author" content="" />
        <title>Modern Business - Start Bootstrap Template</title>
        <!-- Favicon-->
        <link rel="icon" type="image/x-icon" href="assets/favicon.ico" />
        <!-- Bootstrap icons-->
        <link href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.5.0/font/bootstrap-icons.css" rel="stylesheet" />
        <!-- Core theme CSS (includes Bootstrap)-->
        <link href="css/styles.css" rel="stylesheet" />
    </head>


    <body class="d-flex flex-column">
        <main class="flex-shrink-0">
            <!-- Navigation-->
            <nav class="navbar navbar-expand-lg navbar-dark bg-dark">
                <div class="container px-3">
                    <a class="navbar-brand" href="/">휴게소 정보</a>
                    <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation"><span class="navbar-toggler-icon"></span></button>
                    <div class="collapse navbar-collapse" id="navbarSupportedContent">
                        <ul class="navbar-nav ms-auto mb-2 mb-lg-0">
                            <li class="nav-item"><a class="nav-link" href="/">Home</a></li>
                            <li class="nav-item"><a class="nav-link" href="/menu">휴게소 메뉴</a></li>
                            <li class="nav-item"><a class="nav-link" href="/weather">날씨</a></li>
                            <li class="nav-item"><a class="nav-link" href="/lpg">LPG</a></li>
                            <li class="nav-item"><a class="nav-link" href="faq.html">FAQ</a></li>
                            <li class="nav-item dropdown">
                                <a class="nav-link dropdown-toggle" id="navbarDropdownBlog" href="#" role="button" data-bs-toggle="dropdown" aria-expanded="false">Blog</a>
                                <ul class="dropdown-menu dropdown-menu-end" aria-labelledby="navbarDropdownBlog">
                                    <li><a class="dropdown-item" href="blog-home.html">Blog Home</a></li>
                                    <li><a class="dropdown-item" href="blog-post.html">Blog Post</a></li>
                                </ul>
                            </li>
                            <li class="nav-item dropdown">
                                <a class="nav-link dropdown-toggle" id="navbarDropdownLogin" href="#" role="button" data-bs-toggle="dropdown" aria-expanded="false">Login</a>
                                <ul class="dropdown-menu dropdown-menu-end" aria-labelledby="navbarDropdownLogin">
                                    <li><a class="dropdown-item" href="/login">Login</a></li>
                                    <li><a class="dropdown-item" href="/signup">Sign-up</a></li>
                                </ul>
                            </li>
                        </ul>
                    </div>
                </div>
            </nav>

            <!-- Header-->
            <header class="py-5">
                <div class="container px-5">
                    <div class="row justify-content-center">
                        <div class="col-lg-8 col-xxl-6">
                            <div class="text-center my-5">
                                <h1 class="fw-bolder mb-3">휴게소 날씨</h1>
                                <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>
                               
                                <!--검색 버튼으로 검색할 휴게소 이름 입력 받기-->
                                <p><input type="text" placeholder="휴게소 이름" id="name"><input type="button"  onclick="Showweather()" value="확인"></p>

                            </div>
                        </div>
                    </div>
                </div>
            </header>

            
            <!--bar-->  
            <section class="py-3 bg-light" id="scroll-target">
                <div class="container px-1 my-1">
                    <div class="text-center">
                        <center><p><h3 class="fw-bolder"><reststop_name></reststop_name></h3></p></center>
                        <center><hr style ="height:2px; width: 55%"></hr></center>
                        <center><p><h5 class="fw-bolder"><bar1></bar1>&emsp; &emsp; &nbsp; <bar2></bar2> &emsp; &emsp; &nbsp; <bar3></bar3> &emsp; &emsp;  &nbsp; <bar4></bar4></h5></p></center>
                        <div class="container px-1 my-1"><h6 class="lead fw-normal text-muted mb-4"><bar_Weather></bar_Weather><bar_temperature></bar_temperature><bar_humidity></bar_humidity><bar_wind></bar_wind><empty></empty></h6><div>
                    </div>
                    </div>
            </section>  



            <!-- [ 그래프 박스 ]-->
            <!--temperature graph-->
            <section class="py-5" id="scroll-target">
                <div class="container px-5 my-5">
                    <div class="row gx-5 align-items-center">
                        <div class="col-lg-6"><canvas id="temperature-graph" width="100" height="50"></canvas></div>
                        <div class="col-lg-6">
                            <h2 class="fw-bolder"><exp1></exp1></h2>
                            <p class="lead fw-normal text-muted mb-0"><exp2></exp2></p>
                        </div>
                    </div>
                </div>
            </section>


            <!--humidity graph-->
            <section class="py-5" id="scroll-target">
                <div class="container px-5 my-5">
                    <div class="row gx-5 align-items-center">
                        <div class="col-lg-6"><canvas id="humidity-graph" width="100" height="50"></canvas></div>
                        <div class="col-lg-6">
                            <h2 class="fw-bolder"><exp3></exp3></h2>
                            <p class="lead fw-normal text-muted mb-0"><exp4></exp4></p>
                        </div>
                    </div>
                </div>
            </section>
            


            <!--wind graph-->
            <section class="py-5" id="scroll-target">
                <div class="container px-5 my-5">
                    <div class="row gx-5 align-items-center">
                        <div class="col-lg-6"><canvas id="wind-graph" width="100" height="50"></canvas></div>
                        <div class="col-lg-6">
                            <h2 class="fw-bolder"><exp5></exp5></h2>
                            <p class="lead fw-normal text-muted mb-0"><exp6></exp6></p>
                        </div>
                    </div>
                </div>
            </section>   
            

            <script>  
                //날씨 오픈 api는 조회 방식이나 끌어오는 데이터가 복잡해서 주석을 자세히 작성함

                //* 휴게소 날씨 오픈 api 주의 사항 ()
                //날씨 정보가 반영되는 데에 시간이 걸려서 대체적으로 (현재 시간-3시간)부터 조회 가능함
                //날씨 정보가 올라오지 않는, 데이터가 빈 시간대도 존재함.
                //오픈 api 데이터를 가져오기 위해서는 필수적으로 key, type(xml/json), sdate(날짜), stdHour(시간)을 입력해야 함
                
                //[ 현재 year, month, date, time(hour) 받아오기 ]
                //데이터 조회시 year이나 time은 7대신 07형태로 입력해야 하므로 slice를 이용하여 0X형태로 만듦
                let present = new Date();   
                let present_year = present.getFullYear(); 
                let present_month = ('0'+(present.getMonth() + 1)).slice(-2);  
                let present_date = present.getDate();  
                let present_time = ('0'+(present.getHours())).slice(-2); 

                //현재 년도, 월, 날짜를 YYYYMMDD형태로 변형
                //날씨 오픈 api의 연일월 입력타입이 YYYYMMDD
                let YYYYMMDD = String(present_year)+String(present_month)+String(present_date);  

                //어제 날짜 구하기
                //어제 날짜를 구하는 이유는 바를 출력할 때는 최소 2-3시간, 그래프를 출력할 때에는 9시간 전 ~ 3시간 전의 데이터를
                //수집해야 하는데, 이때 이 구간이 00시에 겹치는 경우에는 그 이전에 해당하는 시간은 yesterday_YYYYMMDD로, 
                //그 이후에 해당하는 시간은 YYYYMMDD로 하여 데이터를 정확하게 가져오기 위함이다.  
                let yesterday = new Date(present_year, present.getMonth(), present_date-1).toLocaleDateString();
                ydata = yesterday.split('.');
                yesterday_YYYYMMDD = String(ydata[0])+ ('0'+String(ydata[1].substr(1))).slice(-2) + ('0'+String(ydata[2].substr(1))).slice(-2)
                
                console.log(yesterday_YYYYMMDD)
                console.log(YYYYMMDD)
                

                //검색창에 휴게소 이름을 입력하면 실행되는 함수 Showweather()
                function Showweather() {

                //휴게소 이름을 검색하기 전까지는 기타 html 구성 요소들은 숨기기 위하여 innerHTML사용
                //휴게소 이름 검색시 화면에 표시
                //bar
                document.querySelector('bar1').innerHTML = '날씨';
                document.querySelector('bar2').innerHTML = '온도';
                document.querySelector('bar3').innerHTML = '습도';
                document.querySelector('bar4').innerHTML = '바람';
                
                //그래프
                document.querySelector('exp1').innerHTML = 'Temperature 기온';
                document.querySelector('exp2').innerHTML = '지금으로부터 9시간 전부터 3시간 전까지의 기온을 조회합니다. <br>* 날씨 데이터가 없는 시간대는 조회 불가능합니다';
                document.querySelector('exp3').innerHTML = 'Humidity 습도';
                document.querySelector('exp4').innerHTML = '지금으로부터 9시간 전부터 3시간 전까지의 습도를 조회합니다. ';
                document.querySelector('exp5').innerHTML = 'wind velocity 풍속';
                document.querySelector('exp6').innerHTML = '지금으로부터 9시간 전부터 3시간 전까지의 풍속을 조회합니다. ';

                //사용자가 입력한 휴게소 이름의 값을 name 변수에 할당    
                name = document.getElementById('name').value 
                //bar부분에 휴게소 이름 출력
                document.querySelector('reststop_name').innerHTML = name;

                

                // < 맨 위 바에 조회 가능한 데이터 중 가장 최근의 날씨 정보 띄우기>

                //오픈 api에서 받아올 수 있는 데이터가 상당히 띄엄띄엄한 관계로 종종 정보가 없는 시간대도 존재하므로 만약의 경우를 대비하여
                //현재 시간으로부터 5시간 전 ~ 2시간 전의 정보중 가장 최근의 정보를 얻을 수 있도록 작성함.

                var nnamedata = new Array(10);
                var ttempdata = new Array(10);
                var hhumidata = new Array(10);
                var wwinddata = new Array(10);

                for(let k=5; k>1; k--){
                   //present_time-k가 음수인 경우 방지
                    if(present_time-k <0){
                        time1 = present_time-k+24;
                        date1 = yesterday_YYYYMMDD
                    }
                    else{
                        time1 = present_time-k
                        date1 = YYYYMMDD
                    }

                //fetch
                fetch('http://data.ex.co.kr/openapi/restinfo/restWeatherList?key=6806352377&type=json&sdate='+ date1 +'&stdHour=' + ('0'+ String(time1)).slice(-2)).then(function(response){
                //testing
                //fetch('http://data.ex.co.kr/openapi/restinfo/restWeatherList?key=test&type=json&sdate='+ "20220316" +'&stdHour='+ ('0'+ String(16)).slice(-2)).then(function(response){
                    method: 'GET';
                    body: JSON.stringify(this.obj)
                    response.text().then(function(text){
                   
                    //불필요한 데이터들을 정리하고 split을 이용하여 text data를 array data로 변환
                    //{}로 구성된 한 세트의 데이터가 어레이의 원소 하나가 되도록 split을 사용
                    index1=text.indexOf('[')
                    index2=text.indexOf(']')
                    ndata=text.substr(index1+1, index2-index1+1)
                    nndata=ndata.split('},');

               
                        //ReststopName (휴게소 이름) 데이터 추출  
                        for(let i=0; i<nndata.length; i++){
                            index3=nndata[i].indexOf('"unitName":"')
                            index4=nndata[i].indexOf('"unitCode":"')
                            ReststopName=nndata[i].substr(index3+12, index4-index3-14)
                          
                            //데이터에서 추출한 휴게소 이름 ReststopName이 검색창을 통해서 사용자에게 입력받은 이름 name과 일치하는 경우
                            //그 데이터 셋에서 weather, temperature, humidity, wind를 추출하도록 함.
                            if(ReststopName == name){
                                //Weather  
                                index5=nndata[i].indexOf('"weatherContents":"')
                                index6=nndata[i].indexOf('"statusNo":"')
                                bar_weather=nndata[i].substr(index5+19, index6-index5-21)
                            
                                //temperature
                                index7=nndata[i].indexOf('"tempValue":"')
                                index8=nndata[i].indexOf('"dewValue":"')
                                bar_temperature=nndata[i].substr(index7+13, index8-index7-20)
            
                                //humidity
                                index9=nndata[i].indexOf('"humidityValue":"')
                                index10=nndata[i].indexOf('"windContents":"')
                                bar_humidity=nndata[i].substr(index9+17, index10-index9-26)
                  
                                //wind
                                index11=nndata[i].indexOf('"windValue":"')
                                bar_wind=nndata[i].substr(index11+13,3)

                                //어레이 nnamedata, ttempdata, hhumidata, wwinddata에 각각 bar_weather, bar_temperature, bar_humidity, bar_wind 데이터 할당
                                nnamedata[k]=bar_weather;
                                ttempdata[k]=bar_temperature;
                                hhumidata[k]=bar_humidity;
                                wwinddata[k]=bar_wind;
                          }     
                        }   
                            //innerhtml을 이용해서 html화면에 데이터 표기
                            //5시간 전, 4시간 전, 3시간 전, 2시간 전의 데이터 중 가장 최근의 데이터를 출력하도록 함
                            for(let o=5; o>1; o-- ){
                                if(nnamedata[2] !='undefined'){
                                    document.querySelector('bar_Weather').innerHTML = ("\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0"+String(nnamedata[2])).slice(-12);
                                    document.querySelector('bar_temperature').innerHTML = ("\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0"+String(ttempdata[2])).slice(-14)+'°C';
                                    document.querySelector('bar_humidity').innerHTML = ("\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0"+String(hhumidata[2])).slice(-12)+'%'
                                    document.querySelector('bar_wind').innerHTML = ("\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0"+String(wwinddata[2])).slice(-12)+ 'm/s';
                                    document.querySelector('empty').innerHTML = ("\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0");                                    
                                }

                                else{
                                    if(nnamedata[3]!='undefined'){
                                        document.querySelector('bar_Weather').innerHTML = ("\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0"+String(nnamedata[3])).slice(-12);
                                        document.querySelector('bar_temperature').innerHTML = ("\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0"+String(ttempdata[3])).slice(-14)+'°C';
                                        document.querySelector('bar_humidity').innerHTML = ("\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0"+String(hhumidata[3])).slice(-12)+'%'
                                        document.querySelector('bar_wind').innerHTML = ("\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0"+String(wwinddata[3])).slice(-12)+ 'm/s';
                                        document.querySelector('empty').innerHTML = ("\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0");       
                                    }
                                    else{
                                        if(nnamedata[4]!='undefined'){
                                            document.querySelector('bar_Weather').innerHTML = ("\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0"+String(nnamedata[4])).slice(-12);
                                            document.querySelector('bar_temperature').innerHTML = ("\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0"+String(ttempdata[4])).slice(-14)+'°C';
                                            document.querySelector('bar_humidity').innerHTML = ("\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0"+String(hhumidata[4])).slice(-12)+'%'
                                            document.querySelector('bar_wind').innerHTML = ("\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0"+String(wwinddata[4])).slice(-12)+ 'm/s';
                                            document.querySelector('empty').innerHTML = ("\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0")
                                        }
                                        else{
                                            if(nnamedata[5]!='undefined'){
                                            document.querySelector('bar_Weather').innerHTML = ("\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0"+String(nnamedata[5])).slice(-12);
                                            document.querySelector('bar_temperature').innerHTML = ("\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0"+String(ttempdata[5])).slice(-14)+'°C';
                                            document.querySelector('bar_humidity').innerHTML = ("\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0"+String(hhumidata[5])).slice(-12)+'%'
                                            document.querySelector('bar_wind').innerHTML = ("\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0"+String(wwinddata[5])).slice(-12)+ 'm/s';
                                            document.querySelector('empty').innerHTML = ("\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0")
                                        }

                                        }
                                    }
                                }

                            }
                    })                           
                  })  
                }
            }
   
            </script>


                 
        </main>
        <!-- Footer-->
        <footer class="bg-dark py-4 mt-auto">
            <div class="container px-5">
                <div class="row align-items-center justify-content-between flex-column flex-sm-row">
                    <div class="col-auto"><div class="small m-0 text-white">Copyright &copy; Your Website 2022</div></div>
                    <div class="col-auto">
                        <a class="link-light small" href="#!">Privacy</a>
                        <span class="text-white mx-1">&middot;</span>
                        <a class="link-light small" href="#!">Terms</a>
                        <span class="text-white mx-1">&middot;</span>
                        <a class="link-light small" href="#!">Contact</a>
                    </div>
                </div>
            </div>
        </footer>


        <!-- Bootstrap core JS-->
        <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js"></script>
        <!-- Core theme JS-->
        <script src="js/scripts.js"></script>
    </body>
</html>