StackGenVis: Alignment of Data, Algorithms, and Models for Stacking Ensemble Learning Using Performance Metrics
https://doi.org/10.1109/TVCG.2020.3030352
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
86 lines
3.1 KiB
86 lines
3.1 KiB
4 years ago
|
# grid-index
|
||
|
|
||
|
GridIndex is a 2D spatial index that is [transferable](https://developer.mozilla.org/en-US/docs/Web/API/Transferable).
|
||
|
|
||
|
Pairs of keys and boxes can be inserted into GridIndex. The grid can then be queried to find all the keys that intersect a given box. The grid can be serialized to an ArrayBuffer so that it can be transferred between WebWorkers.
|
||
|
|
||
|
**You should probably use [rbush](https://github.com/mourner/rbush) instead of GridIndex!** It's easier to use and it's as fast or faster in many cases.
|
||
|
|
||
|
GridIndex can be faster in a specific set of cases:
|
||
|
- the constructed index needs to be transferred between workers
|
||
|
- the extent of the features is fixed
|
||
|
- features are somewhat evenly sized and distributed
|
||
|
- a high number of insertions relative to the number of queries
|
||
|
|
||
|
GridIndex is used by [mapbox-gl-js](https://github.com/mapbox/mapbox-gl-js) for label collision detection and feature picking.
|
||
|
|
||
|
## Example
|
||
|
|
||
|
```js
|
||
|
var GridIndex = require('grid-index');
|
||
|
|
||
|
var grid = new GridIndex(100, 5, 0);
|
||
|
var key1 = 1;
|
||
|
var key2 = 2;
|
||
|
var key3 = 3;
|
||
|
grid.insert(key1, 30, 10, 35, 15);
|
||
|
grid.insert(key2, 60, 20, 65, 25);
|
||
|
grid.insert(key3, 40, 10, 45, 15);
|
||
|
|
||
|
var keys = grid.query(0, 0, 100, 13);
|
||
|
// `keys` is now [key1, key3]
|
||
|
|
||
|
var arrayBuffer = grid.toArrayBuffer();
|
||
|
// transfer the ArrayBuffer to a different worker
|
||
|
|
||
|
var grid2 = new GridIndex(arrayBuffer);
|
||
|
var keys2 = grid2.query(0, 0, 100, 13);
|
||
|
// `keys2` is now [key1, key3]
|
||
|
```
|
||
|
|
||
|
## API
|
||
|
|
||
|
### `GridIndex(extent, n, padding)`
|
||
|
Create a new GridIndex.
|
||
|
|
||
|
- **extent**: The width and height of the square area that needs to be indexed, for example `4096`.
|
||
|
- **n**: The rows and columns the grid will be split into. `4` would divide the grid into 16 cells.
|
||
|
- **padding**: The number of extra rows and columns that should be added on each side of the main grid square.
|
||
|
|
||
|
|
||
|
### `GridIndex(arrayBuffer)`
|
||
|
Unserialize a GridIndex.
|
||
|
|
||
|
- **arrayBuffer**: an ArrayBuffer produced by `gridIndex.toArrayBuffer()`.
|
||
|
|
||
|
|
||
|
### `gridIndex.insert(key, x1, y1, x2, y2)`
|
||
|
|
||
|
Insert a new key, box pair into the grid.
|
||
|
|
||
|
- **key**: An unsigned 32bit integer.
|
||
|
- **x1**: The x coordinate of the left edge of the box.
|
||
|
- **y1**: The y coordinate of the bottom edge of the box.
|
||
|
- **x2**: The x coordinate of the right edge of the box.
|
||
|
- **y2**: The y coordinate of the top edge of the box.
|
||
|
|
||
|
|
||
|
### `gridIndex.query(key, x1, y1, x2, y2, intersectionTest?)`
|
||
|
|
||
|
Find the keys that intersect with the given box.
|
||
|
|
||
|
- **x1**: The x coordinate of the left edge of the box.
|
||
|
- **y1**: The y coordinate of the bottom edge of the box.
|
||
|
- **x2**: The x coordinate of the right edge of the box.
|
||
|
- **y2**: The y coordinate of the top edge of the box.
|
||
|
- **intersectionTest**: An optional function that can be used to filter results by bbox. If provided, this function is called for each possible result with four arguments: x1, y1, x2, y2. Return true to include the result in the returned value.
|
||
|
|
||
|
**returns** an array of keys.
|
||
|
|
||
|
|
||
|
### `gridIndex.toArrayBuffer()`
|
||
|
|
||
|
Serialize a GridIndex to an ArrayBuffer so that it can be transferred between WebWorkers efficiently.
|
||
|
|
||
|
**returns** an ArrayBuffer that can later be deserialized with `new GridIndex(arrayBuffer)`.
|