in modules/aggregation-layers/src/cpu-grid-layer/grid-aggregator.js [61:108]
function pointsToGridHashing(props, aggregationParams) {
const {data = [], cellSize} = props;
const {attributes, viewport, projectPoints, numInstances} = aggregationParams;
const positions = attributes.positions.value;
const {size} = attributes.positions.getAccessor();
const boundingBox =
aggregationParams.boundingBox || getPositionBoundingBox(attributes.positions, numInstances);
const offsets = aggregationParams.posOffset || [180, 90];
const gridOffset = aggregationParams.gridOffset || getGridOffset(boundingBox, cellSize);
if (gridOffset.xOffset <= 0 || gridOffset.yOffset <= 0) {
return {gridHash: {}, gridOffset};
}
const {width, height} = viewport;
const numCol = Math.ceil(width / gridOffset.xOffset);
const numRow = Math.ceil(height / gridOffset.yOffset);
// calculate count per cell
const gridHash = {};
const {iterable, objectInfo} = createIterable(data);
const position = new Array(3);
for (const pt of iterable) {
objectInfo.index++;
position[0] = positions[objectInfo.index * size];
position[1] = positions[objectInfo.index * size + 1];
position[2] = size >= 3 ? positions[objectInfo.index * size + 2] : 0;
const [x, y] = projectPoints ? viewport.project(position) : position;
if (Number.isFinite(x) && Number.isFinite(y)) {
const yIndex = Math.floor((y + offsets[1]) / gridOffset.yOffset);
const xIndex = Math.floor((x + offsets[0]) / gridOffset.xOffset);
if (
!projectPoints ||
// when doing screen space agggregation (projectPoints = true), filter points outside of the viewport range.
(xIndex >= 0 && xIndex < numCol && yIndex >= 0 && yIndex < numRow)
) {
const key = `${yIndex}-${xIndex}`;
gridHash[key] = gridHash[key] || {count: 0, points: [], lonIdx: xIndex, latIdx: yIndex};
gridHash[key].count += 1;
gridHash[key].points.push(pt);
}
}
}
return {gridHash, gridOffset, offsets: [offsets[0] * -1, offsets[1] * -1]};
}