如何解决当数据数组更改时重新加载 DeckGL HexagonLayer/触发重新加载 DeckGL HexagonLayer
我正在使用带有 React 的 DeckGL 在 OpenStreetMap 上显示一些数据。 我计划实施一些过滤器,以便能够对我拥有的数据显示不同的视图。 我的主要问题是,我不知道如何在过滤数据数组后刷新数据表示层。
我看到很多人在 JavaScript 中创建了一个 DeckGL-Object,然后使用它来调用 deck.setProps()
,但我不知道如何使用 react 来渲染这个 DeckGL-Object。
这是我的app.js
:
export default function App({showBorder = false,onTilesLoad = null}) {
layers = [
/**
* TileLayer ist ein Layer aus Open-Streetmap-Tiles (Anzeigen der Karte)
*/
new TileLayer({
data: [/*OSM TileServer*/],maxRequests: 20,pickable: true,onViewportLoad: onTilesLoad,autoHighlight: showBorder,highlightColor: [60,60,40],minZoom: 0,maxZoom: 19,tileSize: 512 / devicePixelRatio,renderSubLayers: (props) => {
const {
bBox: {west,south,east,north}
} = props.tile;
return [
new BitmapLayer(props,{
data: null,image: props.data,bounds: [west,north]
}),showBorder &&
new PathLayer({
id: `${props.id}-border`,visible: props.visible,data: [
[
[west,north],[west,south],[east,north]
]
],getPath: (d) => d,getColor: [255,0],widthMinPixels: 4
})
];
}
}),new HexagonLayer({
id: 'hexagon-layer',data: /*JsonDataArray*/,extruded: true,radius: 2000,elevationRange: [25,500],elevationScale: 200,autoHighlight: true,opacity: 0.2,colorRange: [
[255,255,204],[199,233,180],[127,205,187],[65,182,196],[44,127,184],[37,52,148]
],getElevationHeight: () => 500,getPosition: (d) => d.coordinates,})
];
return (
<DeckGL
layers={layers}
views={new MapView({repeat: true})}
initialViewState={INITIAL_VIEW_STATE}
controller={true}
/>
);
}
显然我的 app.js
有更多内容,但我认为缺少的部分并不重要,因为我只想知道如何刷新图层。
我也有一个 index.html
,但我认为它的内容也不是真正相关的,因为它的唯一用途是调用 App
函数来渲染图层。
我只是不知道该怎么做,导致重新加载 HexagonLayer。
提前感谢您的帮助。
解决方法
-
一个好方法是使用 DataFilterExtension。基于 GPU 的数据 过滤,如果您关心性能,请采用这种方式。为了 扩展的时刻 there is a limitation
HexagonLayer
,但也许使用GPUGridLayer
可以帮助您 也可视化。即:假设您想过滤定性数据。
filterRange
需要数字边界(它定义一个对象是否 应该呈现),因此您可以将边界设置为[1,1]
和 检查某些对象是否与您当前的过滤条件匹配,如果 匹配,getFilterValue
得到 1,这样对象就会被渲染, 否则,不呈现:const [filterCondition,setFilter] = useState(''); useEffect(() => { // dispatch some action to set the filter setFilter('cities'); },[]); new ScatterplotLayer({ ...otherProps,getFilterValue: object => object.properties.target === filterCondition ? 1 : 0,filterRange: [1,1],extensions: [new DataFilterExtension({ filterSize: 1 })],updateTriggers: { // It's important to tell deck.gl when to update getFilterValue: filterCondition } });
-
否则更新您的
data
数组就足够了。这意味着一个 基于CPU的数据过滤,如果你的数据不是很大,没关系。 多亏了反应性,这样的事情应该足够了:const [yourData,setData] = useState([]); useEffect(() => { // dispatch some action to set data setData([newData]); },[]); const layers = [ new HexagonLayer({ ...otherProps,data: yourData }); ]; return ( <DeckGL ...otherProps,layers={layers} /> );
P.D:deck.setProps()
建议在非反应环境中使用
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。