先日投稿したMapboxのエラーについて、対処法が分かったのでご紹介!
というか、まさにほぼ同じことにお悩みの方がいらっしゃり、そこで対処法が紹介されていたので、それをコピー&ペーストしたら、動きました。
検索が下手だったようです…反省。
なお、以前の記事はこちらから。
【JavaScript】Mapboxで「There is already a source with this ID」エラーが発生【未解決】
https://cpoint-lab.co.jp/article/201808/【javascript】mapboxで「there-is-already-a-source-with-this-id」エラーが発生【未解決】
ざっくりと状況を説明すると、Mapboxで追加できるナビゲーション機能を追加してから一旦削除し、もう一度追加しようとすると、「There is already a source with this ID」という IDの重複エラーが発生し、ナビゲーション機能を追加できない状態でした。
さて解決策ですが、ナビ機能を削除する、removeControl() を実行したタイミングで下記の項目も削除するだけでした。
map.removeLayer('directions-route-line'); map.removeLayer('directions-route-line-alt'); map.removeLayer('directions-hover-point-casing'); map.removeLayer('directions-hover-point'); map.removeLayer('directions-waypoint-point-casing'); map.removeLayer('directions-waypoint-point'); map.removeLayer('directions-origin-point'); map.removeLayer('directions-origin-label'); map.removeLayer('directions-destination-point'); map.removeLayer('directions-destination-label'); if (map.getSource('directions')) map.removeSource('directions');
なお、この解決策が紹介されていた投稿はこちらから。
Error when adding controls dynamically #5089・mapbox/mapbox-gl-js・GitHub
https://github.com/mapbox/mapbox-gl-js/issues/5089
実際に、ソースコードに追加するとこのような感じ。
var directions; function navi() { if(['条件:ナビ機能が追加済みだったら']) { map.removeControl(directions); /* ここから */ map.removeLayer('directions-route-line'); map.removeLayer('directions-route-line-alt'); map.removeLayer('directions-hover-point-casing'); map.removeLayer('directions-hover-point'); map.removeLayer('directions-waypoint-point-casing'); map.removeLayer('directions-waypoint-point'); map.removeLayer('directions-origin-point'); map.removeLayer('directions-origin-label'); map.removeLayer('directions-destination-point'); map.removeLayer('directions-destination-label'); if (map.getSource('directions')) map.removeSource('directions'); /* ここまで */ directions = null; } else { directions = new MapboxDirections({ accessToken: mapboxgl.accessToken }); map.addControl(directions, 'top-left'); } }
どれか一つがなくてもダメなようで、試しに2行ほど削除してみたのですが、当然ながらその行でエラーが発生し、実行できませんでした。
作業は以上で完了です。
画面をリロードして動作確認をしたところ、問題なく動作しました!
以上、Mapboxのエラーの対処法でした。
前回の記事でも書いたのですが、Mapboxのナビ機能ってそこそこサイズが大きいので、特にスマートフォンでは表示/非表示を行いたかったんですよね。
最初はCSSを操作して、ナビゲーションウィンドウを消すことも考えたのですが、ウィンドウが見えないだけでナビ機能は有効だったので、どうしても機能自体のON/OFFを切り替えたかったんです。
あとは…ラベルとか、ナビの道順のところを日本語化できないかな…と考えています。
こちらもとっかかりが見つかったら、改めてご紹介したいと思います。