프로그래밍 언어/React

<React> 고속도로 도착 시간 예측 페이지 짜기 프로젝트 1. 시작

창조적생각 2021. 11. 30. 22:45

 

<목차>

1. 목표

2. 구현 된 상황

3. 고쳐야 할 점

4. 전체 코드

 

1. 목표

 

1) 광역시 간에 고속도로를 이용하여 여행을 할 때 걸리는 시간을 계산한다. (다만 근처에 광역시 혹은 특별시가 있는 인천광역시와 울산 광역시는 제외한다.)

 

 2) 출발지와 도착지 입력 값을 넣으면 자동으로 구간 내에 이동 시 걸리는 시간을 계산한다.

 

 3) 도로교통공사 API 내에 있는 자료의 형식에 따라 최종 출력값은 출발지, 목적지, 최대 소요시간, 최소소요시간, 최대소요시간으로 한다.

 

2. 구현된 상황

 

 1)경부선 라인 (서울 - 대전 - 대구 - 부산)

 2) 출발지와 도착지 입력 시 시간 계산

 3) 출발지,목적지,최대 소요시간, 최소소요시간,최대소요시간

 

3. 고쳐야 할 점

 

 1)광주광역시는 아직 구간을 정확히 파악하지 못해 넣지 못했습니다.

 

 2) 출발지와 도착지 입력 값을 넣으면 구간 내에 이동 시 걸리는 시간이 계산되기는 하나 한 번 더 값을 입력해야 값이 출력되는 현상이 발생하고 있습니다. 또한 실시간 데이터를 받다 보니 가끔 누락되는 데이터가 발생하여 올바른 예측 값이 나오지 않는 현상이 발생합니다.

 

4.전체코드

App.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
import './App.css';
import { useState,useEffect } from 'react';
 
import 'bootstrap/dist/css/bootstrap.min.css';
import {Input} from './input';
import {GetMultiTraffic} from './multiTraffic';
 
function App() {
  const [inputs,setInputs] = useState({
    startCity:'',
    endCity:''
  })
  const [start,setStart] = useState([]);
  const [end,setEnd] = useState([])
 
 
  const {startCity, endCity} = inputs;
 
  const handleChange = (e) =>{
    const {name, value} = e.target;
    setInputs({
      ...inputs,
      [name]: value
    });
   
  }
 
  useEffect(() =>{
    //경부 고속도로 하행선 시작
    if (startCity ==='서울' && endCity ==='대전'){
      setStart(['101'])
      setEnd(['115'])
    }
    else if(startCity ==='서울' && endCity ==='대구'){
      setStart(['101'])
      setEnd(['129'])
    }
    else if(startCity ==='서울' && endCity ==='부산'){
      setStart(['101','129','131','133'])
      setEnd(['129','131','133','140'])
    }else if(startCity ==='대전' && endCity ==='대구'){
      setStart(['115'])
      setEnd(['129'])
    }
    else if(startCity ==='대전' && endCity ==='부산'){
      setStart(['115','129','131','133'])
      setEnd(['129','131','133','140'])
    }
    else if(startCity ==='대구' && endCity ==='부산'){
      setStart(['131','133'])
      setEnd(['133','140'])
    }
    //경부 고속 도로 하행선 종료
    //경부 고속도로 상행선 시작
    else if (startCity ==='부산' && endCity ==='대구'){
      setStart(['133','140'])
      setEnd(['131','133'])
    }
    else if (startCity ==='부산' && endCity ==='대전'){
      setStart(['123','131','133','140'])
      setEnd(['115','123','131','133'])
    }
    else if (startCity ==='부산' && endCity ==='서울'){
      setStart(['123','131','133','140'])
      setEnd(['101','123','131','133'])
    }
    else if (startCity ==='대구' && endCity ==='대전'){
      setStart(['123'])
      setEnd(['115'])
    }
    else if (startCity ==='대구' && endCity ==='서울'){
      setStart(['123'])
      setEnd(['101'])
    }
    else if (startCity ==='대전' && endCity ==='서울'){
      setStart(['115'])
      setEnd(['101'])
    }
    //경부 고속도로 상행선 종료
    //광주 관련 도로 시작
 
    //광주 관련 도로 종료
 
    
  },[startCity,endCity])
 
  return(
    <div>
      <Input name = 'startCity' type = 'text' placeholder ='' onChange = {handleChange}></Input>
      <Input name = 'endCity' type = 'text' placeholder ='' onChange = {handleChange}></Input>
      <GetMultiTraffic startCity = {startCity} endCity = {endCity} start = {start} end = {end}></GetMultiTraffic>
    </div>
  )
 
  
}
 
export default App;
cs

 

input.js

1
2
3
4
5
6
7
8
9
10
11
import React from "react";
 
const Input = ({name,type,onChange}) =>{
    return(
        
            <div>
                <input name = {name} type = {type} onChange = {onChange} ></input>
            </div>     
    )
}
export {Input};
cs

 

multiTraffic.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
import React, { useState, useEffect } from 'react';
import axios from "axios";
 
 const GetMultiTraffic = (props)=>{
    const [dataSumList,setDataSumList] = useState([])
    // let dataList = []
    // let dataSumList = []
 
    console.log(props)
 
    function timeCal(t){
        let minutes = 0;
        let hour = 0;
        if (3600 > t ){
            minutes = parseInt(t/60)
            return `${minutes}분` 
        }
        else if (t>=3600){
            hour = parseInt(t/3600)
            minutes = parseInt((t - hour*3600)/60)
            return `${hour}시간 ${minutes}분`
        }
    }
    useEffect( () =>{
        const { start, end } = props
        let tempDataList = []
        let sumTimeAvg = 0
        let sumTimeMax = 0
        let sumTimeMin = 0
        try{
            async function getTraffics(){
            for (let i=0;i<start.length;i++){
                const data = await axios.get(`http://data.ex.co.kr/openapi/odhour/trafficTimeByRoute?key=발급받은 API키입력8&type=json&startUnitCode=${start[i]}&endUnitCode=${end[i]}`)
                const {list} = data.data
                for (let j = 0; j<list.length; j++) {
                    if(list[j].startUnitCode ===`${start[i]} `&&list[j].endUnitCode ===`${end[i]} `&&list[j].carType ==='1'){
                        tempDataList.push({'carType':list[j].carType,'startUnitCode':list[j].startUnitCode,'endUnitCode':list[j].endUnitCode,'timeAvg':list[j].timeAvg,'timeMax':list[j].timeMax,'timeMin':list[j].timeMin,'sumTm':list[j].sumTm});
                    }
                }
                }
            for (let j = 0; j < tempDataList.length;j++){
                sumTimeAvg = sumTimeAvg + parseInt(tempDataList[j].timeAvg)
                sumTimeMax = sumTimeMax + parseInt(tempDataList[j].timeMax)
                sumTimeMin = sumTimeMin + parseInt(tempDataList[j].timeMin)
            }
            setDataSumList([sumTimeAvg,sumTimeMax,sumTimeMin])
            }
            getTraffics()
            }
        catch(e){
                console.log('err')
              }
 
            },[props])
 
            console.log(dataSumList)
    return(
 
         <div className = "col-md-12">
               <div className = 'startCity'>출발 : {props.startCity}</div>
            <div className = 'endCity'>도착 : {props.endCity}</div>
            <div className = 'sumTimeAvg'>평균예상시간 : {timeCal(dataSumList[0])}</div>
             <div className = 'sumTimeMax'>최대예상시간 : {timeCal(dataSumList[1])}</div>
             <div className = 'sumTimeMin'>최소예상시간 : {timeCal(dataSumList[2])}</div>
     </div>
 )
}
export {GetMultiTraffic}
cs

 

 

 

 

 

728x90