import { type LatLngLike } from "../geo.js"; import { InteractiveLayer } from "../interactive-layer.js"; import { type LayerOptions } from "../layer.js"; import type { Orihon } from "../map.js"; import { SpatialGridIndex } from "../services/spatial-grid-index.js"; import { type MarkerOptions } from "./marker.js"; import { type RemovedPointStyleAliases } from "../style-contract.js"; export type MarkerCollectionRenderer = "auto" | "dom" | "svg" | "webgl" | "hybrid"; export interface MarkerCollectionOptions extends LayerOptions, RemovedPointStyleAliases { /** * - `dom` — Marker elements (fine for hundreds / low thousands) * - `svg` — one real SVG DOM node per point, with shared style/transform * - `webgl` — GPU points (50k–250k+) * - `hybrid` — up to `domLimit` Marker elements above a WebGL remainder * - `auto` — webgl when size ≥ `webglThreshold` */ renderer?: MarkerCollectionRenderer; /** Default 2500. */ webglThreshold?: number; /** Hybrid path: maximum mounted DOM markers. Default 500. */ domLimit?: number; /** SVG path: soft automatic HTML-button budget; selected points may exceed it. Default 0. */ htmlButtonLimit?: number; /** SVG path: screen spacing between automatic buttons. Defaults to max(48px, pointSize × 12); 0 disables thinning. */ buttonCellSize?: number; /** * When zoom ≥ this value, force viewport-culled DOM markers (icons) even if * the count would otherwise pick WebGL. Use for icon LOD: points far, icons near. * Default `Infinity` (disabled). */ iconMinZoom?: number; /** DOM path: only mount markers in padded viewport. Default true. */ viewportCull?: boolean; marker?: MarkerOptions; pointSize?: number; /** Point fill color. */ fill?: string; /** Point fill opacity. */ fillOpacity?: number; indexCellSize?: number; } type ResolvedMarkerCollectionOptions = LayerOptions & Required> & { marker: MarkerOptions; }; /** * Large point sets as markers without mounting 50k DOM nodes. * Auto path uses WebGL above `webglThreshold`; DOM path viewport-culls; * SVG keeps real addressable DOM nodes with one shared style/transform; * hybrid keeps a bounded HTML icon layer over a WebGL remainder. */ export declare class MarkerCollection extends InteractiveLayer { #private; readonly index: SpatialGridIndex<{ i: number; }, number>; private _points; private _markers; private _markerPool; private _domContainer; private _svg; private _svgGroup; private _svgUses; private _selected; private _webgl; private _active; private _paintedZoom; private _paintedOriginX; private _paintedOriginY; private _settleTimer; private readonly _schedule; private readonly _onView; constructor(points?: Iterable, options?: MarkerCollectionOptions); get size(): number; get renderer(): "dom" | "svg" | "webgl" | "hybrid"; /** Current real DOM node for an indexed point, or null in pure WebGL mode. */ getElement(index: number): HTMLElement | SVGCircleElement | null; /** Keep user-selected visible objects as full HTML buttons ahead of the automatic spatial budget. */ setSelected(indices: Iterable): this; /** Add or remove one object from the user-selected HTML-button set. */ setPointSelected(index: number, selected?: boolean): this; setLatLngs(points: Iterable): this; addLatLng(point: LatLngLike): this; clear(): this; onAdd(map: Orihon): void; onRemove(): void; wantsFrameRender(): boolean; render(): void; redraw(): this; } export declare function markerCollection(points?: Iterable, options?: MarkerCollectionOptions): MarkerCollection; export {}; //# sourceMappingURL=marker-collection.d.ts.map