Amazon Location Service を使って、オフィスからランチ先までの歩行距離を計算してみた
Amazon Location Service を使って、オフィスからランチ先までの歩行距離を計算してみた
こんにちは、クラウド事業本部コンサルティング部のたかくに(@takakuni_)です。
みなさん、普段ランチはどこにいってますでしょうか。私はよくオフィスから外に出ています。
たまには遠出したくなるのですが、はじめていってみる場所や、若干距離が遠い場所だと、お昼休みの終了時刻に間に合うか少し心配です。
そこで、今回は Amazon Location Service を利用して、オフィスからランチ先へのルート計算を行ってみようと思います。(スマホのマップアプリ?なんのことでしょうか。)
ルート計算
Amazon Location Service ではルート計算に ルート計算リソース
が利用できます。
ルート計算リソースを利用することで、出発地点から到着地点までの距離や時間を計算できます。
{
"Legs": [
{
"Distance": 178.5,
"DurationSeconds": 6480,
"EndPosition": [-122.3394, 47.6159],
"Geometry": {
"LineString": [
[-122.7565, 49.0021],
[-122.3394, 47.6159]
]
},
"StartPosition": [-122.7565, 49.0021],
"Steps": [
{
"Distance": 178.5,
"DurationSeconds": 6480,
"EndPosition": [-122.3394, 47.6159],
"GeometryOffset": 0,
"StartPosition": [-122.7565, 49.0021]
}
]
}
],
"Summary": {
"DataSource": "Esri",
"Distance": 178.5,
"DistanceUnit": "Kilometers",
"DurationSeconds": 6480,
"RouteBBox": [-122.7565, 49.0021, -122.3394, 47.6159]
}
}
移動の計算は API または、 AWS CLI を利用して行います。出発地点と到着地点の緯度と経度から計算します。
aws location \
calculate-route-matrix \
--calculator-name ExampleCalculator \
--departure-positions "[[-122.7565,49.0021],[-122.2014,47.6101]]" \
--destination-positions "[[-122.3394,47.6159],[-122.4813,48.7511]]"
Bicycle
、Car
、Walking
など交通機関別の移動モードも用意されており、興味深いですね。
TravelMode – ルートを計算するとき、交通手段を指定します。例えば、Bicycle、Car、Motorcycle、Truck、Walking などです。
ルートの計算方法がわかりました。
ただ、出発地点と到着地点の緯度と経度はあまりパッとイメージできないですね。(住所はなんとなく出てきますが。)
ジオコーディング
ジオコーディングは、住所や地名などを緯度/経度に変換する技術です。
Location Service ではジオコーディング API がサポートされています。こちらで緯度/経度を計算すれば、ルートが計算できそうです。
aws location \
search-place-index-for-text \
--index-name ExamplePlaceIndex \
--text "Any Town" \
--max-results 10
やってみる
それではさっそくやってみましょう。まずはプレースインデックスの作成です。
プレースインデックスの作成
プレースインデックスは、ジオコーディング、リバースジオコーディング、検索のクエリを行うプロバイダーを登録する機能です。
今回、プロバイダーは Esri
を選択しました。
aws location \
create-place-index \
--data-source "Esri" \
--description "Sapporo Office place index" \
--index-name "SapporoOffice"
ジオコーディング
それではジオコーディングを行います。
出発地点と到着地点の住所の緯度/経度を計算します。
出発地点
aws location \
search-place-index-for-text \
--index-name SapporoOffice \
--text "北海道札幌市中央区北3条西1丁目1−1 札幌ブリックキューブ 10階" \
--max-results 10
以下が出力されました。
Relevance(関連性)が 0.9576
だった 141.354520349463, 43.065726916802
を利用します。
{
"Summary": {
"Text": "北海道札幌市中央区北3条西1丁目1−1 札幌ブリックキューブ 10階",
"MaxResults": 10,
"ResultBBox": [
141.354520349463, 43.06540906, 141.35504728, 43.065726916802
],
"DataSource": "Esri"
},
"Results": [
{
"Place": {
"Label": "北海道札幌市中央区北3条西1-1-1",
"Geometry": {
"Point": [141.354520349463, 43.065726916802]
},
"AddressNumber": "1",
"Neighborhood": "1",
"Municipality": "中央区",
"Region": "北海道",
"Country": "JPN",
"PostalCode": "0600003",
"Interpolated": false,
"Categories": ["AddressType"],
"SubMunicipality": "北3条西"
},
"Relevance": 0.9576
},
{
"Place": {
"Label": "北海道札幌市中央区北3条西1",
"Geometry": {
"Point": [141.35504728, 43.06540906]
},
"Neighborhood": "1",
"Municipality": "中央区",
"Region": "北海道",
"Country": "JPN",
"Interpolated": false,
"Categories": ["NeighborhoodType"],
"SubMunicipality": "北3条西"
},
"Relevance": 0.8234
}
]
}
到着地点
aws location \
search-place-index-for-text \
--index-name SapporoOffice \
--text "札幌市中央区南2条西1丁目6-1" \
--max-results 10
結果が一個しか出なかったですが、こちらも 141.356548099479, 43.058044860632
を利用します。
{
"Summary": {
"Text": "札幌市中央区南2条西1丁目6-1",
"MaxResults": 10,
"ResultBBox": [
141.356548099479, 43.058044860632, 141.356548099479, 43.058044860632
],
"DataSource": "Esri"
},
"Results": [
{
"Place": {
"Label": "北海道札幌市中央区南2条西1-6-1",
"Geometry": {
"Point": [141.356548099479, 43.058044860632]
},
"AddressNumber": "1",
"Neighborhood": "1",
"Municipality": "中央区",
"Region": "北海道",
"Country": "JPN",
"PostalCode": "0600062",
"Interpolated": false,
"Categories": ["AddressType"],
"SubMunicipality": "南2条西"
},
"Relevance": 1
}
]
}
緯度/経度が求まったため、ルート計算を行います。
ルート計算リソースの作成
計算を行うためにルート計算リソースを作成します。
ルート計算リソースは、プレースインデックスと同じように、計算を行うためのプロバイダーの登録を行う機能です。
aws location \
create-route-calculator \
--calculator-name "SapporoOffice" \
--data-source "Esri"
~ $ aws location \
> create-route-calculator \
> --calculator-name "SapporoOffice" \
> --data-source "Esri"
{
"CalculatorName": "SapporoOffice",
"CalculatorArn": "arn:aws:geo:ap-northeast-1:622809842341:route-calculator/SapporoOffice",
"CreateTime": "2025-01-30T14:41:39.185000+00:00"
}
ルートの計算
ルートの計算を行います。--travel-mode Walking
がポイントです。(デフォルトは車での走行距離が求められます。)
aws location \
calculate-route \
--calculator-name SapporoOffice \
--departure-position 141.354520349463 43.065726916802 \
--destination-position 141.356548099479 43.058044860632 \
--travel-mode Walking
おおよそ、1 キロメートル。片道 12 分の経路でした。今日のランチとおおよそ同じ時間で到着でした。素晴らしいですね。
{
"Legs": [
{
"StartPosition": [141.35483705135047, 43.065810114540746],
"EndPosition": [141.35681028408754, 43.058113133178026],
"Distance": 0.9988212603743133,
"DurationSeconds": 719.1788182380001,
"Steps": [
{
"StartPosition": [141.35483706621102, 43.065810095521876],
"EndPosition": [141.35507264883734, 43.064911406056375],
"Distance": 0.10165379097188795,
"DurationSeconds": 73.183093534
},
{
"StartPosition": [141.3550726650559, 43.06491145293646],
"EndPosition": [141.35589671534436, 43.06501591557786],
"Distance": 0.068115234375,
"DurationSeconds": 49.04296875
},
{
"StartPosition": [141.35589671520654, 43.065015904778676],
"EndPosition": [141.35644220056972, 43.06270014267401],
"Distance": 0.261077880859375,
"DurationSeconds": 187.992187499
},
{
"StartPosition": [141.35644221559485, 43.062700151982376],
"EndPosition": [141.35721229737467, 43.05963555693816],
"Distance": 0.3462066650390625,
"DurationSeconds": 249.29296875
},
{
"StartPosition": [141.35647071763867, 43.05953477950378],
"EndPosition": [141.356810306655, 43.05811316601559],
"Distance": 0.2217676891289878,
"DurationSeconds": 159.667599705
}
]
}
],
"Summary": {
"RouteBBox": [
141.35483705135047, 43.058113133178026, 141.35721229737467,
43.065810114540746
],
"DataSource": "Esri",
"Distance": 0.9988212603743133,
"DurationSeconds": 719.1788182380001,
"DistanceUnit": "Kilometers"
}
}
まとめ
以上、「Amazon Location Service を使って、オフィスからランチ先までの歩行距離を計算してみた」でした。
これで、行ったことない or 若干距離が遠い場所でも、所用時間の計算ができますね。めでたし、めでたし。
このブログがどなたかの参考になれば幸いです。クラウド事業本部コンサルティング部のたかくに(@takakuni_)でした!