CLOSED‎ > ‎

버스 찾기

2016년 4월 기준으로, http://api.bus.go.kr/ 에서 data.go.kr을 통해 API 제공을 하고 경위도 좌표까지 포함해서 반환해주기 때문에, 서울시 전체 버스 정류장과 노선을 쉽게 확인할 수 있다.

npm install xml-json -g 설치 후에 xml-json API반환.xml itemList > bulk.json 정도로 각 정류장 정보를 뽑아낸 후에 만들어진 JSON 문서를 적당히 가공해서 Elasticsearch에 넣으면 Kibana에서 간단하게 지도 상의 버스 정류장 분포를 볼 수 있다.



2008년 6월 11일. 당시 포털의 버스 노선 찾기는 정류장 이름을 넣는 식으로 되어 있었는데, 내가 원하는 건 출발과 도착 혹은 그 사이의 경유지를 찍으면 그 지점을 통과하는 노선과 환승지점을 그냥 찾아주는 식이었다. 정류장 정보가 있으면 구현할 수 있겠다 생각은 하고 있었는데 대학 학기도 끝나고 해서 손을 댔다.

다행히 서울시 교통정보센터에서 정류장 위치와 노선정보를 엑셀 파일로 제공한다. 거기에 버스의 실시간 위치도 URL을 가로채면 확인할 수 있는 구조로 되어 있었지만 실시간으로 쿼리를 날리면 또 대기오염 지도 때처럼 문제가 생길까봐 거기까진 나가지 않았다.

제공되는 정류장 위치는 네이버식으로 되어 있었는데 지도 API에서 쓰기 위해서는 경·위도로 바꿔야 했고 다행히 aero님의 변환식이 있어서 pyproj를 통해 잘 처리했다.
from pyproj import Proj, transform
latlong = Proj(proj='latlong', datum='WGS84', ellps='WGS84')
tm128 = Proj(proj='tmerc', lat_0='38N', lon_0='128E', ellps='bessel', x_0=400000, y_0=600000, k=0.9999, towgs84='-146.43,507.89,681.46')
utm = Proj(proj='tmerc', lat_0='38N', lon_0='127E', ellps='GRS80', x_0=200000, y_0=500000, k=0.9999, towgs84='-146.43,507.89,681.46')
long, lat = transform(tm128,latlong,x,y)
TM128은 네이버가 쓰던 방식이고, UTM은 원점 위치 등이 조금 다른 것이다.

구현은 Django로 했으며 엑셀 파일을 가져다 좌표 변환을 거치는 과정과 이후 좌표별로 요청이 들어오면 JSON으로 DB에서 그 영역의 정류소와 해당 노선을 뿌려주는 과정을 나누고, 나머지 전단의 표면적인 처리는 웹페이지에서 처리하는 식이었다.

다만 전단에서 처리하기엔 야후 지도에서 제공하는 API가 부족했다. 선을 일단 그리고 나면 따로 능동적인 반응을 이끌어낼 수도 없었고 기록이 남아서 동적으로 관리할 수 있게 된 것도 아니었다. 구글 지도도 봤지만 별반 다르지 않았다. 노선 위에 마우스를 올리면 노선 정보가 보이는 식의 동작이 불가능한 것이다.

14일 정도까지 전단에 대해 이런저런 손질을 하다가, 딱히 뭘 넣을지 아이디어가 고갈되었다. 의견을 들었던 것 중에 첫차·막차 시간, 배차 시간 같은 간단한 정보는 그냥 표시하면 되니까 쉬워 보였고, 최단거리 최소환승 같은 건 후단에서 계산이 좀 필요하긴 하지만 DB에 있는 정보로 처리할 수 있어 보였다.

지지부진하던 사이 포털에서 지도 서비스를 개선했고, 특히 다음 지도에서 대중교통 길찾기를 내 의도에 일치하게 만들어서, 따로 busfinder를 만들 이유가 사라졌다.
좌표 변환 과정에서 변수를 하나 빼먹은 결과. 강남대로 사거리에 비해 사당역 쪽이 조금 더 어긋나 있다.
빼먹었던 값을 다시 넣어 변환한 결과. 잘 일치한다. 다만 도로가 꺾이는 부분에서 노선이 도로에 맞게 그려지지 못하는데 이는 도로 정보를 보유하지 않는 이상 어찌 할 수 없는 부분이다.

Comments