4.0.0 • Published 3 years ago

@plotly/point-cluster v4.0.0

Weekly downloads
59,209
License
MIT
Repository
github
Last release
3 years ago

point-cluster Build Status experimental

Point clustering for 2D spatial indexing. Incorporates optimized quad-tree data structure.

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
OptionDefaultDescription
bounds'auto'Data range, if different from points bounds, eg. in case of subdata.
depth256Max 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.
<!-- node1Min size of node, ie. tree traversal is stopped once the node contains less than the indicated number of points. -->
<!-- sort'z'Sort values within levels by x-, y-coordinate, z-curve or r - point radius. z is the fastest for init, x or y are faster for lod and r is the most data-relevant. -->
<!-- pick'first''first', 'last' or a function, returning point id for the level. -->

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.
  • options
OptionDefaultDescription
lodfalseMakes result a list of level details instead of ids, useful for obtaining subranges to render.
px0Min pixel size in data dimension (number or [width, height] couple) to search for, to ignore lower levels.
levelnullMax level to limit search.
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

License

© 2017 Dmitry Yv. MIT License

Development supported by plot.ly.