# OSRM Python API 使用說明
OSRM (Open Street Routing Machine) 是一個開源的地圖搜尋引擎,資料來源係基於 OpenStreetMap。OSRM 的底層使用 C++ 開發,並且官方提供 HTTP 接口,可供開發人員進行串接。本篇文章為筆者自行編寫的 [OSRM Python API](https://github.com/chhuang17/osrm_api) 使用說明,此 API 即是利用官方提供之 HTTP 接口,利用 Python 的 ```requests``` 套件爬取並解析 json 資料。
## 兩點之間求取旅行資訊
### 旅行距離
當您有任意兩點的經緯度座標時,您可以呼叫 ```distance()``` 函式,取得兩點間之旅行距離。兩點間的旅行距離是 OSRM 官方利用演算法求解得出,此處不詳述。必須注意的是,__座標填入必須先填入經度,再填入緯度__,即 __(經度, 緯度)__。
```python
distance = osrm.distance(orign, destn, unit='m', steps='false')
```
#### 輸入引數 (Input Arguments)
|引數名稱|說明|資料型態|
|:--|:--|:--|
|```orign```|起點經緯度座標。|```list```, ```tuple```, or array-like|
|```destn```|迄點經緯度座標。|```list```, ```tuple```, or array-like|
|```unit```|度量單位,預設為 ```'m'```。|```str```|
|```steps```|是否回傳詳細資料,預設為 ```'false'```。|```str```|
#### 輸出 (Output)
兩點間旅行距離,資料型態為 ```float```。若 ```steps='true'```,
### 旅行時間
當您有任意兩點的經緯度座標時,您可以呼叫 ```travTime()``` 函式,取得兩點間之旅行時間。必須注意的是,__官方提供的旅行時間並不會因為在不同的時間 call API 有所變化__,另外,__座標也是必須先填入經度,再填入緯度__,即 __(經度, 緯度)__。
```python
travelTime = osrm.travTime(orign, destn, unit='m', steps='false')
```
#### 輸入引數 (Input Arguments)
|引數名稱|說明|資料型態|
|:--|:--|:--|
|```orign```|起點經緯度座標。|```list```, ```tuple```, or array-like|
|```destn```|迄點經緯度座標。|```list```, ```tuple```, or array-like|
|```unit```|度量單位,預設為 ```'m'```。|```str```|
|```steps```|是否顯示詳細資料,預設為 ```'false'```。|```str```|
#### 輸出 (Output)
兩點間旅行距離,資料型態為 ```float```。若 ```steps='true'```,
***
## 多點之間求取旅行資訊
在很多使用情境下,您可能需要一次求取數個點彼此之間的旅行資訊。此外,若短時間內連續向 OSRM 官方提供的 HTTP 接口發送請求,官方會阻擋並間隔約 5 秒鐘的時間,才會回傳您需要的資訊。考量到程式運行效率,因此在實作上,大多時候會一次求取數個點的旅行資訊。
### O-D 矩陣
O-D 為 Origin-Destination 的縮寫,即起點-迄點的意思,是運輸學領域和地理學領域常見名詞。當您有任意 $N$ 個點的經緯度座標時,您可以呼叫 ```odMatrix()``` 函式,取得一 O-D 矩陣。
```python
matrix = osrm.odMatrix(
nodeList,
get='distance',
sources=None,
distUnit='m',
timeUnit='second'
)
```
#### 輸入引數 (Input Arguments)
|引數名稱|說明|資料型態|
|:--|:--|:--|
|```nodeList```|$N$ 個點的經緯度座標。|```list```|
|```get```|欲取得之資訊,預設為 ```'distance'```。|```str```|
|```sources```|原點,預設為 ```None```。|```NoneType``` or ```int```|
|```distUnit```|距離度量單位,預設為 ```'m'```。|```str```|
|```timeUnit```|時間度量單位,預設為 ```'second'```。|```str```|
#### 輸出 (Output)
$N \times N$ 的方陣,資料型態為 ```np.array```。
### 旅行距離序列
若您手邊有 $N$ 個點的經緯度座標,且您想知道 $1 \rightarrow 2 \rightarrow 3 \rightarrow \cdots \rightarrow N$ 依序之旅行距離,您可以呼叫 ```distSeq()``` 函式,取得您需要的資訊。
```python
distSeqList = osrm.distSeq(
nodeList=None,
matrix=None,
sources=None,
distUnit='m'
)
```
#### 輸入引數 (Input Arguments)
|引數名稱|說明|資料型態|
|:--|:--|:--|
|```nodeList```|$N$ 個點的經緯度座標,預設為 ```None```,與 ```matrix``` 擇一輸入。|```NoneType``` or ```list```|
|```matrix```|欲取得之資訊,預設為 ```None```,與 ```nodeList``` 擇一輸入。|```NoneType``` or ```list```|
|```sources```|原點,預設為 ```None```。|```NoneType``` or ```int```|
|```distUnit```|距離度量單位,預設為 ```'m'```。|```str```|
#### 輸出 (Output)
點到點依序之旅行距離,資料型態為 ```list```,長度為 $N-1$。
### 旅行時間序列
若您手邊有 $N$ 個點的經緯度座標,且您想知道 $1 \rightarrow 2 \rightarrow 3 \rightarrow \cdots \rightarrow N$ 依序之旅行時間,您可以呼叫 ```travTimeSeq()``` 函式,取得您需要的資訊。
```python
travTimeSeqList = osrm.travTimeSeq(
nodeList=None,
matrix=None,
sources=None,
timeUnit='second'
)
```
#### 輸入引數 (Input Arguments)
|引數名稱|說明|資料型態|
|:--|:--|:--|
|```nodeList```|$N$ 個點的經緯度座標,預設為 ```None```,與 ```matrix``` 擇一輸入。|```NoneType``` or ```list```|
|```matrix```|欲取得之資訊,預設為 ```None```,與 ```nodeList``` 擇一輸入。|```NoneType``` or ```list```|
|```sources```|原點,預設為 ```None```。|```NoneType``` or ```int```|
|```timeUnit```|距離度量單位,預設為 ```'second'```。|```str```|
#### 輸出 (Output)
點到點依序之旅行時間,資料型態為 ```list```,長度為 $N-1$。