deck.gl のベースマップにGoogle Mapsを使う
[追記]
deck.gl v8.6にてGoogle Mapsとの連携強化が図れました。
Google 側のエンジニアからの積極的なサポートもあり、Google Mapsをベースマップとして使うことがこの記事を書いたときより非常に簡単になり、なおかつ性能も上がっています。
Google の公式ドキュメントにdeck.glとGoogle Mapsを連携するドキュメントが公開されていますので、今後はそちらを参照してください。
Google Maps Platform で deck.gl を使用して充実したデータの可視化を実現 | Google Cloud Blog
Google Maps Platform と deck.gl を使用してデータを可視化する
サンプルコードギャラリー(Cartoを使った例も含まれています)
Settings – JSFiddle – Code Playground
※ 以下、過去の記事
概要
今年の6月にGoogle MapsからDeck.gl対応の発表があったのですが、公式が提供しているサンプルコードがPure JavasScriptのコードしかなく、Reactを使ってGoogle Maps APIとDeck.glを組み合わせるサンプルが見つからなかったので作ってみました。
Google Developers Japan: Google Maps Platform での deck.gl サポートと Maps SDK for Android のアップデート
Using deck.gl with Google Maps – vis.gl – Medium
サンプルコード
解説
タイトルではわかりやすいように「DeckglのベースマップにGoogle Mapsを使う」としましたが仕組み的には実は逆で、Google Maps APIが生成する地図のoverlayerにDeck.glのレイヤーを差し込む作りとなっています。
このブログで以前紹介したDeck.glのベースマップを変更する方法とは、まったく別の仕組みで動いているので注意が必要です。
さて、Google MapsをReactで使用するためのコンポーネントはいくつかあるのですが、Deck.glのレイヤーをGoogle Mapsに差し込むためには、Google Mapオブジェクトへアクセスする機能がコンポーネントで提供されている必要があります。
今回は、@react-google-maps/api – npm を使用しましたが、Mapオブジェクトさえアクセスできるなら使い慣れたコンポーネントを使っても問題ありません。
@react-google-maps/api では、onloadプロパティのコールバックでmapオブジェクトにアクセスすることができます。
1 2 3 4 5 6 |
<GoogleMap onLoad={map => { //Google Mapのオブジェクトが取得できる console.log(map) }} /> |
Deck.glのレイヤーをGoogle MapsにオーバーレイするにはGoogleMapsOverlayクラスを使います。
1 2 3 4 5 6 7 8 9 10 11 |
const deckOverlay = new GoogleMapsOverlay({ layers: [ ... Deck.glレイヤーオブジェクト ] }); <GoogleMap onLoad={map => { deckOverlay.setMap(map); //Google MapsにDeck.glレイヤーをオーバーレイする }} /> |
注意
あくまでGoogle Mapsが主体で、Deck.glのレイヤーを乗せるだけなので、Google Mapsが対応していないDeck.glの機能などは今の所使えません。
具体的には3Dポリゴンを表示するようなレイヤーは機能しないみたいです。
The Google Maps JavaScript library does not support free rotation of the camera, so sadly the 3D layers of deck.gl may not work very well. deck.gl does not currently support zoom levels below zero, so it will hide itself when the user zooms all the way out.