【发布时间】:2019-09-08 18:33:08
【问题描述】:
我正在使用 deck.gl GeoJsonLayer 在地图上显示区域。 通过一个事件,我能够使这些区域可选。 我正在努力解决的问题是点击后更改特征选择中的特征颜色。
这是渲染层函数(改编自here)
_renderLayers(props) {
const { geofeats } = props;
return [
new GeoJsonLayer({
id: 'geojson',
data: geofeats,
opacity: 0.8,
stroked: true,
filled: true,
extruded: true,
wireframe: true,
getElevation: f => 10000,
getFillColor: f =>
{
if(f.properties.selected)
{
return [200, 200, 100];
} else return [200, 100, 150];
},
getLineColor: [255, 255, 255],
pickable: true,
onHover: this._onHover,
onClick: this._onClick
})
];
}
问题是,当我通过 setState() 更新特征集合中特征的选择状态时,即使数据中表示状态更改,渲染也不会更新..
这就是我传递“geofeats”对象的方式:
render() {
const {features} = this.state;
const {mapStyle = 'mapbox://styles/mapbox/light-v9'} = this.props;
return (
<DeckGL
layers={this._renderLayers({geofeats: features})}
effects={this._effects}
initialViewState={INITIAL_VIEW_STATE}
controller={true}
>
<StaticMap
reuseMaps
mapStyle={mapStyle}
preventStyleDiffing={true}
mapboxApiAccessToken={MAPBOX_TOKEN}
/>
{this._renderTooltip}
</DeckGL>
);
}
我通过 setState 而不是通过 props 尝试了它 - 但结果是一样的。特征集合被移交给 GeoJsonLayer 但从未更新。
谁能告诉我,我做错了什么?
更新:带有错误再现的要点示例:https://gist.github.com/jaronimoe/efdbb58b3f52c2aac63362a921802cfe
【问题讨论】:
-
当你在特征集合中更新选择状态时,你的意思是你用所选项目的不同颜色属性更新你的 geojson 的属性吗?
-
猜测为什么它没有更新可能是你的 geojson 的
id字段没有改变,或者你的数据对象的签名可能没有改变(内存中的位置)。您可以尝试更新这些以查看是否有帮助 -
@JohnRuddell 我更新了相应 geojson 功能的“selected”属性:getFillColor: f => { if(f.properties.selected) { return [200, 200, 100]; } 否则返回 [200, 100, 150]; },但似乎 getFillColor 没有重新触发..您知道成功触发重绘的代码示例吗?
-
我认为您需要更改geojson。更新它的属性。
-
这就是我正在做的 - geojson 属性已更改,但未反映在颜色中/颜色未更新。