🔵

Mapbox Newsletter WEEKLY TIPSの解説 -「データドリブンプロパティで円を設定」

2024/09/06に公開

はじめに

この記事は、先日配信された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ソースが簡単に使えることがわかりました。

GitHubで編集を提案
マップボックス・ジャパン合同会社

Discussion