ZENRINMapsAPI と GoogleMapsAPI におけるフェリー利用ルート検索の制御の違い

# 要約

地図サービスの API では、利用者のニーズに合わせた柔軟なルート検索が求められます。特に、日本国内でのルート検索においては、フェリー利用時の細かいルート指定が重要となる場合があります。本記事では、ZENRINMapsAPI と GoogleMapsAPI のフェリー利用に関する制御方法の違いを解説し、実際のフェリー入場ルート表示の違いも比較します。

# 1. GoogleMapsAPI のフェリー利用

## Google MAPS API キーの取得方法

[参考サイト](https://qiita.com/Haruka-Ogawa/items/997401a2edcd20e61037)

## フェリー利用のデフォルト動作

GoogleMapsAPI の Directions API は、利用可能な最適なルートを自動的に選択します。  
そのため、特に指定を行わない場合でも、条件に合えばフェリーを含むルートが採用されることがあります。  
なお、フェリーを利用したルートを避けたい場合は、`avoid` パラメータを利用して `['ferries']` を指定することで、フェリー回避モードにすることができます。  
つまり、`avoid: ['ferries']` を指定した場合、フェリーが利用される可能性は低くなります。

## ソースコード

```javascript
// DirectionsService と DirectionsRenderer の設定
const directionsService = new google.maps.DirectionsService();
const directionsRenderer = new google.maps.DirectionsRenderer({
  map: map,
  polylineOptions: {
    strokeColor: "red",
    strokeWeight: 6,
    strokeOpacity: 0.8,
  },
});

// ルート検索リクエスト
directionsService.route(
  {
    origin: origin,
    destination: destination,
    travelMode: google.maps.TravelMode.DRIVING,
    // 必要に応じて、avoid パラメータでフェリーを回避する指定が可能
    // avoid: ['ferries']
  },
  (response, status) => {
    if (status === google.maps.DirectionsStatus.OK) {
      directionsRenderer.setDirections(response);
      // ルート情報を抽出し、表示する処理…
    } else {
      console.error("ルートリクエストに失敗しました: " + status);
    }
  }
);
```

## 結果画面

![gmap.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3981491/6513d1fc-e0cb-41e8-9e55-605e7c78592a.png)

> **補足**  
> GoogleMapsAPI では、フェリールートが表示される場合でも、実際の車両入場口や料金所、検査エリアといった詳細な施設内経路情報は反映されず、フェリー本体の主要入口までのルートが提示される傾向があります。
> 下記画像の緑の矢印で示したルートは、実際にフェリー乗船するために必要な、車両入場口や料金所、検査エリアなどを経由した正しいルートになります。

![gmapZoom.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3981491/928f61ed-6174-4206-843a-1c8cde17ac08.png)

# 2. ZENRINMapsAPI のフェリー利用制御

## Zenrin MAPS API キーの取得方法

ZENRIN Maps API を使用するには、検証用 ID と PW の取得が必要です。  
必要事項を入力して送信すれば、お試し ID を簡単に発行でき（2 か月無料のお試しが可能）、以下のリンクから申し込むことができます。

🆓[ZENRIN Maps API 無料お試し ID お申込みフォーム](https://www.zenrin-datacom.net/solution/zenrin-maps-api/trial?fm_cp=6757baf3203e3a00bb118509&fm_mu=67639633affc4404b17d910e&utm_campaign=6757baf3203e3a00bb118509&utm_medium=else&utm_source=Qiita23)

![trialForm.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3981491/95e46565-c04a-4be1-967c-dc17b63ad9f8.png)

### 検証用 ID と PWD の確認

フォーム送信後、3 営業日以内にメールで検証用 ID と PW が発行されます。  
[参考サイト](https://qiita.com/goldie9/items/1983bf8c4ad796290cbf) を参考に、コンソール内で API キーや認証方式の設定を行ってください。

## フェリー利用の明示的な指定

ZENRINMapsAPI では、ルート検索時のパラメータに `ferry` オプションが用意され、フェリー利用の有無を明示的に指定できます。

- **ferry: true**  
  これにより、フェリー利用が許容される状態となりますが、実際のルート検索結果では、他の条件（所要時間、距離、料金など）との総合判断により、フェリーを使わないルートが選択される場合もあります。
- **ferry: false**  
  こちらは、GoogleMapsAPI の `avoid: ['ferries']` と同様の動作となり、フェリー利用を基本的に回避するルートが選ばれます。ただし、フェリーを利用しなければ目的地に到達できない場合は、フェリーを含むルートが自動的に選択されます。

以下のコード例では、`ferry: true` を指定することで、フェリー利用を許容したルート検索を実行しています。

## ソースコード

```javascript
// ルート検索を実行する関数
function performRouteSearch(origin, destination) {
  const startPoint = `${origin.lng},${origin.lat}`;
  const goalPoint = `${destination.lng},${destination.lat}`;
  const api = "/route/route_mbn/drive_ptp";
  const params = {
    search_type: 4,
    from: startPoint,
    to: goalPoint,
    ferry: true, // フェリー利用を明示的に有効化（ただし、他条件との総合判断でフェリーが使われない可能性もあります）
  };

  try {
    map.requestAPI(api, params, function (response) {
      if (response.ret && response.ret.status === "OK") {
        // レスポンスからルート情報や座標を取得し表示する処理
      } else {
        console.error("ルート検索に失敗しました。");
      }
    });
  } catch (error) {
    console.error("ルート検索中にエラーが発生しました:", error);
  }
}
```

## 柔軟なルート計算の実現

ZENRINMapsAPI は、日本国内の詳細な地理情報を活用して、  
フェリー利用を含むルート検索と、フェリー回避モード（ferry: false）を選択できるため、  
ユーザーの具体的な移動条件に合わせた柔軟なルート計算が可能です。  
なお、座標指定の際は `(lng, lat)` の順で指定する点に注意が必要です。

## 結果画面

![zmap.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3981491/f3c064fa-5b9b-4da4-89e3-a95c65286cea.png)

> **補足**  
> ZENRINMapsAPI では、たとえば「東京湾フェリー 久里浜港のりば」のケースにおいて、車両入場口、料金所、検査エリアを正確に経由したルートが提示され、実際のフェリー乗船までの正確な導線が示されます。

![zmapZoom.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3981491/1c15d7e6-6e8f-4505-94b0-9930735ffb6f.png)

# 3. フェリー入場ルートの詳細な挙動

実際の検証結果から、以下の点が確認されました。

- **GoogleMapsAPI の場合**  
  ルートはフェリー本体の主要入口に直接至るよう設定され、  
  車両入場口、料金所、検査エリアなどの詳細な施設内経路情報が省略される傾向にあります。

- **ZENRINMapsAPI の場合**  
  実際のフェリー施設（例：東京湾フェリー 久里浜港のりば）の運用に合わせ、  
  車両入場口、料金所、検査エリアを正確に経由したルートが提示され、  
  利用者はフェリー乗船までの正しい導線をたどることが可能です。

# 4. 両 API の比較と考察

本セクションでは、両 API のルート検索におけるデフォルトの挙動および実装の特徴を、統一した語調で比較します。

## デフォルトの挙動

- **GoogleMapsAPI**

  - ルート検索時に、特別な指示がなくとも利用可能な最適なルートとしてフェリーが選択される場合があります。
  - ただし、フェリー利用時のルートでは、車両入場口、料金所、検査エリアなど、フェリー施設内の詳細な経路情報が省略され、直接フェリー本体の主要入口に至る傾向があります。
  - また、`avoid: ['ferries']` を指定すれば、フェリー利用を基本的に回避するルートが得られます。

- **ZENRINMapsAPI**
  - ルート検索時に `ferry` パラメータで明示的にフェリー利用の可否を指定できます。
  - `ferry: false` を指定すると、GoogleMapsAPI の `avoid: ['ferries']` と同様の動作が期待でき、フェリー利用を回避したルートが基本となります。
  - 一方、`ferry: true` の場合、フェリー利用が許容されますが、実際のルート検索結果では、他の条件（所要時間、距離、料金など）とのバランスにより、フェリーを使わないルートが選択されることもあります。

## コード設計と実装の違い

- **GoogleMapsAPI**

  - ルート検索は `DirectionsService` と `DirectionsRenderer` により自動化されており、実装がシンプルです。
  - ただし、フェリー施設内の詳細な経路情報（車両入場口、料金所、検査エリア）は描画されない場合があります。

- **ZENRINMapsAPI**
  - カスタムでマーカーやポリラインの描画が可能なため、詳細な地図表現が実現できます。
  - フェリー利用の制御オプションにより、実際のフェリー施設に即した正確な経路案内が可能です。

---

# 5. まとめ

GoogleMapsAPI と ZENRINMapsAPI は、それぞれ異なる特徴と利点を持つ地図サービスです。

- **GoogleMapsAPI** は、初期状態で最適なルートを提示するシンプルな実装が魅力ですが、フェリー利用時の詳細な施設内経路が反映されず、場合によってはフェリーの主要入口までのルートのみが表示されます。
- **ZENRINMapsAPI** は、フェリー利用の有無をパラメータで明示的に指定でき、例えば `ferry: false` の場合は、GoogleMapsAPI の `avoid: ['ferries']` と同様にフェリー回避ルートが選択され、`ferry: true` の場合でも、他のルート条件とのバランスによりフェリーを使わないルートが選択される可能性がある点を明示しています。  
  さらに、実際のフェリー施設の運用に即した正確な経路案内が提供されるため、運転手や利用者にとって実用的なルート情報が得られます。