世界最大の配車アプリを開発・運営するUber社がオープンソースとして公開していたデータビジュアライゼーションフレームワーク。 同じくUber社が公開している可視化スイート「Vis.gl」のツールの一つ。
Deck.glを含むUber社が公開していたデータビジュアライゼーションスイート可視化ツール群。スイート(ひとそろいの、一式の)と名がつく通り、それぞれのライブラリやフレームワークは組み合わせて使えるようにコンポーネント化されている。Uber社の全部盛りデータ可視化ツールスイート「Vis.gl」一覧 – GUNMA GIS GEEK
現在は、deck.glを含むvis.glは、アーバンコンピューティング財団に移管されてUber社の手から離れています。 なので、Uber社に対して思うところのある方も安心して利用すことができます。deck.gl 8.2 moves to Open Governance
また、2020から今年に掛けては、Google EarthチームやCarto(地理データ分析プラットフォーム)のエンジニアが参加し、Google Maps Platform(js sdk)やCartoサービスとの連携強化が図られました。deck.gl v8.6 now available with deeper Google Maps support
deck.glは、大規模なデータセットの視覚化をWebGlを用いて簡単に作成できるように設計されています。 GPUを用いて高い精度とパフォーマンスで大量のデータセットをレンダリングします。
表示できる量や負荷は端末のスペックに依存する
ちなみに1000万ポイント表示しようとしたらブラウザが落ちました
> npm install deck.gl --save
OR
> yarn add deck.gl
必要なモジュールのみインストールすることも可能
> npm install @deck.gl/core @deck.gl/react @deck.gl/layers
//コアライブラリの読み込み
import DeckGL, { MapController, WebMercatorViewport } from "deck.gl";
//レイヤーモジュールの読み込み
import { TileLayer, BitmapLayer, GeoJsonLayer } from "deck.gl";
ViewStateは、マップの視点、ズームレベル、角度、および回転方向を定義するオブジェクトです。
ViewStateは以下のプロパティを持ちます:
- latitude : マップの中心の緯度
- longitude : マップの中心の経度
- zoom : マップのズームレベル
- pitch : マップの傾き(角度)
- bearing : マップの回転方向
これらのプロパティを使用して、マップの表示位置や視点を制御できます。ViewStateは、DeckGLコンポーネントのpropsとして渡され、DeckGLがマップのビューをレンダリングする際に使用されます。
import React from 'react';
import DeckGL from '@deck.gl/react';
//ビューステート
const INIT_VIEW_STATE = {
longitude: -122.4,
latitude: 37.8,
zoom: 12
};
function App() {
return (
);
}
この例では、viewStateにlongitude、latitude、zoomの値を設定しています。このviewStateをDeckGLコンポーネントに渡すことで、マップの初期表示位置を設定しています。
import React, {useState} from 'react';
import DeckGL from '@deck.gl/react';
//ビューステート
const INIT_VIEW_STATE = {
longitude: -122.4,
latitude: 37.8,
zoom: 12
};
function App() {
//ビューステートを保存
const [viewState, setViewState] = useState(INIT_VIEW_STATE);
//ビューステートの更新
const handleClick = ()>{
setViewState(v=>{
longitude: 138.87,
latitude: 36.06,
...v
})
}
return (
);
}
vewStateをuseStateフックをつかてコンポーネントステータスに保存します。ユーザー操作によってviewStateの値が更新されるとDeck.glコンポーネントが再レンダリングされ表示位置が変わります。
「レイヤー」はDeck.glの中核をなす機能で、データムのコレクションを取得し、各データを位置、色、3Dポリゴンなどに関連付けてマップ上にレンダリングする可視化コレクションです。
複数のレイヤーを重ね合わせたり、ホバーやクリックなどのインタラクションを管理する機能があります。
//RennderLayer.js
//散布図レイヤークラスをインポート
import { ScatterplotLayer } from "deck.gl";
export function renderLayers(props) {
const { data } = props;
//インスタンス化
const scatter = new ScatterplotLayer({
id: "scatter-layer",
data: data,
getFillColor: d => d.color,
getPosition: d => [d.lng, d.lat]
})
//レイヤーを配列にまとめる
const layes = [scatter];
return layes;
};
Deck.glライブラリから必要なレイヤークラスをインポートし、プロパティを設定してインスタンス化します。
//App.js
import React from "react";
import DeckGL from "deck.gl";
import renderLayers from "./RenderLayers.js";
export default () => {
const data = {
{ name: 'Colma', lng:-122.466233, lat:37.684638 },
{ name: 'Civic Center', lng:-122.413756, lat:37.779528 },
...
};
return (
<DeckGL
layers={renderLayers({ //レイヤーをDeckコンポーネントに設置
data: data
})}
controller={true}
initialViewState={ViewState}
/>
);
};
Deckコンポーネントのlayerプロパティにレイヤーオブジェクトを渡す。
大きく分けて4種類のレイヤーが存在する
ジオレイヤー
メッシュレイヤー
アイデア次第でこんな使い方も
loaders.glはcsv,tsvなど一般的なデータフォーマットやGeoJSONのような地理空間情報データフォーマットのファイルを読み込むためのローダーコレクションです。
地理情報データものすごくたくさんのフォーマットが乱立しているが、loaders.glは多くのフォーマットに対応している
通常
import {CSVLoader} from '@loaders.gl/csv';
import {load} from '@loaders.gl/core';
const data = await load(url, CSVLoader);
レイヤーのプロパティでローダーを指定するとファイルを直接読みこむことができる
import { ScatterplotLayer } from "deck.gl";
//loader.gからcsvローダーを読み込み
import {CSVLoader} from '@loaders.gl/csv';
export function renderLayers(props) {
const scatter = new ScatterplotLayer({
id: "scatter-layer",
data: "data/example.csv",
loaders:[CSVLoader], //ローダーを指定
getFillColor: d => d.color,
getPosition: d => [d.lng, d.lat]
})
return [scatter];
};
データビジュアライゼーションで必須となる、データの値をもとにカラーを作成する機能を提供するライブラリ。多機能なカラージェネレーター。
0から100の値に対して白から赤のグラデーション適用する
//スケールのレンジ(白->赤)とドメイン(0から100)を設定する
const colorScale = chroma.scale(["white", "red"]).domain([0,100])
//各値に対して色を生成する
colorScale(0).rgb() // -> [255, 255, 255]
colorScale(25).rgb() // -> [255, 191, 191]
colorScale(50).rgb() // -> [255, 128, 128]
colorScale(75).rgb() // -> [255, 64, 64]
colorScale(100).rgb() // -> [255, 0, 0]
基本的にはこれだけ覚えておけば可視化は行なえますが、使いこなせると最終的なアウトプットのクオリティがぐっとあがります。
mapbox.gl ver1をラップしたreactコンポーネントライブラリ。deck.glと組み合わせることでdeck.glにmapboxの地図を挿入することができる
コンポーネントのプロパティでスタイルとトークンを設定する
import DeckGL from 'deck.gl';
//react-map-glを読み込み
import Mapbox from "react-map-gl";
function Map() {
const [viwState, setViewState] = useState(INITIAL_VIEW_STATE)
return (
//地図表示
);
}
export default Map;