import { GeoJSONSource, MapSourceDataEvent, Marker } from "maplibre-gl";
import { AssetWithLocation, ClusterConfig } from "./types";
import { BaseMap } from "./base-map";
import { AttributeEvent } from "@openremote/model";
/**
 * This class handles where to display asset markers and clusters on the map.
 *
 * Currently, the standard flow to display assets as markers on the map goes as follows:
 *
 * 1. The map page adds assets to the {@link AssetMap}, which computes assets in view and then dispatches {@link OrMapMarkersChangedEvent}.
 * 2. The map page receives the event, renders the received assets as {@link OrMapMarkerAsset} by including them inside the map element's HTML body.
 * 3. The map component then receives either an event from the {@link OrMapMarkerAsset},
 * or when the map component sees a slotted {@link OrMapMarker} was added. From there the {@link OrMapMarker}s are passed to the {@link BaseMap} to be assigned to a MapLibre marker.
 *
 * @todo consider using `this._map.setGlobalStateProperty` for static cluster property
 */
export declare class AssetMap extends BaseMap {
    private static _clusterProperty;
    protected _assets: Record<string, AssetWithLocation | null>;
    protected _assetTypeColors: Record<string, string>;
    protected _assetsOnScreen: Record<string, AssetWithLocation>;
    protected _cachedClusters: Record<string, Marker>;
    protected _clustersOnScreen: Record<string, Marker>;
    protected _clusterConfig?: ClusterConfig;
    protected _source?: GeoJSONSource;
    protected _onMove: () => void;
    protected _onMoveEnd: (e: any) => void;
    protected _onData: (e: MapSourceDataEvent) => void;
    constructor(styleParent: Node, mapContainer: HTMLElement, showGeoCodingControl?: boolean, showBoundaryBox?: boolean, useZoomControls?: boolean, showGeoJson?: boolean, clusterConfig?: ClusterConfig);
    build(): Promise<void>;
    /**
     * Add an asset as (asset) feature to the map.
     *
     * Use {@link addAssets} instead if adding multiple assets.
     * @param asset The asset to add
     */
    addAsset(asset: AssetWithLocation): void;
    /**
     * Add multiple assets as (asset) features to the map. Optimized for adding multiple assets at once.
     * @param assets The assets to add
     */
    addAssets(assets: AssetWithLocation[]): void;
    updateAttribute(event: AttributeEvent): void;
    removeAssets(ids: string[]): void;
    removeAllAssets(): void;
    /**
     * Initialize asset sources, layers and data events
     */
    private load;
    protected _updateMarkers(): void;
    private _updateAssets;
    private _updateClusters;
    private _getClusterMarker;
    private _hasRequired;
    private _isMissing;
    private _getClusterProperties;
    private static _getClusterPropertyExpression;
    private static _assetToFeature;
}
//# sourceMappingURL=asset-map.d.ts.map