スマートフォンアプリと地図は相性が良いです。位置情報を利用して、外出先などで地図を確認する人も多いでしょう。アプリ開発者としては、収集したデータをどう可視化するかが問題になります。

そこで今回はdeck.glという、高度なビジュアル化を実現するライブラリを紹介します。複雑なデータも可視化することで、トレンドや重要なポイントが見えてくるでしょう。

deck.glとは?

deck.glは、GPUを使って巨大なデータセットにも対応した可視化ライブラリです。特に複雑なデータ可視化にフォーカスしており、レイヤーを用いて再利用しやすくなっています。

特徴として、以下の3つのポイントが挙げられます。

  1. ヴァニラJSまたはReactで利用可能
  2. Google MapsやMapbox、ArcGIS、MapLibreなどの地図ライブラリと統合可能
  3. GPUを使い、高速かつ高パフォーマンスでデータセットをレンダリング

基本セットアップ

Reactで利用する場合にはnpmを使ってライブラリをインストールしますが、HTMLでも以下のようにscriptタグで読み込み可能です。地図を表示するdivタグを用意しておきます。

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>Deck.gl Demo</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<script src="https://unpkg.com/deck.gl@latest/dist.min.js"></script>
<!-- optional if maplibre base map is needed -->
<script src="https://unpkg.com/maplibre-gl@3.0.0/dist/maplibre-gl.js"></script>
<link href="https://unpkg.com/maplibre-gl@3.0.0/dist/maplibre-gl.css" rel="stylesheet" />
<!-- Allow the map to render in full screen  -->
<style>
  body {
    width: 100vw;
    height: 100vh;
    margin: 0;
  }
</style>
</head>
<body>
  <div id="map" style="width: 100%; height: 100%;"></div>
  <script src="./app.js"></script>
</body>
</html>

読み込んでいる app.js の実装です。地図のスタイル、そして初期表示の場所などを指定します。そして、 layers キーで、表示するレイヤーやデータを指定します。 ScatterplotLayer は、地図上に点を表示するためのレイヤーです。

const {DeckGL, ScatterplotLayer} = deck;

new DeckGL({
  mapStyle: 'https://basemaps.cartocdn.com/gl/positron-nolabels-gl-style/style.json',
  initialViewState: {
    longitude: -122.45,
    latitude: 37.8,
    zoom: 15
  },
  controller: true,
  layers: [
    new ScatterplotLayer({
      data: [
        {position: [-122.45, 37.8], color: [255, 0, 0], radius: 100}
      ],
      getPosition: d => d.position,
      getFillColor: d => d.color,
      getRadius: d => d.radius
    })
  ]
});

これで、地図上に赤い点が表示されるはずです。地図のスタイルは、Cartoのベースマップを使用しています。

React

Reactでの利用例です。Reactの場合は、よりコンポーネント指向で記述できます。

import React from 'react';
import {DeckGL} from '@deck.gl/react';
import {MapViewState} from '@deck.gl/core';
import {LineLayer} from '@deck.gl/layers';

const INITIAL_VIEW_STATE: MapViewState = {
  longitude: -122.41669,
  latitude: 37.7853,
  zoom: 13
};

type DataType = {
  from: [longitude: number, latitude: number];
  to: [longitude: number, latitude: number];
};

function App() {
  const layers = [
    new LineLayer<DataType>({
      id: 'line-layer',
      data: '/path/to/data.json',
      getSourcePosition: (d: DataType) => d.from,
      getTargetPosition: (d: DataType) => d.to,
    })
  ];

  return <DeckGL
      initialViewState={INITIAL_VIEW_STATE}
      controller
      layers={layers} />;
}

利用例

deck.glでは多彩な表示可能です。以下はその一例です。

GeoJsonLayer (Polygons)

GeoJSON形式のポリゴンデータを表示するためのレイヤーです。地理情報を視覚化するのに適しています。

deck.gl

GeoJsonLayer (Paths)

こちらは、GeoJSON形式のパスデータを表示するためのレイヤーです。道路や線状の地理情報を視覚化するのに適しています。

deck.gl

HeatmapLayer

ヒートマップを表示するレイヤーです。

deck.gl

TextLayer

テキスト情報を表示するレイヤーです。地図上にラベルや説明文を表示するのに使えます。

deck.gl

利用プロジェクト

ここでは、deck.glを利用しているプロジェクトをいくつか紹介します。

Fair Internet Report

Fair Internet Reportは、インターネットの速度や品質を可視化するプロジェクトです。世界中のインターネット速度テストの結果を集約し、地図上で表示しています。

Mapping 24 Hours of Internet Speed Tests

Minecraft Chunk Viewer

Minecraftのチャンクデータを可視化するプロジェクトです。プレイヤーが探索した領域を地図上に表示し、どのような地形が生成されているかを確認できます。

Minecraft Chunk Viewer

まとめ

deck.glは3Dモデルなど、さまざまな情報を地図上(Minecraftのように地図を使わずとも)にデータを表示できます。データがダイナミックに動くような可視化が可能で、高度なビジュアル化を実現します。

地図を使ったデータ可視化を行う際に、利用を検討してください。

Home | deck.gl