Q. OSM 데이터 모델의 기본 구성 요소는?
A. 기본 구성 요소 4가지는 Node, Way, Relation, Tag다(출처: 오픈스트리트맵 위키 Elements).
OSM이란?
OSM은 Open Street Map의 줄임말로 개방형 지도를 만들고 배포하는 프로젝트명이다(출처: 오픈스트리트맵 위키 처음 화면).
OSM 데이터 모델
개방형 지도를 만들기 위해서 필요한 데이터를 저장하기 위해 필요한 모델을 데이터 모델이라고 한다. OSM은 지도 데이터를 저장할 때 XML 포맷을 사용한다. 이렇게 저장한 지도 정보 OSM XML 파일을 불러와서 JOSM 같은 프로그램을 통해서 편집할 수 있다.
OSM XML 포맷 예시(출처: 오픈스트리트맵 위키 OSM XML)
<?xml version="1.0" encoding="UTF-8"?>
<osm version="0.6" generator="CGImap 0.0.2">
<bounds minlat="54.0889580" minlon="12.2487570" maxlat="54.0913900" maxlon="12.2524800"/>
<node id="298884269" lat="54.0901746" lon="12.2482632" user="SvenHRO" uid="46882" visible="true" version="1" changeset="676636" timestamp="2008-09-21T21:37:45Z"/>
<node id="261728686" lat="54.0906309" lon="12.2441924" user="PikoWinter" uid="36744" visible="true" version="1" changeset="323878" timestamp="2008-05-03T13:39:23Z"/>
<node id="1831881213" version="1" changeset="12370172" lat="54.0900666" lon="12.2539381" user="lafkor" uid="75625" visible="true" timestamp="2012-07-20T09:43:19Z">
<tag k="name" v="Neu Broderstorf"/>
<tag k="traffic_sign" v="city_limit"/>
</node>
...
<node id="298884272" lat="54.0901447" lon="12.2516513" user="SvenHRO" uid="46882" visible="true" version="1" changeset="676636" timestamp="2008-09-21T21:37:45Z"/>
<way id="26659127" user="Masch" uid="55988" visible="true" version="5" changeset="4142606" timestamp="2010-03-16T11:47:08Z">
<nd ref="292403538"/>
<nd ref="298884289"/>
...
<nd ref="261728686"/>
<tag k="highway" v="unclassified"/>
<tag k="name" v="Pastower Straße"/>
</way>
<relation id="56688" user="kmvar" uid="56190" visible="true" version="28" changeset="6947637" timestamp="2011-01-12T14:23:49Z">
<member type="node" ref="294942404" role=""/>
...
<member type="node" ref="364933006" role=""/>
<member type="way" ref="4579143" role=""/>
...
<member type="node" ref="249673494" role=""/>
<tag k="name" v="Küstenbus Linie 123"/>
<tag k="network" v="VVW"/>
<tag k="operator" v="Regionalverkehr Küste"/>
<tag k="ref" v="123"/>
<tag k="route" v="bus"/>
<tag k="type" v="route"/>
</relation>
...
</osm>
Node
- 위도 경도로 표현되는 지표면 위의 한 점을 가리킨다.
- Node는 Way의 구성 요소다.
- 우물 등 독립된 점형 지물을 정의할 수 있다.
- Relation의 구성원으로 사용 가능하다.
- GeoJSON의 Point와 비슷하다.
- Node 예시
<node id="298884269" lat="54.0901746" lon="12.2482632" />
Way
- Way는 강이나 도로 같은 선모양 지물을 주로 표현한다.
- 건물이나 숲 같은 영역도 표현할 수 있다. 닫혀 있는 Way라고 하기도 하고, 닫혀 있는 Way를 영역이라고 따로 구분해서 부르기도 하지만 데이터 모델은 Way로 동일하다.
- Way는 Node 2개 이상 최대 2000개로 구성된다.
- Node 없이 Way를 만들 수 없다. (참고로 GeoJSON의 경우 Point 없이 LineString이 가능하다.)
- Way에는 <nd ref="292403538"/> 식으로 Way를 구성하는 Node를 적게 되며 ref에는 Node의 ID를 적는다.
- Relation의 구성원으로 사용 가능하다.
- 열려 있는 Way는 GeoJSON의 LineString, 닫혀 있는 Way는 GeoJSON의 Polygon과 대응한다.
- Way 예시
<way id="26659127" user="Masch" uid="55988" visible="true" version="5" changeset="4142606" timestamp="2010-03-16T11:47:08Z">
<nd ref="292403538"/>
<nd ref="298884289"/>
...
<nd ref="261728686"/>
<tag k="highway" v="unclassified"/>
<tag k="name" v="Pastower Straße"/>
</way>
Relation
- Relation은 점, 길, 다른 Relation을 2개 이상 묶어서 구성한다.
- Relation은 다른 Relation의 구성원이 될 수 있다.
- 대표적인 예는 버스 노선이다. Way가 버스가 다니는 길, Node는 버스 정류장을 나타내도록 해서 버스 노선이란 Relation으로 묶을 수 있다.
- Relation 의미는 type으로 나타낸다.
- GeoJSON의 FeatureCollection과 비슷하지만 Relation과 일치하지는 않는다.
- Relation 예시
<relation id="56688" user="kmvar" uid="56190" visible="true" version="28" changeset="6947637" timestamp="2011-01-12T14:23:49Z">
<member type="node" ref="294942404" role=""/>
...
<member type="node" ref="364933006" role=""/>
<member type="way" ref="4579143" role=""/>
...
<member type="node" ref="249673494" role=""/>
<tag k="name" v="Küstenbus Linie 123"/>
<tag k="network" v="VVW"/>
<tag k="operator" v="Regionalverkehr Küste"/>
<tag k="ref" v="123"/>
<tag k="route" v="bus"/>
<tag k="type" v="route"/>
</relation>
Tag
- 어떤 지형지물인지 나타내는 용도이다.
- key와 value로 구성되어 있다.
- 모든 구성 요소 Node, Way, Relation에 Tag를 붙일 수 있다.
- 정해진 tag 뿐만 아니라 새롭게 만들어서 사용하는 것도 가능하다.
- OSM에서 현재 사용하는 태그 목록은 OSM 위키 Taglists를 참고하자.
- Tag 예시
<relation id="56688" user="kmvar" uid="56190" visible="true" version="28" changeset="6947637" timestamp="2011-01-12T14:23:49Z">
<member type="node" ref="294942404" role=""/>
...
<tag k="route" v="bus"/>
<tag k="type" v="route"/>
</relation>