mobility-toolbox-js 2.0.0-beta.1 → 2.0.0-beta.6
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/.babelrc +6 -0
- package/.esdoc.json +17 -0
- package/.eslintignore +1 -0
- package/.github/workflows/conventional-pr-title.yml +21 -0
- package/.github/workflows/cypress.yml +29 -0
- package/.github/workflows/nodejs.yml +28 -0
- package/.husky/commit-msg +4 -0
- package/.husky/post-checkout +4 -0
- package/.husky/post-merge +4 -0
- package/.husky/post-rebase +4 -0
- package/.husky/pre-commit +4 -0
- package/.neutrinorc.js +176 -0
- package/.nvmrc +1 -0
- package/CHANGELOG.md +10 -0
- package/LICENSE +21 -0
- package/Layer.js +2 -0
- package/Layer.js.map +7 -0
- package/README.md +7 -4
- package/__mocks__/mapbox-gl.js +81 -0
- package/__mocks__/maplibre-gl.js +81 -0
- package/commitlint.config.js +1 -0
- package/cypress/fixtures/example.json +5 -0
- package/cypress/integration/examples/api.spec.js +7 -0
- package/cypress/integration/examples/examples.spec.js +7 -0
- package/cypress/integration/examples/navigation.spec.js +29 -0
- package/cypress/plugins/index.js +21 -0
- package/cypress/support/commands.js +25 -0
- package/cypress/support/index.js +20 -0
- package/cypress.json +4 -0
- package/data/fetchRoute.json +292 -0
- package/data/fetchTrajectories.json +18 -0
- package/data/fetchTrajectoryById.json +3 -0
- package/data/fetchTrajectoryStations.json +18 -0
- package/data/stopsSearch.json +15 -0
- package/documentation.yml +4 -0
- package/esdoc/README.md +27 -0
- package/esdoc/plugins/MyPlugin.js +69 -0
- package/esdoc/plugins/dynamic-property-plugin/Plugin.js +50 -0
- package/esdoc/plugins/externals-plugin/Plugin.js +45 -0
- package/esdoc/plugins/externals-plugin/externals.js +96 -0
- package/global-setup.js +3 -0
- package/{ol/README.md → index.html} +0 -0
- package/indexweb.html +49 -0
- package/jest.config.js +5 -0
- package/package.json +34 -13
- package/pull_request_template.md +17 -0
- package/renovate.json +4 -0
- package/scripts/read-pkg-json.js +22 -0
- package/{api → src/api}/index.js +0 -1
- package/{api → src/api}/routing/RoutingAPI.js +0 -0
- package/{api → src/api}/routing/RoutingAPI.test.js +0 -0
- package/{api → src/api}/stops/StopsAPI.js +0 -0
- package/{api → src/api}/stops/StopsAPI.test.js +0 -0
- package/{api → src/api}/tralis/TralisAPI.js +1 -1
- package/{api → src/api}/tralis/TralisAPI.test.js +0 -0
- package/{api → src/api}/tralis/TralisAPIUtils.js +0 -0
- package/{api → src/api}/tralis/WebSocketConnector.js +0 -0
- package/{api → src/api}/tralis/WebSocketConnector.test.js +0 -0
- package/{api → src/api}/tralis/typedefs.js +0 -0
- package/src/assets/Lato-Black.ttf +0 -0
- package/src/assets/Lato-BlackItalic.ttf +0 -0
- package/src/assets/Lato-Bold.ttf +0 -0
- package/src/assets/Lato-BoldItalic.ttf +0 -0
- package/src/assets/Lato-Italic.ttf +0 -0
- package/src/assets/Lato-Light.ttf +0 -0
- package/src/assets/Lato-LightItalic.ttf +0 -0
- package/src/assets/Lato-Regular.ttf +0 -0
- package/src/assets/Lato-Thin.ttf +0 -0
- package/src/assets/Lato-ThinItalic.ttf +0 -0
- package/src/assets/OFL.txt +93 -0
- package/{common → src/common}/Tracker.js +0 -0
- package/{common → src/common}/api/api.js +0 -0
- package/{common → src/common}/api/api.test.js +0 -0
- package/{common → src/common}/controls/Control.js +4 -1
- package/{common → src/common}/controls/Control.test.js +0 -0
- package/{common → src/common}/layers/Layer.js +18 -49
- package/{common → src/common}/layers/Layer.test.js +2 -106
- package/{common → src/common}/mixins/CopyrightMixin.js +0 -0
- package/{common → src/common}/mixins/SearchMixin.js +1 -1
- package/{common/mixins/TrackerLayerMixin.js → src/common/mixins/TralisLayerMixin.js} +380 -195
- package/src/common/styles/index.js +4 -0
- package/{common/utils/delayTrackerStyle.js → src/common/styles/trackerDefaultStyle.js} +8 -8
- package/src/common/styles/trackerDelayStyle.js +17 -0
- package/src/common/styles/trackerSimpleStyle.js +22 -0
- package/{common → src/common}/trackerConfig.js +0 -0
- package/{common → src/common}/trackerConfig.test.js +0 -13
- package/{common → src/common}/typedefs.js +0 -0
- package/{common → src/common}/utils/createTrackerFilters.js +0 -0
- package/{common → src/common}/utils/createTrackerFilters.test.js +0 -0
- package/{common → src/common}/utils/getMapboxMapCopyrights.js +1 -0
- package/{common → src/common}/utils/getMapboxMapCopyrights.test.js +0 -0
- package/{common → src/common}/utils/getMapboxStyleUrl.js +0 -0
- package/{common → src/common}/utils/getVehiclePosition.js +0 -0
- package/{common → src/common}/utils/index.js +2 -3
- package/{common → src/common}/utils/removeDuplicate.js +0 -0
- package/{common → src/common}/utils/removeDuplicate.test.js +0 -0
- package/src/common/utils/sortByDelay.js +23 -0
- package/{common → src/common}/utils/timeUtils.js +0 -0
- package/{common → src/common}/utils/timeUtils.test.js +0 -0
- package/src/doc/App.js +116 -0
- package/src/doc/App.scss +51 -0
- package/src/doc/_redirects +2 -0
- package/src/doc/components/CodeSandboxButton.js +103 -0
- package/src/doc/components/Documentation.js +40 -0
- package/src/doc/components/Esdoc/Anchor.js +57 -0
- package/src/doc/components/Esdoc/ClassDoc.js +272 -0
- package/src/doc/components/Esdoc/DeprecatedHTML.js +16 -0
- package/src/doc/components/Esdoc/DetailDocs.js +281 -0
- package/src/doc/components/Esdoc/DetailHTML.js +33 -0
- package/src/doc/components/Esdoc/DirectSubclassHTML.js +30 -0
- package/src/doc/components/Esdoc/DocBuilderUtils.js +694 -0
- package/src/doc/components/Esdoc/DocLinkHTML.js +62 -0
- package/src/doc/components/Esdoc/DocsLinkHTML.js +38 -0
- package/src/doc/components/Esdoc/Esdoc.js +63 -0
- package/src/doc/components/Esdoc/EsdocContent.js +51 -0
- package/src/doc/components/Esdoc/EsdocNavigation.js +13 -0
- package/src/doc/components/Esdoc/EsdocSearch.js +81 -0
- package/src/doc/components/Esdoc/ExperimentalHTML.js +17 -0
- package/src/doc/components/Esdoc/ExtendsChainHTML.js +32 -0
- package/src/doc/components/Esdoc/FileDocLinkHTML.js +60 -0
- package/src/doc/components/Esdoc/IdentifiersDoc.js +113 -0
- package/src/doc/components/Esdoc/IndirectSubclassHTML.js +30 -0
- package/src/doc/components/Esdoc/InheritedSummaryDoc.js +70 -0
- package/src/doc/components/Esdoc/InheritedSummaryHTML.js +38 -0
- package/src/doc/components/Esdoc/MixinClassesHTML.js +29 -0
- package/src/doc/components/Esdoc/NavDoc.js +112 -0
- package/src/doc/components/Esdoc/OverrideMethod.js +44 -0
- package/src/doc/components/Esdoc/OverrideMethodDescription.js +35 -0
- package/src/doc/components/Esdoc/Properties.js +89 -0
- package/src/doc/components/Esdoc/README.md +45 -0
- package/src/doc/components/Esdoc/SignatureHTML.js +123 -0
- package/src/doc/components/Esdoc/SingleDoc.js +31 -0
- package/src/doc/components/Esdoc/SummaryDoc.js +160 -0
- package/src/doc/components/Esdoc/SummaryHTML.js +96 -0
- package/src/doc/components/Esdoc/TypeDocLinkHTML.js +249 -0
- package/src/doc/components/Esdoc/css/identifiers.css +38 -0
- package/src/doc/components/Esdoc/css/search.css +76 -0
- package/src/doc/components/Esdoc/css/style.css +603 -0
- package/src/doc/components/Esdoc/index.js +7 -0
- package/src/doc/components/Example.js +153 -0
- package/src/doc/components/Examples.js +183 -0
- package/src/doc/components/Home.js +106 -0
- package/src/doc/components/TrackerExample.js +38 -0
- package/src/doc/components/esm.min.js +2 -0
- package/src/doc/components/examples/assets/tralis-live-map/index.js +11 -0
- package/src/doc/components/examples/assets/tralis-live-map/s1kreis.svg +105 -0
- package/src/doc/components/examples/assets/tralis-live-map/s20kreis.svg +101 -0
- package/src/doc/components/examples/assets/tralis-live-map/s2kreis.svg +95 -0
- package/src/doc/components/examples/assets/tralis-live-map/s3kreis.svg +95 -0
- package/src/doc/components/examples/assets/tralis-live-map/s4kreis.svg +95 -0
- package/src/doc/components/examples/assets/tralis-live-map/s6kreis.svg +95 -0
- package/src/doc/components/examples/assets/tralis-live-map/s7kreis.svg +95 -0
- package/src/doc/components/examples/assets/tralis-live-map/s8kreis.svg +93 -0
- package/src/doc/components/examples/assets/tralis-live-map/unknown.svg +107 -0
- package/src/doc/components/examples/mb-copyright.html +26 -0
- package/src/doc/components/examples/mb-copyright.js +37 -0
- package/src/doc/components/examples/mb-tracker.html +1 -0
- package/src/doc/components/examples/mb-tracker.js +39 -0
- package/src/doc/components/examples/mb-tracker.md +1 -0
- package/src/doc/components/examples/mb-tralis.html +1 -0
- package/src/doc/components/examples/mb-tralis.js +34 -0
- package/src/doc/components/examples/ol-copyright.html +26 -0
- package/src/doc/components/examples/ol-copyright.js +43 -0
- package/src/doc/components/examples/ol-mapbox-layer.html +1 -0
- package/src/doc/components/examples/ol-mapbox-layer.js +28 -0
- package/src/doc/components/examples/ol-mapbox-layer.md +0 -0
- package/src/doc/components/examples/ol-mapbox-style-layer.html +12 -0
- package/src/doc/components/examples/ol-mapbox-style-layer.js +44 -0
- package/src/doc/components/examples/ol-query.html +32 -0
- package/src/doc/components/examples/ol-query.js +83 -0
- package/src/doc/components/examples/ol-routing.html +26 -0
- package/src/doc/components/examples/ol-routing.js +59 -0
- package/src/doc/components/examples/ol-routing.md +1 -0
- package/src/doc/components/examples/ol-stop-finder.html +15 -0
- package/src/doc/components/examples/ol-stop-finder.js +31 -0
- package/src/doc/components/examples/ol-stop-finder.md +1 -0
- package/src/doc/components/examples/ol-tracker.html +1 -0
- package/src/doc/components/examples/ol-tracker.js +44 -0
- package/src/doc/components/examples/ol-tracker.md +1 -0
- package/src/doc/components/examples/ol-tralis.html +5 -0
- package/src/doc/components/examples/ol-tralis.js +57 -0
- package/src/doc/components/examples/tralis-live-map.html +1 -0
- package/src/doc/components/examples/tralis-live-map.js +51 -0
- package/src/doc/components/examples/tralis-live-map.md +3 -0
- package/src/doc/examples/assets/tralis-live-map/index.js +11 -0
- package/src/doc/examples/assets/tralis-live-map/s1kreis.svg +105 -0
- package/src/doc/examples/assets/tralis-live-map/s20kreis.svg +101 -0
- package/src/doc/examples/assets/tralis-live-map/s2kreis.svg +95 -0
- package/src/doc/examples/assets/tralis-live-map/s3kreis.svg +95 -0
- package/src/doc/examples/assets/tralis-live-map/s4kreis.svg +95 -0
- package/src/doc/examples/assets/tralis-live-map/s6kreis.svg +95 -0
- package/src/doc/examples/assets/tralis-live-map/s7kreis.svg +95 -0
- package/src/doc/examples/assets/tralis-live-map/s8kreis.svg +93 -0
- package/src/doc/examples/assets/tralis-live-map/unknown.svg +107 -0
- package/src/doc/examples/mb-copyright.html +26 -0
- package/src/doc/examples/mb-copyright.js +37 -0
- package/src/doc/examples/mb-tracker.html +1 -0
- package/src/doc/examples/mb-tracker.js +39 -0
- package/src/doc/examples/mb-tracker.md +1 -0
- package/src/doc/examples/mb-tralis.html +1 -0
- package/src/doc/examples/mb-tralis.js +34 -0
- package/src/doc/examples/ol-copyright.html +26 -0
- package/src/doc/examples/ol-copyright.js +43 -0
- package/src/doc/examples/ol-mapbox-layer.html +1 -0
- package/src/doc/examples/ol-mapbox-layer.js +28 -0
- package/src/doc/examples/ol-mapbox-layer.md +0 -0
- package/src/doc/examples/ol-mapbox-style-layer.html +12 -0
- package/src/doc/examples/ol-mapbox-style-layer.js +44 -0
- package/src/doc/examples/ol-query.html +32 -0
- package/src/doc/examples/ol-query.js +83 -0
- package/src/doc/examples/ol-routing.html +26 -0
- package/src/doc/examples/ol-routing.js +59 -0
- package/src/doc/examples/ol-routing.md +1 -0
- package/src/doc/examples/ol-stop-finder.html +15 -0
- package/src/doc/examples/ol-stop-finder.js +31 -0
- package/src/doc/examples/ol-stop-finder.md +1 -0
- package/src/doc/examples/ol-tracker.html +1 -0
- package/src/doc/examples/ol-tracker.js +44 -0
- package/src/doc/examples/ol-tracker.md +1 -0
- package/src/doc/examples/ol-tralis.html +5 -0
- package/src/doc/examples/ol-tralis.js +57 -0
- package/src/doc/examples/tralis-live-map.html +1 -0
- package/src/doc/examples/tralis-live-map.js +51 -0
- package/src/doc/examples/tralis-live-map.md +3 -0
- package/src/doc/examples.js +107 -0
- package/src/doc/img/examples/live_tracker_mb.jpg +0 -0
- package/src/doc/img/examples/live_tracker_munich.jpg +0 -0
- package/src/doc/img/examples/live_tracker_ol.jpg +0 -0
- package/src/doc/img/examples/mapbox.jpg +0 -0
- package/src/doc/img/examples/mapbox_style.jpg +0 -0
- package/src/doc/img/examples/ol-copyright.png +0 -0
- package/src/doc/img/examples/query_objects.jpg +0 -0
- package/src/doc/img/examples/routing.jpg +0 -0
- package/src/doc/img/examples/simple_map.jpg +0 -0
- package/src/doc/img/examples/stops.jpg +0 -0
- package/src/doc/img/favico.ico +0 -0
- package/src/doc/index.js +21 -0
- package/src/iife.js +7 -0
- package/{module.js → src/index.js} +3 -9
- package/{mapbox → src/mapbox}/controls/CopyrightControl.js +5 -1
- package/{mapbox → src/mapbox}/index.js +0 -2
- package/{mapbox → src/mapbox}/layers/Layer.js +0 -0
- package/{mapbox → src/mapbox}/layers/Layer.test.js +2 -2
- package/{mapbox/layers/TrackerLayer.js → src/mapbox/layers/TralisLayer.js} +71 -24
- package/src/mapbox/layers/TralisLayer.test.js +40 -0
- package/{mapbox → src/mapbox}/utils.js +0 -0
- package/src/ol/README.md +0 -0
- package/{ol → src/ol}/controls/CopyrightControl.js +4 -4
- package/{ol → src/ol}/controls/CopyrightControl.test.js +16 -16
- package/{ol → src/ol}/controls/RoutingControl.js +9 -7
- package/{ol → src/ol}/controls/RoutingControl.test.js +1 -1
- package/{ol → src/ol}/controls/StopFinderControl.js +8 -6
- package/{ol → src/ol}/controls/StopFinderControl.test.js +1 -1
- package/{ol → src/ol}/controls/snapshots/RoutingControlRouteGen10.json +0 -0
- package/{ol → src/ol}/controls/snapshots/RoutingControlRouteGen100.json +0 -0
- package/{ol → src/ol}/controls/snapshots/RoutingControlRouteGen30.json +0 -0
- package/{ol → src/ol}/controls/snapshots/RoutingControlRouteGen5.json +0 -0
- package/{ol → src/ol}/controls/snapshots/RoutingControlRouteOSM.json +0 -0
- package/{ol → src/ol}/controls/snapshots/RoutingControlStation1.json +0 -0
- package/{ol → src/ol}/controls/snapshots/RoutingControlStation2.json +0 -0
- package/{ol → src/ol}/index.js +3 -3
- package/{ol → src/ol}/layers/Layer.js +9 -0
- package/{ol → src/ol}/layers/Layer.test.js +22 -7
- package/{ol → src/ol}/layers/MapboxLayer.js +39 -44
- package/{ol → src/ol}/layers/MapboxLayer.test.js +5 -5
- package/{ol → src/ol}/layers/MapboxStyleLayer.js +0 -6
- package/{ol → src/ol}/layers/MapboxStyleLayer.test.js +22 -6
- package/src/ol/layers/MaplibreLayer.js +280 -0
- package/{ol → src/ol}/layers/RoutingLayer.js +0 -0
- package/{ol → src/ol}/layers/RoutingLayer.test.js +1 -1
- package/{ol/layers/TrackerLayer.js → src/ol/layers/TralisLayer.js} +96 -33
- package/{ol → src/ol}/layers/TralisLayer.test.js +1 -49
- package/{ol → src/ol}/layers/VectorLayer.js +0 -0
- package/{ol → src/ol}/layers/VectorLayer.test.js +1 -1
- package/{ol → src/ol}/layers/WMSLayer.js +0 -0
- package/{ol → src/ol}/layers/WMSLayer.test.js +6 -2
- package/src/ol/styles/fullTrajectoryDelayStyle.js +35 -0
- package/src/ol/styles/fullTrajectoryStyle.js +51 -0
- package/src/ol/styles/index.js +2 -0
- package/src/setupTests.js +15 -0
- package/webpack.config.js +6 -0
- package/api/trajserv/TrajservAPI.js +0 -71
- package/api/trajserv/TrajservAPI.test.js +0 -171
- package/api/trajserv/TrajservAPIUtils.js +0 -191
- package/api/trajserv/TrajservAPIUtils.test.js +0 -40
- package/api/trajserv/typedefs.js +0 -44
- package/common/mixins/MapMixin.js +0 -103
- package/common/mixins/TrajservLayerMixin.js +0 -544
- package/common/mixins/TralisLayerMixin.js +0 -402
- package/common/utils/simpleTrackerStyle.js +0 -18
- package/index.js +0 -2
- package/index.js.map +0 -1
- package/mapbox/Map.js +0 -87
- package/mapbox/layers/TrackerLayer.test.js +0 -68
- package/mapbox/layers/TrajservLayer.js +0 -114
- package/mapbox/layers/TrajservLayer.test.js +0 -90
- package/mapbox/layers/TralisLayer.js +0 -64
- package/ol/Map.js +0 -109
- package/ol/Map.test.js +0 -34
- package/ol/layers/TrackerLayer.test.js +0 -70
- package/ol/layers/TrajservLayer.js +0 -190
- package/ol/layers/TrajservLayer.test.js +0 -113
- package/ol/layers/TralisLayer.js +0 -177
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/* eslint-disable no-underscore-dangle */
|
|
2
2
|
import { toLonLat } from 'ol/proj';
|
|
3
|
-
import
|
|
3
|
+
import { Map } from 'mapbox-gl';
|
|
4
4
|
import Source from 'ol/source/Source';
|
|
5
5
|
import OLLayer from 'ol/layer/Layer';
|
|
6
6
|
import GeoJSON from 'ol/format/GeoJSON';
|
|
@@ -114,7 +114,7 @@ export default class MapboxLayer extends Layer {
|
|
|
114
114
|
}
|
|
115
115
|
}
|
|
116
116
|
|
|
117
|
-
return
|
|
117
|
+
return this.mbMap.getContainer();
|
|
118
118
|
},
|
|
119
119
|
});
|
|
120
120
|
|
|
@@ -186,6 +186,22 @@ export default class MapboxLayer extends Layer {
|
|
|
186
186
|
);
|
|
187
187
|
}
|
|
188
188
|
|
|
189
|
+
/**
|
|
190
|
+
* Terminate what was initialized in init function. Remove layer, events...
|
|
191
|
+
*/
|
|
192
|
+
terminate() {
|
|
193
|
+
if (this.mbMap) {
|
|
194
|
+
this.mbMap.off('idle', this.updateAttribution);
|
|
195
|
+
// Some asynchrone repaints are triggered even if the mbMap has been removed,
|
|
196
|
+
// to avoid display of errors we set an empty function.
|
|
197
|
+
this.mbMap.triggerRepaint = () => {};
|
|
198
|
+
this.mbMap.remove();
|
|
199
|
+
this.mbMap = null;
|
|
200
|
+
}
|
|
201
|
+
this.loaded = false;
|
|
202
|
+
super.terminate();
|
|
203
|
+
}
|
|
204
|
+
|
|
189
205
|
/**
|
|
190
206
|
* Returns a style URL with apiKey & apiKeyName infos.
|
|
191
207
|
* @private
|
|
@@ -227,28 +243,23 @@ export default class MapboxLayer extends Layer {
|
|
|
227
243
|
y = 0;
|
|
228
244
|
}
|
|
229
245
|
|
|
230
|
-
const
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
});
|
|
248
|
-
} catch (err) {
|
|
249
|
-
// eslint-disable-next-line no-console
|
|
250
|
-
console.warn('Failed creating mapbox map: ', err);
|
|
251
|
-
}
|
|
246
|
+
const container = document.createElement('div');
|
|
247
|
+
container.style.position = 'absolute';
|
|
248
|
+
container.style.width = '100%';
|
|
249
|
+
container.style.height = '100%';
|
|
250
|
+
|
|
251
|
+
/**
|
|
252
|
+
* A mapbox map
|
|
253
|
+
* @type {mapboxgl.Map}
|
|
254
|
+
*/
|
|
255
|
+
this.mbMap = new Map({
|
|
256
|
+
style: this.createStyleUrl(),
|
|
257
|
+
container,
|
|
258
|
+
interactive: false,
|
|
259
|
+
trackResize: false,
|
|
260
|
+
attributionControl: false,
|
|
261
|
+
...(this.options.mapOptions || {}),
|
|
262
|
+
});
|
|
252
263
|
|
|
253
264
|
// Options the last render run did happen. If something changes
|
|
254
265
|
// we have to render again
|
|
@@ -263,6 +274,7 @@ export default class MapboxLayer extends Layer {
|
|
|
263
274
|
};
|
|
264
275
|
|
|
265
276
|
this.mbMap.once('load', () => {
|
|
277
|
+
this.mbMap.resize();
|
|
266
278
|
/**
|
|
267
279
|
* Is the map loaded.
|
|
268
280
|
* @type {boolean}
|
|
@@ -270,8 +282,7 @@ export default class MapboxLayer extends Layer {
|
|
|
270
282
|
this.loaded = true;
|
|
271
283
|
|
|
272
284
|
/** @ignore */
|
|
273
|
-
this.copyrights =
|
|
274
|
-
this.copyrights || getMapboxMapCopyrights(this.mbMap) || [];
|
|
285
|
+
this.copyrights = getMapboxMapCopyrights(this.mbMap) || [];
|
|
275
286
|
|
|
276
287
|
this.olLayer.getSource().setAttributions(this.copyrights);
|
|
277
288
|
|
|
@@ -300,9 +311,9 @@ export default class MapboxLayer extends Layer {
|
|
|
300
311
|
* @private
|
|
301
312
|
*/
|
|
302
313
|
updateAttribution(evt) {
|
|
303
|
-
const newAttributions =
|
|
304
|
-
this.copyrights || getMapboxMapCopyrights(evt.target) || [];
|
|
314
|
+
const newAttributions = getMapboxMapCopyrights(evt.target) || [];
|
|
305
315
|
if (this.copyrights.toString() !== newAttributions.toString()) {
|
|
316
|
+
this.copyrights = newAttributions;
|
|
306
317
|
this.olLayer.getSource().setAttributions(newAttributions);
|
|
307
318
|
}
|
|
308
319
|
}
|
|
@@ -356,22 +367,6 @@ export default class MapboxLayer extends Layer {
|
|
|
356
367
|
});
|
|
357
368
|
}
|
|
358
369
|
|
|
359
|
-
/**
|
|
360
|
-
* Terminate what was initialized in init function. Remove layer, events...
|
|
361
|
-
*/
|
|
362
|
-
terminate() {
|
|
363
|
-
if (this.mbMap) {
|
|
364
|
-
this.mbMap.off('idle', this.updateAttribution);
|
|
365
|
-
// Some asynchrone repaints are triggered even if the mbMap has been removed,
|
|
366
|
-
// to avoid display of errors we set an empty function.
|
|
367
|
-
this.mbMap.triggerRepaint = () => {};
|
|
368
|
-
this.mbMap.remove();
|
|
369
|
-
this.mbMap = null;
|
|
370
|
-
}
|
|
371
|
-
this.loaded = false;
|
|
372
|
-
super.terminate();
|
|
373
|
-
}
|
|
374
|
-
|
|
375
370
|
/**
|
|
376
371
|
* Create a copy of the MapboxLayer.
|
|
377
372
|
* @param {Object} newOptions Options to override
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import
|
|
1
|
+
import OlMap from 'ol/Map';
|
|
2
2
|
import View from 'ol/View';
|
|
3
|
-
import
|
|
3
|
+
import gllib from 'mapbox-gl';
|
|
4
4
|
import MapboxLayer from './MapboxLayer';
|
|
5
5
|
|
|
6
6
|
let layer;
|
|
@@ -19,7 +19,7 @@ describe('MapboxLayer', () => {
|
|
|
19
19
|
name: 'Layer',
|
|
20
20
|
url: styleUrl,
|
|
21
21
|
});
|
|
22
|
-
map = new
|
|
22
|
+
map = new OlMap({
|
|
23
23
|
target: document.createElement('div'),
|
|
24
24
|
view: new View({ center: [0, 0] }),
|
|
25
25
|
});
|
|
@@ -37,7 +37,7 @@ describe('MapboxLayer', () => {
|
|
|
37
37
|
|
|
38
38
|
test('should initalized mapbox map and warn the user if there is no api key defined.', () => {
|
|
39
39
|
layer.init(map);
|
|
40
|
-
expect(layer.mbMap).toBeInstanceOf(
|
|
40
|
+
expect(layer.mbMap).toBeInstanceOf(gllib.Map);
|
|
41
41
|
expect(consoleOutput[0]).toBe(
|
|
42
42
|
'No apiKey is defined for request to foo.com/styles',
|
|
43
43
|
);
|
|
@@ -64,7 +64,7 @@ describe('MapboxLayer', () => {
|
|
|
64
64
|
url: styleUrl,
|
|
65
65
|
apiKey: 'apiKey',
|
|
66
66
|
});
|
|
67
|
-
map = new
|
|
67
|
+
map = new OlMap({
|
|
68
68
|
target: document.createElement('div'),
|
|
69
69
|
view: new View({ center: [0, 0] }),
|
|
70
70
|
});
|
|
@@ -127,12 +127,6 @@ class MapboxStyleLayer extends Layer {
|
|
|
127
127
|
init(map) {
|
|
128
128
|
if (!this.mapboxLayer.map) {
|
|
129
129
|
this.mapboxLayer.init(map);
|
|
130
|
-
/**
|
|
131
|
-
* An OpenLayers Layer.
|
|
132
|
-
* @type {ol/layer/Layer~Layer}
|
|
133
|
-
* @private
|
|
134
|
-
*/
|
|
135
|
-
this.olLayer = this.mapboxLayer.olLayer;
|
|
136
130
|
}
|
|
137
131
|
super.init(map);
|
|
138
132
|
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import
|
|
1
|
+
import OlMap from 'ol/Map';
|
|
2
2
|
import View from 'ol/View';
|
|
3
|
-
import
|
|
3
|
+
import gllib from 'maplibre-gl';
|
|
4
4
|
import Layer from './Layer';
|
|
5
|
-
import
|
|
5
|
+
import MaplibreLayer from './MaplibreLayer';
|
|
6
6
|
import MapboxStyleLayer from './MapboxStyleLayer';
|
|
7
7
|
|
|
8
8
|
let source;
|
|
@@ -17,7 +17,7 @@ const styleLayer = {
|
|
|
17
17
|
describe('MapboxStyleLayer', () => {
|
|
18
18
|
beforeEach(() => {
|
|
19
19
|
onClick = jest.fn();
|
|
20
|
-
source = new
|
|
20
|
+
source = new MaplibreLayer({
|
|
21
21
|
name: 'Layer',
|
|
22
22
|
apiKey: false,
|
|
23
23
|
});
|
|
@@ -28,12 +28,21 @@ describe('MapboxStyleLayer', () => {
|
|
|
28
28
|
styleLayer,
|
|
29
29
|
onClick,
|
|
30
30
|
});
|
|
31
|
-
map = new
|
|
31
|
+
map = new OlMap({
|
|
32
32
|
target: document.createElement('div'),
|
|
33
33
|
view: new View({ center: [0, 0] }),
|
|
34
34
|
});
|
|
35
35
|
});
|
|
36
36
|
|
|
37
|
+
afterEach(() => {
|
|
38
|
+
if (layer.map) {
|
|
39
|
+
layer.terminate(map);
|
|
40
|
+
}
|
|
41
|
+
if (source.map) {
|
|
42
|
+
source.terminate(map);
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
|
|
37
46
|
test('should be instanced.', () => {
|
|
38
47
|
expect(layer).toBeInstanceOf(MapboxStyleLayer);
|
|
39
48
|
expect(layer.styleLayers[0]).toBe(styleLayer);
|
|
@@ -43,12 +52,15 @@ describe('MapboxStyleLayer', () => {
|
|
|
43
52
|
test('should not initalized mapbox map.', () => {
|
|
44
53
|
layer.init();
|
|
45
54
|
expect(layer.mbMap).toBe();
|
|
55
|
+
layer.terminate();
|
|
46
56
|
});
|
|
47
57
|
|
|
48
58
|
test('should initalized mapbox map.', () => {
|
|
49
59
|
source.init(map);
|
|
50
60
|
layer.init(map);
|
|
51
|
-
expect(layer.mapboxLayer.mbMap).toBeInstanceOf(
|
|
61
|
+
expect(layer.mapboxLayer.mbMap).toBeInstanceOf(gllib.Map);
|
|
62
|
+
layer.terminate();
|
|
63
|
+
source.terminate();
|
|
52
64
|
});
|
|
53
65
|
|
|
54
66
|
test('should add onClick callback.', () => {
|
|
@@ -61,6 +73,7 @@ describe('MapboxStyleLayer', () => {
|
|
|
61
73
|
const spy = jest.spyOn(layer, 'terminate');
|
|
62
74
|
layer.init();
|
|
63
75
|
expect(spy).toHaveBeenCalledTimes(1);
|
|
76
|
+
layer.terminate(map);
|
|
64
77
|
});
|
|
65
78
|
|
|
66
79
|
test('should return coordinates, features and a layer instance.', async () => {
|
|
@@ -70,6 +83,8 @@ describe('MapboxStyleLayer', () => {
|
|
|
70
83
|
expect(data.coordinate).toEqual([50, 50]);
|
|
71
84
|
expect(data.features).toEqual([]);
|
|
72
85
|
expect(data.layer).toBeInstanceOf(MapboxStyleLayer);
|
|
86
|
+
layer.terminate(map);
|
|
87
|
+
source.terminate(map);
|
|
73
88
|
});
|
|
74
89
|
|
|
75
90
|
test('should call onClick callback', async () => {
|
|
@@ -81,6 +96,7 @@ describe('MapboxStyleLayer', () => {
|
|
|
81
96
|
await map.dispatchEvent(evt);
|
|
82
97
|
expect(onClick).toHaveBeenCalledTimes(1);
|
|
83
98
|
expect(onClick).toHaveBeenCalledWith(features, layer, coordinate);
|
|
99
|
+
layer.terminate();
|
|
84
100
|
});
|
|
85
101
|
|
|
86
102
|
test('should call super class terminate function.', () => {
|
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
/* eslint-disable no-underscore-dangle */
|
|
2
|
+
import { toLonLat } from 'ol/proj';
|
|
3
|
+
import { Map } from 'maplibre-gl';
|
|
4
|
+
import Source from 'ol/source/Source';
|
|
5
|
+
import OLLayer from 'ol/layer/Layer';
|
|
6
|
+
import GeoJSON from 'ol/format/GeoJSON';
|
|
7
|
+
import { toDegrees } from 'ol/math';
|
|
8
|
+
import Layer from './Layer';
|
|
9
|
+
import { getMapboxMapCopyrights, getMapboxStyleUrl } from '../../common/utils';
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* A class representing MaplibreLayer to display on BasicMap
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* import { MaplibreLayer } from 'mobility-toolbox-js/ol';
|
|
16
|
+
*
|
|
17
|
+
* const layer = new MaplibreLayer({
|
|
18
|
+
* url: 'https://maps.geops.io/styles/travic_v2/style.json',
|
|
19
|
+
* apikey: 'yourApiKey',
|
|
20
|
+
* });
|
|
21
|
+
*
|
|
22
|
+
* @classproperty {ol/Map~Map} map - The map where the layer is displayed.
|
|
23
|
+
* @extends {Layer}
|
|
24
|
+
*/
|
|
25
|
+
export default class MaplibreLayer extends Layer {
|
|
26
|
+
/**
|
|
27
|
+
* Constructor.
|
|
28
|
+
*
|
|
29
|
+
* @param {Object} options
|
|
30
|
+
* @param {boolean} [options.preserveDrawingBuffer=false] If true able to export the canvas.
|
|
31
|
+
* @param {number} [options.fadeDuration=300] Duration of the fade effect in ms.
|
|
32
|
+
*/
|
|
33
|
+
constructor(options = {}) {
|
|
34
|
+
const mbLayer = new OLLayer({
|
|
35
|
+
source: new Source({}),
|
|
36
|
+
render: (frameState) => {
|
|
37
|
+
if (!this.mbMap) {
|
|
38
|
+
// eslint-disable-next-line no-console
|
|
39
|
+
console.warn("Mapbox map doesn't exist.");
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
const canvas = this.mbMap.getCanvas();
|
|
44
|
+
const { viewState } = frameState;
|
|
45
|
+
|
|
46
|
+
const opacity = this.olLayer.getOpacity();
|
|
47
|
+
canvas.style.opacity = opacity;
|
|
48
|
+
|
|
49
|
+
// adjust view parameters in mapbox
|
|
50
|
+
this.mbMap.jumpTo({
|
|
51
|
+
center: toLonLat(viewState.center),
|
|
52
|
+
zoom: viewState.zoom - 1,
|
|
53
|
+
bearing: toDegrees(-viewState.rotation),
|
|
54
|
+
animate: false,
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
if (!canvas.isConnected) {
|
|
58
|
+
// The canvas is not connected to the DOM, request a map rendering at the next animation frame
|
|
59
|
+
// to set the canvas size.
|
|
60
|
+
this.map.render();
|
|
61
|
+
} else if (
|
|
62
|
+
canvas.width !== frameState.size[0] ||
|
|
63
|
+
canvas.height !== frameState.size[1]
|
|
64
|
+
) {
|
|
65
|
+
this.mbMap.resize();
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
this.mbMap.redraw();
|
|
69
|
+
|
|
70
|
+
return this.mbMap.getContainer();
|
|
71
|
+
},
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
super({
|
|
75
|
+
...options,
|
|
76
|
+
olLayer: mbLayer,
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Url of the mapbox style.
|
|
81
|
+
* @type {string}
|
|
82
|
+
* @private
|
|
83
|
+
*/
|
|
84
|
+
this.styleUrl = options.url;
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Api key for the url of the mapbox style.
|
|
88
|
+
* If set to false, the apiKey is not required.
|
|
89
|
+
* @type {string}
|
|
90
|
+
* @private
|
|
91
|
+
*/
|
|
92
|
+
this.apiKey = options.apiKey;
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Name of the apiKey to set in the url request.
|
|
96
|
+
* Default is 'key'.
|
|
97
|
+
* @type {string}
|
|
98
|
+
* @private
|
|
99
|
+
*/
|
|
100
|
+
this.apiKeyName = options.apiKeyName || 'key';
|
|
101
|
+
|
|
102
|
+
/** @ignore */
|
|
103
|
+
this.updateAttribution = this.updateAttribution.bind(this);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Initialize the layer and listen to feature clicks.
|
|
108
|
+
* @param {ol/Map~Map} map
|
|
109
|
+
*/
|
|
110
|
+
init(map) {
|
|
111
|
+
super.init(map);
|
|
112
|
+
|
|
113
|
+
if (!this.map) {
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* The feature format.
|
|
119
|
+
* @type {ol/format/GeoJSON}
|
|
120
|
+
*/
|
|
121
|
+
this.format = new GeoJSON({
|
|
122
|
+
featureProjection: this.map.getView().getProjection(),
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
this.loadMbMap();
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Terminate what was initialized in init function. Remove layer, events...
|
|
130
|
+
*/
|
|
131
|
+
terminate() {
|
|
132
|
+
if (this.mbMap) {
|
|
133
|
+
this.mbMap.off('idle', this.updateAttribution);
|
|
134
|
+
// Some asynchrone repaints are triggered even if the mbMap has been removed,
|
|
135
|
+
// to avoid display of errors we set an empty function.
|
|
136
|
+
this.mbMap.triggerRepaint = () => {};
|
|
137
|
+
this.mbMap.remove();
|
|
138
|
+
this.mbMap = null;
|
|
139
|
+
}
|
|
140
|
+
this.loaded = false;
|
|
141
|
+
super.terminate();
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* Returns a style URL with apiKey & apiKeyName infos.
|
|
146
|
+
* @private
|
|
147
|
+
*/
|
|
148
|
+
createStyleUrl() {
|
|
149
|
+
return getMapboxStyleUrl(this.apiKey, this.apiKeyName, this.styleUrl);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* Create the mapbox map.
|
|
154
|
+
* @private
|
|
155
|
+
*/
|
|
156
|
+
loadMbMap() {
|
|
157
|
+
this.olListenersKeys.push(
|
|
158
|
+
this.map.on('change:target', () => {
|
|
159
|
+
this.loadMbMap();
|
|
160
|
+
}),
|
|
161
|
+
);
|
|
162
|
+
|
|
163
|
+
if (!this.map.getTargetElement()) {
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
if (!this.visible) {
|
|
168
|
+
// On next change of visibility we load the map
|
|
169
|
+
this.olListenersKeys.push(
|
|
170
|
+
this.once('change:visible', () => {
|
|
171
|
+
this.loadMbMap();
|
|
172
|
+
}),
|
|
173
|
+
);
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
const container = document.createElement('div');
|
|
178
|
+
container.style.position = 'absolute';
|
|
179
|
+
container.style.width = '100%';
|
|
180
|
+
container.style.height = '100%';
|
|
181
|
+
|
|
182
|
+
/**
|
|
183
|
+
* A mapbox map
|
|
184
|
+
* @type {mapboxgl.Map}
|
|
185
|
+
*/
|
|
186
|
+
this.mbMap = new Map({
|
|
187
|
+
style: this.createStyleUrl(),
|
|
188
|
+
container,
|
|
189
|
+
interactive: false,
|
|
190
|
+
trackResize: false,
|
|
191
|
+
attributionControl: false,
|
|
192
|
+
...(this.options.mapOptions || {}),
|
|
193
|
+
});
|
|
194
|
+
|
|
195
|
+
this.mbMap.once('load', () => {
|
|
196
|
+
/**
|
|
197
|
+
* Is the map loaded.
|
|
198
|
+
* @type {boolean}
|
|
199
|
+
*/
|
|
200
|
+
this.loaded = true;
|
|
201
|
+
|
|
202
|
+
this.dispatchEvent({
|
|
203
|
+
type: 'load',
|
|
204
|
+
target: this,
|
|
205
|
+
});
|
|
206
|
+
});
|
|
207
|
+
|
|
208
|
+
this.mbMap.on('idle', this.updateAttribution);
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
/**
|
|
212
|
+
* Update attributions of the source.
|
|
213
|
+
* @private
|
|
214
|
+
*/
|
|
215
|
+
updateAttribution(evt) {
|
|
216
|
+
const newAttributions = getMapboxMapCopyrights(evt.target) || [];
|
|
217
|
+
if (this.copyrights?.toString() !== newAttributions.toString()) {
|
|
218
|
+
this.copyrights = newAttributions;
|
|
219
|
+
this.olLayer.getSource().setAttributions(newAttributions);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
/**
|
|
224
|
+
* Request feature information for a given coordinate.
|
|
225
|
+
* @param {ol/coordinate~Coordinate} coordinate Coordinate to request the information at.
|
|
226
|
+
* @param {Object} options A [mapboxgl.Map#queryrenderedfeatures](https://docs.mapbox.com/mapbox-gl-js/api/map/#map#queryrenderedfeatures) options parameter.
|
|
227
|
+
* @return {Promise<FeatureInfo>} Promise with features, layer and coordinate. The original Mapbox feature is available as a property named 'mapboxFeature'.
|
|
228
|
+
*/
|
|
229
|
+
getFeatureInfoAtCoordinate(coordinate, options) {
|
|
230
|
+
// Ignore the getFeatureInfo until the mapbox map is loaded
|
|
231
|
+
if (
|
|
232
|
+
!options ||
|
|
233
|
+
!this.format ||
|
|
234
|
+
!this.mbMap ||
|
|
235
|
+
!this.mbMap.isStyleLoaded()
|
|
236
|
+
) {
|
|
237
|
+
return Promise.resolve({ coordinate, features: [], layer: this });
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
let pixel = coordinate && this.mbMap.project(toLonLat(coordinate));
|
|
241
|
+
|
|
242
|
+
if (this.hitTolerance) {
|
|
243
|
+
const { x, y } = pixel;
|
|
244
|
+
pixel = [
|
|
245
|
+
{ x: x - this.hitTolerance, y: y - this.hitTolerance },
|
|
246
|
+
{ x: x + this.hitTolerance, y: y + this.hitTolerance },
|
|
247
|
+
];
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
// At this point we get GeoJSON Mapbox feature, we transform it to an OpenLayers
|
|
251
|
+
// feature to be consistent with other layers.
|
|
252
|
+
const features = this.mbMap
|
|
253
|
+
.queryRenderedFeatures(pixel, options)
|
|
254
|
+
.map((feature) => {
|
|
255
|
+
const olFeature = this.format.readFeature(feature);
|
|
256
|
+
if (olFeature) {
|
|
257
|
+
// We save the original mapbox feature to avoid losing informations
|
|
258
|
+
// potentially needed for other functionnality like highlighting
|
|
259
|
+
// (id, layer id, source, sourceLayer ...)
|
|
260
|
+
olFeature.set('mapboxFeature', feature);
|
|
261
|
+
}
|
|
262
|
+
return olFeature;
|
|
263
|
+
});
|
|
264
|
+
|
|
265
|
+
return Promise.resolve({
|
|
266
|
+
layer: this,
|
|
267
|
+
features,
|
|
268
|
+
coordinate,
|
|
269
|
+
});
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
/**
|
|
273
|
+
* Create a copy of the MapboxLayer.
|
|
274
|
+
* @param {Object} newOptions Options to override
|
|
275
|
+
* @return {MapboxLayer} A MapboxLayer
|
|
276
|
+
*/
|
|
277
|
+
clone(newOptions) {
|
|
278
|
+
return new MaplibreLayer({ ...this.options, ...newOptions });
|
|
279
|
+
}
|
|
280
|
+
}
|
|
File without changes
|