UNPKG

terra-draw

Version:

Frictionless map drawing across mapping provider

150 lines (149 loc) 5.38 kB
import { LineString, Polygon, Position } from "geojson"; import { StoreChangeHandler, GeoJSONStore, GeoJSONStoreFeatures, FeatureId } from "./store/store"; export type HexColor = `#${string}`; export type HexColorStyling = HexColor | ((feature: GeoJSONStoreFeatures) => HexColor); export type NumericStyling = number | ((feature: GeoJSONStoreFeatures) => number); export interface TerraDrawAdapterStyling { pointColor: HexColor; pointWidth: number; pointOutlineColor: HexColor; pointOutlineWidth: number; polygonFillColor: HexColor; polygonFillOpacity: number; polygonOutlineColor: HexColor; polygonOutlineWidth: number; lineStringWidth: number; lineStringColor: HexColor; zIndex: number; } export type CartesianPoint = { x: number; y: number; }; export interface TerraDrawMouseEvent { lng: number; lat: number; containerX: number; containerY: number; button: "neither" | "left" | "middle" | "right"; heldKeys: string[]; isContextMenu: boolean; } export interface TerraDrawKeyboardEvent { key: string; heldKeys: string[]; preventDefault: () => void; } export type Cursor = Parameters<SetCursor>[0]; export type SetCursor = (cursor: "unset" | "grab" | "grabbing" | "crosshair" | "pointer" | "wait" | "move") => void; export type Project = (lng: number, lat: number) => CartesianPoint; export type Unproject = (x: number, y: number) => { lat: number; lng: number; }; export type GetLngLatFromEvent = (event: PointerEvent | MouseEvent) => { lng: number; lat: number; } | null; export type Projection = "web-mercator" | "globe"; export type OnFinishContext = { mode: string; action: string; }; export type OnChangeContext = { origin: "api"; }; export type TerraDrawGeoJSONStore = GeoJSONStore<OnChangeContext | undefined, FeatureId>; export interface TerraDrawModeRegisterConfig { mode: string; store: TerraDrawGeoJSONStore; setDoubleClickToZoom: (enabled: boolean) => void; setCursor: SetCursor; onChange: StoreChangeHandler<OnChangeContext | undefined>; onSelect: (selectedId: string) => void; onDeselect: (deselectedId: string) => void; onFinish: (finishedId: string, context: OnFinishContext) => void; project: Project; unproject: Unproject; coordinatePrecision: number; } export declare enum UpdateTypes { Commit = "commit", Provisional = "provisional", Finish = "finish" } type ValidationContext = Pick<TerraDrawModeRegisterConfig, "project" | "unproject" | "coordinatePrecision"> & { updateType: UpdateTypes; }; export type Validation = (feature: GeoJSONStoreFeatures, context: ValidationContext) => { valid: boolean; reason?: string; }; export interface Snapping { toLine?: boolean; toCoordinate?: boolean; toCustom?: (event: TerraDrawMouseEvent, context: { currentId?: FeatureId; currentCoordinate?: number; getCurrentGeometrySnapshot: () => (Polygon | LineString) | null; project: Project; unproject: Unproject; }) => Position | undefined; } export type TerraDrawModeState = "unregistered" | "registered" | "started" | "drawing" | "selecting" | "stopped"; export interface TerraDrawCallbacks { getState: () => TerraDrawModeState; onKeyUp: (event: TerraDrawKeyboardEvent) => void; onKeyDown: (event: TerraDrawKeyboardEvent) => void; onClick: (event: TerraDrawMouseEvent) => void; onMouseMove: (event: TerraDrawMouseEvent) => void; onDragStart: (event: TerraDrawMouseEvent, setMapDraggability: (enabled: boolean) => void) => void; onDrag: (event: TerraDrawMouseEvent, setMapDraggability: (enabled: boolean) => void) => void; onDragEnd: (event: TerraDrawMouseEvent, setMapDraggability: (enabled: boolean) => void) => void; onClear: () => void; onReady?(): void; } export interface TerraDrawChanges { created: GeoJSONStoreFeatures[]; updated: GeoJSONStoreFeatures[]; unchanged: GeoJSONStoreFeatures[]; deletedIds: FeatureId[]; } export type TerraDrawStylingFunction = { [mode: string]: (feature: GeoJSONStoreFeatures) => TerraDrawAdapterStyling; }; export interface TerraDrawAdapter { project: Project; unproject: Unproject; setCursor: SetCursor; getLngLatFromEvent: GetLngLatFromEvent; setDoubleClickToZoom: (enabled: boolean) => void; getMapEventElement: () => HTMLElement; register(callbacks: TerraDrawCallbacks): void; unregister(): void; render(changes: TerraDrawChanges, styling: TerraDrawStylingFunction): void; clear(): void; getCoordinatePrecision(): number; } export declare const SELECT_PROPERTIES: { readonly SELECTED: "selected"; readonly MID_POINT: "midPoint"; readonly SELECTION_POINT_FEATURE_ID: "selectionPointFeatureId"; readonly SELECTION_POINT: "selectionPoint"; }; export declare const COMMON_PROPERTIES: { readonly EDITED: "edited"; readonly CLOSING_POINT: "closingPoint"; readonly SNAPPING_POINT: "snappingPoint"; readonly COORDINATE_POINT: "coordinatePoint"; readonly COORDINATE_POINT_FEATURE_ID: "coordinatePointFeatureId"; readonly COORDINATE_POINT_IDS: "coordinatePointIds"; }; export declare const Z_INDEX: { readonly LAYER_ONE: 10; readonly LAYER_TWO: 20; readonly LAYER_THREE: 30; readonly LAYER_FOUR: 40; readonly LAYER_FIVE: 50; }; export {};