KOTM v3.5

GPS 2010. 8. 18. 22:10
약 1년여 동안 수집한 POI와 개선된 등고선 지도를 포함한 새 버전의 KOTM을 만들었다. 버전은 3.5. 동호회에만 올리고 깜빡, 바빠서 작업 노트 올리는 걸 잊고 있었다. 누구 보라고 쓰는 글은 아니지만 나중에 내가 한 작업을 정리해 두지 않으면 어김없이 길을 잃을 것이다.

올초에 OSM 사이트에서 massive upload top 10에 뽑혔다(아마 3위던가?) . 덕택에 POI의 소재, 특히 저작권 문제를 지적하는 사람들이 생겼고(적절한 지적이다) OSM에 업로드한 POI를 전면 재개정하기로 약속했다. 4월 쯤에 시간나는 대로 올리겠다고 뉴스그룹에 공지했다가 (POI 정리가 어느 정도 끝나서) 그동안 바빠서 작업이 정체되었다.

이러저러한 귀찮은 작업을 거쳐 POI를 정리하고(근접 지역의 같은 이름과 같은 tag를 가진 POI를 합쳐주거나 태그가 없는 POI를 제거하는 등) 상당히 많은 양의 자료를 추가, 삭제, 수정하는 작업을 남겨 놓은 상태였다.

어차피 취미 생활인데 목숨 걸고 할 것도 아니라서 대충 시간을 흘려보냈더니, 어느새 6개월이 흘렀고, 지금은 만사가 귀찮아져(POI 검증이 무지 신경 쓰이고 시간을 잡아먹는 일이면서 소득이라고는  잘해봤자 본전이라) 그보다는 늦기 전에 그냥 손쉽게 해치울 수 있는 KOTM 새 버전이나 만들기로 했다. 사실 4월 이후부터 주욱 KOTM v3.5를 사용하고 있지만 남들에게 공개할 수준이 아닌데다, 설치 방법이나 설치 중 오류에 관해, 배포  전에 여러 종류의 각기 다른 시스템에서 무수한 테스트를 거쳐야 하는 등, POI 작업처럼 검증이 필요해 미루던 것이다.

테스트: 삼성 M4650과 노키아 N5800의 각기 다른 os에서 작동하는 Garmin Mobile XT 두 버전, 버전이 다른 두 종류의 MapSource, XP SP3, Windows 2008, Windows 7 등의 요새 많이들 사용하는 os , Garmin Vista HCx 등등 여러 조건에서 설치를 다양하게 해봤다. 그래도 안 되요, 에러 나요, 다운 되요 등등 별별 일이 다 생길 것이다.

일단 설치본에서 배포본만 남기고 제작본은 제거했다. 제작본 제작 방법에 관해 문의해 오는 사람도 없을 뿐더러 사람들이 제작에는 관심이 없어 보였다.

인스톨러는 WinRAR 대신 Nullsoft NSIS를 사용했다. NSIS 사용법을 배우고 비교적 쉽게 만들었다.

transparent 문제 때문에 GMAPSUPP.IMG를 만들 때 영문, 한글 TYP 파일을 각기 다른 것을 사용했다.

OSM 외에 별도로 수집한 12만개의 POI를 거르고 걸러 만들어 놓은 59000개의 비교적 오류가 없는 POI 리스트를 포함했다.

OSM의 bus_stop과 hospital tag는 4월 무렵 대부분 정리가 끝났다.

OSM의 orphan node와 name tag를 며칠에 걸쳐 여러 차례 개정했다. 지난 수 개월 동안 한국 지도는 장족의 발전을 거듭했다.

mkgmap r1667 버전으로 업그레이드 했다. style이 많이 바뀌었고 그에 따른 불가피한 수정을 하고 TYP 파일도 여러 차례 손보았다.

드디어 routable map을 만들었다. 하지만 내비게이션 테스트 결과는 처참했다. OSM의 도로 연결이 아직 제대로 안 되어 있는 탓이 크다. 하지만 라우터블 맵을 만들어봤자 뭘하나? 여전히 POI의 한글 검색이 안 되는데.

Topo Map은 DEM 파일을 추출하는 방식을 개선하고 세선화 단계를 줄였다. 등고선의 정밀도는 향상되었지만 등고선 데이터 크기가 엄청나게 커져서 등고선을 줄이느라 등고선 사이의 간격이 일정치 않았다. 용량 때문에 어쩔 수 없다. GPSr에서 랜더링하는 속도 부터 저장공간을 차지하는 문제까지, 가능한 맵 크기를 줄이기 위해 노력했다.

이렇게 해서 지난 4월 이후 별 진전없이 찔끔찔끔 진행되던 KOTM v3.5 제작을 약 일주일 동안 결론을 짓고 완결했다. KOTM v3.1이 작년 10월에 만든 것이니 v3.5는 사실상 10개월만에 업그레이드 되는 셈이다. 10개월 동안 꽤 많은 것들이 바뀌었지만 뭘 했는지 기억나는 게 별로 없어 작업노트라고 적을 만한 것이 없다.

8월 15일 광복절 기념판으로 만들려고 했으나, 공교롭게 주말에 가족여행이 있어 하루 늦게 설치본 제작과 테스트를 끝마쳤다.

소개 문서를 영문으로 작성하고 유명 사이트에 한국 지도라고 올려놓을까 하다가, 지도 설치와 운용 에 관한 귀찮은 문의를 '국제적으로' 받을 것 같아 관뒀다.

사용자 삽입 이미지
놀고있던 M4650에 KOTMv3.5를 설치했다. Nokia N5800을 Bluetooth GPS로 만들어주는 ExtGPS 프로그램을 사용해서 M4650으로 N5800에 연결하면 M4650의 Garmin Mobile XT에서 사용이 가능한데, 사실 Mappy를 사용하는게 더 나을 듯.

KOTM v3.5 소개, 다운로드, 설치: http://cafe.daum.net/GPSGIS/BSrL/1572

KOTM 다음 버전은 3.6이 되던가 4.0이 되던가 아직 모르겠다. 아직 등고선이 만족스러운 수준은 아니다. 아쉽게도 dem이나 topo map 자료를 얻을 수 있는 방법이 없어 상대적 비교조차 해 본 적이 없다. OSM의 POI는 언젠가는 정리해야 한다. 마냥 미룰 수도 없는 일이다.

OSM 한국 지도 제작자가 작년에 비해서 많이 늘긴 했지만 그렇다고 한국 지도 전반이 획기적으로 달라진 것은 없다. 주소체계 정비가 본격화되면서 사실상 도로명 대부분을 개정하는 작업이 진행되어야 한다.

그래도 그 사람들 덕에 무료 지도를 자유롭게 사용할 수 있는 것이다. 작업자들 만세!


,

지도 제작 작업 메모

GPS 2010. 2. 22. 16:24
사람들이 흔히 말하는 GPS의 정확한 명칭은 GPS receiver이고, 줄여서 GPSr로 표기하지만 이미 GPS로 용어가 굳어버려서 나도 GPS와 GPSr을 혼용하다 보니 헷갈린다.

lock된 맵을 unlock하는 것은 가능하지만, NT format 을 non-NT format으로 변환하는 것은 현재로선 불가능하다. NT format에 관한 정보는 Garmin사의 비밀로 남아 있다.

Garmin .IMG 파일에는 RGN, TRE, LBL subfile이 포함된다. routable map에는 NET와 NOD subfile이 들어있다. 최근의 MapSource 및 Basecamp에서 사용하는 3d Shaded releif 정보는 DEM 섹션에 들어간다.  2009년 12월 22일 현재 sourceforge의 Garmin IMG format 소스는 DEM을 제외한 나머지 항목들을 리버스 엔지니어링 했다.  NT format과 마찬가지로 DEM format 역시 알려지지 않았다.

DEM 파일을 완전히 이용불가능한 것은 아니다. YoMismo는 이렇게 해결했다.

cgpsmapper의 설정 변수인 TreSize가 작을수록 GPSr의 랜더링 속도가 빨라진다. 대신 파일 사이즈는 커진다.

Topomap을 만들 때 globalmapper등의 프로그램에서 등고선을 단순화하는 알고리즘에서 사용하는 Simplify Level 값은 0.1과 1 사이에는 등고선 표현에 차이가 크나, 1과 10 사이에 차이는 거의 없다. 0.1일 때 파일 크기가 작지만 1일 때는 약 2배 이상 커진다.

http://gpsmid.sourceforge.net/ -- osm 벡터 파일을 직접 랜더링. 드디어 나왔다!
http://www.andnav.org/ -- Android Navigation. andnav1은 google 맵을 사용했지만 ver2 부터는 osm tile을 사용한다.

POI를 잔뜩 수집했다. 주로 산 이름인데, 여러 개가 겹치고 각기 조금씩 다른 경위도에 위치해 있는데다가 양이 많아 일괄적으로 수동으로 수정하기는 곤란했다. 예를 들어 태을봉에 해당하는 POI가 모두 7개인데, 정상 위치에서 벗어난 것이 3개, 정상 부근에서 경위도가 조금씩 틀어진 것이 4개로 정확히 정상 중심에 위치하는 것은 없다.

그래서 이중 정상 위치에서 너무 벗어난 것을 제외하고 남은 4개에서 정상 위치에 가장 근접하게 POI의 경위도를 조정하는 작업을 하기로 했다. 해당 경위도의 해발 고도를 알려면 DEM이 필요하다. 아쉽게도 이전에 사용하던 DEM 지도는 global mapper에서만 불러올 수 있고 대체 무슨 포맷인지 알 수 없다(게다가 약간 위치가 어긋났다), 두번째로 NASA가 제공하는 DEM 지도는 정밀도가 떨어져 정확한 정상 위치를 파악하는 용도보다는 고도 변화를 추적하는 정도의 용도로 사용 가능하다(몇몇 사이트나 프로그램이 이것을 사용해 딱 그 목적으로 사용했다).

KOTM에 사용하는 DEM을 MP로 변환한 다음, MP로부터 등위도 DEM을 다시 만들어 이것을 프로그램에서 사용가능한 TIFF나 비트맵으로 만든 다음 사용하려고 시도했다. 최소한 POI의 정상 위치는 이렇게 해서 판별이 가능했다. 하지만 DEM -> MP -> DEM으로 만드는 과정에서 MP가 10m 이하의 등위도 선분을 만들지 못하는 관계로 바다 위의 바위나 섬 주변의 낮은 봉우리는 처리할 수 없었다. 어쨌든 이 작업에 근 일주일을 보냈고 에러는 비교적 낮았다.

그동안 OSM에 올렸던 POI와 새로 수집한 POI를 합치면 약 20만개가 된다. 이들을 정리해서 다시 올릴 계획이다. 연초에 잠시 한가한 틈에 XML Pull Parser를 만들었고, OSM 파일(약 400MB)에서 POI만 추출하는 프로그램을 짰다. 요즘은 바빠서 통 이 작업을 하지 못했다.

정리:
DEM 작업 5일
POI 작업 5일
XPP 제작 및 POI 작업 14일

완결을 짓긴 해야 하는데 언제 다시 작업을 재개하게 될 지 불확실하다. 그 동안 정리되지 않은 POI를 사용해 맵 검증을 하고 돌아다녔다.



,

Nfy

잡기 2009. 12. 8. 23:06
OSM XAPI 서버는 죽었다 살았다를 반복했다. 온라인 지도 편집기를 만드는 사람들은 potlatch 1.3을 마지막으로 potlatch 2.0을 준비중이다. mkgmap r139x 버전대는 등고선을 제대로 컴파일한다. 다만, 오랜 시간 동안 해안선을 랜더링하다가 최종 결과물을 보면 해안선 폴리곤이 제대로 생성되지 않았다 -- 국토의 절반이 잠겼다. 흡사 지구온난화에 의해 발생한 슈퍼 허리케인이 한반도를 휩쓸기라도 한 것처럼 처참하게. 로버트가 리스트서버에 가입하라고 연락했지만 별로 가입해서 활동할 생각은 없다. 네덜란드에 사는 누군가 OSM 지도를 이용해 routable map을 다운받을 수 있는 프로젝트를 시작했다. 아.. 나도 서버가 있으면 이런 거나 해 볼텐데! 멋지다! http://garmin.na1400.info/routable.php

네이버 지도가 업데이트되었다. 수도권역에 등산로와 자전거 도로가 나타났다. 항공사진의 품질도 좋아졌다. 다음지도와의 경쟁이 볼만하다.

오랫만에 엔파이를 방문했다. 결혼하고는 처음이다. 이번에는 혼자 그곳을 떠돌아다니지 않았다.  바람이 잘 통하고 바닥에 양탄자가 깔린 무굴식 가옥에서 아내와 아이와 함께 생활했다. 조상이 식물인 선주민은 인간을 두려워해 거주지역에서 멀리 떨어진 곳에 모여 살았다. 수명이 5-6백 년에 이르는 선주민들과는 지극히 제한된 소통만 가능했다. 별로 똑똑하지도 않고 기술문명에 관심도 없다. 처음 엔파이에 도착했을 때 우리는 그들이 80cm 길이의 지능이 없는 황갈색 자벌레인 줄 알았다. 선주민이 에를이라 부르는 팔색조와 딜름이라 부르는 고양이 비슷한 짐승이 많이 살고 있다. 별로 위험하지 않다. 인간 또는 선주민과 감응을 맺은 고양이를 닙이라고 불렀다. 닙들은 개처럼 어디건 자신의 짝을 따라다녔다. 팔색조는 고양이를 잡아먹고 고양이는 팔색조를 잡아먹었다. 말이 팔색조지, 깃털에 피가 말라붙은 화식조 처럼 생겼다. 종류만 수백여 종인데, 선주민은 자기보다 큰 고양이와 팔색조를 키우기도 하고 잡아먹기도 했다.

선주민은 자기들을 엔푸라고 불렀는데, 지구 출신 정착민들은 엔파이(발음은 은파이에 가깝다)에 새로 입주하는 사람들에게 엔파이가 Nothing F'd up Yet의 약어라고 설명하곤 했다. 엔파이에 주거 하고 있는 나를 비롯한 초기 전송자 700 여명의 사람들은 빙퇴구 골짜기에 살고 있다. 공전 궤도의 앙각이 대부분의 행성이 나열되는 수평면에서 무려 60도이고 자전축이 50도 가량 누워 있어 약 2-3만년마다  북극은 수증기를 내뿜는 지옥으로 변했다. 그때 폭 2-10km, 길이 수천 킬로미터의 길고긴 고랑을 따라 남쪽으로 흘러들어온 물은 거대한 빙하를 형성했다가 물러나기를 반복했다. 그래서 지표에는 마치 쇠고랑으로 긁어낸 듯한 거대한 단구가 길죽하고 수평하게 늘어서 있는데, 수백년 동안 지속되는 서늘한 여름에는 빙하에서 녹은 물이 거북이 등짝같은 바위틈으로 숨어 흘러가며 곳곳에 호수와 하천을 형성했다. 선선한 바람은 늘 북(우리가 북극이라 부리는 곳을 기준으로)에서 남으로 흘렀다.  쓰다보면 말이 길어져 묘사하긴 뭣하지만 꽤 아름다운 곳이다.

나는 저녁에 아이를 무등 태우고 향불로 천정과 벽이 시꺼멓게 얼룩진 힌두사원 근처를 한가하게 돌아다니고 있었다. 우리는 이곳에 자원해서 왔다. 실체는 여전히 지구에 있으며 양자 얽힘에 의한 공간 이동(실제로는 정보 이동)을 통해 홀로그램과 유사한 우리의 복제본이 알데바란 부근에 실체한 것이다. 복제본은 우리의 66년 전 모습이다. 양자얽힘에 의한 정보이동 또는 공간이동은 단방향이고, 왜 그런 현상이 일어나는지 확실치 않다. 게다가 우주의 어디에 연결되어 있는지 알 수가 없다. 다만 특정 패턴에 맞는 우주의 특정 장소가 있으며 인류는 지난 수백년 동안 그런 장소를 찾기 위해 엄청난 수의 송신기를 어디론가 복제하고 그 송신기에서 보내주는 전파에 의존해 장소를 찾아 나가고 있다.

지구상의 '우리'는 알데바란의 복제본이 활동하고 움직이는 모습을 66년 전부터 날아온 전파를 통해 마치 낡은 비디오처럼 감상했다.  복제본들 역시 늙어가고 사고로 죽어갔다. 범죄자이거나 정신이상자가 아닌 한, 신청자는 누구나 그곳에 복제본을 보낼 수 있었다. 하지만 우리는 그들에게 영향을 끼칠 수 없다. 그들의 메시지와 영상은 일방적이며 우리가 보내는 모든 응답은 66년 후에나 그곳에 도달했다. 엔파이와 통신하기 위해 달의 여러 곳에는 수천킬로미터에 달하는 거대한 VLA가 있고 수신한 전파를 지구로 재전송하기 위해 지구와 마주보는 면에도 안테나가 설치되어 있다.

꿈에서 깨어났다. 눈을 껌뻑이다가  옆에 누워 잠자고 있는 아이를 쳐다 보았다. 기분이 희안했다. 비록 꿈일지언정 지금껏 무수히 많은 별들을 돌아다녔다. 어린 시절에는 꿈꾼 것들을 어떻게든 그러모으고 말이 되도록 데코레이션을 한 다음 이야기를 써보려고 했던 것 같다.

Casio EX-Z450  -- 구매 시기를 재다가 쇼핑몰에서 제품이 갑자기 사라졌다. 어느날 37만원대의 가격으로 다시 나타났다. auction의 eBay 구매 대행(32만원)과 eBay.com 직접 구매(199$)와 일본 쇼핑 대행몰을(35만원) 하릴없이 비교했다.

그동안 죽 외면해 왔던 emacs에 익숙해 지려고 짬짬이 노력중이다. ctrl키를 하도 많이 눌러야 해서 손가락이 아프다.  emacs를 사용하자고 마음먹게 된 결정적인 계기: 116MB짜리 텍스트 파일을 열어 이것저것 테스트하다가 엄청난 처리속도에 경악. emacs가 빠른게 아니라, 다른 editor들이 20년 전에 만들어진 emacs만도 못한 것이 맞으리라. 그러다가 한 일주일이 지난 다음 266MB짜리 파일을 열려고 시도했더니 안 열린다. 마음이 바뀌어 emacs 사용을 다시 유보.

chromeplus는 쥐도 새도 모르게 어느새 1.3.2.0으로 업데이트되었다. adblocks 문법을 사용할 수 있게 되었는데 adblock 기능을 켜놓으면 사이트 진입 시간이 오래 걸리고 가끔 다운되어서  한 이틀 네이버 들락거릴 때 사용하다가 꺼버렸다. 이제는 은행 사이트 들어갈 때 자동으로 IE로 연결해서 보여준다.

내년에 크롬os가 나온다고 한다. 크롬 브라우저 때부터 엔지니어가 직접 나와 자기들이 어떻게 소프트웨어를 재설계했는가를 설명해주는 시도가 참신했다. 크롬 os 역시 엔지니어들이 '알아듣기 쉽게' 설명해준다. 그런데 cloud에 user data를 저장하고 stateless machine으로 작동한다는 것은 잘 알겠는데, 문서의 형상관리(저널링)는 어떻게 하겠다는 얘기가 없다.

불가에서는 인생이 고통스러운 이유가 탐욕과 성냄과 어리석음 때문이라고 했다. 그 셋을 적정량 다 가지고도 내 인생은 고통스럽지 않았다 -- 타인은 늘 고통스러웠다. 욕망은 욕망을 욕망하게 되서 더럽게 여겨 똥보듯 피해갔던 나같은 사람을 위해 벤야민이 소비시대를 슬기롭게 개무시하고 살아가는 방법에 관해 쓸만한 조언을 한 적이 없다. 하지만 이 위대한 소비시대는 놀랍게도 온라인에서 Thomas Pynchon의 Gravity's Rainbow를 무료로 보는 것을 가능케했다. 구글이 구글 books라는 서비스를 하는 줄도 모르고 옥션에서 값싼 아이들 완구나 뒤지고 있었다.

사용자 삽입 이미지
대당 대략 8500원에 옥션에서 구입한 중국산 RC카. 아이에게 원격작용의 개념을 '느끼게' 하는데 RC카보다 나은 아이템은 없다고 여겼지만 아내는 시끄러워서 달가워하지 않았다. 첫번째 자동차를 조립하는데 1시간, 두번째는 20분 만에 조립. 앞바퀴에는 간단한 서스팬션이 있고 서보 모터 대신 DC 모터와 피니언 기어를 써서 바퀴의 좌우 회전을 구현했다.

사용자 삽입 이미지
뒷바퀴는 high, low의 2단 기어를 시프트할 수 있는데 기어에서 토크 손실이 클 것 같은 설계. 물론 구동손실을 줄이기 위한 배려는 없다. 타이어 그립이 안 좋다. 동봉한 스펀지 타이어를 장착하고 리튬 그리스를 기어에 발랐다. 송신기는 각각 27MHz, 40MHz 대역에서 4종류의 시그널(전진,후진,좌회전,우회전)을 전송하는데, 통달거리는 약 5m 가량, FM 출력을 부스트하면 좀 더 먼 거리까지 가능할 것 같은데 별로 개조하고 싶은 생각은 안 들었다.  아이는 차 위에 벨로키랍토르를 태워 달리며 희희락락했다.

4대강에 로봇 물고기가 돌아다니며 오염도를 측정해 보고한단다. 추정 4천만원이나 하는  이 로봇 물고기를 낚기 위해 낚시꾼들이 눈빛을 반짝였다. 21세기 초의 기념비적인 4대강 삽질의 흔적을 어탁으로 떠서 길이길이 남길 생각인 듯. 로봇 물고기가 찌를 안 물면 투망질을 해서 잡던가, 소위 '빳떼리'로 기절시켜서 잡는 방법도 있다. 또는  '오염 물질'을 슬슬 흘려 로봇을 유인해 낚을 수 있을지도 모르겠다. 그나저나 그렇게 큰 대형 로봇(추정 1.2m, 무게 12kg, 3hrs duration)을 만드는 것이 효율적으로 보이진 않았다. 수량의 계절 편차가 심하고 유속이나 수심이 오락가락하는 한국의 하천 특성상 이명박이 말하는 그런 거대한 물고기는 쉽게 좌초되거나 운영이 어려울 것 같다. 대단한 준설작업을 벌여 수심 6m짜리 저유속의 똥냄새 나는 하천을 계획하고 있다면야...

기계연구원 “로봇물고기, 50센티 크기에 3년 후 상용화” -- 이것말고 다른 기사에서는 지금 한국 기술로 500만원 정도면 50cm짜리 잉어 물고기를 만들 수 있다는데... 그게 그렇게 말처럼 쉽지 않을텐데? 궁금한 것은 로봇 물고기가 수류를 거슬러 올라갈 때의 동력 손실, 부력을 유지하는 방법, 전지 등의 실장품의 수명, 오염 측정 항목, 전파가 잘 전파되지 않는 물속과 지상 기지국과의 통신 방법 따위다. 프로펠러보다 동력 손실이 적다는 물고기 형태는 아마도 폴리머에 전기를 가해 뒤틀리게 해서 물고기처럼 꼬리를 흔들며 움직이게 하는 것인 듯 한데... 지금까지 전세계에서 기개발된(?) 로봇 물고기들이 이명박 대통령의 기대에 부응하지 못하고 얼마나 시시하고 실망스러운지는 Robotic-fish.net을 보면 알 수 있을 듯.

로보틱스, IT, 센서 인터페이스, 기계공학은 사실상 공학이라는 하나의 범주로 묶을 수 있어 머릿속으로 로봇 물고기의 설계를 하는 것이 불가능하지 않은데, 로봇 물고기 보다는 화학 센서 몇 개 설치하고 GPS와 간단한 로거를 덧붙인 부이 또는 작은 쪽배를 만들어 강의 흐름에 따라 흘려보내 하류에서 수거하는 것이 경제적일 것 같다. 설계 및  비용 산정을 해봐야 알겠지만 목적이 계측이라면 유지보수와 재활용 측면에서 센서 부이가 로봇 물고기보다 효율적일 것 같다. 흥미로운 일꺼리라서 각하께서 맡겨만 주시면 싸게 만들어 드리겠다.

11월 2일 동네에 있는 부어치킨이 의왕으로 이사갔다. 주말에 어디서 치킨을 시켜 먹어야 할지 난감해졌다. 수 차례에 걸쳐 팔달문 근처의 진미통닭과 용성통닭을 벤치마크 했다. 두 치킨집은 수원 치킨업계의 양대 산맥이란다. 진미통닭은 워낙 사람이 많이 찾아 전자번호표를 받고 줄 서서 기다려야 먹을 수 있는 곳이다. 용성통닭은 구이 소스에 마늘 따위를 넣었는지 발색이 좋지 않다. 어쩌면 닭을 오래 튀겨서 그럴 수도 있고, 기름 한 통에 튀기는 닭의 숫자가 많아서 그럴 지도 모르겠지만 (설마?) 아마도 튀김옷에 마늘 등의 이물을 섞은 탓이지 싶다. 아내는 용성통닭표 치킨에 입도 대지 않았다.

회전이 빠른 진미통닭의 장점은 알맞은 커팅에 있다. 용성통닭이나 진미통닭이나 닭은 30 조각 정도로 분해하는 것 같은데, 진미통닭의 절단 방식이 닭을 발라먹기에 유리했다. 두 가게 모두 가마솥에 해표 식용유(콩기름)를 왕창 붓고 센불로 닭을 튀겼다. 가마솥의 용적과 두께 때문에 기름이 쉽게 식지 않아 튀김이 바삭바삭하다. 앉은 자리에서 먹으면 거개 배달해 먹는 동네치킨보다 바삭하고 고소하다. 심지어 빵가루나 쌀가루를 반죽에 섞어 튀기는 치킨들보다도 낫다.

프라이드 치킨의 가격은 12000원, 닭맛이야 어디가나 거기서 거기지만 진미통닭의 닭맛이 14000원짜리 동네치킨보다는 좀 낫고 양도 동네치킨의 1.5배 가량 된다. 서비스로 주는 모래집이나 닭발 따위는 식으면 별 맛 없어 별다른 장점이 되지 못한다고 생각했다. 내 편에서는 진미통닭이 용성통닭보다 좀 더 나았다. 하지만 두 집 다 찾아가서 먹기에는 거리가 있다.  결론: 진미통닭이 진리다.

사용자 삽입 이미지
동북공심돈. iso 설정이 잘못되어서 사진이 이 따위로 나왔다. 찬바람에 벌벌 떨면서 딸애와 산책했다.

사용자 삽입 이미지
광교저수지 옆의 약 2km 짜리 좁은 산책로. 아이를 데리고 놀러갔다. 등산로같지는 않았다. 꽤 좋았다.

아내의 세뇌교육 덕택에 딸애는 착하게 굴면 크리스마스에 '한반도의 공룡' 화보집을 받을 수 있을 꺼라고 믿고 있다. 한반도의 공룡은 타르보사우르스의 일대기를 담은 EBS의 다큐멘터리로 MBC의 '공룡의 땅'과 함께 작년에 대단한 히트를 기록했다. 등장인물은 네 발로 진흙바닥을 뒤뚱거리며 걷는 해남이쿠누스, 아무리봐도 티라노사우르스 렉스를 닮은 타르보사우르스와 그의 식량 프로토케라톱스, 친타오사우르스를 사냥하는  털없는(?) 벨로키랍토르, 타르보사우르스를 살해할 수 있을 정도로 강력한 앞 발을 가졌다고 해서 좀 황당했던 테리지노사우르스 등등이 등장한다.

내 취향은 어딘가 어설픈 '한반도의 공룡' 보다는, '공룡의 땅'이다. 화성에서 발견된 공룡 화석의 미스테리를 추척하며  이융남 박사가 필립 커리나 루이스 제이콥스 같은 쟁쟁한 사람들을 이끌고 몽골 탐사대를 조직해 화석 탐사에 나서는 내용이다.

옛날 대구에서 생긴 일: 지나가는 행인에 의해 신천변에서 공룡 화석 발자국이 발견되었지만, 대대적인 하천 공사로 신천 하상에서 발견된 공룡 발자국은 물막이 보로 인해 1m 수심에 푹 잠겼다. 담당 공무원은 공룡 발자국이 물 속에 있어야 보존이 잘 된다고 주장했다. 우연한 발견, 생업과 상관없는 공룡 발자국, 물막이 보, 삽질, 정신나간 공무원 등, 있을 것 다 있는, 그야말로 한국적인 정서가 듬뿍 배어있는 교훈적인 옛날 이야기다. 그런데 최근 들어 공룡 발자국 화석을 복원하기로 한 것 같다.

한국에는 공룡 화석이 드물게 발견되었다. 간단히 말해 물에 잠겼다 올라온 땅이 없다. 퇴적암 보다는 화성암이 많은 한국의 산하에서는 화석이 발견되기 어렵다. 그래서 서해안 일부, 태백산 부근, 그리고 경상도 인근 해안가를 제외하고 화석이 거의 발견되지 않았다 -- 그렇게 알고 있다. 뭐 관입된 화강암에 공룡 발자국이 찍힌 독특한 화석이 있지만.

고생물학에 특별히 큰 관심을 기울이지 않아 누군가의 도움 없이 공룡 발자국을 쳐다보는 것으로는  상상력이 샘솟지 않는다. 당연한 것이 기상학, 지질학(지구물리), 생물학, 해부학 등 적어도 7-8개의 학제에 걸친 배경지식이 없이는 공룡 발자국만 보고 7-15톤 짜리 공룡의 자태가  우아하게 떠오른다는게 더 이상한 것이다. 그래서 아이들에게 지대한 영향력을 끼치는 공룡에 관해 어린 시절에 그다지 보고 배운 것이 없다. 왠일인지 개성이 철철 넘치는 미국의 쥐라기, 백악기 공룡의 몇 안되는 이름만 알고 있을 뿐.

신생대 이전의 고생물학사에 관해서도 아주 어렴풋한 지식만 가지고 있었다. 수억년에 걸쳐 생성된 대기 덕택에 육지에 식물군이 융성하게 되고 바다말과 식물군이 생산한 엄청난 양의 산소가 지상을 곤충의 천국으로 만들었다 -- 날아다니거나 운동량이 많은 곤충은 대단히 많은 양의 산소를 소비하는데 대기중에 산소가 늘자 이런 곤충들이 득세하게 된 것이다. 이게 아마 캄브리아, 페름, 석탄기 시절의 이야기일 것이다.

물고기 시대인 데본기에 들어서 물고기 떼와 지느러미 달린 파충류가 바다에서 활달하게 돌아다니다가 몇몇이 뭍으로 기어올라왔다. 2004년에는 그것과 관련한 극적인 발견이 이루어졌다. Tiktaalik roseae . 뭍가에 공룡이 올라온 이유는... 음... 물 속에서 피식자와 포식자, 포식자와 포식자 사이에서 벌어지던 무한경쟁에 지친 파충류들이 흘낏 뭍을 쳐다보니, 뭍에는 포식자가 없을 뿐더러 1m짜리 잠자리 같은 육즙이 풍부한 곤충이 엄청나게 많은 낙원이었다.

트라이아스기에 뭍 근처에서 어설프게 절름거리며 떠돌던 파충류들은 풍부한 먹이를 먹고 점점 몸뚱이를 불렸다. 쥐라기와 백악기에 들어 거대공룡들이 융성한다. 트라이아스기 이후의 얘기는 아마 아이들이 더 잘 알고 있을 것이다. 난 150여종(?)의 분류가 된 공룡 중 고작해야 20여종을 간신히 구분하는 정도다.

내 꿈 중에 하나가  일주일 일정으로 스미소니언에 가보는 것이다 -- 화성시는 화성 인근에 자연사 박물관을 만들 생각인 것 같다. 이융남 박사의 주장에 따르면 화성은 수도권 인근이라 많은 사람들이 방문할 수 있으므로 자연사 박물관을 짓기에 좋은 입지조건을 갖추고 있단다. 만일 그렇게 된다면... 그렇게 되길 간절히 바라는데, 자연사 박물관, 특히 '제대로 된' 자연사 박물관이 지어지길 무척 고대한다. 그런데 혹시나 말인데, 오리지널 자연사 박물관 대신 생태주의나 환경주의를 공룡시대와 리믹스한 희안한 것이 들어서서, 환경을 오염시키면 지구가 멸망한다고 세뇌교육 따위나 시키게 되지는 않을까? 그런 건 제발 다른 곳에 맡겼으면 좋겠다. 공룡 화석 보는데 방해된다.

자연사 박물관의 파급효과는 아마도 계량이 어려울 테지만, 그것 때문에 공룡 몇 마리 보고 고생물학자가 되기를 꿈꾸는 어린이 몇 마리가 자연발생할 수도 있다는 차원은 아니라고 생각했다. 불운한 어린 시절을 보냈던 나 같은 사람은 서적 따위로 근근이 얻은 지식의 간극을 순전히 불확실한 추측과 남들의 가설과 견해에 의존해 피동적이고 수동적으로 받아들여 꿰메어야 했다. 말하자면 조각보 사나이가 되었다. 만지고 볼 수 있는 현실의 증거는 책 나부랑이 따위가 주는 수억년간의 감도 안 잡히고 머리속에서만 앵앵 거리는 역사와는 질적으로 아주 다르다. 지질시대로 구분되고, 고생물사의 연대기순으로 나열된 화석과, 그것을 채취하는 과정과, 어떻게 해서 그렇게나 많은 가설을 고작 석화된 뼈조각으로부터 이끌어낼 수 있었는지, 이런 종류의 지적 자극과 사고 경험은 인생에 가치있는 경험은 물론, 사고 방법의 현저한 변화를 가져다 준다고 믿는다. 극단적으로 말해, 자연스러운 개종 체험을 하게 한다.

삼엽충, 암모나이트 따위 조차도 어렵게 발견되는 한반도에서 누대(eon)에 걸친 장대한 지구의 역사를 현물로 체험할 수 있는 것은 대단한 즐거움이 될 것이다 --

오로지 색깔 구별 능력이 있는 동물만이 몸의 빛깔이 알록달록하다, 오로지 보고 듣고 만진 자만이 피상적인 지식의 지옥으로부터 벗어날 수 있다! 

중요한 얘기라서 열광적으로 적고 보니 여행을 하는 이유와 같은데, 반병신스러운 로봇 물고기 떼나 만들어 낚시꾼들이나 즐겁해 줄 돈으로 자연사 박물관이나 거창하게 지었으면 좋겠다.

이문환의 플라스틱 아일랜드에서 조식을 발견했다. 김조식은 예전에 내가 만든 이름이다. 작가가 그 이름이 좋아보인다며 자기 소설에 써먹겠다고 했던 것 같다. 그때 오예수라는 이름도 만들었다. 이외수가 oisu란 아이디를 사용해서 내가 활동하던 동호회에 들락거리는 걸 본 후로는 오이수를 사용할 수 없었다. 플라스틱 아일랜드 전반, 중반은 재밌고 좋았는데 후반에서 약빨이 떨어졌다. 쓸 것도 없어 빌빌거리던 후반에 크로울리 운운하면서 흑마술 관련한 이야기를 잔뜩 집어넣었으면 좋았을텐데. 홈페이지에 들러보니 잘 살고 있어서 딱히 안부인사를 전하지 않아도 될 것 같다. 한 5년 후면 그가 쓴 더 재밌는 소설을 볼 수 있을 지도 모를 일이다. '세월과 외로움 속에서 기억은 퉁퉁 불어 아비 어미도 알아볼 수 없는 시체가 되었다.'

사용자 삽입 이미지
Wire in the Blood. S2E4 Sharp Compassion. 2기 마지막 화에서 드디어 알맞은 사진을 찾았다. 정치인은 인류를 두 종류로 나눈다. 도구와 적으로. -- 니체. 정치인은 psychopath와 비슷하고, psychopath와 sociopath는 종종 헷갈린다. 와이어 인 더 블러드의 주인공은 다감해서 사이코패스의 정신세계를 이해해주었다. 덱스터가 이 작자를 만났다면 어땠을까?

사용자 삽입 이미지
Modern Family. 근래 보기 시작한 코미디. 딴세상에 사는 듯 눈치 없고 하는 짓마다 바보같은 필이 웃겼다. 가정에서 내가 하는 짓이 필과 비슷하기도 하고... 이거 히트감인데 인기는 별로 없어 보이네?

사용자 삽입 이미지
V 2009. 미국 방문 비자를 들고 있는 못생긴 파충류 외계인. S1E4에서 감질맛나게 중단되었고 내년에 재개.

사용자 삽입 이미지
Inglourious Basterds. 재밌다 없다도 판단이 안된다. 기억에 남는게 아무 것도 없다. 쿠엔틴 타란티노가 만든 건가? 어 역시 그랬군.

사용자 삽입 이미지
2012. 지구가 망한다는데, 유시민은 그때 대선에 출마할 생각인 것 같다. 재난이 주연인 영화. 태양에 거대 흑점이 발생한 2012년, 태양풍에 평소보다 더 엄청난 양의 태양 뉴트리노 입자가 지구로 쏟아져 들어와서 지구 핵을 가열(뉴트리노가 지구 핵을 어떻게 가열한다는 거지?) .옐로우스톤의 수퍼 볼케이노가 예정대로 장엄하게 폭발한다. 북아메리카 서부 연안 도시가 붕괴될 때는 장쾌한 광경을 방해하는 분진류를 컴퓨터 그래픽에서 깨끗이 제거했다. 해발 5천5백미터 산들이 바닷물에 잠기면서 로라시아가 맛 가고 흡사 곤드와나처럼 생긴 대륙이 떡 하니 나타난다. 그야 뭐... 옥에 티가 하도 많아 일일이 지적하는 것은  시간이 아까운데 압도적인 화면 덕택에 잠시도 쉬지 않고 본 영화가 되겠다.

사용자 삽입 이미지
Surrogate. 포샵질한 브루스 윌리스 출연. 그저그런 메시지나 담는 한심한 SF 영화도 아니고 그저그런 가젯과 테제를 나열하는 일반인용 SF도 아니고, 그렇다고 액션의 진실을 담은 것도 아닌데, 이상하게 재미있다. 나 같으면 서로게이트들 죽이지 않고 자기가 자기 자신이라는 믿기지 않는 현실을 떠안은 채 지지리 궁상맞게 살아야 하는 인류를 그대로 내버려 두겠다. 그럴 놈들은 그렇게 살다 가는게 바람직했다.

사용자 삽입 이미지
Flash Forward. 막대한 제작비를 투입한(?) 영화 Surrogate에 비해 전 인류가 평화롭게 뻗은 광경은 이쪽이 좀 낫지 싶었다. 137초(?)동안 인류가 6개월 후의 미래를 보는 예지몽을 꾼다. 매크로적 규모로 벌어지는 일을 미시적으로 재구축하는데 스케일링이 어설퍼서 큰 재미를 보지는 못했다. 여기 출연한 한국인과 Lost에 출연한 한국인이 올해 10대 섹시남에 뽑혔단다. 신기했다.


,

KOTM v3,1

GPS 2009. 10. 26. 23:46
KOTM 3.0을 올린 후 Garmin Mobile XT에서 한글이 깨진다는 댓글을 보고 문제를 열심히 찾아 보았다. 내 경우엔 한글이 깨지다가 안 깨지다가 제멋대로였고 Mobile XT를 사용하지 않아 별로 신경을 안 썼지만 이왕 올린 것, 문제점을 알았으면 수정해서 올려야 겠다고 생각했다. 직원에서 블루투스 GPS를 빌려 Garmin Mobile XT를 하루 정도 테스트했다.

원인을 찾았다. mapset 중 하나라도 코드페이지가 949가 아니면 한글이 깨진다. 꽤 희안한 버그라서 사실 좀 믿기지가 않지만 뭐 현상이 그런 걸 어쩌겠나. 하루 종일 틈만 나면 지도를 빌드하면서 원인을 찾은 것. 일단 문제는 찾았지만 압축을 풀면 1GB가 넘는 데이터를 올리면서 고작 그런 버그 하나 때문에 여러 사람들 불편하게 한 것이 미안해서 원래 KOTM 3.5에 적용하려던 것들 몇 가지를 3.1에 급히 쓸어 담았다. 대표적으로, Makefile로 지도를 빌드하게 해 놓았다. 그리고 스타일(*.TYP)을 전면 적용. map feature의 아이콘을 대폭 수정했다. 그 두 가지는 혹시나 있을지도 모를 지도 작업자들을 위해 기본적인 작업 환경을 제공한다는데 의미가 있는 것들이라 일반적으로 지도를 사용하기만 하는 사람들에겐 별 의미가 없는 것들이지만.

업무 시간을 제외한 대부분의 가용 시간을 KOTM v3.1을 빌드하고 테스트하는데 보냈다. 10시간에  30번 가량 빌드 & 테스트를 해 볼 수 있다. 뭐 상당수는 MapSource에서 미리 확인하고 지도의 맵 피쳐가 잘 들어간 부분을 오려내어 테스트 스윗을 구성하고 일부분만 테스트해 보는 것이지만, 아이콘을 만들고 컬러 지정해서  TYP 파일 만들고 제대로 적용되었는지 확인하는 것은, 어떻게 생산적으로 잘 할 수 있는지 방법을 알아도, 작업의 절대시간을 단축할 수 없다는 점 때문에 생 노가다다.

그건 그렇고, 지도 제작을 좀 해봤거나 GIS 관련 계통 일을 하시는 분들이 보기엔 KOTM은 별 거 아닌 지도다. 자료의 규모나 품질 면에서 상용 지도에 비해 현저하게 질이 떨어진다.

KOTM v3.1은 저번 주 금요일 퇴근 전에 대충 마무리해 GPSGIS에 올렸다.
http://cafe.daum.net/GPSGIS/BSrL/1554




,

KOTMv3

GPS 2009. 10. 16. 18:15
mkgmap r1177 버전 이후로 topo map이 일부 깨지는 현상을 목격했다. 리비전 간의 차이를 알아내기 위해 꽤 삽질해서 밝혀낸 것이다.

사용자 삽입 이미지
mkgmap 개발자인 Steve에게 일단 email을 보냈다. 이 문제 때문에 지체되었고, 그 동안 바빠서 KOTMv3부터는 OSM 한국 지도를 다운 받아 사용자가 직접 지도를 만들 수 있도록 하겠다는 계획도 미뤘다.

오랫동안 기다리던 sea polygon이 mkgmap r1200 언저리의 리버전부터 포함되었다. 속도는 매우 느리지만 그래도 사용하고 싶다.

일부는 올해까지는 mkgmap에 GUI를 붙일 지도 모르겠다고 스티브가 말한 때문도 있었다. 그래서  내가 만들어 사용하는 osm2img를 굳이 공개하지 않아도 될 것 같다. mkgmap 프로그램의 옵션이 하도 많고 까다로워 GUI front end가 없으면 그 옵션들을 이해하면서 적절히 사용하여 지도를 제작할 사람이 몇이나 있을지 장담할 수 없다...

어느 리비전부터인지 정확히 기억은 안 나는데 multi-core cpu에서 threading을 지정할 수 있게 하는 옵션 덕택에 지도 제작은 30분에서 5분으로 단축되었다. 그래서 지도 만드는게 더 이상 부담스럽지가 않다.

여기저기 산을 돌아다니며 산 정상의 마루에서 GPS를 들고 제자리를 맴돌았다. 누가 보면 정신이 약간 이상한 사람처럼 보였을 지도 모르겠다. TM좌표계를 사용하는 DEM 원본 자료의 오차 때문이다. 최소한 세 군데의 최고점에서 삼각 측량을 하면 오차를 줄일 수 있으리라 여겼다. 그렇게 해서 DEM 지도의 수평 및 수직 정밀도를 KOTMv2.5 때보다 25m 가량 향상시켰다. globalmapper로 DEM의 전체 재작업을 진행 했다. globalmapper 새 버전은 지금 내가 사용하는 버전과 비교해 상당히 많이 좋아졌다. 언젠가는 사용하지 싶다.

자전거 타고 수원 시가지를 돌아서 수원 도로를 반쯤은 완성했지 싶다. 시간 나는대로 계속 진행할 것이다. 예전에 비하면 OSM 작업자가 늘어 기쁘기도 하다.
 
사용자 삽입 이미지

휴대폰에 Garmin Mobile XT를 설치하고 KOTMv3를 넣으니 Garmin GPS로 보던 지도가 똑같이 나타난다(오히려 WM 기기에서 돌리니 더 느려 보이는데?). Bluetooth GPS만 있으면 지금 휴대폰으로 나돌아다니는데 아무 문제 없을 것 같다.

사용자 삽입 이미지 사용자 삽입 이미지 사용자 삽입 이미지
사용자 삽입 이미지 사용자 삽입 이미지 사용자 삽입 이미지
사용자 삽입 이미지 사용자 삽입 이미지



,
OSM 한국 매퍼가 조금씩 늘고 있다. 지도의 크기는 연초에 비해 무려 17배가 늘었다. OSM 작업 방식, 예를 들면 potlatch나 JOSM 등의 프로그램 사용법 등을 매뉴얼로 만들까 하다가 번번이 그만 두었다. 동영상 강의가 있으니 그거 보면 쉽게 알만한 것이라 따로 설명한다는게 좀... 하지만 OSM 저변을 확대하기 위해 뭔가 하면 좋을 것 같긴 하다.

120개의 시군에 지도 제작자가 각각 한 명씩 있고 그들이 GPS로 트랙로그를 만들어 지도를 그리는 작업을 한다고 가정하면 대략 8개월이면 한국 지도의 상당 부분이 완성될 것 같다. 나 혼자 작업하더라도 GPS 들고 자전거 타고 샅샅이 돌아다니면 시가지 면적 60km^2 정도의 왠만한 중소 도시의 매핑에 한 달이 안 걸릴 것 같다(1주일에 하루 실측을 위해 돌아다니고, 하루 매핑한다고 가정하면 약 4일간 도심에서 400km를 이동). 조만간 한 번 해 볼 것이다. 독일 매퍼들처럼 어느 날 한 도시를 완전히 매핑했노라고 자신만만하게 선언해 보고 싶긴 한데,  한국처럼 역동적인 곳에서 완전한 매핑이란게 말처럼 쉬운 것이 아니다.

OSM 한국 지도를 정기적으로 다운 받아(XAPI 서버가 드디어 복구되었다!) 한글 로마자 변환과 고아 노드를 삭제하고 있다. 깨끗한 지도가 되었지만 남들 작업해 놓은 것을 괜히 임의로 수정한다고 여기지 않을까? 선의로 하는 것이니 부디 그렇게 생각하지 않았으면 좋겠다.  항의가 들어오면 즉각 중단할 것이다.
 
KOTM v2.5 버전을 만들었다.  다음 GPSGIS 동호회에 올린 글로 대체:
http://cafe.daum.net/GPSGIS/BT6Y/862

KOTMv3 이후엔 딱히 더 할 일이 없을 것 같다. 딱 1년 목표로 프로젝트를 시작했는데, 10월이면 프로젝트가 완료되고 따라서 이 작업노트 역시 종료된다.


,

OSM 작업노트 #14: cleanup

GPS 2009. 7. 24. 16:36
OSM 작업을 하면서 가장 불편한 것은 한글과 영문 이름 병기다. POI 마다 한글명과 영문명 태깅을 하는 것보다는 일단 한글명만 적어두고 나중에 한꺼번에 바꾸는 것이 효율적일 것이다.

한글의 romanize는 node 또는 way에 name:en 태그가 없고, name 태그에 괄호 '('가 없을 때만 로마자 변환을 한다. 괄호가 있는 것은 괄호 속에 영문 표기를 했다고 가정하므로 변환 대상이 아니다.

두번째로 작업중에 실수로, 또는, 삭제하다가 프로그램이 다운 되는 등, 부지불식 간에 생긴 orphan node을 삭제한다. orphan node란 아무런 tag가 지정되어 있지 않고 way의 맴버가 아닌 node를 말한다. 이때 tag중 created_by는 별 의미가 없으므로 무시한다. tag가 지정되어 있는 node는 그게 무엇이라도 삭제하지 않는다.

사용자 삽입 이미지
고아 node의 예. 태그를 가지고 있지 않음. way에 소속되어 있지 않음. 위의 경우 way 삭제 중 사고로 way는 지워졌지만 way의 맴버였던 node가 삭제되지 않은 경우다. 가끔 이런 사고가 발생한다. 이걸 손으로 지우는게 많이 귀찮다.

일단 두 가지 작업을 위해서 남한 OSM 파일을 얻어야 하는데, cloudmade.com에서 매주 제공하는 남한 OSM 파일은 완전한 것이 아니라서(남한의 일부 영역이 잘렸다) planet.osm 파일을 직접 다뤄야 한다. cloudmade.com에는 내가 만든 south_korea.poly 파일을 보내줬다. 그들이 그걸 사용해서 남한 OSM과 IMG를 만들어주면 좋겠다. 그렇게되면 한국의 GPS 사용자들이 변환 등의 거추장 스러운 작업 없이 Garmin용 IMG 파일을 거저 다운받을 수 있게 된다.

매일 커지기만 하는 6GB 용량의 planet.osm을 작업할 때마다 매번 다운받을 수도 없는 노릇이다. 2009/7/24일 평균 1Mbps의 전송속도로 2시간 가량 걸렸다. OSM 역시 그것을 염두에 두고 있어서 일주일에 한 번씩 planet.osm을 덤프하고 다음 7일 동안 매일 또는 매 시간 단위로 이전 일시부터의 변경 내용만 덤프한다. planet.osm의 대표적인 mirror site에 이런 변경 내용이 매 시간 단위로 업로드된다.

즉,  planet.osm을 한 번만 다운 받고 매일의 변경 내용을 다운받아 패치하면(일일 약 20MB 가량) 최신 버전 파일을 유지할 수 있다. 전 세계 데이터가 다 필요한 것은 아니므로 한국만 계속 업데이트 하면 될 것이다. 처음에 작업할 때는 planet.osm 원본 파일을 사용하여 한국 지역만 들어내고 changeset을 적용한다. 7월 22일 받은 planet.osm.bz2와 22-23일 변경분, 23-24일 변경분으로 작업하는 과정:

bzcat planet-090722.osm.bz2 | osmosis.bat --rxc file="20090722-20090723.osc" --rx file=- --ac --bp file=skorea.poly.txt --wx file="korea-090723.osm"

그 다음부터는 이렇게 해서 만든 korea-*.osm에 changeset을 적용한다.

osmosis.bat --rxc file="20090723-20090724.osc" --rx file="korea-090723.osm" --ac --bp file=skorea.poly.txt --wx file="korea-090724.osm"

사용자 삽입 이미지
orphan node 제거 및 이름 변경용 어플리케이션으로 삭제할 노드 리스트가 담긴 osm 파일과 이름이 추가된 osm 파일을 생성한다.

생성된 두 파일을 가지고, JOSM을 이용하던가 python으로 짠 delete 프로그램과 modify 프로그램으로 각각 OSM에 적용한다.

주의: JOSM은 way의 이름만 변경하더라도 way가 참조하는 모든 node가 기술된 'complete OSM file'만 적법하다고 인정하므로 modify된 way 태그를 업로드할 수 없다.

아무래도 이 작업을 가끔씩이나마 하는 것이 좋을 것 같다. 이번에 몇몇 산들의 트래킹 코스를 작업하면서 일일이 영문으로 토달기가 귀찮아서 일을 벌인 셈이지만 주기적으로 이런 작업을 해주면 한국 지도가 깔끔해 질 것 같다.

아무래도 주말 중 하루는 종일 컴퓨터를 돌려야 할 것 같다. 뭐, 말로 적어 놓으면 쉽고 간단하지만 컴퓨터로는 CPU 부하율 100%로 하루 종일 뺑이치는 작업이다. 다운로드 2시간, planet.osm 뜯어내기 3시간, 2-3일 변경분 적용 1시간. 고아 노드 분리 10분. 노드 삭제 3시간. 노드 업데이트 1시간 가량 예상.

트래킹 코스는 다음 GPSGIS 카페에서 수집한 산행 트랙로그를 GPX로 변환한 다음 OSM 홈페이지에서 업로드하고 Potlatch로 일일이 라인을 그리고 POI를 손봤다. 상당히 시간이 많이 걸리는 작업이지만 GPS Trackmaker 프로그램에서 Tracklog를 reduce 해서 그대로 업로드하는 것보다 정밀하다. 왜냐하면 동일한 산행 코스 트랙로그를 여러개 겹쳐 그중 가장 그럴듯하고 올바르다 싶은 길을 라인으로 그리면서 따라가기 때문이다.

만일 그것을 프로그램으로 짜서 했다면 그들 트랙의 평균적인 길을 고르게 되는데, 산행 중 GPS의 오차가 거치 방법에 따라 현저하게 차이 나기 때문에 프로그램으로 판단하는 것은 오류가 클 여지가 있다. 뭐 잘 짜여진 룰베이스를 가지고 스스로 백그라운드 야후 위성 사진에 나타난 도로와 GPS 트랙로그의 오차를 보정하면서 좌충우돌 학습하는 인공지능 프로그램이라면 얘기가 다르겠지만 그런 프로그램은 짜기가 무척 어렵다. 그 프로그램 짜서 키울(?) 시간이면 한국의 100대 산 트래킹 코스를 완성하고도 남는다.

GPS 위성은 매우 고속으로 지구 궤도를 움직이고 있다. GPS 위성의 시계는 그래서 특수상대성이론에 따른 시간 지연이 발생한다. GPS 리시버에서 발생하는 트랙로그의 오차는... GPS의 매우 정밀한 클럭에 일정 정도의 노이즈를 넣어 시간 정밀도를 일부러 떨어뜨리는 SA(Selective Availability)에 의해서만 결정되는 것이 아니다. 보정 기술의 발달로 SA의 영향은 최근들어 상당히 작아졌다. 그러나 트랙로그가 기록될 때 GPS의 프로세서는 측정 시점과 기록 시점이 완전히 일치하지 않는다. 그리고 이전 측정 시점과 다음 측정 시점 사이의 시간 간격이 측정 정밀도에 영향을 끼친다. GPS 기기에 오차가 +-4m라고 표시되도 사실상의 오차는 +-20m 까지 감안해야 한다. 언급한 세 가지 이유 때문에 GPS의 트랙로그는 그렇게 믿음직 스럽지 않다.

사용자 삽입 이미지
능선이나 개활지에서 걸을 때, 즉, 저속일 때에는 여러 개의 트랙로그를 겹쳐놓아도 위치 오차가 크지 않지만,

사용자 삽입 이미지
하늘이 잘 보이지 않는 계곡에서는 위성 수신 불량으로 오차 폭이 대단히 커지고,

사용자 삽입 이미지
위성 수신 상태가 양호하더라도 고속으로 운행중인 자동차에서 같은 구간을 운행하더라도 그림에서 보는 것처럼 동위도에서 기록 오차가 발생하며, GPS의 측점 간 오차가 GPS에 표시된 오차보다 크게 나타난다.  

하여튼 데이타가 그다지 크지 않을 경우 사람이 트랙로그를 여러 차례 만들어 겹쳐 놓은 상태로 보고 '궁리'하며 그리는 것이 개발도 힘든 인공지능 프로그램을 짜는 것보다 낫다. 이쪽은 그래서 프로그래밍을 포기했다(누군가 하겠지).

트래킹 자료가 어느 정도 진전되면(한국의 100대 명산) KOTM 새 버전을 만들어볼 생각이다.  지금까지 서울 근교 5-6개의 유명 산행로를 '그렸다'. 북한산 및 도봉산 트래킹 코스




,

Big Bang

잡기 2009. 7. 22. 20:34
DDoS 공격 진원지로 몇몇 언론이 북한을 집더라. 입에 게거품을 물고 시장주의를 찬미하던 어떤 언론은 포이즌 필을 옹호하기도 했다. 콧방귀를 뀌었다. 마이클 잭슨이 사망했을 즈음에는 그런 언론더러, 'you are not 언론' 이라고 말하더라.

술 먹고 집에 가기 위해 늦은 시각 택시를 잡으러 도로변에 나왔다. 마침 비가 내려 일행을 먼저 택시에 태우려고 얼른 앞에 보냈는데 그들을 안 태우고 내 앞에 서서 나를 태운다. 택시 기사에게 왜 앞에 있는 사람들을 안 태우냐고 물으니 비 오는 날 우산 안 쓰고 있는 사람은 택시가 보통 태우지 않는단다. 밤새 영업해야 하는데 비맞은 사람 태우면 시트 젖고 냄새 밴다고. 내리자마자 승차거부로 다산 콜센터에 신고할까... 하다가 기사 양반 사연이 기구해 관뒀다: 얼마 전에 강도를 당했고, 저번 주 금요일 밤에는 택시 영업해서 번 돈 23만원을 털렸다. 억울해서 며칠 잠을 이루지 못했다고 말한다. 요즘은 다산 콜센터에 전화해 택시 번호를 알려주면 택시기사에게 상당한 불이익이 돌아간다고 한다. 그래서 승차거부에 관한 전화를 하지 않았다.

http://soulfly.tistory.com/entry/나의-남편은-개발자 -- '개발자들이 피고름 짜내고 각혈하고 팔 한쪽 잘라서 맞바꾸면서 '신화'를 만들어나간다는 이야기는 쌍팔년도 '신화창조의 비밀'에서나 통할 이야기다.'

인생은 선택이라고 믿는 좀 순진한 견해지 싶지만(만선의 기쁨 운운하는 것을 보니 내가 무슨 말을 하건 욕이 되진 않겠지), 개발자가 된 동기가 돈벌이인 사람들을 별로 만나보지 못했다.

요즘은 양심의 질량 얘기를 자주 했다. 한 번도 전체 스토리를 말한 적은 없었다.

사용자 삽입 이미지
휴대폰으로 찍으니 흡사 공포영화의 한 장면처럼 보이는데? 아이를 자전거에 태우고 행주산성에 갔다. 자전거에 아이를 태우고 처음 일반도로를 달릴 때는 신경이 곤두섰는데, 지금은 익숙해진 편. 서울의 도로사정이 뻔한데 일반도로에 아이 태우고 돌아다니는 건 정신나간 짓이지만.

사용자 삽입 이미지
정신나간 짓인 줄 알면서도 북한산성 탐방로 옆 골짜기에 아이를 태우고 갔다. 이번이 두 번째인데 아이가 꽤 좋아한다. 자전거 타면 집에서 채 30분이 걸리지 않는 거리에 고향에서나 보던 종류의 계곡이 있다.  

아이를 데리고 주말마다 여기저기 돌아다녔다. 비가 오면 비가 오는 대로... 덕택에 산행도 거의 못하고, 자전거도 별로 못 타서인지 뱃살만 늘었다. 아니 사실은 최근 몇 주 동안 자주 술을 마신 탓일께다. 허리를 수그리면 뱃살의 두께가 실감나게 느껴진다.

사용자 삽입 이미지
지하철 대피 개념도. 잘 그렸다. 개념사진이다.

OSM에 도로를 올리고 2주가 지났다. 서울 시내 도로를 정비하는데 많은 시간을 보냈다. 그리고 최소한 한국의 유명 산 트래킹 코스를 OSM에 시간나는 대로 넣어보려고 노력중이다. 북한산, 도봉산, 관악산, 설악산, 수리산, 청계산 코스를 어느 정도 만들었다. 여러 개의 GPS 트랙로그를 합쳐 올린 다음 편집하면 오차가 적어지지 않을까 생각했다. 아무튼 그중  북한산 및 도봉산 트래킹 코스는 그야말로 대작이다.

북한산 작업만 일주일이 걸렸다. 아는 지식이 일천하고 데이터가 부족해 능선 코스에 이름을 붙이지 못했다. 그래도 약도 수준의 paran 등산지도 보다 낫고 네이버, 다음 맵에는 없는 지도다. 많은 사람들이 참여해서 발전시켰으면 좋겠다.

'흐몽족에게는 미국이 좋아요. 여자애들은 대학에 가고 남자애들은 감옥에 가죠.' -- Gran Torino. 클린트 이스트우드 영화 치고 재미가 없었다.

닐 게이먼, 인터월드: 그저그런 애들용 동화. 별 감상 없다.

로버트 하인라인: 므두셀라의 아이들: '우주선은 대기권 재진입을 끝낸 다음 길고 단조로운 불완전연소 활강을 진행하는 중이었다.' -- 불완전 연소 활강? 그게 뭐지?

이해를 못 하시는군요. 저는 독자여서 어머니께서 계속 따라다니셨습니다. 저를 찾으시기 전에 돌아가야 합니다. 시간이 얼마나..."
"착륙선은 아무도 기다려주지 않습니다. 당신은 절대로 더 젊어지지 않을 거고요. 타십시오."
"하지만..."
"한심한 놈!"
젊은이는 라자러스가 시키는 대로 따르며 딱 한 번 걱정스러운 눈으로 비탈 쪽을 돌아보았다. 라자러스가 그 모습을 보며 생각했다 '체외수정에 대해서 논란이 참 많았지.'
체외수정이 마마보이를 만들었다는 근거없는 이야기. 아무래도 시대가 시대다 보니 므두셀라의 아이들에서 늘어놓는 과학기술 묘사는 고색창연하기 그지없었다.

"... 우주 전체에 인간이 코를 들이밀 수 없는 일은 있어선 안 되지. 우리는 그렇게 태어났고 거기에는 어떤 이유가 있다는 생각이 든다네."
"이유가 없을지도 모릅니다."
"맞아. 어쩌면 그냥 어마어마하게 규모가 큰 농담일지도 모르지. 아무 의미도 없는."
라자러스는 일어서서 기지개를 켠 다음 갈빗대를 긁었다.
"하지만 이건 말할 수 있네, 리비, 해답이 뭐건 간에 나무가 서 있는 한 계속 기어올라서 구경거리가 뭐 있나 하고 끝없이 둘러볼 원숭이 한 마리가 여기 있다는 사실 말이야."
하인라인은 원래 이랬다. 아니면 그 시절 SF가 전부 저랬던가. 역자후기에서 하인라인의 작품을  이렇게 말한다.

무지하고 단순하며 사실을 완전히 왜곡한다는 비난을 듣기로 작정하고, 사건의 전개 양상과 주제를 드러내는 방법에 따라 과학소설이라는 이름의 수평선을 그어보자. 선의 왼쪽에는 두뇌 중시형 주인공이 등장하며, 독자는 이쪽 작품들의 참맛을 알기 위해 지적 추리 능력과 사고력을 동원해야 한다. 반면 오른쪽 주인공들은 뛰고 날고 행동하며 독자들은 그들의 운명을 좇아 사건의 흐름에 집중하게 된다. 이렇게 단순하게 과학소설을 양분한다면 하인라인의 작품들은 단연코 우측에 몰려 있다.
내 취향은 그럼 중도좌파 모더니스트라고 해두지. '므두셀라의 아이들'은 옛날 SF답게 고리타분해서 '최신 유행'에 민감한 나같은 사람에겐 어울리지 않았다.

사용자 삽입 이미지
작전. 작전을 이렇게 말했다: "숨어있는 저평가주에 힘을 좀 실어주는 거지." 배우들이 많이 풋풋하지만 재밌게 봤다. 주변에서 보고 듣던 얘기들이라서 친근감마저. 배합을 매끄럽게 유지해 숨결대로 따라가기 편한 영화 였다. 캐릭터 구현도 좋았고 대사가 느끼하지 않았으며 메시지가 적당했다. 그런데 matching transaction이 사기인가?

사용자 삽입 이미지
아무래도 살인의 추억이 생각나는 장면. 한쪽에선 포대로 시체 말고 한쪽에서는 사회에서 흔히 볼 수 있는 두 개자식이 장 마감을 몇 분 앞두고 매도할지 말지 고민하고. 술자리에서 '작전'으로 이야기꽃을 피우다가 '하게타카'와 '남자 이야기'란 드라마를 추천받았다.

사용자 삽입 이미지

이끼. 매력적인 컷 분할. 졸지 않고 완샷에 읽어버린 만화.

사용자 삽입 이미지
Pineapple Express. "이게 바로 대마초의 미래야. 동시에 세 군데에 불을 붙여. 그럼 연기가 모여서 세 배의 효과를 낸다고 할 수 있지. 네 손자들은 이걸로 피울 꺼야." 저렴한 예산에, 되는대로 갖다 붙인 무의미한 스토리 라도 천사와 악마보다 재밌다. 보고 나면 남는게 없는 것이 진정한 주말 시간 때우기다.

사용자 삽입 이미지
도쿄 매그니튜드 8.0. '본 작품은 수도권에서의 거대 지진 발생을 가정하여, 방대한 리서치와 검증을 기반으로 제작된 픽션입니다.' 라고 말했다.  주인공 아이들이 어려서 앞으로의 내러티브를 우연과 운의 도움없이 제대로 이어갈 수 있을 지 의문이다. 그저 슬프고 가엾은 이야기라면 사실적으로 묘사한 대재앙의 의미가 퇴색하고 말 것이다.

사용자 삽입 이미지
천사와 악마. 제목이 참... 촌스럽다. 일루미나티 흉내내는 것들이(초반부터 사기란 걸 알아먹을 수 있을 정도로 한심한) CERN의 LHC에서 만든 반물질로 바티칸을 날려버릴 궁리를 한다는 설정  -- 안 그래도 영양가 없고 그저 생각만 해도 얼토당토 않고 정 떨어지는  소재. 원작은 얼마나 거지같은 지, 보지 않아 모르겠지만, 최소한 각본과 연출이 쓰레기 같아 왜 저 따위로 밖에 못 만들었을까 싶다. 그런데 주변에서 이 영화 본 사람들은 화살표를 다음 장소를 가르키며 간발의 차이로 지정한 장소에 찾아가는 이 영화가 다들 재밌다고 하던데? 그래서 안 그런 사람도 있다는 차원에서 적었다.

사이먼 싱, 빅뱅: 역시! 사이먼 싱의 글은 뭘 봐도 절대 실망하는 법이 없다. 이제까지 과학저술가들의 입을 빌어 알던 빅뱅을 대단히 생동감 넘치는 드라마로 바꿔 놓았다. 정말 재밌다. 첫장의 인용문: '우주를 이해하려는 노력은 이 삶을 코미디 수준보다 조금 높게 끌어올릴 수 있는 몇 안되는 일이다. 그리고 그것은 비극의 아름다움을 가져다주기도 한다' -- 스티븐 와인버그.

코메디는 이해하겠는데, 무슨 비극? 인생의 목적에 관한 독특한 견해도 들을 수 있었다. '아낙사고라스는 기원전 5세기 경에 살았던 급진적인 사상가로 인생의 목적은 "태양과 달 그리고 하늘을 연구하는 것"이어야 한다고 주장한 사람이다.'

책의 서장은 이렇게 시작한다.
  • 에라스토테네스가 시에네의 우물과 알렉산드리아에 세운 막대기를 이용해 지구의 둘레를 측정한 방법
  • 에라스토테네스가 지구와 달의 상대적인 크기를 월식을 이용해 측정한 방법
  • 에라스토테네스가 손톱을 이용해 달까지의 거리를 측정한 방법
  • 아리스타르쿠스가 반달일 때 태양과 지구가 직각을 이루는 것을 알고, 지구와 달 사이의 거리를 알고 태양과 지구의 거리를 측정한 방법
  • 그리고 지구와 태양과의 거리를 이용해 태양의 크기를 측정한 방법
이미 알만한 것들이지만 이렇게 설명을 명쾌하게 해내는 것이 글쟁이의 재주다. 그 다음 장도 마찬가지. 단조로운 사실 관계로 지루해질만한 글을, 발로 뛰면서 수집한 생생한 자료를 바탕으로 총기와 익살을 곁들여 드라마타이즈한다.
역사학자들은 Giordano Bruno가 별들이 각자 행성을 가지고 있고 다른 행성에도 생명체가 번성하고 있다고 한 '무한한 우주와 세상에 대하여 On the Infinite Universe and Worlds'라는 책을 쓴 것에 교회가 분노했을 것이라고 보고 있다. 브루노는 사형선고를 받았을 때 "아마 형을 선고하는 당신들이 형을 받는 나보다 더 큰 공포 속에 있을 것"이라고 말했다. 1600년 2월 17일 그는 로마의 캄포 데이 피오리로 옮겨져 발가벗겨진 후 화형당했다.
지오르다노 브루노는 내가 한 때 SF 단편을 쓰려고 했던 소재였다. 아울러 빅뱅에는 재치있는 농담꺼리가 즐비했다.
천문대로 운전해 가고 있던 천문학자가 도플러 효과를 이용해 경찰을 속이려 했다가 실패한 이야기가 있다. 붉은 신호등인데도 지나가다가 걸린 그 천문학자는 자신이 신호등을 향해 다가가고 있었기 때문에 청색편이가 일어나 붉은 신호등이 푸른 신호등으로 보였다고 주장했다. 경찰은 그 이야기를 받아들여 신호 위반 딱지를 취소했다. 그 대신 속도 위반 딱지를 떼고 벌금을 두 배로 물렸다. 붉은 신호등이 푸른 신호등으로 보일 정도의 도플러 편이가 일어나려면 그 천문학자는 시속 2억 킬로미터의 속도로 운전했을 것이기 때문이다.

우디 앨런의 영화 '애니 홀'에 나오는 한 장면을 떠올려 보자. 싱어 부인은 아들 앨비에게 우울증 증세가 있어 정신과 의사를 찾아갔다. 앨비는 의사에게 우주가 팽창하고 있다는 이야기를 읽었는데 그렇다면 주변의 모든 것도 팽창하여 결국은 모두 파괴되어 버리지 않겠느냐고 말한다. 그러자 싱어 부인이 끼어든다. "우주가 무슨 상관이란 말이냐? 우리는 브루클린에 살고 있어. 그리고 브루클린은 팽창하지 않아." 싱어 부인의 말이 확실히 옳다.

후테르만스는 외조부모 한 사람이 유대인이었다. 그래서 그는 때때로 반유대적인 말을 들으면 "당신 조상이 아직 나무 위에서 살고 있을 때 내 조상은 이미 수표를 위조하고 있었어" 라고 반격했다.

후테르만스는 자신과 앳킨슨이 별이 빛나는 이유를 밝혀줄 올바른 길을 가고 있다고 확신했고 자신들의 연구를 매우 자랑스러워했다. 그래서 여자 친구에게 자랑하지 않을 수 없었다. 그는 나중에 별 내부의 핵융합에 관한 연구 논문을 완성한 날 밤을 이렇게 회상했다.

그날밤, 논문을 완성하고 여자 친구와 산책을 나섰다. 어두워지자 별이 하나둘씩 아름답게 빛나기 시작했다. "별이 참 아름답지?" 여자 친구가 소리쳤다. 나는 가슴을 펴고 자랑스럽게 말했다. "난 어제부터 별이 왜 빛나는지 알게 됐어."

그의 여자 친구 카를로테 리펜슈탈은 확실히 감동 받았다. 나중에 그녀는 그와 결혼했다.
후테르만스의 여자 친구는 혹시 착각하지 않았을까?
과학자 대부분은 빅뱅에 관한 교황의 지지는 진지한 과학적 토론에서 인용되면 안 된다고 생각했다. 교황의 지지 발표 후 오래지 않아 빅뱅 지지자들을 당황스럽게 하는 반격이 시작되었다. 경쟁 이론인 정상우주론 지지자들이 교황의 연설을 빅뱅 모델을 모욕하는 데 이용하기 시작한 것이다. 예를 들면 영국 물리학자 Williamson Bonner는 빅뱅 이론은 기독교를 선전하려는 음모라고 주장했다. 프레드 호일 역시 빅뱅 이론은 기독교적 기반 위에 만들어진 이론이라고 신랄한 비판을 퍼부었다. 정상우주론자인 토머스 골드도 동조했다. 교황 비오12세가 빅뱅 이론을 지지했다는 소식을 들었을 때 골드의 반응은 짧았지만 정곡을 찌르는 것이었다. "교황은 정지해 있는 지구도 지지했었다."
읽다가 너무 웃겨 내려야 할 지하철역을 지나쳤다.
'마법의 용광로 The Magic Furnace'의 저자 Marcus Chown은 별 연금술의 중요성을 다음과 같이 묘사했다. "우리가 살기 위해서는 수십 억, 수백 억, 심지어는 수천 억 개의 별이 죽어야 한다. 우리 피 속에 있는 철, 뼈 속의 칼슘, 숨을 쉴 때마다 우리 폐를 채우는 산소는 모두 지구가 태어나기 훨씬 전에 죽어간 별의 용광로 속에서 만들어졌다."
 저번에 읽은 이언 뱅크스의 '다리'에서 이와 유사한 대목이 나왔다. 많은 사람들이 이 대목에서 아서 클라크의 단편 소설을 떠올릴 것이다. 이 다음 문단은 이랬다:
낭만주의자들은 자신들이 별의 먼지에서 만들어졌다고 생각하는 것을 좋아했다. 냉소적인 사람들은 자신들이 핵폐기물이라고 생각할지도 모른다.
적어도 나하고 커트 보네것은 후자였다.
오늘밤 밖으로 나가 모자를 벗고 머리 위에 떨어지는 빅뱅의 열기를 느껴보라. 아주 성능이 좋은 FM 라디오를 가지고 있고 방송국에서 멀리 떨어져 있다면 쉬-쉬-쉬- 하는 소리를 들을 수 있을 것이다. 아마 이미 이런 소리를 들어본 사람도 많을 것이다. 그 소리는 마음을 달래준다. 때로는 파도소리 비슷하다. 우리가 듣는 소리는 수백억 년 전부터 오고 있는 잡음의 0.5% 정도이다.
어린 시절에는 라디오를 들고 나가 컨택트의 여주인공처럼 백색잡음을 멍하니 듣곤 했다.하여튼 빅뱅과 정상우주론의 스코어보드 전쟁 덕택에 오랫만에 낄낄거리면서 즐거운 독서를 했다.
,
OSM의 전 세계 모든 데이터를 다 담고 있는 planet.osm 은 일주일에 한번씩 업데이트된다. planet.osm에서 한반도만 뜯어내려면 원래 그럴 용도로 만든 osmosis 프로그램을 사용한다. 2009.7.2 현재 planet.osm 파일의 크기는 무려 160GB, 압축한 파일의 크기가 6.2GB이다.

win32에서 osmosis를 실행하면 십중팔구 안 된다. 이유는 osmosis.bat 파일에 library path가 잘못 지정되어 있기 때문이다(linux에서는 상관없다). osmosis 0.31 버전 기준으로, osmosis가 설치된 디렉토리의 하위 디렉토리에 있는 ./lib/default/*.jar 를 EXEC 환경 변수에 모두 추가하여 osmosis.bat 파일을 만드는 편이 빠르다.
@ECHO OFF
set JAVACMD=java.exe
set JAVACMD_OPTIONS=-Xmx1024m
set MYAPP_HOME=D:\luke\Documents\private\gps\tool\osmosis-0.31
set LIB=%MYAPP_HOME%\lib\default
set MAINCLASS=org.openstreetmap.osmosis.core.Osmosis
SET EXEC=%JAVACMD% %JAVACMD_OPTIONS%
SET EXEC=%EXEC% -cp %MYAPP_HOME%\osmosis.jar;
SET EXEC=%EXEC%%LIB%\bzip2-20090327.jar;
SET EXEC=%EXEC%%LIB%\commons-logging-1.0.4.jar;
SET EXEC=%EXEC%%LIB%\jpf-1.5.jar;
SET EXEC=%EXEC%%LIB%\mysql-connector-java-5.1.6.jar;
SET EXEC=%EXEC%%LIB%\postgis-1.3.2.jar;
SET EXEC=%EXEC%%LIB%\postgresql-8.3-603.jdbc4.jar;
SET EXEC=%EXEC%%LIB%\stax2-api-3.0.1.jar;
SET EXEC=%EXEC%%LIB%\woodstox-core-lgpl-4.0.3.jar
SET EXEC=%EXEC% %MAINCLASS% %OSMOSIS_OPTIONS% %*
%EXEC%
planet.osm 파일이 워낙 커서 보통 배포되는 형태인 planet-090702.osm.bz2 파일을 압축을 풀지 않고 그대로 작업한다. osmosis의 위키 페이지에는 이런 식으로 명령을 지정하라고 적어 놓았다.
osmosis.bat --read-xml file=planet-090701.osm.bz2 --bounding-polygon file=skorea.poly.txt --write-xml file=skorea.osm
osmosis의 bzip2 라이브러리의 버그 때문에 실행 하면 몇 시간 잘 돌다가 exception이 발생하며 프로그램이 중단된다. 오래 전부터 알려진 문제란다. win32용 bzip을 얻어서, 실행파일인 bzip-xxx.exe 파일을 bzcat.exe로 복사해 놓고 다음처럼 실행한다(리눅스에는 bzcat이 기본적으로 설치되어 있다).
bzcat planet-090701.osm.bz2 | osmosis.bat --read-xml file=- --bounding-polygon file=skorea.poly.txt --write-xml file=skorea.osm
osmosis의 입력 파라메터로 지정하는 bounding-polygon 파일 'skorea.poly.txt'는 osmosis 위키 페이지에서 참고하라는 각 국가별 polygon 파일을 봤는데, 좀 괴상하다. 남북한 국경선도 명확하지 않고 울릉도, 독도 등이 빠져 있다. 해서 확실한 국경선은 아니지만, 하나 만들었다. skorea.poly.txt:
south_korea
1
124.50082 33.88033
126.84860 32.67590
128.86031 34.19477
130.32874 35.89549
132.62271 37.16911
128.90661 38.93043
124.46191 37.55735
124.50082 33.88033
END
END
이걸 어떻게 만들었냐 하면... 궁즉통, Google Earth에서 대충 한국을 포함하는 polygon을 그린 다음 그것을 kml로 저장해서  좌표를 텍스트 에디터로 옮겨 적었다. 남한의 국경선 폴리곤이 혹시 있지 않을까 싶지만 구글질해서 성과(?)를 얻는 것보다 직접 아웃라인을 따내는 시간이 훨씬 적게 걸린다. -_-

osmosis로 160GB짜리 파일을 처리하는데 얼마나 많은 시간이 걸리는지 모르겠다. 밤에 작업을 걸어두고 잤다. 2시간 40분쯤 돌다가 exception이 발생하며 bzip2 라이브러리 문제로 프로그램이 죽어버렸다. 파일이 깨진 것 같아 다른 서버에서 다운로드 받아 다시 돌렸다. 3시간 정도 걸려 skorea.osm 파일을 얻을 수 있었다.

skorea.osm 파일을 얻은 다음, 일단 잘못된 저수지 정보를 모두 삭제했다. 삭제는 bulk_upload.py를 수정해서 만든 조그만 python 프로그램으로 돌렸다. osmChange를 이용해 한꺼번에 여러 개의 node,way에 대한 작업을 수행하는 것인데, changeset중 단 하나라도 entry에 문제가 있으면 업데이트가 되지 않는다. 그 때는 changeset을 새로 만드는 방법 밖에 없다. JOSM도 동일한 문제가 있다. 예를 들어 하나의 changeset에 100개의 노드를 삭제하는 delete element가 있다고 하면,
<osmChange>
     <delete>
          <node id="34132450" ... />
          <node id="34132452" .../>
           ...
    </delete>
</osmChange>
34132452번째 노드를 삭제할 때 에러가 발생하면 100개의 노드에 대한 delete 작업 전체가 수행되지 않는다. OSM에서 프로그래밍을 하는 사람들이라면 반드시 알아야 할 내용인데 OSM development 섹션에서는 언급이 안되어 있어 메모해 둔다:

Error:  409 :  Version mismatch: Provided 0, server had: 1 of Way 36898268
삭제하려는 node의 버전은 1이고 서버의 해당 노드의 버전은 2이면 삭제되지 않는다. 삭제하려는 노드를 누군가 다른 사람이 작업해서 버전 번호가 달라진 것이다.

Error:  410 :  The way with the id 35355795 has already been deleted
이미 삭제된 노드로, 이 경우에는 에러로 간주되지 않았으면 좋겠는데 이런 에러 때문에 전체 changeset이 commit되지 않는다.

Error:  412 :  Precondition failed: Node 414576118 is still used by way 36898266
삭제하려는 node를 사용하는 다른 way가 있을 경우 발생하는 에러. 이게 가장 골치아프다. 왜냐하면 삭제하려는 node가 만약 어떤 way에 소속되어 있는데, 이미 그 way가 삭제되었다 하더라도 다른 way에서 이 node를 사용하고 있다면 이 node를 삭제하면 안 되는 것은 맞다. 그런데 해당 node가 어떤 way에 속해있는지 사전에 알 방법이 애매하다. 전 node, way, relation을 메모리에 갖고 있던가 그 정보를 db에 넣어 해당 node가 다른 way에서 점유하고 있는지 조사해 봐야 하는데, 삭제하려는 node가 300000 이고 한 node 조사에 100msec이 걸린다면 삭제대상 노드 조사에만 30000초(약 500분)이 걸린다.

osmChange를 사용하지 않고, changeset을 만든 다음 http DELETE로 삭제하는 고전적인 방법을 사용할 수도 있다. 이 방법을 사용하면 한 node에서 발생한 에러가 다른 node의 삭제에 영향을 끼치지 않는다. 그런데 그 방법은 시간이 오래 걸려 비효율적이다. 개당 500msec이 걸린다면 300000개를 삭제하는데 41시간이 걸린다.

그래서 python 프로그램은 먼저 한 번에 111개를 한 세트로 하는 changeset을 사용해 11개 element를 삭제하고, 삭제가 정상적으로 이루어진 element의 id를 기록해 둔 다음, 다음번에 python 프로그램을 다시 실행해 이번에는 53개씩 삭제, 다음에는 23개, 그 다음에는 11개, 5개, 3개, 2개, 그리고 마지막으로 http DELETE로 1개씩 삭제한다. 갯수는 100, 50, 25, 13, 6, 3, 2, 1에 근접한 소수를 사용해서 이전 changeset이 다음 changeset의 배수가 되어 같은 에러가 동일한 위치에서 발생하지 않도록 한 것.

손이 많이 가지만 이전에 잘못 올린 저수지및 호수 데이터 160000개를 삭제하는데 4시간 가량 걸렸다. 사실 작업시간 보다는 changeset의 특성을 파악하고 적응하는데, 특히, 412 에러를 회피하려고 갖은 꽁수를 써 보는데 시간이 많이 걸렸다. 처음에는 c++로 작업하다가 python 프로그램이 워낙 간단하고 편해서 python으로 바꿨다.

smoothing이 적용된 저수지및 호수 데이터(ncat=저수지및호수2)를 저번 주 금요일 저녁에 올리기 시작했다. 월요일에 정상적으로 올라간 것을 확인했다.

교통정보센터의 수정된 도로를 올리기 전에, 이전에 내 아이디로 만든 highway, trunk, primary, secondary 도로를 삭제하기로 했다. 진행 전에 한국 OSM 작업자들에게 도로 업로드 작업을 이번 주 중에 진행한다는 메시지를 작성하여 전송했다. 욕도 일찍 먹는게 낫다고, 이번에 도로 데이터를 올리지 못하면 일이 점점 더 커질 것이다. 한 두어 달을 올릴지 말지 망설이며(서울, 부산, 대전, 안동이 그 당시에 작업이 꽤 진척된 상태였다. 그 작업을 다시 해야 하니까 작업자들에게 미안해서 어떻게 하면 작업양을 최소화하면서 도로 업로드의 당위성을 설명할까 망설였다) 한가한 고민이나 하던 사이에 홍의님이 전주시와 인근 도로 작업을 상당히 진척시켰다.

도로는 월, 화요일에 모두 삭제했다. 올리려고 하는 도로 데이터의 검토 역시 대충 마무리 되었다. 고속도로는 양방향 lane을 그대로 유지하기로 했다. 수요일 OSM 서버의 업데이트가 있기 전 고속도로를 먼저 올려 JOSM과 Potlatch로 상태를 확인했다. 고속도로만 올리는데 3시간 가량 걸렸다. XAPI가 맛이 가는 바람에 조금이라도 일이 틀어지면 다음에 그것을 교정할 기회는 1주일 후에나 주어진다. 특히나 대량의 업로드의 경우는 문제가 심각하다. 조심조심 작업해야겠다.

화요일 밤부터 국도를 올리기 시작했고 수요일에는 도심로와 지방도 업로드를 시작했다. 다 합쳐 20시간 가량 걸렸다. 프로그램이 수고가 많다. 이전의 bulk_upload.py를 좀 더 개선한 소스. bu.py:

[code] #!/usr/bin/python # -*- coding: utf-8 -*- import time import socket import xml.etree.cElementTree as ET import sets import optparse import pickle import os import sys import httplib2 import re socket.setdefaulttimeout(300.0) headers = { 'User-Agent' : 'BatchUploader/0.1', } api_host='http://api.openstreetmap.org/api/0.6' userid = "#####" passwd = "#####" cachefn = "" demo = False idMap = {} testid = '1' class UploadFailed(Exception): pass class ImportProcessor: def __init__(self): self.user = userid self.password = passwd self.e = ET.Element("create") createReq = ET.Element('osm',version="0.6") change = ET.Element('changeset') createReq.append(change) if demo: self.cid = '1' print 'Create changeset ', self.cid return resp, content = self.request(api_host + '/changeset/create','PUT', ET.tostring(createReq)) if resp.status != 200: print 'Error Request changeset ', resp.status, ': ', content raise UploadFailed(resp.status, content) self.cid = content print 'Create changeset ', content def request(self, url, cmd, xml): con = httplib2.Http() con.add_credentials(userid, passwd) fc = 0; failed = True while failed: try: resp, content = con.request(url, cmd, xml, headers=headers) return resp, content except socket.error, msg: fc += 1 if fc > 5: raise print 'Request Error:', msg time.sleep(2) def add(self, item): item.attrib['changeset'] = self.cid self.e.append(item) def upload(self): xml = ET.Element('osmChange') xml.append(self.e) if demo: return 1 resp, content = self.request(api_host + '/changeset/' + self.cid + '/upload', 'POST', ET.tostring(xml)) if resp.status == 200: # print "Return:", content er = ET.fromstring(content) for child in er.getchildren(): old_id = child.attrib['old_id'] new_id = child.attrib['new_id'] idMap[old_id] = new_id return 1 # 그외의 에러 print 'Error: ', resp.status, ':', content return 0 def closeSet(self): if demo: print "Closing changeset", self.cid, '\n' return resp, content = self.request(api_host + '/changeset/' + self.cid + '/close', 'PUT', "") if resp.status != 200: print "Error closing changeset", self.cid, ":", resp.status def doJob(osmData, etypes, csize): cnt = 0 ip = None for e in osmData.getiterator(): if e.tag not in ( etypes ): continue # 이미 기록한 것은 다시 하지 않음 eid = e.attrib['id'] if eid in idMap: continue if ip == None: ip = ImportProcessor() # way 또는 relation이면 이전에 기록된 id로 기록함. if e.tag == 'way' or e.tag == 'relation': for child in e.getiterator(): if child.attrib.has_key('ref'): old_id = child.attrib['ref'] if idMap.has_key(old_id): child.attrib['ref'] = idMap[old_id] print 'create [', ip.cid, ':', cnt, '] ', e.tag, eid ip.add(e) cnt += 1 if cnt >= csize: ip.upload() f = open(cachefn, "w") pickle.dump(idMap, f) f.close() ip.closeSet() ip = None cnt = 0 if cnt > 0: ip.upload() f = open(cachefn, "w") pickle.dump(idMap, f) f.close() ip.closeSet() usage = "usage: %prog -i input.osm" parser = optparse.OptionParser(usage) parser.add_option("-i", dest="infile", default="", help="read data from input.osm") (options, args) = parser.parse_args() if options.infile == "": print "specify input osm file" raise cachefn = options.infile + ".db" try: if os.stat(cachefn): print 'Read from cache file:', cachefn f = open(cachefn, "r") idMap = pickle.load(f) f.close() except: print "no cache found" osmData = ET.parse(options.infile) st = time.time() doJob(osmData, ("node", "way", "relation" ), 500) print "\nJob done. %.0f" %(time.time() - st), "secs ellapsed" [/code]

OSM 서버의 느린 응답 때문에 에러가 빈번하게 발생하여 프로그램이 자주 멎는다. 프로그램 탓은 아니다. changeset이 완전히 반영되지 않으면 idMap에 기록하지 않도록 하고, 한 번에 commit하는 element의 갯수는 2000개나 5000개가 아닌 500개 정도로 제한해서, 시간이 더 걸리더라도 안정적으로 작동하는데 촛점을 맞췄다.

아울러, 저 것과 같은 기능을 하는 프로그램을 처음에는 VC++ 2005로 작성하려고 했지만 c++로는 작업량이 상당했다. 무엇보다도 expat SAX xml parser 때문에 로직을 짜기가 어렵다. c++에서도 python처럼 쉽게 작성 하려면 XPP(xml pull parser) + DOM을 사용하는게 마땅하다. python 프로그램은 한 시간도 안 걸리는 것을, 그것과 등가한 VC 프로그램을 작성하려면 1-2일쯤 걸릴 것 같다.

수요일 밤에 작업이 끝났다. 업로드에 15시간 정도 걸렸다.  작업 시간을 잘 맞춘 덕에 업로드된 내용이 그 다음날 바로 반영되었다.

서울 부근의 겹치고, 태그가 불분명하게 설정된 도로를 다시 정리하는 작업을 진행 중.

사용자 삽입 이미지
OSM에서 mapnik renderer로 본 지도. mapnik으로는 그간 무슨 삽질을 했는지 알 수가 없어서,

사용자 삽입 이미지
Osmarender로 렌더러를 바꿨다. 저 촘촘한 도로들이 지난 한 달 동안 작업한 것. 이것으로 한국 지도 작업을 진행하기 위한 기본 뼈대가 어느 정도 갖춰진 셈이다. 갈 길은 여전히 멀다...

,
도로 작업 후 파일 크기는 350MB에서 88MB로 극적으로 줄었다. 도트 픽셀이 보이는 해안선과 저수지 및 호수 데이터 역시 크기가 현저하게 줄었다. 하지만 이들을 조합해 Garmin용 이미지를 만들자 파일 크기는 10MB 가량 밖에 줄지 않았다. 용량이 크게 줄지는 않았지만 선의 복잡도가 줄어 GPS에서 지도를 출력하는 시간이 단축되긴 했다. 덕택에 TRE와 RGN 사이즈를 줄일 수 있었다.

저수지 및 호수 데이터를 작업하고 나서 이전의 bulk_upload.py로 예전 자료를 삭제하고 신규 자료를 업하려고 하다가... bulk_upload.py의 버그로 이전 자료가 두번 업로드되고 말았다. 파이썬 프로그램을 좀 더 자세히 살펴봤어야 하는데, 사후약방문이라고 나중에야 이상해서 소스를 보니 bulk_upload.py는 말그대로 업로드만 가능했다. 소스 중에는 delete와 modify도 되게끔 하는 부분이 있지만 제대로 작동하지 않을 뿐더러 순서가 잘못 되어 있었다.

즉시 지우려고 보니 OSM 서버 업그레이드 후 XAPI 서버가 맛이 간 상태라 한반도 데이터를 다운받을 수가 없다. 6월 13일 다운된 xapi 서버는 6월 29일까지도 복구되지 않았다. 천상 중복 업로드된 데이터를 교정하려면 매주 수요일 업데이트 되는 planet.osm을 다운받아 한반도만 뜯어내 잘못된 저수지 영역을 모두 선택하여 삭제하는 작업을 다시 해야 한다.

그렇게 하면 되는 작업이지만, 이제는 좀 짜증이 난다. API 0.6 업그레이드 후 뭐 하나 잘못되서 수정하려면 며칠씩 걸리고 API 0.6 자체의 엉성함 때문에(transaction도 아니고 그렇다고 transaction이 아닌 것도 아닌 아주 애매한 컨셉) 가외로 까먹는 시간이 상당하다. 0.6은 또 속도가 느려 잘못 업로드된 저수지및 호수(약 10MB) 자료의 절반을 데이터베이스에서 삭제하는데 27시간이 걸렸다. 그나마도 제대로 되면 좋겠는데, 제대로 되지도 않아 툭하면 서버가 다운되어 접속이 안되거나 영 바보스러운 응답을 늘어놓기 일쑤였다. 하여튼 0.6 API로 스트레스 받지 않고 OSM 배치 작업을 하는 사람들이 영 신기하기만 하다. 솔직히 뭐 이따구로 아마추어스럽게 설계했나 싶다.

아... 아마추어들이지 참.

그럴 때도 되었지 싶어 이번 주 월요일에는 그간의 OSM 지도와 도로 작업 데이터/해안선 따위등을 긁어모아 KOTMv2(Korea OSM & Topo Map version 2.0)을 만들었다. 이번에 만들어서 공개하면 세번째가 되는데, KOTM이란 이름을 사용하게 된 것은 두 번째 이고, 앞으로 그 이름으로 통일하려고 v2.0이 되었다. 이번에는 SFX에 설치하며서 registry 파일을 자동으로 등록해주는 간단한 인스톨러를 포함했다.

KOTMv2 소개

다음 버전에는 제대로 된 인스톨러를 만들어야겠다. 사용자가 설치 디렉토리를 다른 곳으로 변경할 때 해당 디렉토리로 자동 변경하여 .reg 파일 없이 registry에 등록하고, Garmin GPS용 IMG와 MapSource용 이미지를 선택할 수 있도록. 아예 내친 김에 Sendmap.exe로 GPS에 자동 설치까지 가능하게? Winrar의 SFX가 이 정도면 훌륭한 편이라 vbs 스크립트 하나 추가하는 정도로 해도 될 듯 싶지만.

OSM의 비전: 아이팟 터치, 안드로이드, WM6 기계에서 오픈 스트릿 맵 타일을 다운받거나(wifi online) 벡터 데이터를 원본 그대로 가공하여 랜더링하는 엔진을 만들어(offline) GPS로 연동하면 그 이상의 활용이 있을까? 렌더러 소스가 공개되어 있으니 모바일 장치용 프로그래밍을 좀 하면 되는데, 뭐 이미 누군가가 하고 있으니 기다리다보면 나오지 싶다.



,

OSM 작업노트 #11: 도로

GPS 2009. 6. 24. 20:52
작년 10월부터 OSM 간보기를 하다가 올 3월초부터 OSM 작업을 시작했는데, 4개월만 더 있으면  OSM 작업하겠다고 생각한지 만 1년이 된다.

저번 주와 마찬가지로 이번 주에도 작업을 그리 많이 하지 못했다. 이번 주는 화요일, 수요일 합쳐 약 7시간 정도 작업. 이 기사 쓰는데 쓰는 시간이 더 걸리는 것 같다. 국가교통정보센터의 지도가 내년에 업데이트 되어도 그것을 손쉽게 업데이트할 방법을 찾다보니... 도로 작업에 너무 많은 시간을 까먹고 있다.

국가교통정보센터의 지도에서 추출한 도로로 다음 네 단계로 작업으로 나눴다. 라우팅은 미심쩍은 것들이 많아 이번 주 작업에서 뺐다.

1. 노이즈 제거

사용자 삽입 이미지
왼쪽: 원본 데이터, 오른쪽: 노이즈 제거 후

아마도
프로젝션에 따른 오차를 보정하다가(추측임) 위와 같은 노이즈가 원치않게 끼어든 것 같다. polygon 처리에 사용하던 이동평균 보간으로 노이즈를 없애버리면 유의미한 vertex도 날아가므로 노이즈의 성향을 살펴 연직 및 수평 이동이 발견될 때에만 제한적으로 보정 했다.

이런 노이즈의 '크기'는 대략 1-4m 정도. 2점/3점까지 수평/연직이 발견되면 한 점이나 두 점을 삭제하고 2점/3점의 평균 거리로 첫 번째 위치를 이동하여 보정했다.
 
2. 선로 합치기
 
국도 및 지방도는 고속도로처럼 뚜렷한 경계선에 의해 구분되지 않으므로 2개의 라인이 서로 다른 방향을 가진 벡터로 진행할 필요가 없다. 물론 국도나 지방도 중에서 4/8차선이 없는 것은 아니지만, 2개의 라인으로 표현되면 파일 크기가 커지고, 굳이 그렇게 도로 폭을 크게 묘사할 필요가 없다고 판단해 국도와 지방도의 선로를 합치기로 했다.
 
선로를 합치기 위한 조건은, 두 벡터의 시작점/끝점이 일정 거리 내에 인접해 있고 벡터의 방향만 반대일 때이다. 아울러 polyline의 이름과 타잎이 일치해야 한다.
 
시작점, 끝점은 경위도좌표로 나타나므로 두 좌표의 거리를 재어 파라미터로 정한 거리 안에 들어오면 인접했다고 판단할 수 있다. 평면 상의 두 점의 거리는 sqrt( (x2 - x1)^2 + (y2 - y1)^2 ). 물론 경위도로 표현되는 두 좌표는 구체인 지구 구면의 거리가 되어야 하므로 평면 거리는 쓸모없다. 구면 상의 두 점의 거리는 구면기하 삼각함수를 이용한 Haversine 공식을 사용해 계산:
 
d = acos(sin(lat1) * sin(lat2) +  cos(lat1) * cos(lat2) * cos(lon2 - lon1)) * R
R(지구반지름) = 6371000m
 
자전 및 공전을 하는 지구가 완전한 구체는 아니라서(WGS-84 ellipsoid 모델에서 적도 반지름은 6378km, 극 반지름은 6357km) Haversine식은 0.3% 가량의 오차를 가진다(즉, 1km 거리에서 3m 가량의 오차). 오차를 줄이려면Vincenty 공식을 사용하면 되지만(오차가 무려 1mm), 좌표간 거리가 대단한 정밀도를 가질 필요가 없고 계산량도 많아 Haversine 공식을 사용하기로 했다. 지구면의 두 지점에 관한 여러 종류의 수식은 여기를 참조.
 
사용자 삽입 이미지
왼쪽: 작업 전, 오른쪽: 작업 후

국도 및 지방도에 좌표 거리를 25m 이내로 했다. 선로 합치기는 비교적 잘 되었다. 예상대로 파일 크기는 1/2로 줄었다.
 
3. 인접 차선 결합
 
국가교통정보센터의 도로는 대부분 잘게 토막나 있다. 이것들을 하나의 긴 도로로 묶어 놓는다. 선로 합치기와 마찬가지로 벡터의 시작점/끝점이 일정 거리 내에 인접해 있으면 합친다. 경우의 수는 네 가지다.
 
vector1: B1 ---->---->---->---- E1
vector2: B2 ---->---->---->---- E2
 
E1, B2 인접: vector2의 B2를 지우고(공통) vector2를 vector1뒤에 연결한 다음 vector2 삭제(공통)
B1, E2 인접: 위와 비슷
B1, B2 인접: vector2의 방향을 바꿔 vector1에 연결
E1, E2 인접: 위와 비슷.

사용자 삽입 이미지
왼쪽: 떨어져서 별개로 선택되는 도로들, 오른쪽: 연결된 도로

4. 벡터 평탄화
 
벡터가 완만하게 변화하는 구간에서만 평탄화를 실시한다. 평탄화를 하면 지점의 갯수가 줄어든다. 변화폭은 일정 갯수의 지점에서 벡터 방향(bearing)의 각도 변화의 총합을 측정하여 파라미터로 결정한다. 예: 10점 동안 각도 변화가 10도 미만이면 평탄화.

평탄화는 급격한 변화 구간(예를 들면 도로의 인터체인지의 원형 진입로)은 그대로 놔 두고 완만한 변화 구간을 압축하는 효과가 있어 파일 크기를 줄일 수 있다. 3점 각도 변화 15도에서 원래 데이터를 크게 손상시키지 않으며 그 크기를 대략 1/2로 줄였다.

잘 뒤져보면 위에 언급한 네 가지 작업에 적합한 좋은 알고리즘이 있을 법하지만, 굳이 속도나 효율을 요구하는게 아니라서 일단 이대로 프로그래밍하기로 했다.

네 가지 작업의 효과(또는 취약점)을 확인할 수 있도록 파라미터를 선택하여 처리할 수 있도록 GUI 프로그램을 짰다.

사용자 삽입 이미지
이전의 해안선 처리에 사용하던 프로그램과 통합하고, polygon 처리할 때도 smoothing을 넣으니까 vertex 수가 10% 가량 줄었다. 빙고.

프로그램을 돌려보니 출력 파일의 크기가 원본의 24~30% 정도 밖에 되지 않는다. 원래 계획했던, 350MB를 100MB 이내로 줄이는 것이 가능하다. 한동안은 한가하게 출력 파일을 검증하는 작업을 할 것이다. 더디긴 하지만 작업은 계획대로 진행되고 있다.

 

 
,
OSM의 coastline은 PGS에서 자동 변환한 것으로, polygon이 아닌 polyline이라서 OSM 파일을 Garmin GPS용 .img로 변환하면 바다와 육지 경계만 표시될 뿐, 바다는 파랗고 육지는 육지색으로 표시되지 않는 문제가 있다. 여기에다가 transparent 옵션을 주고 .img 파일을 만들면 해안선은 엉성한 basemap에 묻혀 사실상 GPS에서 보이지 않는다. basemap에 묻히면 해안선 뿐만 아니라 시퍼런 바다에 등고선이 돋아있는 희안한 현상도 볼 수 있다.


남해안. 아래쪽은 새파란 바다여야 한다.

OSM의 랜더러들은 해안선을 판단해 바다와 육지 경계를 표시하므로 문제가 없지만, mkgmap, cgpsmapper 등에서 coastline을 적절히 처리할 방법을 찾아야 한다. mkgmap 제작자가 해안선을 처리할 방법을 나름대로 강구중인 것 같으나, 언제될 지 알 수 없다. 주욱 OSM 지도 작업을 하면서 느낀 거지만, 일단은 자력갱생 해야 한다.

현재로선 OSM 지도의 주 활용처가 Garmin GPS 디바이스인 관계로 이 문제를 해결하기 위해 임시변통 격으로(mkgmap에서 해안선을 다루게 될 때까지) polygon으로 구성된 해안선 데이터를 얻어와 바다를 구성하는 수 밖에 없다.

세계자전거오지여행의 운영자가 국가교통정보센터에서 공개한 한반도 도로 지도를 가공한 mp 파일에는 해안선 polygon 데이터가 있다(최근 데이터에는 없음). 이것을 뜯어와 img를 만들어 봤더니 드디어 바다와 육지가 구분되었다. 그런데 문제가 좀 있다.

해안선을 확대하면 디지타이즈된 라인이 아마도 한반도 저해상도 파일을 가지고 작업한 것처럼 라인이 단속적으로 끊어졌다.

성격은 좀 다르지만 국가교통정보센터의 도로에도 비슷한 문제가 있다.

사용자 삽입 이미지
오버줌 상태에서 보면 라인이 매끄럽게 연속적으로 이어진 것이 아니라 단락적으로 지글거린다. 이 때문에 도로만 데이터 크기가 350MB나 되어 OSM 서버에 도로 데이터를 올리는 것을 계속 망설이고 있었다. 해안선 문제 뿐만 아니라, 불필요한 노이즈를 억제하여 도로 데이터의 크기를 줄이는 방법도 역시 필요하다.

이들 문제를 해결하기 위해 벡터를 보간하는 방법을 궁리했다. 첫번째 방법은 벡터의 연속된 인접 3점으로 구성된 삼각형의 무게 중심을 구하는 공식을 이용해 다음 지점을 구하는 것이다. 그림으로 그리면,

사용자 삽입 이미지
좌상단이 첫 포인트, 우상단이 마지막 포인트. 두꺼운 실선은 원래의 좌표 벡터. 푸른선은 3점 포인트를 이용해 구성된 삼각형, 붉은선은 ABC 세 점으로 이루어진 연속적인 삼각형의 중심을 따라 이어진 선.

이렇게 하면 anti alias를 한 것 같은 효과가 나타난다. 원래의 검정 실선보다 붉은 선이 좀 더 부드러워지는 것. 포인트 수는 원래 7개에서 5개로 줄었는데, polyline이 상당히 길 경우 이 알고리즘을 적용하면 포인트의 수가 대략 1/2로 감소한다. 즉 파일 크기가 50% 줄어든다. 식: 각 점 A,B,C가 (x1,y1), (x2,y2),  (x3,y3)로 구성되어 있을 때 삼각형의 중심은 xc = (x1 + x2 + x3) / 3, yc = (y1 + y2 + y3) / 3.

두번째 삼각형과 세번째 삼각형에서 지나친 평균화 때문에 라인이 뭉툭해진다. 이것을 개선하기 위해 알고리즘을 바꿔 마름모의 중심을 이용하되 마지막 3점은 삼각형으로 계산하는 형태로 바꿨다.
 
사용자 삽입 이미지
삼각형보다는 원래 형태가 잘 반영되었다. 사각형(마름모) ABCD의 중심점은 xc = (x1 + x2 + x3 + x4) / 4, yc = (y1 + y2 + y3 + y4) / 4. 이것을 일반화하면 xc = (x1 + x2 + ... + xn ) / n, yc = (y1 + y2 + ... + yn) / n. 어? 정리해 놓고 보니 좌표의 이동 평균을 취한 것이다. 기껏 머리 좀 굴렸더니만 하하. 이때 n이 증가하면 포인트 수는 줄어드는 대신 궤적의 변화는 둔해진다.

과문한 탓에 더 빠르고 훌륭한 알고리즘을 만들진 못했다. 어디 뒤져보면 꽤 괜찮은 알고리즘이 있을 것 같다. 이쯤 해두고 알고리즘을 구현했다. 간단한 프로그램을 작성해 원래의 해안선 Polished file을 변환해 보았다.

사용자 삽입 이미지
원본.

사용자 삽입 이미지
알고리즘 적용.

만들긴 했지만 해안선은 애당초 DEM처럼 정밀한 데이터가 필요하다. 운 좋게 그걸 구하게 되면 이건 폐기할 것이다. 일단은 이동평균법을 이용해 Garmin GPS용 해안선을 예쁘게 만들었고(OSM 서버에는 안 올린다), 주 활용은 도로 데이터의 크기를 줄이는 것이다.

일단 OSM 서버에 도로 업로드하는 것은 당분간 안 하기로 했다. 도로 작업은 앞으로 몇 단계로 나뉘어 진행하게 될 것 같은데... 1. interpolation. 2. merge lanes. 3. connect. 4. add route information.

어쩐지 삽질하는 느낌을 지울 수 없다. 이런 데이터는 어딘가 이미 있다. 단지 그 데이터를 구하지 못해서...
 
,
OSM 작업자가 슬슬 늘어나고 있는 것 같다. 아쉽게도 지금까지 지도 작업 때문에 컨택해 온 사람들은 모두 외국인이다. 한국인도 있을 테지만 조용히 작업해서인지(나도 마찬가지고) 서로 연락이 없다. 오히려 그 편이 좋을지도.

지도를 만들다 보니 한강이 이상하게 꼬여 있어 무슨 일인가 싶어 확인했다. 한강이 망가져 있다. 어떤 작업자가 한강을 수정하다가 날려 먹은 것 같다. 이번에는 좀 심각하다. 사실 그 작업자의 잘못은 아니고, 4월에 API가 0.6으로 업그레이드 되면서 way 하나당 node 수를 2000개 미만으로 제한해 놓아서, 한 번 수정했다가 저장하는 도중에 way 연결과 relation이 날아간 것 같다. 한강은 거의 5천 여개의 노드로 이루어져 있었다.

OSM에서는 아마도 DB 부담을 줄이려고 2000개란 제한을 둔 것 같은데 안 그래도 그것 때문에 커다란 폴리곤을 분할하는 작업이 필요해서 골치가 좀 아팠다.

한강 복구하다가 나도 날려먹었다. Potlatch가 API 0.6에 맞춰 1.00으로 업그레이드 한 후 화면에 node와 way가 좀 많다 싶으면 다운되기 일쑤다. Potlatch에서 작업한 내용이 업로드 중에 프로그램이 다운되면서 node중 일부만 전송되고 나머지가 전송되지 않아 그 동안 애써 복구한 한강 라인이 가볍게 날아가버렸다. 애당초 가벼운 작업에나 쓰는 Potlatch로 작업한 내 불찰이다. 속이 쓰리다.

JOSM으로 작업하려다가... JOSM도 그리 편한 프로그램이라고 여길 수 없다.  적어도 죽지는 않지만 java 프로그램이라서 그런지 자료가 좀 많다 싶으면(10MB 이상, 서울시만 현재 32MB) 작업이 거의 불가능해진다.

혹시나 하는 마음에 Mercaator 새 버전이 나왔나 살펴봤다. 이전 버전은 API 0.6과 호환되지 않고 자주 죽어서 작업하기가 힘들었다. 새 버전이 나왔다. 메르카토르로 한강을 다시 그렸다. 간신히 업로드하니 어언 4시간이 흘렀다.

메르카토르에서는 multipolygon 작업(relation 작업)이 좀 이상하게 되는 것 같다. multipolygon은 강 위에 떠 있는 섬 따위가 강과 relation을 가지고 있는 것들을 말한다. 강은 outer polygon이 되고 inner polygon으로 섬을 포함하는 것이다. 쉽게 말해 다각형 안에 다각형을 포함하고 그 관계를 지정하는 것.

한강의 노들섬 따위는 인간이 주거하지 않기 때문에 island 대신 islet 태그를 사용하는 것이 정석이다. islet이 공식 태그가 되었는지 아직 잘 모르겠다. 평소처럼 natural=land(육지)로 태그를 지정했다. 그렇게 해도 섬은 섬이다.

한강처럼 큰 강은 waterway=river가 아니고 waterway=riverbank로 tag가 지정된다. multypolygon은 JOSM에서 작업한 내용을 불러와 다시 만들어 저장했다.
 
한강은 대충 되었고, 조만간 4대강 유역 정비사업(?)도 벌일 계획이다. 사실 하고 싶지 않다. 수계 데이터만 구할 수 있으면 자동으로 할텐데 말이다. 그래도 way당 node 2000개 제한 때문에 골치가 아프겠지만.

API 0.6 개정 이후 별별 문제가 다 생겼다. 무슨 작업을 하건 이전보다 3-4배 이상 시간이 걸렸다. 작업을 끝내고(API 로 upload 후) 작업한 내역을 확인할 때마다 XAPI로 해당 지역을 다운받아 확인해 보면 적용되어 있지 않았다. (매번 하는 실수지만) XAPI와 API 사이의 적용이 되는 시차 때문에(약 10~15분)  변경 내역을 확인하려면 일정 시간 기다려야 한다. 이건 아직은 어쩔 수 없어 보인다.

osm 파일 Uploader를 만들다가 이상하게 changeset이 업로드가 안되는 현상을 목격했다. 이전에 JOSM으로 10MB 짜리 파일을 업로드할 때도 같은 현상이 벌어졌다. 490KB 짜리 파일은 업로드에 실패하지 않았다. 업로드가 잘못되면 중복 데이터가 이중으로 들어갈 우려가 있어서 작업량이 두 배로 늘어나기 때문에 다른 사람들은 업로드를 어떻게 했는지 살펴 보았다.

미국에서 TIGER(Topologically Integrated Geographic Encoding and Referencing)와 NHD(National Hydrography Dataset)  자료를 OSM으로 변환하여 업로드하려는 시도가 있었다. 자세한 내용은 귀찮아서 검색하지 않았다. 하여튼 요점은 미국에서도 개별적으로 지도 제작을 하던 사람들이 많이 있었고, 국가가 만들어놓은 엄청난 양의 자료가 있어서 그것들을 import하는 와중에 작업자들 사이에서 말이 많았나 보다.

내가 지금 하는 작업처럼, 이미 누군가 도로 작업을 해 놓은 것을 다 엎어버리고 표준 도로 데이터랍시고 올리면 과연 누가 좋아할까? 그들이 한 작업이 모두 일순간 삽질이 될 수 있는데! 하지만 그럴만한 값어치가 있다면야... 그리고 실제로 한국 지도 만들면서 가장 많이 삽질한 사람은 나다. 다른 사람들은 나만큼 수개월에 걸쳐 이렇게 OSM에 집착하지 않았다. -_-

OSM의 bulk upload 프로그램이 perl용으로 있지만 API 0.6과는 호환되지 않았다. 누군가 bulk_upload.py라는 API 0.6과 호환되는 python 스크립트 파일을 올려놨는데 그것도 문제가 있었다. 역시 내가 작성했던 프로그램과 마찬가지로 어떤 상황에서는 timeout이 걸리고 중단된다.

웹질을 열심히 해보니 OSM 메일링 리스트에서 딱 한 건의 article과 그에 대한 응답(서버 문제인지 클라이언트 문제인지 알 수 없다)를 찾았다. 업로드 에러에 관한 알맞은 답변은 찾지 못했다.

OSM이 비영리단체다 보니 OSM에서 생기는, 서버의 안정성 따위 온갖 문제들로 머리가 아프다. 질문자가 수정한 파이썬 업로더 프로그램이 내가 짠 프로그램보다 훨씬 간단해서(파이썬이 이렇게 좋은 언어였나?) 이걸 사용해 자료를 업로드하기로 했다. 게다가 통신 에러로 업로드 중 죽어도(요즘 OSM 서버가 엄청나게 느리고 간혹 접속이 안되는 등 별별 에러가 다 난다) 이전 업로드된 내역을 기억하고 있다가 죽은 시점부터 다시 업로드를 하는 아주 쓸모있는 기능이 있다.

파이썬 3.0.1에서는 스크립트가 실행되지 않아 2.6.2 버전을 Windows XP 머신에 설치하고 httplib2 파이썬 라이브러리를 설치했다. hashlib는 버전이 낮은지, 뭔가 문제가 있어 설치가 되지 않았지만 bulk_upload.py 작동에는 지장이 없었다.  python용 모듈은 mingw32나 Visual Studio 2008 버전에서만 제대로 컴파일 된다고 하는 기사를 봤는데 그거 설치하려면 또 세월이라 작동하는 정도면 굳이 모듈을 셋업하지 않았다. win32에서만 생기는 문제인 것으로 짐작되는 버그가 있어 소스를 조금 수정했다. 이 김에 python을 배워볼까?

개정된 업로드 스크립트는 changeset당 element 갯수를 5000개로 제한해 놓았고, 그 마저도 서버에 부담을 줄까봐 300개씩 끊어서 엘리먼트를 전송한 후 랜덤 딜레이를 30~90초 사이 준 다음 하나의 changeset을 전송한 다음, 다른 changeset으로 전환해서 진행하는 형태다.

최근에 서버를 바꿨다고는 하지만, OSM 서버가 어찌나 느리고 문제가 많은지 이 양반도 이런 식으로 밖에 업로드할 방법이 없었던 모양이다. 하긴 예전에 OSM 파일을 전송하는 프로그램을 짜서 돌릴 때도 엘리먼트가 초당 고작 1개씩 올라가는 꼴을 업무시간 내내 지켜보다가(스레드 10개가 동시 작업하고 있는 데도), 집에 퇴근했다가 다시 출근해서야 작업이 끝났다. 몇 시간 걸렸는지는 기억나지 않는다. 여기 블로그 어딘가 적어놓긴 했을텐데...

사무실 컴에 업로드를 걸어놓고 퇴근했다. 저수지 및 호수 데이터와 6만여개의 행정구역 데이터다. 집에서 새벽 1시쯤 원격 접속해 확인해 보니  업로드중 죽었다. 역시. 다시 실행했다. 다음날 아침 와보니 업로드가 끝나 있었다. 업로드한 파일 크기는 30MB 가량.

내가 OSM 작업을 처음 시작할 당시(올 3월 무렵) 남한 데이터 파일 크기는 8MB 였다. 남한은 안동과 대전, 서울 일부 지역을 제외하고 황무지나 다름없었다. 지금은(6월 현재) 230MB 가량으로 대폭 늘어났다. 이제 도로 작업이 남았다. 아무 생각하지 말고 그냥 확 올려버릴까? 도로 데이터가 350MB다. 올리는 것도 문제지만, 파일을 업로드하기 전에 좀 더 생각해 봐야겠다.

업로드가 끝나면 얼마나 후련해질까? 그동안의 삽질이 눈물젖은 과거가 되는 걸까? 1년에 한번씩 업데이트 되는 그놈에 '표준 도로'를 내년에 또 업데이트할 일이 생길까? 문화관광부 장관은 OSM 지도 보고 한국도 갈만한 깡촌이란 걸 깨달은 웨스터너들이 왕창 생기면 나한테  포상금을 쥐어주며 고마워할까? -- 사실 그런걸 바라고 OSM 작업을 하는 것은 아니다. 노무현 전대통령처럼 기록과 자료와 전승의 소중함을 안다. 그것이 아마도 내가 서양 문화에서 받은 가장 큰 영향일 것이다.

srtm2osm.exe 로 울릉도, 독도만 따로 변환했다. srtm2osm 프로그램은 더이상 업데이트가 이루어지지 않는다. 요즘은 groundtruth를 사용하는 듯 한데, groundtruth의 dem topo map은 작업중 프로그램이 죽어버리는 데다 생성된 osm 파일이 이해가 안 갈 정도로 이상해서 쓸모가 없다. 그래서 하는 수 없이 srtm2osm으로 작업했다.

사용자 삽입 이미지

게다가 울릉도 DEM 자료는 해발 980m 가량의 성인봉이 잘려 나갔고 군데군데 쥐가 파먹은 것 같은 구멍이 있다. 뭐가 잘못된 것일까.

사용자 삽입 이미지

globalmapper에서 다시 작업했다. 제대로 나온다. srtm2osm이나 groundtruth는 사용해선 안될 프로그램 같다. :)

울릉도, 독도는 DEM 및 표준도로 데이터와 coastline이 조금 어긋나 있었다. 그리고 어긋난 것은 지금으로썬 PGS의 coastline이 잘못된거지 싶다. 울릉도 표준도로는 웹 검색으로 구한 울릉도 트랙로그와 맞춰놓은  것이다.

지도 만들기 작업하면서 지도 만들고 MapSource로 볼 때면 MapSource가 동일 id의 지도를 볼 때 그 지도의 데이터를 캐싱해두기 때문에 제대로 작업이 된 것인데도 화면에 안 나타나는 경우가 있다. 그때는 맵소스를 띄우기 전에 C:\Documents and Settings\<사용자 ID>\Application Data\GARMIN\MapSource\TileCache 디렉토리의 파일을 모두 삭제한다. 그보다 간단한 방법은 만들어놓은 가민용 IMG 파일을 MapEdit에서 읽어서 확인하는 것. 하지만 전체 지도의 일관성을 확인하려면 최종 확인은 여전히 MapSource로 해야 할 것이다.

OSM2IMG를 개정했다. mkgmap.jar가 실행중 에러가 발생했을 때 에러 코드를 리턴하지 않기 때문에 사실 맵이 제대로 만들어졌는지 확인하기가 좀 힘들다. console output을 캡쳐해서 다만 에러 메시지만이라도 확인할 수 있게 했다. 또, MapSource에 설치할 때 registry에 자동 기록하고 registry 파일을 만들게 했다. 그리고 MapSource에 설치될 때 tile cache를 삭제해서 MapSource에 이상한 표시가 나오지 않도록 했다. OSM2IMG가 이제 썩 쓸만한 프로그램이 되었다. 이 김에 제대로 만들어서 배포할까?

한강 작업 때문에 메르카토르를 사용해 보고 어느 정도 쓸만하다 싶어 북한산 트래킹 코스 작업을 해봤다. Potlatch에서는 작업중 데이터를 날려 먹어 귀중한 3시간을 허비했다. JOSM에서는 WMS로 야후 맵을 출력하는 속도가 워낙 느려 답답했다. 메르카토르에서 두어 시간 작업하다가... 황당하게 프로그램이 다운되었다. 뭘 해도 쉽지가 않네? 간단한 작업에나 사용할 수 있을 듯. 메르카토르는 태그 에디팅이 좀 많이 불편한 편. 다음 버전 나올 때까지 기다려보자.
,
작업노트#7에서 언급한 지도 작업은 약 2주쯤 지연되었다.

사용자 삽입 이미지

2주 전에는 약 1주일 동안 OSM에 독도 그리기 작업을 했다. 그 동안 OSM 한국 지도에 독도가 없었다. 독도가 OSM에 아주 콩알만하게 나와 망망대해에서 섬을 찾을 방법이 사실상 없어 울릉도와 독도 사이에 관광 여객선 루트를 넣었다. google을 뒤져보니 누군가 울릉도에서 유람선을 타고 독도로 가는 동안 트랙로그를 남겨둔 것을 찾아서 작업은 쉽게 끝났다. 하는 김에 동해와 울릉도 관광선 경로도 완성했다.

사용자 삽입 이미지

아쉽지만 정확한 POI 정보가 없어 옛 선착장과 새 선착장 정도를 그리고, 어디서 줏어온 완전하지 않은 아웃라인(coastline)을 그려넣는 정도로 만족했다. 한국인의 독도에 대한 대단한 관심과 열정과 달리, 언제나 그렇지만(당연하게도) 데이터는 없다. 저 꾀죄죄한 독도의 몰골을 개선해줄 획기적인 방법은 없을까?

독도는 그렇다치고, topo 10m 작업과 전국 도로를 넣으니 자료가 무척 그럴듯하다.

사용자 삽입 이미지
사용자 삽입 이미지
완성된 두 지도를 MapSource에서 비교했다. 북한산 백운대 부근. 위엣 것은 SRTM3 10m, 아랫것은 비지니스 GIS에서 얻은 Topomap 30x30m 짜리. 파일 크기는 거의 비슷하지만, 등고선만 봐도 확연히 차이가 난다. OSM에는 topo map을 올릴 수 없다. 자료 자체가 너무 커서. 아래 지형도는 오차가 있는 듯 한데, 현재는 동측(easting) -30m, 북측(northing) -300m를 오프셋으로 주고 어거지로 맞춘 것이다. 전국의 4개 측점을 기준으로 재 보았으니 대충은 맞겠지만 아무래도 계산대로 나온 것이 아니라서 불안하다. 사실 등고선 지도의 정밀도를 측정할 방법이 없다. GPS자체도 믿을 수가 없고.

사용자 삽입 이미지


사용자 삽입 이미지
Map Level이 달라 두 지도의 등고선 표시 형태가 다르나, 어쨌든 그건 무시하고, 표준 도로 때문에 고속도, 국도, 지방도, 그리고 광역시에서는 시전역 주요도로 등이 나타난다. 아울러 이전 지도에서 도시 정도만 표시된 것과 달리 새 지도에서는 행정구역 대부분(시군구읍동리)을 보여준다. 여기에 water body(저수지, 호수 따위)도 추가되었다. 모든 주요 도로에는 번호와 이름이 붙어 있고 교차로 역시 이름을 갖는다. 그래서 POI가 15만개 가량으로 늘었다. 안 세봐서 정확한 숫자는 모르겠다.


사용자 삽입 이미지
사용자 삽입 이미지

그런데 문제가 있다. 지도는 한국에서 가장 작업이 잘 되어 있어 언제나 예로 들기 만만한 대전광역시. OSM에 있는 기존 도로와 표준 도로가 겹친다. 이걸 확대해 보면,

사용자 삽입 이미지
사용자 삽입 이미지

표준 도로는 중앙선 분리가 되어 있고 기존 도로는 중앙선 분리를 안 했다. 표준 도로는 중앙선으로 분리된 두 도로편의 벡터가 맞게 설정되어 있지만 기존 도로는 1차선 편도로 그려놓았기 때문에 방향 설정이 맞지 않다. 새 도로는 다른 도로와 연결(join)되어 있지 않다.

문제는, 추후 routable map을 만들 때 올바르게 방향이 설정된 도로 벡터가 필요하므로 표준 도로를 사용해야 하는데, 이렇게 되면 나를 포함한 남들이 수개월에 걸쳐 정성들여 작업한 기존 도로를 모두 지우고(그렇다. 그들의 노고가 완벽한 과거의 삽질이 된다) 연결이 안되어 있는 새도로의 연결을 일일이 손을 만들어줘야 한다(프로그램으로 자동으로 하려다가 대체 어떻게 해야 할 지 끔찍해서 중단).

일단 내가 작업한 도로(motorway, primary, secondary)는 자동으로 지우는 작업을 할 수 있을 것 같다. 이것도 시간이 걸리는 일이다. 남들이 만든 도로를 지울 때 어떻게 말해야 하나 싶다.

여하튼, 이 자료만 OSM에 올리면 사실상 한국 지도가 완성된다. 앞으로 진행할 작업을 생각하면 한숨이 나오지만...

이번 작업 정리:

사용자 삽입 이미지

남한 자료는 OSM 호스팅하는 Cloudmade에서 다운로드. 표준도로들.osm은 이전 표준도로 자료에서 레이어별로 뜯어낸 .mp 파일을 .osm으로 편의상 변환한 것들(곧 JOSM 등의 프로그램으로 OSM에 업로드할 것이다)로 여러개다. *.img는 topomap용 dem 데이터(다운로드 링크). globalmapper로 변환하니약 1시간 정도 걸렸다. mkgmap.jar는 *.mp 및 *.osm 파일을 입력으로 받아 garmin용 맵을 생성해준다. mkgmap.jar에는 이상한 버그가 있어 확장자가 .mp처럼 소문자이어야지만 처리한다. mkgmap.jar로 garmin map 파일 생성하는데 걸리는 시간은 대략 30분.

globalmapper용 파라미터 및 스크립트는 OSM 작업노트 #7: 작업 중간정리 참조.
mkgmap.jar 실행 파라미터:

java.exe -enableassertions -Xmx512m -jar "D:\gps\tool\mkgmap\mkgmap.jar"  --description="(C) 2009, luke" --mapname="34100000" --family-id=440 --product-id=1 --country-name="South Korea" --country-abbr="KOR" --code-page="1252" --name-tag-list="name:en,name:ko_rm,name" --transparent --ignore-osm-bounds --no-poi-address --add-pois-to-areas --lower-case --tdbfile --overview-mapname="44000000" *.mp *.osm

표준도로 데이터는 앞으로 1-2개월 안에 OSM 안에 삽입할 예정이다. 그러므로 부러 다운받도록 어딘가 올려둘 필요는 없을 것 같다. 나중에는 cloudmade.com에서 south_korea.osm.bz2만 다운받으면 되니까. 표준도로들의 원래 파일리스트:

고속도로.osm
국도.osm
지방도.osm
도심로.osm
교차로및지명.osm
국립공원.osm
저수지및호수.osm

GlobalMapper가 유료 프로그램이라 DEM의 MP 변환은 소스를 알려 줘도 쉽지 않은 일이 될 것 같다. 25개의 *.mp 파일들은 합쳐서 약 1GB 쯤 되는 데이터라 압축해도 어디 올려놓기는 뭣하다. 사실 정밀도 문제 때문에 공개한다는게 의미있는 일인지, 일단 한동안 검증부터 해봐야지 싶다.

한가할 때 최종 출력 파일만 공개할 생각이다. 설치도 번거로우니 간단한 인스톨러를 만들어야겠다.

,
작업 영역이 전방위적이라 정신 사나워서 중간 정리의 필요성을 느꼈다. 사실상 OSM 작업의 분수령을 이루는 시점이기도 하다.

사용자 삽입 이미지

OSM 작업을 하면서 지금까지 만든 프로그램과 라이브러리. 컬러 코딩: 파란색=Application, 빨간색=Library, 노란색=외부 라이브러리.

REW, NCAP, POI2OSM 프로그램은 다시 쓸 일이 없다. POI2OSM은 한글 로마자 변환할 때 참고하려고 가끔 쓰게 될 지도 모르겠다. 앞으로는 MP2OSM과 OSM2IMG 정도만 사용하게 될 듯. MP2OSM은 이미 perl 버전으로 누군가 만들어 놓은 것이 있으니 공개할 필요가 없고 OSM2IMG 역시 mkgmap의 front end로 사용하려고 만든 GUI wrapper이므로 공개할 일은 없을 것 같다. 결국 이 프로그램 전부는 한시적 작업을 위한 것인 셈.

이하 작업 설명에 사용하는 컬러 코딩: 연두색=입력 파일, 파란색=Application, 빨간색=출력 또는 작업.

사용자 삽입 이미지

POI2OSM은 세 종류의 입력 파일을 받는다. .CSV는 Garmin에서 POI Uploader 프로그램이 사용하는 포맷. .KML은 Google Earth에서 사용하는 포맷. .GPX는 GPS 관련 프로그램들 사이에 데이터 교환을 목적으로 만든 포맷. POI2OSM은 이런 입력 파일을 받아 .OSM을 생성하는데, 주로 POI 이름을 .OSM 포맷에 맞는 태그로 변환한다. 이때 사용하는 태그는 name(한글 및 영문 이름), name:en(영문 번역 + 로마자 발음 표기명), name:en_rm(로마자 발음 표기명)이다. 좌표 변환은 TM 중부 좌표를 변환하려고 끼워 넣었다. 예전에 얻은 자료가 TM 좌표라서 그것을 변환시키기 위해서다.

지하철역, 행정도시 등의 좌표 입력을 구글 어스에서 하고 구글 어스에서 생성시킨 .KML 파일을 .OSM으로 변환하기 위해서도 사용했다. 또한 GPS에서 얻은 POI 변환에도 사용했다.

사용자 삽입 이미지

REW/NCAP은 7만 여개의 POI 수집 작업 중에 사용하던 프로그램이다. 먼저 '대학교'라는 명칭 분류를 사용해 구글과 네이버의 검색 결과를 뒤져 대학교 이름들을 얻어오고 이것들을 Yahoo POI 검색에서 좌표를 얻어와 파일로 저장했다. 파일에는 명칭, 좌표 달랑 둘 밖에 없는데, OSM 파일로 변환하기 위해서는 적절한 tag가 가미되어야 한다. 예를 들어 신라호텔은 amenity=hotel 태그를 가져야 하고, 은평초등학교는 amenity=school 태그를 가져야 한다. 이런 명칭 분류는 수동으로 할 수가 없어 명칭에 포함된 특정 문자열을 검색해 그에 알맞는 태그로 변형시킨다.

최종 출력물 중 .KML은 이렇게 얻어진 좌표를 구글 어스에서 확인해(샘플 검사) 좌표 및 명칭이 올바른 위치에 있는지를 확인하기 위해서였다. 7만여개의 태그 분류는 거의 손으로 확인했지만, 7만개의 좌표의 올바름까지 다 확인할 수는 없었다. 프로그래밍과 별도로 명칭 수집과 분류에만 엄청나게 많은 시간을 소비했다. 문제가 많은 작업이고, 완벽할 수도 없었고, 이런 작업을 다시 할 일은 없을 것이다.

이렇게 해서 OSM에 넣은 자료와 손으로 그린 도로 지도(고속도로 따위)를 합치고 SRTM3 topo map을 합친 것이 최종 결과물이었다.

topo map을 만드는 과정도 만만치 않은 작업이라 어떻게 이를 단순화할 수 있는 방법을 찾다보니 osm의 몇몇 유틸리티가 dem2topo 프로그램과 마찬가지로 dem 파일로부터 등고선을 생성시켜 주는 것을 알게되었다. 하지만 이 프로그램 들을 사용해 topo map을 만들어 본 결과 이전 SRTM3 데이터보다 시간만 오래 걸리고 결과는 그저 그랬다. 애당초 SRTM3 데이터의 정밀도가 떨어지는 것이 문제인 것이다.

하여튼 이전 작업을 도표로 정리하면,

사용자 삽입 이미지

SRTM3 자료를 DEM2TOPO 프로그램을 사용하여 polished file을 만든 다음,

사용자 삽입 이미지

MapEdit와 cGPSMapper, MapSetToolKit, SendMap등의 프로그램을 이용해 .IMG를 만들고 이것을 MapSource에서 사용하도록 변환한다. 이 방법은 시간도 많이 걸릴 뿐더러 과정이 복잡하고, GPS에만 사용하는 데이터를 만드는 것 이상의 의미가 없다.

하여튼 DEM 자료의 정밀도가 떨어지는 문제부터 해결 방안을 찾기로 했다. 어떻게 방법이 없을까 고민하다가 http://www.biz-gis.com 사이트에서 상당히 정교한 DEM 파일을 다운로드 받을 수 있도록 공개한 것을 알게 되었다.  10m 정도에도 문제가 없어 보였다.

그래서 Topo map을 다시 작성하는 작업에 착수했다. 이번에는 globalmapper로 작업했다.

사용자 삽입 이미지

두 가지 문제가 있다. GlobalMapper의 script 버그로 25개의 파일을 스크립트로 변환하면 등고선을 10m 마다 따게 해 놔도 자기 멋대로 20m 단위로 따는 문제가 있다. global mapper의 버그로 추정된다. 25개의 파일을 일일이 하나 하나 변환하다 보니 시간도 시간이지만 변환이 아주 귀찮다. 변환 완료된 것을 보고 다음 파일을 또 변환하려니 일을 하면서 하루가 꼬박 걸렸다. --> 2009/05/22 Simplification factor를 지정해서 해결. dem 파일 변환에 사용한 스크립트:

GLOBAL_MAPPER_SCRIPT VERSION=1.00
UNLOAD_ALL
 
DIR_LOOP_START DIRECTORY="D:\GPS\DEM 2008" FILENAME_MASKS="*.img" RECURSE_DIR=NO
 
 IMPORT FILENAME="%FNAME_W_DIR%" PROJ_FILENAME="D:\GPS\DEM 2008\Korea TM.prj"
 
 GENERATE_CONTOURS INTERVAL=10 ELEV_UNITS=METERS SPATIAL_RES=30.0,30.0 FILL_GAPS=YES SMOOTH_CONTOURS=YES SIMPLIFICATION=3.0
 EXPORT_VECTOR FILENAME="%DIR%\out\%FNAME_WO_EXT%.MP" TYPE=POLISH_MP GEN_PRJ_FILE=NO TEMPLATE_FILENAME="D:\GPS\DEM 2008\template.mp"
 
 UNLOAD_ALL
DIR_LOOP_END

주의: .MP를 만들 때 MP Template file을 사용하지 않으면 metric을 meter로 지정해도 feet로 바뀐다. 스크립트에서 사용한 템플릿 파일(template.mp):

[IMG ID]
CodePage=1252
LblCoding=9
ID=02309485
Name=Korea
Elevation=M
Preprocess=G
TreSize=511
TreMargin=0.00000
RgnLimit=1024
Transparent=S
POIIndex=N
Copyright=2009, luke
Marine=N
Levels=4
Level0=24
Level1=22
Level2=20
Level3=18
Zoom0=1
Zoom1=2
Zoom2=3
Zoom3=4
[END-IMG ID

스크립트에서 사용한 프로젝션 파일(Korea TM.prj):

PROJCS["Transverse_Mercator",GEOGCS["Geographic Coordinate System",DATUM["WGS84",SPHEROID["WGS84",6378137,298.257223560493]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433]],PROJECTION["Transverse_Mercator"],PARAMETER["scale_factor",1],PARAMETER["central_meridian",127],PARAMETER["latitude_of_origin",38],PARAMETER["false_easting",199960],PARAMETER["false_northing",499700],UNIT["Meter",1]]

두번째 문제: 원본 DEM 자료의 projection이 TM인데 False Easting 20000, False Northing 50000, Scale Factor 1.0, Central Meridian 127.0, Latitude of Origin 37.0 으로는 남쪽으로 300m, 서쪽으로 65m의 오차기 있다.

어디서 들은 풍월이 있어 이런 저런 파라미터를 변경해 봤지만 문제가 해소되지 않았다. 그것도 일률적인 것은 아니었다. 데이터 파일에 따라 각기 다른 프로젝션으로 시도해 봤으나 역시 조금씩 에러가 있었다. 어쩌면 MapSource의 버그 때문일지도 모르겠다. MapSource는 이전 지도 데이터를 캐싱해 두기 때문에 .IMG 파일을 새로 만들었음에도 이전의 잘못된 프로젝션에 의해 나타난 데이터가 다시 나타나기 때문인지도 모른다.

하여튼 그래서 프로젝션 파일을 하나 만들고 파라미터를 조정해서 최대한 오차를 줄였다. False Easting 199960, False Northing 499700, Scale Factor 1.0, Central Meridian 127.0, Latitude of Origin 37.0 이건 아무리 생각해도 편법이다.

이 자료에는 울릉도가 빠졌다. 울릉도 부분은 SRTM3에서 가져와야 할 것 같다.

이렇게 해서 만든 10m Topo Map은 SRTM3에 비해 현저하게 부드러운 등고선을 보여준다. topo map이야 매일 작업하는 것이 아닌 이상 정확한 프로젝션과 엘립소이드 정보를 알면 더 이상 바랄나위가 없는 등고선 지도를 만들 수 있게 된다.

그 다음에 얻은 .MP 파일은 한국 전역의 고속도로, 국도, 지방도 및 분기점 정보다. 여기에 면 단위 행정구역과 저수지 정보 등 완전히 노다지를 얻은 기분으로 데이터를 쳐다봤다. GNS에서 16만개의 POI 정보를 얻기는 했지만, 이 자료는 여태까지의 OSM 작업을 대부분 삽질로 돌려버릴 정도로 임펙트가 강했다.

당장 .mp 파일을 .osm 파일로 변환시키는 프로그램 제작에 착수했다. 뭐 그래봤자 작업일수로는 이틀 걸렸지만.

사용자 삽입 이미지


mp2osm 프로그램을 누군가 perl, python으로 만들어 놓은 것이 있었다. 하지만 굳이 그 프로그램을 사용하지 않고 새로 만든 이유는, 이름 변환 따위의 후반부 작업을 통합하기 위해서다. *.mp 파일의 데이터 크기가 300MB 가량이라 스크립트의 느린 실행속도를 감내하기도 그렇고, 이왕 OSM 작업을 하면서 만들어놓은 각종 라이브러리가 있으니 차라리 프로그램을 짜는게 낫다고 생각.

mp2osm 프로그램은 아직 multipolygon 처리를 하지 않았다. 나중에 수계 데이터 쪽을 다루게 되면 그쪽 작업이 필요하다. 두번째로 *.mp 파일의 coastline이 OSM의 coastline보다 정밀해서 그것만 따로 따낼 방법을 찾아봐야겠다.

하여튼 이렇게 만든 .osm 파일을 이용해 MapSource용 .tdb와 GPS용 .img를 만들려니 문제가 생겼다.

사용자 삽입 이미지

*.osm 파일을 *.img로 변환시키기 위해 mkgmap.jar를 사용해야 하는데, 이렇게 만들어진 *.img는 MapsetToolkit/cGPSMapper에서 통합한 후 MapSource로 읽어들일 때 오류가 발생한다. 다 안되는 것은 아니고 .osm을 변환한 .img 중 딱 한 파일만 안되서 대체 뭐가 문제인지 원인을 찾느라 시간을 많이 소비했다. 아무래도 MapsetToolkit이 사용하는 cGPSMapper와 mkgmap 사이의 궁합에 뭔가 문제가 있는 것 같다.

이 방법은 예전부터 마음에 들지 않았다. 툴이 일원화 되어 있지 않고, 버그 투성이에, 특히 freeware 버전의 cGPSMapper는 routable map도 만들 수 없다. 그래서 mkgmap만 가지고 작업해 보기로 했다.

사용자 삽입 이미지

mkgmap.jar가 java 프로그램인데다, 옵션은 cGPSMapper만큼 많아 무슨 작업을 하려면 옵션 때문에 정신이 사나와 mkgmap.jar를 실행할 수 있는 GUI front-end인 OSM2IMG을 만들었다. cGPSMapper를 사용하지 않으니 만사가 다 해결되었다.  

사용자 삽입 이미지

.OSM 파일은 JOSM을 이용해 OSM database에 업로드할 수 있다. JOSM 버그인지 OSM 사이트의 버그인지는 확실치 않지만 10MB 정도의 .osm 파일을 JOSM으로 업로드하다가 중단되었다.  API가 아직 안정화되지 않아 다수 문제가 있지만 차차 안정화될 것이다. JOSM 띄우는 것도 버거워서 uploader를 만들었으나, API가 0.5에서 0.6으로 바뀐 부분을 반영하지 않아 호환되지 않는다.

내친 김에 topomap 자료인 10m 짜리 .mp 파일 중 용량이 비교적 작은 제주도를 mp2osm으로 변환한 후 osm2img와 mkgmap으로 .img를 만들어 보았다. 잘 된다.

궁극적인 목표는 보라색 테두리를 친 부분이다. 누구나(한국인을 비롯한 외국인 누구나) OSM에서 한국 지도 자료를 다운받아 mkgmap만 가지고 Garmin용 지도를 만들 뿐만 아니라 웹 상에서도 지도를 활용하는 것이다.
앞으로 할 작업 리스트

* 표준도로 mp파일에서 할 일들

* 작업 정리
* DEM 10m에서 해안선 뜯어오기
* 왜 25m의 오차가 생기는 것일까?
* 울릉도 도로 다시 테스트
* DEM 파일로부터 .osm으로 직접 변환 시도.
* 추후 표준도로 mp가 업데이트 되었을 때 일괄 변경 방법
* 기타 지도 작업

* 가져온 태그 정리(산,들판 따위 태그가 있음)
* 시/군/도 경계선 만들기
* osm

* korea map -- 기존 osm에서 한꺼번에 지울 방법과, 어떻게 지울지 방법을 궁리
* josm에서 큰 osm 파일을 보낼 때 fail 나는 이유 알아볼 것
* OSMbroker 개정(API 0.6)해서 업로드 가능하도록.

* mp2osm, osm2img 프로그램 업그레이드

* multipolygon 구현
* target dir 설치
* registry auto update
* registry read
* 표준도로파일에서 가져온 데이터의 태그 검증
* 지명및분기점.osm에서 불필요한 태그 정리

* mkgmap

* routable map을 만들려면 필요한 정보
* .osm contour 전체 파일 변환 시도
* level : 0:24,1:22,2:20 <-- 의미 명확하게 정리
* 맵의 레벨 정하기: osm_garmin_map.csv
* 개별 파일 단위로 옵션 주는 것
* .img 파일만으로 .tdb 생성
* style define

,
그저 일없이 미루고 있던 Garmin GPS용 OSM 지도를 공개했다. 이번이 두번째다.


OSM 지도 작업을 계속하다보면 다음 버전은 아마도 꽤 괜찮은 지도가 될 가능성이 있다.

* complete 국도, 지방도
 
 
위 사이트에서 얻은 자료(전국 단위 표준 노드링크 데이터)를 변환하는 작업. 원본 데이터나 polished file은 도로 선로를 2개의 polyline으로 만들었고 접점이 없어 사실상 변환해도 수작업이 들어가야 하고 그 때문에 나중에 routable map을 만들기 어렵다는 문제점이 있다. 그러나 지금처럼 도로를 손으로 그리는 길고 지루한 작업 보다는 자동변환하는 것이 낫다고(없는 것보다는 낫다고) 보고 있다.
 
* DEM 정밀도 향상
 
 
위 사이트 자료 적용 궁리. 테스트는 해 봤는데 TM 좌표계가 중앙 기준인 것 같아 동부나 서부의 오차가 어떻게 되는지 아직 테스트를 제대로 안해봤다. 하여튼 기존 SRTM 자료보다는 훨씬 부드럽고 깨끗한 10m 짜리 등고선  지도를 얻을 수 있었다. 자료 자체는 SRTM1과 같은 정밀도의 30m x 30m 인 것 같다.
 
* 전국 산행로 및 MTB(자전거도로) 지도
 
개인 및 여러 동호회에서 수집한 트랙 로그를 변환하려고 계획은 했으나, 저작권 등의 문제로 보류. 만약 그 분들이 osm에 트랙로그를 올려주면 공개할 의사가 있다는 뜻으로 받아들일 수 있지만, 동호회 자료를 수집해서 임의 가공하는 것은 문제될 소지가 있다. osm의 가치를 설명하고 설득하는 것이 좋겠지만(산행로 등을 공통 데이터베이스화하면 공공이익에 기여하게 된다 운운) 수개월째 생각만 하고 있는 중.

이 작업은 트랙로그의 GPS 수신 에러를 제거하고 normalize(경로를 단순화)한 후 여러 개의 트랙로그으로부터 경로 평균치를 구하여 편차를 줄인 산행로를 만들어 OSM에 올리는 일련의 작업을 자동화하는 과정이 될 것 같다. 아님 귀찮은데 대충 하고 말던가. 어차피 전국 어디가나 신작로처럼 변해버린 산행로에서 도로 오차가 2-3m쯤 난다고 누가 신경이나 쓸까? :)

,
전용 GPS에 장래가 있을까? 없어 보인다. 안드로이드폰 나오면 조금 지켜본 후 그걸 살 것이다. 구글맵을 캐싱해서 가지고 다니면 지금 들고 다니는 GPS도 사실상 필요가 없어진다. 전화도 받고 자전거 주행하거나 산에 올라가서도 지형도 및 지도를 파악할 수 있는데 뭣하러 값비싼 돈 주고 전용 gps를 사서 생고생을 해가며 없는 지도 만드느라 시간을 보낼까? 다만 전용 gps는 생명을 답보한 극한 상황에서 안드로이드 폰보다는 신뢰성있게 작동할 가능성이 높다. 어쨌거나 전용 GPS의 장래는, 예전에 PDA를 잡아 먹고 여전히 성장중인 스마트폰에게 잡아먹힐 것이다. 의심의 여지가 없다.

다음 GPSGIS에서 SRTM3가 정밀도가 떨어진다는 얘기를 듣고 정말일까? 평소 궁금하게만 여기고 귀찮아서 뒤져보지 않았던 SRTM3의 오차에 관해 찾아봤다: SRTM 자료는 기본적으로 이미지 같은 것이다. 하나의 픽셀에 대한 elevation level이 기록되어 있는데, SRTM1 자료는 쉽게 말해, 한 픽셀이 1초(arc second) 단위로 가로x세로 30mx30m인 영역으로, 그런 픽셀이 3601x3601 크기이다. 전 세계를 커버하는 SRTM3는 3초 단위(90m)로 픽셀 영역은 1201x1201이다. 가장 널리 사용되는 SRTM3는 높이 오차가 약 16m이다. 즉, SRTM3는 90m^2에서 고도 오차 16m인 데이터다.  
 
그다지 정밀한 자료 같아 보이지 않겠지만 어째서 SRTM3 자료와 GPS 바로미터의 고도차가 생각보다 크지 않았는지(오차가 적었는지) 알 수 있다. 경사도 15% (각도가 아닌 구배로 15m/100m)인 도로에서 SRTM3의 고도 오차를 제외한 인접셀과의 최대 오차는 15mx90m/100m = 13.5m. SRTM3의 높이 오차가 인접셀 사이에 비슷하게 평탄화되었다면, gps 고도 오차를 최소 2m로 감안하면 기약 100m 간의 직선 구간에서 10~20m 정도의 평균 오차 밖에 나지 않는다. 사실 DEM 자료를 만들 때 여러 가지 변수가 포함되어 오차 계산이 꽤 복잡할 것으로 추측되지만(오차 관련 자료: http://www2.jpl.nasa.gov/srtm/SRTM_paper.pdf
) 그래도 오차폭이 30m를 넘을 것 같지 않다.

한국에서는 도로 경사도를 15% 이상 넘지 않게 설계한다고 들었던 것 같다. 자전거 주행에는 SRTM3로도 문제 없어 보인다. 다만 산악 트래킹할 때 이 자료를 믿고 가다가는 절벽으로 추락할 수도 있다. 고도가 높은 산의 절벽면은 레이다 간섭 사각지대가 되어 void라고 부른다. 이것들을 제거하는 프로젝트가 있었다. http://srtm.csi.cgiar.org/
국내에서 지형도에 사용하는 데이터는 SRTM3를 사용하지 않고 항공 수준 측량을 한 것 같다. 그런 자료는 물론 공짜로 얻을 수도 없고 DEM으로 널리 배포될 것 같지 않다. 천상 SRTM3로 버텨야 한다.
 
GPS의 오차

위성이 무려 14-16개씩 잡히는 확 트인 개활지에서 gps 오차가 최저치인 +-2m임에도 도로를 벗어나는 궤적이 나타난다 -- 직선 도로를 주행한 후 트랙로그를 살펴보면 비뚤비뚤하다. 그것 말고도 샘플링 속도 때문에 자동차/자전거를 타고 고속 주행할 경우 트랙로그에 어쩔 수 없이 오차가 나타나기도 한다 -- 트랙로그를 1초 단위로 기록하면 고속으로 달릴 때 늦은 샘플링 속도에 따른 경위도 위치오차가 크게 벌어질 수도 있다. 트랙로그를 msec 단위로 기록하면 되지만 GPS의 작은 저장장치로 감당이 안된다. GPS 자체도 이들을 보정하기 위한 알고리즘을 사용하고 있는 것 같다. 하지만 자세한 정보를 얻지는 못했다.

마지막으로, 개활지가 아닌 좁은 소로처럼 수신율이 떨어지는 곳에서는 오차폭이 상당히 커진다. 도로폭이 3m 밖에 안되는 곳에서 양 옆으로 20여 m 높이의 건물들이 즐비하게 늘어서 있으면 수신율이 현저하게 떨어져 오차가 커지게 된다. 1차선 도로의 우측에 달라붙어서 가는 자전거의 경우 자동차보다 수신율이 떨어지는 것은 자명하다. 전용 GPS보다 수신율이 더 떨어지는 내비게이션 기기들은 그래서 내비게이션 화면에 나타난 현재 위치의 차량을 수신 좌표에 인접한 도로에 착착 달라붙여서 표시해 준다.

변산반도의 도로 지도를 yahoo aerial map만 보고 그렸는데 실 주행 데이터와 오차가 10m가 안 되었다. 사실 GPS에서 튀는 데이터가 있어서 GPS가 오히려 더 미덥지 않다. 구글맵스와 대조해봐도 마찬가지였다. 그말인 즉슨, 오차가 발생하기 쉬운 gps에 의존하여 OSM 지도를 그릴 것이 아니라, 오히려 Potlatch나 JOSM등의 백그라운드 yahoo map의 도로 윤곽을 보고 그리는 것이 낫다. 물론 residental/service road처럼 야후 항공 사진으로는 확인이 곤란한 지도에서는 gps의 트랙로그를 '참조'하여 지도를 그리는 것이 유리하다.

그래서 내 경우 OSM 지도를 그릴 때 GPS를 세컨드 디바이스로, 참조용으로만 사용했다. 믿을 수가 없으니까.
 
이런 저런 잡다한 작업을 하다가 다시 길을 그리기 시작했다. 사실 바빠서 길을 그릴 시간은 많지 않다.

OSM 서버가 최근에 업그레이드 되면서 API 버전이 0.5에서 0.6으로 올랐다. transaction과 비슷한 changeset이 도입되었고 database 접근은 전보다 훨씬 빨라졌다. 그러나 대량의 데이터를 가져오는데 자주 쓰곤 했던 XAPI는 아직 불완전해서 API로 업로드한 대량의 데이터가 XAPI로 반영되는데 시차가 존재한다. 4월 업데이트 이후 XAPI는 여전히 안정이 되지 않았다. XAPI query는 가끔 입력한 POI가 엉터리로 나왔다. 사실 좀 종잡을 수가 없다.
 
0.5에서 0.6으로 API가 바뀌면서 이전 프로그램과의 호환성이 떨어졌다. JOSM는 재빨리 업그레이드가 되었고 메르카토르는 조금 늦었다. Potlatch도 물론 업그레이드 되었다. 아쉬운 것은 XML 압축 규격이 없고, OSM 역시 XML 압축을 만들지 않아 데이터 전송량이 클 경우 전송 자체만으로도 꽤나 많은 시간을 소비한다는 점이다.

JOSM에서 사용하는 .osm 파일에도 변화가 생겼다.
 
<?xml version='1.0' standalone='no'?>
<osm version='0.6' generator='osmxapi: OSM Extended API' ...>
  <node id='368646044' lat='38.222193' lon='127.209948' user='...' action='modify' visible='true' version='1' >
    <tag k='name' v='Sample'/>
  </node>
</osm>
 
XAPI가 여전히 0.5 베이스로 작동하기 때문에 패치한 xml 파일의 버전 정보가 아직 없다. changeset이 도입되면서 이제는 way, node 따위의 버전을 체크하고 그것들을 변경시 증가시켜야 한다. 대량의 데이터 작업에서 xml diff를 사용케 하겠다던 것 역시 아직은 버그 때문에 적용되지 않았다. XAPI가 xpath를 지원하지 않고 단순한 bounding box를 사용하기 때문에 사실 이만저만 불편한 것이 아니나, 언젠가는 차차 안정화되겠지 하며 기다리고 있다.

새로운 API에 맞춰 만들어놓은 간단한 프로그램들의 OSM broker 소스를 개정해야 하는데... 좀 귀찮아서 관뒀다.

그동안 Potlatch 한글화를 했다. 메시지 한글화에 큰 의미는 없어 보인다. wiki 페이지도 한글화할까 하다가 누군가가 해 놓은 한글화만으로도 충분하다고 생각했다.

mkgmap과 srtm2osm 따위 프로그램을 사용해 지형도와 스트릿 맵을 완샷에 작업하는 스크립트를 짜느라 하루 정도 시간을 보냈다. 결론은, 참 쓸모가 없고 시간과 노력만 허비했다. 기존에 만들어놓은 지형도 데이터보다 정밀도나 해상도는 떨어지지만 시간은 좀 단축시킬 수 있다. 스트릿맵이야 원래와 같으니까 상관없다.

별도로, Wikiloc에 경로 그리기 메뉴가 추가되었다.
사용자 삽입 이미지
사실 정말 필요한 것은 gpx 업로드해서 gpx를 분석하고 트랙로그를 지도와 연동해 화면에 표시해주는 것 보다, 자전거 여행할 때 구글 맵이나 다음 맵 따위를 배경에 깔고 저것처럼 경로를 그려준 다음 gps에 업로드해 행복하게 트랙백을 하는 것이다. 그 정도 작업을 하려면 아무래도 웹 프로그래밍을 배워야 할 것 같은데 어째 시간이 많이 걸릴 것 같아 누군가 해주겠지... 아니면 구글 뒤져보면 누군가 만들어 놓았겠지 하는 막연한 생각만 들었다.

,

OSM 작업노트 #4: POI

GPS 2009. 3. 27. 16:31
OSM 컨테스트에서 격찬을 받은 Open Cycle Map 은 등고선 지도와 자전거 경로를 결합한 아이디어가 꽤 훌륭하다. 그래! 바로 이거다 싶을 정도다. 다음이나 네이버에서 지도를 가지고 개최 하는 사용자 매시업 프로젝트들처럼... 음... 시시껄렁하지 않다. 또는 google mymaps처럼 바보스러워 보이지도 않는다. 

OSM의 구현에서 엿보이는 simplicity는 무척 마음에 든다. 그래서 누가 이런 좋은 것을 만들었는지 뒤져봤다.

OSM의 공동 창업자(?) 중에 한 사람인 영국인 Nick Black 은 GIS 학과 졸업생 출신으로 복잡한 데이터 포맷과 족같이 비싼 GIS 소프트웨어 및 지도에 충격을 받고 2004년 오픈 스트릿 맵 프로젝트를 시작했다. 영국이나 한국이나 GIS 정보를 공공재로써 정부 차원에서 무상 공급하지 않는 사정은 매한가지인 것 같아 동병상련의 감정을 느낀다. 그리고 그들이 OSM 사이트를 만들고 5년이 지났다. 매트릭스화 된 영국 및 유럽과 달리 한국은 여전히 황량한 깡촌으로 남아 있다.
 
도로 작업과 POI 작업을 여러 번 했는데, OSM 작업이 제대로 반영되었는지 알기가 힘들다. OSM의 slippery map은 OSM database에서 데이터를 가공해 map tile을 만드는데 시간이 많이 걸리는 작업이다. 그래서 cloud computing 또는 clustering 등을 사용하여 tile을 분산 랜더링하는 프로젝트가 진행 중인 모양이다. 한국의 좋은 인터넷 인프라 사정을 감안하면 기회가 닿는대로 참여해야지 싶은데, 아직은 그것 말고도 할 일이 많으니 일단 보류.
 
하여튼 slippery map에 사용할 tile을 리얼타임으로 업데이트하는 실험적인 Tile Server 가 있다.

---
 
대전과 안동 지역 지도 작업을 누가 했는지 궁금했는데, 한국에 살고 있는 미국인 로버트씨가 70% 이상의 작업을 했단다. 그외 OSM 작업하는 한국인들은 여전히 거의 없는 실정. 로버트씨와 도로 분류 및 한글 로마자화에 관한 이메일을 몇 번 주고 받으며 토의했다. 한국 지도 만드는데 한국인은 없어서 외국인과 지도를 어떻게 만들지 토론 한다는 게 다소 희안하달까?
 
로마자화(로마음소화가 맞겠지) 보다 마음에 걸리는 문제는 한글-영문 변환이다. 경동초등학교-> Gyeongdong primary school은 쉬운 편이지만, '서원유통할인마트용호초등학교'는 어떻게 변환해야 할 지 감도 안 잡힌다. 자연어 처리는 매우 어려운 문제다. 일단 제끼고 단순 단어 규칙을 사용하여 변환하는데 촛점을 맞췄다. 따라서 결과가 경우에 따라 매우 한심할 수도 있다.
 
이전에 업로드한 POI를 대폭 수정하기 위한 작업을 벌였다. 이때 로버트씨와의 토론에서 얻은 몇 가지 정보를 반영했다. 명칭 태그는 3개로 나뉜다. name, name:en, name:ko_rm.  작업을 위해 OSM XAPI 를 사용했다.
 
노드 중 내가 작업한 것들'만' 가져오는 방법은 아래와 같다.
 
 
planet.osm 파일에서 직접 뜯어오려면 osmosis를 사용한다. 예.
 
osmosis --read-xml planet.osm --way-key-value keyValueList="railway.tram,railway.tram_stop" --used-node --write-xml city_tram.xml
 
---

사용자 삽입 이미지
강원도 주요 지방도를 끝냈다. 서울은 누군가 하겠지, 관심 없고, 주로 전라도, 강원도 등의 아무도 할 것 같지 않은 지역을 위주로 작업할 것이다. 지금은 도로 작업을 잠시 접고, 저번 한 주 동안 POI 수집에 열을 올렸다. 거의 일주일이 걸린 '프로젝트'가 되었다.
 
POI를 OSM에 업로드 하기 위해서는 갖은 작업이 필요하다.
 
명칭 수집
 
POI 수집 작업의 요점은 저작권 따위의 재산권을 침해하지 않으면서 자료를 모으는 것이다. 수집 작업은,  예를 들어, 초등학교 리스트를 얻어 초등학교의 좌표를 얻어오는 과정을 자동화하는 것이다. 초등학교 리스트를 네이버 검색 엔진에서 찾아온 1차 검색 결과를 그대로 사용하면 안된다. 왜냐하면 검색 결과의 소유권이 구글이나 네이버에 있기 때문이다.

구글이 web robot를 사용해서 웹 사이트를 수집하듯이 아주 갖은 지랄을 다 한 끝에 온갖 사이트를 검색하여 법적 하자가 없을 것으로 추측되는 9만 여개의 고유 명칭을 얻었다. 이 작업이 거의 7일 걸렸다.
 
POI 좌표 얻어오기
 
그리고 yahoo poi api는(한국 야후 만세!) 하루 5만건으로 제한하긴 했지만, 고유명칭을 알고 있으면 WGS84 좌표를 얻을 수 있다. 다만 야후에서 POI 검색으로 얻은 결과에 '야후에서 얻었음'이란 말을 달기만 하면 된다. 그러고보니 소프트웨어를 무료 공개해 인류 공영에 이바지 한다는 구글을 통해서는 뭐 하나 얻은게 없는데(얻으려 애썼지만 성과가 '0'이다) 야후는 구글처럼 떠벌리지도 않으면서 인류 공영에 이바지 하고 있다는 생각이 든다.

OSM 지도 그리기에 크나큰 도움을 주는 slippery map을 야후에서 제공하고 POI 검색도 야후에서 제공한다. 명칭 수집과 병렬로 진행된 이 작업은 5일이 걸렸다.
 
OSM HTTP Protocol
 
먼저 HTTP를 사용하여 OSM server와 통신하기 위한 프로토콜 스펙 을 알아야 한다.
 
UTF-8 코드 변환
 
Unicode로 작업했으면 했지, UTF-8은 나하고는 거리가 먼 포맷이었다. UTF-8 스펙과 정의에 관해서는 웹 페이지 여기저기에 워낙 자료가 많으니 생략하고, 핵심을 간단히 정리하자면,
  • UTF-8은 파일 및 web 전송때 한시적을 사용한다고 생각해야 할 포맷이다.
    Unicode는 프로그램에서 사용하는 포맷이다. 즉 UTF-8이건 나발이건 내부적으로 처리할 땐 무조건 unicode로 변환해야 편하다.
win32에서는 파일을 열 때(만들 때가 아님) UTF-8 파일임을 지정해 줘야 한다. (unicode도 지정해야 하나?) unicode 텍스트 파일의 경우 BOM(Byte Order Marker)를 파일의 첫 두 바이트에서 읽어 처리하기 때문에 별다른 처리를 하지 않지만 UTF-8 텍스트 파일은 UTF-8 플랙을 지정하지 않으면 영어를 제외한 언어 코드를 처리할 수 없다.
  • _wfopen_s(&f, filename, L"rt,ccs=UTF-8")
    fopen_s(&f, filename, "rt,ccs=UTF-8")
파일에서 문자열을 읽어올 때, vs.net에서 unicode 빌드의 경우 wchar_t로 변환되고, mbcs 빌드의 경우 char로 변환된다.
 
UTF-8은 ASCII 파일과 실질적으로 같기 때문에(7bit가 high일 경우 코드 페이지에 따라 3~4bytes로 해당 언어가 변행된다), 읽은 문자열을 파일로 저장하거나, 웹으로 전송할 때는 내부처리 포맷인 16bit(linux는 32bit인 것 같음) unicode를 UTF-8로 변환한 후 저장해야 한다. 관련 함수는,
  • WideCharToMultiByte(CP_UTF8, ...)
파일이 아닌(파일을 읽을 때 자동으로 변환해 주는 것이 아닌) UTF-8 코드는 아래의 함수로 변환할 수 있다.
  • MultiByteToWideChar(CP_UTF8, ...)
 
XML 처리
 
XML 포맷으로 저장되는 OSM 파일은 워낙 크기가 크기 때문에(planet은 6.4GB) MSXML이나 tinyXML 등의 DOM형 파서에서 처리할 때 메모리를 엄청나게 소비한다. 따라서 MSXML SAX2, MS XmlLite, Expat Libray 등의 stream XML parser를 사용하는 것이 바람직하다. (사실 MS XML library는 개인적으로 사용하지 않는다. 주로 tinyXML과 expat만 사용한다)

MSXML SAX2는 C/C++에서 사용하기가 귀찮고, xmllite는 platform SDK를 설치해야 하고 portabillity도 높지 않다. 역시 expat library가 가장 낫다.
 
좌표 변환도 공부했다. 일단 카 내비게이션 소프트웨어에서 자료를 얻을 수 있을 거라고 막연히 추측했기 때문인데 그리 도움은 되지 않았다. 하여튼 한국에서 사용하는 좌표계는 Bessel TM, Bessel TM128 (Katech), WGS84 등이다. 이중 TM128은 자동차 내비게이션에서 자주 사용하는 1점 좌표계인 듯. OSM은 WGS84를 지원한다. TM128을 WGS84 좌표로 변환하는 소스는 http://www.gisdeveloper.co.kr/337 에서 구할 수 있었다.

남은 작업

이런 과정을 거쳐 몇 가지 프로그램을 작성해서 POI를 수집하고 OSM 태그 붙이기를 자동화하고 OSM 파일로 변환하고 OSM Server에 POI를 올린다는 것이 시나리오다. 이들 자료는 나중 관리 목적으로 별도의 태그를 하나 더 붙일 예정이다.
 
 
,
OSM 파일로부터 IMG를 만드는 다양한 방법이 있다.   이중 해볼만한 방법들을 나열해 보면,

1. Planet.osm Dump 파일에서 한반도만 뜯어오기
2. 이미 만들어진 한반도 osm 파일 얻기
3. database에서 직접 osm 추출하기
4. Garmin GPS용으로 이미 만들어진 한반도 img을 사용하기.
 
1,2,4항은 일주일에 한 번 업데이트 된다. 보통 매주 수요일 UTC+1에 업데이트 되는 것 같다. 이중 1항은 시간이 워낙 오래 걸리고 작업량도 많아 그다지 추천할만한 방법이 아니다. 3항은 일주일 동안 기다리기 뭣할 때 사용할만한 방법이나, 한반도를 정확하게 추출하는 것이 아니고 시간도 꽤 걸리는 편이라 지도 작업 중 지도 변경 내용이 반영되었는지 한시라도 빨리 확인해 볼 때나, 최신 업데이트 자료가 필요할 때 사용할 방법이다. 4항이 가장 쉽지만 4항은 만들어진 img 파일의 세부 내용을 수정할 방법이 없다. 예를 들어 routable map을 만든다던가...
 
1. Planet.osm Dump 파일에서 한반도만 뜯어오기
 
매주 수요일 오전 1시에 planet.osm을 덤프한다. 여기에 매일/매시간 단위로 diff 파일이 생성된다. 자료는 아래 url에서 구할 수 있다.
 
 
OSM 사이트는 속도가 느리므로 mirror site에서 직접 다운 받는 것이 시간을 절약하는데 도움이 된다.
 
 
이중 ftp.snt.utwente.nl 사이트가 가장 빠른데, 그래도 5.4GB(2009-3-18일 기존) 짜리 파일을 다운 받으려면 무려 2시간이 넘게 걸린다. 하여튼 이렇게 다운받은 planet 파일에서 한반도 부분만 따내야 한다. 이때 사용하는 프로그램이 Osmosis이다.
 
일단, 한반도를 따내기 위해서는 polygon filter file이 필요하다. polygon filter file format 정보는 아래 url에서 구할 수 있다.
 
 
이미 작업되어 있는 파일이 있으므로 굳이 필터 파일을 만들 필요는 없다. 남한 필터 파일('south_korea2pts.txt')은 아래 url에서 구할 수 있다.
 
 
planet.osm 파일에서 한반도를 뜯어오려면 컴퓨터에 다음 프로그램들이 설치되어 있어야 한다.
 
 
planet 파일(planet-latest.osm.bz2), 남한 필터 파일(south_korea2pts.txt), osmosis.jar 파일을 같은 디렉토리에 넣고 다음 명령을 실행하면 korea.osm.bz2 파일이 생성된다.
 
java -Xmx1048m -jar osmosis.jar --read-xml enableDateParsing=no file=planet-latest.osm.bz2 --write-xml korea.osm.bz2 --bounding-polygon file="south_korea2pts.txt"

또는,
bzcat planet-latest.osm.bz2 | java -Xmx1048m -jar osmosis.jar --read-xml enableDateParsing=no file="-" --write-xml korea.osm.bz2 --bounding-polygon file="south_korea2pts.txt"
 
DateParsing을 하지 않으면 속도가 좀 빨라진다. osmosis에서 bz2를 프로세싱하는 것보다 bzcat을 하는 것이 속도가 빠르다. bz2 파일을 풀어놓고 작업하면 속도가 빠르다. 다만 파일 크기가 워낙 커서 디스크 공간을 많이 차지한다.
 
2. 이미 만들어져 있는 한반도 osm 파일 가져오기
planet.osm으로부터 각 국가별 파일을 만들어 다운받기 편하게 만들어놓은 사이트가 있다. 이곳 자료는 1주일마다 업데이트 된다. osm 파일 뿐만 아니라 garmin GPS용 IMG 파일도 이미 만들어 놓았다.
 
 
3. database에서 직접 osm 추출하기

데이터베이스에서 XAPI query(http://wiki.openstreetmap.org/wiki/XAPI)를 사용하여 korea.osm 파일을 생성한다. 이때는 한반도의 polygon을 지정할 수 없으므로 bounding box(사각형 박스)를 사용하여 얼추 비슷하게 만드는 수 밖에 없다. 가장 rough한 bounding box는 경위도가 다음과 같다: 125.3,129.8,33.0,38.7 이 좌표는 울릉도가 빠지고 일본의 대마도와 큐슈가 일부 포함된다.
 
바운딩 박스의 범위를 알고 싶을 땐 http://www.openstreetmap.org/ 의 export 메뉴에서 직접 해 보면 된다.
 
하나의 바운딩 박스로 한반도 전체를 가져오면 파일크기는 100MB 가량(2009-3-18 기준), 시간은 30분 가량 걸린다. 다운 받기 위해서는 web browser에서 다음과 같은 형태의 url을 타이프한다.
 
 
또는 wget utility를 사용할 수도 있다.
 
wget http://www.informationfreeway.org/api/0.5/*[bbox=125.3,33,129.8,38.7] -O korea.osm
 
바운딩 박스에 울릉도가 빠지고 일본의 대마도와 큐슈가 포함되는 걸 원치 않는다면 파일을 여러 개로 쪼개 다운받는다. 여러 개로 쪼개 병렬로 다운 받으면 속도 상의 이득이 있다(다운 받는데 약 5분).
 
wget http://www.informationfreeway.org/api/0.5/*[bbox=126,33,127,34] -O jeju.osm
wget http://www.informationfreeway.org/api/0.5/*[bbox=125,34,129,35] -O korea1.osm
wget http://www.informationfreeway.org/api/0.5/*[bbox=125.5,35,130,37] -O korea2.osm
wget http://www.informationfreeway.org/api/0.5/*[bbox=125.5,37,131,39] -O korea3.osm
 
---

1,2,3 어느 방식을 사용하든 최종적으로 한반도의 osm 파일을 얻을 수 있다. 이 파일을 Garmin GPS IMG 포맷으로 변환시키려면 GroundTruth Mkgmap 을 사용한다.
 
GroundTruth를 사용해서 Garmin GPS용 IMG를 만들려면 cGPSMapper 프로그램이 필요하다. cGPSMapper 프로그램을 설치한 후 GroundTruth가 설치된 디렉토리에 통째로 복사해 놓는 것이 편하다. 또한 Rule 파일의 수정이 필요하다. 일단은, 영문 Garmin GPS용 한글 지도를 만들려면 설치된 디렉토리에서 Rules/DefaultRules.txt 파일에서 name 태그를 name:en으로 바꿔줘야 한다. 자세한 내용은 GroundTruth help 참조.

groundtruth는 wget 없이 database에서 osm 파일을 직접 생성할 수도 있다.
 
groundtruth getdata -b 33,125.3,38,129.8 -o korea.osm
 
생성된 OSM 파일을 이용해 IMG 파일을 만든다. 자세한 옵션은 groundtruth help를 참조.
 
groundtruth --osmfiles=jeju.osm,korea1.osm,korea2.osm,korea3.osm --mapid=33361200 --mapname="Korea OSM Map" --fc=200 --productcode=200 --productname="Korea OSM Map"
 
mkgmap을 사용하면 아래와 같이 타이프한다. 자세한 옵션은 mkgmap help를 참조.
 
java -Xmx512M -jar mkgmap.jar --mapname="33361200" --description="Korea OSM Map" --country-name="Korea" --country-abbr="KOR" --transparent --name-tag-list=name:en,name:ko_rm,name jeju.osm korea1.osm korea2.osm korea3.osm
 
이렇게 해서 생성된 *.IMG 파일을 MapsetToolkit과 Sendmap 프로그램을 이용해 Garmin Mapsource와 Garmin GPS용 파일을 만든다.

최종 결과물은?
사용자 삽입 이미지

어느 분이 도로 작업을 끝내 놓은 대전시를 Garmin MapSource에서 본 것.
사용자 삽입 이미지

대전의 확대 부분

감동적인 결과물. 이 맛에 작업한다.

,
도로에서 motorway는 고속도로(번호 및 이름 지정), trunk는 고속화 도로 및 국가가 관리하는 주요 간선(지도에서 보통 도로 번호가 동그라미 안에 표기된다. 이름이 있을 수도 있고 없을 수도 있다), primary는 지방이 관리하는 지방도(지도에서 도로 번호가 네모 안에 표기된다. 구간에 따라 특정한 이름을 가질 수 있다), secondary 및 tertiary는 주요 도시의 내부 교통을 잇는 도로(번호는 없으나 도로 이름을 지정), resident는 골목길(역시 이름만 지정)로 하면 맞겠지 싶다.

서울에는 보통 지방도로보다 차선 수가 많은 도로가 생길 수 있다. 이들 도로는 lanes로 차선 수를 지정하는 것으로 해결해야 할 것이다. 안 그러면 조그만 중소도시의 시 내부를 연결하는 도로에 마저  trunk나 primary를 지정하게 되는데, 이들은 관리되는 주요국도, 지방도가 아니면서 실제 화면에 나타날 때는 주요 도로처럼 보이게 된다.

자전거길(cycleway)과 트래킹로/도보로(footway)는 지금 생각하기엔 사치다. 그들 관련 자료는 많다. 그것들은 적절히 편집하고 정규화한 다음 track reduce해서 일괄적으로 올리는 것이 바람직하다.  사실 cycleway와 footway 용도의 gps 자료는 신뢰성이 떨어진다. 이건 나중에 다시 언급...

한국 지도 제작에 여러 사람들이 협력하여 지도를 만들려면 한국 지도 제작 가이드가 가장 먼저 필요하지만 글쎄다... 일단 OSM 명명 규칙에 관해 기존 OSM 다큐멘테이션을 참조해 주요 요소에 대한 대략의 정보를 정리했다. 때가 되면 편집해서 올릴 것이지만(더 좋은 것은 누군가 편집해서 가이드라인을 올릴 때까지 기다리는 것이지만) 내가 아직 POI 관련 작업을 본격적으로 시작한 것은 아니다.

지도 제작을 해 보니 딱 이 말이 떠오른다. "안 해봤으면 말을 하지마." 고민해야 할 것들이 꽤 많다. 이전 아마추어 지도 제작자들은 그런 고민을 해봤다. 따라서 지도 제작을 하려면 먼저 선구자들로부터 배워야 한다. 아니면 '안 해봤으면 말을 하지 마' 류의 온갖 시행착오를 다 겪어 보던가.

대표적인 예: 이전 POI 작업할 때 이름 때문에 고민했는데 작업 전에 일본쪽 자료를 참조했더라면 도움이 되었을 뻔 했다. 일본 역시 로마자 표기 문제로 name 태그를 여러 개로 분할했다.
 
name:korean (english)
name:en=english
name:ko=korean
name:ko_rm=korean romanization
 
예:
 
name=상명여대 (Sangmyong Women's University)
name:en=Sangmyong Women's University
name:ko=상명여대
name:ko_rm=Sang-myong-yeo-dae
 
이미 올라가버린 이름을 어떻게 할 수는 없고, 나중에 OSM 자료를 통째로 다운받아 이름을 rewrite하는 자동화 프로그램을 짜야할 것 같다. 4월 이후에 OSM protocol 0.7(0.6이던가?)로 교체되면 그때 가서 천천히 생각해봐도 늦지 않다. 

작업 중에 영문 이름을 병기하려면 작업 시간이 많이 걸리므로 일단은 한글 이름만 입력하는 편이 낫겠다. 먼저 한글 이름 입력 후 나중에, 정기적/부정기적으로 일괄 수정.
 
POI는 여전히 심각한 문제다. 간단한 데이터라면 입력이 가능하지만 별다른 뾰족한 방법이 떠오르지 않는다. 그렇다고 상용맵을 해킹할 수는 없다. 일단 이렇게 생각하기로 했다.
 
서울시가 wikipedia에 서울의 여러 지역을 설명하는 프로젝트를 진행한다고 했으니 서울의 POI는 시간날 때 서울시에 제안 메일을 보낼 생각이다. http://oasis.seoul.go.kr
 
서울시와 마찬가지로 다음 공공기관과 연락해 본다.
 
한국관광공사
국립공원관리공단
각 시도 지자체
 
이들 공공기관/단체는 가지고 있는 POI를 공개하거나, 심지어 해당 관청이 공무원을 동원해 openstreetmap에서 직접 작업할 명분이 있다.  관광안내 팜플렛 수십만부 찍어 외국에 뿌리는 것보다 더 효과적인 대외 관광 산업 지원 및 활성화라는... 4월쯤에 메일을 보내 한글 명칭, 가능하면 영어 명칭, 경위도 정보 정도만이라도 보내주면 내가 작업해서 올려 주겠다고 설득해 봐야겠다.

국립지리원은 세금 걷어 지도 그려서 그것을 국민에게 돈 받고 팔아먹는 희안한 기관으로 보여 컨택을 해야 하나 망설이게 된다. 그래도 (내가 잘못 알고 있을 수 있으니) 시도는 해 봐야겠지?

몇몇 학과 학생들은 GIS 자료를 다룬다. 학교의 교수님들을 통해 과제나 프로젝트로 openstreetmap을 하라고 설득하는 것도 의미있다. 그들이 가지고 있음직한 공개되지 않은 엄청난 양의 자료를 OSM에 올릴 수만 있다면...

OSM Korea Mapping project에 wiki page를 등록한 사람은 2009년 3월 16일 현재 6명 뿐이다. http://wiki.openstreetmap.org/wiki/Category:Users_in_Korea 참여를 독려할 마땅한 방법도 없고, 여기 저기 OSM을 선전하기가 실은 귀찮다.
 
싫증날 때까지만이라도, 하다보면 머리가 멍해지는 도로나 계속 그리자. 이것들은 향후 아무짝에도 쓸모없는 삽질로 밝혀질 가능성이 아주 높다. 그러나 내 인생의 한 때에 공공의 복리를 위해 삽질한 적이 있다는 시시한 자긍심은 남게 될 것이다.
,

OSM 작업노트 #1: Tool

GPS 2009. 3. 10. 20:40
Potlatch 0.10f 버전은 작업 중 실시간으로 OSM 자료를 가져오므로 conflict가 발생할 가능성이 적다. 반면, JOSM은 한 페이지를 에디트할 때 이전 데이터를 로드해두지 않으면 작업 내용이 충돌할 수도 있다.
 
potlatch가 비교적 쉽게 작업할 수 있는 반면, 잘못 작업하고 나서 할 수 있는 일이 undo밖에 없어 다른 사람이나 다른 시간에 작업하고 수정하거나 삭제하기가 어렵다. JOSM은 그런 문제가 없다.
 
potlatch에서는 gpx로 작업할 수 없다. 오직 path(track)을 upload하기만 가능하다. JOSM은 GPX를 레이어로 깔고 새로 라인을 그리는 것이 가능하다. JOSM의 단점은 메모리를 많이 먹는다는 것. 그리고 데이터베이스 접근 속도가 아주 느려서 서울 버스 정류장 약 24000여개의 데이터를 업로드하는데 무려 하루가 걸렸다. OSM의 데이터베이스 엑세스가 느린 탓일까?
 
일단의 이유로 고속도로를 그리는 작업에서는 potlatch를 사용하고, POI를 입력하거나 잘못된 정보를 수정할 땐 JOSM을 사용했다. merkaartor는 버그가 여럿이지만 JOSM 보다는 빠르다. 안정화되면 JOSM에서 메르카토르로 전환해야 겠다.
 
네이버 항공사진과, potlatch 또는 JOSM이 사용하는 야후 항공사진은 같은 자료다. 현재로써는 대조작업용 맵으로 다음 맵+항공 사진 오버레이가 국내에서 구할 수 있는 지도 중 가장 좋다. 네이버 맵에는 이상한 버그가 있어 대조 작업 중 가끔 브라우저에서 마우스 휠 버튼이 작동하지 않는 현상이 있다.
 
OSM이 사용하는 데이터베이스는 postgres를 변형한 postGIS이다. GIS 정보를 다루는데 특화되어 있다. 날이 갈수록 눈에 띄게 데이터베이스 접근이 느려진다.
 
앞으로 시간을 들여서 할 일은 osm 데이터를 직접 패치해 오는 것(과 이것을 로컬 db에 저장해서 지도를 빠른 속도로 수정 하기). 그리고 그 자료를 Garmin IMG 포맷으로 바로 변환한 후 한국 지형도와 합치는 작업을 자동화하는 것이다. OSM Composer라는 프로그램이 이들 작업을 자동화해주는데 DEM 파일 처리할 때 메모리를 엄청나게 사용하며 다운되기 일쑤였다.

지금은 작업에 참고할 지표를 만드는 중이고, 본격적으로 작업이 시작되면... 내가 가고 싶은 곳이나 흥미가 당기는 곳을 주로 하기로.
,

리만 가설

잡기 2009. 3. 10. 20:33
바쁜 나날.
 
틈틈이 시간 나는 대로 OpenStreetMap에 자료를 입력하고 있다. 주요 고속도로 그리기가 거의 끝났다. 현재 작업한 POI는 도시명과 전국 지하철역, 그리고 24000여개의 서울시내 버스 정류장 정보다. 하루 평균 1~2시간씩 지금까지 약 10일 작업했다.

OSM: 한국
OSM 한국 지도. 별 것 아닌 것 같지만 거의 열흘이 걸려서 고속도로가 어느 정도 완성되니 흐뭇하다.

OSM: 서울
83개의 도시, 전국의 573개 지하철역 위치를 손으로 입력했다는 걸 누가 알아주기나 하겠어? 오늘은 86개의 행정 단위 군을 입력할 것이다. 이번주까지는 전국 대학 위치 정보 입력이 가능할 것 같다.

POI만 얻을 수 있어도 단순 변환하는 것만으로 OSM을 럭셔리하게 꾸밀 수 있지만  대한민국에서 이들 정보를 무료로 공개한 곳은 없는 것으로 알고 있다. 아쉽다. 그래서 내가 GPS에 사용할 목적으로 OSM을 거의 사적인 지도로 만들고 있는 셈. 나만 쓸게 아니라 이왕 하는 김에 한/영 표기를 함께 하기로 했다(think globally, act locally). 이 때문에  간단한 한글-로마자 번역 프로그램을 작성했다.
 
한글의 영문(로마자)표기법 개정안이 2000년에 나온 건가? 무려 9년 동안 모르고 있었군. 한글을 영문 표기로 변환해 주는 쓸만한 소스가 잘 눈에 띄지 않아 할 수 없이 '매뉴얼' 보고 만들었다. 맞는지 틀리는지 일일이 점검해 보지 않아 모르겠다. 표음 규칙들, 자음동화와 구개음화 대부분은 구현했지만, 몇몇 규칙들은 의아해서 내버려 뒀다. 캐멀 케이스(봉화->Bongjhwa가 아닌 BongHwa)와 하이픈 사용(Bong-hwa), 문자열 전/후방위 대치 등을 포함하고 facility tag를 붙일 수 있게 해 같은 범주의 POI에 대해 일괄 변환이 가능하도록.
 
지명 등의 고유 명사는 괜찮지만, '서울역사박물관'을 SeoUlYeokSaBakMulGwan 으로 변환한다. 외국인이 내국인에게 길을 물을 때는 표음으로 된 것이 맞긴 한데,  저렇게 되면 외국인은 이게 박물관인지 알 길이 없다. 그러므로 표기는 Seoul History Museum과 SeoUlYeokSaBakMulGwan 을 병기해야 하지 않을까? 이게 아주 귀찮은 일이라 일단은 표음으로 내버려 두고 고유 명사에 번역 가능한 일반 명사가 섞여 있을 때는 변환할 것인가를 선택했다. 벽제주유소삼거리 -> ByeokJe Petrol Station SamGeoRi. 문맥을 파악하지 않는 단순 문자열 대치이므로 은행나무입구사거리가 'Bank NaMu Entrance Crossroad' 가 되기도 한다.
 
한글 처리는 언제 뭘 하게 되도 기분이 나빠진다. 한글 처리를 하려면 준비해야 할 것들이 워낙 많다. 특히 조사 생략에 임의 띄어쓰기 같은 것은 난감하다. 처리를 제대로 하려면 코퍼스를 가지고 빈도수 통계를 내고 그 통계에 따라 확률 기반 마코프 체인을 구성해 렉시컬 아날라이저를 꾸미고 태깅을 하던 어떻게든 해야 할 듯. -- 이런 자연어 처리 따위를 학계나 정부에서 만들어(이미 만든 것들이 있다) 누구나 쉽게 사용할 수 있도록 공개하면 얼마나 좋을까? 한국에서는 꿈같은 얘기겠지? 공공재화로써 전자 지도 한 장 없어서 외국 공개 프로젝트 홈페이지에서 생노가다로 도로 그리고 POI 입력하는 판인데.

POI2JOSM
POI2JOSM: 한글 표기된 POI(또는 GPS에서 추출한 waypoint)를 그에 상응하는 영문 표기명으로 바꿔 OSM 포맷으로 저장하는 프로그램. 이 파일을 JOSM에서 불러들여 OSM에 한꺼번에 업로드하면 작업 시간을 절약할 수 있다. 입력 가능한 파일은 KML(UTF-8), GPX(UTF-8), Garmin CSV(POILoader에서 사용, ASC) 이고 출력 파일은 .OSM(UTF-8). 추후 생각나면 버전업할 항목:
 
- GPX -> GPX(한글을 영문으로 바꾸기만 해서) 옵션 추가.
- gpsbabel을 이용, 다양한 확장자의 파일을 직접 다룰 수 있게 한다.
- 한글 변환 풀옵션.
- postfix, prefix
- 상용어 변환 테이블 외부 파일로.
- 입력한 문장 즉시 변환 출력해서 클립보드 in/out
 
작업자가 워낙 적어(실은 나 밖에 없는 것 같다) 프로그램을 공개하지 않았다.
 
메모: Visual C++ 2005 runtime 및 MFC의 unicode 파일 핸들링은 올바르지만 JOSM은 unicode BOM이 없는 파일만 정상적인 파일로 간주한다. linux에서는 unicode BOM이 없는 파일이 흔하긴 하니까 자바도 마찬가지인 것 같다. windows에서 파일을 UTF-8로 생성/저장하고 나서 파일의 첫 3 bytes로 들어가는 unicode BOM을 제거해야지만 JVM에서 작동하는 JOSM이 정상적으로 파일을 읽는다. 나중을 위해 이 3바이트 제거하는 것을 옵션으로 빼놨다.
 
지리산길 -- 완성된 줄 알았는데 아직도 동네 할아버지들이 삽으로 다지고 있는 중인가? 아내하고 애 데리고 한 번 가려고 했는데... 제주 올레는 약 15년 전에 가봤다. 남부 해안선 도보 일주, 한라산 횡단, 그리고 오름 몇 개 오른 정도? 서귀포시에서 한라산 방면으로 올라가기도 하고. 두 번은 자전거를 타고 돌았다. 그중 한 번은 폭풍우가 치는 날에 텐트 치고 비 맞으면서 잤다. 두번째 자전거 여행 빼고는 딱히 재미가 없었다. 회는 정말 맛있다. 하여튼 재미없는데(고생만 했는데) 다들 재밌다니, 재미있다. 동해올레란 것도 만들려나 보다. 그쪽 길도 재미없긴 마찬가지다. 지리산길에는 바람도 안 불고 햇볕을 피할 그늘이 간간이 있을 것 같다. 어쩌다 보니 그것이 지리산길의 유일한 장점처럼 보인다.

0.001mm 침범하면 천백배 보복할 것
-- 0.001mm의 천백배 보복이면 11mm냐? 미국엔 입도 벙긋 못하면서 상대적 약자(?)인 한국은 갈구는구나. 이명박 정권이 물론 잘못했지만 때만 되면 민족입네 어쩝네 하면서 발광하는 너같은 놈더러 비열하다고 하는 거야.

3월 8일 자전거 타고 헤이리에 갔다왔다. 주행시간: 4h30m, 쉰시간: 1h10m, 주행거리: 90.6km, 평균속도: 20.0kmh.

일산에서 출발하면 왕복 50km 거리의 썩 괜찮은 하이킹 코스가 되지만, 집에서 출발하니 반나절 거리가 되어 버렸다. 코스: 연신내역 -> 구산역 -> 원당역 -> 일산 -> 이산포 IC -> 자유로를 따라난 샛길을 죽 진행 -> 자유로 휴게소,  파주출판단지 -> 헤이리, 헤이리 영어마을.

파주 출판단지
파주 출판단지에는 처음 와봤다. 알만한 출판사 이름이 꽤 여럿이다.

송촌교에서 바라본 공릉천
송촌대교와 나란히 있는 송촌교에서 찍은 공릉천. 헤이리 사진은 안 찍었다. '문화예술촌'이란 것이 나한테는 '집창촌'같은 느낌이라서. 돌이켜 생각해 보니 파주출판단지도 집창촌 같은 느낌이었다. 건축이 주는 분위기 탓, 길가에서 호객하듯이 곱게 꽃단장하고 서 있는 건물의 열에 들어갈 마음 보다는 후다닥 지나치고 싶은 기분이 드는 점 때문에?

아니다. 집창촌이 집단창작촌의 약어라고 들은 기억이 난다.

돌아오는 길에 자유로 휴게소에 들러 라면을 사 먹었는데 꽤 잘 끓인다. 휴게소는 바이크 라이더들의 집합소 같았다. 몇 년 새 자전거 타는 사람들이 부쩍 늘었다.

일산 호수공원
돌아오는 길에 일산 호수공원에 들렀다. 해질 무렵이 되니 기온이 떨어졌다. 작년 11월에 창고에 쳐박아 두었다가 지금까지 정비 한 번 제대로 안 하고 타는 자전거를 보니 온통 흙투성이다. 올해 자전거를 네 번 탔는데, 탈 때마다 오프로드 구간을 지났다.  이번 주행은 유난히 요철이 많아 골이 많이 흔들렸고 가랑이 사이가 아팠다. 위 사진은 아픈 부위를 표시한 것. 아... 이 고물 자전거...

책 '리만 가설' (리만 가설 소개 홈페이지): 홀수 장에는 수열, 로그의 특성, 자연지수, 간단한 미적분 따위 리만 가설을 이해하기 위한 수학적 배경 지식을 소개한다.  고등학교 수준. 짝수 장에는 리만 가설의 배경과 역사를 실었다. 읽기 어려운 '수학 교양서'라서 오랫동안 읽지 않고 버티다가 요즘 읽을 것이 없어 읽었다. 첫 장부터 흥미진진. 오일러의 golden key가 등장하는 1부의 중반부에서 요새 개그맨들 말로, 빵 터졌다. 소수 정리가 이렇게 간단하단 말이야?  황금열쇠:


그럴리가... 해석학은 머리에 쥐나는 분야다. 간단하게 설명하는 것이 재주다. 수학교양서를 읽을 때마다 느끼는 거지만, 읽기 전까지 읽기를 지체하면서, 정작 읽으면 정신없이 읽고 히히덕거리게 된다. 왠만한 지식 전달 위주의 넌픽션은 시간당 50~60p 정도 진도가 나가는데, 이건 무려 75pph(pages per hour)가 나왔다. 얼마나 재미 있었으면 지하철도 두번 걸렀다. 앉으나 서나 틈만 나면 읽었다.
 

앤드루 오들리즈코의 말을 들어보자. "과거 한때 '소수 정리를 증명하는 사람은 영생을 얻는다'는 소문이 있었지요.실제로 아다마르와 발레 푸생은 90년 넘게 살았으니 아주 허황된 소문은 아니었던 것 같습니다. 그런데 요즘 이 소문에서 파생된 또 다른 소문이 나돌고 있씁니다. '리만 가설은 거짓일 지도 모른다. 그러나 누구든 리만 가설이 거짓임을 증명하는 사람은 그 자리에서 급사할 것이며 그가 얻은 결과는 결코 세상에 알려지지 않을 것이다'라는 지독한 소문이 바로 그것입니다"
제타 함수의 함수 평면 궤적 그래프.

'리만 가설'은 전형적인 수학 교양서라서 언제나처럼 수학 천재들이 등장하며, 입에 침이 마르도록 그들이 얼마나 천재같은지 칭송한다. 말하자면  그 동네 수퍼히어로물이다. 수퍼히어로물이자, 사회성 떨어지는 오타쿠들이 세계에 기여하는 알려지지 않은 방식을 설명해 주려 애쓰며 그들이 세운 빛나는 업적들을 소개하고 때로는 기적을 시연한다.



뫼비우스 함수를 사용한 제타함수의 다른 표현. 뭐 이 다음부터는 점점 어려워져서, 입 다물고 구경만 하세여~ 분위기다. 그나저나 수열이나 복소수나 아이겐 밸류를 참 오랫만에 봤다 -_-
 
'리만 가설'은 전형적인 수학교양서 답지 않게 재밌다. 매 장을 넘길 때마다 짜릿짜릿하다. 작법의 힘이다. 다른 책들과 달리 작자는 후주에서 소재의 불필요한 부가 설명을 적는게 아니라 가끔은 소재 외부의 이야기, 아니면 잡담을 늘어놓았다. 작자만 그런게 아니라 옮긴이도 본문과 후주에서 작가와 함께 재잘재잘 수다를 떤다. 따라서 놓치면 아쉬운 이 재밌는 후주를 읽기 위해 책장을 오락가락 해야 하는데, 출판사가 후주를 각주로 해 뒀으면 좋았을 껄 하는 아쉬움이 남는다.  그것 뿐, 기승전결이 뚜렷한 서사와 마지막의 전혀 소득없는 피날레는 감동마저 안겨준다. 원제가 Prime Obsession인데 제목 참 잘 지었다. 오랫만에 책에 아낌없는 찬사를 보낸다. 승산의 책 홈페이지 -- 내가 읽은 것이 무려 3쇄라서, 이런 책을 읽으면 들게 마련인 오타쿠같은  느낌이 들지 않아서 특히 좋았다.

힐베르트의 연설: 우리에게 주어진 과업을 완수하려면 '모든 수학 문제는 해결 가능하다'는 신념을 가져야 한다. 지금 이 순간에도 우리의 마음은 외치고 있다. 여기 문제가 있으니 해답을 찾아라! 우리는 순수한 사고를 통해 해답을 찾을 수 있다. 우리는 결코 무지하지 않으며 자연과학도 무지함과는 거리가 멀다. 그러므로 '무지함'이라는 단어는 새로운 단어로 대치되어야 한다. "우리는 알아야만 한다. 우리는 결국 알게 될 것이다."

과학사상 가장 유명하다는 힐베르트의 감동적인 연설을 기억한다. youtube 어딘가에도 있다.

시간여행자의 사랑 -- 브루노 발터, 뉴욕 필하모니, 말러 9번 교향곡. 이거 좋아하지 않을 사람이 과연 있을까? 소설에서는 시시하고 평범한 소재로 감질맛 나게 낚시질한다. 물론 낚였다. 열정과 의지가 결여된 사람은 시체같아 보인다는 것을 새삼 깨닫게 해줬다.

책에 인용된 프랜시스 톰프슨의 시
 
가까이 있건 멀리 있건
세상 모든 것은
영원불멸한 힘에 의해
보이지 않는 끈으로 묶여 있으니,
땅에서 꽃 한 송이만 꺾어도
하늘에서는 별 하나가 고통에 몸부림친다.

이 싯귀를 언젠가 들어본 기억이 있는데 통 기억 나지 않는다. 아무래도 십여년 전 어떤 과학 교양서에서 읽지 않았을까...

Sky Crowlers
"담배를 피우지 않는 여성은 신용하지 않거든요" -- 오시이 마모루, 스카이 크롤러즈. 우울한 애니. 창공의 전투씬을 무척 잘 만들어서 두세 번씩 리플레이하게 만든다. 감독은 정작 독자가 알아먹을 수 있는 수준에 맞추려고 공중전의 스피드를 늦추려고 거지같은 프로펠러 전투기를 등장시켰다던데. 감독 아저씨, 시청자 배려한답시고 그런 짓 좀 하지 마세요. 댁이 잘 만들면 뭐든 프레임 단위로 안 보겠어요? 이거 원작이 좋아 보이고 전쟁쇼 벌이는 킬드런 설정도 마음에 들어요. 댁이 딱히 망친 것 같진 않지만, 그걸 SF로 만들었다면 독자가 당신이 지향하는 (그다지 공감하지도 않는) 연출의도를 못 알아차릴까봐서 설정을 틀어 버린 것 같아 아쉽다고요.


rideback
갈수록 궁상스러워지는 라이드백. 요즘 돌고 있는 사진. 한국에 외주를 줬는지 자동차 번호판이 매우 낯익다.

,

검증 주행

잡기 2009. 3. 1. 02:57
2월 22일 주행이 당혹과 자괴감으로 점철되어 원인이 어디에 있나 살펴보려고 2월 28일 자전거를 탈 생각이었다. SF&F 도서관 개장식이 마침 같은 날이라 그 곳에 살짝 들러 표도기님과 얘기 좀 하다가 개업식 하기 전에 나와 '주행테스트'를 계속 해 보기로.

아내는 져지에 츄리닝 입고 나가니까 정말 그 몰골로 돌아다닐 꺼냐고 한숨을 푹 쉬었다. 이거 왜 이래 아마추어 같이? 이 트레이닝복 입고 벌건 대낮에 인천공항에서 출국한 적도 있다. 옷가지 만큼은 타인의 눈에 굳이 신경쓰지 않았다. 개소식 하는 곳에 가는 것이 좀 거시기하지만 그 곳 사람들도 적응하면 금새 익숙해질 것이다.

오후 2시 8분 출발. 잊지 않고 지하철 역 앞에서 자전거에 바람을 넣었다. 강변로까지 22kmh 정도로 워밍업하듯 달리다가 강변로에 진입해 28~31kmh로 줄곳 달렸다(평소 22~25kmh로 달리던 구간이다. 2월 22일에는 타이어에 바람이 좀 빠졌다고 평속이 18kmh가 나왔다). 바람을 등지고 있기 때문에 속도가 더 났다. 그나저나 한강변에서는 35kmh쯤 되면 아무도 추월하지 못한다.

이명박 시장 시절엔 한강에 오페라 하우스 세운다고 하다가 갖은 욕을 먹었는데, 오세훈 시장은 임기 초부터 한강 르네상스 프로젝트를 진행하면서, 반포대교를 자전거 전용 도로로 만들고 그 앞에 수상 레저 타운 같은 것도 만들 계획이란다. 어쨌거나 반포대교로 차량 통행이 중지되고(가능할까?) 한강변 자전거 도로가 정비되면 꽤 볼만한 예산 낭비 작품이 나올 것 같다. 뭘 하는지 자세하게 관심은 없지만 이래저래 공사가 한창이다.

사당역을 지나 SF 도서관에 이르기까지 GPS의 도움으로 수월하게 찾아갔다. 14:08출발, SF 도서관에는 15:50 도착. 아직 손님이 없어 서가에서 책들을 들쳐보며 운영 스태프들과 시간을 보냈다. 표도기님이 도착해 리허설을 했다. 고삿상을 옮기던 도중 살짝 내용물을 보고 웃었다. tai0님을 처음 만났다. 오래 전에 tai0님 글이 이상하다고 내가 말했단다(옛날옛날에 내가 그 바닥에서 빼먹고 욕하지 못한 사람은 없지 싶다 -_-). 곧 결혼할 이씨와 이웃사촌이 될 것 같단다.

예정보다 30분 늦게 개소식을 시작했다. 아무래도 행사 준비로 바쁜 표도기님과 따로 이야기할 시간을 만들긴 힘들 것 같다. 저녁을 함께 할 시간도 안 되지만, 다스베이더 헬멧과 광선검이 올라온 웃기는 고삿상이 서로 뻘쭘한 사람들에게 아이스 브레이킹 챈스가 되었길 바란다.

한가할 때 살짝 들렀다 일찌감치 빠져 나가려고 했는데 뜻대로 되지 않았다. 해가 지기 전에 자전거 타러 나가야 한다. 해지면 춥다. 많이 늦었다. 하는 수 없이 질의응답 시간에 직지 얘기를 하고(그것도 포멀하게!) 개소식이 끝나자마자 SF도서관을 나왔다. 사이파이님한테 사이트 알려준다는 걸 잊었다. http://www.beerschool.co.kr/

머문 한 시간 동안 물 한 컵과 포도주 반 병, 치즈케익 한 조각, 빵 두 조각, 쿠키 세 개를 먹었다. 어쩌다가 '짐승의 연주자 에린'의 원작이 '야수'란 것을 알게 되었다. 그랬군. 라이드백 만화책을 봤고, 블레임 이전 세계를 다룬 바이오메가 1권을 봤다. 보고 싶었던 만화책들이다. 도서관에 있는 SF들 대개는 본 것들. 어쩌다 기회를 놓쳤을 뿐, 현재 가지고 있지 않아도 88년 이후 출간된 SF 중 못 읽어본 것은 극히 드문 것 같다. 한국에 출간된 SF의 총수는 500여권이 안 되는 것으로 알고 있다. 행사전 스타워즈 아동용 요약판을 보고 변사를 동원해 스크린 깔고 코스프레 복장으로 연기하면 재밌을 것 같다며 스태프들과 히히덕거렸다. SF 읽는 사람들과 SF 얘기 하는 것이 오랫만이라 즐겁다.

사용자 삽입 이미지

18:10 출발. 꽉꽉 막히는 차량 틈을 요리조리 통과해 신림역을 거쳐 가산디지털단지역에 다다랐지만 건너편 안양천변으로 가는 길이 보이지 않는다. 탐험주행이라 온 길로 가지 않으며, 돌아가는 길을 모른다 -- 때문에 요즘 OSM에 정진한다.

전철로와 평행한 좁은 도로를 따라 차량과 함께 구로역까지 올라가서 가까스로 안양천변에 다다랐다. 오금교에서 성산대교까지 고속주행했다. 성산대교를 건너 산책객들이 한가하게 돌아다니는 불광천을 따라 응암역까지 다다른 후, 다시 시내에서 차들과 나란히 달리며 집에 돌아왔다. 주행거리 55.6km, 2h49m 주행, 30m 휴식. 평속 19.7kmh. 제 속도다. 시내 주행 구간이 길던가 맞바람을 받으면 평속은 18-19kmh 사이가 된다.

주행 평가: 타이어에 충분한 공기가 없어 접지면적이 늘어나면 다리에 상당한 부하를 가한다. 안장에 체중을 실으면 절반 정도 짜부러드는 뒷 바퀴로 주행할 때 평균속도는 3kmh 저하되었다.
그 동안 시간이 없어 못하고 있던 OSM 도로 지도 제작을 하고 있다. 틈틈이 potlatch를 이용해 yahoo aerial map을 참고해서 서울 주요 도로를 만든다. 이 작업이 제대로 결실을 맺게 되면 트랙로그를 일일이 만들지 않고도 GPS 만으로 전국 주행이 가능하게 된다.

potlatch는 정교하거나 대량의 데이터를 다루는 작업에 적합치 않아 JOSM과 merkaartor를 같이 사용했다. 몇몇 사이트에 OSM을 소개한 후 자신이 가진 트랙로그를 올리는 사람들이 생겼다. 작년에 농조로 디지털 대동여지도 프로젝트를 하게 될 지도 모른다고 했는데, 정말 그렇게 될 가능성도 있다. 외국에서는 OSM 커뮤니티 활동이 활발하다. '아마추어 지도 제작자의 모임'이다.

한국 도로 지도 만들기 삽질 모임 같은 공공 프로젝트를 이끌고 싶은 생각은 없지만, OSM은 대단한 포텐셜을 지녔다. 그리고 매력적이다. 작년에 처음 알았을 때 wikipedia에 버금가는 이 대단한 공공 프로젝트가 왜 여태까지 항간의 소문으로 들어본 적이 없나 놀랐다.

일하다가 쉬는 시간이면 이런 저런 생각을 하다보니, 며칠 전 꿈을 꾸면서 OSM으로 지도를 어떻게 만들 것인가 전체 윤곽을 스케치하기도 했다. 심지어 사제 맥주를 들고 아마추어 지도 제작자들과 거나한 뒷풀이를 하는 꿈도 꾸었다. 우리는 UTC 시각과 경위도로 약속을 잡아 만난다!

* OSM에 사람들이 널리 참여할 수 있도록 하는 일이 우선되어야 하겠다. 트랙로그만 수집해 놓기만 하면 지도 편집은 지구 반대편에서도 할 수 있다.

* OSM 도로 지도는 다음, 네이버, 구글 한국 지도보다 나아질 가능성이 있다.
 - 다음, 네이버, 구글 지도는 사용자가 수정할 수 없다.
 - 업데이트 반영이 OSM처럼 실시간이 되지 못한다.
 - 해당 지역 주민은 그 지역에 관해 누구보다 잘 아는 사람이다.
 - OSM은 전세계를 아우르는 데이터베이스다.
 - 데이터베이스 뿐만 아니라 데이터베이스 구현(응용)도 공개되어 있다.
 
* 전국 주요 고속도로(highway)와 주요도로(primary road, trunk)를 확보한다. 지도 제작자들에게 매우 유용한 참고 지표가 된다. 아무래도 전국도로지도 책을 구해야 할 것 같다.

* 내비게이션 시스템이나 무료 공개지도보다 나은 훌륭한 응용 분야가 있다. 트래킹 트레일(footway)과 바이크 트레일(cycleway)이다. 파란 맵이 등산 지도를 제공하기는 하지만 그것보다 정교한 등산로 지도를 만드는 것이 가능하다. 또한 GPS를 사용하는 산악동호회와 자전거 동호회에 꽤 축적된 트랙자료가 있다.

* POI의 확보 방법: 네이버/다음/구글 지도 중 네이버 것이 POI가 가장 풍부하다. 그것과 yahoo 항공사진(2006년 판)과 구글 어스(2009년 판도 일부 있음)의 항공 사진을 참조해 POI를 수작업으로 만든다(별로 좋은 방법은 아니지만 아직은 유출된(?) 자료가 없으니까). 이중 가장 실용적이고 우선적으로 구축해야 할 POI는 기차역, 지하철/전철역, 버스터미널(이하 transportation)이다.

* POI의 구축은 현재로선 구글 어스 외에 방법이 없다. GPS waypoint로는 제한적이고, 아직 네이버 맵 오버레이를 이용한 ajax 소프트웨어를 내 손으로 만들 정도의 시간이나 실력은 없다. 누가 만들어줬으면 좋겠다.

사용자 삽입 이미지

그동안 황량했던 한국이 불과 며칠 사이에 몇몇 사용자들의 참여로 이렇게 변했다. 흡사 내 손으로 도시를 건설하며 문명을 일으켜 세우는 듯한 착각마저 든다. 작업 진행 후 결과물을 흡족하게 바라볼 때면 좋은 SF 읽은 후에나 찾아오는 포만감을 느낀다.  요즘 내가 하는 작업은 지하철/전철역 총정리다.

최근 읽은 넌픽션 중 가장 재밌는 책은 토니/모린 휠러의 '론리 플래닛 스토리'다. 나와 마찬가지로 토니 휠러 역시 이스라엘리 여행자들은 하나같이 지랄같은 놈들이라고 생각했다. 여행할 때 점잖고 좋았던 친구들은 내 경우, 하나 같이 독일인이었다. 그들은 말수도 적다. 영어를 못하는 작자면 '친절한 원주민' 분위기까지 나서 금상첨화다. 토니 휠러도 독일의 여행 문화가 가장 선진화되어 있다고 평가하는 것 같다. 독일 배낭 여행자들에게 딱 한 가지 안타까운 점이 있다면, 일광욕에 환장해 있다는 것. 어? 그런데 휠러가 그것도 똑같이 지적했다.

사용자 삽입 이미지
심바가 몇 년전 아내에게 선물한 것. 서재에 높이 걸려 있는 이 것을 볼 때마다 비비디 바비디 부가 생각난다.

론리 플래닛 스토리에서 가장 마음에 드는 문구는 환경 운동하는 사람들이 날마다 떠들어대는 것, '범지구적으로 사고하고 지역적으로 행동하라(Thinking Globally, Acting Locally)' -- 주변에서 자주 보는 흔한 문구다. 토니 휠러는 이 지구상에 존재하는 무수한 증오와 긴장을 완화시키기 위해 보다 많은 사람들이 여행을 가야 한다고 말했다. 그러게 말이다. OSM은 외국에 알려지는 첫번째 상세 한국 영문 지도가 될 가능성이 있다 -- 천연 비누 만드는 건 지루하고 귀찮다, 지도 만들기야 말로 범지구적으로 생각하고 지역적으로 행동할만한 경우다.

,

Open Street Map

GPS 2009. 2. 26. 20:07
이전 독립 GPS의 활용에서 만든 지형도(등고선 지도)에는 도로와 POI가 포함되어 있지 않다. 등고선 지도에 Open Street Map 지도를 합치면 GPS에 도로와 POI를 사용할 수 있다.

OSM(Open Street Map)은 전세계적인 도로 지도 제작 프로젝트다. 얼마전에 google에서도 google map maker를 만들어 사용자 참여로 구글 맵에 누락되거나 업데이트 되는 지도를 만들 수 있는 방법을 제공하기 시작했다. google map maker의 단점은, 사용자가 만들어 놓은 지도 데이터의 소유권이 구글에 귀속되며, 사실상 맵을 만들어서 구글맵 사용자 사이에 공유하는 것 외에 달리 써먹을 데가 없고 아직 GPS에서 사용할 도구가 없다.

OSM은 구글 맵 메이커에 비해 사용이 비교적 자유롭다. 여기서 만들어진 지도를 바탕으로 여러 가지 파생 프로젝트가 생겨났으며, 그중 대표적인 것이 GPS 디바이스에서 사용하는 도로 지도를 만드는 OSM Map On Garmin이다.
 
OSM에서 만든 자료를 변환해 routable map과 POI(point of interest) 데이터 베이스를 구축하고 이것을 Garmin GPS에서 업로드 해 사용할 수 있다. Garmin의 .img 포맷이 알려져 있고 OSM Tile file database access가 자유롭기 때문에 가능한 일이다.
 
Cloudmade에서 매주 업데이트 하는  국가별 지도 파일을 다운받을 수 있다. 다운 받은 파일을 GPS에 업로드하면 바로 사용 가능하다. 이중 한국의 서울과 일본의 도쿄를 비교:
사용자 삽입 이미지 사용자 삽입 이미지

아직은 한국 사용자들의 참여가 적어 한국 지도가 질적/양적인 면에서 다른 국가에 비해 상대적으로 어설프고 부족하다.

cloudmade의 자료는 이미 만들어진 파일이라 분리 후 다시 통합하기 어려우므로, computerteddy에  의해 매주 업데이트 되는 전 세계 지도 중 필요한 부분을 다운 받아 작업해야 한다.

전체 파일인 worlds.tgz의 압축된 용량은 1.42GB에 달하므로(압축 해제한 *.img 파일의 총 크기는 3.4GB) 별개 이미지로 나누어진 다운로드 디렉토리에서 필요한 파일만 다운받는 것이 시간을 절약할 수 있다. 이때, OSM 자료를 tile 별로 업데이트한 것이라(자세한 내용은 OSM 사이트 참조), 한국에 해당하는 타일을 가져오려면 위치에 해당하는 타일 파일명을 알아야 한다. Convert Coordinates to OSM Tile Numbers 참조.

울릉도를 제외한 대략의 타일 파일 이름은 다음과 같다.
 
63295024.img 63295025.img 63295026.img 63295027.img 63295028.img 63295029.img
63295204.img 63295205.img 63295206.img 63295207.img 63295208.img 63295209.img
63295384.img 63295385.img 63295386.img 63295387.img 63295388.img 63295389.img
63295564.img 63295565.img 63295566.img 63295567.img 63295568.img 63295569.img
63295744.img 63295745.img 63295746.img 63295747.img 63295748.img 63295749.img
 
이들 .img 파일을 sendmap 프로그램을 이용해 Korea topo 맵의 .img 파일과 합쳐 단일 gmapsupp.img를 만든다.

사용자 삽입 이미지 사용자 삽입 이미지
GPS에서 POI를 보면 OSM에서 한글 이름으로 만든 것은 글자가 깨져서 나온다. OSM에서 '영문이름(한글이름)' 식으로 입력하면 이런 문제가 사라진다. 두번째 화면에서는 지형도와 도로 지도가 함께 나타난다. 도로 지도만 나타날 뿐, routable map을 만드려면 computerteddy가 고맙게 올려주는 파일들로는 안되고, OSM 지도를 사용하는 다른 사람들처럼 별도의 작업을 벌여야 한다. 시간이 좀 나면 공부해서 만드는 방법을 좀 배워야 할텐데...

OSM 프로젝트는 Wikipedia 프로젝트와 흡사하므로, 계정을 만들면 누구나 도로 지도를 그려 올릴 수 있다. Potlatch는 web + flash로 온라인에서 작업하는 도구, JOSM, Merkaartor 등은 오프라인에서 작업할 때 주로 사용하는 툴이다. 작업 규칙과 방법에 관해서는 한국 사용자 모임 참조.
 
편집은 보통 자신의 GPS에 기록된 tracklog와 waypoint를 업로드한 후, 그 자료를 바탕으로 도로를 그리는 방법과, potlatch 같은 경우 web 상에서 yahoo map이 오버레이 된 상태에서 도로를 따라 그리며 작업하는 방법, JOSM 등의 프로그램에서는 지도 오버레이용 플러그인을 설치하여(예를 들면 google map plugin) 지도를 오버레이 한 상태에서 도로를 그리는 방법 등이 있다.

OSM 지도는 1주 마다 업데이트 되므로(아직 한국 지도는 거의 업데이트 되는게 없지만) 매번 지도 이미지 파일을 받기는 번거러워 GNU Tool 중 win32용 wget을 사용해(linux 배포본에는 보통 기본적으로 포함되는 유틸리티) 이들을 한꺼번에 받는 스크립트를 사용하면 작업이 덜 번거러워진다.


아울러 이렇게 만든 파일은 Garmin MapSource에서 도로를 볼 수 있는 상태가 아니므로 MapsetToolkit을 사용해 *.TDB 파일을 만들어줘야 한다. MapsetToolkit 사용법은 GPS 한국 지형도 만들기 참조.

사용자 삽입 이미지

Garmin MapSource에서 topo map과 함께 본 모습

,