mobility-toolbox-js
Version:
Toolbox for JavaScript applications in the domains of mobility and logistics.
229 lines (228 loc) • 9.09 kB
TypeScript
import GeoJSON from 'ol/format/GeoJSON';
import { RealtimeAPI } from '../../api';
import type { FeatureCollection } from 'geojson';
import type { Coordinate } from 'ol/coordinate';
import type { WebSocketAPIMessageEventData } from '../../api/WebSocketAPI';
import type { AnyCanvas, LayerGetFeatureInfoOptions, RealtimeMode, RealtimeMot, RealtimeRenderState, RealtimeStyleFunction, RealtimeStyleOptions, RealtimeTenant, RealtimeTrainId, RealtimeTrajectory, ViewState } from '../../types';
import type { FilterFunction, SortFunction } from '../typedefs';
export interface RealtimeEngineOptions {
api?: RealtimeAPI;
apiKey?: string;
bbox?: (number | string)[];
bboxParameters?: Record<string, boolean | boolean[] | number | number[] | string | string[]>;
buffer?: number[];
canvas?: HTMLCanvasElement;
debug?: boolean;
filter?: FilterFunction;
generalizationLevelByZoom?: string[];
getGeneralizationLevelByZoom?: (zoom: number, generalizationLevelByZoom: string[]) => string;
getGraphByZoom?: (zoom: number, graphByZoom: string[]) => string | undefined;
getMotsByZoom?: (zoom: number, motsByZoom: RealtimeMot[][]) => RealtimeMot[];
getRefreshTimeInMs?: () => number;
getRenderTimeIntervalByZoom?: (zoom: number, renderTimeIntervalByZoom: number[]) => number;
getViewState?: () => ViewState;
graphByZoom?: string[];
hoverVehicleId?: RealtimeTrainId;
isUpdateBboxOnMoveEnd?: boolean;
live?: boolean;
minZoomInterpolation?: number;
mode?: RealtimeMode;
motsByZoom?: RealtimeMot[][];
onIdle?: (realtimeEngine: RealtimeEngine) => void;
onRender?: (renderState: RealtimeRenderState, viewState: ViewState) => void;
onStart?: (realtimeEngine: RealtimeEngine) => void;
onStop?: (realtimeEngine: RealtimeEngine) => void;
pingIntervalMs?: number;
pixelRatio?: number;
prefix?: string;
renderTimeIntervalByZoom?: number[];
selectedVehicleId?: RealtimeTrainId;
shouldRender?: () => boolean;
sort?: SortFunction;
speed?: number;
style?: RealtimeStyleFunction;
styleOptions?: Partial<RealtimeStyleOptions>;
tenant?: RealtimeTenant;
time?: Date;
url?: string;
useDebounce?: boolean;
useRequestAnimationFrame?: boolean;
useThrottle?: boolean;
}
/**
* Basic style options used by default in the RealtimeEngine.
*/
export declare const defaultStyleOptions: RealtimeStyleOptions;
/**
* This class is responsible for drawing trajectories from a realtime API in a canvas,
* depending on the map's view state and at a specific time.
*
* This class is totally agnostic from Maplibre or OpenLayers and must stay taht way.
*/
declare class RealtimeEngine {
_idleTimeout?: number;
_mode: RealtimeMode;
_speed: number;
_style: RealtimeStyleFunction;
_time: Date;
api: RealtimeAPI;
bboxParameters?: Record<string, boolean | boolean[] | number | number[] | string | string[]>;
canvas?: AnyCanvas;
debounceRenderTrajectories: (viewState: ViewState, noInterpolate?: boolean) => void;
debug: boolean;
filter?: FilterFunction;
format: GeoJSON;
generalizationLevel?: string;
generalizationLevelByZoom: string[];
getGeneralizationLevelByZoom: (zoom: number) => string;
getGraphByZoom: (zoom: number) => string | undefined;
getMotsByZoom: (zoom: number) => RealtimeMot[];
getRenderTimeIntervalByZoom: (zoom: number) => number;
graphByZoom: string[];
hoverVehicleId?: RealtimeTrainId;
isIdle: boolean;
isUpdateBboxOnMoveEnd: boolean;
live?: boolean;
minZoomInterpolation: number;
mots?: RealtimeMot[];
motsByZoom: RealtimeMot[][];
onIdle?: (realtimeLayer: RealtimeEngine) => void;
onRender?: (renderState: RealtimeRenderState, viewState: ViewState) => void;
onStart?: (realtimeLayer: RealtimeEngine) => void;
onStop?: (realtimeLayer: RealtimeEngine) => void;
pixelRatio?: number;
renderState?: RealtimeRenderState;
renderTimeIntervalByZoom: number[];
requestId?: number;
selectedVehicle: RealtimeTrajectory;
selectedVehicleId?: RealtimeTrainId;
sort?: SortFunction;
styleOptions: RealtimeStyleOptions;
tenant: RealtimeTenant;
throttleRenderTrajectories: (viewState: ViewState, noInterpolate?: boolean) => void;
trajectories?: Record<RealtimeTrainId, RealtimeTrajectory>;
updateTimeDelay?: number;
updateTimeInterval?: number;
useDebounce?: boolean;
useRequestAnimationFrame?: boolean;
useThrottle?: boolean;
get mode(): RealtimeMode;
set mode(newMode: RealtimeMode);
get speed(): number;
set speed(newSpeed: number);
get style(): RealtimeStyleFunction;
set style(newStyle: RealtimeStyleFunction);
get time(): Date;
set time(newTime: Date | number);
constructor(options: RealtimeEngineOptions);
/**
* Add a trajectory.
* @param {RealtimeTrajectory} trajectory The trajectory to add.
* @private
*/
addTrajectory(trajectory: RealtimeTrajectory): void;
attachToMap(): void;
detachFromMap(): void;
/**
* Get the duration before the next update depending on zoom level.
*
* @private
*/
getRefreshTimeInMs(): number;
/**
* Get vehicle.
* @param {function} filterFc A function use to filter results.
* @return {Array<Object>} Array of vehicle.
*/
getVehicles(filterFc: FilterFunction): RealtimeTrajectory[];
/**
* Request feature information for a given coordinate.
*
* @param {ol/coordinate~Coordinate} coordinate Coordinate.
* @param {Object} options Options See child classes to see which options are supported.
* @param {number} [options.resolution=1] The resolution of the map.
* @param {number} [options.nb=Infinity] The max number of vehicles to return.
* @return {Promise<FeatureInfo>} Promise with features, layer and coordinate.
*/
getVehiclesAtCoordinate(coordinate: Coordinate, options?: LayerGetFeatureInfoOptions): FeatureCollection;
getViewState: () => ViewState;
/**
* Callback on websocket's deleted_vehicles channel events.
* It removes the trajectory from the list.
*
* @private
* @override
*/
onDeleteTrajectoryMessage(data: WebSocketAPIMessageEventData<RealtimeTrainId>): void;
onDocumentVisibilityChange(): void;
/**
* Callback on websocket's trajectory channel events.
* It adds a trajectory to the list.
*
* @private
*/
onTrajectoryMessage(data: WebSocketAPIMessageEventData<RealtimeTrajectory>): void;
/**
* On zoomend we adjust the time interval of the update of vehicles positions.
*
* @private
*/
onZoomEnd(): void;
/**
* Remove all trajectories that are in the past.
*/
purgeOutOfDateTrajectories(): void;
/**
* Determine if the trajectory is useless and should be removed from the list or not.
* By default, this function exclude vehicles:
* - that have their trajectory outside the current extent and
* - that aren't in the MOT list.
*
* @param {RealtimeTrajectory} trajectory
* @return {boolean} if the trajectory must be displayed or not.
* @private
*/
purgeTrajectory(trajectory: RealtimeTrajectory): boolean;
removeTrajectory(trajectoryOrId: RealtimeTrainId | RealtimeTrajectory): void;
/**
* Render the trajectories requesting an animation frame and cancelling the previous one.
* This function must be overrided by children to provide the correct parameters.
*
* @param {boolean} noInterpolate If true trajectories are not interpolated but
* drawn at the last known coordinate. Use this for performance optimization
* during map navigation.
* @private
*/
renderTrajectories(noInterpolate?: boolean): void;
/**
* Launch renderTrajectories. it avoids duplicating code in renderTrajectories method.
*
* @param {object} viewState The view state of the map.
* @param {number[2]} viewState.center Center coordinate of the map in mercator coordinate.
* @param {number[4]} viewState.extent Extent of the map in mercator coordinates.
* @param {number[2]} viewState.size Size ([width, height]) of the canvas to render.
* @param {number} [viewState.rotation = 0] Rotation of the map to render.
* @param {number} viewState.resolution Resolution of the map to render.
* @param {boolean} noInterpolate If true trajectories are not interpolated but
* drawn at the last known coordinate. Use this for performance optimization
* during map navigation.
* @private
*/
renderTrajectoriesInternal(viewState: ViewState, noInterpolate?: boolean): boolean;
setBbox(): void;
shouldRender: () => boolean;
start(): void;
/**
* Start the clock.
* @private
*/
startUpdateTime(): void;
stop(): void;
/**
* Stop the clock.
* @private
*/
stopUpdateTime(): void;
updateIdleState(): void;
}
export default RealtimeEngine;