GpsLog Manager - 지도에 루트 출력 속도 개선


테스트 표본은 2013년 미국 자전거 여행 7월 GPX 데이터 한달치 기준





개선 전 : 약 34~5초 


https://www.youtube.com/watch?v=pdsoDFJFMNs&feature=youtu.be








개선 후 : 약 5~7초


https://www.youtube.com/watch?v=PHcatfuiqFM&feature=youtu.be


※ 검색 속도는 선택한 라이딩 정보 건수에 따라 다를 수 있고 1건 같은 경우는 이전보다 약간 빠르거나 같을 수 있다. 




GPX파일을 파싱후 화면에 출력할 때는 속도가 빠르지만 DB에 등록후 불러올 경우에는 내부적으로 1~2단계의 프로세스를


더 거쳐야 했기 때문에 느려질 수 밖에 없었다. 이유는 조회하고 그 결과안에서 위경도 정보만 다시 뽑아내야 하는 파싱


작업 때문이다.





-프로그래밍적 내용-


C#의 Generic(제너릭) 중 List 클래스가 있는데 최초 파싱할 때는 List를 사용하기 때문에 속도가 빨랐지만 DB에서 불러올

경우는 ADO.NET의 Datatable를 이용하기 때문에 데이터가 많아질 수록 느려지는 단점이 있다. 실제 구글에서 조금만 검색해도 

Datatable의 속도 이슈에 관한 글이 많다. 


단순 비교만 하자면 정확하진 않지만 해외 블로그에 나온 내용에 근거하여 약 4.3배 List<T>가 빠르다라고 나와있다.

출척 : http://lauteikkehn.blogspot.kr/2012/03/datatable-vs-list.html

DB에서 막바로 List로 바꿀수 없기에 SQL의 WHERE 조건에 IN 속성을 사용하여 여러건의 데이터를 한번에 조회한 후 ADO.net의 

DataReader을 이용하여 List에 담아서 GPX 파일을 파싱할 때와 같은 효과를 냈다.


※ 날짜가 다른 여러건의 로그 데이터를 한 레이어에 출력하게 되면 가까운 곳의 GPS 위경도 지점간에 선이 연결되서 트랙이 엉망이

된다. 그걸 방지하기 위해서는 라이딩 정보 1건 기준으로 새로운 레이어를 추가하여 로그를 출력해야 한다. 로그의 생성시간 순으로

출력하는 것도 중요하다.







GpsLog Manager - 라이딩 상세정보 출력 및 기타 업데이트





- 라이딩 상세정보 (기본)










- 라이딩 상세정보 (전체)









다중 루트 출력시 특정 루트 선택 가능하며 그 루트의 마커를 클릭하면 라이딩 정보도 오른쪽 상단에 표시된다.









잘 사용하지 않는 지도 목록을 삭제 하고 많이 사용하는 지도목록을 한글화 했다.










일반적인 라이딩 정보 출력할 때는 거리 계산의 오차를 줄이기 위해 시속 7km 이상만 사용하지만 

오르막에서는 라이딩 속도가 줄기 때문에 시속 3km 까지 완화 하여 구간 정보를 출력시 경사도의 


정밀도를 보정하였다. 즉 7km 이상만 계산할 때는 그 이하 데이터가 빠지기 때문에 경사도를 계산할 때


오차가 많이 발생한다. 이를 보완하는 차원에서 시속 3~6.9km까지의 데이터까지 사용하기 때문에


경사도의 오차를 줄일 수 있다.











실제 라이딩 시간이 1시간씩 더해진 경우가 있어서 이를 수정하였다.




업데이트 버전 다운로드 : http://taedi.kr/809

GpsLog Manager - 경로 따라가기

자전거 라이딩한 GPS 로그의 위경도를 따라기는 기능인데 구글어스처럼 다양한 기능은 못한다.





라이딩 정보를 한건을 선택후 오른쪽 아래 [재생] 버튼을 클릭한다.









경로 따라기기 중에는 [재생] 버튼은 비활성화가 되며 지도에 현재 위치의 실시간 라이딩 정보(고도, 거리, 시간, 속도)를 보여준다.

라이딩 정보는 시작지점에서 현재위치까지의 거리의 합계를 계산하여 표시한다. 


※ 경로 따라기기 중 조회 버튼을 누르면 역시 재생중지와 함께 초기화 된다.

 









https://www.youtube.com/watch?v=Peef-eMj-68&feature=youtu.be











경로 따라기기 중에 다른 라이딩 정보 한건을 선택하면 재생이 중지되지만 여러건일 경우에는 따라기기를 계속 진행한다.










반대로 라이딩 정보 여러건을 선택후 경로 따라기기를 하면 재생하지 않는다. 










경로 따라기기 할 때는 현재 라이딩 정보의 그래프는 보여주지만 연동되지 않으며 아래 그림처럼 일반 지도보기 모드


처럼 그래프에 블록 지정이 안된다.









일반 지도보기 모드









경로 따라기기 중에는 지도 관련 다른 기능은 실행되지 않는다. 프로그램의 오동작을 방지하기 위한 목적이다. 또 현재 위치를

지도 위쪽에 실시간으로 표시하도록 했다. 줌 레벨은 15 고정이다.


※ 다만 아래 그림처럼 지도 변경은 가능하다.










경로 따라기기중 지도 변경하는 화면 









경로 따라가기를 종료하면 지도에는 마커와 라이딩 정보가 더이상 출력되지 않고 [재생] 버튼이 활성화 되며 [종료] 버튼


은 비활성화 된다.


※ [지우기(지도)] 버튼을 누르면 역시 종료되며 [재생], [종료] 버튼 모두 활성화 된다. => 초기화


※ 경로 따라기기 중에 마우스로 위치를 옮기거나 과도하게 마우스 휠을 움직임으로써 줌 레벨 조정 과정에서 에러가 발생


하는 경우가 있다.













GpsLog Manager - 지도 전체화면

지도에서 루트와 그래프만 확인하고자 할 때 쓰면 괜찮은 기능이다.





프로그램의 첫 화면에서 [지도열기]를 클릭한다. 이 때 [전체화면] 버튼은 활성화되지 않는다.









데이터 전용 모드?화면과 지도를 열었을 때는 조회조건 중 기본 검색조건은 [월별]이다. 

지도를 열면 [전체화면] 버튼이 활성화 된다.










[전체화면]으로 변경되면 [검색조건]은 일별로 변경된다. 이 때 [검색] 버튼은 비활성화 된다.










[전체화면] 모드에서 데이터 검색은 일별 콤보박스에서 날짜를 선택하면 된다.









[전체화면] 일 때는 관리관련 버튼(입력, 등록, 삭제, 수정, 지우기)은 사용할 수 없다. 











[검색조건]에서 [일별]검색은 지도가 전체화면일 때만 사용 가능하다. 데이터 화면이 열려 있을 때는 기존대로 [조회]버튼을 

이용하여 되고 [지도]관련 기능은 기존대로 동일하다.






GpsLog Manager - 라이딩 정보 그래프 구간 정보 확인



라이딩 정보를 분석할 때 필요한 기능일 것 같아서 구현하였다. 


그래프의 특정 구간을 블럭을 지정하면 구간거리와 고도정보를 볼 수 있다. 지도상의 구간지정은 기존 루트에 색을 입혀서 


표현하는 방식이다. 고도는 구글에서 받아오는 것과 가민엣지가 측정한 데이터가 다를 수 있다. 지도 왼쪽위에 고도 정보는 


마우스로 클릭하면 출력되고 툴팁에 표시되는 정보는 가민엣지에서 생성된 데이터이다. 


보통 30~50km 정도를 라이딩 하면 GPX 파일안에 로그가 2,500 ~ 5,000건 정도가 쌓이는데 라이딩 속도와 거리에 따라 


로그 건수는 달라진다. 또 그 이상도 쌓일 수 있다. 



지도상에 루트를 그릴 때는 로그의 모든 데이터를 이용하지만 그래프를 그릴 때는 절반 정도를 이용하는데 이유는 그래프를

그릴 때 부하(프로그램 성능)가 걸릴 수 있기 때문이다. 



로컬PC에서 MS-SQL을 이용하여 DB 관리를 하면 성능상 문제가 없지만 현 프로그램은 MS-SQL의 라이트 버전인 

SQL SERVER COMPACT를 사용한다. 그래서 DB를 따로 설치할 필요가 없고 대부분의 윈도우 환경이면 사용이 가능하다.


그리고 자원(리소스)이 많이 들어가지 않는다는 장점이 있다. 

대중적으로 많이 쓰는 DB는 SqlLite인데 특히 이동형 스마트 기기 같은 모바일 분야에서 널리 쓴다. 현 프로그램도 SqlLite를 


고려해 봤지만 MSSQL이 많이 익숙하기 때문에 개발에 큰 차이가 없는 COMPACT버전을 사용하였다.  











그래프 항목에서 고도가 빠진경우는 지도에 구간거리만 표시된다. 

지도 위치(Map Position)는 구간거리를 중심으로 잡는다. 그래프에서 블록으로 지정한 구간이 짧으면 지도의 


줌 레벨이 올라간다. 길게 잡으면 반대로 지도에 보여지는 면이 많아진다.  












이전까지는 그래프에 위도와 경도 항목을 추가하여 보이지 않게 한 다음 그래프의 마우스 포인터에 위치한 위경도 값을 


DB에 있는 로그값과 비교 하여 해당 정보를 추출했지만 그래프 항목에 데이터가 많아질 수록 느려지는 단점이 있어서 


위경도 대신 순번을 가지고 DB 로그에서 직접 조회하는 방식으로 택했다. 이렇게 함으로써 또 얻게 되는 이득은 파싱할 


때 쓰는 코드를 그대로 이용하면 된다는 것이다. 파싱할 때 하는 계산을 중복 소스코드를 만들면서 할 필요가 없어졌다는 


뜻이다.












구간정보에 몇가지를 더 추가하였다. 기존에는 구간거리와 고도만 표시했는데 정보가 많이 부족하여 필요한 데이터를 


집어넣었다. 


우선 표고차는 전체거리일 때는 출발지점과 가장 높은 지점의 차를 산출 했고 구간거리에서는 처음지점과 마지막 지점의 고도차를 


적용했다. 구간거리 내리막 길의 경사도는 마이너스(-)로 표기된다.

경사도 구하는 공식 : http://philshop.co.kr/bbs/board.php?bo_table=technote&wr_id=3










구간 거리 지정은 블럭으로 지정하여 수치를 산정한다. 정보표시는 구간거리의 중간쯤에 표시하도록 했다.


이유는 시작점이나 마지막 지점에서 보여줄 경우 데이터 그리드 뷰 때문에 화면에서 가려질 수도 있기 때문이다.










불럭 지정한 구간거리가 짧은 경우 정보를 표시하지 않게 했다. 가령 수 미터만 지정해서 수치를 본다면


무의미 하기 때문이다. 그래서 픽셀(Pixel)위로 5 이하 일경우 무시하는 조건을 두었다. 









GpsLog Manager - 라이딩 정보 그래프 오버레이(중첩)

GpsLog Manager - 라이딩 정보 시각화(그래프) : http://www.taedi.kr/814 


이전에 라이딩 정보 그래프에 관한 글을 올린 후 화면 다지인 변경 및 오버레이(중첩 그래프) 기능을 추가하였다.


잦은 디자인 변경이 사용자 측면에서 불편함이 있겠으나 향후 프로그램의 확장 및 편의성을 위해 변경을 했고 앞으로 


추가적인 컨트롤 배치 변경은 가급적 하지 않으려고 한다.








화면 배치 변경전 위 그림과 아래 그림을 비교하면 어떤게 변경됐는지 한 눈에 알 수 있다.

그래프 열기/닫기 체크박스 => 버튼

항목 선택 콤보박스 => 체크 박스 (고도/속도/케이던스/온도/심박수)








우선 하나의 항목만 선택할 경우 그래프 색은 이전과 똑같다.







두개 이상 선택할 경우 각 항목의 지정색으로 그래프 선을 표시한다.

체크 박스의 항목을 선택/해제 할 때마다 그래프를 바로 확인 할 수 있으며 매번 상단 데이터 그리드 뷰를 더블 클릭 하지 않아도 


된다. 항목별 그래프 선의 색은 추후 변경될 여지가 있다. 이유는 각 항목별로 중첩될 때 불편함이 있는 것 같다.










[예시화면 1]








[예시화면 2]









[예시화면 3]









[예시화면 4]








차트 항목 툴팁 










이전에는 단일 항목만 툴팁으로 표시 되었으나 2개 이상의 중첩일 경우에도 각각 표시되도록 변경했다.





※ 업데이트는 몇가지 테스트후 3/31일 저녁에 올릴 예정이다.