본문 바로가기
IT세상

OSM과 OSRM을 학습하고 응용하는 방법

by 세상님 2024. 1. 29.

OSM과 OSRM의 개요

OSM과 OSRM은 오픈 소스 프로젝트로, 전 세계의 지리적 데이터와 라우팅 서비스를 제공합니다. OSM은 OpenStreetMap의 약자로, 전 세계의 지리적 데이터를 무료로 제공하는 협업적인 매핑 프로젝트입니다. OSRM은 Open Source Routing Machine의 약자로, OSM 데이터를 사용하는 고성능 라우팅 엔진입니다.

OSM과 OSRM은 다음과 같은 특징을 가지고 있습니다:

 

 

 

 

 

OSM(Open Street Map) 바로가기
OSM(Open Street Map) 바로가기

 

  • OSM과 OSRM은 무료로 사용할 수 있습니다. OSM과 OSRM은 공개 라이선스 하에 배포되며, 누구나 자신의 목적에 맞게 수정하고 활용할 수 있습니다.
  • OSM과 OSRM은 지속적으로 업데이트되고 개선되고 있습니다. OSM은 전 세계의 수백만 명의 자원 봉사자들이 참여하여 데이터를 수집하고 검증하고 있으며, OSRM은 OSM 데이터의 변화에 실시간으로 반영하여 라우팅 결과를 제공하고 있습니다.
  • OSM과 OSRM은 다양한 기능과 커스터마이징을 지원합니다. OSM은 지도의 스타일, 색상, 아이콘 등을 변경할 수 있으며, OSRM은 자동차, 자전거, 보행자 등 다양한 교통 수단에 대한 라우팅 프로필을 제공하고, 라우팅 알고리즘과 가중치를 수정할 수 있습니다.

OSM과 OSRM은 다음과 같은 구성 요소로 이루어져 있습니다:

  • OSM의 데이터는 노드, 웨이, 릴레이션, 태그로 구성됩니다. 노드는 지도상의 한 점을, 웨이는 노드들의 선이나 면을, 릴레이션은 노드와 웨이, 그리고 다른 릴레이션의 관계를, 태그는 노드, 웨이, 릴레이션에 부가적인 정보를 나타냅니다.
  • OSRM의 소프트웨어는 osrm-backend, osrm-frontend, osrm-routed로 구성됩니다. osrm-backend은 OSM 데이터를 그래프로 변환하고, 압축하고, 최적화하는 프로그램입니다. osrm-frontend은 OSRM의 라우팅 서비스를 이용할 수 있는 웹 기반 애플리케이션입니다. osrm-routed은 OSRM의 라우팅 서버를 구동하고, API 요청에 응답하는 프로그램입니다.

OSM과 OSRM은 다음과 같은 용어와 약어를 사용합니다:

  • OSM: OpenStreetMap의 약자로, 전 세계의 지리적 데이터를 무료로 제공하는 협업적인 매핑 프로젝트입니다.
  • OSRM: Open Source Routing Machine의 약자로, OSM 데이터를 사용하는 고성능 라우팅 엔진입니다.
  • ODbL: Open Database License의 약자로, OSM의 데이터를 배포하는 라이선스입니다.
  • BSD: Berkeley Software Distribution의 약자로, OSRM의 소프트웨어를 배포하는 라이선스입니다.
  • JOSM: Java OpenStreetMap Editor의 약자로, OSM의 데이터를 편집하고 관리할 수 있는 데스크탑 애플리케이션입니다.
  • iD: OSM의 데이터를 편집하고 관리할 수 있는 웹 기반 애플리케이션입니다.
  • OSM2World: OSM의 데이터를 3D 모델로 변환하고 시각화할 수 있는 오픈 소스 프로그램입니다.
  • OSRM Web: OSRM의 라우팅 서비스를 이용할 수 있는 웹 기반 애플리케이션입니다.
  • 노드: OSM의 데이터의 기본 단위로, 지도상의 한 점을 나타냅니다.
  • 웨이: OSM의 데이터의 기본 단위로, 노드들의 선이나 면을 나타냅니다.
  • 릴레이션: OSM의 데이터의 기본 단위로, 노드와 웨이, 그리고 다른 릴레이션의 관계를 나타냅니다.
  • 태그: OSM의 데이터의 기본 단위로, 노드, 웨이, 릴레이션에 부가적인 정보를 나타냅니다.
  • 그래프: OSRM의 데이터의 기본 단위로, 노드와 엣지로 구성되며, 노드는 교차점이나 도로의 끝점을, 엣지는 노드 사이의 도로를 나타냅니다.
  • 프로세싱 파이프라인: OSRM의 데이터를 처리하는 단계로, 추출, 압축, 라우팅으로 구성됩니다.
  • 추출: OSM 데이터에서 교통 수단별로 라우팅 규칙과 조건을 추출하는 단계입니다.
  • 압축: 추출된 데이터를 압축하고 최적화하는 단계입니다.
  • 라우팅: 압축된 데이터를 바탕으로 라우팅 요청에 응답하는 단계입니다.

OSM 데이터 다운로드 및 편집

OSM의 데이터는 다양한 방법으로 다운로드하고 편집할 수 있습니다. 이 강의에서는 JOSM과 iD라는 두 가지 도구를 사용하는 방법을 소개합니다. JOSM은 데스크탑 애플리케이션으로, OSM의 데이터를 다운로드하고, 수정하고, 업로드하고, 검증하고, 필터링하고, 태깅하고, 검색하고, 시각화할 수 있습니다. iD는 웹 기반 애플리케이션으로, OSM의 데이터를 쉽고 빠르게 편집할 수 있도록 간단하고 직관적인 인터페이스를 제공합니다.

JOSM을 사용하는 방법

JOSM을 사용하는 방법은 다음과 같습니다:

  1. JOSM의 공식 웹사이트 (https://josm.openstreetmap.de/)에서 JOSM을 다운로드하고 설치합니다.
  2. JOSM을 실행하고, 파일 메뉴에서 다운로드를 선택합니다. 다운로드 창이 열립니다.
  3. 다운로드 창에서, 원하는 지역을 지도에서 드래그하거나, 좌표나 주소를 입력하거나, 다운로드할 OSM 데이터의 URL을 입력합니다. 다운로드 옵션을 설정하고, 다운로드 버튼을 클릭합니다. 지정한 지역의 OSM 데이터가 JOSM에 로드됩니다.
  4. JOSM의 편집 창에서, OSM 데이터를 편집합니다. 노드, 웨이, 릴레이션을 생성하거나, 수정하거나, 삭제하거나, 태깅하거나, 검증하거나, 필터링하거나, 검색하거나, 시각화할 수 있습니다. JOSM은 다양한 플러그인과 스크립트를 지원하며, OSM 데이터를 다른 형식으로 변환하거나, 다른 서비스와 연동할 수 있습니다.
  5. OSM 데이터를 편집한 후, 파일 메뉴에서 업로드를 선택합니다. 업로드 창이 열립니다.
  6. 업로드 창에서, 편집한 OSM 데이터의 변경 사항을 확인하고, 코멘트를 입력하고, 업로드 버튼을 클릭합니다. 편집한 OSM 데이터가 OSM 서버에 업로드됩니다.

iD를 사용하는 방법

iD를 사용하는 방법은 다음과 같습니다:

  1. iD의 공식 웹사이트 (https://ideditor.com/)에서 iD를 실행하거나, OSM의 공식 웹사이트 (https://www.openstreetmap.org/)에서 편집 버튼을 클릭하여 iD를 실행합니다.
  2. iD의 시작 창에서, 로그인 버튼을 클릭하여 OSM 계정으로 로그인합니다. 계정이 없는 경우, 회원가입 버튼을 클릭하여 OSM 계정을 생성합니다.
  3. iD의 편집 창에서, 원하는 지역을 지도에서 드래그하거나, 좌표나 주소를 입력하여 이동합니다. 지도의 오른쪽 상단에서 배경 지도와 오버레이를 선택할 수 있습니다.
  4. iD의 편집 창에서, OSM 데이터를 편집합니다. 노드, 웨이, 릴레이션을 생성하거나, 수정하거나, 삭제하거나, 태깅하거나, 검증하거나, 저장하거나, 공유할 수 있습니다. iD는 다양한 배경 지도와 오버레이를 지원하며, OSM 데이터를 다른 서비스와 연동할 수 있습니다.
  5. OSM 데이터를 편집한 후, iD의 편집 창의 오른쪽 상단에서 저장 버튼을 클릭합니다. 저장 창이 열립니다.
  6. 저장 창에서, 편집한 OSM 데이터의 변경 사항을 확인하고, 코멘트를 입력하고, 업로드 버튼을 클릭합니다. 편집한 OSM 데이터가 OSM 서버에 업로드됩니다.

 

OSRM 서버 구동 및 라우팅 요청

OSRM의 라우팅 서비스는 다양한 방법으로 사용할 수 있습니다. 이 강의에서는 도커 컨테이너를 사용하여 자신의 OSRM 서버를 구동하고, API 호출을 통해 결과를 확인하는 방법을 소개합니다. 도커는 소프트웨어를 표준화된 단위인 컨테이너로 패키징하는 프로그램으로, 소프트웨어가 실행되는데 필요한 라이브러리, 시스템 도구, 코드, 런타임 등을 모두 포함합니다. 도커를 사용하면 OSRM을 쉽게 설치하고 실행할 수 있습니다.

 

 

도커 컨테이너로 OSRM 서버 구동하는 방법

도커 컨테이너로 OSRM 서버를 구동하는 방법은 다음과 같습니다:

  1. 웹사이트 geofabrik.de에서 최신 OSM 데이터를 다운로드합니다. 원하는 지역의 데이터를 선택할 수 있습니다.
  2. 도커 데스크탑을 다운로드하고 백그라운드에서 실행합니다.
  3. osrm-backend 이미지를 도커로 실행합니다. 이 이미지는 OSRM의 핵심 기능을 제공하는 프로그램입니다.
  4. osrm-extract 명령어를 사용하여 OSM 데이터에서 교통 수단별로 라우팅 규칙과 조건을 추출합니다. 이때, car.lua, bicycle.lua, foot.lua 등의 프로필 파일을 선택할 수 있습니다.
  5. osrm-contract 명령어를 사용하여 추출된 데이터를 압축하고 최적화합니다. 이 과정은 라우팅 속도를 향상시킵니다.
  6. osrm-routed 명령어를 사용하여 OSRM 서버를 시작하고, 포트 번호를 지정합니다. 기본 포트 번호는 5000입니다.
  7. 웹 브라우저나 curl 명령어를 사용하여 OSRM 서버에 API 요청을 보냅니다. 요청의 형식은 OSRM 위키에 문서화되어 있습니다. 요청의 종류에는 route, table, match, trip, nearest, tile 등이 있습니다.
  8. OSRM 서버는 요청에 따라 JSON 형식의 응답을 반환합니다. 응답에는 라우팅 정보, 거리, 시간, 지리적 좌표, 회전 방향, 도로 이름 등이 포함될 수 있습니다.

 

OSRM 서버에 라우팅 요청을 보내고 결과를 확인하는 방법

OSRM 서버에 라우팅 요청을 보내고 결과를 확인하는 방법은 다음과 같습니다:

  1. 웹 브라우저나 curl 명령어를 사용하여 OSRM 서버에 API 요청을 보냅니다. 예를 들어, 서울에서 부산까지 자동차로 가는 최단 경로를요청을 보내는 방법은 다음과 같습니다:
  • 웹 브라우저를 사용하는 경우, 다음과 같은 URL을 입력합니다:
http://localhost:5000/route/v1/driving/126.9780,37.5665;129.0756,35.1798?overview=false

이 URL은 다음과 같은 의미를 가집니다:

  • http://localhost:5000은 OSRM 서버의 주소와 포트 번호입니다. 이 예제에서는 로컬 컴퓨터에서 OSRM 서버를 구동하였습니다. 만약 다른 컴퓨터나 서버에서 OSRM 서버를 구동하였다면, 해당하는 주소와 포트 번호를 입력해야 합니다.
  • /route/v1/driving은 라우팅 서비스의 버전과 교통 수단을 나타냅니다. 이 예제에서는 버전 1의 라우팅 서비스를 사용하고, 교통 수단은 자동차를 선택하였습니다. 다른 교통 수단을 사용하고 싶다면, driving 대신 bicycle이나 foot 등을 입력할 수 있습니다.
  • /126.9780,37.5665;129.0756,35.1798은 출발지와 목적지의 지리적 좌표를 나타냅니다. 이 예제에서는 출발지는 서울의 위도와 경도, 목적지는 부산의 위도와 경도를 입력하였습니다. 다른 지역의 좌표를 사용하고 싶다면, 해당하는 위도와 경도를 입력해야 합니다.
  • ?overview=false은 라우팅 결과의 상세도를 나타냅니다. 이 예제에서는 상세도를 낮게 설정하였습니다. 상세도를 높게 설정하고 싶다면, false 대신 truefull을 입력할 수 있습니다.
  • 웹 브라우저에 URL을 입력하고 엔터 키를 누르면, OSRM 서버는 요청을 처리하고 JSON 형식의 응답을 반환합니다. 응답은 다음과 같은 구조를 가집니다:

이 부분에서부터 다시 작성해 드리겠습니다. 😊

웹 브라우저에 URL을 입력하고 엔터 키를 누르면, OSRM 서버는 요청을 처리하고 JSON 형식의 응답을 반환합니다. 응답은 다음과 같은 구조를 가집니다:

{
  "code": "Ok",
  "routes": [
    {
      "geometry": "...",
      "legs": [
        {
          "steps": [
            {
              "intersections": [
                {
                  "location": [
                    126.978,
                    37.5665
                  ],
                  "bearings": [
                    135
                  ],
                  "entry": [
                    true
                  ],
                  "out": 0
                },
                ...
              ],
              "driving_side": "right",
              "geometry": "...",
              "mode": "driving",
              "maneuver": {
                "bearing_after": 135,
                "bearing_before": 0,
                "location": [
                  126.978,
                  37.5665
                ],
                "type": "depart",
                "instruction": "서울에서 출발하세요"
              },
              "weight": 0.6,
              "duration": 0.6,
              "name": "",
              "distance": 5.3
            },
            ...
          ],
          "weight": 10620.2,
          "duration": 10620.2,
          "summary": "경부고속도로",
          "distance": 325468.8
        }
      ],
      "weight_name": "routability",
      "weight": 10620.2,
      "duration": 10620.2,
      "distance": 325468.8
    }
  ],
  "waypoints": [
    {
      "hint": "...",
      "distance": 5.3,
      "name": "",
      "location": [
        126.978,
        37.5665
      ]
    },
    {
      "hint": "...",
      "distance": 0.8,
      "name": "중앙로",
      "location": [
        129.076,
        35.1798
      ]
    }
  ]
}

이 응답은 다음과 같은 의미를 가집니다:

  • code는 요청의 성공 여부를 나타냅니다. 이 예제에서는 Ok로 요청이 성공적으로 처리되었음을 의미합니다. 만약 요청이 실패하였다면, NoRoute, InvalidUrl, ServiceError 등의 코드와 에러 메시지가 반환됩니다.
  • routes는 요청에 대한 라우팅 결과를 나타냅니다. 이 예제에서는 하나의 라우팅 결과만 반환되었지만, 여러 개의 라우팅 결과가 반환될 수도 있습니다. 각 라우팅 결과는 다음과 같은 정보를 포함합니다:
    • geometry: 라우팅 결과의 지리적 좌표를 압축한 문자열입니다. 이 문자열을 해독하면, 라우팅 결과를 지도에 표시할 수 있습니다.
    • legs: 라우팅 결과를 구성하는 구간들입니다. 이 예제에서는 출발지와 목적지 사이에 하나의 구간만 있지만, 경유지가 있는 경우에는 여러 개의 구간이 있을 수 있습니다. 각 구간은 다음과 같은 정보를 포함합니다:
      • steps: 구간을 구성하는 단계들입니다. 각 단계는 한 번의 회전이나 방향 전환을 의미합니다. 각 단계는 다음과 같은 정보를 포함합니다:
        • intersections: 단계에서 만나는 교차점들입니다. 각 교차점은 다음과 같은 정보를 포함합니다:
          • location: 교차점의 지리적 좌표입니다.
          • bearings: 교차점에서 이용할 수 있는 방향들입니다. 각 방향은 북쪽을 기준으로 한 시계 방향의 각도입니다.
          • entry: 교차점에서 이용할 수 있는 방향들의 진입 가능 여부입니다. 각 방향에 대해 truefalse로 표시됩니다.
          • in: 교차점에 진입하는 방향의 인덱스입니다. bearings 배열에서 해당하는 인덱스를 참조합니다.
          • out: 교차점에서 진출하는 방향의 인덱스입니다. bearings 배열에서 해당하는 인덱스를 참조합니다.
        • driving_side: 단계에서 운전하는 차선의 방향입니다. rightleft로 표시됩니다.
        • geometry: 단계의 지리적 좌표를 압축한 문자열입니다. 이 문자열을 해독하면, 단계를 지도에 표시할 수 있습니다.
        • mode: 단계에서 사용하는 교통 수단입니다. driving, cycling, walking 등으로 표시됩니다.
        • maneuver: 단계에서 수행하는 회전이나 방향 전환에 대한 정보입니다. 다음과 같은 정보를 포함합니다:
          • bearing_after: 회전이나 방향 전환 후의 방향입니다. 북쪽을 기준으로 한 시계 방향의 각도입니다.
          • bearing_before: 회전이나 방향 전환 전의 방향입니다. 북쪽을 기준으로 한 시계 방향의 각도입니다.
          • location: 회전이나 방향 전환을 수행하는 지점의 지리적 좌표입니다.
          • type: 회전이나 방향 전환의 유형입니다. depart, arrive, turn, continue, roundabout, fork, merge, end of road, use lane, notification 등으로 표시됩니다.
          • instruction: 회전이나 방향 전환에 대한 설명입니다. 음성 안내나 텍스트 안내에 사용됩니다.
        • weight: 단계의 가중치입니다. 라우팅 프로필에 따라 다른 요소들을 고려하여 계산됩니다. 예를 들어, 도로의 속도, 교통량, 경사도, 표면 등이 영향을 줄 수 있습니다.
        • duration: 단계의 소요 시간입니다. 초 단위로 표시됩니다.
        • name: 단계에서 사용하는 도로의 이름입니다. 없는 경우에는 빈 문자열로 표시됩니다.
        • distance: 단계의 거리입니다. 미터 단위로 표시됩니다.
      • weight: 구간의 가중치입니다. 구간을 구성하는 단계들의 가중치의 합입니다.
      • duration: 구간의 소요 시간입니다. 구간을 구성하는 단계들의 소요 시간의 합입니다.
      • summary: 구간의 요약입니다. 구간에서 사용하는 주요 도로의 이름들을 나열합니다.
      • distance: 구간의 거리입니다. 구간을 구성하는 단계들의 거리의 합입니다.
    • weight_name: 라우팅 결과의 가중치를 계산하는데 사용한 요소의 이름입니다. 예를 들어, routability, distance, duration 등으로 표시됩니다.
    • weight: 라우팅 결과의 가중치입니다. 라우팅 결과를 구성하는 구간들의 가중치의 합입니다.
    • duration: 라우팅 결과의 소요 시간입니다. 라우팅 결과를 구성하는 구간들의 소요 시간의 합입니다. 라우팅 결과의 거리입니다. 라우팅 결과를 구성하는 구간들의 거리의 합입니다.
  • waypoints: 요청에 사용된 출발지, 목적지, 경유지들의 정보입니다. 각 웨이포인트는 다음과 같은 정보를 포함합니다:
    • hint: 웨이포인트의 위치를 식별하는 암호화된 문자열입니다. 이 문자열을 사용하면, 같은 위치에 대한 요청을 더 빠르게 처리할 수 있습니다.
    • distance: 웨이포인트와 가장 가까운 도로 사이의 거리입니다. 미터 단위로 표시됩니다.
    • name: 웨이포인트와 가장 가까운 도로의 이름입니다. 없는 경우에는 빈 문자열로 표시됩니다.
    • location: 웨이포인트의 지리적 좌표입니다.

이상으로 OSRM 서버에 라우팅 요청을 보내고 결과를 확인하는 방법에 대해 설명하였습니다. OSRM 서버는 OSM 데이터를 바탕으로 빠르고 정확한 라우팅 서비스를 제공합니다. OSRM 서버는 다양한 교통 수단과 라우팅 옵션을 지원하며, API 요청과 응답의 형식은 OSRM 위키에 문서화되어 있습니다. OSRM 서버를 사용하여 다양한 서비스를 개발하고, 지도와 라우팅의 세계를 탐험해 보세요. 감사합니다. 😊

 

 

 

OSM과 OSRM의 개념과 역사, 장점과 한계, 사용 사례와 예시

OSM과 OSRM이란 무엇인가? OSM은 OpenStreetMap의 약자로, 전 세계의 지리적 데이터를 무료로 제공하는 협업적인 매핑 프로젝트입니다 . OSRM은 Open Source Routing Machine의 약자로, OSM 데이터를 사용하는 고

hybumworld.com

 

 

OSM과 OSRM의 데이터 구조와 라이선스, 커뮤니티와 파트너, 통합된 도구와 플랫폼

OSM과 OSRM의 데이터 구조는 어떻게 되나? OSM의 데이터 구조는 다음과 같습니다 : OSM의 기본 단위는 노드입니다. 노드는 지도상의 한 점을 나타내며, 위도와 경도 좌표를 가지고 있습니다. 노드는

hybumworld.com

 

 

OSM과 OSRM의 고급 기능과 커스터마이징 방법

OSM과 OSRM의 데이터와 소프트웨어의 구조와 원리 OSM과 OSRM의 데이터와 소프트웨어의 구조와 원리를 이해하는 것은 고급 기능과 커스터마이징을 수행하는데 필수적입니다. OSM과 OSRM의 데이터와

hybumworld.com

 

 

OSM과 OSRM의 최신 동향과 미래 전망

OSM과 OSRM의 역사와 비전 OSM과 OSRM의 역사와 비전을 이해하는 것은 OSM과 OSRM의 가치와 목적을 파악하는데 도움이 됩니다. OSM과 OSRM의 역사와 비전은 다음과 같습니다: OSM은 2004년 영국의 스티브 코

hybumworld.com

 

반응형