React Hooks とdeckgl v.7を使ってweb地図を作ってみた。

最終更新日

DeckGL example

example

以前紹介したUber社製のWeb地図フレームワーク「Deck.gl」のver.7が公開されました。紹介した頃はver.5だったのでだいぶ間があき、公式のチュートリアルサイトVis Academyの内容も改編されていたので改めて一からチュートリアルをやり直してみることにしました。

Vis Academy – Building a Geospatial App

ただ、改編されたとはいえ一度やったことのあるチュートリアルをただなぞるのもなんなので、公式ではclassベースで書かれているコードを勉強がてらReact Hooksの機能を使ってfanctionベースに書き換えながら進めてみています。

例えば第1章のコードなら、以下のように変更しています。

元のコード

React Hooks 使ってみたコード

とはいっても、ReactについてはDeck.glを使いたいがためにちょこっと勉強した程度で、Hookもいまいちよくわからないまま雰囲気でつかっているので、せいぜいuseStateぐらいしか使っていません。

それでも良ければ、Githubに章ごとのコードを置いておいたのでご覧ください。

全コード

shimizu/learning-vis-academy

ちなみにHexagon Layerでバグがあります。これ公式のサンプルでも同じように動作しているので、ちょっとまだ原因がわかってません。
あと、control.jsの一部で Stateless functionに変更できてないコンポーネントが残ってます。

Deck.gl ver.7について

個人的に気になった点についてだけ。

ベクトルタイルに対応
最後に触ったバージョンが5.2だったので実装されたのがいつなのかはわかりませんが、待望のtileLayerが実装されています。
サンプルではmapboxのベクトルタイルを読みこんでいて、コードを見る限りでは自分で作成したベクトルタイルを読み込むのも簡単そうです。
ただ、描画部分ではまだバグが多いようで表示欠けがおおく、また動作も結構重いです。

Mapboxへの依存度が減少
以前はDeck.gl OverLay コンポーネントの中に内包されていたreact-map-glコンポーネントを開発者が明示的に利用する形へと変更されたようです。
TileLayerの実装と相まってMapbox以外のベースマップを利用しやすくなりました。
これは、Google Maps PlatformによるDeck.glサポートが決定したことも影響しているのかもしれません。

React component vs Pure JavaScript library
Deck.glはver.52より、Reactを用いなくても通常のJavaScriptライブラリとして利用できるようになりました。公式サイトのドキュメントでは今のところ、両方での使い方が併記されていますが、最新の機能に関してはPure JavaScript libraryとして使った場合のサンプルコードしか記載されていないものがあります。
例えばGoogle Maps PlatformをDeck.glで利用するサンプルコードはPure JavaScript libraryでのコードしか公開されていません。
(というより、今のところReactコンポーネントとしてDeck.glコンポーネントと結合できるようになってないっぽい)
今後どちらの使い方がメインストリームになっていくのかわかりませんが、個人的にはReactを勉強するための良い動機になっていたので、React離れが進むことになるとちょっと残念かも。

React Hooksについて

useState使うだけでもコードがだいぶスッキリと整理されます。
例えば、”Building a Geospatial App”の最終章のレンダリング部分のコードを比較するだけでも、だいぶ読みやすくなったのではないかと。

this消えるだけでも、だいぶスッキリした感じに。
個人的にJSでクラスベースのコード書くのあまり好きではなかったので、React Hooks使って行きたいなと思います。