Ko:한 지물에 하나의 오픈스트리트맵 요소
한 지물에 하나의 오픈스트리트맵 요소(One feature, one OSM element)는 좋은 관습 중 하나로, 현실에 있는 하나의 지물은 반드시 하나의 오픈스트리트맵 요소로만 나타내야 한다는 규칙입니다.
지도 개체
일반적인 규칙
하나의 오픈스트리트맵 요소는 반드시 하나의 지물을 표현해야 하며, 동시에 단 하나의 지물만을 표현해야 합니다. 다시 말해서 아무 지물도 표현하지 않거나 두 개 이상의 지물을 동시에 표현할 수 없습니다. 예를 들어
- 현실에서 건물로 구성된 지물(학교 등)을 나타낼 때는 토지 구획을 나타내는 영역 개체와 건물을 나타내는 영역 개체를 함께 그려야 합니다. 태그는 건물이 아닌 토지 구획에 붙여야 합니다. 단 토지 구획의 용도와 구획 내부 건물의 용도가 다른 경우는 예외입니다. 오픈스트리트맵 데이터베이스를 이용하는 사람은 학교 부지 내부의 건물을 학교의 일부로 가정합니다.
- 모양과 위치를 알 수 있는 건물로 구성된 지물은 영역 개체로 나타내야 하며, 적절한 태그를 붙여야 합니다.
- 위치를 알 수는 있지만 모양을 알 수 없는 지물은 점형 개체로 나타내야 하며, 적절한 태그를 붙여야 합니다.
- 작은 지물 여러 개로 구성된 지물은 관계로 나타내는 것이 이상적입니다. 예를 들어 하이킹 노선이나 대중교통 노선은 여러 개의 도로 조각(highway=*)이나 철로 조각(railway=*)으로 구성된 노선 관계(relation:route)로 표현하는 것이 좋습니다.
나쁜 상황의 예시
- 동일한 지물을 표현하기 위해 영역 개체 안에 점형 개체를 집어넣고, 두 개체에 서로 같은 지물 태그를 붙이는 행위.
- 건물을 표현하는 영역 개체 안쪽에 영역 개체를 또 그린 후, 두 개체에 서로 같은 지물 태그를 붙이는 행위.
- 하나의 닫힌 길에 선형 지물에 사용하는 태그(barrier=hedge - 생울타리 등)와 영역에 사용하는 태그(amenity=school - 학교 등)를 한꺼번에 붙이는 행위. 이렇게 태그를 붙이면 장벽이 영역의 형태인지 선의 형태인지 명확하지 않으며, 추가로 붙어 있는 태그들 중 어떤 태그가 장벽의 속성을 표현하고 어떤 태그가 학교의 속성을 표현하는지 구별할 수 없습니다. 이럴 때는 관계 를 두 개 만들어서 하나에는 생울타리 태그(barrier=hedge)를 붙이고, 나머지 하나에는 학교 태그(amenity=school)를 붙이면 됩니다. 그러고 나서 닫힌 길 을 그린 후 두 관계에 각각 추가하세요. 이렇게 하면 닫힌 길에는 아무 태그도 붙어 있지 않아야 합니다.
- 호텔(tourism=hotel)과 호텔 안에 있는 식당(amenity=restaurant)을 하나의 개체로 뭉쳐서 표현하는 행위. 이렇게 하면 추가로 붙어 있는 태그들(opening_hours=* - 영업 시간대 등) 중 어떤 태그가 호텔의 속성이고 어떤 태그가 식당의 속성인지 구별할 수 없습니다[1].
- 건물 안에 있는 상점을 나타내기 위해 하나의 개체에 building=* + shop=* + name=* 태그를 전부 붙이는 행위(이름 태그는 주로 관심 지점의 명칭을 나타냄). 이 방법은 논란의 여지는 많지만, 모든 속성이 모든 지물에 동시에 적용되는 경우에 한해 일반적으로 허용됩니다[2].
여러 개체가 필요한 경우
아래 내용은 절대적인 원칙이 아닙니다. 일부 지물은 정점, 선, 관계로 표현했을 때 각 표현마다 미묘하게 의미가 다릅니다. 또한 수많은 유형의 데이터 소비자마다 매우 다양한 요구 사항을 충족하기를 원하기도 하고, 체계를 전환하는 기간 동안 기존 데이터 소비자와의 역호환성을 유지할 필요도 있습니다. 이러한 실용적인 문제 때문에 하나의 지물을 두 번 이상 표현하기도 합니다. 구체적인 예시는 아래와 같습니다.
- 같은 위치에 두 개 이상의 개체를 놓기: 같은 부지를 공유하는 학교가 두 곳이 있는 경우가 이에 해당합니다. 각 학교가 독립적인 건물을 보유하고 있다면 건물을 그린 후 공유하는 부지에는 landuse=education(교육 부지) 태그를 붙이세요. 하나의 건물에 학교가 두 개 이상 있다면 amenity=school 태그를 두 개체(주로 정점)에 붙여 주세요.
- 다용도 건물: 건물은 building=* 태그로 나타내야 합니다.
- 건물의 주요부를 차지하는 지물이 명확하고, 다른 지물은 건물에 속해 있는 형태일 경우(예시: 호텔 내부의 식당, 쇼핑몰 내부의 상점) 건물 요소 자체에 주 용도를 표시하고, 다른 지물은 건물 경계 내부에 추가로 그려 주세요.
- 건물의 주요부를 차지하는 지물이 명확하지 않고, 다른 지물이 건물에 속해 있는 형태일 경우(예시: 여러 상점이 입점해 있는 건물. 각 상점마다 입구가 따로 있습니다.) 모든 지물을 건물 경계 내부에 그려 주세요.
- 건물 영역 안쪽에 위치한 지물은 정점이나 영역으로 표현할 수 있습니다. 단순 실내 태그 체계를 활용하면 건물의 내부 구조를 나타낼 수도 있습니다(필수는 아닙니다).
- 마을을 나타낼 때는 주로 마을 한가운데에 정점을 찍고, place=village 태그 및 name=* 태그를 정점에 붙입니다. 마을 안의 주거 토지 이용(landuse=residential)은 마을과는 별개의 개체로 다루어야 합니다. 다른 토지 이용 영역(landuse=*)도 마찬가지입니다.
- 개체 지향 편집 vs 기능 지향 편집: 개체 그 자체를 나타내는 정보(실제 지물의 형상 및 정보 등)를 올바르게 기입하면서도 지도의 기능(경로 탐색 등)을 살리기 위해 동일한 개체를 두 번 그릴 수 있습니다. 예를 들어 경로 탐색에 활용할 수 있는 지물(도로 및 수로)는 끊어지지 않고 이어진 선 으로 그립니다. 얕은 연못 아래를 지나가거나 강둑 위를 지나가는 도로는 끊어진 것처럼 보이지만, 오픈스트리트맵에 그릴 때는 도로를 끊지 말고 이어서 그려야 합니다. 동시에 교차점에서 도로 및 수로의 실제 형상을 나타내기 위해 영역 (area:highway=*)을 활용합니다. 영역을 활용해 교차점을 나타내는 방법은 포장재가 서로 다른 두 도로가 교차하는 지점의 포장재를 묘사할 때 유용합니다. 또 다른 예시로는 다리가 있습니다. 도로에 bridge=yes 태그(+최대 중량 정보 등)를 붙이는 행위는 기능 지향 편집으로, 경로 탐색기에 해당 도로가 다리의 역할을 한다는 사실을 알려줍니다. 다리의 형상(범위)를 영역으로 그린 후 man_made=bridge 태그를 붙이는 것은 개체 지향 편집으로, 여기에는 다리의 명칭이나 위키데이터 값을 추가로 입력할 수 있습니다. 이렇게 현실에서는 동일한 지물이지만, 오픈스트리트맵 상에서는 서로 다른 두 지물로 표현하는 경우가 있습니다.
- 강은 대개 물이 차 있는 영역에 waterway=riverbank 혹은 natural=water + water=river 태그를 붙인 후, 경로 탐색이 가능하도록 강의 주요 흐름를 따라가는 선을 하나 이상 그린 후 waterway=river 태그를 붙이는 식으로 표현합니다. 이때 이름(name=*) 태그는 waterway=river 태그가 붙은 선에 함께 붙입니다.
- 매우 길쭉한 선형 지물(강 등)은 실용적인 이유로 여러 조각의 선으로 분리해 표현하기도 합니다.
- 선의 속성: surface=*(노면), lanes=*(차로 수), turn:lanes=*(진행 방향별 차로 수), maxheight=*(최대 중량)과 같이 위치에 따라 값이 변화하는 태그를 붙일 때는 반드시 해당 태그의 값이 바뀌는 지점을 기준으로 도로(highway=*)를 분할해야 합니다. 이는 강(waterway=river)과 같은 다른 지물에도 마찬가지로 적용됩니다. 지역/국가별로 이름이 다른 강에 이름을 붙일 때는 해당 이름이 적용되는 범위를 각각 따진 후 강을 적절히 분할해야 합니다.
- 현지의 지물이 여러 오픈스트리트맵 요소로 분할될 때는 관계(Relation:waterway 등)를 이용해 해당 요소들을 하나로 묶어줄 수 있습니다.
- 이렇게 관계를 활용해 강을 표현하는 방법은 길을 이용해 강을 표현하는 방법을 대체하지 못합니다. 예를 들어 지역/국가별로 이름이 다른 강에 name=* 태그를 붙일 때는 강 전체를 아우르는 관계에 붙이는 것이 아니라, 해당 이름이 적용되는 강 조각에 붙여야 합니다.
- 이름이 있으며 여러 영역으로 구성된 자연 구역(숲, 습지, 저수지 등)을 나타낼 때 일부는 각 영역에 name=* 태그를 중복해서 붙이는 것을 선호합니다. 이 방법은 논란이 있으며, 각 영역마다 자체적으로 명칭이 있다면 자연 구역이 분해되어 버리는 문제가 있습니다.
여러 태그
'한 지물에 하나의 오픈스트리트맵 요소'라는 원칙은 정점, 길, 관계에 적용되는 원칙이지, 태그에 적용되는 원칙이 아닙니다.
동일한 정보를 여러 태그 조합을 통해 나타낼 수 있습니다. 예를 들어 waterway=riverbank와 natural=water + water=river는 정확히 같은 의미입니다.
이러한 이중 태그 지정은 '한 지물에 하나의 오픈스트리트맵 요소' 원칙을 위반하지 않습니다. 상황에 따라서는 이러한 행위가 용인될 수도 있고(이럴 때는 두 태그를 모두 유지해야 함), 명백하게 용인되지 않을 수도 있으며, 둘 다 아닐 수도 있습니다. 마지막 경우의 한 예로는 contact:phone=*과 phone=* 태그가 있습니다. 두 태그는 완전히 같은 의미를 전달합니다. 그러나 두 태그를 모두 유지하자는 사람이 있고(용인), 한쪽 태그를 폐기하자는 사람도 있습니다(용인하지 않음). 그러나 이러한 경우에도 둘 중 한쪽 태그가 명백히 표준이라면 나머지 한쪽은 중복으로 취급되어 제거할 수 있습니다. 예를 들어 amenity=police와 emoji_encoded_tag=:cop: 태그는 같은 의미이지만, 후자는 지워도 무방하며, 지우는 것이 오픈스트리트맵을 발전시키는 길입니다.
중복되는 속성
강(waterway=river)과 같은 선형 지물의 명칭(name=*) 태그는 길에 붙여야지, 영역(natural=water + water=river 영역)에 붙이면 안됩니다.
도로(highway=*)와 도로 영역(area:highway=*)에도 이 원칙이 적용됩니다. 도로 영역에는 이름 태그를 붙이면 안됩니다.
관련 문서
- 역사를 유지하라 - 본 지침과 유사하지만 태그 대신 역사와 관련이 있습니다.
- Relation:multipolygon(다중 다각형) - 복잡한 영역(도로로 나뉜 학교, 한가운데 섬이 있는 호수 등)을 지도에 표현하는 표준적인 방법.
- 길 - 지물을 선형으로 표현하는 것과 면으로 표현하는 것의 차이점을 설명합니다.
- Relation:site(장소) - 여러 요소로 구성되지만 다중 다각형으로는 표현할 수 없는 지물(여러 정점을 포함하는 풍력 발전소 단지 등)을 표현하기 위한 '장소' 관계를 도입하자는 제안.
- building:part=* - 복잡한 건물을 지도에 그리는 방법.