@wayz/react-gl
Version:
React Component for DeckGL, Base on AMap, Mapbox GL
44 lines (43 loc) • 1.71 kB
JavaScript
import { CompositeLayer } from '@deck.gl/core';
import { IconLayer } from '@deck.gl/layers';
import { point } from '@turf/helpers';
import bboxPolygon from '@turf/bbox-polygon';
import booleanPointInPolygon from '@turf/boolean-point-in-polygon';
class IconLayerInViewport extends CompositeLayer {
shouldUpdateState({ changeFlags }) {
return changeFlags.somethingChanged;
}
updateState({ props, oldProps, changeFlags }) {
const rebuildIndex = changeFlags.viewportChanged || props.sizeScale !== oldProps.sizeScale;
// @ts-expect-error
const bbox = this.context.viewport.getBounds();
const poly = bboxPolygon(bbox);
const data = props.data.filter((d) => {
const pt = point(props.getPosition(d));
return booleanPointInPolygon(pt, poly);
});
if (rebuildIndex) {
this.setState({ data });
}
}
renderLayers() {
const { data = [] } = this.state;
const { updateTriggers } = this.props;
const IconLayerInViewport = this.getSubLayerClass('viewport', IconLayer);
return new IconLayerInViewport(this.props, this.getSubLayerProps({
id: 'viewport',
updateTriggers: {
getIcon: updateTriggers.getIcon,
getPosition: updateTriggers.getPosition,
getColor: updateTriggers.getColor,
getAngle: updateTriggers.getAngle,
getPixelOffset: updateTriggers.getPixelOffset,
getSize: updateTriggers.getSize,
},
}), {
data,
});
}
}
IconLayerInViewport.layerName = 'IconLayerInViewport';
export default IconLayerInViewport;