4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

MapboxAdvent Calendar 2020

Day 4

Mapbox GL JSでベクトルタイルの凡例を簡単に表示する

Last updated at Posted at 2020-12-03

概要

image.png

私が個人で行っている東アフリカのケニアとルワンダの水道局向けの水道ベクトルタイルのオープンソース活動の中で、ベクトルタイルのレイヤの凡例をMapbox GL JSで見たいという要望がありました。

WebGIS上に凡例を表示させる方法はいろいろとあると思いますが、面倒くさがりな私はstyle.jsonから自動生成させたいと考え、あれこれ調べていく中で、Mapbox GL JSのプラグインmapbox-gl-legendを開発しましたのでご紹介します。公式のMapbox GL JSのプラグインサイトにも掲載されています。

使い方

Github packageもしくはnpmjsに登録されていますので、簡単にお使いになれます。オープンソースライセンス(MITライセンス)にしていますので、ご自由にお使いいただけます。

まず、npmパッケージとしてインストールします。

npm i @watergis/mapbox-gl-legend --save

まずパッケージをimportします。

import MapboxLegendControl from "@watergis/mapbox-gl-legend";
import '@watergis/mapbox-gl-legend/css/styles.css';

次にmapインスタンスを生成します。

const map = new mapboxgl.Map({
        container: 'map',
        style:'https://narwassco.github.io/mapbox-stylefiles/unvt/style.json',
        center: [35.87063, -1.08551],
        zoom: 12,
        hash:true,
    });
    map.addControl(new mapboxgl.NavigationControl(), 'top-right');

ここでは私が関わっているケニアのナロック水道局の水道ベクトルタイルのstyle.jsonを使います。背景には国連ベクトルタイルツールキットで生成されたOSMベースの地図を表示しています。

Mapオブジェクトにstyle.jsonの情報を読み込んでからプラグインの設定を行います。

map.on('load', function() {
const targets = {
        'pipeline': 'Pipeline',
        'meter': 'Water Meter',
        'flow meter': 'Flow Meter', 
        'valve': 'Valve', 
        'firehydrant': 'Fire Hydrant', 
        'washout': 'Washout',
        'tank': 'Tank', 
        'wtp': 'WTP', 
        'intake': 'Intake', 
        'parcels': 'Parcels', 
        'village': 'Village', 
        'dma': 'DMA'
};
// showDefaultをfalseにするとデフォルトで非表示になります。
map.addControl(new MapboxLegendControl(targets, {showDefault: false}), 'top-right');
// showDefaultをtrueもしくは省略するとデフォルトで凡例が開いた状態になります。
map.addControl(new MapboxLegendControl(targets, {showDefault: true}), 'bottom-right');
});

MapboxLegendControlのコンストラクタの最初の引数に、対象のレイヤIDと凡例表示用のレイヤ名の組み合わせたオブジェクトを渡してあげます。

第二引数にはshowDefaultというオプションを用意しています。trueにすると最初から凡例を表示したままに、falseにすると凡例を非表示に状態にします。省略した場合のデフォルトはtrueになります。

あとはwebpackなどでビルドしてあげれば完了です。

完成

下にデモ画像を用意しました。こんな感じに凡例をお手軽に見れるようになります。

demo.gif

実際に地図を動かしてみてみたい方はこちらのURLからアクセスしてご覧になれます。

Githubリポジトリについて

以下が、Githubのリポジトリはこちらになります。
Exampleも用意しておりますので、より完全なソースコードをご覧になりたい場合はご利用ください。

このプラグインへのコントリビューション

プラグインの利用に際して、要望やバグ修正などありましたら、Issueやプルリクエストはいつでも歓迎いたします。またstarForkをいただけると励みになります。

またstyle.jsonはかなり複雑なレイヤの構成も表現できるので、一部のスタイルではうまく凡例表示できないです。例えば一つのレイヤの中でフィールドの値によってアイコンを変えたりする場合に今のプラグインでは完全な凡例は表示できなかったりします。もしそのあたり、お力、ご助言を頂けたら大変助かります。

このプラグインが皆様の地図アプリのお役に立てましたらと思います。

4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?