Skip to content

Commit

Permalink
Align layer rendering with kepler.gl (#84)
Browse files Browse the repository at this point in the history
* Align layer rendering with kepler
  • Loading branch information
chrisgervang committed May 12, 2021
1 parent 1d7e55e commit 98236a9
Showing 1 changed file with 38 additions and 5 deletions.
43 changes: 38 additions & 5 deletions examples/worldview/src/features/stage/StageMap.js
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ import React, {Component} from 'react';
import DeckGL from '@deck.gl/react';
import {StaticMap} from 'react-map-gl';
import {MapboxLayer} from '@deck.gl/mapbox';
import {createSelector} from 'reselect';

export class StageMap extends Component {
constructor(props) {
Expand Down Expand Up @@ -140,12 +141,18 @@ export class StageMap extends Component {
}

createLayers() {
const layersToRender = this.layersToRenderSelector(this.props);

// returns an arr of DeckGL layer objects
const layerOrder = this.props.mapData.visState.layerOrder;
return layerOrder
.slice()
.reverse()
.reduce(this._renderLayer, []); // Slicing & reversing to create same layer order as Kepler
const {layerOrder, layerData, layers} = this.props.mapData.visState;
if (layerData && layerData.length) {
return layerOrder
.slice()
.reverse()
.filter(idx => layers[idx].overlayType === 'deckgl' && layersToRender[layers[idx].id])
.reduce(this._renderLayer, []); // Slicing & reversing to create same layer order as Kepler
}
return [];
}

_onMapLoad() {
Expand All @@ -170,6 +177,32 @@ export class StageMap extends Component {
);
}

layersSelector = props => props.mapData.visState.layers;
layerDataSelector = props => props.mapData.visState.layerData;
mapLayersSelector = props => props.mapData.visState.mapLayers;
layerOrderSelector = props => props.mapData.visState.layerOrder;
layersToRenderSelector = createSelector(
this.layersSelector, // eslint-disable-line
this.layerDataSelector, // eslint-disable-line
this.mapLayersSelector, // eslint-disable-line
// {[id]: true \ false}
(layers, layerData, mapLayers) =>
layers.reduce(
(accu, layer, idx) => ({
...accu,
[layer.id]:
layer.shouldRenderLayer(layerData[idx]) && this._isVisibleMapLayer(layer, mapLayers) // eslint-disable-line
}),
{}
)
);

/* component private functions */
_isVisibleMapLayer(layer, mapLayers) {
// if layer.id is not in mapLayers, don't render it
return !mapLayers || (mapLayers && mapLayers[layer.id]);
}

render() {
const {adapter, viewState, width, height, setViewState} = this.props;

Expand Down

0 comments on commit 98236a9

Please sign in to comment.