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

Book - 틀리지 않는 법

Book - 틀리지 않는 법

틀리지 않는 법

지금까지 읽었던 Data science 관련 교양서 중 가장 두꺼운 책입니다. (총 페이지가 무려 614p..)

블로그, 커뮤니티에서 추천하는 걸 보고 구매했는데 모든 내용을 다 이해하지는 못했지만 앞으로 업무하면서 충분히 도움이 될 만한 내용들이 많아서 만족했습니다. 책의 어떤 내용들은 읽었을 때에는 당연한 얘기일 수도 있어 보이지만 일을 하다보면 간과하기 쉬운 부분이기도 했습니다.

프롤로그

어떤 가정을 품고 있는가? 그 가정은 정당한가?

전쟁에서 총알구멍이 아군의 비행기에서 한 대당 두 개 이상 절대 발견되지 않는다면?

-> 조종사들이 적의 포화를 피하는 데 뛰어난 것이 아니라 두 번 이상 맞은 비행기는 돌아오지 못했다는 것

선형성

같은 계산을 다른 방식으로 여러 차례 반복했을 때, 다른 답이 나온다면 문제가 있다.

  • 비례를 잘못사용해서 해석할 경우
    • 어떤 술집이 문 닫을 시각까지 남아 있던 두 남자 중 한 명이 다른 한명을 폭행
      • 이것이 곧 미국인 50%가 폭행을 당한 격이라고 말할 수 없는 것
  • Volumn과 Ratio를 문제 상황에 맞게 활용

큰 수의 법칙

  • 이미 벌어진 일에 대해서 균형을 맞추는 것이 아니라, 비율로 따져서 과거의 횟수가 무시해도 좋을 만큼 작아질 때까지 새로운 데이터를 더함으로써 이미 벌어진 일을 희석

추론

인간은 패턴이 없는 곳에서도 패턴을 읽어 내고 실제 패턴이 있을 때에는 그 힘을 과대평가하는 경향이 있다.

P-value 해킹

  • 저널의 다양한 분야를 조사한 결과, P-value 그래프는 기준인 0.05로 다가갈수록 눈에 띄게 상승
  • 발표 불가능한 실험 결과 중 다수가 저자의 의도로 경계선 너머 허용할 수준으로 넘어왔다는 추론 가능

판사가 아니라 탐정

  • p-value와 더불어 신뢰 구간 같이 보기
  • 신뢰 구간은 실제 관찰한 결과에 합리적으로 부합하는 가설들의 범위를 말함
    • 신뢰 구간이 [3%, 17%]라면 효과가 양성이긴 하지만 그렇게 까지 크진 않다는 것
    • But, [9%, 11%]라면 효과가 양성일 뿐 아니라 상당이 크다는 것을 암시

회귀

상관관계와 정보량간의 관계

  • 측정 항목들 간의 상관관계가 더 클수록 분류된 데이터의 정보량은 작아짐
    • 즉 Segment할 때에는 상관관계가 적은 변수로 해야 의미가 있음

상관관계가 없다고 해서 연관성이 없는 것이 아니다

  • 골턴의 상관관계 개념은 한 변수가 증가하면 다른 변수도 그에 비례하여 증가하거나 감소하는 선형적 관계만 감지
    • But, 모든 관계가 선형적 관계는 아님
  • 수학적 도구는 특정 종류희 현상은 감지하지만 다른 종류는 감지하지 못함
  • 상관관계가 없다는 말은 상관 계수가 감지할 수 있는 종류의 관계가 없다는 뜻일 뿐

에필로그

기대값

  • 기대값은 우리가 기대하는 값이 아니라, 가능한 결과들에 대한 확률적 타협

TIL - Pyhton 'list' object has no attribute 'split'

구글링하면서 임기응변식으로 Python을 사용하고 학습하게 되었을 때 이런 부분들에서 약점이 생기는 것 같습니다.

위 제목의 에러가 발생하게 된 원인은 list에 split 메소드를 사용했기 때문인데, split 메소를 어떻게 써야하는지 document를 보면서 짚고 넘어가려고 합니다.

Error Message

1
'list' object has no attribute 'split'

Document

str split

첫 문구에 string의 word를 list형태로 return해준다고 나와있습니다. 즉, list에 직접 split 메소드를 쓸 수 없고 list안에 있는 문자열을 순회하면서 사용하면 됩니다.