Amazon Location Serviceにマトリックスルーティング機能が追加されました

2022.01.21

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

いわさです。

Amazon Location Serviceには経路計算機能があり、ある地点から目的の地点までの経路や距離、時間を計算することが可能です。

経路計算機能について、大高大輔さんが以下の記事でご紹介されています。

今回、この経路計算機能の延長でマトリックスルーティング機能が登場しました。
この記事では公式アップデート情報にあわせて「マトリックスルーティング」と表記します。

この機能を使うと複数の開始地点、目的地の組み合わせの計算結果(サマリ)を1リクエストで取得することが出来るようになりました。
早速試してみましょう。

まずはシンプルな経路計算

この記事では、Location Serviceデフォルトのカリキュレーター(Esri)を使用して計算を行っています。
プロバイダーは他のLocation Serviceの機能と同様EsriとHEREから選択が可能です。

マトリックスルーティングについては距離や座標数・範囲など制限事項がプロバイダー毎に大きく異なっています。
詳細は以下をご参照ください。

Route planning with a route matrix - Amazon Location Service

クラスメソッド札幌オフィス(141.3545555330611, 43.06586246872177)からさっぽろテレビ塔(141.3564353333389, 43.06123791693917)への徒歩の経路を計算してみます。

iwasa.takahito@hoge ~ % aws location calculate-route --calculator-name explore.route-calculator --departure-position 141.3545555330611 43.06586246872177 --destination-position 141.3564353333389 43.06123791693917 --travel-mode Walking
{
    "Legs": [
        {
            "Distance": 0.644719291855527,
            "DurationSeconds": 464.197890134,
            "EndPosition": [
                141.35640048235976,
                43.06147881974568
            ],
            "StartPosition": [
                141.35452473874554,
                43.066085903004975
            ],
            "Steps": [
                {
                    "Distance": 0.0191939630399386,
                    "DurationSeconds": 13.819653388,
                    "EndPosition": [
                        141.3547562307812,
                        43.06611819941817
                    ],
                    "StartPosition": [
                        141.35452479555897,
                        43.06608594593157
                    ]
                },
                {
                    "Distance": 0.13651674225987984,
                    "DurationSeconds": 98.292054427,
                    "EndPosition": [
                        141.35507264883734,
                        43.064911406056375
                    ],
                    "StartPosition": [
                        141.3547562348433,
                        43.06611821574366
                    ]
                },
                {
                    "Distance": 0.0681459460239333,
                    "DurationSeconds": 49.065081137,
                    "EndPosition": [
                        141.35589671534436,
                        43.06501591557786
                    ],
                    "StartPosition": [
                        141.3550726650559,
                        43.06491145293646
                    ]
                },
                {
                    "Distance": 0.2611085019502053,
                    "DurationSeconds": 187.998121404,
                    "EndPosition": [
                        141.35644220056972,
                        43.06270014267401
                    ],
                    "StartPosition": [
                        141.35589671520654,
                        43.065015904778676
                    ]
                },
                {
                    "Distance": 0.1325322571502454,
                    "DurationSeconds": 95.423225148,
                    "EndPosition": [
                        141.35672845050453,
                        43.06152582832547
                    ],
                    "StartPosition": [
                        141.3564422462035,
                        43.06270020066555
                    ]
                },
                {
                    "Distance": 0.027221881431324646,
                    "DurationSeconds": 19.59975463,
                    "EndPosition": [
                        141.35640044773726,
                        43.0614788297351
                    ],
                    "StartPosition": [
                        141.35640044773726,
                        43.0614788297351
                    ]
                }
            ]
        }
    ],
    "Summary": {
        "DataSource": "Esri",
        "Distance": 0.644719291855527,
        "DistanceUnit": "Kilometers",
        "DurationSeconds": 464.197890134,
        "RouteBBox": [
            141.35452473874554,
            43.06147881974568,
            141.35672845050453,
            43.06611821574366
        ]
    }
}

計算結果には、距離と時間、詳細なルート情報を取得することが出来ます。
札幌オフィスからテレビ塔まで徒歩8分弱、640mとのことです。

このルート情報を地図で表示してみます。地図での確認方法は大高さんが紹介されている、geojson.ioを利用しました。

マトリックスルーティング

ここからは新機能を試してみたいと思います。
AWS CLIでcalculate-route-matrixサブコマンドを利用します。(v2.4.12から利用可能)

複数の開始地点と複数の目的値を入力します。
そしてその組み合わせ毎の距離と時間を一覧で取得することが出来ます。

まずは試してみましょう。
今度はクラスメソッドの秋葉原本社と最寄りの事業所である岩本町オフィスを目的地とし、近辺の駅のいくつかを開始地点として計算させてみます。

アクセス(行き方)|クラスメソッド株式会社

駅は以下をチョイスしました。

  • 秋葉原駅 (139.77306814586785,35.69857431592774)
  • 岩本町駅 (139.77536398338418,35.69578612386775)
  • 神田駅 (139.7709760395078,35.69196105874575)
  • 小伝馬町駅 (139.77852294434757,35.69113039267699)

オフィスの座標は以下です。

  • 本社 (139.77481727730472,35.697399093303915)
  • 岩本町オフィス (139.77627634840988,35.69411059996518)
iwasa.takahito@hoge ~ % aws location calculate-route-matrix --calculator-name explore.route-calculator --departure-positions "[[139.77306814586785,35.69857431592774],[139.77536398338418,35.69578612386775],[139.7709760395078,35.69196105874575],[139.77852294434757,35.69113039267699]]" --destination-positions "[[139.77481727730472,35.697399093303915],[139.77627634840988,35.69411059996518]]" --travel-mode Walking
{
    "RouteMatrix": [
        [
            {
                "Distance": 0.455,
                "DurationSeconds": 328
            },
            {
                "Distance": 0.863,
                "DurationSeconds": 622
            }
        ],
        [
            {
                "Distance": 0.251,
                "DurationSeconds": 181
            },
            {
                "Distance": 0.235,
                "DurationSeconds": 170
            }
        ],
        [
            {
                "Distance": 0.903,
                "DurationSeconds": 650
            },
            {
                "Distance": 0.668,
                "DurationSeconds": 481
            }
        ],
        [
            {
                "Distance": 0.844,
                "DurationSeconds": 608
            },
            {
                "Distance": 0.408,
                "DurationSeconds": 294
            }
        ]
    ],
    "SnappedDeparturePositions": [
        [
            139.772838,
            35.699127
        ],
        [
            139.775344,
            35.695789
        ],
        [
            139.771001,
            35.691873
        ],
        [
            139.778444,
            35.691272
        ]
    ],
    "SnappedDestinationPositions": [
        [
            139.77482,
            35.697538
        ],
        [
            139.776454,
            35.694192
        ]
    ],
    "Summary": {
        "DataSource": "Esri",
        "DistanceUnit": "Kilometers",
        "ErrorCount": 0,
        "RouteCount": 8
    }
}

2x4で8通りの計算結果が取得されています。
ただし、距離と時間は取得されていますが、具体的な経路(ルート)については取得されていません。
そして最も注意しなければならない点は料金です。Location Serviceのルーティングの計算料金はリクエストベースになっており、算出したルートの件数に依存しています。

Route planning with a route matrix - Amazon Location Service

You are charged for each route calculated, not each request to the service, so a route matrix with 10 departures and 10 destinations will be billed as 100 routes.

詳細な価格は以下をご確認頂ければと思いますが、今回の場合だと8経路分の料金となるようです。

Amazon Location Service の料金 – アマゾン ウェブ サービス

取得した情報をまとめてみましょう。

本社 岩本町オフィス
秋葉原駅 0.455km, 328秒 0.863km, 622秒
岩本町駅 0.251km, 181秒 0.235km, 170秒
神田駅 0.903km, 650秒 0.668km, 481秒
小伝馬町駅 0.844km, 608秒 0.408km, 294秒

一番近いのは岩本町駅から岩本町オフィスで徒歩170秒でいけるようです。駅チカすぎる。

この結果を元にターゲットを絞り込んで、経路計算で具体的な経路を再取得しましょう。
地図に表示したものが以下となります。

ちなみにですが、calculate-routeと同様にtravel-modeオプションをしっかり考慮してくれます。
先程の結果はWalk(徒歩)で指定しています。
Carを指定すると以下のようになります。

本社 岩本町オフィス
秋葉原駅 0.587km, 107秒 1.299km, 233秒
岩本町駅 0.658km, 114秒 0.993km, 182秒
神田駅 0.969km, 169秒 1.013km, 197秒
小伝馬町駅 0.844km, 153秒 0.408km, 78秒

車の経路の場合は岩本町オフィスの距離がかなり長くなっていますね。
詳細な経路を取得してみます。

岩本町オフィスの周りは一方通行が多く車だと遠回りになるケースが秋葉原本社より多いということでしょうか。
なるほど。

さいごに

本日は、Location Serviceの新機能マトリックスルーティングを使ってみました。
複数の開始地点と目的地があって、それぞれの距離などを検索しなければならない場合は個別に計算処理を呼び出すよりもAPIのコール回数を大幅に減らせるので有効活用出来ると思います。

一方でコストの最適化目的での活用とはならないようなのでその点はご注意ください。