Open Source Routing Machine (OSRM) with Python

OSRM 최적의 경로 찾기

Open Source Routing Machine (OSRM)은 지도상의 도로 Network에서 최단 경로를 계산하는 C ++ 라우팅 엔진입니다.

지도상의 포인트 A와 포인트 B 사이의 거리를 구하는 가장 쉬운 방법은 직선거리를 계산하는 것입니다.

그러나 직선거리로 계산하게되면 도로 상황을 무시해서 실제 이동거리와 많은 차이가 발생할 수 있는데, 이 OSRM API를 활용하면 네이버 길찾기처럼 경로, 소요시간, 이동거리 등과 같은 값을 얻을 수 있어서 유용합니다.

OSRM

API Document

API Document를 보면 Nearest, Route, Trip등 다양한 Service가 있는데, 이 중에서 Route service를 활용해보려고 합니다.

OSRM API Doc

신도림역 -> 문래역 Route

  • 이동수단도 선택이 가능한데 아래에서는 bike로 설정
    • car, bike, foot
  • route는 map에서 그리기 용이한 형태로 저장
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import requests
import folium
import polyline
import json
import pandas as pd

def get_route(origin_lon, origin_lat, dest_lon, dest_lat):
"""출발지, 도착지 좌표를 입력해서 Route 정보 Return"""

loc = "{},{};{},{}".format(origin_lon, origin_lat, dest_lon, dest_lat)
url = "http://router.project-osrm.org/route/v1/bike/"
r = requests.get(url + loc)
if r.status_code!= 200:
return {}

res = r.json()
routes = polyline.decode(res['routes'][0]['geometry'])
start_point = [res['waypoints'][0]['location'][1], res['waypoints'][0]['location'][0]]
end_point = [res['waypoints'][1]['location'][1], res['waypoints'][1]['location'][0]]
distance = res['routes'][0]['distance']

route = {'route':routes,
'start_point':start_point,
'end_point':end_point,
'distance':distance
}

return route


origin_lon, origin_lat, dest_lon, dest_lat = 126.890975,37.508767,126.89472929779438, 37.51792066883597
test_route = get_route(pickup_lon, pickup_lat, dropoff_lon, dropoff_lat)
1
2
3
4
5
6
7
8
9
10
11
12
13
{'route': [(37.50901, 126.89072),
(37.50918, 126.89083),
(37.50932, 126.89135),
(37.50992, 126.89262),
(37.51094, 126.89181),
(37.51198, 126.89393),
(37.51315, 126.89728),
(37.51476, 126.89392),
(37.51491, 126.89407),
(37.51792, 126.89477)],
'start_point': [37.50901, 126.890723],
'end_point': [37.517916, 126.894771],
'distance': 1584.2}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
def get_map(route):
"""출발지, 도착지, route 정보를 folium map에 표시"""
route_map = folium.Map(location=[(route['start_point'][0] + route['end_point'][0])/2,
(route['start_point'][1] + route['end_point'][1])/2],
zoom_start=13)

folium.PolyLine(
route['route'],
weight=8,
color='blue',
opacity=0.6
).add_to(route_map)

folium.Marker(
location=route['start_point'],
icon=folium.Icon(icon='play', color='green')
).add_to(route_map)

folium.Marker(
location=route['end_point'],
icon=folium.Icon(icon='stop', color='red')
).add_to(route_map)

return route_map

Route 시각화

신도림역 -> 문래역 Route가 map에 잘 표현된 걸 확인할 수 있습니다.

OSRM API TEST

Author

suyoung jang

Posted on

2021-01-24

Updated on

2021-01-24

Licensed under

댓글