도메인 domains/위치 기반 Location-based

Q. OSM 데이터 모델의 기본 구성 요소는?

Tap to restart 2024. 5. 18. 20:00

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>