Skip to main content
Get started with npm

Browser SDK API reference

These signatures are generated from TypeScript declarations of committed core sources. This is a development-source snapshot, not an npm or native binary release.

Core: 65d76a28454ec82456e27245099bab86832a2b7d · ABI: 1 · package source: 0.2.0.

JSON index · TypeScript declarations · Native API · Script API

Save all relative declaration dependencies together. These files provide types; execution still requires matching JS, Worker and WASM. MapView is the current SDK entry point. Consult the script guide for the supported shared MapLibre-style facade and legacy GIS adapter.

MapAppEvent

export interface MapAppEvent {
    name: string;
    data: unknown;
}

MapViewOptions

export interface MapViewOptions {
    wasmUrl?: string | URL;
    interactive?: boolean;
    contextMenu?: false | ((event: MapContextMenuEvent, defaults: ContextMenuItem[]) => ContextMenuItem[]);
    apiToken?: string | (() => string | undefined);
    transformRequest?: RequestTransform;
    resourceTimeoutMs?: number;
    resourcePolicy?: ResourcePolicy;
    reducedMotion?: boolean;
    materialFadeDuration?: number;
    fadeDuration?: number;
    worker?: boolean;
    locale?: LocalePreference;
    createWorker?: () => Worker;
    bindings?: () => Promise<WasmBindings>;
}

MapViewDefaults

export interface MapViewDefaults {
    createWorker?: () => Worker;
    bindings?: () => Promise<WasmBindings>;
}

GeoJSONOptions

export interface GeoJSONOptions {
    crs?: string | number;
}

Projection

export type Projection = "geographic" | "mercator" | "globe" | "auto";

MapErrorEvent

export interface MapErrorEvent {
    message: string;
}

ContextMenuItem

export type ContextMenuItem = {
    label: string;
    action: () => void;
    disabled?: boolean;
} | "separator";

MapContextMenuEvent

export interface MapContextMenuEvent {
    x: number;
    y: number;
    lngLat: [number, number];
}

RasterTileOptions

export interface RasterTileOptions {
    attribution?: string;
    name?: string;
    scheme?: "geographic" | "mercator";
    kind?: "image" | "terrain-rgb";
    tileSize?: number;
    exaggeration?: number;
    subdomains?: string[];
    minZoom?: number;
    maxZoom?: number;
    zoomOffset?: number;
    opacity?: number;
}

LayerInfo

export interface LayerInfo {
    kind: "vector" | "raster";
    id: number;
    name: string;
    visible: boolean;
}

LayerStyle

export interface LayerStyle {
    fill?: string;
    line?: string;
    lineWidth?: number;
    pointSize?: number;
    opacity?: number;
}

MapViewTarget

export interface MapViewTarget {
    center: [number, number];
    zoom: number;
}

MapViewState

export interface MapViewState {
    projection?: Projection;
    zoom?: number;
    pitch?: number;
    bounds?: readonly [number, number, number, number];
    center: [number, number];
    bearing: number;
    metersPerPixel: number;
}

MapClickEvent

export interface MapClickEvent extends MapPointerEvent {
    readonly x: number;
    readonly y: number;
    readonly legacyLngLat: readonly [number, number] | null;
    readonly feature: PickResult | null;
}

MapMoveEvent

export interface MapMoveEvent {
    readonly cameraState: MapCameraState;
    readonly animation?: CameraAnimationTag;
    readonly error?: {
        code: string;
        message: string;
    };
}

MapCameraEvent

export type MapCameraEvent = MapMoveEvent;

MapViewEventMap

export interface MapViewEventMap {
    'styledata': StyleDataEvent;
    'style.load': StyleDataEvent;
    load: MapLifecycleEvent;
    render: MapLifecycleEvent;
    idle: MapLifecycleEvent;
    remove: MapLifecycleEvent;
    'sqs.scenechange': SceneChangeEvent;
    'sqs.lightingchange': LightingChangeEvent;
    'sqs.playbackchange': PlaybackChangeEvent;
    movestart: MapCameraEvent;
    moveend: MapCameraEvent;
    zoomstart: MapCameraEvent;
    zoom: MapCameraEvent;
    zoomend: MapCameraEvent;
    rotatestart: MapCameraEvent;
    rotate: MapCameraEvent;
    rotateend: MapCameraEvent;
    pitchstart: MapCameraEvent;
    pitch: MapCameraEvent;
    pitchend: MapCameraEvent;
    rollstart: MapCameraEvent;
    roll: MapCameraEvent;
    rollend: MapCameraEvent;
    move: MapMoveEvent;
    "sqs.sourceschange": SourceChangeEvent;
    sources: SourceChangeEvent;
    "sqs.imageschange": ImagesChangeEvent;
    "sqs.resourceschange": ResourcePolicyChangeEvent;
    "styleimagemissing": MapStyleImageMissingEvent;
    "sqs.gestureschange": GestureChangeEvent;
    "sqs.attributionschange": AttributionChangeEvent;
    terrain: TerrainEvent;
    sourcedataloading: SourceLifecycleEvent;
    sourcedata: SourceLifecycleEvent;
    sourcedataabort: SourceLifecycleEvent;
    "sqs.layerschange": StyleLayersChangeEvent;
    styleLayers: StyleLayersChangeEvent;
    click: MapClickEvent;
    dblclick: MapPointerEvent;
    mousedown: MapPointerEvent;
    mouseup: MapPointerEvent;
    mousemove: MapPointerEvent;
    mouseenter: MapPointerEvent;
    mouseleave: MapPointerEvent;
    contextmenu: MapPointerEvent;
    view: MapViewState;
    layers: LayerInfo[];
    error: AttributionErrorEvent | MapErrorEvent | (SourceLifecycleEvent & {
        readonly message: string;
    });
    locale: Locale;
    app: MapAppEvent;
}

Backend

export interface Backend {
    readonly backend: string;
    readonly capabilities: Record<string, unknown>;
    call(method: string, ...args: unknown[]): void;
    confirmCall<T = void>(method: string, ...args: unknown[]): Promise<T>;
    request<T>(method: string, ...args: unknown[]): Promise<T>;
    flush(options?: FlushOptions): Promise<CommandReceipt>;
    appCall(method: string, args: unknown[], transfer?: Transferable[]): void;
    appRequest<T>(method: string, args: unknown[], transfer?: Transferable[]): Promise<T>;
    destroy(): void;
}

DynamicImageHost

export interface DynamicImageHost {
    dispatch(batch: DynamicImageBatch): DynamicImageDispatch | Promise<DynamicImageDispatch>;
    reconcile(state: DynamicImageState): void;
    contextLost(): void;
    clear(): void;
}

DynamicImageHostScope

export interface DynamicImageHostScope {
    call(method: string, args: unknown[]): Promise<unknown>;
    close(): void;
}

MapView.editing

readonly editing: EditingAPI;

MapView.lighting

readonly lighting: LightingAPI;

MapView.sqs

readonly sqs: Readonly<{
        images: Readonly<{
            createCallbackScope: (host: DynamicImageHost) => DynamicImageHostScope;
        }>;
        getMaterialFadeDuration: () => Promise<number>;
        setMaterialFadeDuration: (ms: number) => void;
        getLabelFadeDuration: () => Promise<number>;
        setLabelFadeDuration: (ms: number) => void;
        animations: AnimationsAPI;
        playbacks: PlaybacksAPI;
        scenes: ScenesAPI;
        resources: ResourcesAPI;
        getCapabilities: () => Promise<Readonly<Record<string, unknown>>>;
    }>;

MapView.dragPan

readonly dragPan: GestureHandler;

MapView.scrollZoom

readonly scrollZoom: GestureHandler;

MapView.doubleClickZoom

readonly doubleClickZoom: GestureHandler;

MapView.keyboard

readonly keyboard: KeyboardHandler;

MapView.touchZoomRotate

readonly touchZoomRotate: TouchZoomRotateHandler;

MapView.touchPitch

readonly touchPitch: GestureHandler;

MapView.gesturesState

gesturesState(): Promise<GesturePolicy>;

MapView.mapInstanceId

readonly mapInstanceId: `${string}-${string}-${string}-${string}-${string}`;

MapView.canvas

readonly canvas: HTMLCanvasElement;

MapView.offscreen

readonly offscreen: boolean;

MapView.create

static create(target: HTMLElement, options?: MapViewOptions): Promise<MapView>;

MapView.locale

get locale(): Locale;

MapView.setLocale

setLocale(locale: LocalePreference): void;

MapView.text

get text(): Messages;

MapView.backend

get backend(): string;

MapView.capabilities

get capabilities(): Record<string, unknown>;

MapView.addGeoJSON

addGeoJSON(name: string, data: string | object, options?: GeoJSONOptions): number;

MapView.loadImage

loadImage(url: string, options?: MapImageLoadOptions): Promise<MapImageLoadResult>;

MapView.addImage

addImage(id: string, image: MapImageData | StyleImageInterface, options?: MapImageOptions): this;

MapView.updateImage

updateImage(id: string, image: MapImageData): this;

MapView.removeImage

removeImage(id: string): this;

MapView.triggerRepaint

triggerRepaint(): void;

MapView.hasImage

hasImage(id: string): Promise<boolean>;

MapView.getGlyphs

getGlyphs(): Promise<string | undefined>;

MapView.setGlyphs

setGlyphs(url: string | null | undefined, options?: {
        validate?: true;
    }): this;

MapView.listImages

listImages(): Promise<readonly string[]>;

MapView.getImage

getImage(id: string): Promise<MapImageSnapshot | undefined>;

MapView.getImageInfo

getImageInfo(id: string): Promise<MapImageInfo | undefined>;

MapView.onImagesChange

onImagesChange(handler: (event: ImagesChangeEvent) => void): () => void;

MapView.addLayer

addLayer(specification: GeoJSONLayerSpecification, beforeId?: string): this;

MapView.getLayer

getLayer(id: string): Promise<GeoJSONLayerSpecification | undefined>;

MapView.queryRenderedFeatures

queryRenderedFeatures(geometryOrOptions?: QueryPixel | [QueryPixel, QueryPixel] | QueryRenderedFeatureOptions, options?: QueryRenderedFeatureOptions): Promise<QueriedRenderedFeature[]>;

MapView.getStyleLayers

getStyleLayers(): Promise<readonly GeoJSONLayerInfo[]>;

MapView.setLayerMetadata

setLayerMetadata(id: string, metadata: Record<string, unknown> | null): this;

MapView.getLayerMetadata

getLayerMetadata(id: string): Promise<Record<string, unknown>>;

MapView.setPaintProperty

setPaintProperty(id: string, name: string, value: unknown, options?: {
        validate?: true;
    }): this;

MapView.getPaintProperty

getPaintProperty(id: string, name: string): Promise<unknown>;

MapView.setLayoutProperty

setLayoutProperty(id: string, name: string, value: unknown, options?: {
        validate?: true;
    }): this;

MapView.getLayoutProperty

getLayoutProperty(id: string, name: string): Promise<unknown>;

MapView.setFilter

setFilter(id: string, filter: unknown[] | null, options?: {
        validate?: true;
    }): this;

MapView.getFilter

getFilter(id: string): Promise<unknown[] | null>;

MapView.setLayerZoomRange

setLayerZoomRange(id: string, minzoom: number, maxzoom: number): this;

MapView.addSource

addSource(id: string, options: SourceOptions): this;

MapView.removeSource

removeSource(id: string): this;

MapView.isSourceLoaded

isSourceLoaded(id: string): Promise<boolean>;

MapView.setFeatureState

setFeatureState(target: FeatureStateTarget | QueriedSourceFeature, state: FeatureState): this;

MapView.getFeatureState

getFeatureState(target: FeatureStateTarget | QueriedSourceFeature): Promise<FeatureState>;

MapView.removeFeatureState

removeFeatureState(target: FeatureStateRemovalTarget, key?: string): this;

MapView.getGlobalState

getGlobalState(): Promise<Readonly<Record<string, unknown>>>;

MapView.setGlobalStateProperty

setGlobalStateProperty(name: string, value: unknown): this;

MapView.querySourceFeatures

querySourceFeatures(id: string, options?: QuerySourceFeatureOptions): Promise<QueriedSourceFeature[]>;

MapView.getSourceInfo

getSourceInfo(id: string): Promise<SourceInfo | undefined>;

MapView.setTerrain

setTerrain(options: TerrainSpecification | null): this;

MapView.getTerrain

getTerrain(): Promise<Readonly<TerrainSpecification> | null>;

MapView.queryTerrainElevation

queryTerrainElevation(point: readonly [number, number] | {
        lng: number;
        lat: number;
    } | {
        lon: number;
        lat: number;
    }): Promise<number | null>;

MapView.getSource

getSource(id: string): Promise<MapSource | undefined>;

MapView.addRasterTiles

addRasterTiles(template: string, options?: RasterTileOptions): number;

MapView.removeRasterTiles

removeRasterTiles(id: number): boolean;

MapView.setRasterTilesVisible

setRasterTilesVisible(id: number, visible: boolean): boolean;

MapView.setRasterTilesOpacity

setRasterTilesOpacity(id: number, opacity: number): void;

MapView.getStyle

getStyle(): Promise<import("./styles.js").StyleSpecification>;

MapView.setStyle

setStyle(style: string | null | import("./styles.js").StyleSpecification, options?: StyleOptions): this;

MapView.setStyleBasemap

setStyleBasemap(url: string): void;

MapView.clearStyleBasemap

clearStyleBasemap(): void;

MapView.setProjection

setProjection(projection: Projection | ProjectionSpecification): this;

MapView.projection

get projection(): Projection;

MapView.setGlobeView

setGlobeView(center: [number, number], zoom?: number): void;

MapView.setModel

setModel(data: Uint8Array, placement: ModelPlacement): Promise<void>;

MapView.setModelPlacement

setModelPlacement(placement: ModelPlacement): Promise<void>;

MapView.clearModel

clearModel(): Promise<void>;

MapView.getModelState

getModelState(): Promise<ModelState | null>;

MapView.basemapMessage

get basemapMessage(): string;

MapView.basemapStatus

get basemapStatus(): BasemapStatus;

MapView.removeLayer

removeLayer(id: string): this;

MapView.removeLayer

removeLayer(id: number): boolean;

MapView.setLayerVisible

setLayerVisible(id: number, visible: boolean): boolean;

MapView.setLayerStyle

setLayerStyle(id: number, style: LayerStyle): void;

MapView.setLayerOpacity

setLayerOpacity(id: number, opacity: number): void;

MapView.moveLayer

moveLayer(id: string, beforeId?: string): this;

MapView.moveLayer

moveLayer(id: number, index: number): boolean;

MapView.renameLayer

renameLayer(id: number, name: string): boolean;

MapView.focusLayer

focusLayer(id: number): void;

MapView.selectFeature

selectFeature(id: number, index: number): Promise<PickResult | null>;

MapView.focusFeature

focusFeature(id: number, index: number): void;

MapView.setView

setView(center: [number, number], zoom: number): void;

MapView.getAttributions

getAttributions(): Promise<AttributionSnapshot>;

MapView.getCenter

getCenter(): Promise<{
        lng: number;
        lat: number;
    }>;

MapView.getZoom

getZoom(): Promise<number>;

MapView.getBearing

getBearing(): Promise<number>;

MapView.getPitch

getPitch(): Promise<number>;

MapView.getRoll

getRoll(): Promise<number>;

MapView.getPadding

getPadding(): Promise<CameraPadding>;

MapView.getBounds

getBounds(): Promise<[[number, number], [number, number]]>;

MapView.getLight

getLight(): Promise<ResolvedLightSpecification | null>;

MapView.setLight

setLight(light: LightSpecification, options?: LightSetterOptions): this;

MapView.getProjection

getProjection(): Promise<ProjectionSpecification>;

MapView.project

project(position: LngLatLike): Promise<{
        x: number;
        y: number;
    }>;

MapView.unproject

unproject(point: PointLike): Promise<{
        lng: number;
        lat: number;
    }>;

MapView.cameraForBounds

cameraForBounds(bounds: LngLatBoundsLike, options?: CameraFitOptions): Promise<PlanarCameraPose>;

MapView.getMinZoom

getMinZoom(): Promise<number>;

MapView.getMaxZoom

getMaxZoom(): Promise<number>;

MapView.scaleAt

scaleAt(options?: ScaleAtOptions): Promise<ScaleAtResult>;

MapView.viewModeState

viewModeState(): Promise<Readonly<{
        mode: '2d' | '3d';
        projection: 'mercator' | 'geographic' | 'globe';
        pitch: number;
        terrain: boolean;
        default3dPitch: 45;
        maximumPitch: 65;
        switchMethod: 'setPitch';
        canSwitchTo3d: boolean;
        canSwitchTo2d: boolean;
        restorePolicy: 'explicit-target-pitch';
    }>>;

MapView.cameraState

cameraState(): Promise<MapCameraState>;

MapView.easeTo

easeTo(options: EaseToOptions): this;

MapView.flyTo

flyTo(options: FlyToOptions): this;

MapView.stop

stop(): this;

MapView.isEasing

isEasing(): Promise<boolean>;

MapView.isMoving

isMoving(): Promise<boolean>;

MapView.isZooming

isZooming(): Promise<boolean>;

MapView.isRotating

isRotating(): Promise<boolean>;

MapView.animationState

animationState(): Promise<CameraAnimationState>;

MapView.setReducedMotion

setReducedMotion(value: boolean): this;

MapView.jumpTo

jumpTo(options: CameraOptions): this;

MapView.fitBounds

fitBounds(bounds: LngLatBoundsLike, options?: CameraFitOptions): this;

MapView.setCenter

setCenter(center: LngLatLike): this;

MapView.setZoom

setZoom(zoom: number): this;

MapView.setPitch

setPitch(pitch: number): this;

MapView.setPadding

setPadding(padding: number | Partial<CameraPadding>): this;

MapView.setRoll

setRoll(roll: number): this;

MapView.zoomTo

zoomTo(zoom: number, options?: ImmediateNavigationOptions): this;

MapView.rotateTo

rotateTo(bearing: number, options?: ImmediateNavigationOptions): this;

MapView.panTo

panTo(center: LngLatLike, options?: ImmediatePanOptions): this;

MapView.panBy

panBy(offset: PointLike, options?: ImmediatePanByOptions): this;

MapView.resetNorth

resetNorth(options?: ImmediateNavigationOptions): this;

MapView.resetNorthPitch

resetNorthPitch(options?: ImmediateNavigationOptions): this;

MapView.getView

getView(): Promise<MapViewTarget>;

MapView.setApiToken

setApiToken(token: MapViewOptions["apiToken"]): void;

MapView.layers

layers(): LayerInfo[];

MapView.setVisible

setVisible(layer: Pick<LayerInfo, "kind" | "id">, visible: boolean): boolean;

MapView.zoomIn

zoomIn(options?: ImmediateNavigationOptions): this;

MapView.zoomOut

zoomOut(options?: ImmediateNavigationOptions): this;

MapView.bearing

get bearing(): number;

MapView.viewState

viewState(): MapViewState;

MapView.fit

fit(): void;

MapView.setBearing

setBearing(degrees: number): this;

MapView.pan

pan(dx: number, dy: number): void;

MapView.zoomAt

zoomAt(factor: number, x: number, y: number): void;

MapView.pick

pick(x: number, y: number): Promise<PickResult | null>;

MapView.screenToLngLat

screenToLngLat(x: number, y: number): [number, number];

MapView.clearSelection

clearSelection(): void;

MapView.onCameraMove

onCameraMove(handler: (event: MapMoveEvent) => void): () => void;

MapView.onCameraLifecycle

onCameraLifecycle(handler: (type: CameraEventType | 'error', event: MapCameraEvent) => void): () => void;

MapView.onStyleLayersChange

onStyleLayersChange(handler: (event: StyleLayersChangeEvent) => void): () => void;

MapView.onSourceLifecycle

onSourceLifecycle(handler: (type: SourceLifecycleType, event: SourceLifecycleEvent) => void): () => void;

MapView.onGesturesChange

onGesturesChange(handler: (event: GestureChangeEvent) => void): () => void;

MapView.onAttributionsChange

onAttributionsChange(handler: (event: AttributionChangeEvent) => void): () => void;

MapView.onSourcesChange

onSourcesChange(handler: (event: SourceChangeEvent) => void): () => void;

MapView.listens

listens(type: string): boolean;

MapView.on

on<K extends keyof MapViewEventMap>(type: K, handler: (event: MapViewEventMap[K]) => void): MapEventSubscription;

MapView.on

on(type: PointerEventType, layers: MapLayerSelector, handler: (event: MapPointerEvent) => void): MapEventSubscription;

MapView.on

on(type: string, handler: (event: EventedEvent) => unknown): MapEventSubscription;

MapView.off

off<K extends keyof MapViewEventMap>(type: K, handler: (event: MapViewEventMap[K]) => void): this;

MapView.off

off(type: PointerEventType, layers: MapLayerSelector, handler: (event: MapPointerEvent) => void): this;

MapView.off

off(type: string, handler: (event: EventedEvent) => unknown): this;

MapView.once

once<K extends keyof MapViewEventMap>(type: K): Promise<MapViewEventMap[K]>;

MapView.once

once<K extends keyof MapViewEventMap>(type: K, handler: (event: MapViewEventMap[K]) => void): this;

MapView.once

once(type: PointerEventType, layers: MapLayerSelector): Promise<MapPointerEvent>;

MapView.once

once(type: PointerEventType, layers: MapLayerSelector, handler: (event: MapPointerEvent) => void): this;

MapView.once

once(type: string): Promise<EventedEvent>;

MapView.once

once(type: string, handler: (event: EventedEvent) => unknown): this;

MapView.fire

fire(event: {
        readonly type: string;
        readonly [key: string]: unknown;
    }): this;

MapView.fire

fire(type: string, data?: Record<string, unknown>): this;

MapView.setEventedParent

setEventedParent(parent?: EventedParent | null, data?: EventedParentData): this;

MapView.onPointerEvents

onPointerEvents(handler: (type: PointerEventType, event: MapPointerEvent) => void): () => void;

MapView.dispatchPointerEvent

dispatchPointerEvent(input: PointerInput): Promise<MapPointerEvent>;

MapView.lifecycleState

lifecycleState(): Promise<LifecycleState>;

MapView.loaded

loaded(): Promise<boolean>;

MapView.flush

flush(options?: FlushOptions): Promise<MapCommitResult>;

MapView.requestRender

requestRender(): void;

MapView.appCall

appCall(method: string, args?: unknown[], transfer?: Transferable[]): void;

MapView.appRequest

appRequest<T = unknown>(method: string, args?: unknown[], transfer?: Transferable[]): Promise<T>;

MapView.destroy

destroy(): void;

MapView.create

static create(target: HTMLElement, options?: MapViewOptions): Promise<MapView>;

CommandReceipt

export interface CommandReceipt {
    submittedSequence: number;
    appliedSequence: number;
    stage: 'applied' | 'rendered';
    camera: CameraSnapshot;
    frameSequence?: number;
}

MapCommitResult

export interface MapCommitResult extends CommandReceipt {
    mapInstanceId: string;
}

FlushOptions

export interface FlushOptions {
    render?: boolean;
    since?: number;
}

CommandJournal.constructor

constructor(invoke: (method: string, args: unknown[]) => unknown, camera: () => CameraSnapshot, render: () => Promise<FrameReport>);

CommandJournal.call

call(method: string, args: unknown[]): unknown;

CommandJournal.confirmCall

confirmCall<T = void>(method: string, args: unknown[]): Promise<T>;

CommandJournal.flush

flush(options?: FlushOptions): Promise<CommandReceipt>;

commandError

export declare function commandError(code: string, message: string): Error & {
    code: string;
};

LngLatLike

export type LngLatLike = [number, number] | {
    lng: number;
    lat: number;
};

PointLike

export type PointLike = [number, number] | {
    x: number;
    y: number;
};

LngLatBoundsLike

export type LngLatBoundsLike = [number, number, number, number] | [LngLatLike, LngLatLike];

CameraPadding

export interface CameraPadding {
    top: number;
    right: number;
    bottom: number;
    left: number;
}

CameraOptions

export interface CameraOptions {
    center?: LngLatLike;
    zoom?: number;
    bearing?: number;
    pitch?: number;
    roll?: number;
    padding?: number | Partial<CameraPadding>;
}

CameraFitOptions

export interface CameraFitOptions {
    padding?: number | Partial<CameraPadding>;
    offset?: PointLike;
    bearing?: number;
    minZoom?: number;
    maxZoom?: number;
    animate?: boolean;
    duration?: number;
    linear?: boolean;
    easing?: (t: number) => number;
    essential?: boolean;
}

PlanarCameraPose

export interface PlanarCameraPose {
    center: [number, number];
    zoom: number;
    bearing: number;
    pitch: number;
    roll: 0;
    padding: CameraPadding;
}

PlanarCameraState

export interface PlanarCameraState {
    camera: PlanarCameraPose;
    projection: 'geographic' | 'mercator';
    viewport: {
        width: number;
        height: number;
        pixelRatio: number;
    };
}

ProjectionSpecification

export interface ProjectionSpecification {
    type: 'geographic' | 'mercator' | 'globe';
}

GlobeCameraPose

export interface GlobeCameraPose {
    center: [number, number];
    zoom: number;
    bearing: number;
    pitch: number;
    roll: number;
    padding: CameraPadding;
}

GlobeCameraState

export interface GlobeCameraState {
    camera: GlobeCameraPose;
    projection: 'globe';
    viewport: {
        width: number;
        height: number;
        pixelRatio: number;
    };
}

MapCameraState

export type MapCameraState = PlanarCameraState | GlobeCameraState;

ScaleAtOptions

export interface ScaleAtOptions {
    point?: PointLike;
    maxWidth?: number;
}

ScaleAtResult

export interface ScaleAtResult {
    point: {
        x: number;
        y: number;
    };
    position: {
        lng: number;
        lat: number;
    };
    projection: 'geographic' | 'mercator' | 'globe';
    metersPerPixel: number;
    distance: number;
    width: number;
    maxWidth: number;
    unit: 'm';
    pixelUnit: 'css';
    model: 'sphere-local';
    earthRadius: 6371008.8;
    approximate: true;
}

AnimationOptions

export interface AnimationOptions {
    duration?: number;
    animate?: boolean;
    linear?: boolean;
    easing?: (t: number) => number;
    essential?: boolean;
}

EaseToOptions

export interface EaseToOptions extends CameraOptions, AnimationOptions {
    around?: LngLatLike;
    offset?: PointLike;
    sqsShortestWorldCopy?: boolean;
}

FlyToOptions

export interface FlyToOptions extends CameraOptions, AnimationOptions {
    offset?: PointLike;
    curve?: number;
    speed?: number;
    screenSpeed?: number;
    minZoom?: number;
    maxDuration?: number;
    sqsShortestWorldCopy?: boolean;
}

CameraAnimationTag

export interface CameraAnimationTag {
    readonly id: string;
    readonly status: 'running' | 'completed' | 'cancelled' | 'failed';
    readonly reason: string | null;
}

CameraAnimationState

export interface CameraAnimationState {
    readonly active: boolean;
    readonly animation: CameraAnimationTag | null;
    readonly reducedMotion: boolean;
    readonly elapsed?: number;
    readonly duration?: number;
    readonly target?: PlanarCameraPose | GlobeCameraPose;
}

ImmediateNavigationOptions

export interface ImmediateNavigationOptions {
    around?: LngLatLike;
    offset?: PointLike;
    animate?: boolean;
    duration?: number;
    linear?: boolean;
    easing?: (t: number) => number;
    essential?: boolean;
}

ImmediatePanOptions

export interface ImmediatePanOptions {
    offset?: PointLike;
    animate?: boolean;
    duration?: number;
    linear?: boolean;
    easing?: (t: number) => number;
    essential?: boolean;
}

ImmediatePanByOptions

export interface ImmediatePanByOptions {
    animate?: boolean;
    duration?: number;
    linear?: boolean;
    easing?: (t: number) => number;
    essential?: boolean;
}

ResourceType

export declare enum ResourceType {
    Style = "Style",
    Source = "Source",
    Tile = "Tile",
    Glyphs = "Glyphs",
    SpriteJSON = "SpriteJSON",
    SpriteImage = "SpriteImage",
    Image = "Image",
    Unknown = "Unknown"
}

RequestParameters

export interface RequestParameters extends RequestInit {
    url?: string;
    type?: 'string' | 'json' | 'arrayBuffer' | 'image';
    collectResourceTiming?: boolean;
}

RequestTransform

export type RequestTransform = (url: string, resourceType: ResourceType) => RequestParameters | undefined;

AddProtocolResponseData

export type AddProtocolResponseData = ArrayBuffer | Uint8Array | string;

GetResourceResponse

export interface GetResourceResponse<T> {
    data: T;
}

AddProtocolAction

export type AddProtocolAction = (requestParameters: Readonly<RequestParameters & {
    url: string;
    resourceType: ResourceType;
    maxBytes: number;
}>, abortController: AbortController) => Promise<GetResourceResponse<AddProtocolResponseData>>;

addProtocol

export declare function addProtocol(customProtocol: string, loadFn: AddProtocolAction): void;

removeProtocol

export declare function removeProtocol(customProtocol: string): void;

ResourceFallback

export interface ResourceFallback {
    prefix: string;
    replacements: string[];
    resourceTypes?: ResourceType[];
    attemptTimeoutMs?: number;
    forwardQuery?: boolean;
}

ResourcePolicy

export interface ResourcePolicy {
    maxConcurrentRequests?: number;
    attemptTimeoutMs?: number;
    retries?: number;
    retryDelayMs?: number;
    cache?: RequestCache;
    fallbacks?: ResourceFallback[];
}

ResourceConfiguration

export interface ResourceConfiguration {
    resourceTimeoutMs?: number;
    resourcePolicy?: ResourcePolicy;
}

ResourceQuery

export interface ResourceQuery {
    url: string;
    resourceType: ResourceType;
    maxBytes: number;
    method?: string;
    forceNoStore?: boolean;
}

ResourcePlan

export interface ResourcePlan {
    readonly version: 1;
    readonly urls: readonly string[];
    readonly method: string;
    readonly resourceType: ResourceType;
    readonly maxBytes: number;
    readonly maxConcurrentRequests: number;
    readonly resourceTimeoutMs: number;
    readonly attemptTimeoutMs: number;
    readonly retries: number;
    readonly retryDelayMs: number;
    readonly cache?: RequestCache;
    readonly retryOn: Readonly<{
        network: boolean;
        attemptTimeout: boolean;
        httpStatuses: readonly number[];
        serverErrors: boolean;
    }>;
}

ResourcesAPI

export interface ResourcesAPI {
    createProtocolScope(): ResourceProtocolScope;
    configure(configuration: ResourceConfiguration): Promise<Readonly<Required<ResourceConfiguration>>>;
    getConfiguration(): Promise<Readonly<Required<ResourceConfiguration>>>;
    plan(query: ResourceQuery): Promise<ResourcePlan>;
}

ResourcePolicyChangeEvent

export interface ResourcePolicyChangeEvent {
    readonly type: 'sqs.resourceschange';
    readonly context: 'resourcePolicy';
    readonly resourceConfiguration: Readonly<Required<ResourceConfiguration>>;
}

StyleSpecification

export interface StyleSpecification {
    version: 8;
    state?: Record<string, {
        default: unknown;
    }>;
    sources: Record<string, unknown>;
    layers: readonly unknown[];
    name?: string;
    metadata?: Record<string, unknown>;
    glyphs?: string;
    sprite?: string | readonly {
        id: string;
        url: string;
    }[];
}

StyleOptions

export interface StyleOptions {
    diff?: boolean;
}

styleUrl

export declare function styleUrl(style: unknown, options?: unknown): string | null | StyleSpecification;

StyleLifecycleState

export interface StyleLifecycleState {
    generation: number;
    revision: number;
    loaded: boolean;
}

StyleDataEvent

export interface StyleDataEvent {
    type: 'styledata' | 'style.load';
    dataType: 'style';
    styleState: StyleLifecycleState;
}

immutableStyleEvent

export declare function immutableStyleEvent(value: StyleDataEvent): StyleDataEvent;

captureMaterialFadeDuration

export declare function captureMaterialFadeDuration(ms: unknown): number;

captureLabelFadeDuration

export declare function captureLabelFadeDuration(ms: unknown): number;

FeatureId

export type FeatureId = string | number;

Position

export type Position = [number, number] | [number, number, number];

GeoJSONGeometry

export type GeoJSONGeometry = {
    type: 'Point';
    coordinates: Position;
} | {
    type: 'MultiPoint' | 'LineString';
    coordinates: Position[];
} | {
    type: 'MultiLineString' | 'Polygon';
    coordinates: Position[][];
} | {
    type: 'MultiPolygon';
    coordinates: Position[][][];
} | {
    type: 'GeometryCollection';
    geometries: GeoJSONGeometry[];
};

GeoJSONFeature

export interface GeoJSONFeature {
    type: 'Feature';
    id?: FeatureId;
    properties: Record<string, unknown> | null;
    geometry: GeoJSONGeometry | null;
    [member: string]: unknown;
}

GeoJSONFeatureCollection

export interface GeoJSONFeatureCollection {
    type: 'FeatureCollection';
    features: GeoJSONFeature[];
    [member: string]: unknown;
}

GeoJSON

export type GeoJSON = GeoJSONGeometry | GeoJSONFeature | GeoJSONFeatureCollection;

ClusterPropertySpecification

export type ClusterPropertySpecification = ['+' | '-' | '*' | '/' | 'min' | 'max' | 'all' | 'any' | 'concat' | unknown[], unknown[] | number | boolean | string];

GetClusterOptions

export interface GetClusterOptions {
    cluster: boolean;
    clusterRadius: number;
    clusterMaxZoom: number;
}

SetClusterOptions

export interface SetClusterOptions {
    cluster?: boolean;
    clusterRadius?: number;
    clusterMaxZoom?: number;
}

LiveSourceOptions

export interface LiveSourceOptions {
    fields: Record<string, 'string' | 'number' | 'boolean'>;
    allowDelta?: boolean;
}

LivePoint

export interface LivePoint {
    id: string;
    coordinate: [number, number];
    properties: Record<string, string | number | boolean | null>;
}

LiveUpdate

export type LiveUpdate = {
    kind: 'snapshot';
    epoch: string;
    sequence: string;
    points: LivePoint[];
} | {
    kind: 'delta';
    epoch: string;
    baseSequence: string;
    sequence: string;
    upserts: LivePoint[];
    deletes: string[];
};

LiveSourceState

export interface LiveSourceState {
    initialized: boolean;
    epoch: string | null;
    sequence: string | null;
    protocolRevision: string;
    pointCount: number;
    allowDelta: boolean;
    fields: Record<string, 'string' | 'number' | 'boolean'>;
}

LiveUpdateResult

export interface LiveUpdateResult {
    applied: boolean;
    state: LiveSourceState;
    dataRevision: string;
}

LiveSourceSnapshot

export interface LiveSourceSnapshot {
    source: SourceIdentity;
    state: LiveSourceState;
    data: GeoJSONFeatureCollection;
}

LiveReceiverOptions

export interface LiveReceiverOptions {
    owner?: SceneIdentity;
    protocol?: 'gis-live-v1';
    transport: {
        type: 'http-poll';
        url: string;
        intervalMs?: number;
    } | {
        type: 'websocket';
        url: string;
        reconnectDelayMs?: number;
    };
}

LiveReceiverIdentity

export interface LiveReceiverIdentity extends SourceIdentity {
    receiverInstanceId: string;
}

LiveReceiverState

export interface LiveReceiverState {
    owner?: SceneIdentity;
    ownerState?: SceneStatus;
    source: SourceIdentity;
    receiverInstanceId: string;
    transport: 'http-poll' | 'websocket';
    connection?: 'connecting' | 'open' | 'retrying' | 'paused' | 'stopped';
    status: 'running' | 'paused' | 'stopped';
    loading: boolean;
    intervalMs: number;
    lastError: SourceLoadError | null;
    dataRevision: string;
}

LiveReceiver

export interface LiveReceiver extends Readonly<LiveReceiverIdentity> {
    getState(): Promise<LiveReceiverState>;
    pause(): Promise<void>;
    resume(): Promise<void>;
    stop(): Promise<void>;
}

LiveSourceAPI

export interface LiveSourceAPI {
    connectLive(options: LiveReceiverOptions): Promise<LiveReceiver>;
    getLiveReceiver(): Promise<LiveReceiver | undefined>;
    applyLiveUpdate(frame: LiveUpdate): Promise<LiveUpdateResult>;
    getLiveState(): Promise<LiveSourceState>;
    freezeLiveSnapshot(): Promise<LiveSourceSnapshot>;
}

GeoJSONSourceOptions

export interface GeoJSONSourceOptions {
    sqsLive?: LiveSourceOptions;
    type: 'geojson';
    lineMetrics?: boolean;
    data: GeoJSON | string;
    attribution?: string;
    promoteId?: string;
    generateId?: boolean;
    cluster?: boolean;
    clusterRadius?: number;
    clusterMaxZoom?: number;
    clusterMinPoints?: number;
    clusterProperties?: Record<string, ClusterPropertySpecification>;
}

GeoJSONFeatureDiff

export interface GeoJSONFeatureDiff {
    id: FeatureId;
    newGeometry?: GeoJSONGeometry | null;
    removeAllProperties?: boolean;
    removeProperties?: string[];
    addOrUpdateProperties?: {
        key: string;
        value: unknown;
    }[];
}

GeoJSONSourceDiff

export interface GeoJSONSourceDiff {
    removeAll?: boolean;
    remove?: FeatureId[];
    add?: GeoJSONFeature[];
    update?: GeoJSONFeatureDiff[];
}

SourceIdentity

export interface SourceIdentity {
    id: string;
    sourceInstanceId: string;
}

SourceInfo

export interface SourceInfo extends SourceIdentity {
    sqsLiveReceiver?: LiveReceiverState;
    sqsLive?: LiveSourceState;
    type: 'geojson' | 'image' | 'video' | 'canvas' | 'vector' | 'raster' | 'raster-dem';
    mediaState?: MediaState;
    tileMetadata?: TileSourceMetadata;
    tileState?: TileSourceState;
    dataRevision: string;
    stateRevision: string;
    loaded: boolean;
    loading: boolean;
    hasData: boolean;
    requestRevision: string;
    loadError: SourceLoadError | null;
    featureCount: number;
    bounds: [number, number, number, number] | null;
    attribution: string;
    promoteId: string | Record<string, string> | null;
    generateId: boolean;
    lineMetrics: boolean;
    cluster: boolean;
    supportsUpdateData: boolean;
    referenceCount: number;
}

GeoJSONSource

export interface GeoJSONSource extends Readonly<SourceIdentity> {
    readonly sqs: LiveSourceAPI;
    readonly type: 'geojson';
    readonly dataRevision: string;
    getData(): Promise<GeoJSON>;
    setData(data: GeoJSON | string): Promise<void>;
    updateData(diff: GeoJSONSourceDiff): Promise<void>;
    getClusterOptions(): Promise<GetClusterOptions>;
    setClusterOptions(options: SetClusterOptions): Promise<void>;
    getClusterChildren(clusterId: number): Promise<QueriedSourceFeature[]>;
    getClusterLeaves(clusterId: number, limit?: number, offset?: number): Promise<QueriedSourceFeature[]>;
    getClusterExpansionZoom(clusterId: number): Promise<number>;
}

SourceChangeEvent

export interface SourceChangeEvent {
    readonly sourceCount: number;
}

QuerySourceFeatureOptions

export interface QuerySourceFeatureOptions {
    filter?: unknown[];
    validate?: true;
    sourceLayer?: string;
    sqs?: {
        offset?: number;
        limit?: number;
        sourceInstanceId?: string;
        dataRevision?: string;
    };
}

QueriedSourceFeature

export interface QueriedSourceFeature extends GeoJSONFeature {
    sourceLayer?: string;
    source: string;
    sqs: {
        sourceInstanceId: string;
        dataRevision: string;
        featureIndex: number;
    };
}

FeatureStateTarget

export interface FeatureStateTarget {
    source: string;
    id: FeatureId;
    sourceLayer?: string;
    sqs?: {
        sourceInstanceId?: string;
        dataRevision?: string;
    };
    [member: string]: unknown;
}

FeatureState

export type FeatureState = Record<string, unknown>;

FeatureStateRemovalTarget

export type FeatureStateRemovalTarget = Omit<FeatureStateTarget, "id"> & {
    source: string;
    id?: FeatureId;
};

SourceLoadError

export interface SourceLoadError {
    readonly code: string;
    readonly message: string;
}

SourceLifecycleType

export type SourceLifecycleType = 'sourcedataloading' | 'sourcedata' | 'sourcedataabort' | 'error';

SourceLifecycleEvent

export interface SourceLifecycleEvent {
    readonly sqsLiveReceiver?: LiveReceiverState;
    readonly sqsLive?: LiveSourceState;
    readonly type: SourceLifecycleType;
    readonly sourceId: string;
    readonly sourceInstanceId: string;
    readonly dataType: 'source';
    readonly sourceDataType: 'content' | 'metadata';
    readonly isSourceLoaded: boolean;
    readonly loading: boolean;
    readonly hasData: boolean;
    readonly dataRevision: string;
    readonly requestRevision: string;
    readonly loadError: SourceLoadError | null;
    readonly error?: SourceLoadError;
}

immutableSourceEvent

export declare function immutableSourceEvent<T extends SourceNotice>(event: T): T;

immutableSourceInfo

export declare function immutableSourceInfo(info: SourceInfo): SourceInfo;

MediaCoordinates

export type MediaCoordinates = [[number, number], [number, number], [number, number], [number, number]];

MediaSourceOptions

export interface MediaSourceOptions {
    type: 'image' | 'video';
    coordinates: MediaCoordinates;
    attribution?: string;
    url?: string;
    urls?: string[];
}

ImageSourceUpdate

export interface ImageSourceUpdate {
    url: string;
    coordinates?: MediaCoordinates;
}

CanvasSourceOptions

export interface CanvasSourceOptions {
    type: 'canvas';
    canvas: string | HTMLCanvasElement;
    coordinates: MediaCoordinates;
    animate?: boolean;
    attribution?: string;
}

SourceOptions

export type SourceOptions = GeoJSONSourceOptions | MediaSourceOptions | CanvasSourceOptions | TileSourceOptions;

MediaState

export interface MediaState {
    kind: 'image' | 'video' | 'canvas';
    coordinates: MediaCoordinates;
    revision: number;
    frameSequence: number;
    paused: boolean;
    width: number;
    height: number;
    byteLength: number;
    duration?: number;
    currentTime?: number;
    canvas?: string;
}

MediaFrame

export interface MediaFrame {
    sequence: number;
    width: number;
    height: number;
    data: Uint8Array;
}

MediaFrameResult

export interface MediaFrameResult {
    applied: boolean;
    state: SourceInfo;
}

MediaSourceBase

export interface MediaSourceBase extends Readonly<SourceIdentity> {
    readonly dataRevision: string;
    updateImage(options: ImageSourceUpdate): Promise<void>;
    setCoordinates(coordinates: MediaCoordinates): Promise<void>;
    play(): Promise<void>;
    pause(): Promise<void>;
    readonly sqs: {
        getState(): Promise<MediaState>;
        fail(reason: {
            code: string;
            message: string;
        }): Promise<void>;
        submitFrame(frame: MediaFrame): Promise<MediaFrameResult>;
    };
}

MediaSource

export interface MediaSource extends MediaSourceBase {
    readonly type: 'image' | 'video';
}

CanvasSource

export interface CanvasSource extends MediaSourceBase {
    readonly type: 'canvas';
    getCanvas(): HTMLCanvasElement;
}

MapSource

export type MapSource = GeoJSONSource | MediaSource | CanvasSource | TileSource;

TileSourceMetadata

export interface TileSourceMetadata {
    tiles: string[];
    minzoom: number;
    maxzoom: number;
    bounds: [number, number, number, number];
    scheme: 'xyz' | 'tms';
    attribution: string;
    tileSize: number | null;
    metadataLoaded: boolean;
    volatile: boolean;
    encoding?: 'mapbox' | 'terrarium' | 'custom';
}

TileSourceOptions

export interface TileSourceOptions {
    type: 'vector' | 'raster' | 'raster-dem';
    url?: string;
    tiles?: string[];
    minzoom?: number;
    maxzoom?: number;
    bounds?: [number, number, number, number];
    scheme?: 'xyz' | 'tms';
    attribution?: string;
    tileSize?: 256 | 512;
    encoding?: 'mvt' | 'mapbox' | 'terrarium' | 'custom';
    redFactor?: number;
    greenFactor?: number;
    blueFactor?: number;
    baseShift?: number;
    promoteId?: string | Record<string, string>;
    volatile?: boolean;
}

TileSource

export interface TileSource extends Readonly<SourceIdentity> {
    readonly type: 'vector' | 'raster' | 'raster-dem';
    readonly dataRevision: string;
    setTiles(tiles: string[]): Promise<void>;
    setUrl(url: string): Promise<void>;
    readonly sqs: {
        getTileMetadata(): Promise<TileSourceMetadata>;
    };
}

TileSourceState

export interface TileSourceState {
    visibleTiles: number;
    readyTiles: number;
    fallbackTiles: number;
    pendingTiles: number;
    cachedTiles: number;
    byteLength: number;
}

TerrainSpecification

export interface TerrainSpecification {
    source: string;
    exaggeration?: number;
}

TerrainEvent

export interface TerrainEvent {
    readonly type: 'terrain';
    readonly terrain: Readonly<TerrainSpecification> | null;
}

SourceNotice

export type SourceNotice = SourceLifecycleEvent | TerrainEvent;

EditVertex

export interface EditVertex {
    partIndex: number;
    vertexIndex: number;
    coordinate: [number, number];
    closed: boolean;
}

EditState

export interface EditState {
    layerId: number | null;
    canUndo: boolean;
    canRedo: boolean;
    undoCount: number;
    redoCount: number;
    undoLabel: string | null;
    redoLabel: string | null;
}

EditVertices

export interface EditVertices {
    vertices: EditVertex[];
    totalCount: number;
    truncated: boolean;
}

EditCommand

export type EditCommand = {
    method: 'begin';
    layerId: number;
} | {
    method: 'apply' | 'discard' | 'state' | 'undo' | 'redo' | 'getData';
} | {
    method: 'draw';
    geometry: GeoJSONGeometry;
    properties?: Record<string, unknown>;
} | {
    method: 'append';
    features: GeoJSONFeature[];
} | {
    method: 'replace';
    features: GeoJSONFeature[];
    label: string;
} | {
    method: 'vertices';
    feature: number;
    limit?: number;
} | {
    method: 'hitVertex' | 'hitSegment';
    feature: number;
    point: [number, number];
    radius: number;
} | {
    method: 'featuresInBox';
    bounds: [number, number, number, number];
} | {
    method: 'verticesInBox';
    feature: number;
    bounds: [number, number, number, number];
} | {
    method: 'select' | 'deleteFeatures';
    features: number[];
} | {
    method: 'moveVertex';
    feature: number;
    vertex: EditVertex;
    coordinate: [number, number];
    topology?: boolean;
} | {
    method: 'moveVertices';
    feature: number;
    vertices: EditVertex[];
    from: [number, number];
    to: [number, number];
} | {
    method: 'insertVertex';
    feature: number;
    vertex: EditVertex;
    coordinate: [number, number];
} | {
    method: 'deleteVertices';
    feature: number;
    vertices: EditVertex[];
    topology?: boolean;
} | {
    method: 'translate';
    features: number[];
    from: [number, number];
    to: [number, number];
} | {
    method: 'setAttribute';
    feature: number;
    field: string;
    value: string;
} | {
    method: 'snap';
    coordinate: [number, number];
    radius: number;
    vertex?: boolean;
    segment?: boolean;
    gridMeters?: number;
} | {
    method: 'trace';
    from: [number, number];
    to: [number, number];
    radius: number;
};

EditResult

export type EditResult = null | EditState | EditVertices | EditVertex | EditVertex[] | number[] | [number, number] | [number, number][] | GeoJSONFeatureCollection;

EditingAPI

export interface EditingAPI {
    execute(command: EditCommand): Promise<EditResult>;
    begin(layerId: number): Promise<null>;
    apply(): Promise<null>;
    discard(): Promise<null>;
    state(): Promise<EditState>;
    undo(): Promise<null>;
    redo(): Promise<null>;
    getData(): Promise<GeoJSONFeatureCollection>;
    draw(geometry: GeoJSONGeometry, properties?: Record<string, unknown>): Promise<null>;
    append(features: GeoJSONFeature[]): Promise<null>;
    replace(features: GeoJSONFeature[], label: string): Promise<null>;
    vertices(feature: number, limit?: number): Promise<EditVertices>;
    hitVertex(feature: number, point: [number, number], radius: number): Promise<EditVertex | null>;
    hitSegment(feature: number, point: [number, number], radius: number): Promise<EditVertex | null>;
    featuresInBox(bounds: [number, number, number, number]): Promise<number[]>;
    verticesInBox(feature: number, bounds: [number, number, number, number]): Promise<EditVertex[]>;
    select(features: number[]): Promise<null>;
    moveVertex(feature: number, vertex: EditVertex, coordinate: [number, number], topology?: boolean): Promise<null>;
    moveVertices(feature: number, vertices: EditVertex[], from: [number, number], to: [number, number]): Promise<null>;
    insertVertex(feature: number, vertex: EditVertex, coordinate: [number, number]): Promise<null>;
    deleteVertices(feature: number, vertices: EditVertex[], topology?: boolean): Promise<null>;
    deleteFeatures(features: number[]): Promise<null>;
    translate(features: number[], from: [number, number], to: [number, number]): Promise<null>;
    setAttribute(feature: number, field: string, value: string): Promise<null>;
    snap(coordinate: [number, number], radius: number, options?: {
        vertex?: boolean;
        segment?: boolean;
        gridMeters?: number;
    }): Promise<[number, number] | null>;
    trace(from: [number, number], to: [number, number], radius: number): Promise<[number, number][] | null>;
}

SceneIdentity

export interface SceneIdentity {
    readonly id: string;
    readonly sceneInstanceId: string;
}

SceneStatus

export type SceneStatus = 'draft' | 'running' | 'paused' | 'stopped';

SceneReceiver

export interface SceneReceiver {
    readonly source: SourceIdentity;
    readonly receiverInstanceId: string;
}

SceneClockSnapshot

export interface SceneClockSnapshot extends SceneIdentity {
    readonly state: SceneStatus;
    readonly elapsedMs: number;
}

SceneSnapshot

export interface SceneSnapshot extends SceneIdentity {
    readonly name: string;
    readonly state: SceneStatus;
    readonly revision: string;
    readonly resourceCount: number;
    readonly receivers: readonly SceneReceiver[];
    readonly sources: readonly SourceIdentity[];
    readonly playbacks: readonly PlaybackIdentity[];
}

Scene

export interface Scene extends SceneIdentity {
    getState(): Promise<SceneSnapshot>;
    getClock(): Promise<SceneClockSnapshot>;
    start(): Promise<void>;
    pause(): Promise<void>;
    resume(): Promise<void>;
    stop(): Promise<void>;
    attachSource(source: SourceIdentity): Promise<void>;
    detachSource(source: SourceIdentity): Promise<void>;
}

ScenesAPI

export interface ScenesAPI {
    create(options: {
        id: string;
        name?: string;
    }): Promise<Scene>;
    get(id: string): Promise<Scene | undefined>;
    list(): Promise<readonly SceneSnapshot[]>;
    remove(scene: SceneIdentity): Promise<void>;
}

SceneChangeEvent

export interface SceneChangeEvent {
    readonly type: 'sqs.scenechange';
    readonly reason: string;
    readonly scene: SceneSnapshot;
}

immutableScene

export declare function immutableScene(value: SceneSnapshot): SceneSnapshot;

immutableSceneEvent

export declare function immutableSceneEvent(value: SceneChangeEvent): SceneChangeEvent;

bindScene

export declare function bindScene(handle: Scene, identity: SceneIdentity): Scene;

sceneIdentity

export declare function sceneIdentity(value: SceneIdentity): SceneIdentity;

PlaybackIdentity

export interface PlaybackIdentity {
    readonly id: string;
    readonly playbackInstanceId: string;
}

PlaybackState

export type PlaybackState = 'ready' | 'playing' | 'paused' | 'stopped' | 'completed' | 'failed';

PlaybackSnapshotBase

export interface PlaybackSnapshotBase extends PlaybackIdentity {
    readonly owner: SceneIdentity;
    readonly ownerState: SceneStatus;
    readonly source: SourceIdentity;
    readonly sourceRevision: string;
    readonly state: PlaybackState;
    readonly epoch: string;
    readonly elapsedMs: number;
    readonly positionMs: number;
    readonly durationMs: number;
    readonly loop: boolean;
    readonly delayRemainingMs: number;
    readonly error: {
        readonly code: string;
        readonly message: string;
    } | null;
}

RoutePlaybackSnapshot

export interface RoutePlaybackSnapshot extends PlaybackSnapshotBase {
    readonly kind: 'route';
    readonly target: SourceIdentity;
    readonly targetRevision: string;
    readonly position: readonly [number, number];
    readonly headingRadians: number;
}

LineFrameSnapshot

export interface LineFrameSnapshot {
    readonly phase: number;
    readonly reveal: number;
    readonly opacity: number;
    readonly widthScale: number;
    readonly color: readonly [number, number, number, number];
}

LinePlaybackSnapshot

export interface LinePlaybackSnapshot extends PlaybackSnapshotBase {
    readonly kind: 'line';
    readonly layer: LayerIdentity;
    readonly sourceStateRevision: string;
    readonly frame: LineFrameSnapshot;
    readonly visibleEffect: boolean;
    readonly pattern?: {
        readonly id: string;
        readonly imageInstanceId: string;
        readonly revision: string;
    };
}

PlaybackSnapshot

export type PlaybackSnapshot = RoutePlaybackSnapshot | LinePlaybackSnapshot;

RoutePlaybackOptions

export interface RoutePlaybackOptions {
    id: string;
    source: SourceIdentity;
    target: SourceIdentity;
    duration?: number;
    offsets?: readonly number[];
    loop?: boolean;
    delay?: number;
}

LineUnit

export type LineUnit = 'progress' | 'pixels';

LineEffect

export type LineEffect = {
    type: 'flow';
    id?: string;
    unit?: LineUnit;
    spacing?: number;
    trailLength?: number;
    fade?: 'linear' | 'none';
    phase?: number;
} | {
    type: 'dash';
    id?: string;
    unit?: LineUnit;
    on: number;
    gap: number;
} | {
    type: 'reveal';
    id?: string;
    start?: number;
    end?: number;
} | {
    type: 'arrows';
    id?: string;
    unit?: LineUnit;
    spacing?: number;
    length?: number;
} | {
    type: 'glow';
    id?: string;
    radius?: number;
    intensity?: number;
} | {
    type: 'pattern';
    id?: string;
    image: string;
    unit?: LineUnit;
    spacing?: number;
};

LineKeyframe

export interface LineKeyframe<T> {
    offset: number;
    value: T;
}

LineTracks

export interface LineTracks {
    color?: readonly LineKeyframe<string>[];
    opacity?: readonly LineKeyframe<number>[];
    widthScale?: readonly LineKeyframe<number>[];
}

LineTiming

export interface LineTiming {
    duration: number;
    delay?: number;
    loop?: boolean;
    direction?: 'forward' | 'reverse' | 'alternate';
    easing?: 'linear' | 'ease-in-out';
    fill?: 'forwards' | 'none';
}

LinePlaybackOptions

export interface LinePlaybackOptions {
    id: string;
    layer: string | LayerIdentity;
    timing: LineTiming;
    effects: readonly LineEffect[];
    tracks?: LineTracks;
    stagger?: boolean;
    cap?: 'butt' | 'round';
    phaseField?: string;
    speedField?: string;
}

Playback

export interface Playback<T extends PlaybackSnapshot = PlaybackSnapshot> extends PlaybackIdentity {
    getState(): Promise<T>;
    play(): Promise<void>;
    pause(): Promise<void>;
    stop(): Promise<void>;
    seek(timeMs: number): Promise<void>;
    finished(): Promise<T>;
}

PlaybacksAPI

export interface PlaybacksAPI {
    get(id: string): Promise<Playback | undefined>;
    list(): Promise<readonly PlaybackSnapshot[]>;
    remove(playback: PlaybackIdentity): Promise<void>;
}

AnimationsAPI

export interface AnimationsAPI {
    route(options: RoutePlaybackOptions, owner: {
        owner: SceneIdentity;
    }): Promise<Playback<RoutePlaybackSnapshot>>;
    line(options: LinePlaybackOptions, owner: {
        owner: SceneIdentity;
    }): Promise<Playback<LinePlaybackSnapshot>>;
}

PlaybackChangeEvent

export interface PlaybackChangeEvent {
    readonly type: 'sqs.playbackchange';
    readonly reason: string;
    readonly playback: PlaybackSnapshot;
}

GeoJSONLayerSpecification

export interface GeoJSONLayerSpecification {
    id: string;
    type: 'circle' | 'line' | 'fill' | 'fill-extrusion' | 'hillshade' | 'color-relief' | 'raster' | 'heatmap' | 'background' | 'symbol';
    'source-layer'?: string;
    source?: string | SourceOptions;
    minzoom?: number;
    maxzoom?: number;
    paint?: Record<string, unknown>;
    layout?: {
        visibility?: 'visible' | 'none';
        'icon-image'?: string | unknown[];
        'icon-size'?: number | unknown[];
        'icon-rotate'?: number | unknown[];
        'icon-offset'?: [number, number] | unknown[];
        'icon-anchor'?: 'center' | 'top' | 'bottom' | 'left' | 'right' | 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right' | unknown[];
        'symbol-placement'?: 'point';
        'icon-allow-overlap'?: boolean | unknown[];
        'icon-ignore-placement'?: boolean | unknown[];
        'icon-optional'?: boolean | unknown[];
        'text-optional'?: boolean | unknown[];
        'icon-padding'?: number | unknown[];
        'symbol-sort-key'?: number | unknown[];
        'symbol-z-order'?: 'auto' | 'source' | 'viewport-y';
        'text-field'?: string | unknown[];
        'text-size'?: number | unknown[];
        'text-max-width'?: number | unknown[];
        'text-line-height'?: number | unknown[];
        'text-letter-spacing'?: number | unknown[];
        'text-justify'?: 'auto' | 'left' | 'center' | 'right' | unknown[];
        'text-transform'?: 'none' | 'uppercase' | 'lowercase' | unknown[];
        'text-font'?: readonly string[];
        'text-anchor'?: 'center' | 'top' | 'bottom' | 'left' | 'right' | 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right' | unknown[];
        'text-offset'?: [number, number] | unknown[];
        'text-rotate'?: number | unknown[];
        'text-padding'?: number | unknown[];
        'text-allow-overlap'?: boolean | unknown[];
        'text-ignore-placement'?: boolean;
    };
    filter?: unknown[];
    metadata?: Record<string, unknown>;
}

LayerIdentity

export interface LayerIdentity {
    readonly id: string;
    readonly layerInstanceId: string;
}

GeoJSONLayerInfo

export interface GeoJSONLayerInfo extends LayerIdentity {
    readonly id: string;
    readonly name: string;
    readonly layerInstanceId: string;
    readonly source: Readonly<SourceIdentity> | null;
    readonly sourceRevision: string;
    readonly cacheRevision: string;
    readonly type: 'circle' | 'line' | 'fill' | 'fill-extrusion' | 'hillshade' | 'color-relief' | 'raster' | 'heatmap' | 'background' | 'symbol';
    readonly specification: GeoJSONLayerSpecification;
    readonly visible: boolean;
    readonly featureCount: number;
    readonly warningCount: number;
}

StyleLayersChangeEvent

export interface StyleLayersChangeEvent {
    readonly layerCount: number;
    readonly method: string;
    readonly id: string;
}

QueryPixel

export type QueryPixel = [number, number] | {
    x: number;
    y: number;
};

QueryRenderedFeatureOptions

export interface QueryRenderedFeatureOptions {
    layers?: string[];
    filter?: unknown[];
    validate?: true;
}

QueriedRenderedFeature

export interface QueriedRenderedFeature extends QueriedSourceFeature {
    state: Record<string, unknown>;
    layer: GeoJSONLayerSpecification;
    sqs: {
        sourceInstanceId: string;
        dataRevision: string;
        featureIndex: number;
        layerInstanceId: string;
        cacheRevision: string;
        stateRevision: string;
    };
}

MapImageData

export interface MapImageData {
    width: number;
    height: number;
    data: Uint8Array | Uint8ClampedArray | readonly number[];
}

StyleImageInterface

export interface StyleImageInterface extends MapImageData {
    onAdd?(map: import('./host.js').MapView, id: string): void;
    render?(): boolean | undefined;
    onRemove?(): void;
}

MapImageTextFit

export type MapImageTextFit = 'stretchOrShrink' | 'stretchOnly' | 'proportional';

MapImageStretchMetadata

export interface MapImageStretchMetadata {
    readonly stretchX?: readonly (readonly [number, number])[];
    readonly stretchY?: readonly (readonly [number, number])[];
    readonly content?: readonly [number, number, number, number];
    readonly textFitWidth?: MapImageTextFit;
    readonly textFitHeight?: MapImageTextFit;
}

MapImageOptions

export interface MapImageOptions extends MapImageStretchMetadata {
    pixelRatio?: number;
    sdf?: boolean;
}

MapImageSnapshot

export interface MapImageSnapshot extends MapImageStretchMetadata {
    readonly data: {
        readonly width: number;
        readonly height: number;
        readonly data: Uint8Array;
    };
    readonly pixelRatio: number;
    readonly sdf: boolean;
}

MapImageInfo

export interface MapImageInfo extends MapImageStretchMetadata {
    readonly id: string;
    readonly source: 'runtime' | 'sprite';
    readonly imageInstanceId: string;
    readonly revision: string;
    readonly width: number;
    readonly height: number;
    readonly byteLength: number;
    readonly pixelRatio: number;
    readonly sdf: boolean;
}

ImagesChangeEvent

export interface ImagesChangeEvent {
    readonly method: 'addImage' | 'updateImage' | 'removeImage';
    readonly id: string;
    readonly imageCount: number;
    readonly runtimeByteLength: number;
}

captureImage

export declare function captureImage(image: MapImageData): {
    width: number;
    height: number;
    data: number[];
};

captureImageOptions

export declare function captureImageOptions(options: MapImageOptions): MapImageOptions;

imageInfo

export declare function imageInfo(value: MapImageInfo | null): MapImageInfo | undefined;

imageSnapshot

export declare function imageSnapshot(value: MapImageSnapshot | null): MapImageSnapshot | undefined;

immutableImageEvent

export declare function immutableImageEvent(event: ImagesChangeEvent): ImagesChangeEvent;

MapStyleImageMissingEvent

export interface MapStyleImageMissingEvent {
    readonly type: 'styleimagemissing';
    readonly id: string;
    readonly styleGeneration: string;
}

immutableMissingImageEvent

export declare function immutableMissingImageEvent(event: MapStyleImageMissingEvent): MapStyleImageMissingEvent;

MapImageLoadResult

export interface MapImageLoadResult {
    readonly data: {
        readonly width: number;
        readonly height: number;
        readonly data: Uint8Array;
    };
}

MapImageLoadOptions

export interface MapImageLoadOptions {
    signal?: AbortSignal;
}

imageLoadResult

export declare function imageLoadResult(value: {
    data: {
        width: number;
        height: number;
        data: ArrayLike<number>;
    };
}): MapImageLoadResult;

imageLoadUrl

export declare function imageLoadUrl(value: unknown): string;

PointerEventType

export type PointerEventType = typeof POINTER_EVENT_TYPES[number];

MapLayerSelector

export type MapLayerSelector = string | readonly string[];

PointerInput

export interface PointerInput {
    type: PointerEventType;
    point: {
        x: number;
        y: number;
    };
    layers?: readonly string[];
    pointerType?: 'mouse' | 'pen' | 'touch';
    button?: number;
    buttons?: number;
    altKey?: boolean;
    ctrlKey?: boolean;
    metaKey?: boolean;
    shiftKey?: boolean;
}

PointerSnapshot

export interface PointerSnapshot {
    readonly type: PointerEventType;
    readonly point: Readonly<{
        x: number;
        y: number;
    }>;
    readonly lngLat: Readonly<{
        lng: number;
        lat: number;
    }> | null;
    readonly features: readonly QueriedRenderedFeature[];
    readonly cameraState: MapCameraState;
    readonly input: Readonly<{
        pointerType: 'mouse' | 'pen' | 'touch';
        button: number;
        buttons: number;
        altKey: boolean;
        ctrlKey: boolean;
        metaKey: boolean;
        shiftKey: boolean;
    }>;
}

MapPointerEvent

export interface MapPointerEvent extends PointerSnapshot {
    readonly target: import('./host.js').MapView;
    readonly mapInstanceId: string;
    readonly sequence: number;
}

MapEventSubscription

export type MapEventSubscription = (() => void) & {
    readonly unsubscribe: () => void;
};

AttributionItem

export interface AttributionItem {
    readonly scope: 'style' | 'common' | 'host';
    readonly kind: 'style' | 'vector' | 'geojson' | 'raster' | 'terrain-rgb' | 'raster-dem';
    readonly sourceId: string | null;
    readonly sourceInstanceId: string | null;
    readonly layerIds: readonly string[];
    readonly text: string;
}

AttributionSnapshot

export interface AttributionSnapshot {
    readonly text: string;
    readonly items: readonly AttributionItem[];
}

AttributionChangeEvent

export interface AttributionChangeEvent {
    readonly type: 'sqs.attributionschange';
    readonly attributions: AttributionSnapshot;
}

AttributionErrorEvent

export interface AttributionErrorEvent {
    readonly type: 'error';
    readonly context: 'attributions';
    readonly error: Readonly<{
        code: string;
        message: string;
    }>;
    readonly message: string;
}

AttributionEvent

export type AttributionEvent = AttributionChangeEvent | AttributionErrorEvent;

GestureName

export type GestureName = 'dragPan' | 'scrollZoom' | 'doubleClickZoom' | 'keyboard' | 'touchZoomRotate' | 'touchPitch';

GesturePolicy

export interface GesturePolicy {
    readonly dragPan: boolean;
    readonly scrollZoom: boolean;
    readonly doubleClickZoom: boolean;
    readonly keyboard: boolean;
    readonly keyboardRotation: boolean;
    readonly touchZoomRotate: boolean;
    readonly touchPitch: boolean;
    readonly touchRotation: boolean;
}

GestureHandler

export interface GestureHandler {
    enable(): Promise<void>;
    disable(): Promise<void>;
    isEnabled(): Promise<boolean>;
    isActive(): Promise<boolean>;
}

GestureChangeEvent

export interface GestureChangeEvent {
    readonly type: 'sqs.gestureschange';
    readonly gestures: GesturePolicy;
}

ModelPlacement

export interface ModelPlacement {
    lngLat: readonly [number, number];
    elevationM: number;
    verticalReference: string;
    headingDeg?: number;
    scale?: number;
    visible?: boolean;
}

ModelState

export interface ModelState {
    readonly placement: Readonly<Required<ModelPlacement>>;
    readonly bounds: readonly [number, number, number, number, number, number];
    readonly meshCount: number;
    readonly triangleCount: number;
    readonly sourceBytes: number;
    readonly rendered: boolean;
}

Rust entry point

In the same core checkout, run cargo doc -p sqs-map-camera -p sqs-map -p sqs-map-capi -p sqs-map-script --no-deps and open target/doc/sqs_map/index.html. Native rendering and JavaScript boundaries are documented in the native API and scripting guides. No unpublished online Rustdoc URL is advertised. Native Rust display density documents logical/physical pixels and the complete example.