Mapbox Newsletter WEEKLY TIPSの解説 -「ジオコーダーの追加」
はじめに
この記事は、先日配信されたMapbox NewsletterのWEEKLY TIPSで紹介されていた「ジオコーダーの追加」についての解説です。このサンプルではGeocoderプラグインの使い方を紹介しています。また、Newsletterの購読はこちらからお申し込みいただけます。
コードを確認
まずExamplesのコードを見に行きましょう。
日本語サイト
英語サイト
基本的に同じコードですが、英語版はスタイルがMapbox Streets v12にアップグレードされているのでこちらを使用します。Mapbox Streets v11ではデフォルトのプロジェクションがWebメルカトルであるのに対し、Mapbox Streets v12ではGlobe(3D表示された地球)なので、印象がかなり異なります。
HTML/CSS
まずHTMLを見ていきましょう。
最初にGeocoderプラグインを読み込んでいます。
<!-- Load the `mapbox-gl-geocoder` plugin. -->
<script src="https://api.mapbox.com/mapbox-gl-js/plugins/mapbox-gl-geocoder/v5.0.0/mapbox-gl-geocoder.min.js"></script>
<link rel="stylesheet" href="https://api.mapbox.com/mapbox-gl-js/plugins/mapbox-gl-geocoder/v5.0.0/mapbox-gl-geocoder.css" type="text/css">
そして地図を表示するエレメントを作成しています。
<div id="map"></div>
Mapの作成
次にJavaScriptのコードを見ていきます。以下のコードはいつも通り、Mapオブジェクトを作成しています。container
で地図を表示するHTMLエレメントのidを指定します。
const map = new mapboxgl.Map({
container: 'map',
// Choose from Mapbox's core styles, or make your own style with Mapbox Studio
style: 'mapbox://styles/mapbox/streets-v12',
center: [-79.4512, 43.6568],
zoom: 13
});
プラグイン本体であるMapboxGeocoder
はIControl
として実装されているので、インスタンス化したものをaddControl
で追加します。
// Add the control to the map.
map.addControl(
new MapboxGeocoder({
accessToken: mapboxgl.accessToken,
mapboxgl: mapboxgl
})
);
MapboxGeocoder
のインスタンス化ではいくつかのオプションが指定可能です。その中でaccessToken
は必須です。これはGeocoderプラグイン内部でGeocoding APIを呼び出す際に必要となるためです。Geocoding APIは住所等から座標を検索するためのAPIです。逆に座標から住所等を検索するAPIをReverse Geocoding APIといいます。
ちなみに、mapboxgl
は必須ではありません。しかし、marker
オプションがtrue
のときは必須で、かつmerker
オプションはデフォルトでtrue
なので事実上必須です。merker
オプションは検索結果を選択したときにその場所にマーカーを表示するかどうかを指定するオプションです。マーカーを表示するにはMap
オブジェクトが必要なので、mapboxgl
が必要となるわけです。ちなみに、marker
をfalse
指定せずにmapboxgl
を省略した場合、ワーニングは表示されるもののmarker
が自動的にfalse
に設定されます。
他にもたくさんオプションがありますが、手頃なドキュメントが見つかりませんでした。以下のコードを参照いただくとコメントでオプションが全て解説されています。
まとめ
Geocoderプラグインを用いることで、Geocoding APIを使った検索機能が簡単に追加できました。
また、チュートリアルにもいくつかGeocoderプラグインを用いたものがあります。たとえばLocal search with the Geocoding APIは検索結果をマーカーではなくCircleレイヤーで表現しています。合わせてご参照ください。
Discussion