Toggle navigation
Toggle navigation
This project
Loading...
Sign in
김민규
/
rest_stop_list
Go to a project
Toggle navigation
Toggle navigation pinning
Projects
Groups
Snippets
Help
Project
Activity
Repository
Pipelines
Graphs
Issues
0
Merge Requests
0
Wiki
Snippets
Network
Create a new issue
Builds
Commits
Issue Boards
Authored by
지창언
2022-06-02 11:29:06 +0900
Browse Files
Options
Browse Files
Download
Email Patches
Plain Diff
Commit
af91b43efc29ec26c1cd801df3aa5c869171c5e7
af91b43e
1 parent
c2790bca
conflict
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
194 additions
and
21 deletions
app/views/weather.html
app/views/weather.html
View file @
af91b43
<!--
휴게소 표준정보의 service area code 의 우측끝 3자리 == 휴게소 날씨 표준정보의 unitCode
-->
<!DOCTYPE html>
<html
lang=
"en"
>
<head>
...
...
@@ -11,7 +14,7 @@
<!-- 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"
/>
<link
href=
"css/styles.css"
rel=
"stylesheet"
/>
</head>
...
...
@@ -28,7 +31,7 @@
<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=
"
/post"
>
Board
</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"
>
...
...
@@ -56,11 +59,26 @@
<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
class=
"dropdown"
>
<button
class =
"btn btn-primary dropdown-toggle "
id=
"highway"
data-bs-toggle=
"dropdown"
>
고속도로 선택
</button>
<div
class =
"dropdown-menu"
>
<a
class=
"dropdown-item"
onclick=
"addReststop('0010')"
>
경부선
</a>
<a
class=
"dropdown-item"
onclick=
"addReststop('0550')"
>
중앙선
</a>
<a
class=
"dropdown-item"
onclick=
"addReststop('0500')"
>
영동선
</a>
</div>
<button
class =
"btn btn-primary dropdown-toggle "
id =
"rest_stop"
data-bs-toggle=
"dropdown"
>
휴게소 선택
</button>
<div
class =
"dropdown-menu"
id =
"select_restStop"
>
</div>
</div>
</div>
</div>
</div>
</div>
...
...
@@ -124,8 +142,9 @@
</div>
</section>
<script
src=
"https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"
></script>
<script>
//날씨 오픈 api는 조회 방식이나 끌어오는 데이터가 복잡해서 주석을 자세히 작성함
//* 휴게소 날씨 오픈 api 주의 사항 ()
...
...
@@ -141,7 +160,7 @@
let
present_date
=
present
.
getDate
();
let
present_time
=
(
'0'
+
(
present
.
getHours
())).
slice
(
-
2
);
//현재 년도, 월, 날짜를 YYYYMMDD형태로 변형
//현재 년도, 월, 날짜를 YYYYMMDD형태로 변형
//날씨 오픈 api의 연일월 입력타입이 YYYYMMDD
let
YYYYMMDD
=
String
(
present_year
)
+
String
(
present_month
)
+
String
(
present_date
);
...
...
@@ -155,11 +174,152 @@
console
.
log
(
yesterday_YYYYMMDD
)
console
.
log
(
YYYYMMDD
)
// 모든 자식요소들을 삭제하는 함수
function
removeAllchild
(
div
)
{
while
(
div
.
hasChildNodes
())
{
div
.
removeChild
(
div
.
firstChild
);
}
}
var
serviceAreaCode
=
""
;
//
검색창에 휴게소 이름을 입력하면 실행되는 함수 Showweather()
function
Showweather
()
{
//
각 고속도로에 존재하는 휴게소 리스트를 작성하여 드랍다운 메뉴에 추가합니다.
function
addReststop
(
lineNumber
)
{
// 아래 조건문은 각 고속도로 선택시 해당 고속도로 이름이 버튼(html)에 기록되도록 하기 위함입니다.
let
highway_Area
=
document
.
getElementById
(
'highway'
);
if
(
lineNumber
===
'0010'
){
highway_Area
.
innerHTML
=
'경부선'
;
}
else
if
(
lineNumber
===
'0550'
){
highway_Area
.
innerHTML
=
'중앙선'
;
}
else
if
(
lineNumber
===
'0500'
){
highway_Area
.
innerHTML
=
'영동선'
;
}
let
tagArea
=
document
.
getElementById
(
'select_restStop'
);
// 드랍다운 메뉴 추가할 태그 아이디 저장
removeAllchild
(
tagArea
);
// 고속도로 선택시마다 새로운 휴게소를 불러와야 하므로 현재 드랍다운 메뉴에 존재하는 자식요소 싹다 삭제합니다.
// 아래의 ajax 문을 통해서 휴게소표준 api를 불러옵니다. 각 고속도로에 대한 모든 휴게소이름과 휴게소 코드를 가져오기 위함입니다.
// 여기서 가져오게되는 휴게소 코드(serviceAreaCode)는 추후에 휴게소별 날씨정보 api에 있는 unitCode와 상응하는 데이터입니다.
var
routeCodes
=
[];
var
svarAddrs
=
[];
var
rest_names
=
[];
var
serviceAreaCodes
=
[];
// 페이지 1
$
.
ajax
({
url
:
"http://data.ex.co.kr/openapi/business/conveniServiceArea?key=1817997939&type=json&numOfRows=99&pageNo=1"
,
async
:
false
,
success
:
function
(
data
){
//변수 설정
userData
=
data
;
},
}).
done
(
function
()
{
var
routeCode
=
""
;
var
svarAddr
=
""
;
var
rest_name
=
""
;
var
data_count
=
userData
[
"list"
].
length
// 데이터 개수 얻기
for
(
var
i
=
0
;
i
<
data_count
;
i
++
){
routeCode
=
JSON
.
stringify
(
userData
[
"list"
][
i
][
"routeCode"
]);
// 고속도로 번호를 가져옵니다.
rest_name
=
JSON
.
stringify
(
userData
[
"list"
][
i
][
"serviceAreaName"
]);
// 휴게소 이름을 가져옵니다.
serviceCode
=
JSON
.
stringify
(
userData
[
"list"
][
i
][
"serviceAreaCode"
]);
// 휴게소코드를 가져옵니다.
if
(
routeCode
.
substring
(
1
,
5
)
===
lineNumber
){
// 고속도로 코드가 같다면
rest_names
.
push
(
rest_name
);
//휴게소 이름을 저장해둡니다...
serviceAreaCodes
.
push
(
serviceCode
);
// 휴게소 코드를 저장해둡니다.
}
}
// 아래 forEach문은 저장한 모든 휴게소에 대해, 드랍다운 버튼을 생성하기 위함입니다.
rest_names
.
forEach
(
function
(
addr
,
index
){
let
new_A_Button
=
document
.
createElement
(
'a'
);
// a 속성 생성
new_A_Button
.
setAttribute
(
'class'
,
'dropdown-item'
);
new_A_Button
.
setAttribute
(
'onclick'
,
"Showweather("
+
serviceAreaCodes
[
index
]
+
","
+
rest_names
[
index
]
+
")"
);
new_A_Button
.
innerHTML
=
rest_names
[
index
].
substring
(
1
,
rest_names
[
index
].
length
-
1
);
tagArea
.
appendChild
(
new_A_Button
);
})
})
// 페이지 2, 페이지 1과 모든 과정이 동일하며, 오픈 api 데이터 가져오는 특성상 페이지를 나누었습니다.
$
.
ajax
({
url
:
"http://data.ex.co.kr/openapi/business/conveniServiceArea?key=1817997939&type=json&numOfRows=99&pageNo=2"
,
async
:
false
,
success
:
function
(
data
){
//변수 설정
userData
=
data
;
},
}).
done
(
function
()
{
var
routeCode
=
""
;
var
svarAddr
=
""
;
var
rest_name
=
""
;
var
data_count
=
userData
[
"list"
].
length
// 데이터 개수 얻기
for
(
var
i
=
0
;
i
<
data_count
;
i
++
){
routeCode
=
JSON
.
stringify
(
userData
[
"list"
][
i
][
"routeCode"
]);
rest_name
=
JSON
.
stringify
(
userData
[
"list"
][
i
][
"serviceAreaName"
]);
// 휴게소 이름...
serviceCode
=
JSON
.
stringify
(
userData
[
"list"
][
i
][
"serviceAreaCode"
]);
if
(
routeCode
.
substring
(
1
,
5
)
===
lineNumber
){
// 고속도로 코드가 같다면
rest_names
.
push
(
rest_name
);
//휴게소 이름...
serviceAreaCodes
.
push
(
serviceCode
);
}
}
rest_names
.
forEach
(
function
(
addr
,
index
){
let
new_A_Button
=
document
.
createElement
(
'a'
);
// a 속성 생성
new_A_Button
.
setAttribute
(
'class'
,
'dropdown-item'
);
new_A_Button
.
setAttribute
(
'onclick'
,
"Showweather("
+
serviceAreaCodes
[
index
]
+
","
+
rest_names
[
index
]
+
")"
);
new_A_Button
.
innerHTML
=
rest_names
[
index
].
substring
(
1
,
rest_names
[
index
].
length
-
1
);
tagArea
.
appendChild
(
new_A_Button
);
})
})
// 페이지 3
$
.
ajax
({
url
:
"http://data.ex.co.kr/openapi/business/conveniServiceArea?key=1817997939&type=json&numOfRows=99&pageNo=3"
,
async
:
false
,
success
:
function
(
data
){
//변수 설정
userData
=
data
;
},
}).
done
(
function
()
{
var
routeCode
=
""
;
var
svarAddr
=
""
;
var
rest_name
=
""
;
var
data_count
=
userData
[
"list"
].
length
// 데이터 개수 얻기
for
(
var
i
=
0
;
i
<
data_count
;
i
++
){
routeCode
=
JSON
.
stringify
(
userData
[
"list"
][
i
][
"routeCode"
]);
rest_name
=
JSON
.
stringify
(
userData
[
"list"
][
i
][
"serviceAreaName"
]);
// 휴게소 이름...
serviceCode
=
JSON
.
stringify
(
userData
[
"list"
][
i
][
"serviceAreaCode"
]);
if
(
routeCode
.
substring
(
1
,
5
)
===
lineNumber
){
// 고속도로 코드가 같다면
rest_names
.
push
(
rest_name
);
//휴게소 이름...
serviceAreaCodes
.
push
(
serviceCode
);
}
}
rest_names
.
forEach
(
function
(
addr
,
index
){
let
new_A_Button
=
document
.
createElement
(
'a'
);
// a 속성 생성
new_A_Button
.
setAttribute
(
'class'
,
'dropdown-item'
);
new_A_Button
.
setAttribute
(
'onclick'
,
"Showweather("
+
serviceAreaCodes
[
index
]
+
","
+
rest_names
[
index
]
+
")"
);
new_A_Button
.
innerHTML
=
rest_names
[
index
].
substring
(
1
,
rest_names
[
index
].
length
-
1
);
tagArea
.
appendChild
(
new_A_Button
);
})
})
}
//검색창에 휴게소 이름을 입력하면 실행되는 함수 Showweather() serviceCode = 휴게소 코드, rest_name = 휴게소 이름
function
Showweather
(
serviceCode
,
rest_name
)
{
serviceCode
=
serviceCode
.
substring
(
3
,
serviceCode
.
length
);
//가져온 휴게소코드를 여기서 사용하는 휴게소코드인 unitCode와 동일한포맷으로 바꿉니다.
let
rest_stop
=
document
.
getElementById
(
'rest_stop'
);
// 해당 줄과 바로 아랫줄은 드랍다운 버튼선택시 해당 휴게소이름을 html에 적용하기 위함입니다.
rest_stop
.
innerHTML
=
rest_name
;
//휴게소 이름을 검색하기 전까지는 기타 html 구성 요소들은 숨기기 위하여 innerHTML사용
//휴게소 이름 검색시 화면에 표시
//bar
...
...
@@ -177,9 +337,9 @@
document
.
querySelector
(
'exp6'
).
innerHTML
=
'지금으로부터 9시간 전부터 3시간 전까지의 풍속을 조회합니다. '
;
//사용자가 입력한 휴게소 이름의 값을 name 변수에 할당
name
=
document
.
getElementById
(
'name'
).
value
name
=
rest_name
//bar부분에 휴게소 이름 출력
document
.
querySelector
(
'reststop_name'
).
innerHTML
=
name
;
document
.
querySelector
(
'reststop_name'
).
innerHTML
=
rest_
name
;
...
...
@@ -192,7 +352,7 @@
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
){
...
...
@@ -219,17 +379,26 @@
index2
=
text
.
indexOf
(
']'
)
ndata
=
text
.
substr
(
index1
+
1
,
index2
-
index1
+
1
)
nndata
=
ndata
.
split
(
'},'
);
//ReststopName (휴게소 이름) 데이터 추출
for
(
let
i
=
0
;
i
<
nndata
.
length
;
i
++
){
// 아래 두줄의 코드를 통해서 휴게소코드를 가져옵니다.
let
index1forUnitCode
=
nndata
[
i
].
indexOf
(
'"unitCode":"'
);
unitCode
=
nndata
[
i
].
substr
(
index1forUnitCode
+
12
,
3
);
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
){
// 해당 함수의 매개변수로 가져온 휴게소 코드와, 함수 안에서 fetch를 통해 가져온 오픈 api의 휴게소코드가 동일한지 비교합니다.
//fawfe
if
(
serviceCode
==
unitCode
){
console
.
log
(
"unitCode access"
);
//Weather
index5
=
nndata
[
i
].
indexOf
(
'"weatherContents":"'
)
index6
=
nndata
[
i
].
indexOf
(
'"statusNo":"'
)
...
...
@@ -254,8 +423,9 @@
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
--
){
...
...
@@ -300,7 +470,7 @@
})
})
}
//그래프 그리기
//온도, 습도, 풍속 데이터를 array에 저장하여 그래프에 넘겨줌
...
...
@@ -308,7 +478,7 @@
var
humidata
=
new
Array
(
10
);
var
winddata
=
new
Array
(
10
);
name
=
document
.
getElementById
(
'name'
).
valu
e
name
=
rest_nam
e
for
(
let
j
=
0
;
j
<
7
;
j
++
){
//present_time-3-j가 음수인 경우 방지
...
...
@@ -322,7 +492,7 @@
date2
=
YYYYMMDD
}
name
=
document
.
getElementById
(
'name'
).
valu
e
name
=
rest_nam
e
fetch
(
'http://data.ex.co.kr/openapi/restinfo/restWeatherList?key=6806352377&type=json&sdate='
+
date2
+
'&stdHour='
+
(
'0'
+
String
(
time2
)).
slice
(
-
2
)).
then
(
function
(
response
){
//testing
// 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){
...
...
@@ -338,12 +508,15 @@
//ReststopName (휴게소 이름)
for
(
let
i
=
0
;
i
<
nndata
.
length
;
i
++
){
let
index1forUnitCode
=
nndata
[
i
].
indexOf
(
'"unitCode":"'
);
unitCode
=
nndata
[
i
].
substr
(
index1forUnitCode
+
12
,
3
);
index3
=
nndata
[
i
].
indexOf
(
'"unitName":"'
)
index4
=
nndata
[
i
].
indexOf
(
'"unitCode":"'
)
ReststopName
=
nndata
[
i
].
substr
(
index3
+
12
,
index4
-
index3
-
14
)
if
(
ReststopName
==
nam
e
){
if
(
serviceCode
==
unitCod
e
){
//Weather
index5
=
nndata
[
i
].
indexOf
(
'"weatherContents":"'
)
index6
=
nndata
[
i
].
indexOf
(
'"statusNo":"'
)
...
...
Please
register
or
login
to post a comment