【发布时间】:2018-02-07 21:49:11
【问题描述】:
我在deck.gl 中遇到了僵局,希望你们能帮帮我。我无法理解您如何在 hexagonLayer 示例中显示条形的属性,该示例显示在 deck.gl 官方网页:https://uber.github.io/deck.gl/#/examples/core-layers/hexagon-layer。 GitHub 中提供的示例没有此功能,而且浏览器层对我来说太复杂了。我尝试合并嵌入在 layer-browser 示例中的 layer-info 组件,但我不明白 (info) 是什么,并且一直收到此错误:
"模块解析失败: 您可能需要适当的加载程序来处理此文件类型。
非常感谢您的宝贵时间!我是新手反应!如果是微不足道的,我很抱歉。
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 Controls from './components/controls';
import {csv as requestCsv} from 'd3-request';
import LayerInfo from './components/layer-info';
// Set your mapbox token here
const MAPBOX_TOKEN =MBToken
// Source data CSV
const DATA_URL =
'https://raw.githubusercontent.com/uber-common/deck.gl-data/master/examples/3d-heatmap/heatmap-data.csv'; // eslint-disable-line
class Root extends Component {
constructor(props) {
super(props);
this.state = {
datad: {
package: 'react-dat-gui',
radius: 1100,
isAwesome: true,
feelsLike: '#2FA1D6',
},
viewport: {
...DeckGLOverlay.defaultViewport,
width: 500,
height: 500
},
data: null,
hoveredItem: null,
clickedItem: null,
queriedItems: null
};
requestCsv(DATA_URL, (error, response) => {
if (!error) {
const data = response.map(d => [Number(d.lng), Number(d.lat)]);
this.setState({data});
}
});
}
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}
});
}
onParentUpdate(datad) {
this.setState({ datad });
}
onHover(info) {
this.setState({hoveredItem: info});
}
render() {
const {viewport, datad, data} = this.state;
return (
<div>
<MapGL
{...viewport}
mapStyle="mapbox://styles/mapbox/dark-v9"
onViewportChange={this._onViewportChange.bind(this)}
mapboxApiAccessToken={MAPBOX_TOKEN}
>
<DeckGLOverlay viewport={viewport}
data={data || [] }
datad = {this.state.datad }
onLayerHover= {this.onHover}
/>
</MapGL>
<Controls
onUpdate = {(datad) => this.onParentUpdate(datad)}
datad = {this.state.datad}
/>
<LayerInfo
hovered={hoveredItem}
/>
</div>
);
}
}
render(<Root />, document.body.appendChild(document.createElement('div')));
图层信息.js
import React, {PureComponent} from 'react';
export default class LayerInfo extends PureComponent {
_infoToString(info) {
const object = info.feature || info.object;
if (!object) {
return 'None';
}
const props = object.properties || object;
return JSON.stringify(props);
}
render() {
const {hovered, clicked, queried} = this.props;
return (
<div>
{hovered && (
<div>
<h4>Hover</h4>
<span>
Layer: {hovered.layer.id} Object: {this._infoToString(hovered)}
</span>
</div>
)}
</div>
);
}
}
deckgl-overlay.js
import React, {Component} from 'react';
import {render} from 'react-dom';
import MapGL from 'react-map-gl';
import DeckGLOverlay from './deckgl-overlay.js';
import Controls from './components/controls';
import {csv as requestCsv} from 'd3-request';
import LayerInfo from './components/layer-info';
// Set your mapbox token here
const MAPBOX_TOKEN = MBToken; // eslint-disable-line
// Source data CSV
const DATA_URL =
'https://raw.githubusercontent.com/uber-common/deck.gl-data/master/examples/3d-heatmap/heatmap-data.csv'; // eslint-disable-line
class Root extends Component {
constructor(props) {
super(props);
this.state = {
datad: {
package: 'react-dat-gui',
radius: 1100,
isAwesome: true,
feelsLike: '#2FA1D6',
},
viewport: {
...DeckGLOverlay.defaultViewport,
width: 500,
height: 500
},
data: null,
hoveredItem: null,
clickedItem: null,
queriedItems: null
};
requestCsv(DATA_URL, (error, response) => {
if (!error) {
const data = response.map(d => [Number(d.lng), Number(d.lat)]);
this.setState({data});
}
});
}
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}
});
}
onParentUpdate(datad) {
this.setState({ datad });
}
onHover(info) {
this.setState({hoveredItem: info});
}
render() {
const {viewport, datad, data} = this.state;
return (
<div>
<MapGL
{...viewport}
mapStyle="mapbox://styles/mapbox/dark-v9"
onViewportChange={this._onViewportChange.bind(this)}
mapboxApiAccessToken={MAPBOX_TOKEN}
>
<DeckGLOverlay viewport={viewport}
data={data || [] }
datad = {this.state.datad }
onLayerHover= {this.onHover}
/>
</MapGL>
<Controls
onUpdate = {(datad) => this.onParentUpdate(datad)}
datad = {this.state.datad}
/>
<LayerInfo
hovered={hoveredItem}
/>
</div>
);
}
}
render(<Root />, document.body.appendChild(document.createElement('div')));
更新:我现在收到另一个错误“Uncaught ReferenceError: hoveredItem is not defined”
【问题讨论】:
-
你能发布你的代码不起作用吗?
-
我刚刚发布了它。我真正想了解的是如何使用内置回调“onLayerHover”
-
您不应在此处共享您的 mapbox-token,因为它仅供您个人使用(如果互联网上的任何其他 ppl 重复使用,可能会超过阈值限制)