mobility-toolbox-js 2.0.0 → 2.1.0
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.
- package/api/RealtimeAPI.d.ts +279 -0
- package/api/RealtimeAPI.d.ts.map +1 -0
- package/api/RealtimeAPI.js +466 -0
- package/api/RoutingAPI.d.ts +37 -0
- package/api/RoutingAPI.d.ts.map +1 -0
- package/api/RoutingAPI.js +35 -0
- package/api/StopsAPI.d.ts +38 -0
- package/api/StopsAPI.d.ts.map +1 -0
- package/api/StopsAPI.js +36 -0
- package/api/index.d.ts +4 -0
- package/api/index.d.ts.map +1 -0
- package/api/index.js +3 -3
- package/api/typedefs.d.ts +179 -0
- package/api/typedefs.d.ts.map +1 -0
- package/api/{tralis/typedefs.js → typedefs.js} +4 -10
- package/common/api/HttpAPI.d.ts +31 -0
- package/common/api/HttpAPI.d.ts.map +1 -0
- package/common/api/HttpAPI.js +57 -0
- package/common/api/WebSocketAPI.d.ts +153 -0
- package/common/api/WebSocketAPI.d.ts.map +1 -0
- package/common/api/WebSocketAPI.js +341 -0
- package/common/controls/ControlCommon.d.ts +76 -0
- package/common/controls/ControlCommon.d.ts.map +1 -0
- package/common/controls/ControlCommon.js +150 -0
- package/common/controls/CopyrightControlCommon.d.ts +13 -0
- package/common/controls/CopyrightControlCommon.d.ts.map +1 -0
- package/common/controls/CopyrightControlCommon.js +34 -0
- package/common/controls/StopFinderControlCommon.d.ts +55 -0
- package/common/controls/StopFinderControlCommon.d.ts.map +1 -0
- package/common/controls/StopFinderControlCommon.js +144 -0
- package/common/index.d.ts +3 -0
- package/common/index.d.ts.map +1 -0
- package/common/index.js +2 -0
- package/common/layers/LayerCommon.d.ts +94 -0
- package/common/layers/LayerCommon.d.ts.map +1 -0
- package/common/layers/LayerCommon.js +244 -0
- package/common/mixins/RealtimeLayerMixin.d.ts +286 -0
- package/common/mixins/RealtimeLayerMixin.d.ts.map +1 -0
- package/common/mixins/RealtimeLayerMixin.js +776 -0
- package/common/mixins/UserInteractionsLayerMixin.d.ts +60 -0
- package/common/mixins/UserInteractionsLayerMixin.d.ts.map +1 -0
- package/common/mixins/UserInteractionsLayerMixin.js +241 -0
- package/common/styles/index.d.ts +5 -0
- package/common/styles/index.d.ts.map +1 -0
- package/common/styles/index.js +4 -4
- package/common/styles/realtimeDefaultStyle.d.ts +36 -0
- package/common/styles/realtimeDefaultStyle.d.ts.map +1 -0
- package/common/styles/realtimeDefaultStyle.js +275 -0
- package/common/styles/{trackerDelayStyle.js → realtimeDelayStyle.d.ts} +4 -9
- package/common/styles/realtimeDelayStyle.d.ts.map +1 -0
- package/common/styles/realtimeDelayStyle.js +13 -0
- package/common/styles/realtimeHeadingStyle.d.ts +12 -0
- package/common/styles/realtimeHeadingStyle.d.ts.map +1 -0
- package/common/styles/realtimeHeadingStyle.js +85 -0
- package/common/styles/realtimeSimpleStyle.d.ts +4 -0
- package/common/styles/realtimeSimpleStyle.d.ts.map +1 -0
- package/common/styles/realtimeSimpleStyle.js +23 -0
- package/common/typedefs.d.ts +111 -0
- package/common/typedefs.d.ts.map +1 -0
- package/common/typedefs.js +35 -6
- package/common/utils/compareDepartures.d.ts +11 -0
- package/common/utils/compareDepartures.d.ts.map +1 -0
- package/common/utils/compareDepartures.js +35 -0
- package/common/utils/createCanvas.d.ts +10 -0
- package/common/utils/createCanvas.d.ts.map +1 -0
- package/common/utils/createCanvas.js +27 -0
- package/common/utils/createRealtimeFilters.d.ts +13 -0
- package/common/utils/createRealtimeFilters.d.ts.map +1 -0
- package/common/utils/createRealtimeFilters.js +74 -0
- package/common/utils/debounceDeparturesMessages.d.ts +12 -0
- package/common/utils/debounceDeparturesMessages.d.ts.map +1 -0
- package/common/utils/debounceDeparturesMessages.js +24 -0
- package/common/utils/debounceWebsocketMessages.d.ts +11 -0
- package/common/utils/debounceWebsocketMessages.d.ts.map +1 -0
- package/common/utils/debounceWebsocketMessages.js +29 -0
- package/common/utils/getLayersAsFlatArray.d.ts +3 -0
- package/common/utils/getLayersAsFlatArray.d.ts.map +1 -0
- package/common/utils/getLayersAsFlatArray.js +15 -0
- package/common/utils/getMapboxMapCopyrights.d.ts +18 -0
- package/common/utils/getMapboxMapCopyrights.d.ts.map +1 -0
- package/common/utils/getMapboxMapCopyrights.js +21 -23
- package/common/utils/getMapboxRender.d.ts +7 -0
- package/common/utils/getMapboxRender.d.ts.map +1 -0
- package/common/utils/getMapboxRender.js +87 -0
- package/common/utils/getMaplibreRender.d.ts +7 -0
- package/common/utils/getMaplibreRender.d.ts.map +1 -0
- package/common/utils/getMaplibreRender.js +38 -0
- package/common/utils/getRealtimeModeSuffix.d.ts +10 -0
- package/common/utils/getRealtimeModeSuffix.d.ts.map +1 -0
- package/common/utils/getRealtimeModeSuffix.js +7 -0
- package/common/utils/getUrlWithParams.d.ts +9 -0
- package/common/utils/getUrlWithParams.d.ts.map +1 -0
- package/common/utils/getUrlWithParams.js +18 -0
- package/common/utils/getVehiclePosition.d.ts +16 -0
- package/common/utils/getVehiclePosition.d.ts.map +1 -0
- package/common/utils/getVehiclePosition.js +60 -60
- package/common/utils/index.d.ts +17 -0
- package/common/utils/index.d.ts.map +1 -0
- package/common/utils/index.js +13 -2
- package/common/utils/realtimeConfig.d.ts +49 -0
- package/common/utils/realtimeConfig.d.ts.map +1 -0
- package/common/utils/realtimeConfig.js +173 -0
- package/common/utils/removeDuplicate.d.ts +10 -0
- package/common/utils/removeDuplicate.d.ts.map +1 -0
- package/common/utils/removeDuplicate.js +5 -12
- package/common/utils/renderTrajectories.d.ts +17 -0
- package/common/utils/renderTrajectories.d.ts.map +1 -0
- package/common/utils/renderTrajectories.js +110 -0
- package/common/utils/sortAndFilterDepartures.d.ts +16 -0
- package/common/utils/sortAndFilterDepartures.d.ts.map +1 -0
- package/common/utils/sortAndFilterDepartures.js +58 -0
- package/common/utils/sortByDelay.d.ts +3 -0
- package/common/utils/sortByDelay.d.ts.map +1 -0
- package/common/utils/sortByDelay.js +17 -20
- package/common/utils/timeUtils.d.ts +24 -0
- package/common/utils/timeUtils.d.ts.map +1 -0
- package/common/utils/timeUtils.js +13 -18
- package/iife.d.ts +3 -0
- package/iife.d.ts.map +1 -0
- package/iife.js +5 -0
- package/index.d.ts +10 -0
- package/index.d.ts.map +1 -0
- package/index.js +10 -2
- package/mapbox/controls/CopyrightControl.d.ts +29 -0
- package/mapbox/controls/CopyrightControl.d.ts.map +1 -0
- package/mapbox/controls/CopyrightControl.js +25 -35
- package/mapbox/controls/index.d.ts +2 -0
- package/mapbox/controls/index.d.ts.map +1 -0
- package/mapbox/controls/index.js +2 -0
- package/mapbox/index.d.ts +6 -0
- package/mapbox/index.d.ts.map +1 -0
- package/mapbox/index.js +5 -3
- package/mapbox/layers/Layer.d.ts +59 -0
- package/mapbox/layers/Layer.d.ts.map +1 -0
- package/mapbox/layers/Layer.js +78 -95
- package/mapbox/layers/RealtimeLayer.d.ts +181 -0
- package/mapbox/layers/RealtimeLayer.d.ts.map +1 -0
- package/mapbox/layers/RealtimeLayer.js +276 -0
- package/mapbox/layers/index.d.ts +3 -0
- package/mapbox/layers/index.d.ts.map +1 -0
- package/mapbox/layers/index.js +2 -0
- package/mapbox/utils/getMercatorResolution.d.ts +9 -0
- package/mapbox/utils/getMercatorResolution.d.ts.map +1 -0
- package/mapbox/utils/getMercatorResolution.js +18 -0
- package/mapbox/utils/getSourceCoordinates.d.ts +9 -0
- package/mapbox/utils/getSourceCoordinates.d.ts.map +1 -0
- package/mapbox/utils/getSourceCoordinates.js +27 -0
- package/mapbox/utils/index.d.ts +3 -0
- package/mapbox/utils/index.d.ts.map +1 -0
- package/mapbox/utils/index.js +2 -0
- package/mbt.js +60005 -0
- package/mbt.js.map +7 -0
- package/mbt.min.js +1084 -0
- package/mbt.min.js.map +7 -0
- package/ol/controls/CopyrightControl.d.ts +31 -0
- package/ol/controls/CopyrightControl.d.ts.map +1 -0
- package/ol/controls/CopyrightControl.js +44 -56
- package/ol/controls/RoutingControl.d.ts +193 -0
- package/ol/controls/RoutingControl.d.ts.map +1 -0
- package/ol/controls/RoutingControl.js +546 -667
- package/ol/controls/StopFinderControl.d.ts +30 -0
- package/ol/controls/StopFinderControl.d.ts.map +1 -0
- package/ol/controls/StopFinderControl.js +10 -16
- package/ol/controls/index.d.ts +4 -0
- package/ol/controls/index.d.ts.map +1 -0
- package/ol/controls/index.js +3 -0
- package/ol/index.d.ts +6 -0
- package/ol/index.d.ts.map +1 -0
- package/ol/index.js +4 -12
- package/ol/layers/Layer.d.ts +86 -0
- package/ol/layers/Layer.d.ts.map +1 -0
- package/ol/layers/Layer.js +147 -166
- package/ol/layers/MapGlLayer.d.ts +67 -0
- package/ol/layers/MapGlLayer.d.ts.map +1 -0
- package/ol/layers/MapGlLayer.js +218 -0
- package/ol/layers/MapboxLayer.d.ts +50 -0
- package/ol/layers/MapboxLayer.d.ts.map +1 -0
- package/ol/layers/MapboxLayer.js +79 -348
- package/ol/layers/MapboxStyleLayer.d.ts +129 -0
- package/ol/layers/MapboxStyleLayer.d.ts.map +1 -0
- package/ol/layers/MapboxStyleLayer.js +329 -368
- package/ol/layers/MaplibreLayer.d.ts +28 -0
- package/ol/layers/MaplibreLayer.d.ts.map +1 -0
- package/ol/layers/MaplibreLayer.js +13 -259
- package/ol/layers/RealtimeLayer.d.ts +202 -0
- package/ol/layers/RealtimeLayer.d.ts.map +1 -0
- package/ol/layers/RealtimeLayer.js +340 -0
- package/ol/layers/RoutingLayer.d.ts +34 -0
- package/ol/layers/RoutingLayer.d.ts.map +1 -0
- package/ol/layers/RoutingLayer.js +62 -68
- package/ol/layers/VectorLayer.d.ts +25 -0
- package/ol/layers/VectorLayer.d.ts.map +1 -0
- package/ol/layers/VectorLayer.js +27 -32
- package/ol/layers/WMSLayer.d.ts +42 -0
- package/ol/layers/WMSLayer.d.ts.map +1 -0
- package/ol/layers/WMSLayer.js +74 -66
- package/ol/layers/index.d.ts +9 -0
- package/ol/layers/index.d.ts.map +1 -0
- package/ol/layers/index.js +8 -0
- package/ol/styles/fullTrajectoryDelayStyle.d.ts +4 -0
- package/ol/styles/fullTrajectoryDelayStyle.d.ts.map +1 -0
- package/ol/styles/fullTrajectoryDelayStyle.js +23 -25
- package/ol/styles/fullTrajectoryStyle.d.ts +5 -0
- package/ol/styles/fullTrajectoryStyle.d.ts.map +1 -0
- package/ol/styles/fullTrajectoryStyle.js +37 -44
- package/ol/styles/index.d.ts +3 -0
- package/ol/styles/index.d.ts.map +1 -0
- package/package.json +98 -177
- package/setupTests.d.ts +2 -0
- package/setupTests.d.ts.map +1 -0
- package/setupTests.js +26 -0
- package/types/common.d.ts +122 -0
- package/types/index.d.ts +11 -0
- package/types/realtime.d.ts +320 -0
- package/types/routing.d.ts +206 -0
- package/types/stops.d.ts +143 -0
- package/README.md +0 -23
- package/api/routing/RoutingAPI.js +0 -44
- package/api/routing/RoutingAPI.test.js +0 -41
- package/api/stops/StopsAPI.js +0 -41
- package/api/stops/StopsAPI.test.js +0 -34
- package/api/tralis/TralisAPI.js +0 -731
- package/api/tralis/TralisAPI.test.js +0 -75
- package/api/tralis/TralisAPIUtils.js +0 -73
- package/api/tralis/WebSocketConnector.js +0 -338
- package/api/tralis/WebSocketConnector.test.js +0 -356
- package/common/Tracker.js +0 -197
- package/common/api/api.js +0 -64
- package/common/api/api.test.js +0 -68
- package/common/controls/Control.js +0 -146
- package/common/controls/Control.test.js +0 -98
- package/common/layers/Layer.js +0 -404
- package/common/layers/Layer.test.js +0 -585
- package/common/mixins/CopyrightMixin.js +0 -48
- package/common/mixins/SearchMixin.js +0 -176
- package/common/mixins/TralisLayerMixin.js +0 -930
- package/common/styles/trackerDefaultStyle.js +0 -333
- package/common/styles/trackerSimpleStyle.js +0 -22
- package/common/trackerConfig.js +0 -190
- package/common/trackerConfig.test.js +0 -25
- package/common/utils/createTrackerFilters.js +0 -87
- package/common/utils/createTrackerFilters.test.js +0 -95
- package/common/utils/getMapboxMapCopyrights.test.js +0 -47
- package/common/utils/getMapboxStyleUrl.js +0 -32
- package/common/utils/removeDuplicate.test.js +0 -22
- package/common/utils/timeUtils.test.js +0 -16
- package/index.js.map +0 -1
- package/mapbox/layers/Layer.test.js +0 -202
- package/mapbox/layers/TralisLayer.js +0 -329
- package/mapbox/layers/TralisLayer.test.js +0 -40
- package/mapbox/utils.js +0 -46
- package/module.js +0 -23
- package/ol/README.md +0 -0
- package/ol/controls/CopyrightControl.test.js +0 -211
- package/ol/controls/RoutingControl.test.js +0 -216
- package/ol/controls/StopFinderControl.test.js +0 -59
- package/ol/controls/snapshots/RoutingControlRouteGen10.json +0 -58
- package/ol/controls/snapshots/RoutingControlRouteGen100.json +0 -292
- package/ol/controls/snapshots/RoutingControlRouteGen30.json +0 -69
- package/ol/controls/snapshots/RoutingControlRouteGen5.json +0 -58
- package/ol/controls/snapshots/RoutingControlRouteOSM.json +0 -759
- package/ol/controls/snapshots/RoutingControlStation1.json +0 -60
- package/ol/controls/snapshots/RoutingControlStation2.json +0 -49
- package/ol/layers/Layer.test.js +0 -197
- package/ol/layers/MapboxLayer.test.js +0 -186
- package/ol/layers/MapboxStyleLayer.test.js +0 -262
- package/ol/layers/RoutingLayer.test.js +0 -49
- package/ol/layers/TralisLayer.js +0 -359
- package/ol/layers/TralisLayer.test.js +0 -97
- package/ol/layers/VectorLayer.test.js +0 -98
- package/ol/layers/WMSLayer.test.js +0 -84
|
@@ -6,10 +6,10 @@ import { click } from 'ol/events/condition';
|
|
|
6
6
|
import { GeoJSON } from 'ol/format';
|
|
7
7
|
import { buffer } from 'ol/extent';
|
|
8
8
|
import { fromLonLat, toLonLat } from 'ol/proj';
|
|
9
|
-
import
|
|
10
|
-
import
|
|
9
|
+
import BaseEvent from 'ol/events/Event';
|
|
10
|
+
import { RoutingAPI } from '../../api';
|
|
11
|
+
import ControlCommon from '../../common/controls/ControlCommon';
|
|
11
12
|
import RoutingLayer from '../layers/RoutingLayer';
|
|
12
|
-
|
|
13
13
|
// Examples for a single hop:
|
|
14
14
|
// basel sbb a station named "basel sbb"
|
|
15
15
|
// ZUE, station "Zürich HB" by its common abbreviation
|
|
@@ -17,30 +17,34 @@ import RoutingLayer from '../layers/RoutingLayer';
|
|
|
17
17
|
// @47.37811,8.53935 a station at position 47.37811, 8.53935
|
|
18
18
|
// @47.37811,8.53935$4 track 4 in a station at position 47.37811, 8.53935
|
|
19
19
|
// zürich hb@47.37811,8.53935$8 track 8 in station "Zürich HB" at position 47.37811, 8.53935
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
20
|
+
/** @private */
|
|
21
|
+
const REGEX_VIA_POINT = /^([^@$!\n]*)(@?([\d.]+),([\d.]+))?(\$?([a-zA-Z0-9]{0,2}))$/;
|
|
23
22
|
// Examples for a single hop:
|
|
24
23
|
//
|
|
25
24
|
// 47.37811,8.53935 a position 47.37811, 8.53935
|
|
25
|
+
/** @private */
|
|
26
26
|
const REGEX_VIA_POINT_COORD = /^([\d.]+),([\d.]+)$/;
|
|
27
|
-
|
|
28
27
|
// Examples for a single hop:
|
|
29
28
|
//
|
|
30
29
|
// !8596126 a station with id 8596126
|
|
31
30
|
// !8596126$4 a station with id 8596126
|
|
31
|
+
/** @private */
|
|
32
32
|
const REGEX_VIA_POINT_STATION_ID = /^!([^$]*)(\$?([a-zA-Z0-9]{0,2}))$/;
|
|
33
|
-
|
|
33
|
+
/** @private */
|
|
34
34
|
const STOP_FETCH_ABORT_CONTROLLER_KEY = 'stop-fetch';
|
|
35
|
-
|
|
35
|
+
/** @private */
|
|
36
36
|
const getFlatCoordinatesFromSegments = (segmentArray) => {
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
37
|
+
const coords = [];
|
|
38
|
+
segmentArray.forEach((seg) => {
|
|
39
|
+
var _a;
|
|
40
|
+
// @ts-ignore
|
|
41
|
+
const coordArr = (_a = seg.getGeometry()) === null || _a === void 0 ? void 0 : _a.getCoordinates();
|
|
42
|
+
if (coordArr === null || coordArr === void 0 ? void 0 : coordArr.length) {
|
|
43
|
+
coords.push(...coordArr);
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
return coords;
|
|
42
47
|
};
|
|
43
|
-
|
|
44
48
|
/**
|
|
45
49
|
* Display a route of a specified mean of transport.
|
|
46
50
|
*
|
|
@@ -54,7 +58,7 @@ const getFlatCoordinatesFromSegments = (segmentArray) => {
|
|
|
54
58
|
*
|
|
55
59
|
* const control = new RoutingControl();
|
|
56
60
|
*
|
|
57
|
-
* control.map
|
|
61
|
+
* control.attachToMap(map)
|
|
58
62
|
*
|
|
59
63
|
* @classproperty {string} apiKey - Key used for RoutingApi requests.
|
|
60
64
|
* @classproperty {string} stopsApiKey - Key used for Stop lookup requests (defaults to apiKey).
|
|
@@ -72,681 +76,556 @@ const getFlatCoordinatesFromSegments = (segmentArray) => {
|
|
|
72
76
|
* @extends {Control}
|
|
73
77
|
* @implements {RoutingInterface}
|
|
74
78
|
*/
|
|
75
|
-
class RoutingControl extends
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
/** @ignore */
|
|
115
|
-
this.modify = options.modify !== false;
|
|
116
|
-
|
|
117
|
-
/** @ignore */
|
|
118
|
-
this.routingApiParams = options.routingApiParams || {};
|
|
119
|
-
|
|
120
|
-
/** @ignore */
|
|
121
|
-
this.useRawViaPoints = options.useRawViaPoints || false;
|
|
122
|
-
|
|
123
|
-
/** @ignore */
|
|
124
|
-
this.snapToClosestStation = options.snapToClosestStation || false;
|
|
125
|
-
|
|
126
|
-
/** @ignore */
|
|
127
|
-
this.cacheStationData = {};
|
|
128
|
-
|
|
129
|
-
/** @ignore */
|
|
130
|
-
this.abortControllers = [];
|
|
131
|
-
|
|
132
|
-
/** @ignore */
|
|
133
|
-
this.apiKey = options.apiKey;
|
|
134
|
-
|
|
135
|
-
/** @ignore */
|
|
136
|
-
this.stopsApiKey = options.stopsApiKey || this.apiKey;
|
|
137
|
-
|
|
138
|
-
/** @ignore */
|
|
139
|
-
this.segments = [];
|
|
140
|
-
|
|
141
|
-
/** @ignore */
|
|
142
|
-
this.stopsApiUrl = options.stopsApiUrl || 'https://api.geops.io/stops/v1/';
|
|
143
|
-
|
|
144
|
-
/** @ignore */
|
|
145
|
-
this.api = new RoutingAPI({
|
|
146
|
-
url: options.url,
|
|
147
|
-
apiKey: this.apiKey,
|
|
148
|
-
mot: options.mot,
|
|
149
|
-
});
|
|
150
|
-
|
|
151
|
-
/** @ignore */
|
|
152
|
-
this.routingLayer =
|
|
153
|
-
options.routingLayer ||
|
|
154
|
-
new RoutingLayer({
|
|
155
|
-
name: 'routing-layer',
|
|
156
|
-
style: options.style,
|
|
157
|
-
});
|
|
158
|
-
|
|
159
|
-
/** @ignore */
|
|
160
|
-
this.onRouteError =
|
|
161
|
-
options.onRouteError ||
|
|
162
|
-
((error) => {
|
|
163
|
-
this.dispatchEvent({
|
|
164
|
-
type: 'change:route',
|
|
165
|
-
target: this,
|
|
79
|
+
class RoutingControl extends ControlCommon {
|
|
80
|
+
constructor(options = {}) {
|
|
81
|
+
super(options);
|
|
82
|
+
this.viaPoints = [];
|
|
83
|
+
this.loading = false;
|
|
84
|
+
this.graphs = [];
|
|
85
|
+
this.modify = true;
|
|
86
|
+
this.useRawViaPoints = false;
|
|
87
|
+
this.snapToClosestStation = false;
|
|
88
|
+
this.cacheStationData = {};
|
|
89
|
+
this.abortControllers = {};
|
|
90
|
+
this.segments = [];
|
|
91
|
+
this.format = new GeoJSON({ featureProjection: 'EPSG:3857' });
|
|
92
|
+
this.initialRouteDrag = {};
|
|
93
|
+
Object.defineProperties(this, {
|
|
94
|
+
mot: {
|
|
95
|
+
get: () => this.get('mot'),
|
|
96
|
+
set: (newMot) => {
|
|
97
|
+
if (newMot) {
|
|
98
|
+
this.set('mot', newMot);
|
|
99
|
+
if (this.viaPoints) {
|
|
100
|
+
this.drawRoute();
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
},
|
|
104
|
+
},
|
|
105
|
+
loading: {
|
|
106
|
+
get: () => this.get('loading'),
|
|
107
|
+
set: (newLoading) => {
|
|
108
|
+
this.set('loading', newLoading);
|
|
109
|
+
},
|
|
110
|
+
},
|
|
111
|
+
modify: {
|
|
112
|
+
get: () => this.get('modify'),
|
|
113
|
+
set: (modify) => {
|
|
114
|
+
this.set('modify', modify);
|
|
115
|
+
},
|
|
116
|
+
},
|
|
166
117
|
});
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
*/
|
|
214
|
-
addViaPoint(
|
|
215
|
-
coordinatesOrString,
|
|
216
|
-
index = this.viaPoints.length,
|
|
217
|
-
overwrite = 0,
|
|
218
|
-
) {
|
|
219
|
-
/* Add/Insert/Overwrite viapoint and redraw route */
|
|
220
|
-
this.viaPoints.splice(index, overwrite, coordinatesOrString);
|
|
221
|
-
this.drawRoute();
|
|
222
|
-
this.dispatchEvent({
|
|
223
|
-
type: 'change:route',
|
|
224
|
-
target: this,
|
|
225
|
-
});
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
/**
|
|
229
|
-
* Removes a viaPoint at the passed array index and redraws route
|
|
230
|
-
* By default the last viaPoint is removed.
|
|
231
|
-
* @param {number} index Integer representing the index of the viaPoint to delete.
|
|
232
|
-
*/
|
|
233
|
-
removeViaPoint(index = this.viaPoints.length - 1) {
|
|
234
|
-
/* Remove viapoint and redraw route */
|
|
235
|
-
if (this.viaPoints.length && this.viaPoints[index]) {
|
|
236
|
-
this.viaPoints.splice(index, 1);
|
|
118
|
+
/** True if the control is requesting the backend. */
|
|
119
|
+
this.loading = false;
|
|
120
|
+
/** @ignore */
|
|
121
|
+
this.graphs = options.graphs || [['osm', 0, 99]];
|
|
122
|
+
/** @ignore */
|
|
123
|
+
this.mot = options.mot || 'bus';
|
|
124
|
+
/** @ignore */
|
|
125
|
+
this.modify = options.modify !== false;
|
|
126
|
+
/** @ignore */
|
|
127
|
+
this.routingApiParams = options.routingApiParams;
|
|
128
|
+
/** @ignore */
|
|
129
|
+
this.useRawViaPoints = options.useRawViaPoints || false;
|
|
130
|
+
/** @ignore */
|
|
131
|
+
this.snapToClosestStation = options.snapToClosestStation || false;
|
|
132
|
+
/** @ignore */
|
|
133
|
+
this.apiKey = options.apiKey;
|
|
134
|
+
/** @ignore */
|
|
135
|
+
this.stopsApiKey = options.stopsApiKey || this.apiKey;
|
|
136
|
+
/** @ignore */
|
|
137
|
+
this.stopsApiUrl = options.stopsApiUrl || 'https://api.geops.io/stops/v1/';
|
|
138
|
+
/** @ignore */
|
|
139
|
+
this.api = new RoutingAPI(Object.assign({}, options));
|
|
140
|
+
/** @ignore */
|
|
141
|
+
this.routingLayer =
|
|
142
|
+
options.routingLayer ||
|
|
143
|
+
new RoutingLayer({
|
|
144
|
+
name: 'routing-layer',
|
|
145
|
+
style: options.style,
|
|
146
|
+
});
|
|
147
|
+
/** @ignore */
|
|
148
|
+
this.onRouteError =
|
|
149
|
+
options.onRouteError ||
|
|
150
|
+
((error) => {
|
|
151
|
+
this.dispatchEvent(new BaseEvent('change:route'));
|
|
152
|
+
this.reset();
|
|
153
|
+
// eslint-disable-next-line no-console
|
|
154
|
+
console.error(error);
|
|
155
|
+
});
|
|
156
|
+
/** @ignore */
|
|
157
|
+
this.onMapClick = this.onMapClick.bind(this);
|
|
158
|
+
/** @ignore */
|
|
159
|
+
this.onModifyEnd = this.onModifyEnd.bind(this);
|
|
160
|
+
/** @ignore */
|
|
161
|
+
this.onModifyStart = this.onModifyStart.bind(this);
|
|
162
|
+
/** @ignore */
|
|
163
|
+
this.createModifyInteraction();
|
|
237
164
|
}
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
setViaPoints(coordinateArray) {
|
|
250
|
-
this.viaPoints = [...coordinateArray];
|
|
251
|
-
this.drawRoute();
|
|
252
|
-
this.dispatchEvent({
|
|
253
|
-
type: 'change:route',
|
|
254
|
-
target: this,
|
|
255
|
-
});
|
|
256
|
-
}
|
|
257
|
-
|
|
258
|
-
/**
|
|
259
|
-
* Removes all viaPoints, clears the source and triggers a change event
|
|
260
|
-
*/
|
|
261
|
-
reset() {
|
|
262
|
-
// Clear viaPoints and source
|
|
263
|
-
this.abortRequests();
|
|
264
|
-
this.viaPoints = [];
|
|
265
|
-
this.routingLayer.olLayer.getSource().clear();
|
|
266
|
-
this.dispatchEvent({
|
|
267
|
-
type: 'change:route',
|
|
268
|
-
target: this,
|
|
269
|
-
});
|
|
270
|
-
}
|
|
271
|
-
|
|
272
|
-
/**
|
|
273
|
-
* Aborts viapoint and route requests
|
|
274
|
-
* @private
|
|
275
|
-
*/
|
|
276
|
-
abortRequests() {
|
|
277
|
-
// Abort Routing API requests
|
|
278
|
-
this.graphs.forEach(([graph]) => {
|
|
279
|
-
if (this.abortControllers[graph]) {
|
|
280
|
-
this.abortControllers[graph].abort();
|
|
281
|
-
}
|
|
282
|
-
this.abortControllers[graph] = new AbortController();
|
|
283
|
-
});
|
|
284
|
-
|
|
285
|
-
// Abort Stops API requests
|
|
286
|
-
this.abortControllers[STOP_FETCH_ABORT_CONTROLLER_KEY]?.abort();
|
|
287
|
-
this.abortControllers[STOP_FETCH_ABORT_CONTROLLER_KEY] =
|
|
288
|
-
new AbortController();
|
|
289
|
-
|
|
290
|
-
this.loading = false;
|
|
291
|
-
}
|
|
292
|
-
|
|
293
|
-
/**
|
|
294
|
-
* Draws route on map using an array of coordinates:
|
|
295
|
-
* If a single coordinate is passed a single point feature is added to map.
|
|
296
|
-
* If two or more coordinates are passed a request to the RoutingAPI fetches
|
|
297
|
-
* the route using the passed coordinates and the current mot.
|
|
298
|
-
* @private
|
|
299
|
-
*/
|
|
300
|
-
drawRoute() {
|
|
301
|
-
/* Calls RoutingAPI to draw a route using the viaPoints array */
|
|
302
|
-
this.abortRequests();
|
|
303
|
-
this.routingLayer.olLayer.getSource().clear();
|
|
304
|
-
|
|
305
|
-
if (!this.viaPoints.length) {
|
|
306
|
-
return null;
|
|
165
|
+
/**
|
|
166
|
+
* Calculate at which resolutions corresponds each generalizations.
|
|
167
|
+
*
|
|
168
|
+
* @private
|
|
169
|
+
*/
|
|
170
|
+
static getGraphsResolutions(graphs, map) {
|
|
171
|
+
const view = map.getView();
|
|
172
|
+
return graphs.map(([, minZoom, maxZoom]) => [
|
|
173
|
+
view.getResolutionForZoom(minZoom),
|
|
174
|
+
view.getResolutionForZoom(maxZoom || minZoom + 1),
|
|
175
|
+
]);
|
|
307
176
|
}
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
177
|
+
/**
|
|
178
|
+
* Adds/Replaces a viaPoint to the viaPoints array and redraws route:
|
|
179
|
+
* Adds a viaPoint at end of array by default.
|
|
180
|
+
* If an index is passed a viaPoint is added at the specified index.
|
|
181
|
+
* If an index is passed and overwrite x is > 0, x viaPoints at the specified
|
|
182
|
+
* index are replaced with a single new viaPoint.
|
|
183
|
+
* @param {number[]|string} coordinates Array of coordinates
|
|
184
|
+
* @param {number} [index=-1] Integer representing the index of the added viaPoint. If not specified, the viaPoint is added at the end of the array.
|
|
185
|
+
* @param {number} [overwrite=0] Marks the number of viaPoints that are removed at the specified index on add.
|
|
186
|
+
*/
|
|
187
|
+
addViaPoint(coordinatesOrString, index = -1, overwrite = 0) {
|
|
188
|
+
/* Add/Insert/Overwrite viapoint and redraw route */
|
|
189
|
+
this.viaPoints.splice(index === -1 ? this.viaPoints.length : index, overwrite, coordinatesOrString);
|
|
190
|
+
this.drawRoute();
|
|
191
|
+
this.dispatchEvent(new BaseEvent('change:route'));
|
|
316
192
|
}
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
}
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
this.abortControllers[
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
this.
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
193
|
+
/**
|
|
194
|
+
* Removes a viaPoint at the passed array index and redraws route
|
|
195
|
+
* By default the last viaPoint is removed.
|
|
196
|
+
* @param {number} index Integer representing the index of the viaPoint to delete.
|
|
197
|
+
*/
|
|
198
|
+
removeViaPoint(index = (this.viaPoints || []).length - 1) {
|
|
199
|
+
/* Remove viapoint and redraw route */
|
|
200
|
+
if (this.viaPoints.length && this.viaPoints[index]) {
|
|
201
|
+
this.viaPoints.splice(index, 1);
|
|
202
|
+
}
|
|
203
|
+
this.drawRoute();
|
|
204
|
+
this.dispatchEvent(new BaseEvent('change:route'));
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Replaces the current viaPoints with a new coordinate array.
|
|
208
|
+
* @param {Array<Array<number>>} coordinateArray Array of nested coordinates
|
|
209
|
+
*/
|
|
210
|
+
setViaPoints(coordinateArray) {
|
|
211
|
+
this.viaPoints = [...coordinateArray];
|
|
212
|
+
this.drawRoute();
|
|
213
|
+
this.dispatchEvent(new BaseEvent('change:route'));
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Removes all viaPoints, clears the source and triggers a change event
|
|
217
|
+
*/
|
|
218
|
+
reset() {
|
|
219
|
+
var _a, _b, _c;
|
|
220
|
+
// Clear viaPoints and source
|
|
221
|
+
this.abortRequests();
|
|
222
|
+
this.viaPoints = [];
|
|
223
|
+
(_c = (_b = (_a = this.routingLayer) === null || _a === void 0 ? void 0 : _a.olLayer) === null || _b === void 0 ? void 0 : _b.getSource()) === null || _c === void 0 ? void 0 : _c.clear();
|
|
224
|
+
this.dispatchEvent(new BaseEvent('change:route'));
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Aborts viapoint and route requests
|
|
228
|
+
* @private
|
|
229
|
+
*/
|
|
230
|
+
abortRequests() {
|
|
231
|
+
var _a;
|
|
232
|
+
// Abort Routing API requests
|
|
233
|
+
this.graphs.forEach((graph) => {
|
|
234
|
+
const graphName = graph[0];
|
|
235
|
+
if (this.abortControllers[graphName]) {
|
|
236
|
+
this.abortControllers[graphName].abort();
|
|
237
|
+
}
|
|
238
|
+
this.abortControllers[graphName] = new AbortController();
|
|
239
|
+
});
|
|
240
|
+
// Abort Stops API requests
|
|
241
|
+
(_a = this.abortControllers[STOP_FETCH_ABORT_CONTROLLER_KEY]) === null || _a === void 0 ? void 0 : _a.abort();
|
|
242
|
+
this.abortControllers[STOP_FETCH_ABORT_CONTROLLER_KEY] =
|
|
243
|
+
new AbortController();
|
|
244
|
+
this.loading = false;
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Draws route on map using an array of coordinates:
|
|
248
|
+
* If a single coordinate is passed a single point feature is added to map.
|
|
249
|
+
* If two or more coordinates are passed a request to the RoutingAPI fetches
|
|
250
|
+
* the route using the passed coordinates and the current mot.
|
|
251
|
+
* @private
|
|
252
|
+
*/
|
|
253
|
+
drawRoute() {
|
|
254
|
+
var _a, _b, _c, _d, _e, _f;
|
|
255
|
+
/* Calls RoutingAPI to draw a route using the viaPoints array */
|
|
256
|
+
this.abortRequests();
|
|
257
|
+
(_c = (_b = (_a = this.routingLayer) === null || _a === void 0 ? void 0 : _a.olLayer) === null || _b === void 0 ? void 0 : _b.getSource()) === null || _c === void 0 ? void 0 : _c.clear();
|
|
258
|
+
if (!this.viaPoints.length) {
|
|
259
|
+
return null;
|
|
260
|
+
}
|
|
261
|
+
if (this.viaPoints.length === 1) {
|
|
262
|
+
// Add point for first node
|
|
263
|
+
return this.drawViaPoint(this.viaPoints[0], 0, this.abortControllers[STOP_FETCH_ABORT_CONTROLLER_KEY]);
|
|
264
|
+
}
|
|
265
|
+
const formattedViaPoints = this.viaPoints.map((viaPoint) => {
|
|
266
|
+
var _a;
|
|
267
|
+
if (Array.isArray(viaPoint)) {
|
|
268
|
+
const projection = (_a = this.map) === null || _a === void 0 ? void 0 : _a.getView().getProjection();
|
|
269
|
+
// viaPoint is a coordinate
|
|
270
|
+
// Coordinates need to be reversed as required by the backend RoutingAPI
|
|
271
|
+
const [lon, lat] = toLonLat(viaPoint, projection);
|
|
272
|
+
return this.snapToClosestStation ? [`@${lat}`, lon] : [lat, lon];
|
|
273
|
+
}
|
|
274
|
+
// viaPoint is a string to use as it is
|
|
275
|
+
return this.useRawViaPoints ? viaPoint : `!${viaPoint}`;
|
|
276
|
+
});
|
|
277
|
+
this.loading = true;
|
|
278
|
+
// Clear source
|
|
279
|
+
(_f = (_e = (_d = this.routingLayer) === null || _d === void 0 ? void 0 : _d.olLayer) === null || _e === void 0 ? void 0 : _e.getSource()) === null || _f === void 0 ? void 0 : _f.clear();
|
|
280
|
+
// Create point features for the viaPoints
|
|
281
|
+
this.viaPoints.forEach((viaPoint, idx) => this.drawViaPoint(viaPoint, idx, this.abortControllers[STOP_FETCH_ABORT_CONTROLLER_KEY]));
|
|
282
|
+
return Promise.all(this.graphs.map(([graph], index) => {
|
|
283
|
+
const { signal } = this.abortControllers[graph];
|
|
284
|
+
if (!this.api) {
|
|
285
|
+
return Promise.resolve([]);
|
|
286
|
+
}
|
|
287
|
+
return this.api
|
|
288
|
+
.route(Object.assign({ graph, via: `${formattedViaPoints.join('|')}`, mot: this.mot,
|
|
289
|
+
// @ts-ignore missing property in swagger
|
|
290
|
+
'resolve-hops': false, elevation: false, 'coord-radius': 100.0, 'coord-punish': 1000.0 }, (this.routingApiParams || {})), { signal })
|
|
291
|
+
.then((featureCollection) => {
|
|
292
|
+
var _a, _b, _c, _d;
|
|
293
|
+
this.segments = this.format.readFeatures(featureCollection);
|
|
294
|
+
if (this.mot === 'foot') {
|
|
295
|
+
// Extract unique values from viaPoint target value
|
|
296
|
+
const uniqueVias = this.segments.reduce((resultVias, currentFeat) => {
|
|
297
|
+
const segTrg = currentFeat.get('trg');
|
|
298
|
+
return resultVias.find((via) => via[0] === segTrg[0] && via[1] === segTrg[1])
|
|
299
|
+
? resultVias
|
|
300
|
+
: [...resultVias, segTrg];
|
|
301
|
+
}, []);
|
|
302
|
+
// Create LineString features from segments with same unique value
|
|
303
|
+
this.segments = uniqueVias.map((via) => {
|
|
304
|
+
const viaSegments = this.segments.filter((seg) => {
|
|
305
|
+
const segTrg = seg.get('trg');
|
|
306
|
+
return segTrg[0] === via[0] && segTrg[1] === via[1];
|
|
307
|
+
});
|
|
308
|
+
const coords = getFlatCoordinatesFromSegments(viaSegments);
|
|
309
|
+
return new Feature({
|
|
310
|
+
geometry: new LineString(coords),
|
|
311
|
+
});
|
|
312
|
+
});
|
|
313
|
+
}
|
|
314
|
+
// Create the new route. This route will be modifiable by the Modifiy interaction.
|
|
315
|
+
const coords = getFlatCoordinatesFromSegments(this.segments);
|
|
316
|
+
const routeFeature = new Feature({
|
|
317
|
+
geometry: new LineString(coords),
|
|
388
318
|
});
|
|
389
|
-
|
|
319
|
+
routeFeature.set('graph', graph);
|
|
320
|
+
routeFeature.set('mot', this.mot);
|
|
321
|
+
if (this.graphsResolutions &&
|
|
322
|
+
((_a = this.graphsResolutions[index]) === null || _a === void 0 ? void 0 : _a.length) >= 2) {
|
|
323
|
+
routeFeature.set('minResolution', this.graphsResolutions[index][0]);
|
|
324
|
+
routeFeature.set('maxResolution', this.graphsResolutions[index][1]);
|
|
325
|
+
}
|
|
326
|
+
(_d = (_c = (_b = this.routingLayer) === null || _b === void 0 ? void 0 : _b.olLayer) === null || _c === void 0 ? void 0 : _c.getSource()) === null || _d === void 0 ? void 0 : _d.addFeature(routeFeature);
|
|
327
|
+
this.loading = false;
|
|
328
|
+
})
|
|
329
|
+
.catch((error) => {
|
|
330
|
+
if (error.name === 'AbortError') {
|
|
331
|
+
// Ignore abort error
|
|
332
|
+
return;
|
|
333
|
+
}
|
|
334
|
+
this.segments = [];
|
|
335
|
+
// Dispatch error event and execute error function
|
|
336
|
+
this.dispatchEvent(new BaseEvent('error'));
|
|
337
|
+
this.onRouteError(error, this);
|
|
338
|
+
this.loading = false;
|
|
339
|
+
});
|
|
340
|
+
}));
|
|
341
|
+
}
|
|
342
|
+
/**
|
|
343
|
+
* Draw a via point. This function can parse all the possibilitiies
|
|
344
|
+
*
|
|
345
|
+
* @private
|
|
346
|
+
*/
|
|
347
|
+
drawViaPoint(viaPoint, idx, abortController) {
|
|
348
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l;
|
|
349
|
+
const pointFeature = new Feature();
|
|
350
|
+
pointFeature.set('viaPointIdx', idx);
|
|
351
|
+
// The via point is a coordinate using the current map's projection
|
|
352
|
+
if (Array.isArray(viaPoint)) {
|
|
353
|
+
pointFeature.setGeometry(new Point(viaPoint));
|
|
354
|
+
(_c = (_b = (_a = this.routingLayer) === null || _a === void 0 ? void 0 : _a.olLayer) === null || _b === void 0 ? void 0 : _b.getSource()) === null || _c === void 0 ? void 0 : _c.addFeature(pointFeature);
|
|
355
|
+
return Promise.resolve(pointFeature);
|
|
356
|
+
}
|
|
357
|
+
// Possibility to parse:
|
|
358
|
+
//
|
|
359
|
+
// !8596126 a station with id 8596126
|
|
360
|
+
// !8596126$4 a station with id 8596126
|
|
361
|
+
if (!this.useRawViaPoints || REGEX_VIA_POINT_STATION_ID.test(viaPoint)) {
|
|
362
|
+
let stationId;
|
|
363
|
+
let track;
|
|
364
|
+
if (this.useRawViaPoints) {
|
|
365
|
+
[, stationId, , track] =
|
|
366
|
+
REGEX_VIA_POINT_STATION_ID.exec(viaPoint) || [];
|
|
367
|
+
}
|
|
368
|
+
else {
|
|
369
|
+
[stationId, track] = viaPoint.split('$');
|
|
390
370
|
}
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
371
|
+
return fetch(`${this.stopsApiUrl}lookup/${stationId}?key=${this.stopsApiKey}`, { signal: abortController.signal })
|
|
372
|
+
.then((res) => res.json())
|
|
373
|
+
.then((stationData) => {
|
|
374
|
+
var _a, _b, _c;
|
|
375
|
+
const { coordinates } = stationData.features[0].geometry;
|
|
376
|
+
this.cacheStationData[viaPoint] = fromLonLat(coordinates);
|
|
377
|
+
pointFeature.set('viaPointTrack', track);
|
|
378
|
+
pointFeature.setGeometry(new Point(fromLonLat(coordinates)));
|
|
379
|
+
(_c = (_b = (_a = this.routingLayer) === null || _a === void 0 ? void 0 : _a.olLayer) === null || _b === void 0 ? void 0 : _b.getSource()) === null || _c === void 0 ? void 0 : _c.addFeature(pointFeature);
|
|
380
|
+
return pointFeature;
|
|
381
|
+
})
|
|
382
|
+
.catch((error) => {
|
|
383
|
+
if (error.name === 'AbortError') {
|
|
384
|
+
// Ignore abort error
|
|
385
|
+
return;
|
|
386
|
+
}
|
|
387
|
+
// Dispatch error event and execute error function
|
|
388
|
+
this.dispatchEvent(new BaseEvent('error'));
|
|
389
|
+
this.onRouteError(error, this);
|
|
390
|
+
this.loading = false;
|
|
397
391
|
});
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
392
|
+
}
|
|
393
|
+
// Only when this.useRawViaPoints is true.
|
|
394
|
+
// Possibility to parse:
|
|
395
|
+
//
|
|
396
|
+
// 47.37811,8.53935 a position 47.37811, 8.53935
|
|
397
|
+
if (this.useRawViaPoints && REGEX_VIA_POINT_COORD.test(viaPoint)) {
|
|
398
|
+
const [lat, lon] = REGEX_VIA_POINT_COORD.exec(viaPoint) || [];
|
|
399
|
+
if (lon && lat) {
|
|
400
|
+
const floatLon = parseFloat(lon);
|
|
401
|
+
const floatLat = parseFloat(lat);
|
|
402
|
+
const coordinates = fromLonLat([floatLon, floatLat], (_d = this.map) === null || _d === void 0 ? void 0 : _d.getView().getProjection());
|
|
403
|
+
pointFeature.setGeometry(new Point(coordinates));
|
|
404
|
+
(_g = (_f = (_e = this.routingLayer) === null || _e === void 0 ? void 0 : _e.olLayer) === null || _f === void 0 ? void 0 : _f.getSource()) === null || _g === void 0 ? void 0 : _g.addFeature(pointFeature);
|
|
405
|
+
return Promise.resolve(pointFeature);
|
|
409
406
|
}
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
407
|
+
}
|
|
408
|
+
// Only when this.useRawViaPoints is true.
|
|
409
|
+
// It will parse the via point to find some name, id, track coordinates.
|
|
410
|
+
//
|
|
411
|
+
// Possibility to parse:
|
|
412
|
+
//
|
|
413
|
+
// @47.37811,8.53935 a station at position 47.37811, 8.53935
|
|
414
|
+
// @47.37811,8.53935$4 track 4 in a station at position 47.37811, 8.53935
|
|
415
|
+
// zürich hb@47.37811,8.53935$8 track 8 in station "Zürich HB" at position 47.37811, 8.53935
|
|
416
|
+
const [, stationName, , lat, lon, , track] = REGEX_VIA_POINT.exec(viaPoint) || [];
|
|
417
|
+
if (lon && lat) {
|
|
418
|
+
const coordinates = fromLonLat([parseFloat(lon), parseFloat(lat)], (_h = this.map) === null || _h === void 0 ? void 0 : _h.getView().getProjection());
|
|
419
|
+
pointFeature.set('viaPointTrack', track);
|
|
420
|
+
pointFeature.setGeometry(new Point(coordinates));
|
|
421
|
+
(_l = (_k = (_j = this.routingLayer) === null || _j === void 0 ? void 0 : _j.olLayer) === null || _k === void 0 ? void 0 : _k.getSource()) === null || _l === void 0 ? void 0 : _l.addFeature(pointFeature);
|
|
422
|
+
return Promise.resolve(pointFeature);
|
|
423
|
+
}
|
|
424
|
+
if (stationName) {
|
|
425
|
+
return fetch(`${this.stopsApiUrl}?key=${this.stopsApiKey}&q=${stationName}&limit=1`, { signal: abortController.signal })
|
|
426
|
+
.then((res) => res.json())
|
|
427
|
+
.then((stationData) => {
|
|
428
|
+
var _a, _b, _c;
|
|
429
|
+
const { coordinates } = stationData.features[0].geometry;
|
|
430
|
+
this.cacheStationData[viaPoint] = fromLonLat(coordinates);
|
|
431
|
+
pointFeature.set('viaPointTrack', track);
|
|
432
|
+
pointFeature.setGeometry(new Point(fromLonLat(coordinates)));
|
|
433
|
+
(_c = (_b = (_a = this.routingLayer) === null || _a === void 0 ? void 0 : _a.olLayer) === null || _b === void 0 ? void 0 : _b.getSource()) === null || _c === void 0 ? void 0 : _c.addFeature(pointFeature);
|
|
434
|
+
return pointFeature;
|
|
435
|
+
})
|
|
436
|
+
.catch((error) => {
|
|
437
|
+
// Dispatch error event and execute error function
|
|
438
|
+
this.dispatchEvent(new BaseEvent('error'));
|
|
439
|
+
this.onRouteError(error, this);
|
|
440
|
+
this.loading = false;
|
|
441
|
+
return null;
|
|
415
442
|
});
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
});
|
|
419
|
-
}),
|
|
420
|
-
);
|
|
421
|
-
}
|
|
422
|
-
|
|
423
|
-
/**
|
|
424
|
-
* Draw a via point. This function can parse all the possibilitiies
|
|
425
|
-
*
|
|
426
|
-
* @private
|
|
427
|
-
*/
|
|
428
|
-
drawViaPoint(viaPoint, idx, abortController) {
|
|
429
|
-
const pointFeature = new Feature();
|
|
430
|
-
pointFeature.set('viaPointIdx', idx);
|
|
431
|
-
|
|
432
|
-
// The via point is a coordinate using the current map's projection
|
|
433
|
-
if (Array.isArray(viaPoint)) {
|
|
434
|
-
pointFeature.setGeometry(new Point(viaPoint));
|
|
435
|
-
this.routingLayer.olLayer.getSource().addFeature(pointFeature);
|
|
436
|
-
return Promise.resolve(pointFeature);
|
|
443
|
+
}
|
|
444
|
+
return Promise.resolve(null);
|
|
437
445
|
}
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
}
|
|
451
|
-
|
|
452
|
-
return fetch(
|
|
453
|
-
`${this.stopsApiUrl}lookup/${stationId}?key=${this.stopsApiKey}`,
|
|
454
|
-
{ signal: abortController.signal },
|
|
455
|
-
)
|
|
456
|
-
.then((res) => res.json())
|
|
457
|
-
.then((stationData) => {
|
|
458
|
-
const { coordinates } = stationData.features[0].geometry;
|
|
459
|
-
this.cacheStationData[viaPoint] = fromLonLat(coordinates);
|
|
460
|
-
pointFeature.set('viaPointTrack', track);
|
|
461
|
-
pointFeature.setGeometry(new Point(fromLonLat(coordinates)));
|
|
462
|
-
this.routingLayer.olLayer.getSource().addFeature(pointFeature);
|
|
463
|
-
return pointFeature;
|
|
464
|
-
})
|
|
465
|
-
.catch((error) => {
|
|
466
|
-
if (error.name === 'AbortError') {
|
|
467
|
-
// Ignore abort error
|
|
468
|
-
return;
|
|
469
|
-
}
|
|
470
|
-
// Dispatch error event and execute error function
|
|
471
|
-
this.dispatchEvent({
|
|
472
|
-
type: 'error',
|
|
473
|
-
target: this,
|
|
474
|
-
});
|
|
475
|
-
this.onRouteError(error, this);
|
|
476
|
-
this.loading = false;
|
|
446
|
+
/**
|
|
447
|
+
* Used on click on map while control is active:
|
|
448
|
+
* By default adds a viaPoint to the end of array.
|
|
449
|
+
* If an existing viaPoint is clicked removes the clicked viaPoint.
|
|
450
|
+
* @private
|
|
451
|
+
*/
|
|
452
|
+
onMapClick(evt) {
|
|
453
|
+
const feats = evt.target.getFeaturesAtPixel(evt.pixel);
|
|
454
|
+
const viaPoint = feats.find((feat) => {
|
|
455
|
+
var _a;
|
|
456
|
+
return ((_a = feat.getGeometry()) === null || _a === void 0 ? void 0 : _a.getType()) === 'Point' &&
|
|
457
|
+
feat.get('viaPointIdx') !== undefined;
|
|
477
458
|
});
|
|
459
|
+
if (viaPoint) {
|
|
460
|
+
// Remove existing viaPoint on click and abort viaPoint add
|
|
461
|
+
this.removeViaPoint(viaPoint.get('viaPointIdx'));
|
|
462
|
+
return;
|
|
463
|
+
}
|
|
464
|
+
this.addViaPoint(evt.coordinate);
|
|
478
465
|
}
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
466
|
+
/**
|
|
467
|
+
* Used on start of the modify interaction. Stores relevant data
|
|
468
|
+
* in this.initialRouteDrag object
|
|
469
|
+
* @private
|
|
470
|
+
*/
|
|
471
|
+
onModifyStart(evt) {
|
|
472
|
+
var _a;
|
|
473
|
+
// When modify start, we search the index of the segment that is modifying.
|
|
474
|
+
let segmentIndex = -1;
|
|
475
|
+
const route = evt.features
|
|
476
|
+
.getArray()
|
|
477
|
+
.find((feat) => { var _a; return ((_a = feat.getGeometry()) === null || _a === void 0 ? void 0 : _a.getType()) === 'LineString'; });
|
|
478
|
+
// Find the segment index that is being modified
|
|
479
|
+
if (route && route.getGeometry() && evt.mapBrowserEvent.coordinate) {
|
|
480
|
+
// We use a buff extent to fix floating issues , see https://github.com/openlayers/openlayers/issues/7130#issuecomment-535856422
|
|
481
|
+
const closestExtent = buffer(new Point(
|
|
482
|
+
// @ts-ignore
|
|
483
|
+
(_a = route.getGeometry()) === null || _a === void 0 ? void 0 : _a.getClosestPoint(evt.mapBrowserEvent.coordinate)).getExtent(), 0.001);
|
|
484
|
+
segmentIndex = this.segments.findIndex((segment) => { var _a; return (_a = segment.getGeometry()) === null || _a === void 0 ? void 0 : _a.intersectsExtent(closestExtent); });
|
|
485
|
+
}
|
|
486
|
+
// Find the viaPoint that is being modified
|
|
487
|
+
const viaPoint = (evt.features
|
|
488
|
+
.getArray()
|
|
489
|
+
.filter((feat) => { var _a; return ((_a = feat.getGeometry()) === null || _a === void 0 ? void 0 : _a.getType()) === 'Point'; }) ||
|
|
490
|
+
[])[0];
|
|
491
|
+
// Write object with modify info
|
|
492
|
+
/** @ignore */
|
|
493
|
+
this.initialRouteDrag = {
|
|
494
|
+
viaPoint,
|
|
495
|
+
oldRoute: route && route.clone(),
|
|
496
|
+
segmentIndex,
|
|
497
|
+
};
|
|
493
498
|
}
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
499
|
+
/**
|
|
500
|
+
* Used on end of the modify interaction. Resolves feature modification:
|
|
501
|
+
* Line drag creates new viaPoint at the final coordinate of drag.
|
|
502
|
+
* Point drag replaces old viaPoint.
|
|
503
|
+
* @private
|
|
504
|
+
*/
|
|
505
|
+
onModifyEnd(evt) {
|
|
506
|
+
const coord = evt.mapBrowserEvent.coordinate;
|
|
507
|
+
const { oldRoute, viaPoint, segmentIndex } = this.initialRouteDrag || {};
|
|
508
|
+
// If viaPoint is being relocated overwrite the old viaPoint
|
|
509
|
+
if (viaPoint) {
|
|
510
|
+
return this.addViaPoint(coord, viaPoint.get('viaPointIdx'), 1);
|
|
511
|
+
}
|
|
512
|
+
// In case there is no route overwrite first coordinate
|
|
513
|
+
if (!oldRoute) {
|
|
514
|
+
return this.addViaPoint(coord, 0, 1);
|
|
515
|
+
}
|
|
516
|
+
// We can't add a via point because we haven't found which segment has been modified.
|
|
517
|
+
if (segmentIndex === -1) {
|
|
518
|
+
return Promise.reject(new Error('No segment found'));
|
|
519
|
+
}
|
|
520
|
+
// Insert new viaPoint at the modified segment index + 1
|
|
521
|
+
return this.addViaPoint(coord, (segmentIndex || 0) + 1);
|
|
514
522
|
}
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
.
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
.catch((error) => {
|
|
531
|
-
// Dispatch error event and execute error function
|
|
532
|
-
this.dispatchEvent({
|
|
533
|
-
type: 'error',
|
|
534
|
-
target: this,
|
|
535
|
-
});
|
|
536
|
-
this.onRouteError(error, this);
|
|
537
|
-
this.loading = false;
|
|
538
|
-
return null;
|
|
523
|
+
/**
|
|
524
|
+
* Define a default element.
|
|
525
|
+
*
|
|
526
|
+
* @private
|
|
527
|
+
*/
|
|
528
|
+
createDefaultElement() {
|
|
529
|
+
/** @ignore */
|
|
530
|
+
this.element = document.createElement('button');
|
|
531
|
+
this.element.id = 'ol-toggle-routing';
|
|
532
|
+
this.element.innerHTML = 'Toggle Route Control';
|
|
533
|
+
this.element.onclick = () => this.active ? this.deactivate() : this.activate();
|
|
534
|
+
Object.assign(this.element.style, {
|
|
535
|
+
position: 'absolute',
|
|
536
|
+
right: '10px',
|
|
537
|
+
top: '10px',
|
|
539
538
|
});
|
|
540
539
|
}
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
onModifyStart(evt) {
|
|
573
|
-
// When modify start, we search the index of the segment that is modifying.
|
|
574
|
-
let segmentIndex = -1;
|
|
575
|
-
const route = evt.features
|
|
576
|
-
.getArray()
|
|
577
|
-
.find((feat) => feat.getGeometry() instanceof LineString);
|
|
578
|
-
|
|
579
|
-
// Find the segment index that is being modified
|
|
580
|
-
if (route) {
|
|
581
|
-
// We use a buff extent to fix floating issues , see https://github.com/openlayers/openlayers/issues/7130#issuecomment-535856422
|
|
582
|
-
const closestExtent = buffer(
|
|
583
|
-
new Point(
|
|
584
|
-
route.getGeometry().getClosestPoint(evt.mapBrowserEvent.coordinate),
|
|
585
|
-
).getExtent(),
|
|
586
|
-
0.001,
|
|
587
|
-
);
|
|
588
|
-
|
|
589
|
-
segmentIndex = this.segments.findIndex((segment) =>
|
|
590
|
-
segment.getGeometry().intersectsExtent(closestExtent),
|
|
591
|
-
);
|
|
592
|
-
}
|
|
593
|
-
|
|
594
|
-
// Find the viaPoint that is being modified
|
|
595
|
-
const viaPoint = (evt.features
|
|
596
|
-
.getArray()
|
|
597
|
-
.filter((feat) => feat.getGeometry() instanceof Point) || [])[0];
|
|
598
|
-
|
|
599
|
-
// Write object with modify info
|
|
600
|
-
/** @ignore */
|
|
601
|
-
this.initialRouteDrag = {
|
|
602
|
-
viaPoint,
|
|
603
|
-
oldRoute: route && route.clone(),
|
|
604
|
-
segmentIndex,
|
|
605
|
-
};
|
|
606
|
-
}
|
|
607
|
-
|
|
608
|
-
/**
|
|
609
|
-
* Used on end of the modify interaction. Resolves feature modification:
|
|
610
|
-
* Line drag creates new viaPoint at the final coordinate of drag.
|
|
611
|
-
* Point drag replaces old viaPoint.
|
|
612
|
-
* @private
|
|
613
|
-
*/
|
|
614
|
-
onModifyEnd(evt) {
|
|
615
|
-
const coord = evt.mapBrowserEvent.coordinate;
|
|
616
|
-
const { oldRoute, viaPoint, segmentIndex } = this.initialRouteDrag;
|
|
617
|
-
|
|
618
|
-
// If viaPoint is being relocated overwrite the old viaPoint
|
|
619
|
-
if (viaPoint) {
|
|
620
|
-
return this.addViaPoint(coord, viaPoint.get('viaPointIdx'), 1);
|
|
621
|
-
}
|
|
622
|
-
|
|
623
|
-
// In case there is no route overwrite first coordinate
|
|
624
|
-
if (!oldRoute) {
|
|
625
|
-
return this.addViaPoint(coord, 0, 1);
|
|
540
|
+
/**
|
|
541
|
+
* Create the interaction used to modify vertexes of features.
|
|
542
|
+
* @private
|
|
543
|
+
*/
|
|
544
|
+
createModifyInteraction() {
|
|
545
|
+
var _a, _b, _c;
|
|
546
|
+
/**
|
|
547
|
+
* @type {ol.interaction.Modify}
|
|
548
|
+
* @private
|
|
549
|
+
*/
|
|
550
|
+
// Define and add modify interaction
|
|
551
|
+
this.modifyInteraction = new Modify({
|
|
552
|
+
source: ((_b = (_a = this.routingLayer) === null || _a === void 0 ? void 0 : _a.olLayer) === null || _b === void 0 ? void 0 : _b.getSource()) || undefined,
|
|
553
|
+
pixelTolerance: 4,
|
|
554
|
+
hitDetection: (_c = this.routingLayer) === null || _c === void 0 ? void 0 : _c.olLayer,
|
|
555
|
+
deleteCondition: (e) => {
|
|
556
|
+
const feats = e.target.getFeaturesAtPixel(e.pixel, {
|
|
557
|
+
hitTolerance: 5,
|
|
558
|
+
});
|
|
559
|
+
const viaPoint = feats.find((feat) => { var _a; return ((_a = feat.getGeometry()) === null || _a === void 0 ? void 0 : _a.getType()) === 'Point' && feat.get('index'); });
|
|
560
|
+
if (click(e) && viaPoint) {
|
|
561
|
+
// Remove node & viaPoint if an existing viaPoint was clicked
|
|
562
|
+
this.removeViaPoint(viaPoint.get('index'));
|
|
563
|
+
return true;
|
|
564
|
+
}
|
|
565
|
+
return false;
|
|
566
|
+
},
|
|
567
|
+
});
|
|
568
|
+
this.modifyInteraction.on('modifystart', this.onModifyStart);
|
|
569
|
+
this.modifyInteraction.on('modifyend', this.onModifyEnd);
|
|
570
|
+
this.modifyInteraction.setActive(false);
|
|
626
571
|
}
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
572
|
+
/**
|
|
573
|
+
* Add click listener to map.
|
|
574
|
+
* @private
|
|
575
|
+
*/
|
|
576
|
+
addListeners() {
|
|
577
|
+
var _a;
|
|
578
|
+
if (!this.modify) {
|
|
579
|
+
return;
|
|
580
|
+
}
|
|
581
|
+
this.removeListeners();
|
|
582
|
+
/** @ignore */
|
|
583
|
+
this.onMapClickKey = (_a = this.map) === null || _a === void 0 ? void 0 : _a.on('singleclick', this.onMapClick);
|
|
631
584
|
}
|
|
632
|
-
|
|
633
|
-
// Insert new viaPoint at the modified segment index + 1
|
|
634
|
-
return this.addViaPoint(coord, segmentIndex + 1);
|
|
635
|
-
}
|
|
636
|
-
|
|
637
|
-
/**
|
|
638
|
-
* Define a default element.
|
|
639
|
-
*
|
|
640
|
-
* @private
|
|
641
|
-
*/
|
|
642
|
-
createDefaultElement() {
|
|
643
|
-
/** @ignore */
|
|
644
|
-
this.element = document.createElement('button');
|
|
645
|
-
this.element.id = 'ol-toggle-routing';
|
|
646
|
-
this.element.innerHTML = 'Toggle Route Control';
|
|
647
|
-
this.element.onclick = () =>
|
|
648
|
-
this.active ? this.deactivate() : this.activate();
|
|
649
|
-
Object.assign(this.element.style, {
|
|
650
|
-
position: 'absolute',
|
|
651
|
-
right: '10px',
|
|
652
|
-
top: '10px',
|
|
653
|
-
});
|
|
654
|
-
}
|
|
655
|
-
|
|
656
|
-
/**
|
|
657
|
-
* Create the interaction used to modify vertexes of features.
|
|
658
|
-
* @private
|
|
659
|
-
*/
|
|
660
|
-
createModifyInteraction() {
|
|
661
585
|
/**
|
|
662
|
-
*
|
|
586
|
+
* Remove click listener from map.
|
|
663
587
|
* @private
|
|
664
588
|
*/
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
pixelTolerance: 4,
|
|
669
|
-
hitDetection: this.routingLayer.olLayer,
|
|
670
|
-
deleteCondition: (e) => {
|
|
671
|
-
const feats = e.target.getFeaturesAtPixel(e.pixel, {
|
|
672
|
-
hitTolerance: 5,
|
|
673
|
-
});
|
|
674
|
-
const viaPoint = feats.find(
|
|
675
|
-
(feat) => feat.getGeometry() instanceof Point && feat.get('index'),
|
|
676
|
-
);
|
|
677
|
-
if (click(e) && viaPoint) {
|
|
678
|
-
// Remove node & viaPoint if an existing viaPoint was clicked
|
|
679
|
-
this.removeViaPoint(viaPoint.get('index'));
|
|
680
|
-
return true;
|
|
589
|
+
removeListeners() {
|
|
590
|
+
if (this.onMapClickKey) {
|
|
591
|
+
unByKey(this.onMapClickKey);
|
|
681
592
|
}
|
|
682
|
-
return false;
|
|
683
|
-
},
|
|
684
|
-
});
|
|
685
|
-
this.modifyInteraction.on('modifystart', this.onModifyStart);
|
|
686
|
-
this.modifyInteraction.on('modifyend', this.onModifyEnd);
|
|
687
|
-
this.modifyInteraction.setActive(false);
|
|
688
|
-
}
|
|
689
|
-
|
|
690
|
-
/**
|
|
691
|
-
* Add click listener to map.
|
|
692
|
-
* @private
|
|
693
|
-
*/
|
|
694
|
-
addListeners() {
|
|
695
|
-
if (!this.modify) {
|
|
696
|
-
return;
|
|
697
593
|
}
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
this.graphsResolutions = RoutingControl.getGraphsResolutions(
|
|
721
|
-
this.graphs,
|
|
722
|
-
this.map,
|
|
723
|
-
);
|
|
724
|
-
|
|
725
|
-
// Clean the modifyInteraction if present
|
|
726
|
-
this.map.removeInteraction(this.modifyInteraction);
|
|
727
|
-
|
|
728
|
-
// Add modify interaction, RoutingLayer and listeners
|
|
729
|
-
this.routingLayer.init(this.map);
|
|
730
|
-
this.map.addInteraction(this.modifyInteraction);
|
|
731
|
-
this.modifyInteraction.setActive(this.modify);
|
|
732
|
-
this.addListeners();
|
|
733
|
-
} else {
|
|
734
|
-
// fall back to some default values if map is not available
|
|
735
|
-
this.format = new GeoJSON({ featureProjection: 'EPSG:3857' });
|
|
736
|
-
this.graphsResolutions = this.graphs;
|
|
594
|
+
activate() {
|
|
595
|
+
var _a, _b;
|
|
596
|
+
super.activate();
|
|
597
|
+
if (this.map) {
|
|
598
|
+
/** @ignore */
|
|
599
|
+
this.format = new GeoJSON({
|
|
600
|
+
featureProjection: this.map.getView().getProjection(),
|
|
601
|
+
});
|
|
602
|
+
/** @ignore */
|
|
603
|
+
this.graphsResolutions = RoutingControl.getGraphsResolutions(this.graphs, this.map);
|
|
604
|
+
// Clean the modifyInteraction if present
|
|
605
|
+
if (this.modifyInteraction) {
|
|
606
|
+
this.map.removeInteraction(this.modifyInteraction);
|
|
607
|
+
}
|
|
608
|
+
// Add modify interaction, RoutingLayer and listeners
|
|
609
|
+
(_a = this.routingLayer) === null || _a === void 0 ? void 0 : _a.attachToMap(this.map);
|
|
610
|
+
if (this.modifyInteraction) {
|
|
611
|
+
this.map.addInteraction(this.modifyInteraction);
|
|
612
|
+
}
|
|
613
|
+
(_b = this.modifyInteraction) === null || _b === void 0 ? void 0 : _b.setActive(this.modify);
|
|
614
|
+
this.addListeners();
|
|
615
|
+
}
|
|
737
616
|
}
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
617
|
+
deactivate() {
|
|
618
|
+
var _a;
|
|
619
|
+
if (this.map) {
|
|
620
|
+
// Remove modify interaction, RoutingLayer, listeners and viaPoints
|
|
621
|
+
(_a = this.routingLayer) === null || _a === void 0 ? void 0 : _a.detachFromMap();
|
|
622
|
+
if (this.modifyInteraction) {
|
|
623
|
+
this.map.removeInteraction(this.modifyInteraction);
|
|
624
|
+
}
|
|
625
|
+
this.removeListeners();
|
|
626
|
+
this.reset();
|
|
627
|
+
}
|
|
747
628
|
}
|
|
748
|
-
|
|
749
|
-
}
|
|
629
|
+
render() { }
|
|
750
630
|
}
|
|
751
|
-
|
|
752
631
|
export default RoutingControl;
|