2017-09-19 16 views
1

セットアップ:

基本は、データを視覚化するために、トップの上にdeck.glのScatterplotLayerで地図を表示するように反応するマップ-GLを使用してアプリを反応
Deck.glポップアップのonClick

目標:

1)指定された半径と色の円としてマップ上のポイントを表示する。
2)ユーザーが円をクリックすると、ユーザーがクリックしなくても(このグラフと基本的に同じですが、カーソルを置かずにクリックするとhttp://uber.github.io/deck.gl/#/documentation/layer-catalog/scatterplot-layer)、ツールチップ/ポップアップが表示されます参考までに私はこのコードを見て、ホバーロジックは削除されていると思います。

問題:

私はポイント1を完了しているが、私は仕事に点2を取得することはできません。私がデータを証明するのに最も遠いのは、コンソールにログすることです。

は注:

私が反応し、ツールチップと結婚していないよ - 私はこれを行うためのより良い方法があるかどうそれを完全に取り出すこと気にしません。私はマップボックスとdeck.glを保持する必要があります。

データ:https://gist.github.com/NikkiChristofi/bf79ca37028b29b50cffb215360db999

deckgl-overlay.js

import React, {Component} from 'react'; 
import ReactTooltip from 'react-tooltip'; 
import DeckGL, {ScatterplotLayer} from 'deck.gl'; 

export default class DeckGLOverlay extends Component { 

    static get defaultViewport() { 
    return { 
     longitude: 0, 
     latitude: 0, 
     zoom: 2, 
     maxZoom: 16, 
     pitch: 0, 
     bearing: 0 
    }; 
    } 

# in this method I want to update the variable tooltipText with 
# whatever object data has been clicked. 
# The console log successfully logs the right data (i.e. the third 
# element in the array), but the tooltip doesn't even show 

    onClickHandler = (info) => { 
    let dataToShow = info ? info.object[2] : "not found"; 
    this.tooltipText = dataToShow; 
    console.log(dataToShow); 
    } 

    render() { 
    const {viewport, lowPerformerColor, highPerformerColor, data, radius, smallRadius, largeRadius} = this.props; 

    if (!data) { 
     return null; 
    } 

    const layer = new ScatterplotLayer({ 
     id: 'scatter-plot', 
     data, 
     radiusScale: radius, 
     radiusMinPixels: 0.25, 
     getPosition: d => [d[1], d[0], 0], 
     getColor: d => d[2] > 50 ? lowPerformerColor : highPerformerColor, 
     getRadius: d => d[2] < 25 || d[2] > 75 ? smallRadius : largeRadius, 
     updateTriggers: { 
     getColor: [lowPerformerColor, highPerformerColor] 
     }, 
     pickable: true, 
     onClick: info => this.onClickHandler(info), 
     opacity: 0.3 
    }); 

    return (
     <DeckGL {...viewport} layers={ [layer] } data-tip={this.tooltipText}> 
     <ReactTooltip /> 
     </DeckGL> 
    ); 
    } 
} 

app.jsそれを行う方法を考え出し

import React, {Component} from 'react'; 
import {render} from 'react-dom'; 
import MapGL from 'react-map-gl'; 
import DeckGLOverlay from './deckgl-overlay.js'; 
import {json as requestJson} from 'd3-request'; 

const MAPBOX_TOKEN = process.env.MAPBOX_TOKEN; // eslint-disable-line 
const lowPerformerColor = [204, 0, 0]; 
const highPerformerColor = [0, 255, 0]; 
const smallRadius = 500; 
const largeRadius = 1000; 

const DATA_URL = 'https://gist.github.com/NikkiChristofi/bf79ca37028b29b50cffb215360db999'; 
export default class App extends Component { 

    constructor(props) { 
    super(props); 
    this.state = { 
     viewport: { 
     ...DeckGLOverlay.defaultViewport, 
     width: 500, 
     height: 500 
     }, 
     data: null 
    }; 

    requestJson(DATA_URL, (error, response) => { 
     if (!error) { 
     console.log(response); 
     this.setState({data: response}); 
     } 
     else{ 
      console.log(error); 
     } 
    }); 
    } 

    componentDidMount() { 
    window.addEventListener('resize', this._resize.bind(this)); 
    this._resize(); 
    } 

    _resize() { 
    this._onViewportChange({ 
     width: window.innerWidth, 
     height: window.innerHeight 
    }); 
    } 

    _onViewportChange(viewport) { 
    this.setState({ 
     viewport: {...this.state.viewport, ...viewport} 
    }); 
    } 

    render() { 
    const {viewport, data} = this.state; 

    return (
     <MapGL 
     {...viewport} 
     onViewportChange={this._onViewportChange.bind(this)} 
     mapboxApiAccessToken={MAPBOX_TOKEN} 
     mapStyle='mapbox://styles/mapbox/dark-v9'> 
     <DeckGLOverlay viewport={viewport} 
      data={data} 
      lowPerformerColor={lowPerformerColor} 
      highPerformerColor={highPerformerColor} 
      smallRadius={smallRadius} 
      largeRadius={largeRadius} 
      radius={300} 
      /> 
     </MapGL> 
    ); 
    } 
} 

答えて

1

ソリューション

IはMapGL層にonClickイベントをバブリングし、データを表示するポップアップ要素を用います。

app.jsにおけるよう


1)は、反応マップ-GLを

import MapGL, { Popup } from 'react-map-gl'; 

2からポップアップ要素をインポート)セット

(ポップアップで表示する)状態と "情報を見る" 座標
constructor(props) { 
    super(props); 
    this.state = { 
     viewport: { 
     ...DeckGLOverlay.defaultViewport, 
     width: 500, 
     height: 500 
     }, 
     data: null, 
     coordinates: [-0.13235092163085938,51.518250335096376], 
     info: "Hello" 
    }; 

3)(情報だけで、データの要素になりますあなたは

)しかし、ポップアップで表示したい何かをすることができ、新たなデータと状態を設定するコールバックメソッドを作成します。

4)ポップアップをレンダリングしDeckGL層

return (
     <MapGL 
     {...viewport} 
     {...this.props} 
     onViewportChange={this._onViewportChange.bind(this)} 
     mapboxApiAccessToken={MAPBOX_TOKEN} 
     mapStyle='mapbox://styles/mapbox/dark-v9'> 
     <Popup 
      longitude={this.state.coordinates[0]} 
      latitude={this.state.coordinates[1]}> 
      <div style={style}> 
      <p>{this.state.info}</p> 
      </div> 
     </Popup> 
     <DeckGLOverlay viewport={viewport} 
      data={data} 
      lowPerformerColor={lowPerformerColor} 
      highPerformerColor={highPerformerColor} 
      smallRadius={smallRadius} 
      largeRadius={largeRadius} 
      radius={300} 
      callbackFromParent={this.myCallback} 
      /> 
     </MapGL> 
    ); 

とdeckgl-overlay.js中にコールバックメソッドリファレンス:
1)親の(app.js)メソッドへのデータ情報をフィード

onClick: info => this.props.callbackFromParent(info), 

(明らかにDeckoverlayのReact-tooltip要素とonClickイベントハンドラを削除してください。jsをクリーンアップする)

関連する問題