mobility-toolbox-js 3.2.0 → 3.2.2

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.
@@ -1,3 +1,6 @@
1
+ import type { Map, MapBrowserEvent } from 'ol';
2
+ import type { Coordinate } from 'ol/coordinate';
3
+ import type { StyleLike } from 'ol/style/Style';
1
4
  import { Feature } from 'ol';
2
5
  import Control, { Options } from 'ol/control/Control';
3
6
  import { EventsKey } from 'ol/events';
@@ -7,11 +10,9 @@ import { Modify } from 'ol/interaction';
7
10
  import { ModifyEvent } from 'ol/interaction/Modify';
8
11
  import VectorLayer from 'ol/layer/Vector';
9
12
  import VectorSource from 'ol/source/Vector';
10
- import { RoutingAPI } from '../../api';
11
- import type { Map, MapBrowserEvent } from 'ol';
12
- import type { Coordinate } from 'ol/coordinate';
13
- import type { StyleLike } from 'ol/style/Style';
14
13
  import type { RoutingGraph, RoutingMot, RoutingParameters, RoutingViaPoint } from '../../types';
14
+ import { RoutingAPI } from '../../api';
15
+ export type AbortControllersByGraph = Record<string, AbortController>;
15
16
  export type RoutingControlOptions = {
16
17
  active?: boolean;
17
18
  apiKey?: string;
@@ -27,7 +28,6 @@ export type RoutingControlOptions = {
27
28
  style?: StyleLike;
28
29
  useRawViaPoints?: boolean;
29
30
  } & Options;
30
- export type AbortControllersByGraph = Record<string, AbortController>;
31
31
  /**
32
32
  * This OpenLayers control allows the user to add and modifiy via points to
33
33
  * a map and request a route from the [geOps Routing API](https://developer.geops.io/apis/routing/).
@@ -79,6 +79,14 @@ declare class RoutingControl extends Control {
79
79
  stopsApiUrl?: string;
80
80
  useRawViaPoints: boolean;
81
81
  viaPoints: RoutingViaPoint[];
82
+ get active(): boolean;
83
+ set active(newValue: boolean);
84
+ get loading(): boolean;
85
+ set loading(newValue: boolean);
86
+ get modify(): any;
87
+ set modify(newValue: any);
88
+ get mot(): RoutingMot;
89
+ set mot(newValue: RoutingMot);
82
90
  /**
83
91
  * Constructor.
84
92
  *
@@ -201,13 +209,5 @@ declare class RoutingControl extends Control {
201
209
  * @public
202
210
  */
203
211
  setViaPoints(coordinateArray: Coordinate[]): void;
204
- get active(): boolean;
205
- set active(newValue: boolean);
206
- get loading(): boolean;
207
- set loading(newValue: boolean);
208
- get modify(): any;
209
- set modify(newValue: any);
210
- get mot(): RoutingMot;
211
- set mot(newValue: RoutingMot);
212
212
  }
213
213
  export default RoutingControl;
@@ -68,6 +68,30 @@ const getFlatCoordinatesFromSegments = (segmentArray) => {
68
68
  * @public
69
69
  */
70
70
  class RoutingControl extends Control {
71
+ get active() {
72
+ return this.get('active');
73
+ }
74
+ set active(newValue) {
75
+ this.set('active', newValue);
76
+ }
77
+ get loading() {
78
+ return this.get('loading');
79
+ }
80
+ set loading(newValue) {
81
+ this.set('loading', newValue);
82
+ }
83
+ get modify() {
84
+ return this.get('modify');
85
+ }
86
+ set modify(newValue) {
87
+ this.set('modify', newValue);
88
+ }
89
+ get mot() {
90
+ return this.get('mot');
91
+ }
92
+ set mot(newValue) {
93
+ this.set('mot', newValue);
94
+ }
71
95
  /**
72
96
  * Constructor.
73
97
  *
@@ -122,7 +146,6 @@ class RoutingControl extends Control {
122
146
  ((error) => {
123
147
  this.dispatchEvent(new BaseEvent('change:route'));
124
148
  this.reset();
125
- // eslint-disable-next-line no-console
126
149
  console.error(error);
127
150
  });
128
151
  this.onMapClick = this.onMapClick.bind(this);
@@ -147,10 +170,12 @@ class RoutingControl extends Control {
147
170
  */
148
171
  static getGraphsResolutions(graphs, map) {
149
172
  const view = map.getView();
150
- return graphs.map(([, minZoom, maxZoom]) => [
151
- view.getResolutionForZoom(minZoom),
152
- view.getResolutionForZoom(maxZoom || minZoom + 1),
153
- ]);
173
+ return graphs.map(([, minZoom, maxZoom]) => {
174
+ return [
175
+ view.getResolutionForZoom(minZoom),
176
+ view.getResolutionForZoom(maxZoom || minZoom + 1),
177
+ ];
178
+ });
154
179
  }
155
180
  /**
156
181
  * Aborts viapoint and route requests
@@ -231,7 +256,9 @@ class RoutingControl extends Control {
231
256
  this.element = document.createElement('button');
232
257
  this.element.id = 'ol-toggle-routing';
233
258
  this.element.innerHTML = 'Toggle Route Control';
234
- this.element.onclick = () => this.active ? this.deactivate() : this.activate();
259
+ this.element.onclick = () => {
260
+ return this.active ? this.deactivate() : this.activate();
261
+ };
235
262
  Object.assign(this.element.style, {
236
263
  position: 'absolute',
237
264
  right: '10px',
@@ -256,7 +283,10 @@ class RoutingControl extends Control {
256
283
  const feats = ((_a = e.target) === null || _a === void 0 ? void 0 : _a.getFeaturesAtPixel(e.pixel, {
257
284
  hitTolerance: 5,
258
285
  })) || [];
259
- const viaPoint = feats.find((feat) => { var _a; return ((_a = feat.getGeometry()) === null || _a === void 0 ? void 0 : _a.getType()) === 'Point' && feat.get('index'); });
286
+ const viaPoint = feats.find((feat) => {
287
+ var _a;
288
+ return ((_a = feat.getGeometry()) === null || _a === void 0 ? void 0 : _a.getType()) === 'Point' && feat.get('index');
289
+ });
260
290
  if (click(e) && viaPoint) {
261
291
  // Remove node & viaPoint if an existing viaPoint was clicked
262
292
  this.removeViaPoint(viaPoint.get('index'));
@@ -325,9 +355,7 @@ class RoutingControl extends Control {
325
355
  return Promise.resolve([]);
326
356
  }
327
357
  return this.api
328
- .route(Object.assign({ 'coord-punish': 1000.0, 'coord-radius': 100.0,
329
- // @ts-expect-error missing property in swagger
330
- elevation: false, graph, mot: this.mot, 'resolve-hops': false, via: `${formattedViaPoints.join('|')}` }, (this.apiParams || {})), { signal })
358
+ .route(Object.assign({ 'coord-punish': 1000.0, 'coord-radius': 100.0, elevation: false, graph, mot: this.mot, 'resolve-hops': false, via: `${formattedViaPoints.join('|')}` }, (this.apiParams || {})), { signal })
331
359
  .then((featureCollection) => {
332
360
  var _a, _b, _c;
333
361
  this.segments = this.format.readFeatures(featureCollection);
@@ -335,7 +363,9 @@ class RoutingControl extends Control {
335
363
  // Extract unique values from viaPoint target value
336
364
  const uniqueVias = this.segments.reduce((resultVias, currentFeat) => {
337
365
  const segTrg = currentFeat.get('trg');
338
- return resultVias.find((via) => via[0] === segTrg[0] && via[1] === segTrg[1])
366
+ return resultVias.find((via) => {
367
+ return via[0] === segTrg[0] && via[1] === segTrg[1];
368
+ })
339
369
  ? resultVias
340
370
  : [...resultVias, segTrg];
341
371
  }, []);
@@ -409,7 +439,9 @@ class RoutingControl extends Control {
409
439
  [stationId, track] = viaPoint.split('$');
410
440
  }
411
441
  return fetch(`${this.stopsApiUrl}lookup/${stationId}?key=${this.stopsApiKey}`, { signal: abortController.signal })
412
- .then((res) => res.json())
442
+ .then((res) => {
443
+ return res.json();
444
+ })
413
445
  .then((stationData) => {
414
446
  var _a, _b, _c, _d;
415
447
  const { coordinates } = ((_b = (_a = stationData === null || stationData === void 0 ? void 0 : stationData.features) === null || _a === void 0 ? void 0 : _a[0]) === null || _b === void 0 ? void 0 : _b.geometry) || {};
@@ -468,7 +500,9 @@ class RoutingControl extends Control {
468
500
  }
469
501
  if (stationName) {
470
502
  return fetch(`${this.stopsApiUrl}?key=${this.stopsApiKey}&q=${stationName}&limit=1`, { signal: abortController.signal })
471
- .then((res) => res.json())
503
+ .then((res) => {
504
+ return res.json();
505
+ })
472
506
  .then((stationData) => {
473
507
  var _a, _b;
474
508
  const { coordinates } = stationData.features[0].geometry;
@@ -510,12 +544,14 @@ class RoutingControl extends Control {
510
544
  onMapClick(evt) {
511
545
  const feats = evt.target.getFeaturesAtPixel(evt.pixel, {
512
546
  hitTolerance: 5,
513
- layerFilter: (layer) => layer === this.routingLayer,
547
+ layerFilter: (layer) => {
548
+ return layer === this.routingLayer;
549
+ },
514
550
  });
515
551
  const viaPoint = feats.find((feat) => {
516
552
  var _a;
517
- return ((_a = feat.getGeometry()) === null || _a === void 0 ? void 0 : _a.getType()) === 'Point' &&
518
- feat.get('viaPointIdx') !== undefined;
553
+ return (((_a = feat.getGeometry()) === null || _a === void 0 ? void 0 : _a.getType()) === 'Point' &&
554
+ feat.get('viaPointIdx') !== undefined);
519
555
  });
520
556
  if (viaPoint) {
521
557
  // Remove existing viaPoint on click and abort viaPoint add
@@ -557,22 +593,26 @@ class RoutingControl extends Control {
557
593
  var _a;
558
594
  // When modify start, we search the index of the segment that is modifying.
559
595
  let segmentIndex = -1;
560
- const route = evt.features
561
- .getArray()
562
- .find((feat) => { var _a; return ((_a = feat.getGeometry()) === null || _a === void 0 ? void 0 : _a.getType()) === 'LineString'; });
596
+ const route = evt.features.getArray().find((feat) => {
597
+ var _a;
598
+ return ((_a = feat.getGeometry()) === null || _a === void 0 ? void 0 : _a.getType()) === 'LineString';
599
+ });
563
600
  // Find the segment index that is being modified
564
601
  if ((route === null || route === void 0 ? void 0 : route.getGeometry()) && evt.mapBrowserEvent.coordinate) {
565
602
  // We use a buff extent to fix floating issues , see https://github.com/openlayers/openlayers/issues/7130#issuecomment-535856422
566
603
  const closestExtent = buffer(new Point(
567
604
  // @ts-expect-error bad def
568
605
  (_a = route.getGeometry()) === null || _a === void 0 ? void 0 : _a.getClosestPoint(evt.mapBrowserEvent.coordinate)).getExtent(), 0.001);
569
- segmentIndex = this.segments.findIndex((segment) => { var _a; return (_a = segment.getGeometry()) === null || _a === void 0 ? void 0 : _a.intersectsExtent(closestExtent); });
606
+ segmentIndex = this.segments.findIndex((segment) => {
607
+ var _a;
608
+ return (_a = segment.getGeometry()) === null || _a === void 0 ? void 0 : _a.intersectsExtent(closestExtent);
609
+ });
570
610
  }
571
611
  // Find the viaPoint that is being modified
572
- const viaPoint = (evt.features
573
- .getArray()
574
- .filter((feat) => { var _a; return ((_a = feat.getGeometry()) === null || _a === void 0 ? void 0 : _a.getType()) === 'Point'; }) ||
575
- [])[0];
612
+ const viaPoint = (evt.features.getArray().filter((feat) => {
613
+ var _a;
614
+ return ((_a = feat.getGeometry()) === null || _a === void 0 ? void 0 : _a.getType()) === 'Point';
615
+ }) || [])[0];
576
616
  // Write object with modify info
577
617
  this.initialRouteDrag = {
578
618
  oldRoute: route === null || route === void 0 ? void 0 : route.clone(),
@@ -635,29 +675,5 @@ class RoutingControl extends Control {
635
675
  this.drawRoute();
636
676
  this.dispatchEvent(new BaseEvent('change:route'));
637
677
  }
638
- get active() {
639
- return this.get('active');
640
- }
641
- set active(newValue) {
642
- this.set('active', newValue);
643
- }
644
- get loading() {
645
- return this.get('loading');
646
- }
647
- set loading(newValue) {
648
- this.set('loading', newValue);
649
- }
650
- get modify() {
651
- return this.get('modify');
652
- }
653
- set modify(newValue) {
654
- this.set('modify', newValue);
655
- }
656
- get mot() {
657
- return this.get('mot');
658
- }
659
- set mot(newValue) {
660
- this.set('mot', newValue);
661
- }
662
678
  }
663
679
  export default RoutingControl;
@@ -269,15 +269,8 @@ class RealtimeLayer extends Layer {
269
269
  highlightTrajectory(id) {
270
270
  return __awaiter(this, void 0, void 0, function* () {
271
271
  var _a, _b, _c, _d, _e, _f;
272
- if (!id) {
273
- this.cleanVectorLayer();
274
- return;
275
- }
276
272
  const features = yield this.getFullTrajectory(id);
277
- if (!(features === null || features === void 0 ? void 0 : features.length)) {
278
- this.cleanVectorLayer();
279
- return;
280
- }
273
+ this.cleanVectorLayer();
281
274
  if (features.length) {
282
275
  (_b = (_a = this.vectorLayer) === null || _a === void 0 ? void 0 : _a.getSource()) === null || _b === void 0 ? void 0 : _b.addFeatures(features);
283
276
  }
@@ -334,6 +327,7 @@ class RealtimeLayer extends Layer {
334
327
  select(feature) {
335
328
  const id = feature === null || feature === void 0 ? void 0 : feature.get('train_id');
336
329
  if (this.selectedVehicleId !== id) {
330
+ this.cleanVectorLayer();
337
331
  this.selectedVehicleId = id;
338
332
  this.engine.renderTrajectories(true);
339
333
  }
@@ -33,7 +33,6 @@ export default class MaplibreLayerRenderer extends MapLibreLayerRenderer {
33
33
  return container;
34
34
  }
35
35
  setIsReady() {
36
- console.log('ici');
37
36
  if (!this.ready) {
38
37
  this.ready = true;
39
38
  this.ignoreNextRender = true;
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "mobility-toolbox-js",
3
3
  "license": "MIT",
4
4
  "description": "Toolbox for JavaScript applications in the domains of mobility and logistics.",
5
- "version": "3.2.0",
5
+ "version": "3.2.2",
6
6
  "homepage": "https://mobility-toolbox-js.geops.io/",
7
7
  "exports": {
8
8
  ".": "./index.js",
@@ -28,7 +28,7 @@
28
28
  "@babel/preset-typescript": "^7.26.0",
29
29
  "@commitlint/cli": "19.6.1",
30
30
  "@commitlint/config-conventional": "19.6.0",
31
- "@geops/eslint-config-react": "1.5.0-beta.0",
31
+ "@geops/eslint-config-react": "1.5.0-beta.1",
32
32
  "@types/geojson": "7946.0.16",
33
33
  "@types/lodash": "^4.17.15",
34
34
  "@types/lodash.debounce": "4.0.9",
@@ -63,7 +63,7 @@
63
63
  "next": "15.1.6",
64
64
  "next-transpile-modules": "10.0.1",
65
65
  "ol": "10.4.0",
66
- "openapi-typescript": "6.7.5",
66
+ "openapi-typescript": "5",
67
67
  "prettier": "3.4.2",
68
68
  "raw-loader": "4.0.2",
69
69
  "sort-json": "2.0.1",
@@ -98,7 +98,7 @@
98
98
  "esbuild:iife:base": "esbuild src/iife.js --bundle --sourcemap --target=chrome100",
99
99
  "esbuild:iife:minify": "yarn esbuild:iife:base --minify --outfile=build/mbt.min.js",
100
100
  "esbuild:iife:unminify": "yarn esbuild:iife:base --outfile=build/mbt.js",
101
- "format": "prettier --write 'src/**/*.js' 'src/**/*.test.js' && eslint src/**/*.js src/**/*.test.js src/**/*.ts --fix && stylelint 'src/**/*.css' 'src/**/*.scss' --fix --allow-empty-input",
101
+ "format": "prettier --write 'src/**/*.js' 'src/**/*.ts' 'src/**/*.test.js' && eslint src/**/*.js src/**/*.test.js src/**/*.ts --fix && stylelint 'src/**/*.css' 'src/**/*.scss' --fix --allow-empty-input",
102
102
  "lint": "eslint src/**/*.js src/**/*.ts && stylelint src/**/*.css src/**/*.scss --allow-empty-input",
103
103
  "prepare": "is-ci || husky",
104
104
  "publish:beta": "HUSKY=0 yarn release -- --prerelease beta --skip.changelog && yarn run build && cd build && HUSKY=0 yarn publish --tag beta && git push origin HEAD && git push --tags ",
package/types/common.d.ts CHANGED
@@ -33,7 +33,7 @@ export interface ViewState {
33
33
  size?: number[];
34
34
  time?: number;
35
35
  zoom?: number;
36
- visible?:boolean;
36
+ visible?: boolean;
37
37
  }
38
38
 
39
39
  export interface RealtimeStyleOptions {
@@ -95,7 +95,6 @@ export type AnyCanvasContext =
95
95
  export type AnyRealtimeLayer = MbRealtimeLayer | OlRealtimeLayer;
96
96
  export type AnyCopyrightControl = MbCopyrightControl | OlCopyrightControl;
97
97
 
98
-
99
98
  export interface LayerGetFeatureInfoResponse {
100
99
  coordinate: Coordinate;
101
100
  features: Feature[];
@@ -104,10 +103,9 @@ export interface LayerGetFeatureInfoResponse {
104
103
 
105
104
  export interface LayerGetFeatureInfoOptions {
106
105
  nb?: number;
107
- hitTolerance: number = 5;
106
+ hitTolerance: number;
108
107
  }
109
108
 
110
-
111
109
  export type RoutingGraph = [RoutingParameters.graph, number, number];
112
110
  export type RoutingMot = RoutingParameters.mot;
113
111
  export type RoutingViaPoint = Coordinate | string;
@@ -3,64 +3,12 @@
3
3
  * Do not make direct changes to the file.
4
4
  */
5
5
 
6
- export interface Paths {
6
+ export interface paths {
7
7
  '/': {
8
8
  /** Returns a route as GeoJSON */
9
9
  get: {
10
10
  parameters: {
11
11
  query: {
12
- /**
13
- * Whether to use beelines (line strings with 2 points) between
14
- * mutually unreachable hops as a fallback for "Route not found"
15
- * errors. "true", "on", "yes", "y", "1" will enable the
16
- * fallback. Default: enabled
17
- */
18
- 'beeline-fallback'?: string;
19
- /**
20
- * Distance punishment factor for edge snapping of coordinates (see
21
- * "Note on coordinates" at the top). Large: prefer close edge. Small:
22
- * prefer short total route. Negative value: like worst edge
23
- * category. Default: -1.0
24
- */
25
- 'coord-punish'?: number;
26
- /**
27
- * Search radius for candidate edges during snapping of coordinates
28
- * (see "Note on coordinates" at the top) Default: -1.0
29
- */
30
- 'coord-radius'?: number;
31
- /** Only for mot=rail. Default is a detailed network based on OpenStreetMap. gen1 to gen4 provide rail networks with increasing levels of generalization */
32
- graph?: 'gen1' | 'gen2' | 'gen3' | 'gen4';
33
- /**
34
- * Whether to include intermediate hops (stations/stops) found on the
35
- * route to the response. "true", "on", "yes", "y", "1" will enable
36
- * intermediate hops. Default: disabled
37
- */
38
- hops?: string;
39
- /** A line name that should be preferred */
40
- line?: string;
41
- /** Name of origin of the preferred line */
42
- 'line-from'?: string;
43
- /** Name of destination of the preferred line */
44
- 'line-to'?: string;
45
- /**
46
- * Maximum allowed ratio of hops to skip if not found. Only non-start
47
- * and non-end hops are counted in ratio numerator and denominator.
48
- */
49
- 'max-skip-hop-ratio'?: number;
50
- /** Mode of transport */
51
- mot:
52
- | 'bus'
53
- | 'car'
54
- | 'coach'
55
- | 'ferry'
56
- | 'foot'
57
- | 'funicular'
58
- | 'gondola'
59
- | 'rail'
60
- | 'subway'
61
- | 'tram';
62
- /** Douglas-Peucker distance parameter for simplification. Default 0.5 in Mercator units */
63
- simplify?: number;
64
12
  /**
65
13
  * A pipe separated list of hops. A hop describes a station with either
66
14
  * - a name or abbreviation
@@ -104,6 +52,58 @@ export interface Paths {
104
52
  * - `freiburg|basel%20sbb|bern` - from Freiburg (Breisgau) Hbf via Basel SBB to Bern
105
53
  */
106
54
  via: string;
55
+ /** Mode of transport */
56
+ mot:
57
+ | 'rail'
58
+ | 'bus'
59
+ | 'coach'
60
+ | 'foot'
61
+ | 'tram'
62
+ | 'subway'
63
+ | 'gondola'
64
+ | 'funicular'
65
+ | 'ferry'
66
+ | 'car';
67
+ /** Only for mot=rail. Default is a detailed network based on OpenStreetMap. gen1 to gen4 provide rail networks with increasing levels of generalization */
68
+ graph?: 'gen1' | 'gen2' | 'gen3' | 'gen4';
69
+ /** A line name that should be preferred */
70
+ line?: string;
71
+ /** Name of origin of the preferred line */
72
+ 'line-from'?: string;
73
+ /** Name of destination of the preferred line */
74
+ 'line-to'?: string;
75
+ /** Douglas-Peucker distance parameter for simplification. Default 0.5 in Mercator units */
76
+ simplify?: number;
77
+ /**
78
+ * Maximum allowed ratio of hops to skip if not found. Only non-start
79
+ * and non-end hops are counted in ratio numerator and denominator.
80
+ */
81
+ 'max-skip-hop-ratio'?: number;
82
+ /**
83
+ * Whether to include intermediate hops (stations/stops) found on the
84
+ * route to the response. "true", "on", "yes", "y", "1" will enable
85
+ * intermediate hops. Default: disabled
86
+ */
87
+ hops?: string;
88
+ /**
89
+ * Whether to use beelines (line strings with 2 points) between
90
+ * mutually unreachable hops as a fallback for "Route not found"
91
+ * errors. "true", "on", "yes", "y", "1" will enable the
92
+ * fallback. Default: enabled
93
+ */
94
+ 'beeline-fallback'?: string;
95
+ /**
96
+ * Search radius for candidate edges during snapping of coordinates
97
+ * (see "Note on coordinates" at the top) Default: -1.0
98
+ */
99
+ 'coord-radius'?: number;
100
+ /**
101
+ * Distance punishment factor for edge snapping of coordinates (see
102
+ * "Note on coordinates" at the top). Large: prefer close edge. Small:
103
+ * prefer short total route. Negative value: like worst edge
104
+ * category. Default: -1.0
105
+ */
106
+ 'coord-punish'?: number;
107
107
  /**
108
108
  * Whether to output OSM way ids in Feature properties.
109
109
  * "true", "on", "yes", "y", "1" will enable output. Default: disabled
@@ -147,14 +147,14 @@ export interface Paths {
147
147
  * @example
148
148
  */
149
149
  id?: string;
150
- /** @description Latitude of the stop, in WGS84 */
151
- latitude?: number;
152
- /** @description Latitude of the stop, in WGS84 */
153
- longitude?: number;
154
150
  /** @example Freiburg Littenweiler */
155
151
  name?: string;
156
152
  /** @example 1 */
157
153
  platform?: string;
154
+ /** @description Latitude of the stop, in WGS84 */
155
+ latitude?: number;
156
+ /** @description Latitude of the stop, in WGS84 */
157
+ longitude?: number;
158
158
  };
159
159
  station_to?: {
160
160
  /**
@@ -162,14 +162,14 @@ export interface Paths {
162
162
  * @example 8004158
163
163
  */
164
164
  id?: string;
165
- /** @description Latitude of the stop, in WGS84 */
166
- latitude?: number;
167
- /** @description Latitude of the stop, in WGS84 */
168
- longitude?: number;
169
165
  /** @example Muenchen Pasing */
170
166
  name?: string;
171
167
  /** @example 4 */
172
168
  platform?: string;
169
+ /** @description Latitude of the stop, in WGS84 */
170
+ latitude?: number;
171
+ /** @description Latitude of the stop, in WGS84 */
172
+ longitude?: number;
173
173
  };
174
174
  /** @enum {string} */
175
175
  type?: 'Feature';
@@ -201,6 +201,6 @@ export interface Paths {
201
201
  };
202
202
  }
203
203
 
204
- export interface Operations {}
204
+ export interface operations {}
205
205
 
206
- export interface External {}
206
+ export interface external {}