글 : 김승범
어떻게 하면 GPS데이터로 소방차량의 움직임과 도로의 상황을 효과적으로 보여줄 수 있을까?
충남 지역의 소방차량 GPS궤적 데이터를 이용하여 소방출동시 차량이 빠르게 움직이기 어려운 지역을 표현해야 했다. 정지 상태의 이미지가 아닌, 영상을 만들어야 한다는 조건이 있었다. 이미지를 만들어야 했다면 색이나 선의 형태등으로 시간의 차원을 압축시켜야 했겠지만 영상의 경우에는 표현의 범위가 약간 넓어진다. 이동에서의 시간의 차원을 그대로 영상의 진행시간에 녹여낼 수 있다는 기회는 한편으로는 다행이기도 하고, 또 다른 한편으로는 다루어야 하는 차원이 늘어난만큼 난이도 있는 작업이 된다. 결과 영상은 글 맨 아래에 넣었다.
일단 데이터부터 파악해보자
GPS 데이터에는 통상적으로 시각과 공간좌표가 있다. 이동 거리를 소요시간으로 나누면 차량의 속도가 나온다. 영상이라면 영상의 진행에 따라 차량을 그리는 위치를 변화시키면 그대로 움직임이 드러난다. 당연한 얘기지만, 시간간격이 일정하다면 실제로 빨리 움직인 차량 역시 영상에서도 빠르게 움직일 것이다.
물론 데이터의 시간 간격이 클 경우 그대로 맵핑했을 때 어색하게 보일수도 있다. 운 나쁜 경우는 시간간격이 너무 커서 궤적을 보여주려면 맵매칭(map matching)을 해야 하는 경우도 있지만, 대부분 곡선 보간을 하면 어느정도 부드럽게 보인다. 이번 데이터의 경우 20m의 이동거리마다 좌표값이 있었기 때문에 직선을 그대로 사용해도 자연스럽게 보였다.
하나의 개체를 삼각형으로 표현하기
수많은 개체들의 이동 데이터를 가지고 있다면 하나의 개체를 어떻게 그릴것인지만 잘 정의해주면 된다. 무엇으로 그리는가에 따라 달라지겠지만 개체의 수가 많아진다면 최대한 단순하게 표현하여 짧은 시간에 많은 컷을 그릴 수 있도록 신경써야 한다. 소방차량 같은 경우 30000개 정도의 line-strip 개체였고, 특정 시각에 표현되는 양은 그보다 많이 적었으므로 충분한 표현의 여력이 있었다. OpenGL로 작업했는데 shader에서 웬만한 표현을 해도 충분히 빠르게 화면 위에 그려졌다.
기본적인 개체의 형태는 여러번의 시행착오를 거쳐, Till Nagel이 표현했던 것처럼 경로 위에 수직방향으로 삼각형에서 출발해보기로 했다. 각도에 따라서 어떤 움직임은 잘 보이지 않는다는 단점이 있기도 하지만, 수직으로 서 있는 삼각형의 면은 뒤에서 설명하게 될 추가적인 정보를 표현할 수 있는 밑바탕이 된다.
Till Nagel의 자전거 시각화 작업
참고 이미지 출처 : https://uclab.fh-potsdam.de/cf/
일단 한번 그려보았다.
한 달 동안 이동한 모든 차량을 하루 중의 같은 시간대에 모두 넣어 표현하였다. 소방 차량의 경우 사건 한번에 다수의 차량이 출동하는 경우가 대부분인데, 각 개체의 삼각형을 투명하게 표현하면 줄지어 가더라도 머리 부분의 높이가 다르기 때문에 무리지어 가는 여러대의 차량들이 뭉치지 않고 구분되어 보인다.
그런데 개별적인 차량의 빠르기는 어떻게 보일까? 한 화면에 몇 십 개 이상의 차량이 동시에 이동하고 있는데 하나하나를 보고 있자면 느리고 빠른 것이 보이지만 다수를 동시에 시선으로 잡아내고 이해하기는 쉽지 않다.
그리고 차량이 지나가는 도로의 상황을 알고 싶을 경우 차량이 해당 부분을 지나가고 난 뒤에는 그 도로가 막혔는지 소통이 원활했는지를 파악하기가 어렵다. 머리부분의 속도를 파악하기는 쉽지만 차량이 지나간 후 이미 몸통이 된 부분은 구분하기 어렵다. 그래서 개체 하나하나의 수직 면에 부가적인 정보를 표현해보기로 했다.
매 순간의 속도를 그래프로 기록한다
한 개체의 삼각형 면을 속도 그래프로 만들어봤다. 시행착오를 거쳤고, 너무 넓은 속도 범위 보다는 일정한 범위를 보여주는 것이 더 눈에 잘 들어온다고 판단했다. 시속 20km 부터 시속 80km까지 표현하기로 했으며 빨간색이 옆면을 가득 채울때는 시속 20km이하, 맨 위의 빨간색 단선만 남을 때는 시속 80km, 혹은 그 이상이다. 20~80km 사이는 속도에 비례하여 채워지도록 했다.
좀 더 쉽게 표현하자면, 빠르게 달릴때는 옆면이 투명하게 보이고, 도로가 막힐때는 빨간색으로 불투명하게 보인다고 할 수 있겠다.
이동에 glow를 주어 좀 더 그럴듯하고 멋있게 표현할 수도 있겠지만, 그게 모든 데이터 시각화가 지향하는 바는 아니다.
이제 본격적으로 그려보자.
특정 시각과 장소의 재현
2018년 7월 1일 오후 4시경 천안시와 그 주변의 상황. 시 외곽은 빠르게 달리고 시내는 움직임이 늘 더디다.
충청남도의 소방차량 이동을 보면, 서울처럼 행정구역 거의 전체가 도시화된 지역과는 확연하게 다른 특징이 보인다. 위의 그림에서 천안시 동남구라고 표현된 부분 근처에 사건이 발생했다. 시 외곽지역임에도 불구하고 속도가 나질 않는다. 시내길이라면 차량이 많아서 그러할테지만, 이러한 지역들은 도로의 물리적 사정이 좋지 않다. 길이 좁고 구불구불하기 때문에 좀처럼 빠르게 달리기 어렵다.
사람이 많이 사는 지역이라면 어떻게든 자원을 집중적으로 투입해서 차량의 속도를 빠르게 만드는 노력을 할 수 있겠지만, 이런 지역은 또 다른 가치의 문제가 개입된다. 소수를 위해서 모든 도로 인프라에 투자를 해야 할까? 단순히 불편하고 아니고의 문제가 아니라 죽고 사는 문제와 결부되어 있기 때문에 판단이 더 어려워진다.
2월 25일에는 청양에서 규모가 큰 화재가 발생했다. 이 글 맨 아래의 영상을 보고 있으면 멀리 당진에서부터도 지원을 온다. 땅이 넓고 사람이나 건물이 퍼져 있기 때문에 큰 화재가 발생할 때 어디의 어떤 차량을 지원하도록 하는가가 매우 중요하다. 구급차든 소방차든 관할지역에서 사건이 발생했을 때 보유 차량의 순간적 부재로 다른 지역에서 지원을 오게 되면 연쇄적으로 출동 지역이 꼬이기 때문이다. 서울 지역의 구급차량 데이터를 본 적이 있는데 실제로 종종 발생하는 현상이다.
모든 차량을 하루의 시간대에 겹쳐놓기
이번에는 한달간 이동한 모든 차량을 같은 시간대에 놓고 이동시켜보자. 위의 그림에서 보이는 차량들은 6월 1일부터 30일까지 30일간 15시 10분에 이동한 모든 차량들이다. 특정한 날의 상황이라기보다 하루 중 15시 10분의 도로 상황이라고 보면 된다. 시내길에서 항상 느린 지역들을 볼 수 있다.
여기서 시각화 한 소방차량에는 구급차도 포함된다. 사건발생시 구급차의 일반적인 루트는 [안전센터] - [현장] - [병원] - [안전센터]다. 즉, 현장은 항상 바뀌지만 몇몇개 주요 병원은 늘 거쳐가야하는 곳이다. 특히 대도시가 아닌 지방도시일 경우 정말 몇 개 안되는 병원은 늘 구급차가 가야하는 곳이다. 이 곳을 개선했을 때 모든 루트의 진행 시간이 단축될 수 있다는 의미다. 그런데 어떤 병원 주변들을 보면 속도가 잘 나지 않는 상황이 관찰된다.
도로의 속도에 좀 더 집중해서 보자
이번에는 한 달이 아니라 7개월간의 모든 이동 중 특정 시간을 추출하여 지도에 그려보았다. 너무 많기 때문에 개체의 움직임으로 표현하는 방식은 접어두고 모든 순간 지점의 속도들을 색이 입혀진 투명한 사각형으로 표현했다. 20km/h 이하는 빨간색, 80km/h이상은 녹색이다. 투명하게 색상을 할당했기 때문에 두 색상이 겹쳐진 곳 즉, 어떤 경우에는 빠르고 어떤 경우에는 느릴 경우에는 사각형 파편들의 색이 중첩혼합되어 노란색으로 보이게 된다.
그러므로 빨간색으로 보이는 곳들은 그 시간대에 항상 막히는 곳들이다. 많은 경우 블록 내부의 도로들이지만 그렇지 않은 곳들도 있다. 위의 그림에서는 새벽 1시 45분을 표현하였다.
이제부터는 다른 주제로 데이터를 그려보자.
모든 출동을 동시에 출발시키기
전체 데이터에서 차량의 출발지는 다양했다. 어떤 것들은 현장 혹은 병원에서 처음 기록되는 것들도 있었는데, 그 중에 안전센터에서 출발하는 것들만 솎아냈다. 그리고 실제로는 다른 날 다른 시간대지만 각 차량이 안전센터에서 출발하는 시각을 0으로 하여 표현하였다. 따라서 위의 그림은 7개월간 모든 차량이 출동한지 2분2초가 경과한 순간의 이동 궤적이다.
이렇게 표현하면 흔히 말하는 골든타임인 5분 안에 어디까지 갔는지 볼 수 있다. 그 밖에도 10분이 경과했을때 어디까지 갔는지, 즉 소요시간별 도달거리를 볼 수 있다.
머리와 꼬리를 뒤집어 표현해보자
처음에 각 개체에 부여한 규칙을 반대로 적용시켜보자. 즉 머리 부분을 낮게 꼬리 부분을 높게 표현한다. 그리고 5분과 10분의 두 가지 소요시간만 확실하게 표현해주자.
그림에서 높이 솟은 부분은 소방차량의 출발지인 각각의 안전센터다. 수많은 출동들을 동시에 투명하게 표현하였으므로 그림에서 보이는 도달거리는 절대적이라기보다 확률 개념으로 이해하면 된다. 5분 15초에서 끊은 그림이므로 높이가 높은 부분은 웬만하면 5분 안에 도달할 수 있는 곳, 낮은 곳은 5분안에 겨우 도달하거나 그러기 어려운 곳이다.
10분에서 끊어보자. 이제 10분 안에도 도달하기 어려운 지역들이 나타난다. 대부분 안전센터로부터 멀리 떨어진 곳들인데 천안 시청과 위쪽의 산업단지는 안전센터로부터 인접한 곳임에도 불구하고 시간 내 도달거리가 급격하게 짧아진다. 그림에서 가운데 부분이다.
멀리서 전체를 보면 '10분'이 미치지 못하는 부분들이 확연하게 보인다. 물론 저 빈 곳들 중에는 사람이 거의 없는 산지도 있기 때문에 감안하고 보아야 한다.
화재 및 구급 출동 위치와 규모
영상의 첫 부분은 2011년-2017년의 구급화재 출동 위치와 동원인력이다. 소방서에서 하는 일을 크게 구급, 구조, 소방으로 나눌 때, 구급과 소방만을 표현했다. 구급출동 건수는 소방에 비해 비교가 안 될만큼 많고 한번 출동은 3명이 한 조로 이루어진다. 사건 발생시 출동 인력을 원의 크기로 표현하였기 때문에 흰 색으로 표현한 구급 출동은 화면 해상도에서 자글자글하게 보인다.
아래의 막대 그래프는 소방출동 동원인력만을 표현하였다. 해마다 소방출동은 3월에 가장 많다. 2015년 3월에는 큰 사건이 있었던 것 같다.
결과 영상
아래는 이 모든 내용의 결과물, 4분 가량의 영상이다. 유투브로 넘어가서 보면 1920x1080 해상도로 볼 수 있다.
------------------------------------------
충남연구원의 요청으로 충남 소방차량의 시각화 영상을 만들었다.
두 종류의 데이터를 사용했는데, 하나는 구급 및 화재 출동의 위치와 동원인력(2011-2017년), 다른 하나는 차량의 GPS 궤적(2018년)이었다.
'Content' 카테고리의 다른 글
토요일 밤의 서울 생활인구 데이터 탐색 (0) | 2018.12.09 |
---|---|
나는 네가 지난 여름에 간 곳을 알고 있다 (5) | 2018.12.07 |
<용산공원의 바깥도시> : 용산공원 라운드테이블 발표자료 (2) | 2017.09.27 |
수도권 인구 이동 2012-2016 : 연령에 따른 구분 (1) | 2017.07.22 |
공주시와 충청남도의 인구이동 (5) | 2017.06.20 |