in src/lib/components/molecules/canvas-map/lib/renderers/MapRenderer.js [32:95]
renderFrame(frameState, canvas) {
const { zoomLevel, projection, sizeInPixels } = frameState.viewState
const layers = this.map.layers
const mapElements = []
let canvasElement
if (canvas) {
canvasElement = canvas
} else if (this._canvas) {
canvasElement = this._canvas
// Setting the height and width of the canvas also clears it
canvasElement.width = sizeInPixels[0]
canvasElement.height = sizeInPixels[1]
} else {
canvasElement = createCanvas(sizeInPixels)
this._canvas = canvasElement
}
const visibleLayers = layers.filter((layer) => {
return zoomLevel > (layer.minZoom || 0)
})
const renderLayer = (layer, declutterTree) => {
const viewState = frameState.viewState
if (layer.projection) {
viewState.projection = layer.projection
}
// Render the layer, providing the main canvas
const element = layer.renderFrame(
{ ...frameState, viewState, declutterTree },
canvasElement,
)
// If renderFrame created a new element, add it to the list of elements we add to the map
// container. This is currently only used for the TextLayer, each of which puts its layers in
// a new div.
if (element) {
mapElements.push(element)
}
// reset to map projection
viewState.projection = projection
}
const declutterTree = new RBush()
for (const layer of visibleLayers) {
if (layer.declutter) {
renderLayer(layer, declutterTree)
} else {
renderLayer(layer)
}
}
if (this._element) {
replaceChildren(this._element, [canvasElement, ...mapElements])
}
}