williameom5678 / SeoulPublicTransportAnalyzer

서울시 대중교통 정보(실시간 위치, 예상 도착 시간)를 다운로드하고 비교, 분석하는 프로그램

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

SeoulPublicTransportAnalyzer

서울시 대중교통 정보(실시간 위치, 예상 도착 시간) 다운로드 및 분석

개발 동기

"지도 서비스의 예상 도착 시간은 정확한가?"

네이버 지도, 카카오맵, 구글 지도와 같은 지도 서비스는 대중교통에 대해 출발지와 목적지를 설정하면 최적 경로와 함께 예상 도착 시간을 보여준다.

그러나 예상 도착 시간을 알아내는 것은 쉽지 않은 일이다. 지하철과 달리 버스는 시간표가 없으며, 교통 상황이나 승객에 따라서도 영향을 받으며 환승을 하는 경우 시간의 편차가 클 수 있기 때문이다.

그렇다면 과연 지도 서비스들의 예상 도착 시간은 정확할까? 이를 알아보기 위해 실시간 대중교통 정보와 지도 서비스의 예상 도착 시간 정보를 수집한 뒤 비교해보고자 한다.

구현 기능

지도 서비스의 예상 도착 시간 정보 수집

대한민국에서 주로 사용되는 네이버 지도와 카카오맵, 구글 지도에 대해 경로를 지정하면 예상 도착 시간 정보를 수집할 수 있도록 한다.

네이버 지도

네이버 지도는 /v5/api/transit/directions/point-to-point 경로를 통해 길찾기 정보를 얻어올 수 있으며, 출발점과 도착점의 위도, 경도, 이름 그리고 지하철역의 경우 placeid가 필요하다.

네이버 지도 웹 클라이언트 상에서 이러한 정보는 URL의 정보를 기반으로 만드는데, URL에는 EPSG:3857 좌표계 기반의 좌표와 출발점 / 도착점의 이름 및 장소 타입, 타입에 따른 ID가 작성되어 있다.

따라서 위도와 경도는 좌표를 WGS84 좌표계로 변환하여 얻을 수 있으며, 지하철 역의 경우 /v5/api/subway/mappingdata 경로에서 지하철 역 ID와 placeid 사이의 관계 데이터를 얻을 수 있으므로 placeid 또한 획득할 수 있다.

카카오맵

카카오맵은 https://map.kakao.com/route/pubtrans.json 경로를 통해 길찾기 정보를 얻어올 수 있으며, 출발점과 도착점의 좌표, 이름, id가 필요하다.

API 호출에 필요한 모든 정보가 카카오맵에서 내보내기 기능을 통해 얻을 수 있는 URL에 주어져 있으므로, 그대로 넣어주면 호출할 수 있다.

구글 지도

구글 지도는 Google Maps의 Directions API를 이용하면 길찾기 정보를 받아올 수 있으므로, @googlemaps/google-maps-services-js 라이브러리를 이용하였다.

이 코드를 실행할 경우, Google Cloud Platform에서 Directions API를 사용 신청한 API Key를 .env 파일에 GOOGLE_MAPS_API_KEY={Your API Key}의 형태로 작성해야 한다.

실시간 대중교통 정보 수집

지정한 노선에 대한 실시간 대중교통 정보를 수집할 수 있도록 한다.

Open API의 한계점

서울시 Open API는 충분한 정보를 제공해주나, 일일 1,000건의 API 호출 제한이 있다. 이는 첫차부터 막차까지의 모든 정보를 하루 종일 수집해야 하는 해당 프로젝트에는 충분하지 않은 양이므로 대안을 찾아 본다.

버스 - 서울대중교통 실시간 버스정보

서울대중교통 실시간 버스정보 (https://bus.go.kr/searchResult6.jsp) 웹사이트에서 특정 노선에 대한 정보를 제공하므로 이를 이용하였다.

검색 자체는 API를 호출하나, 이 역시 버스 노선 이름과 다른 버스 id가 필요하다.

이 경우, 검색 결과가 SSR 방식으로 주어지므로 불러온 웹 사이트를 cheerio를 이용해 분석하여 버스 id를 얻는다.

해당 웹사이트에서는 노선을 지정하면 운행 중인 모든 버스의 정보를 얻어올 수 있으며, 내부적으로 새로고침 시간이 20초로 되어 있는 점에서 크롤링이 서버에 부하를 주지 않을 것으로 기대할 수 있다.

지하철 - 서울교통공사 실시간 열차 정보

서울교통공사 웹사이트 (https://smapp.seoulmetro.co.kr:58443/traininfo/traininfoUserView.do)에서 1~8호선의 모든 열차에 대한 정보를 한 번에 제공하므로 이를 이용하였다.

이는 SSR 방식으로 웹 사이트를 불러올 때 모든 렌더링이 완료되어 불러와지므로, 불러온 웹 사이트를 cheerio를 통해 분석하여 지하철에 대한 정보를 얻는다.

모든 노선의 정보를 한 번에 불러올 수 있으며 웹사이트 내부적으로 새로고침 시간이 6초로 되어 있어 더 정밀한 데이터 탐색이 가능하나, 서울교통공사가 소유하지 않는 9호선이나 타 호선에 대한 정보를 얻어올 수 없다는 문제가 있다.

당장의 프로젝트 시행에는 문제가 없으나, 장기적으로 수도권 모든 전철에 대해 정보를 얻어올 수 있는 방법을 발견해야 할 것이다.

수집한 데이터를 통한 실제 도착 시간 계산

수집한 실시간 대중교통 정보를 이용해 실제로는 언제 도착하였을지를 계산한다.

엑셀 파일로 출력

데이터의 분석을 위해 엑셀(.xlsx) 파일로의 출력을 지원한다.

확장 가능성

새로운 지도 서비스

위의 분석 방식이 기존의 지도 서비스에 비해 나은 예상 도착 시간 정보를 알려줄 수 있다면, 과거의 데이터를 기반으로 예상 도착 시간을 알려주고 가장 빠르게 도착할 수 있는 경로를 안내해 주는 새로운 지도 서비스를 제작할 수 있다.

About

서울시 대중교통 정보(실시간 위치, 예상 도착 시간)를 다운로드하고 비교, 분석하는 프로그램

License:Apache License 2.0


Languages

Language:TypeScript 100.0%