mobility-toolbox-js 3.0.0-beta.1 → 3.0.0-beta.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (90) hide show
  1. package/api/HttpAPI.d.ts +20 -0
  2. package/api/HttpAPI.js +1 -11
  3. package/api/RealtimeAPI.d.ts +365 -0
  4. package/api/RealtimeAPI.js +102 -89
  5. package/api/RoutingAPI.d.ts +37 -0
  6. package/api/StopsAPI.d.ts +44 -0
  7. package/api/StopsAPI.js +15 -9
  8. package/api/WebSocketAPI.d.ts +153 -0
  9. package/api/index.d.ts +3 -0
  10. package/api/typedefs.d.ts +178 -0
  11. package/common/controls/StopFinderControlCommon.d.ts +53 -0
  12. package/common/index.d.ts +2 -0
  13. package/common/mixins/RealtimeLayerMixin.d.ts +273 -0
  14. package/common/styles/index.d.ts +4 -0
  15. package/common/styles/realtimeDefaultStyle.d.ts +36 -0
  16. package/common/styles/realtimeDelayStyle.d.ts +12 -0
  17. package/common/styles/realtimeHeadingStyle.d.ts +12 -0
  18. package/common/styles/realtimeSimpleStyle.d.ts +4 -0
  19. package/common/typedefs.d.ts +212 -0
  20. package/common/utils/compareDepartures.d.ts +10 -0
  21. package/common/utils/constants.d.ts +5 -0
  22. package/common/utils/createCanvas.d.ts +10 -0
  23. package/common/utils/createDefaultCopyrightElt.d.ts +5 -0
  24. package/common/utils/createDefaultStopFinderElt.d.ts +5 -0
  25. package/common/utils/createRealtimeFilters.d.ts +12 -0
  26. package/common/utils/debounceDeparturesMessages.d.ts +12 -0
  27. package/common/utils/debounceWebsocketMessages.d.ts +11 -0
  28. package/common/utils/getLayersAsFlatArray.d.ts +3 -0
  29. package/common/utils/getLayersAsFlatArray.js +5 -1
  30. package/common/utils/getMapGlCopyrights.d.ts +17 -0
  31. package/common/utils/getRealtimeModeSuffix.d.ts +9 -0
  32. package/common/utils/getUrlWithParams.d.ts +8 -0
  33. package/common/utils/getVehiclePosition.d.ts +16 -0
  34. package/common/utils/index.d.ts +16 -0
  35. package/common/utils/realtimeConfig.d.ts +64 -0
  36. package/common/utils/removeDuplicate.d.ts +9 -0
  37. package/common/utils/renderTrajectories.d.ts +16 -0
  38. package/common/utils/sortAndFilterDepartures.d.ts +15 -0
  39. package/common/utils/sortByDelay.d.ts +3 -0
  40. package/common/utils/timeUtils.d.ts +23 -0
  41. package/common/utils/toMercatorExtent.d.ts +5 -0
  42. package/iife.d.ts +2 -0
  43. package/index.d.ts +9 -0
  44. package/maplibre/controls/CopyrightControl.d.ts +35 -0
  45. package/maplibre/controls/index.d.ts +1 -0
  46. package/maplibre/index.d.ts +5 -0
  47. package/maplibre/layers/Layer.d.ts +28 -0
  48. package/maplibre/layers/RealtimeLayer.d.ts +160 -0
  49. package/maplibre/layers/RealtimeLayer.js +2 -2
  50. package/maplibre/layers/index.d.ts +2 -0
  51. package/maplibre/utils/getMercatorResolution.d.ts +7 -0
  52. package/maplibre/utils/getSourceCoordinates.d.ts +7 -0
  53. package/maplibre/utils/index.d.ts +2 -0
  54. package/mbt.js +1394 -1291
  55. package/mbt.js.map +4 -4
  56. package/mbt.min.js +42 -42
  57. package/mbt.min.js.map +4 -4
  58. package/ol/controls/CopyrightControl.d.ts +31 -0
  59. package/ol/controls/CopyrightControl.js +18 -8
  60. package/ol/controls/RoutingControl.d.ts +209 -0
  61. package/ol/controls/RoutingControl.js +3 -0
  62. package/ol/controls/StopFinderControl.d.ts +37 -0
  63. package/ol/controls/StopFinderControl.js +3 -0
  64. package/ol/controls/index.d.ts +3 -0
  65. package/ol/index.d.ts +6 -0
  66. package/ol/layers/MapGlLayer.d.ts +144 -0
  67. package/ol/layers/MapGlLayer.js +5 -3
  68. package/ol/layers/MaplibreLayer.d.ts +63 -0
  69. package/ol/layers/MaplibreStyleLayer.d.ts +235 -0
  70. package/ol/layers/MaplibreStyleLayer.js +24 -24
  71. package/ol/layers/RealtimeLayer.d.ts +285 -0
  72. package/ol/layers/RealtimeLayer.js +13 -7
  73. package/ol/layers/index.d.ts +3 -0
  74. package/ol/mixins/MobilityLayerMixin.d.ts +98 -0
  75. package/ol/mixins/MobilityLayerMixin.js +1 -4
  76. package/ol/mixins/PropertiesLayerMixin.d.ts +127 -0
  77. package/ol/mixins/PropertiesLayerMixin.js +6 -65
  78. package/ol/renderers/MaplibreLayerRenderer.d.ts +20 -0
  79. package/ol/renderers/MaplibreStyleLayerRenderer.d.ts +20 -0
  80. package/ol/renderers/RealtimeLayerRenderer.d.ts +22 -0
  81. package/ol/renderers/RealtimeLayerRenderer.js +9 -9
  82. package/ol/styles/fullTrajectoryDelayStyle.d.ts +6 -0
  83. package/ol/styles/fullTrajectoryStyle.d.ts +5 -0
  84. package/ol/styles/index.d.ts +3 -0
  85. package/ol/styles/routingStyle.d.ts +4 -0
  86. package/ol/utils/getFeatureInfoAtCoordinate.d.ts +8 -0
  87. package/ol/utils/getFeatureInfoAtCoordinate.js +2 -2
  88. package/ol/utils/index.d.ts +1 -0
  89. package/package.json +18 -19
  90. package/setupTests.d.ts +1 -0
@@ -0,0 +1,235 @@
1
+ import { Feature, Map } from 'ol';
2
+ import { Coordinate } from 'ol/coordinate';
3
+ import { ObjectEvent } from 'ol/Object';
4
+ import { Layer } from 'ol/layer';
5
+ import { Source } from 'ol/source';
6
+ import { LayerGetFeatureInfoResponse } from '../../types';
7
+ import { FilterFunction } from '../../common/typedefs';
8
+ import MaplibreLayer, { MaplibreLayerOptions } from './MaplibreLayer';
9
+ import MaplibreStyleLayerRenderer from '../renderers/MaplibreStyleLayerRenderer';
10
+ export type MaplibreStyleLayerOptions = MaplibreLayerOptions & {
11
+ beforeId?: string;
12
+ maplibreLayer?: MaplibreLayer;
13
+ layers?: maplibregl.AddLayerObject[];
14
+ layersFilter?: FilterFunction;
15
+ queryRenderedLayersFilter?: FilterFunction;
16
+ };
17
+ declare const MaplibreStyleLayer_base: {
18
+ new (...args: any[]): {
19
+ options?: import("../mixins/PropertiesLayerMixin").PropertiesLayerMixinOptions | undefined;
20
+ olListenersKeys: import("ol/events").EventsKey[];
21
+ children: Layer<Source, import("ol/renderer/Layer").default<any>>[];
22
+ get copyrights(): string;
23
+ set copyrights(newCopyrights: string | string[]);
24
+ disabled: boolean;
25
+ readonly group: string;
26
+ readonly hitTolerance: boolean;
27
+ readonly key: string;
28
+ readonly map: Map;
29
+ readonly name: string;
30
+ olLayer: Layer<Source, import("ol/renderer/Layer").default<any>>;
31
+ parent: Layer<Source, import("ol/renderer/Layer").default<any>>;
32
+ visible: boolean;
33
+ setMapInternal: ((map: Map) => void) & ((map: Map | null) => void);
34
+ onChildrenChange(oldValue: Layer<Source, import("ol/renderer/Layer").default<any>>[]): void;
35
+ attachToMap(map: Map): void;
36
+ detachFromMap(): void;
37
+ flat(): any[];
38
+ addEventListener: (type: string, listener: import("ol/events").Listener) => void;
39
+ removeEventListener: (type: string, listener: import("ol/events").Listener) => void;
40
+ on: import("ol/layer/Layer").LayerOnSignature<import("ol/events").EventsKey>;
41
+ render: (frameState: import("ol/Map").FrameState | null, target: HTMLElement) => HTMLElement | null;
42
+ once: import("ol/layer/Layer").LayerOnSignature<import("ol/events").EventsKey>;
43
+ un: import("ol/layer/Layer").LayerOnSignature<void>;
44
+ getSource: () => Source | null;
45
+ getRenderSource: () => Source | null;
46
+ getFeatures: (pixel: import("ol/pixel").Pixel) => Promise<import("ol/Feature").FeatureLike[]>;
47
+ getData: (pixel: import("ol/pixel").Pixel) => Float32Array | Uint8ClampedArray | Uint8Array | DataView | null;
48
+ isVisible: (view?: import("ol").View | import("ol/View").ViewStateLayerStateExtent | undefined) => boolean;
49
+ getAttributions: (view?: import("ol").View | import("ol/View").ViewStateLayerStateExtent | undefined) => string[];
50
+ unrender: () => void;
51
+ getDeclutter: () => string;
52
+ renderDeclutter: (frameState: import("ol/Map").FrameState, layerState: import("ol/layer/Layer").State) => void;
53
+ renderDeferred: (frameState: import("ol/Map").FrameState) => void;
54
+ getMapInternal: () => Map | null;
55
+ setMap: (map: Map | null) => void;
56
+ setSource: (source: Source | null) => void;
57
+ getRenderer: () => import("ol/renderer/Layer").default<any> | null;
58
+ hasRenderer: () => boolean;
59
+ getBackground: () => false | import("ol/layer/Base").BackgroundColor;
60
+ getClassName: () => string;
61
+ getLayerState: (managed?: boolean | undefined) => import("ol/layer/Layer").State;
62
+ getLayersArray: (array?: Layer<Source, import("ol/renderer/Layer").default<any>>[] | undefined) => Layer<Source, import("ol/renderer/Layer").default<any>>[];
63
+ getLayerStatesArray: (states?: import("ol/layer/Layer").State[] | undefined) => import("ol/layer/Layer").State[];
64
+ getExtent: () => import("ol/extent").Extent | undefined;
65
+ getMaxResolution: () => number;
66
+ getMinResolution: () => number;
67
+ getMinZoom: () => number;
68
+ getMaxZoom: () => number;
69
+ getOpacity: () => number;
70
+ getSourceState: () => import("ol/source/Source").State;
71
+ getVisible: () => boolean;
72
+ getZIndex: () => number | undefined;
73
+ setBackground: (background?: import("ol/layer/Base").BackgroundColor | undefined) => void;
74
+ setExtent: (extent: import("ol/extent").Extent | undefined) => void;
75
+ setMaxResolution: (maxResolution: number) => void;
76
+ setMinResolution: (minResolution: number) => void;
77
+ setMaxZoom: (maxZoom: number) => void;
78
+ setMinZoom: (minZoom: number) => void;
79
+ setOpacity: (opacity: number) => void;
80
+ setVisible: (visible: boolean) => void;
81
+ setZIndex: (zindex: number) => void;
82
+ get: (key: string) => any;
83
+ getKeys: () => string[];
84
+ getProperties: () => {
85
+ [x: string]: any;
86
+ };
87
+ getPropertiesInternal: () => {
88
+ [x: string]: any;
89
+ } | null;
90
+ hasProperties: () => boolean;
91
+ notify: (key: string, oldValue: any) => void;
92
+ addChangeListener: (key: string, listener: import("ol/events").Listener) => void;
93
+ removeChangeListener: (key: string, listener: import("ol/events").Listener) => void;
94
+ set: (key: string, value: any, silent?: boolean | undefined) => void;
95
+ setProperties: (values: {
96
+ [x: string]: any;
97
+ }, silent?: boolean | undefined) => void;
98
+ unset: (key: string, silent?: boolean | undefined) => void;
99
+ changed: () => void;
100
+ getRevision: () => number;
101
+ dispatchEvent: (event: string | import("ol/events/Event").default) => boolean | undefined;
102
+ getListeners: (type: string) => import("ol/events").Listener[] | undefined;
103
+ hasListener: (type?: string | undefined) => boolean;
104
+ dispose: () => void;
105
+ };
106
+ } & typeof Layer;
107
+ /**
108
+ * Layer for visualizing a specific set of layer from a MapboxLayer.
109
+ *
110
+ * @example
111
+ * import { MapboxLayer, MapboxStyleLayer } from 'mobility-toolbox-js/ol';
112
+ *
113
+ * const maplibreLayer = new MapboxLayer({
114
+ * url: 'https://maps.geops.io/styles/travic_v2/style.json?key=[yourApiKey]',
115
+ * });
116
+ *
117
+ * const layer = new MapboxStyleLayer({
118
+ * maplibreLayer: maplibreLayer,
119
+ * styleLayersFilter: () => {},
120
+ * });
121
+ *
122
+ * @classproperty {ol/Map~Map} map - The map where the layer is displayed.
123
+ * @extends {ol/layer/Layer~Layer}
124
+ */
125
+ declare class MaplibreStyleLayer extends MaplibreStyleLayer_base {
126
+ highlightedFeatures: Feature[];
127
+ selectedFeatures: Feature[];
128
+ get beforeId(): string;
129
+ set beforeId(newValue: string[]);
130
+ get layers(): maplibregl.AddLayerObject[];
131
+ set layers(newValue: maplibregl.AddLayerObject[]);
132
+ get layersFilter(): (layer: maplibregl.LayerSpecification) => boolean;
133
+ set layersFilter(newValue: (layer: maplibregl.LayerSpecification) => boolean);
134
+ get mapboxLayer(): MaplibreLayer | undefined;
135
+ get maplibreLayer(): MaplibreLayer;
136
+ set maplibreLayer(newValue: MaplibreLayer);
137
+ get queryRenderedLayersFilter(): (layer: maplibregl.LayerSpecification) => boolean;
138
+ set queryRenderedLayersFilter(newValue: (layer: maplibregl.LayerSpecification) => boolean);
139
+ get sources(): {
140
+ [key: string]: maplibregl.SourceSpecification;
141
+ };
142
+ set sources(newValue: {
143
+ [key: string]: maplibregl.SourceSpecification;
144
+ });
145
+ /**
146
+ * @deprecated
147
+ */
148
+ get styleLayer(): maplibregl.AddLayerObject;
149
+ /**
150
+ * @deprecated
151
+ */
152
+ set styleLayer(newValue: maplibregl.AddLayerObject);
153
+ /**
154
+ * @deprecated
155
+ */
156
+ get styleLayers(): maplibregl.AddLayerObject[];
157
+ /**
158
+ * @deprecated
159
+ */
160
+ set styleLayers(newValue: maplibregl.AddLayerObject[]);
161
+ /**
162
+ * Constructor.
163
+ *
164
+ * @param {Object} options
165
+ * @param {MapboxLayer} [options.maplibreLayer] The MaplibreLayer to use.
166
+ * @param {maplibregl.SourceSpecification[]} [options.sources] The source to add to the style on load.
167
+ * @param {maplibregl.AddLayerObject[]} [options.layers] The layers to add to the style on load.
168
+ * @param {FilterFunction} [options.layersFilter] Filter function to decide which style layer to apply visiblity on. If not provided, the 'layers' property is used.
169
+ * @param {FilterFunction} [options.queryRenderedLayersFilter] Filter function to decide which style layer are available for query.
170
+ */
171
+ constructor(options: MaplibreStyleLayerOptions);
172
+ createRenderer(): MaplibreStyleLayerRenderer;
173
+ /**
174
+ * Initialize the layer.
175
+ * @param {ol/Map~Map} map the Maplibre map.
176
+ * @override
177
+ */
178
+ attachToMap(map: Map): void;
179
+ /**
180
+ * Terminate the layer.
181
+ * @override
182
+ */
183
+ detachFromMap(): void;
184
+ /** @private */
185
+ addSources(): void;
186
+ /** @private */
187
+ removeSources(): void;
188
+ /** @private */
189
+ addLayers(): void;
190
+ /** @private */
191
+ removeLayers(): void;
192
+ /**
193
+ * On Maplibre map load callback function. Add style layers and dynaimc filters.
194
+ * @private
195
+ */
196
+ onLoad(): void;
197
+ /**
198
+ * Request feature information for a given coordinate.
199
+ * @param {ol/coordinate~Coordinate} coordinate Coordinate to request the information at.
200
+ * @return {Promise<FeatureInfo>} Promise with features, layer and coordinate.
201
+ */
202
+ getFeatureInfoAtCoordinate(coordinate: Coordinate): Promise<LayerGetFeatureInfoResponse>;
203
+ /**
204
+ * Set if features are hovered or not.
205
+ * @param {Array<ol/Feature~Feature>} features
206
+ * @param {boolean} state Is the feature hovered
207
+ * @private
208
+ */
209
+ setHoverState(features: Feature[], state: boolean): void;
210
+ /**
211
+ * Select a list of features.
212
+ * @param {Array<ol/Feature~Feature>} [features=[]] Features to select.
213
+ * @private
214
+ */
215
+ select(features?: Feature[]): void;
216
+ /**
217
+ * Highlight a list of features.
218
+ * @param {Array<ol/Feature~Feature>} [features=[]] Features to highlight.
219
+ * @private
220
+ */
221
+ highlight(features?: Feature[]): void;
222
+ /**
223
+ * Apply visibility to style layers that fits the styleLayersFilter function.
224
+ *
225
+ * @private
226
+ */
227
+ applyLayoutVisibility(evt?: ObjectEvent): void;
228
+ /**
229
+ * Create a copy of the MapboxStyleLayer.
230
+ * @param {Object} newOptions Options to override.
231
+ * @return {MapboxStyleLayer} A MapboxStyleLayer.
232
+ */
233
+ clone(newOptions: MaplibreStyleLayerOptions): MaplibreStyleLayer;
234
+ }
235
+ export default MaplibreStyleLayer;
@@ -135,35 +135,37 @@ class MaplibreStyleLayer extends MobilityLayerMixin(Layer) {
135
135
  if (!this.map || !this.maplibreLayer) {
136
136
  return;
137
137
  }
138
- // Apply the initial visibiltity.
139
- const { maplibreMap } = this.maplibreLayer;
140
- if (!maplibreMap) {
141
- // If the maplibreMap is not yet created because the map has no target yet, we
138
+ if (!this.map.getTargetElement()) {
139
+ // If ther e is no target element the maplibreMap is not yet created, we
142
140
  // relaunch the initialisation when it's the case.
143
141
  this.olListenersKeys.push(this.map.on('change:target', () => {
144
142
  this.attachToMap(map);
145
143
  }));
146
144
  return;
147
145
  }
148
- // maplibreMap.loaded() and maplibreMap.isStyleLoaded() are reliable only on the first call of init.
149
- // On the next call (when a topic change for example), these functions returns false because
150
- // the style is being modified.
151
- // That's why we rely on a property instead for the next calls.
152
- if (maplibreMap.loaded()) {
153
- this.onLoad();
154
- }
155
- else {
156
- maplibreMap.once('load', this.onLoad);
146
+ // Apply the initial visibility if possible otherwise we wait for the load event of the layer
147
+ const { maplibreMap } = this.maplibreLayer;
148
+ if (maplibreMap) {
149
+ // maplibreMap.loaded() and maplibreMap.isStyleLoaded() are reliable only on the first call of init.
150
+ // On the next call (when a topic change for example), these functions returns false because
151
+ // the style is being modified.
152
+ // That's why we rely on a property instead for the next calls.
153
+ if (maplibreMap.loaded()) {
154
+ this.onLoad();
155
+ }
156
+ else {
157
+ maplibreMap.once('load', this.onLoad);
158
+ }
157
159
  }
158
160
  // Apply the visibiltity when layer's visibility change.
159
- this.olListenersKeys.push(this.on('change:visible', (evt) => {
161
+ this.olListenersKeys.push(
162
+ // @ts-expect-error 'load' is a custom event
163
+ this.maplibreLayer.on('load', this.onLoad.bind(this)), this.on('change:visible', (evt) => {
160
164
  // Once the map is loaded we can apply visiblity without waiting
161
165
  // the style. Maplibre take care of the application of style changes.
162
166
  this.applyLayoutVisibility(evt);
163
- }),
164
- // @ts-expect-error 'load' is a custom event form mobility-toolbox-js
165
- this.maplibreLayer.on('load', this.onLoad), this.on('propertychange', (evt) => {
166
- if (/(sources|layers|layersFilter|maplibreLayer|beforeId|)/.test(evt.key)) {
167
+ }), this.on('propertychange', (evt) => {
168
+ if (/(sources|layers|layersFilter|maplibreLayer|beforeId)/.test(evt.key)) {
167
169
  this.detachFromMap();
168
170
  this.attachToMap(map);
169
171
  }
@@ -185,13 +187,12 @@ class MaplibreStyleLayer extends MobilityLayerMixin(Layer) {
185
187
  /** @private */
186
188
  addSources() {
187
189
  var _a;
188
- if (!((_a = this.maplibreLayer) === null || _a === void 0 ? void 0 : _a.maplibreMap) || !Array.isArray(this.sources)) {
190
+ if (!((_a = this.maplibreLayer) === null || _a === void 0 ? void 0 : _a.maplibreMap) || !this.sources) {
189
191
  return;
190
192
  }
191
193
  const { maplibreMap } = this.maplibreLayer;
192
194
  if (maplibreMap) {
193
- this.sources.forEach((source) => {
194
- const { id } = source;
195
+ Object.entries(this.sources).forEach(([id, source]) => {
195
196
  if (!maplibreMap.getSource(id)) {
196
197
  maplibreMap.addSource(id, source);
197
198
  }
@@ -201,13 +202,12 @@ class MaplibreStyleLayer extends MobilityLayerMixin(Layer) {
201
202
  /** @private */
202
203
  removeSources() {
203
204
  var _a;
204
- if (!((_a = this.maplibreLayer) === null || _a === void 0 ? void 0 : _a.maplibreMap) || !Array.isArray(this.layers)) {
205
+ if (!((_a = this.maplibreLayer) === null || _a === void 0 ? void 0 : _a.maplibreMap) || !this.sources) {
205
206
  return;
206
207
  }
207
208
  const { maplibreMap } = this.maplibreLayer;
208
209
  if (maplibreMap) {
209
- this.sources.forEach((source) => {
210
- const { id } = source;
210
+ Object.keys(this.sources).forEach((id) => {
211
211
  if (maplibreMap.getSource(id)) {
212
212
  maplibreMap.removeSource(id);
213
213
  }
@@ -0,0 +1,285 @@
1
+ import GeoJSON from 'ol/format/GeoJSON';
2
+ import Source from 'ol/source/Source';
3
+ import Feature, { FeatureLike } from 'ol/Feature';
4
+ import { Map, MapEvent } from 'ol';
5
+ import { ObjectEvent } from 'ol/Object';
6
+ import Layer from 'ol/layer/Layer';
7
+ import { RealtimeLayerMixinOptions } from '../../common/mixins/RealtimeLayerMixin';
8
+ import { RealtimeFullTrajectory, RealtimeTrainId, ViewState } from '../../types';
9
+ import { RealtimeTrajectory } from '../../api/typedefs';
10
+ import { WebSocketAPIMessageEventData } from '../../api/WebSocketAPI';
11
+ import RealtimeLayerRenderer from '../renderers/RealtimeLayerRenderer';
12
+ export type RealtimeLayerOptions = RealtimeLayerMixinOptions & {
13
+ fullTrajectoryStyle?: (feature: FeatureLike, resolution: number, options: any) => void;
14
+ allowRenderWhenAnimating?: boolean;
15
+ };
16
+ declare const RealtimeLayer_base: {
17
+ new (options: RealtimeLayerMixinOptions): {
18
+ [x: string]: any;
19
+ debug: boolean;
20
+ trajectories?: {
21
+ [key: string]: GeoJSONFeature;
22
+ } | undefined;
23
+ canvas?: import("../../types").AnyCanvas | undefined;
24
+ mode: import("../../types").RealtimeMode;
25
+ api: import("..").RealtimeAPI;
26
+ tenant: string;
27
+ bboxParameters?: {
28
+ [index: string]: string | number | boolean | string[] | number[] | boolean[];
29
+ } | undefined;
30
+ time?: Date | undefined;
31
+ live?: boolean | undefined;
32
+ speed?: number | undefined;
33
+ filter?: Function | undefined;
34
+ sort?: Function | undefined;
35
+ style?: import("../../types").RealtimeStyleFunction | undefined;
36
+ styleOptions?: import("../../types").RealtimeStyleOptions | undefined;
37
+ pixelRatio?: number | undefined;
38
+ minZoomInterpolation: number;
39
+ isUpdateBboxOnMoveEnd: boolean;
40
+ hoverVehicleId?: string | undefined;
41
+ selectedVehicleId?: string | undefined;
42
+ renderState?: import("../../types").RealtimeRenderState | undefined;
43
+ useRequestAnimationFrame?: boolean | undefined;
44
+ useDebounce?: boolean | undefined;
45
+ useThrottle?: boolean | undefined;
46
+ mots?: import("../../types").RealtimeMot[] | undefined;
47
+ motsByZoom: import("../../types").RealtimeMot[][];
48
+ generalizationLevel?: import("../../types").RealtimeGeneralizationLevel | undefined;
49
+ generalizationLevelByZoom: import("../../types").RealtimeGeneralizationLevel[];
50
+ renderTimeIntervalByZoom: number[];
51
+ format: GeoJSON<typeof Feature>;
52
+ requestId?: number | undefined;
53
+ updateTimeInterval?: number | undefined;
54
+ updateTimeDelay?: number | undefined;
55
+ visibilityRef: import("ol/events").EventsKey;
56
+ selectedVehicle: GeoJSONFeature;
57
+ getMotsByZoom: (zoom: number) => import("../../types").RealtimeMot[];
58
+ getGeneralizationLevelByZoom: (zoom: number) => import("../../types").RealtimeGeneralizationLevel;
59
+ getRenderTimeIntervalByZoom: (zoom: number) => number;
60
+ throttleRenderTrajectories: (viewState: ViewState, noInterpolate?: boolean | undefined) => void;
61
+ debounceRenderTrajectories: (viewState: ViewState, noInterpolate?: boolean | undefined) => void;
62
+ onStart?: ((realtimeLayer: any) => void) | undefined;
63
+ onStop?: ((realtimeLayer: any) => void) | undefined;
64
+ defineProperties(options: RealtimeLayerMixinOptions): void;
65
+ attachToMap(map: any): void;
66
+ detachFromMap(): void;
67
+ start(): void;
68
+ startUpdateTime(): void;
69
+ stop(): void;
70
+ stopUpdateTime(): void;
71
+ renderTrajectoriesInternal(viewState: ViewState, noInterpolate?: boolean): boolean;
72
+ renderTrajectories(viewState: ViewState | undefined, noInterpolate: boolean | undefined): void;
73
+ setBbox(extent: [number, number, number, number], zoom: number): void;
74
+ getRefreshTimeInMs(zoom?: number | undefined): number;
75
+ getVehicle(filterFc: Function): GeoJSONFeature[];
76
+ getFeatureInfoAtCoordinate(coordinate: import("ol/coordinate").Coordinate, options: import("../../types").LayerGetFeatureInfoOptions): Promise<import("../../types").LayerGetFeatureInfoResponse>;
77
+ getTrajectoryInfos(id: string): Promise<{
78
+ stopSequence: WebSocketAPIMessageEventData<RealtimeFullTrajectory> | WebSocketAPIMessageEventData<GeoJSONFeature[]>;
79
+ fullTrajectory: WebSocketAPIMessageEventData<RealtimeFullTrajectory> | WebSocketAPIMessageEventData<GeoJSONFeature[]>;
80
+ }>;
81
+ purgeOutOfDateTrajectories(): void;
82
+ purgeTrajectory(trajectory: GeoJSONFeature, extent: [number, number, number, number], zoom: number): boolean;
83
+ addTrajectory(trajectory: GeoJSONFeature): void;
84
+ removeTrajectory(trajectoryOrId: any): void;
85
+ onZoomEnd(): void;
86
+ onDocumentVisibilityChange(): void;
87
+ onTrajectoryMessage(data: WebSocketAPIMessageEventData<GeoJSONFeature>): void;
88
+ onDeleteTrajectoryMessage(data: WebSocketAPIMessageEventData<string>): void;
89
+ highlightVehicle(id: string): void;
90
+ selectVehicle(id: string): void;
91
+ };
92
+ } & {
93
+ new (...args: any[]): {
94
+ options?: import("../mixins/PropertiesLayerMixin").PropertiesLayerMixinOptions | undefined;
95
+ olListenersKeys: import("ol/events").EventsKey[];
96
+ children: Layer<Source, import("ol/renderer/Layer").default<any>>[];
97
+ get copyrights(): string;
98
+ set copyrights(newCopyrights: string | string[]);
99
+ disabled: boolean;
100
+ readonly group: string;
101
+ readonly hitTolerance: boolean;
102
+ readonly key: string;
103
+ readonly map: Map;
104
+ readonly name: string;
105
+ olLayer: Layer<Source, import("ol/renderer/Layer").default<any>>;
106
+ parent: Layer<Source, import("ol/renderer/Layer").default<any>>;
107
+ visible: boolean;
108
+ setMapInternal: ((map: Map) => void) & ((map: Map | null) => void);
109
+ onChildrenChange(oldValue: Layer<Source, import("ol/renderer/Layer").default<any>>[]): void;
110
+ attachToMap(map: Map): void;
111
+ detachFromMap(): void;
112
+ flat(): any[];
113
+ addEventListener: (type: string, listener: import("ol/events").Listener) => void;
114
+ removeEventListener: (type: string, listener: import("ol/events").Listener) => void;
115
+ on: import("ol/layer/Layer").LayerOnSignature<import("ol/events").EventsKey>;
116
+ render: (frameState: import("ol/Map").FrameState | null, target: HTMLElement) => HTMLElement | null;
117
+ once: import("ol/layer/Layer").LayerOnSignature<import("ol/events").EventsKey>;
118
+ un: import("ol/layer/Layer").LayerOnSignature<void>;
119
+ getSource: () => Source | null;
120
+ getRenderSource: () => Source | null;
121
+ getFeatures: (pixel: import("ol/pixel").Pixel) => Promise<FeatureLike[]>;
122
+ getData: (pixel: import("ol/pixel").Pixel) => Float32Array | Uint8ClampedArray | Uint8Array | DataView | null;
123
+ isVisible: (view?: import("ol").View | import("ol/View").ViewStateLayerStateExtent | undefined) => boolean;
124
+ getAttributions: (view?: import("ol").View | import("ol/View").ViewStateLayerStateExtent | undefined) => string[];
125
+ unrender: () => void;
126
+ getDeclutter: () => string;
127
+ renderDeclutter: (frameState: import("ol/Map").FrameState, layerState: import("ol/layer/Layer").State) => void;
128
+ renderDeferred: (frameState: import("ol/Map").FrameState) => void;
129
+ getMapInternal: () => Map | null;
130
+ setMap: (map: Map | null) => void;
131
+ setSource: (source: Source | null) => void;
132
+ getRenderer: () => import("ol/renderer/Layer").default<any> | null;
133
+ hasRenderer: () => boolean;
134
+ getBackground: () => false | import("ol/layer/Base").BackgroundColor;
135
+ getClassName: () => string;
136
+ getLayerState: (managed?: boolean | undefined) => import("ol/layer/Layer").State;
137
+ getLayersArray: (array?: Layer<Source, import("ol/renderer/Layer").default<any>>[] | undefined) => Layer<Source, import("ol/renderer/Layer").default<any>>[];
138
+ getLayerStatesArray: (states?: import("ol/layer/Layer").State[] | undefined) => import("ol/layer/Layer").State[];
139
+ getExtent: () => import("ol/extent").Extent | undefined;
140
+ getMaxResolution: () => number;
141
+ getMinResolution: () => number;
142
+ getMinZoom: () => number;
143
+ getMaxZoom: () => number;
144
+ getOpacity: () => number;
145
+ getSourceState: () => import("ol/source/Source").State;
146
+ getVisible: () => boolean;
147
+ getZIndex: () => number | undefined;
148
+ setBackground: (background?: import("ol/layer/Base").BackgroundColor | undefined) => void;
149
+ setExtent: (extent: import("ol/extent").Extent | undefined) => void;
150
+ setMaxResolution: (maxResolution: number) => void;
151
+ setMinResolution: (minResolution: number) => void;
152
+ setMaxZoom: (maxZoom: number) => void;
153
+ setMinZoom: (minZoom: number) => void;
154
+ setOpacity: (opacity: number) => void;
155
+ setVisible: (visible: boolean) => void;
156
+ setZIndex: (zindex: number) => void;
157
+ get: (key: string) => any;
158
+ getKeys: () => string[];
159
+ getProperties: () => {
160
+ [x: string]: any;
161
+ };
162
+ getPropertiesInternal: () => {
163
+ [x: string]: any;
164
+ } | null;
165
+ hasProperties: () => boolean;
166
+ notify: (key: string, oldValue: any) => void;
167
+ addChangeListener: (key: string, listener: import("ol/events").Listener) => void;
168
+ removeChangeListener: (key: string, listener: import("ol/events").Listener) => void;
169
+ set: (key: string, value: any, silent?: boolean | undefined) => void;
170
+ setProperties: (values: {
171
+ [x: string]: any;
172
+ }, silent?: boolean | undefined) => void;
173
+ unset: (key: string, silent?: boolean | undefined) => void;
174
+ changed: () => void;
175
+ getRevision: () => number;
176
+ dispatchEvent: (event: string | import("ol/events/Event").default) => boolean | undefined;
177
+ getListeners: (type: string) => import("ol/events").Listener[] | undefined;
178
+ hasListener: (type?: string | undefined) => boolean;
179
+ dispose: () => void;
180
+ };
181
+ } & typeof Layer;
182
+ /**
183
+ * Responsible for loading and display data from the geOps realtime API.
184
+ *
185
+ * @example
186
+ * import { RealtimeLayer } from 'mobility-toolbox-js/ol';
187
+ *
188
+ * const layer = new RealtimeLayer({
189
+ * apiKey: "yourApiKey"
190
+ * // allowRenderWhenAnimating: false,
191
+ * // url: "wss://api.geops.io/tracker-ws/v1/",
192
+ * });
193
+ *
194
+ *
195
+ * @see <a href="/api/class/src/api/RealtimeAPI%20js~RealtimeAPI%20html">RealtimeAPI</a>
196
+ *
197
+ * @extends {ol/layer/Layer~Layer}
198
+ *
199
+ * @classproperty {boolean} allowRenderWhenAnimating - Allow rendering of the layer when the map is animating.
200
+ * @public
201
+ */
202
+ declare class RealtimeLayer extends RealtimeLayer_base {
203
+ /** @private */
204
+ allowRenderWhenAnimating?: boolean;
205
+ /**
206
+ * Constructor.
207
+ *
208
+ * @param {RealtimeLayerOptions} options
209
+ * @param {boolean} [options.allowRenderWhenAnimating=false] Allow rendering of the layer when the map is animating.
210
+ * @param {string} options.apiKey Access key for [geOps apis](https://developer.geops.io/).
211
+ * @param {string} [options.url="wss://api.geops.io/tracker-ws/v1/"] The geOps realtime API url.
212
+ *
213
+ */
214
+ constructor(options: RealtimeLayerOptions);
215
+ /**
216
+ * @private
217
+ */
218
+ createRenderer(): RealtimeLayerRenderer;
219
+ /** @private */
220
+ attachToMap(map: Map): void;
221
+ /**
222
+ * Destroy the container of the tracker.
223
+ * @private
224
+ */
225
+ detachFromMap(): void;
226
+ /**
227
+ * Render the trajectories using current map's size, resolution and rotation.
228
+ * @param {boolean} noInterpolate if true, renders the vehicles without interpolating theirs positions.
229
+ * @overrides
230
+ * @private
231
+ */
232
+ renderTrajectories(noInterpolate: boolean): void;
233
+ /**
234
+ * Launch renderTrajectories. it avoids duplicating code in renderTrajectories methhod.
235
+ * @private
236
+ * @override
237
+ */
238
+ renderTrajectoriesInternal(viewState: ViewState, noInterpolate: boolean): boolean;
239
+ /**
240
+ * Return the delay in ms before the next rendering.
241
+ * @private
242
+ */
243
+ getRefreshTimeInMs(): number;
244
+ /**
245
+ * On move end we update the websocket with the new bbox.
246
+ *
247
+ * @private
248
+ * @override
249
+ */
250
+ onMoveEnd(evt: MapEvent | ObjectEvent): void;
251
+ /**
252
+ * Function called on moveend event only when the zoom has changed.
253
+ *
254
+ * @param {ol/MapEvent~MapEvent} evt Moveend event.
255
+ * @private
256
+ * @override
257
+ */
258
+ onZoomEnd(): void;
259
+ highlight(feature: Feature): void;
260
+ select(feature: Feature): void;
261
+ /**
262
+ * Remove the trajectory form the list if necessary.
263
+ *
264
+ * @private
265
+ */
266
+ purgeTrajectory(trajectory: RealtimeTrajectory, extent: [number, number, number, number], zoom: number): boolean;
267
+ /**
268
+ * Send the current bbox to the websocket
269
+ *
270
+ * @private
271
+ */
272
+ setBbox(extent?: [number, number, number, number], zoom?: number): void;
273
+ /**
274
+ * Highlight the trajectory of journey.
275
+ * @private
276
+ */
277
+ highlightTrajectory(id: RealtimeTrainId): Promise<Feature[] | undefined>;
278
+ /**
279
+ * Create a copy of the RealtimeLayer.
280
+ * @param {Object} newOptions Options to override
281
+ * @return {RealtimeLayer} A RealtimeLayer
282
+ */
283
+ clone(newOptions: RealtimeLayerOptions): RealtimeLayer;
284
+ }
285
+ export default RealtimeLayer;
@@ -11,7 +11,7 @@ import RealtimeLayerRenderer from '../renderers/RealtimeLayerRenderer';
11
11
  /** @private */
12
12
  const format = new GeoJSON();
13
13
  /**
14
- * Responsible for loading and display data from the geOps Realtime API.
14
+ * Responsible for loading and display data from the geOps realtime API.
15
15
  *
16
16
  * @example
17
17
  * import { RealtimeLayer } from 'mobility-toolbox-js/ol';
@@ -38,7 +38,7 @@ class RealtimeLayer extends RealtimeLayerMixin(MobilityLayerMixin(Layer)) {
38
38
  * @param {RealtimeLayerOptions} options
39
39
  * @param {boolean} [options.allowRenderWhenAnimating=false] Allow rendering of the layer when the map is animating.
40
40
  * @param {string} options.apiKey Access key for [geOps apis](https://developer.geops.io/).
41
- * @param {string} [options.url="wss://api.geops.io/tracker-ws/v1/"] The geOps Realtime API url.
41
+ * @param {string} [options.url="wss://api.geops.io/tracker-ws/v1/"] The geOps realtime API url.
42
42
  *
43
43
  */
44
44
  constructor(options) {
@@ -86,9 +86,12 @@ class RealtimeLayer extends RealtimeLayerMixin(MobilityLayerMixin(Layer)) {
86
86
  if (this.visible) {
87
87
  this.start();
88
88
  }
89
+ // @ts-expect-error - bad ts check RealtimeLayer is a BaseLayer
89
90
  const index = this.map.getLayers().getArray().indexOf(this);
90
91
  this.map.getLayers().insertAt(index, this.vectorLayer);
91
- this.olListenersKeys.push(...this.map.on(['moveend', 'change:target'], (evt) => {
92
+ this.olListenersKeys.push(...this.map.on(['moveend', 'change:target'],
93
+ // @ts-expect-error - bad ol definitions
94
+ (evt) => {
92
95
  const view = (evt.map || evt.target).getView();
93
96
  if (view.getAnimating() || view.getInteracting()) {
94
97
  return;
@@ -174,8 +177,10 @@ class RealtimeLayer extends RealtimeLayerMixin(MobilityLayerMixin(Layer)) {
174
177
  if (isRendered) {
175
178
  /** @private */
176
179
  this.renderedViewState = Object.assign({}, viewState);
177
- if (this.getRenderer().container) {
178
- this.getRenderer().container.style.transform = '';
180
+ // @ts-expect-error - we are in the same class
181
+ const { container } = this.getRenderer();
182
+ if (container) {
183
+ container.style.transform = '';
179
184
  }
180
185
  }
181
186
  return isRendered;
@@ -266,7 +271,7 @@ class RealtimeLayer extends RealtimeLayerMixin(MobilityLayerMixin(Layer)) {
266
271
  // it will trigger a js error on calculateExtent function.
267
272
  return false;
268
273
  }
269
- return super.purgeTrajectory(trajectory, extent || this.map.getView().calculateExtent(), zoom || this.map.getView().getZoom());
274
+ return super.purgeTrajectory(trajectory, extent || this.map.getView().calculateExtent(), zoom || this.map.getView().getZoom() || 0);
270
275
  }
271
276
  /**
272
277
  * Send the current bbox to the websocket
@@ -274,7 +279,8 @@ class RealtimeLayer extends RealtimeLayerMixin(MobilityLayerMixin(Layer)) {
274
279
  * @private
275
280
  */
276
281
  setBbox(extent, zoom) {
277
- super.setBbox(extent || this.map.getView().calculateExtent(), zoom || this.map.getView().getZoom());
282
+ super.setBbox(extent ||
283
+ this.map.getView().calculateExtent(), zoom || this.map.getView().getZoom() || 0);
278
284
  }
279
285
  /**
280
286
  * Highlight the trajectory of journey.