https://github.com/dy/point-cluster
2d point clustering for datavis purposes.
https://github.com/dy/point-cluster
Last synced: 11 months ago
JSON representation
2d point clustering for datavis purposes.
- Host: GitHub
- URL: https://github.com/dy/point-cluster
- Owner: dy
- License: mit
- Created: 2018-03-07T01:19:28.000Z (over 8 years ago)
- Default Branch: master
- Last Pushed: 2020-08-12T19:07:45.000Z (almost 6 years ago)
- Last Synced: 2025-06-23T22:53:29.778Z (12 months ago)
- Language: JavaScript
- Size: 126 KB
- Stars: 13
- Watchers: 2
- Forks: 6
- Open Issues: 8
-
Metadata Files:
- Readme: README.md
- License: license.md
Awesome Lists containing this project
README
# point-cluster [](https://travis-ci.org/dy/point-cluster) [](http://github.com/badges/stability-badges)
Point clustering for 2D spatial indexing. Incorporates optimized quad-tree data structure.
```js
const cluster = require('point-cluster')
let ids = cluster(points)
// get point ids in the indicated range
let selectedIds = ids.range([10, 10, 20, 20])
// get levels of details: list of ids subranges for rendering purposes
let lod = ids.range([10, 10, 20, 20], { lod: true })
```
## API
### `ids = cluster(points, options?)`
Create index for the set of 2d `points` based on `options`.
* `points` is an array of `[x,y, x,y, ...]` or `[[x,y], [x,y], ...]` coordinates.
* `ids` is _Uint32Array_ with point ids sorted by zoom levels, suitable for WebGL buffer, subranging or alike.
* `options`
Option | Default | Description
---|---|---
`bounds` | `'auto'` | Data range, if different from `points` bounds, eg. in case of subdata.
`depth` | `256` | Max number of levels. Points below the indicated level are grouped into single level.
`output` | `'array'` | Output data array or data format. For available formats see [dtype](https://npmjs.org/package/dtype).
---
### `result = ids.range(box?, options?)`
Get point ids from the indicated range.
* `box` can be any rectangle object, eg. `[l, t, r, b]`, see [parse-rect](https://github.com/dy/parse-rect).
* `options`
Option | Default | Description
---|---|---
`lod` | `false` | Makes result a list of level details instead of ids, useful for obtaining subranges to render.
`px` | `0` | Min pixel size in data dimension (number or `[width, height]` couple) to search for, to ignore lower levels.
`level` | `null` | Max level to limit search.
```js
let levels = ids.range([0,0, 100, 100], { lod: true, d: dataRange / canvas.width })
levels.forEach([from, to] => {
// offset and count point to range in `ids` array
render( ids.subarray( from, to ) )
})
```
### Related
* [snap-points-2d](https://github.com/gl-vis/snap-points-2d) − grouping points by pixels.
* [kdgrass](https://github.com/dy/kdgrass) − minimal kd-tree implementation.
* [regl-scatter2d](https://github.com/dfreative/regl-scatter2d) − highly performant scatter2d plot.
## License
© 2017 Dmitry Yv. MIT License
Development supported by [plot.ly](https://github.com/plotly/).