Google MapのDistance Matrix API（距離行列サービス）を使ってみた

Google MapのDistance Matrix API（距離行列サービス）を使ってみたので、その時のメモ。

# 距離行列とは
こんな感じのマトリクス
|       | 金閣寺 | 銀閣寺 | 清水寺 |
|:------|-------:|------:|------:|
| 金閣寺 | 0.0km | 6.7km | 8.6km |
| 銀閣寺 | 6.7km | 0.0km | 5.0km |
| 清水寺 | 8.6km | 5.0km | 0.0km |

Distance Matrix APIでは、このようなデータを取得できる。
距離だけでなく、所要時間も取得可能。ただし、私が試した結果は、車と徒歩での時間しか取得できなかった。


[Google Mapのキーの取得方法はこちら（https://qiita.com/sera_ramon/items/707ac5064f6e6343df05）](https://qiita.com/sera_ramon/items/707ac5064f6e6343df05)

```JavaScript:TestDistanceMatrix.html
<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="UTF-8">
    <title>TEST PlacesService</title>
  </head>
  <body>
    <!--div id="map" style="width:100%; height:500px"></div-->
    <script>
      const kinkakuji = "35.0393744,135.7266682";
      const ginkakuji = "35.0272541,135.7945173";
      const kiyomizudera = "34.9946706,135.7820861";
      places = [kinkakuji, ginkakuji, kiyomizudera];

      let map;
      function initMap() {
        const service = new google.maps.DistanceMatrixService(); 
        const matrixOptions = {
          origins: places,
          destinations: places,
          travelMode: 'DRIVING',		// BICYCLING/DRIVING/TRANSIT/WALKING 
          //travelMode: 'TRANSIT',
          //transitOptions : {
          //  //modes: ["BUS","RAIL","SUBWAY","TRAIN","TRAM"]
          //  modes: ["BUS"]
          //},
        };
        service.getDistanceMatrix(matrixOptions, callback);

        function callback(res, status) {
          if (status !== "OK") {
            alert("Error with distance matrix");
            return;
          }
          //console.log(res);
          const da = res.destinationAddresses;
          console.log("" + da[0] + "," + da[1] + "," + da[2]);
          const oa = res.originAddresses;
          console.log("距離(km)のマトリクス");
          for (var i = 0; i < places.length; i++) {
            console.log(oa[i] + "," + res.rows[i].elements[0].distance.value + "," + res.rows[i].elements[1].distance.value + "," + res.rows[i].elements[2].distance.value);
          }
          console.log("所要時間(秒)のマトリクス");
          for (var i = 0; i < places.length; i++) {
            console.log(oa[i] + "," + res.rows[i].elements[0].duration.value + "," + res.rows[i].elements[1].duration.value + "," + res.rows[i].elements[2].duration.value);
          }
        }
      }
    </script>
    <script async defer
      src="https://maps.googleapis.com/maps/api/js?key=＜＜＜ここにキーを記載＞＞＞&callback=initMap">
    </script>
  </body>
</html>
```

### travelMode（移動手段）は、下記が指定可能
 - BICYCLING：自転車（利用不可）
 - DRIVING：車
 - TRANSIT：公共交通機関（利用不可）
 - WALKING：徒歩

※ BICYCLING、TRANSITの場合、res.rows[].elements[]が{status: 'ZERO_RESULTS'}となる

### 移動手段により距離が変わる？
距離が変わるということは、移動手段でルートが変わるということ
DRIVING（車）の場合
|       | 金閣寺 | 銀閣寺 | 清水寺 |
|:------|-------:|------:|------:|
| 金閣寺 | 0m    | 7190m | 10462m |
| 銀閣寺 | 7706m | 0m    | 5868m |
| 清水寺 | 9976m | 5879m | 0m    |

WALKING（徒歩）の場合
|       | 金閣寺 | 銀閣寺 | 清水寺 |
|:------|-------:|------:|------:|
| 金閣寺 | 0m    | 7062m | 9213m |
| 銀閣寺 | 7062m | 0m    | 4838m |
| 清水寺 | 9213m | 4038m | 0m    |

上記の通り、車と徒歩では距離が変わっています、徒歩のほうが短いですね。
また、車の場合、方向により距離が異なっています、一方通行など考慮しているようです。

以上、簡単に使ってみました。

[Googleの公式ドキュメントはこちら](https://developers.google.com/maps/documentation/javascript/distancematrix?hl=ja)