import type { Session } from './index.js';
import type { Face, Properties, VectorPoint } from 'gis-tools/index.js';
import type { LayerDefinition, Projection, SourceMetadata } from 'style/style.spec.js';
import type { SourceFlushMessage, TileRequest } from '../worker.spec.js';
/** Marker metadata */
export interface MarkerMetadata {
    html?: string;
}
/** Marker definition tracking lon/lat, html, and properties associated with it */
export interface MarkerDefinition {
    id?: number;
    face?: Face;
    properties: Properties;
    point: VectorPoint;
    metadata?: MarkerMetadata;
}
/** Properties associated with markers */
interface MarkerProperties extends Properties {
    __markerID: number;
}
/** A storage container for Marker */
export interface Marker {
    id: number;
    metadata?: MarkerMetadata;
    properties: MarkerProperties;
    geometry: VectorPoint;
}
/**
 * # Marker Source
 *
 * Store, process, and render markers. Handles both WM and S2 projections
 */
export default class MarkerSource {
    #private;
    name: string;
    projection: Projection;
    isTimeFormat: boolean;
    styleLayers: LayerDefinition[];
    idGen: number;
    0: Map<number, Marker>;
    1: Map<number, Marker>;
    2: Map<number, Marker>;
    3: Map<number, Marker>;
    4: Map<number, Marker>;
    5: Map<number, Marker>;
    session: Session;
    textEncoder: TextEncoder;
    /**
     * @param name - name of the source
     * @param session - the session associated with the source data
     * @param projection - the projection to use (WM or S2)
     * @param layers - the style layers associated with this source
     */
    constructor(name: string, session: Session, projection: Projection, layers: LayerDefinition[]);
    /**
     * Build the source
     * @param _mapID - the id of the map (unused)
     * @param metadata - the metadata associated with the source
     */
    build(_mapID: string, metadata?: SourceMetadata): void;
    /**
     * Add marker to the source
     * @param marker - the marker to add
     */
    addMarker(marker: MarkerDefinition): void;
    /**
     * Delete marker(s)
     * @param ids - the id(s) of the marker(s) to delete
     */
    deleteMarkers(ids: number[]): void;
    /**
     * Process a tile request
     * @param mapID - the id of the map that is requesting data
     * @param tile - the tile request
     * @param flushMessage - the flush message function to call on completion
     */
    tileRequest(mapID: string, tile: TileRequest, flushMessage: SourceFlushMessage): void;
    /**
     * If no data, we still have to let the tile worker know so it can prepare a proper flush
     * as well as manage cases like "invert" type data.
     * @param mapID - the id of the map that is requesting data
     * @param tile - the tile request
     */
    _flush(mapID: string, tile: TileRequest): void;
}
export {};
