terra-draw
Version:
Frictionless map drawing across mapping provider
150 lines (149 loc) • 5.38 kB
TypeScript
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 {};