작년 10월부터 OSM 간보기를 하다가 올 3월초부터 OSM 작업을 시작했는데, 4개월만 더 있으면 OSM 작업하겠다고 생각한지 만 1년이 된다.
저번 주와 마찬가지로 이번 주에도 작업을 그리 많이 하지 못했다. 이번 주는 화요일, 수요일 합쳐 약 7시간 정도 작업. 이 기사 쓰는데 쓰는 시간이 더 걸리는 것 같다. 국가교통정보센터의 지도가 내년에 업데이트 되어도 그것을 손쉽게 업데이트할 방법을 찾다보니... 도로 작업에 너무 많은 시간을 까먹고 있다.
국가교통정보센터의 지도에서 추출한 도로로 다음 네 단계로 작업으로 나눴다. 라우팅은 미심쩍은 것들이 많아 이번 주 작업에서 뺐다.
1. 노이즈 제거
저번 주와 마찬가지로 이번 주에도 작업을 그리 많이 하지 못했다. 이번 주는 화요일, 수요일 합쳐 약 7시간 정도 작업. 이 기사 쓰는데 쓰는 시간이 더 걸리는 것 같다. 국가교통정보센터의 지도가 내년에 업데이트 되어도 그것을 손쉽게 업데이트할 방법을 찾다보니... 도로 작업에 너무 많은 시간을 까먹고 있다.
국가교통정보센터의 지도에서 추출한 도로로 다음 네 단계로 작업으로 나눴다. 라우팅은 미심쩍은 것들이 많아 이번 주 작업에서 뺐다.
1. 노이즈 제거

왼쪽: 원본 데이터, 오른쪽: 노이즈 제거 후
아마도 프로젝션에 따른 오차를 보정하다가(추측임) 위와 같은 노이즈가 원치않게 끼어든 것 같다. polygon 처리에 사용하던 이동평균 보간으로 노이즈를 없애버리면 유의미한 vertex도 날아가므로 노이즈의 성향을 살펴 연직 및 수평 이동이 발견될 때에만 제한적으로 보정 했다.
아마도 프로젝션에 따른 오차를 보정하다가(추측임) 위와 같은 노이즈가 원치않게 끼어든 것 같다. 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
R(지구반지름) = 6371000m
자전 및 공전을 하는 지구가 완전한 구체는 아니라서(WGS-84 ellipsoid 모델에서 적도 반지름은 6378km, 극 반지름은 6357km) Haversine식은 0.3% 가량의 오차를 가진다(즉, 1km 거리에서 3m 가량의 오차). 오차를 줄이려면Vincenty 공식을 사용하면 되지만(오차가 무려 1mm), 좌표간 거리가 대단한 정밀도를 가질 필요가 없고 계산량도 많아 Haversine 공식을 사용하기로 했다. 지구면의 두 지점에 관한 여러 종류의 수식은 여기를 참조.

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

왼쪽: 떨어져서 별개로 선택되는 도로들, 오른쪽: 연결된 도로
4. 벡터 평탄화
4. 벡터 평탄화
벡터가 완만하게 변화하는 구간에서만 평탄화를 실시한다. 평탄화를 하면 지점의 갯수가 줄어든다. 변화폭은 일정 갯수의 지점에서 벡터 방향(bearing)의 각도 변화의 총합을 측정하여 파라미터로 결정한다. 예: 10점 동안 각도 변화가 10도 미만이면 평탄화.
평탄화는 급격한 변화 구간(예를 들면 도로의 인터체인지의 원형 진입로)은 그대로 놔 두고 완만한 변화 구간을 압축하는 효과가 있어 파일 크기를 줄일 수 있다. 3점 각도 변화 15도에서 원래 데이터를 크게 손상시키지 않으며 그 크기를 대략 1/2로 줄였다.
잘 뒤져보면 위에 언급한 네 가지 작업에 적합한 좋은 알고리즘이 있을 법하지만, 굳이 속도나 효율을 요구하는게 아니라서 일단 이대로 프로그래밍하기로 했다.
네 가지 작업의 효과(또는 취약점)을 확인할 수 있도록 파라미터를 선택하여 처리할 수 있도록 GUI 프로그램을 짰다.
이전의 해안선 처리에 사용하던 프로그램과 통합하고, polygon 처리할 때도 smoothing을 넣으니까 vertex 수가 10% 가량 줄었다. 빙고.
프로그램을 돌려보니 출력 파일의 크기가 원본의 24~30% 정도 밖에 되지 않는다. 원래 계획했던, 350MB를 100MB 이내로 줄이는 것이 가능하다. 한동안은 한가하게 출력 파일을 검증하는 작업을 할 것이다. 더디긴 하지만 작업은 계획대로 진행되고 있다.
평탄화는 급격한 변화 구간(예를 들면 도로의 인터체인지의 원형 진입로)은 그대로 놔 두고 완만한 변화 구간을 압축하는 효과가 있어 파일 크기를 줄일 수 있다. 3점 각도 변화 15도에서 원래 데이터를 크게 손상시키지 않으며 그 크기를 대략 1/2로 줄였다.
잘 뒤져보면 위에 언급한 네 가지 작업에 적합한 좋은 알고리즘이 있을 법하지만, 굳이 속도나 효율을 요구하는게 아니라서 일단 이대로 프로그래밍하기로 했다.
네 가지 작업의 효과(또는 취약점)을 확인할 수 있도록 파라미터를 선택하여 처리할 수 있도록 GUI 프로그램을 짰다.

프로그램을 돌려보니 출력 파일의 크기가 원본의 24~30% 정도 밖에 되지 않는다. 원래 계획했던, 350MB를 100MB 이내로 줄이는 것이 가능하다. 한동안은 한가하게 출력 파일을 검증하는 작업을 할 것이다. 더디긴 하지만 작업은 계획대로 진행되고 있다.
"GPS" 카테고리의 다른 글
- OSM 작업노트 #13: 도로 업로드 작업 (1)2009/07/09
- OSM 작업노트 #12: 지도 공개 및 도로 (2)2009/06/30
- OSM 작업노트 #11: 도로 (3)2009/06/24
- OSM 작업노트 #10: 해안선과 도로 (0)2009/06/19
- OSM 작업노트 #9: bulk upload (0)2009/06/05
Add Comment
안녕하십니까
저는 전주에서 전주와 전북지역의 도로 지도를 지난 달부터 그리기 시작한 OSM 초보입니다. 단순히 점과 점을 이어가는 작업을 하고 있었는데 이런 멋진 프로그램을 보니깐 감동이네요. 그렇지 않아도 여러가지 POI가 자주 업데이트 되는 것을 보고서 수고 많다는 인사를 하고 싶었는데 고맙게 생각합니다.
그렇지만, 몇 가지만 말씀 드리고 싶은 것이 있습니다.
첫번째 국도를 한 도로로 만든다고 하는 것은 현재 국도를 Trunk way 로 하여 하여 2가지 선으로 그리고 있는 것과는 어긋나는 것으로 생각이 됩니다.
두번째는 실제적인 부분으로 이런 것을 하게 되면 기존 도로를 그린 사람들의 작업은 어떻게 될까요? 할 수만 있다면 그려지 않은 도로만 채우시면 어떨까요? 저도 몇날을 밤 늦도록 그려서 그런지 제 그림에 애착이 생겼습니다.
세번째는 이런 작업은 다른 지도를 옮기지 말라는 문구와는 상충되는 것은 아닌지 그런 걱정도 됩니다.
아무튼, 대단한 작업을 하고 계신다는 생각에는 변함이 없습니다. 항상 건강하시고 모든 일이 뜻처럼 이루어 지시길 기원합니다.
안녕하세요? OSM 작업자, 그것도 한국분을 만나게 되어 무척 반갑습니다.
예전 논의 때 국도는 primary road로 통일하기로 했습니다. OSM 위키 한국 지도 작성 가이드를 업데이트 하는 걸 잊어버렸네요... 세계적으로도 trunk는 우리로 치면 주요간선 또는 고속화도로를 사용합니다. 광역시의 광역시 간선도의 경우는 아직 이렇다할 가이드라인이 없습니다. 이건 공론화되어야 할 부분이지요. 그리고 4차선/6차선 국도는 독립차선으로 하는 경우도 있고(국도 인터체인지/정션 때문에) 하나의 차선에 lanes=4/6 이렇게 지정하는 경우도 있습니다. 국도에서 차선 분리가 완전히 된 곳은 시와 시 외곽지역을 연결하는 주요 지점으로 전국적으로는 국도의 대부분이 1/2차선입니다. 그래서 국도가 trunk가 아닌 primary road가 적합하다고 합의한 것이죠. 국도의 독립차선은 필요에 따라 적용하면 될 것 같습니다.
두번째, 업데이트 되는 도로에는 review 태그가 붙게 됩니다. 기본적으로 review=no로 되어 있는데, 만약 업로드된 도로보다 작업하신 도로가 전확하다면 업로드된 도로를 지우고, 해당 지역에 도로가 없고 검증이 끝났으면 리뷰 태그를 없애던가 review=yes로 하시면 됩니다. 즉 기존 작업 내용에는 영향을 끼치지 않습니다. 다만 화면에는 도로가 어지럽게 나타나겠지요. 시가지의 경우 국도가 시 전체를 오락가락 하는 경우는 거의 없으므로 크게 걱정하지 않으셔도 됩니다. 저도 이 문제 때문에 한동안 골치가 아팠는데, 외국의 대부분 OSM 업로더와 작업자들이 이 방식을 널리 사용합니다.
세번째 문제에 관해서는, 저도 지금 확실한 언급을 못하겠습니다. OSM에서는 저작권이 상용 자료를 올리지 말라는 것이지요. 미국의 경우 TIGER라는 공공 GIS 정보를 최근에 OSM 서버에 몽땅 업로드했어요. 유럽 대부분의 국가들 역시 기존에 일반에 공개된 자료를 상당량 올려 놓았습니다. 한국의 경우 국가교통정보센터의 자료에 대한 저작권 명시가 없어서 좀 더 알아봐야 합니다. 여차하면 올리지 않으려고 하나, 도로의 정밀도 때문에 포기하기가 함들죠. 아시다시피 시내는 홍의님처럼 그 지역 거주자가 작업하는 것이 가능한데, 이를테면 강원도 산골의 국도 및 지방도는 도로 작업을 할 마땅한 방법이 없습니다(GPS를 차량에 부착해 트랙로그를 가지고 작업하는 방식은 오차가 상당합니다).
여하튼 도로를 업로드하기 전에 한국의 작업자들에게 공지를 하고는 싶은데, 뾰족한 방법이 없네요. email을 남겨주시거나 OSM wiki 페이지의 한국 작업자에 등록해 주시면 나중에 도로 업로드 전에 전주 부분을 어떻게 떼어낼지 연락드리겠습니다.
상세하신 답변에 감사를 드립니다.
국도를 Trunk로 만든다고 며칠 삽질한 것이 아쉽게 되었지만 나름 의미 있는 일이었다고 생각합니다. JOSM의 사용법에 대해 좀 더 배울 수 있는 기회였다고 생각하기고 했습니다.
일단 저는 도로를 그리는 것은 중단을 했습니다. 아무래도 luke님이 하시려고 하는 일과 중복이 될 것 같아서 도로부분보다는 전주시를 상세하게 만드는 일을 다시 시작했습니다. 어느정도 마무리 되면 전북지역의 다른 도시를 할 생각입니다.
열심히 도와드릴테니 좋은 자료 많이 올려 주시기 바랍니다.
감사합니다.