Mapbox Newsletter WEEKLY TIPSの解説 -「データドリブンプロパティで円を設定」
はじめに
この記事は、先日配信されたMapbox NewsletterのWEEKLY TIPSで紹介されていた「データドリブンプロパティで円を設定」についての解説です。このサンプルではVectorソースの使い方を例示しています。また、Newsletterの購読はこちらからお申し込みいただけます。
以下が本サンプルのデモです。
コードを確認
まずExamplesのコードを見に行きましょう。
日本語サイト
英語サイト
基本的に同じコードですが、英語版はスタイルがMapbox Light v11にアップグレードされているのでこちらを使用します。Mapbox Light v10ではデフォルトのプロジェクション(地図投影法)がWebメルカトルであるのに対し、Mapbox Light v11ではGlobe(3D表示された地球)なので、印象がかなり異なります。また、英語版はMapbox GL JS v3が使用されています。
HTML/CSS
まずHTMLを見ていきましょう。
以下は地図を表示するエレメントです。
<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/light-v11',
zoom: 12,
center: [-122.4473, 37.7535]
});
loadイベント
ソースとレイヤーは、スタイルの読み込みが終わってから作成する必要があります(ソース・レイヤーはスタイルに管理される要素であるため)。そこで、map.on('load', () => {/*ここ*/});
のように、スタイルのロード完了時に発火するload
イベントのコールバック関数の中でソースおよびレイヤーの作成を行います。
ソースの作成
今回はVectorソースを読み込みます。Mapboxにホストされているベクタータイルセットはmapbox://id
でアクセスできます。
map.addSource('ethnicity', {
type: 'vector',
url: 'mapbox://examples.8fgz4egr'
});
ちなみに、データの内容については英語版サイトに説明があります。説明によるとアメリカ合衆国の2010年の国税調査の結果で、その中の民族属性のデータです。
レイヤーの作成
先ほど作成したソースを用いてレイヤーを作成します。元データはPointデータだったので、Pointの位置を示すCircleレイヤーを作成します。
source-layer
はベクタータイルセット内のレイヤーを指定します。Mapbox Studioで見るとsf2010
というレイヤーにデータが入っているのでそれを指定しています。
map.addLayer(
{
'id': 'population',
'type': 'circle',
'source': 'ethnicity',
'source-layer': 'sf2010',
'paint': {
// 後述
}
},
// Place polygons under labels, roads and buildings.
'aeroway-polygon'
);
次にpaint
の中身を見ます。
circle-radius
で円の半径を指定します。ここでの指定方法base/stopsはFunctionと呼ばれる古い指定方法です。現在ではExpressionsが推奨されています。
// Make circles larger as the user zooms from z12 to z22.
'circle-radius': {
'base': 1.75,
'stops': [
[12, 2],
[22, 180]
]
},
同じ効果のExpressionsを書くと以下のようになります。
'circle-radius': [
'interpolate',
['exponential', 1.75],
['zoom'],
12, 2,
22, 180,
],
circle-color
で円の色を指定します。ここではethnicity
プロパティの値を元に色分けしています。
// Color circles by ethnicity, using a `match` expression.
'circle-color': [
'match',
['get', 'ethnicity'],
'White',
'#fbb03b',
'Black',
'#223b53',
'Hispanic',
'#e55e5e',
'Asian',
'#3bb2d0',
/* other */ '#ccc'
]
まとめ
Vectorソースが簡単に使えることがわかりました。
Discussion