経路探索の基本：経費精算を自動化する簡単な方法

**本記事はヴァル研究所の支援として作成された記事です**

コロナ禍から明けつつある中、対面の会議や出張が増え、経費精算という面倒な作業が戻ってきています。領収書の保管や経路の記入が手間ですし、経理部門も検算に負担を感じているのではないでしょうか。

そうした負担を軽減する方法として、経費精算の自動化があります。本記事では、そのファーストステップとも言える経路探索について解説します。

## 経路探索について

経路探索とは、出発地と到着地を指定して経路を検索する手法です。日本では電車や地下鉄、バス、飛行機、船など多様な交通手段の選択肢があります。また、選択される経路は出発時間や到着時間、乗り換えの回数などの条件によって異なります。

通常、多くの人が移動情報を提供するアプリを利用します。しかし、経費精算を行う際は、使用した交通手段の記録や費用の計算が、複雑になることがあります。特に記憶を頼りにした記述や、現金とICカードの使用による金額の違いが計算を煩雑にします。

### APIによる解決

そこで導入したいのが、[駅すぱあと API](https://ekispert.jp/products/api)です。駅すぱあと APIは、駅すぱあとが持つ経路探索・乗り換え案内機能や公共交通機関データをAPIとして提供しています。本APIを使うことで、アプリケーションやシステムに経路探索機能を組み込めます。

たとえば入力したデータを直接経理システムに送信したり、経路探索結果を営業支援システムに表示することができます。そうすれば、従業員は経路探索を手作業で行う必要がなく、経路探索の精度も向上するでしょう。データで送られてくれば、経理部門も検算作業が楽（または不要）になるはずです。

## 経費精算の課題と経路探索APIの解決策

経費精算は出張や外出で発生した費用を精算する作業で、領収書の提出、費用の記入、精算書の経理部門への提出などが必要です。出張の場合は金額が大きくなり、領収書が必要になります。しかし、日常の外出ではICカード利用が多く、領収書は発行されません。経費精算では記憶を頼りにした記入や領収書の保管、経路の記入などの手間が発生します。

そこで、経路探索APIの導入がお勧めです。APIを利用して経路探索を自動化すれば、記入ミスを減らしつつ、精算書の検算負担を軽減します。経費精算は大事ですが、非生産的な業務であり、その効率化と自動化が求められます。

## 駅すぱあと APIの基本的な機能と経路探索について

駅すぱあと APIの概要と、経路探索に用いる基本的な機能について説明します。

### 駅すぱあと APIについて

駅すぱあと APIは、HTTPS/HTTP経由で利用します。クエリーパラメーターを使って条件を指定し、結果はJSONまたはXMLで返ってきます。情報取得系のみのため、リクエストはすべてGETメソッドです。APIは、以下のような機能を提供しています。

- 探索
- 駅の情報
- 駅の付加情報
- 路線の情報
- [その他](https://api-info.ekispert.com/product/)

なお、利用する際にはAPIキーが必要です。[トライアルはこちらから](https://api-info.ekispert.com/form/trial/)申し込めます。

### 経路探索の基本的な機能

探索系APIの基本的な機能は以下になります。今回は経路探索を使います。

- 経路探索
- 前後のダイヤ探索
- 範囲探索
- 経路簡易探索
- 平均待ち時間バスのみ探索
- 平均待ち時間探索

経路探索のエンドポイントは以下になります。JSONで取得したい場合は、 `/v1/json/search/course/extreme` になります。

```
GET /v1/{format}/search/course/extreme
```

また、必須パラメーターは以下になります。

| パラメーター | 説明         |
| ------------ | ------------ |
| key          | アクセスキー |
| viaList      | 駅コード、駅の名称 、座標情報、住所情報または 地点データ などのリスト |

オプションパラメーターとしては `date` （日付） や `time` （時間）、 `sort` （並び替え条件）などがあります。詳しくは[APIドキュメント](https://docs.ekispert.com/v1/api/search/course/extreme.html)を見てください。

#### viaListについて

viaListは出発駅や乗換駅、目的駅などを指定するパラメーターです。viaListは、以下のような構成です。

- 先頭: 出発駅
- 末端: 目的駅
- 先頭と末端の間: 経由駅

つまり、最低限2つのデータがあります。経由駅がある場合は、出発駅と目的駅の間に順番通り指定してください。

### 経路探索の結果

今回は、駅名を指定して経路探索APIを実行します。たとえば、以下は `高円寺→東京→大阪` という経路を探索する例です。 `YOUR_ACCESS_KEY` はご自身のアクセスキーに置き換えてください。

```
GET https://api.ekispert.jp/v1/json/search/course/extreme?key=YOUR_ACCESS_KEY&viaList=高円寺:東京:大阪&searchType=plain
```

※ 実際のリクエスト時にはクエリーパラメータをURLエンコードしてください

結果は、以下のようになります（一部省略しています）。この中にある `ResultSet.Course` が経路の情報になります。その中に、金額 `Price` や経路 `Route` などが含まれています。

```js
{
	"ResultSet": {
		"apiVersion": "1.27.0.0",
		"engineVersion": "202405_04a",
		// 経路探索の結果である経路を表す要素
		"Course": [
			{
				"searchType": "plain",
				"dataType": "plain",
				"SerializeData": "VkV...998",
				// 金額を表す要素
				"Price": [
					{
						"fareRevisionStatus": "none",
						"toLineIndex": "2",
						"fromLineIndex": "1",
						"kind": "Fare",
						"index": "1",
						"selected": "true",
						"Type": "Fare",
						"Oneway": "320",
						"RevisionStatus": "latest",
						"Round": "640"
					},
					:
				],
				// 経路探索結果の経路のみを表す要素
				"Route": {
					"timeOther": "46",
					"timeOnBoard": "124",
					"exhaustCO2": "51213",
					"exhaustCO2atPassengerCar": "73255",
					"distance": "5635",
					"timeWalk": "15",
					"transferCount": "5",
					// 区間 を表す要素
					"Line": [
						{
							"direction": "Up",
							"stopStationCount": "5",
							"teiki3Index": "1",
							"teiki6Index": "1",
							"timeOnBoard": "20",
							"exhaustCO2": "273",
							"fareIndex": "1",
							"exhaustCO2atPassengerCar": "2093",
							"distance": "161",
							"teiki1Index": "1",
							"Name": "ＪＲ中央線快速",
							"Type": "train",
							"ArrivalState": {
								"Type": "normal",
								"Datetime": {
									"text": "2024-05-10",
									"operation": "today"
								}
							},
							"TypicalName": "ＪＲ中央線快速",
							"TimeReliability": "none",
							"DepartureState": {
								"Type": "normal",
								"Datetime": {
									"text": "2024-05-10",
									"operation": "today"
								}
							},
							"LineSymbol": {
								"code": "8",
								"Name": "JC"
							},
							"Color": "250060002"
						},
						:
					],
					// 地点 を表す要素
					"Point": [
						{
							"Station": {
								"code": "22671",
								"Name": "高円寺",
								"Type": "train",
								"Yomi": "こうえんじ"
							},
							"Prefecture": {
								"code": "13",
								"Name": "東京都"
							},
							"GeoPoint": {
								"longi": "139.39.10.90",
								"lati": "35.42.7.60",
								"longi_d": "139.653027",
								"gcs": "tokyo",
								"lati_d": "35.70211"
							}
						},
						:
					]
				}
			},
			:
		]
	}
}
```

レスポンスには各期間ごとの定期代や片道・往復運賃、地点の緯度経度、出口の名称などさまざまな情報が含まれます。詳しくは[APIドキュメント](https://docs.ekispert.com/v1/api/search/course/extreme.html)をみてください。

## 導入時の注意点

ここからは、経路探索を自社システムに組み込む際の注意点について解説します。

### API仕様について

経路探索APIには、他にも多数の検索条件があります。詳細はドキュメントを確認してください。

[経路探索 - 駅すぱあと API Documents 駅データ・経路検索のWebAPI](https://docs.ekispert.com/v1/api/search/course/extreme.html)

経路探索は駅だけでなく、位置情報や住所情報を使った検索も行えます。たとえば会社や従業員の住所情報を使って最寄り駅からの経路を検索、などもできます。

### 更新について

公共交通機関は、ときどき新しい路線や駅が増えます。また、定期的にダイヤも変更されたり、費用も変わります。そうしたアップデートに対応していないと、経費精算には利用できません。

駅すぱあと APIは、駅すぱあとと同じデータを利用しており、随時データを更新しています。アップデート情報は、[こちらで確認](https://support.ekispert.jp/hc/ja/sections/7848965400975--%E9%A7%85%E3%81%99%E3%81%B1%E3%81%82%E3%81%A8-%E3%82%A2%E3%83%83%E3%83%97%E3%83%87%E3%83%BC%E3%83%88%E6%83%85%E5%A0%B1)できます。

### 費用について

経路探索APIは、サービスによって料金が異なります。駅すぱあと APIは、リクエスト数買い切り型や、サブスクリプションモデルなどを選べます。まずはトライアルで自社要件を満たすか確認しましょう。

[プラン - 駅すぱあと API | 乗換案内・交通費計算のAPI](https://api-info.ekispert.com/plan/)

## まとめ

経路探索は、出張や外出に伴う経費精算において重要な機能ですが、手作業で行うとミスが生じやすく、負担も大きいのが難点です。APIをシステムに組み込み、自動化しましょう。

駅すぱあと APIは、充実したAPIとサポート環境が用意されています。ぜひ使ってみてください。