import PointIndex from './pointIndex.js';
import { Tile } from 'gis-tools/index.js';
import type { ClusterOptions } from './index.js';
import type { Face, JSONCollection, S2CellId, VectorPointFeature } from 'gis-tools/index.js';
/** Comparison function - if true the features can be grouped */
export type Comparator = (a: VectorPointFeature, b: VectorPointFeature) => boolean;
/** A clustered point */
export interface Cluster {
    ref: VectorPointFeature;
    visited: boolean;
    sum: number;
}
/** Options for point clustering that are filled with values */
export interface OptionsComputed {
    /** min zoom to generate clusters on */
    minzoom: number;
    /** max zoom level to cluster the points on */
    maxzoom: number;
    /** cluster radius in pixels */
    radius: number;
    /** tile extent (radius is calculated relative to it) */
    extent: number;
    /** size of the KD-tree leaf node, effects performance */
    nodeSize: number;
}
/**
 * # Point Cluster
 *
 * A point cluster for Web Mercator tiles
 */
export default class PointCluser {
    #private;
    minzoom: number;
    maxzoom: number;
    options: OptionsComputed;
    base: PointIndex<Cluster>;
    indexes: Array<PointIndex<Cluster>>;
    points: VectorPointFeature[];
    faces: Set<Face>;
    projection: string;
    /** @param options - cluster options */
    constructor(options?: ClusterOptions);
    /**
     * Add a collection of points
     * @param data - a collection of points to add
     */
    addManyPoints(data: JSONCollection): void;
    /**
     * Add a single point
     * @param point - a point to add
     */
    addPoint(point: VectorPointFeature): void;
    /**
     * Cluster the points
     * @param cmp - optional comparator function
     */
    cluster(cmp?: Comparator): void;
    /**
     * Get a tile from the point cluster
     * @param id - the tile id
     * @returns a tile filled with cluster points that are in the tile
     */
    getTile(id: S2CellId): Tile;
}
