'JOSM'에 해당되는 글 2건

  1. 2009.07.24 OSM 작업노트 #14: cleanup 2
  2. 2009.06.05 OSM 작업노트 #9: bulk upload

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개의 유명 산행로를 '그렸다'. 북한산 및 도봉산 트래킹 코스




,
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로 야후 맵을 출력하는 속도가 워낙 느려 답답했다. 메르카토르에서 두어 시간 작업하다가... 황당하게 프로그램이 다운되었다. 뭘 해도 쉽지가 않네? 간단한 작업에나 사용할 수 있을 듯. 메르카토르는 태그 에디팅이 좀 많이 불편한 편. 다음 버전 나올 때까지 기다려보자.
,