@wemap/geo 6.2.2 → 7.0.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/dist/wemap-geo.es.js +66 -10
- package/dist/wemap-geo.es.js.map +1 -1
- package/package.json +4 -4
- package/src/Utils.js +4 -0
- package/src/Utils.spec.js +2 -0
package/dist/wemap-geo.es.js
CHANGED
|
@@ -36,6 +36,18 @@ Constants.CIRCUMFERENCE = Constants.R_MAJOR * 2 * Math.PI;
|
|
|
36
36
|
*/
|
|
37
37
|
class Level {
|
|
38
38
|
|
|
39
|
+
/** @type {number?} */
|
|
40
|
+
val = null;
|
|
41
|
+
|
|
42
|
+
/** @type {boolean} */
|
|
43
|
+
isRange = false;
|
|
44
|
+
|
|
45
|
+
/** @type {number?} */
|
|
46
|
+
low = null;
|
|
47
|
+
|
|
48
|
+
/** @type {number?} */
|
|
49
|
+
up = null;
|
|
50
|
+
|
|
39
51
|
/**
|
|
40
52
|
* Level constructor
|
|
41
53
|
* 1 argument: level is not a range and first argument is the level
|
|
@@ -924,6 +936,10 @@ function trimRoute(route, startPosition = route[0], length = Number.MAX_VALUE) {
|
|
|
924
936
|
let currentPointIndex;
|
|
925
937
|
let cumulativeDistance = 0;
|
|
926
938
|
|
|
939
|
+
if (route.length <= 1) {
|
|
940
|
+
throw new Error('Route must have at least 2 points');
|
|
941
|
+
}
|
|
942
|
+
|
|
927
943
|
for (currentPointIndex = 1; currentPointIndex < route.length; currentPointIndex++) {
|
|
928
944
|
|
|
929
945
|
const p1 = route[currentPointIndex - 1];
|
|
@@ -1742,6 +1758,9 @@ class GraphNode {
|
|
|
1742
1758
|
/** @type {?T} */
|
|
1743
1759
|
builtFrom = null;
|
|
1744
1760
|
|
|
1761
|
+
/** @type {boolean} */
|
|
1762
|
+
io = false;
|
|
1763
|
+
|
|
1745
1764
|
/**
|
|
1746
1765
|
* @param {Coordinates} coords
|
|
1747
1766
|
* @param {T} builtFrom
|
|
@@ -1797,6 +1816,7 @@ class GraphNode {
|
|
|
1797
1816
|
const node = new GraphNode(this.coords);
|
|
1798
1817
|
node.edges = this.edges.slice(0);
|
|
1799
1818
|
node.builtFrom = this.builtFrom;
|
|
1819
|
+
node.io = this.io;
|
|
1800
1820
|
return node;
|
|
1801
1821
|
}
|
|
1802
1822
|
|
|
@@ -1817,7 +1837,7 @@ class GraphNode {
|
|
|
1817
1837
|
}
|
|
1818
1838
|
|
|
1819
1839
|
generateLevelFromEdges() {
|
|
1820
|
-
let tmpLevel;
|
|
1840
|
+
let tmpLevel = null;
|
|
1821
1841
|
for (let i = 0; i < this.edges.length; i++) {
|
|
1822
1842
|
const edge = this.edges[i];
|
|
1823
1843
|
if (edge.level) {
|
|
@@ -1919,6 +1939,16 @@ class GraphNode {
|
|
|
1919
1939
|
return true;
|
|
1920
1940
|
}
|
|
1921
1941
|
|
|
1942
|
+
/**
|
|
1943
|
+
* Set node.io to true for nodes that make the link between
|
|
1944
|
+
* indoor and outdoor edges
|
|
1945
|
+
*/
|
|
1946
|
+
checkIO() {
|
|
1947
|
+
this.io = this._coords.level !== null
|
|
1948
|
+
&& this.edges.some(edge => edge.level === null);
|
|
1949
|
+
return true;
|
|
1950
|
+
}
|
|
1951
|
+
|
|
1922
1952
|
/**
|
|
1923
1953
|
* @param {GraphNode[]} nodes
|
|
1924
1954
|
*/
|
|
@@ -1931,10 +1961,15 @@ class GraphNode {
|
|
|
1931
1961
|
// In some cases, node levels cannot be retrieve just using adjacent edges
|
|
1932
1962
|
// (e.g stairs without network at one of its bounds)
|
|
1933
1963
|
// To infer this node level, we use inferNodeLevelByRecursion()
|
|
1934
|
-
|
|
1964
|
+
const res = nodes.reduce((acc, node) => acc
|
|
1935
1965
|
&& node.inferNodeLevelByNeighboors()
|
|
1936
1966
|
&& node.inferNodeLevelByRecursion()
|
|
1937
1967
|
, true);
|
|
1968
|
+
|
|
1969
|
+
// Finally define nodes that are links between indoor and outdoor
|
|
1970
|
+
nodes.forEach(node => node.checkIO());
|
|
1971
|
+
|
|
1972
|
+
return res;
|
|
1938
1973
|
}
|
|
1939
1974
|
}
|
|
1940
1975
|
|
|
@@ -2403,6 +2438,12 @@ class MapMatching {
|
|
|
2403
2438
|
* @returns {boolean} an array of two elements.
|
|
2404
2439
|
* First is true if projection will be used on the specified edge, false otherwise.
|
|
2405
2440
|
* Second is true if projection will be used on the nodes of the specified edge, false otherwise.
|
|
2441
|
+
*
|
|
2442
|
+
* @param {GraphEdge} edge
|
|
2443
|
+
* @param {Coordinates} location
|
|
2444
|
+
* @param {boolean} useBearing
|
|
2445
|
+
* @param {boolean} useMultiLevelSegments
|
|
2446
|
+
* @param {Function} acceptEdgeFn
|
|
2406
2447
|
*/
|
|
2407
2448
|
_shouldProjectOnEdgeAndNodes(edge, location, useBearing, useMultiLevelSegments, acceptEdgeFn) {
|
|
2408
2449
|
|
|
@@ -2427,11 +2468,11 @@ class MapMatching {
|
|
|
2427
2468
|
checkEdge = false;
|
|
2428
2469
|
}
|
|
2429
2470
|
|
|
2430
|
-
if (!Level.equalsTo(location.level, edge.node1.coords.level)) {
|
|
2471
|
+
if (!Level.equalsTo(location.level, edge.node1.coords.level) && !edge.node1.io) {
|
|
2431
2472
|
checkNode1 = false;
|
|
2432
2473
|
}
|
|
2433
2474
|
|
|
2434
|
-
if (!Level.equalsTo(location.level, edge.node2.coords.level)) {
|
|
2475
|
+
if (!Level.equalsTo(location.level, edge.node2.coords.level) && !edge.node2.io) {
|
|
2435
2476
|
checkNode2 = false;
|
|
2436
2477
|
}
|
|
2437
2478
|
|
|
@@ -2605,8 +2646,16 @@ class GraphItinerary {
|
|
|
2605
2646
|
|
|
2606
2647
|
itinerary.nodes = networkNodes.map(node => {
|
|
2607
2648
|
const newNode = node.clone();
|
|
2649
|
+
|
|
2608
2650
|
// Remove node edges, they will be added later.
|
|
2609
2651
|
newNode.edges = [];
|
|
2652
|
+
|
|
2653
|
+
// Let consider io nodes level = null for GraphItinerary
|
|
2654
|
+
if (newNode.io) {
|
|
2655
|
+
newNode.coords = newNode.coords.clone();
|
|
2656
|
+
newNode.coords.level = null;
|
|
2657
|
+
}
|
|
2658
|
+
|
|
2610
2659
|
return newNode;
|
|
2611
2660
|
});
|
|
2612
2661
|
|
|
@@ -2765,12 +2814,19 @@ class GraphRouter {
|
|
|
2765
2814
|
const startNode = retrieveOrCreateNearestNode(start);
|
|
2766
2815
|
const endNode = retrieveOrCreateNearestNode(end);
|
|
2767
2816
|
|
|
2768
|
-
|
|
2769
|
-
|
|
2770
|
-
|
|
2771
|
-
|
|
2772
|
-
|
|
2773
|
-
|
|
2817
|
+
let graphItinerary;
|
|
2818
|
+
|
|
2819
|
+
if (startNode === endNode) {
|
|
2820
|
+
graphItinerary = GraphItinerary.fromNetworkNodes([startNode], []);
|
|
2821
|
+
} else {
|
|
2822
|
+
graphItinerary = this.getShortestPathBetweenGraphNodes(
|
|
2823
|
+
startNode,
|
|
2824
|
+
endNode,
|
|
2825
|
+
acceptEdgeFn,
|
|
2826
|
+
weightEdgeFn
|
|
2827
|
+
);
|
|
2828
|
+
}
|
|
2829
|
+
|
|
2774
2830
|
graphItinerary.start = start instanceof GraphNode ? start.coords : start;
|
|
2775
2831
|
graphItinerary.end = end instanceof GraphNode ? end.coords : end;
|
|
2776
2832
|
|
package/dist/wemap-geo.es.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wemap-geo.es.js","sources":["../src/Constants.js","../src/coordinates/Level.js","../src/coordinates/Coordinates.js","../src/coordinates/UserPosition.js","../src/Utils.js","../src/coordinates/BoundingBox.js","../src/coordinates/RelativePosition.js","../src/coordinates/GeoRelativePosition.js","../src/rotations/Attitude.js","../src/rotations/AbsoluteHeading.js","../src/graph/GraphNode.js","../src/graph/GraphEdge.js","../src/graph/GraphUtils.js","../src/graph/Network.js","../src/graph/GraphProjection.js","../src/graph/MapMatching.js","../src/router/GraphItinerary.js","../src/router/NoRouteFoundError.js","../src/router/GraphRouterOptions.js","../src/router/GraphRouter.js"],"sourcesContent":["const Constants = {\n R_MAJOR: 6378137.0,\n R_MINOR: 6356752.3142,\n EARTH_GRAVITY: 9.80665,\n\n /**\n * latitude and longitude epsilon in degrees\n * 1e-8° correspond to ~1mm at latitude = 0\n */\n EPS_DEG_MM: 1e-8,\n\n /**\n * epsilon in meters which corresponds to 1 millimeter\n */\n EPS_MM: 1e-3\n};\n\nConstants.ELLIPSOID_FLATNESS = (Constants.R_MAJOR - Constants.R_MINOR) / Constants.R_MAJOR;\n\nConstants.ECCENTRICITY = Math.sqrt(Constants.ELLIPSOID_FLATNESS * (2 - Constants.ELLIPSOID_FLATNESS));\n\nConstants.R_MAJOR_2 = Constants.R_MAJOR * Constants.R_MAJOR;\nConstants.R_MAJOR_4 = Constants.R_MAJOR_2 * Constants.R_MAJOR_2;\nConstants.R_MINOR_2 = Constants.R_MINOR * Constants.R_MINOR;\nConstants.R_MINOR_4 = Constants.R_MINOR_2 * Constants.R_MINOR_2;\nConstants.ECCENTRICITY_2 = Constants.ECCENTRICITY * Constants.ECCENTRICITY;\nConstants.CIRCUMFERENCE = Constants.R_MAJOR * 2 * Math.PI;\n\nexport default Constants;\n","import Logger from '@wemap/logger';\n\n/**\n * A Level is the representation of a building floor number\n * A level can be a simple number (val) or a range (low, up)\n * To know if a level is a range or a number, isRange can be used\n */\nclass Level {\n\n /**\n * Level constructor\n * 1 argument: level is not a range and first argument is the level\n * 2 arguments: level is a range\n * @param {number} arg1 if arg2: low value, otherwise: level\n * @param {number} arg2 (optional) up value\n */\n constructor(arg1, arg2) {\n if (typeof arg1 !== 'number' || isNaN(arg1)) {\n throw new Error('first argument is mandatory');\n }\n if (typeof arg2 === 'number' && !isNaN(arg2)) {\n if (arg1 === arg2) {\n this.isRange = false;\n this.val = arg1;\n } else {\n this.isRange = true;\n this.low = Math.min(arg1, arg2);\n this.up = Math.max(arg1, arg2);\n }\n } else if (typeof arg2 === 'undefined') {\n this.isRange = false;\n this.val = arg1;\n } else {\n throw new Error('second argument is not a number');\n }\n }\n\n clone() {\n if (this.isRange) {\n return new Level(this.low, this.up);\n }\n return new Level(this.val);\n }\n\n /**\n * Create a level from a string\n * @param {string} str level in str format (eg. 1, -2, 1;2, -2;3, 2;-1, 0.5;1 ...)\n */\n static fromString(str) {\n\n if (typeof str !== 'string') {\n return null;\n }\n\n if (!isNaN(Number(str))) {\n return new Level(parseFloat(str));\n }\n\n const splited = str.split(';');\n if (splited.length === 2) {\n if (!isNaN(Number(splited[0])) && !isNaN(Number(splited[1]))) {\n return new Level(parseFloat(splited[0]), parseFloat(splited[1]));\n }\n }\n\n Logger.warn('Cannot parse following level: ' + str);\n return null;\n }\n\n /**\n * Returns if the level is inside the given level\n * @param {Level} level the container level\n */\n isInside(level) {\n return Level.contains(level, this);\n }\n\n /**\n * Returns if the level is inside the given level\n * @param {Level} level the container level\n */\n contains(level) {\n return Level.contains(this, level);\n }\n\n\n /**\n * Returns if a level is contained in another\n * @param {Level} container The container level\n * @param {Level} targeted The targeted level\n */\n static contains(container, targeted) {\n\n if (container === targeted) {\n return true;\n }\n\n if (!container || !targeted) {\n return false;\n }\n\n if (!container.isRange) {\n if (targeted.isRange) {\n return false;\n }\n return container.val === targeted.val;\n }\n\n return container.up >= (targeted.isRange ? targeted.up : targeted.val)\n && container.low <= (targeted.isRange ? targeted.low : targeted.val);\n }\n\n /**\n * Retrieve the intersection of two levels\n * @param {Level} other The other level\n */\n intersect(other) {\n return Level.intersect(this, other);\n }\n\n /**\n * Retrieve the intersection of two levels\n * @param {Level} first The first level\n * @param {Level} second The second level\n */\n static intersect(first, second) {\n\n if (first === second) {\n if (first instanceof Level) {\n return first.clone();\n }\n return null;\n }\n\n if (!second) {\n return null;\n }\n\n if (!first) {\n return null;\n }\n\n if (first.isRange && !second.isRange) {\n if (first.contains(second)) {\n return second.clone();\n }\n return null;\n }\n if (!first.isRange && second.isRange) {\n if (second.contains(first)) {\n return first.clone();\n }\n return null;\n }\n if (first.isRange && second.isRange) {\n const up = Math.min(first.up, second.up);\n const low = Math.max(first.low, second.low);\n if (up < low) {\n return null;\n }\n return new Level(low, up);\n }\n return first.val === second.val ? first : null;\n }\n\n /**\n * Retrieve the union of two levels\n * @param {Level} other The other level\n */\n union(other) {\n return Level.union(this, other);\n }\n\n /**\n * Retrieve the union of two levels\n * @param {Level} other The other level\n */\n static union(first, second) {\n\n if (first === second) {\n if (first instanceof Level) {\n return first.clone();\n }\n return null;\n }\n\n if (!second) {\n return first.clone();\n }\n\n if (!first) {\n return second.clone();\n }\n\n let low, up;\n if (!first.isRange && !second.isRange) {\n low = Math.min(first.val, second.val);\n up = Math.max(first.val, second.val);\n } else if (first.isRange && !second.isRange) {\n low = Math.min(first.low, second.val);\n up = Math.max(first.up, second.val);\n } else if (!first.isRange && second.isRange) {\n low = Math.min(second.low, first.val);\n up = Math.max(second.up, first.val);\n } else {\n /* if (first.isRange && second.isRange) */\n low = Math.min(second.low, first.low);\n up = Math.max(second.up, first.up);\n }\n\n if (low === up) {\n return new Level(low);\n }\n return new Level(low, up);\n }\n\n multiplyBy(factor) {\n if (this.isRange) {\n this.low *= factor;\n this.up *= factor;\n } else {\n this.val *= factor;\n }\n return this;\n }\n\n toString() {\n return this.isRange ? this.low + ';' + this.up : String(this.val);\n }\n\n static equalsTo(first, second) {\n\n if (first === second) {\n return true;\n }\n if (!first && !second) {\n return true;\n }\n if (!first && second) {\n return false;\n }\n if (first && !second) {\n return false;\n }\n if (!first.isRange && second.isRange) {\n return false;\n }\n if (first.isRange && !second.isRange) {\n return false;\n }\n if (first.isRange && second.isRange) {\n return first.low === second.low && first.up === second.up;\n }\n // !first.isRange && !second.isRange\n return first.val === second.val;\n\n }\n\n static diff(first, second) {\n\n if (first === null || second === null) {\n return null;\n }\n\n if (!first.isRange && !second.isRange) {\n return second.val - first.val;\n }\n\n if (first.isRange && !second.isRange) {\n if (first.low === second.val) {\n return second.val - first.up;\n }\n if (first.up === second.val) {\n return second.val - first.low;\n }\n return null;\n }\n\n if (second.isRange && !first.isRange) {\n if (first.val === second.low) {\n return second.up - first.val;\n }\n if (first.val === second.up) {\n return second.low - first.val;\n }\n return null;\n }\n\n if (Level.equalsTo(first, second)) {\n return 0;\n }\n\n return null;\n }\n\n}\n\nexport default Level;\n","import {\n deg2rad, Vector3, Quaternion, rad2deg, wrap\n} from '@wemap/maths';\n\nimport Constants from '../Constants.js';\nimport Level from './Level.js';\n\n/**\n * A Coordinates position using at least latitude (lat) and longitude (lng).\n * Optionnal fields are: altitude (alt) and level.\n *\n * Basic geo methods are directly accessibles from here:\n * distanceTo, bearingTo, toEcef...\n *\n * /!\\ This class has been adapted to use earth as a sphere and not as an ellipsoid\n * /!\\ So, this class does not stricly represent WGS84 coordinates anymore\n * /!\\ This modifications have been made for computational improvements.\n */\nclass Coordinates {\n\n autoWrap = true;\n\n constructor(lat, lng, alt, level) {\n this.lat = lat;\n this.lng = lng;\n this.alt = alt;\n this.level = level;\n this._ecef = null;\n }\n\n get lat() {\n return this._lat;\n }\n\n get latitude() {\n return this._lat;\n }\n\n get lng() {\n return this._lng;\n }\n\n get longitude() {\n return this._lng;\n }\n\n /**\n * alt does not denote the altitude of a point but its height from\n * the \"level\" field (if defined) or from the ground\n */\n get alt() {\n return this._alt;\n }\n\n get level() {\n return this._level;\n }\n\n set lat(lat) {\n if (typeof lat === 'number' && Math.abs(lat) <= 90) {\n this._lat = lat;\n } else {\n throw new Error('lat argument is not in [-90; 90]');\n }\n this._ecef = null;\n }\n\n set latitude(lat) {\n throw new Error('Please use Coordinate#lat setter instead of Coordinate#latitude');\n }\n\n set lng(lng) {\n if (typeof lng === 'number') {\n this._lng = lng;\n if (this.autoWrap) {\n this.wrap();\n }\n } else {\n throw new Error('lng argument is not a number');\n }\n this._ecef = null;\n }\n\n set longitude(lng) {\n throw new Error('Please use Coordinate#lng setter instead of Coordinate#longitude');\n }\n\n set alt(alt) {\n if (typeof alt === 'number') {\n this._alt = alt;\n } else {\n if (typeof alt !== 'undefined' && alt !== null) {\n throw new Error('alt argument is not a finite number');\n }\n this._alt = null;\n }\n this._ecef = null;\n }\n\n set level(level) {\n if (level instanceof Level) {\n this._level = level;\n } else {\n if (typeof level !== 'undefined' && level !== null) {\n throw new Error('level argument is not a Level object');\n }\n this._level = null;\n }\n }\n\n clone() {\n const output = new Coordinates(this.lat, this.lng, this.alt);\n if (this.level) {\n output.level = this.level.clone();\n }\n return output;\n }\n\n wrap() {\n if (this._lng <= -180 || this._lng > 180) {\n this._lng = wrap(this._lng, -180, 180);\n }\n }\n\n /**\n * Compares two Coordinates\n * @param {Coordinates} pos1 position 1\n * @param {Coordinates} pos2 position 2\n * @param {Number} eps latitude and longitude epsilon in degrees (default: 1e-8 [~1mm at lat=0])\n * @param {Number} epsAlt altitude epsilon in meters (default: 1e-3 [= 1mm])\n */\n static equalsTo(pos1, pos2, eps = Constants.EPS_DEG_MM, epsAlt = Constants.EPS_MM) {\n\n // Handle null comparison\n if (pos1 === null && pos1 === pos2) {\n return true;\n }\n\n if (!(pos1 instanceof Coordinates) || !(pos2 instanceof Coordinates)) {\n return false;\n }\n\n return Math.abs(pos2.lat - pos1.lat) < eps\n && Math.abs(pos2.lng - pos1.lng) < eps\n && (pos1.alt === pos2.alt\n || pos1.alt !== null && pos2.alt !== null\n && Math.abs(pos2.alt - pos1.alt) < epsAlt)\n && Level.equalsTo(pos1.level, pos2.level);\n }\n\n equalsTo(other) {\n return Coordinates.equalsTo(this, other);\n }\n\n destinationPoint(distance, bearing, elevation) {\n const newPoint = this.clone();\n newPoint.move(distance, bearing, elevation);\n return newPoint;\n }\n\n // Source: http://www.movable-type.co.uk/scripts/latlong.html#destPoint\n move(distance, bearing, elevation) {\n\n const dR = distance / Constants.R_MAJOR;\n const cosDr = Math.cos(dR);\n const sinDr = Math.sin(dR);\n\n const phi1 = deg2rad(this.lat);\n const lambda1 = deg2rad(this.lng);\n\n const phi2 = Math.asin(\n Math.sin(phi1) * cosDr\n + Math.cos(phi1) * sinDr * Math.cos(bearing)\n );\n const lambda2 = lambda1 + Math.atan2(\n Math.sin(bearing) * sinDr * Math.cos(phi1),\n cosDr - Math.sin(phi1) * Math.sin(phi2)\n );\n\n this.lat = rad2deg(phi2);\n this.lng = rad2deg(lambda2);\n\n if (typeof elevation === 'number') {\n if (this.alt === null) {\n throw new Error('Point altitude is not defined');\n }\n this.alt += elevation;\n }\n\n\n return this;\n }\n\n /**\n * Returns a distance between two points in meters\n * @param {Coordinates} location2 latitude / longitude point\n * @return {Number} distance in meters\n */\n distanceTo(location2) {\n const lat1 = this.lat;\n const lng1 = this.lng;\n\n const lat2 = location2.lat;\n const lng2 = location2.lng;\n\n const dlat = deg2rad(lat2 - lat1);\n const dlng = deg2rad(lng2 - lng1);\n\n const dlngsin = Math.sin(dlng / 2);\n const dlatsin = Math.sin(dlat / 2);\n const lat1rad = deg2rad(lat1);\n const lat1cos = Math.cos(lat1rad);\n const lat2rad = deg2rad(lat2);\n const lat2cos = Math.cos(lat2rad);\n const angle = dlatsin * dlatsin + lat1cos * lat2cos * dlngsin * dlngsin;\n\n // arctangent\n const tangy = Math.sqrt(angle);\n const tangx = Math.sqrt(1 - angle);\n const cosn = 2 * Math.atan2(tangy, tangx);\n\n return Constants.R_MAJOR * cosn;\n }\n\n static distanceBetween(point1, point2) {\n return point1.distanceTo(point2);\n }\n\n bearingTo(location2) {\n const lat1 = deg2rad(this.lat);\n const lat2 = deg2rad(location2.lat);\n const diffLng = deg2rad(location2.lng - this.lng);\n\n return Math.atan2(Math.sin(diffLng) * Math.cos(lat2),\n Math.cos(lat1) * Math.sin(lat2) - Math.sin(lat1) * Math.cos(lat2) * Math.cos(diffLng));\n }\n\n static bearingTo(point1, point2) {\n return point1.bearingTo(point2);\n }\n\n\n /**\n * ECEF Transformations\n * Here we used a light version of ECEF considering earth\n * as a sphere instead of an ellipse\n */\n\n get enuToEcefRotation() {\n const rot1 = Quaternion.fromAxisAngle([0, 0, 1], Math.PI / 2 + deg2rad(this.lng));\n const rot2 = Quaternion.fromAxisAngle([1, 0, 0], Math.PI / 2 - deg2rad(this.lat));\n return Quaternion.multiply(rot1, rot2);\n }\n\n get ecefToEnuRotation() {\n const rot1 = Quaternion.fromAxisAngle([1, 0, 0], deg2rad(this.lat) - Math.PI / 2);\n const rot2 = Quaternion.fromAxisAngle([0, 0, 1], -deg2rad(this.lng) - Math.PI / 2);\n return Quaternion.multiply(rot1, rot2);\n }\n\n // https://gist.github.com/klucar/1536194\n // Adapted for spherical formula\n get ecef() {\n\n if (!this._ecef) {\n const lat = deg2rad(this.lat);\n const lng = deg2rad(this.lng);\n const alt = this.alt || 0;\n\n const x = (Constants.R_MAJOR + alt) * Math.cos(lat) * Math.cos(lng);\n const y = (Constants.R_MAJOR + alt) * Math.cos(lat) * Math.sin(lng);\n const z = (Constants.R_MAJOR + alt) * Math.sin(lat);\n\n this._ecef = [x, y, z];\n }\n\n return this._ecef;\n }\n\n static fromECEF(ecef) {\n\n const x = ecef[0];\n const y = ecef[1];\n const z = ecef[2];\n\n const p = Math.sqrt(x ** 2 + y ** 2);\n\n let lng = Math.atan2(y, x);\n const lat = Math.atan2(z, p);\n const alt = p / Math.cos(lat) - Constants.R_MAJOR;\n\n lng = lng % (2 * Math.PI);\n\n const newPoint = new Coordinates(rad2deg(lat), rad2deg(lng), alt);\n newPoint._ecef = ecef;\n return newPoint;\n }\n\n\n // https://stackoverflow.com/questions/1299567/how-to-calculate-distance-from-a-point-to-a-line-segment-on-a-sphere\n // Adapted to ECEF\n getSegmentProjection(p1, p2) {\n\n const a = Vector3.normalize(p1.ecef);\n const b = Vector3.normalize(p2.ecef);\n const c = Vector3.normalize(this.ecef);\n\n const G = Vector3.cross(a, b);\n if (Vector3.norm(G) === 0) {\n return null;\n }\n\n const F = Vector3.cross(c, G);\n const t = Vector3.normalize(Vector3.cross(G, F));\n\n const posECEF = Vector3.multiplyScalar(t, Constants.R_MAJOR);\n const poseCoordinates = Coordinates.fromECEF(posECEF);\n\n // poseCoordinates.alt is not 0 here due to the ECEF transformation residual.\n // So if p1.alt and p2.alt are defined we take the middle elevation between p1 and p2.\n // Otherwise we remove alt from projection because the residual has no sense.\n let alt;\n if (p1.alt !== null && p2.alt !== null) {\n // This formula is maybe not the best one.\n alt = (p1.alt + p2.alt) / 2;\n }\n const projection = new Coordinates(poseCoordinates.lat, poseCoordinates.lng,\n alt, Level.intersect(p1.level, p2.level));\n\n if (Math.abs((p1.distanceTo(p2) - p1.distanceTo(projection) - p2.distanceTo(projection))) > Constants.EPS_MM) {\n return null;\n }\n\n return projection;\n }\n\n /**\n * Input / Output\n */\n\n toString() {\n let str = '[' + this._lat.toFixed(7) + ', ' + this._lng.toFixed(7);\n if (this._alt !== null) {\n str += ', ' + this._alt.toFixed(2);\n }\n if (this._level !== null) {\n str += ', [' + this._level.toString() + ']';\n }\n str += ']';\n return str;\n }\n\n toJson() {\n const output = {\n lat: this.lat,\n lng: this.lng\n };\n if (this.alt !== null) {\n output.alt = this.alt;\n }\n if (this.level !== null) {\n output.level = this.level.toString();\n }\n return output;\n }\n\n static fromJson(json) {\n return new Coordinates(json.lat, json.lng, json.alt, Level.fromString(json.level));\n }\n\n toCompressedJson() {\n const output = [this.lat, this.lng];\n if (this.alt !== null || this.level !== null) {\n output.push(this.alt);\n }\n if (this.level !== null) {\n output.push(this.level.toString());\n }\n return output;\n }\n\n static fromCompressedJson(json) {\n const coords = new Coordinates(json[0], json[1]);\n if (json.length > 2) {\n coords.alt = json[2];\n }\n if (json.length > 3) {\n coords.level = Level.fromString(json[3]);\n }\n return coords;\n }\n}\n\nexport default Coordinates;\n","import Coordinates from './Coordinates.js';\nimport Constants from '../Constants.js';\n\n/**\n * A Coordinates User Position is a Coordinates position with specific data related to user (bearing, time, accuracy)\n */\nclass UserPosition extends Coordinates {\n\n _time = null;\n _accuracy = null;\n _bearing = null;\n\n constructor(lat, lng, alt, level, time, accuracy, bearing) {\n super(lat, lng, alt, level);\n this.time = time;\n this.accuracy = accuracy;\n this.bearing = bearing;\n }\n\n get time() {\n return this._time;\n }\n\n set time(time) {\n if (typeof time === 'number') {\n this._time = time;\n } else {\n if (typeof time !== 'undefined' && time !== null) {\n throw new Error('time argument is not a number');\n }\n this._time = null;\n }\n }\n\n\n get accuracy() {\n return this._accuracy;\n }\n\n set accuracy(accuracy) {\n if (typeof accuracy === 'number' && accuracy >= 0) {\n this._accuracy = accuracy;\n } else {\n if (typeof accuracy !== 'undefined' && accuracy !== null) {\n throw new Error('accuracy argument is not a positive number');\n }\n this._accuracy = null;\n }\n }\n\n\n get bearing() {\n return this._bearing;\n }\n\n set bearing(bearing) {\n if (typeof bearing === 'number') {\n this._bearing = bearing % (2 * Math.PI);\n } else {\n if (typeof bearing !== 'undefined' && bearing !== null) {\n throw new Error('bearing argument is not a number');\n }\n this._bearing = null;\n }\n }\n\n\n // Create a UserPosition with lat, lng, alt from Coordinates coordinates and\n // other fields from another UserPosition\n static fromCoordinates(coordinates) {\n return new UserPosition(coordinates.lat, coordinates.lng,\n coordinates.alt, coordinates.level);\n }\n\n clone() {\n const cloned = UserPosition.fromCoordinates(super.clone());\n cloned.time = this.time;\n cloned.accuracy = this.accuracy;\n cloned.bearing = this.bearing;\n return cloned;\n }\n\n\n /**\n * Compares two UserPosition\n * @param {UserPosition} pos1 position 1\n * @param {UserPosition} pos2 position 2\n * @param {Number} eps latitude and longitude epsilon in degrees (default: 1e-8 [~1mm at lat=0])\n * @param {Number} epsAlt altitude epsilon in meters (default: 1e-3 [= 1mm])\n */\n static equalsTo(pos1, pos2, eps = Constants.EPS_DEG_MM, epsAlt = Constants.EPS_MM) {\n\n // Handle null comparison\n if (pos1 === null && pos1 === pos2) {\n return true;\n }\n\n if (!(pos1 instanceof UserPosition) || !(pos2 instanceof UserPosition)) {\n return false;\n }\n\n if (!super.equalsTo(pos1, pos2, eps, epsAlt)) {\n return false;\n }\n\n return pos1.time === pos2.time\n && pos1.accuracy === pos2.accuracy\n && pos1.bearing === pos2.bearing;\n }\n\n equalsTo(other) {\n return UserPosition.equalsTo(this, other);\n }\n\n\n toJson() {\n const output = super.toJson();\n if (this.time !== null) {\n output.time = this.time;\n }\n if (this.accuracy !== null) {\n output.accuracy = this.accuracy;\n }\n if (this.bearing !== null) {\n output.bearing = this.bearing;\n }\n return output;\n }\n\n static fromJson(json) {\n const position = UserPosition.fromCoordinates(Coordinates.fromJson(json));\n position.time = json.time;\n position.accuracy = json.accuracy;\n position.bearing = json.bearing;\n return position;\n }\n}\n\nexport default UserPosition;\n","/* eslint-disable max-statements */\n\nimport {\n deg2rad, positiveMod\n} from '@wemap/maths';\n\nimport Constants from './Constants.js';\nimport Coordinates from './coordinates/Coordinates.js';\nimport UserPosition from './coordinates/UserPosition.js';\n\n/**\n * Sample a route of Coordinates\n * @param {Array.<Coordinates>} route ordered points\n * @param {*} stepSize step size to sample\n * @param {*} maxLength max route length to sample\n */\nexport function sampleRoute(route, stepSize = 0.7, startSampling = 0, length = Number.MAX_VALUE) {\n\n const endSampling = startSampling + length;\n\n const sampledRoute = [];\n\n let lastSample = null;\n\n let totalDistanceTraveled = 0;\n let distanceToNextSample;\n let startFound = false;\n\n for (let segmentIndex = 0; segmentIndex < route.length - 1; segmentIndex++) {\n\n const p1 = route[segmentIndex];\n const p2 = route[segmentIndex + 1];\n const segmentSize = p1.distanceTo(p2);\n const segmentBearing = p1.bearingTo(p2);\n\n let distanceTraveledOnSegment = 0;\n\n if (!startFound) {\n if (startSampling < totalDistanceTraveled + segmentSize) {\n startFound = true;\n distanceToNextSample = startSampling - totalDistanceTraveled;\n } else {\n totalDistanceTraveled += segmentSize;\n continue;\n }\n }\n\n lastSample = p1;\n while (distanceTraveledOnSegment + distanceToNextSample < segmentSize\n && totalDistanceTraveled + distanceToNextSample <= endSampling) {\n\n const newPoint = lastSample.destinationPoint(distanceToNextSample, segmentBearing);\n newPoint.bearing = segmentBearing;\n sampledRoute.push(newPoint);\n lastSample = newPoint;\n\n distanceTraveledOnSegment += distanceToNextSample;\n totalDistanceTraveled += distanceToNextSample;\n distanceToNextSample = stepSize;\n }\n\n if (totalDistanceTraveled + distanceToNextSample > endSampling) {\n break;\n }\n\n const rest = segmentSize - distanceTraveledOnSegment;\n totalDistanceTraveled += rest;\n distanceToNextSample -= rest;\n }\n\n return sampledRoute;\n}\n\n/**\n * Trim a route of Coordinates\n * @param {Array.<Coordinates>} route ordered points\n * @param {Coordinates} startPosition position where the trim starts. startPosition has to be on the route.\n * @param {*} maxLength max route length\n */\nexport function trimRoute(route, startPosition = route[0], length = Number.MAX_VALUE) {\n\n const newRoute = [];\n let previousPoint;\n\n let currentPointIndex;\n let cumulativeDistance = 0;\n\n for (currentPointIndex = 1; currentPointIndex < route.length; currentPointIndex++) {\n\n const p1 = route[currentPointIndex - 1];\n const p2 = route[currentPointIndex];\n\n if (Coordinates.equalsTo(startPosition, p1)) {\n newRoute.push(p1);\n previousPoint = p1;\n break;\n }\n\n const proj = startPosition.getSegmentProjection(p1, p2);\n if (proj && Coordinates.equalsTo(startPosition, proj) && !proj.equalsTo(p2)) {\n newRoute.push(proj);\n previousPoint = proj;\n break;\n }\n }\n\n if (!newRoute.length) {\n throw new Error('startPosition is not on the route');\n }\n\n while (currentPointIndex < route.length) {\n const currentPoint = route[currentPointIndex];\n const dist = previousPoint.distanceTo(currentPoint);\n if (cumulativeDistance + dist >= length\n || Math.abs(cumulativeDistance + dist - length) <= Constants.EPS_MM) {\n const bearing = previousPoint.bearingTo(currentPoint);\n const remainingLength = length - cumulativeDistance;\n const end = previousPoint.destinationPoint(remainingLength, bearing);\n newRoute.push(end);\n break;\n }\n newRoute.push(currentPoint);\n previousPoint = currentPoint;\n cumulativeDistance += dist;\n currentPointIndex++;\n }\n\n return newRoute;\n}\n\n/**\n * @param {Coordinates[]} coords\n * @param {number} precision\n * @returns {Coordinates[]}\n */\nexport function simplifyRoute(coords, precisionAngle = deg2rad(5)) {\n\n const isClosed = (coords[0].equalsTo(coords[coords.length - 1]));\n\n let newRoute = coords.slice(0, coords.length - (isClosed ? 1 : 0));\n\n const len = newRoute.length;\n for (let i = isClosed ? 0 : 1; i < len; i++) {\n\n const p0 = coords[positiveMod(i - 1, len)];\n const p1 = coords[i];\n const p2 = coords[positiveMod(i + 1, len)];\n\n const seg1Dir = p0.bearingTo(p1);\n const seg2Dir = p1.bearingTo(p2);\n\n if (Math.abs(seg2Dir - seg1Dir) < precisionAngle) {\n newRoute = newRoute.filter(coord => coord !== p1);\n }\n }\n\n if (isClosed) {\n newRoute.push(newRoute[0]);\n }\n\n return newRoute;\n}\n\n/**\n * @param {GeolocationPosition} geolocationPosition\n * @returns {UserPosition}\n */\nexport function geolocationPositionToUserPosition(geolocationPosition) {\n if (geolocationPosition === null) {\n return null;\n }\n\n const { latitude, longitude, accuracy, heading } = geolocationPosition.coords;\n\n const userPosition = new UserPosition(latitude, longitude);\n userPosition.time = geolocationPosition.timestamp;\n userPosition.accuracy = accuracy;\n userPosition.bearing = heading ? deg2rad(heading) : null;\n return userPosition;\n}\n","import Coordinates from './Coordinates.js';\n\nclass BoundingBox {\n\n northEast;\n southWest;\n\n constructor(northEast, southWest) {\n this.northEast = northEast || null;\n this.southWest = southWest || null;\n\n if (this.northEast && this.southWest && this.getNorth() < this.getSouth()) {\n throw new Error('Incorrect bounding box');\n }\n }\n\n /**\n * Returns the geographical coordinate equidistant from the bounding box's corners.\n *\n * @returns {Coordinates} The bounding box's center.\n */\n get center() {\n const latCenter = (this.southWest.lat + this.northEast.lat) / 2;\n const lngCenter = (this.northEast.lng + this.southWest.lng) / 2;\n return new Coordinates(latCenter, lngCenter);\n }\n\n /**\n * Check if a point is contained in the bounding box.\n *\n * @returns {Coordinates} The point to analyze.\n */\n contains(point) {\n return point.lat <= this.northEast.lat\n && point.lat >= this.southWest.lat\n && point.lng <= this.northEast.lng\n && point.lng >= this.southWest.lng;\n }\n\n /**\n * Extend the bounds to include a given LngLat or LngLatBounds.\n *\n * @param {Coordinates|BoundingBox} obj object to extend to\n * @returns {BoundingBox} `this`\n */\n extend(obj) {\n const sw = this.southWest,\n ne = this.northEast;\n let sw2, ne2;\n\n if (obj instanceof Coordinates) {\n sw2 = obj;\n ne2 = obj;\n\n } else if (obj instanceof BoundingBox) {\n sw2 = obj.southWest;\n ne2 = obj.northEast;\n\n if (!sw2 || !ne2) {\n return this;\n }\n } else {\n throw new Error('Unknown parameter');\n }\n\n if (!sw && !ne) {\n this.southWest = new Coordinates(sw2.lat, sw2.lng);\n this.northEast = new Coordinates(ne2.lat, ne2.lng);\n\n } else {\n this.southWest = new Coordinates(\n Math.min(sw2.lat, sw.lat),\n Math.min(sw2.lng, sw.lng)\n );\n this.northEast = new Coordinates(\n Math.max(ne2.lat, ne.lat),\n Math.max(ne2.lng, ne.lng)\n );\n }\n\n return this;\n }\n\n /**\n * This method extends the bounding box with a value in meters\n * /*\\ This method is not precise as distance differs in function of latitude\n * @param {!number} measure in meters\n */\n extendsWithMeasure(measure) {\n\n if (typeof measure !== 'number') {\n throw new Error('measure is not a number');\n }\n\n this.northEast = this.northEast\n .destinationPoint(measure, 0)\n .move(measure, Math.PI / 2);\n\n this.southWest = this.southWest.clone()\n .destinationPoint(measure, -Math.PI / 2)\n .destinationPoint(measure, Math.PI);\n\n return this;\n }\n\n /**\n * Returns bounds created by extending or retracting the current bounds by a given ratio in each direction.\n * For example, a ratio of 0.5 extends the bounds by 50% in each direction.\n * Negative values will retract the bounds.\n * @param {Number} bufferRatio\n * @returns {BoundingBox} `this`\n */\n pad(bufferRatio) {\n const sw = this.southWest;\n const ne = this.northEast;\n\n const heightBuffer = Math.abs(sw.lat - ne.lat) * bufferRatio;\n const widthBuffer = Math.abs(sw.lng - ne.lng) * bufferRatio;\n\n this.southWest = new Coordinates(sw.lat - heightBuffer, sw.lng - widthBuffer);\n this.northEast = new Coordinates(ne.lat + heightBuffer, ne.lng + widthBuffer);\n\n return this;\n }\n\n /**\n * Returns the southwest corner of the bounding box.\n *\n * @returns {Coordinates} The southwest corner of the bounding box.\n */\n getSouthWest() {\n return this.southWest;\n }\n\n /**\n * Returns the northeast corner of the bounding box.\n *\n * @returns {Coordinates} The northeast corner of the bounding box.\n */\n getNorthEast() {\n return this.northEast;\n }\n\n /**\n * Returns the northwest corner of the bounding box.\n *\n * @returns {Coordinates} The northwest corner of the bounding box.\n */\n getNorthWest() {\n return new Coordinates(this.getNorth(), this.getWest());\n }\n\n /**\n * Returns the southeast corner of the bounding box.\n *\n * @returns {LngLat} The southeast corner of the bounding box.\n */\n getSouthEast() {\n return new Coordinates(this.getSouth(), this.getEast());\n }\n\n /**\n * Returns the west edge of the bounding box.\n *\n * @returns {number} The west edge of the bounding box.\n */\n getWest() {\n return this.southWest.lng;\n }\n\n /**\n * Returns the south edge of the bounding box.\n *\n * @returns {number} The south edge of the bounding box.\n */\n getSouth() {\n return this.southWest.lat;\n }\n\n /**\n * Returns the east edge of the bounding box.\n *\n * @returns {number} The east edge of the bounding box.\n */\n getEast() {\n return this.northEast.lng;\n }\n\n /**\n * Returns the north edge of the bounding box.\n *\n * @returns {number} The north edge of the bounding box.\n */\n getNorth() {\n return this.northEast.lat;\n }\n\n static equalsTo(bb1, bb2) {\n return Coordinates.equalsTo(bb1.northEast, bb2.northEast)\n && Coordinates.equalsTo(bb1.southWest, bb2.southWest);\n }\n\n equalsTo(other) {\n return BoundingBox.equalsTo(this, other);\n }\n\n /**\n * Create a BoundingBox from a WSEN array\n * @param {Number[4]} bounds a WSEN array\n * @returns {BoundingBox} the corresponding BoundingBox\n */\n static fromArray(bounds) {\n return new BoundingBox(\n new Coordinates(bounds[3], bounds[2]),\n new Coordinates(bounds[1], bounds[0])\n );\n }\n\n /**\n * Returns the WSEN array\n * @returns {Number[4]} the WSEN array\n */\n toArray() {\n return [this.getWest(), this.getSouth(), this.getEast(), this.getNorth()];\n }\n}\n\nexport default BoundingBox;\n","import Constants from '../Constants.js';\n\nclass RelativePosition {\n\n _x = 0;\n _y = 0;\n _z = 0;\n _time = null;\n _accuracy = null;\n _bearing = null;\n\n constructor(x, y, z, time, accuracy, bearing) {\n this.x = x;\n this.y = y;\n this.z = z;\n this.time = time;\n this.accuracy = accuracy;\n this.bearing = bearing;\n }\n\n get x() {\n return this._x;\n }\n\n set x(x) {\n if (typeof x === 'number') {\n this._x = x;\n } else {\n throw new Error('x argument is not a number');\n }\n }\n\n get y() {\n return this._y;\n }\n\n set y(y) {\n if (typeof y === 'number') {\n this._y = y;\n } else {\n throw new Error('y argument is not a number');\n }\n }\n\n get z() {\n return this._z;\n }\n\n set z(z) {\n if (typeof z === 'number') {\n this._z = z;\n } else {\n throw new Error('z argument is not a number');\n }\n }\n\n get time() {\n return this._time;\n }\n\n set time(time) {\n if (typeof time === 'number') {\n this._time = time;\n } else {\n if (typeof time !== 'undefined' && time !== null) {\n throw new Error('time argument is not a number');\n }\n this._time = null;\n }\n }\n\n\n get accuracy() {\n return this._accuracy;\n }\n\n set accuracy(accuracy) {\n if (typeof accuracy === 'number' && accuracy >= 0) {\n this._accuracy = accuracy;\n } else {\n if (typeof accuracy !== 'undefined' && accuracy !== null) {\n throw new Error('accuracy argument is not a positive number');\n }\n this._accuracy = null;\n }\n }\n\n\n get bearing() {\n return this._bearing;\n }\n\n set bearing(bearing) {\n if (typeof bearing === 'number') {\n this._bearing = bearing % (2 * Math.PI);\n } else {\n if (typeof bearing !== 'undefined' && bearing !== null) {\n throw new Error('bearing argument is not a number');\n }\n this._bearing = null;\n }\n }\n\n clone() {\n return new RelativePosition(this.x, this.y, this.z, this.time, this.accuracy, this.bearing);\n }\n\n\n /**\n * Compares two RelativePosition\n * @param {RelativePosition} pos1 position 1\n * @param {RelativePosition} pos2 position 2\n * @param {Number} eps x, y, z epsilon in meters (default: 1e-3 [= 1mm])\n */\n static equalsTo(pos1, pos2, eps = Constants.EPS_MM) {\n\n // Handle null comparison\n if (pos1 === null && pos1 === pos2) {\n return true;\n }\n\n if (!(pos1 instanceof RelativePosition) || !(pos2 instanceof RelativePosition)) {\n return false;\n }\n\n return Math.abs(pos2.x - pos1.x) < eps\n && Math.abs(pos2.y - pos1.y) < eps\n && Math.abs(pos2.z - pos1.z) < eps\n && pos1.time === pos2.time\n && pos1.accuracy === pos2.accuracy\n && pos1.bearing === pos2.bearing;\n }\n\n equalsTo(other) {\n return RelativePosition.equalsTo(this, other);\n }\n\n\n toJson() {\n const output = {\n x: this.x,\n y: this.y,\n z: this.z\n };\n\n if (this.time !== null) {\n output.time = this.time;\n }\n if (this.accuracy !== null) {\n output.accuracy = this.accuracy;\n }\n if (this.bearing !== null) {\n output.bearing = this.bearing;\n }\n return output;\n }\n\n static fromJson(json) {\n return new RelativePosition(json.x, json.y, json.z, json.time, json.accuracy, json.bearing);\n }\n}\n\nexport default RelativePosition;\n","import RelativePosition from './RelativePosition.js';\n\n/**\n * Position is defined in EUS (East-Up-South) frame with: x pointing to East, y pointing to Up, z pointing to South\n * This frame is close to ThreeJS / OpenGL frame.\n */\nclass GeoRelativePosition extends RelativePosition { }\n\nexport default GeoRelativePosition;\n","import {\n Rotations, Quaternion, rad2deg, deg2rad\n} from '@wemap/maths';\n\nclass Attitude {\n\n _quaternion = [1, 0, 0, 0];\n _heading = null;\n _eulerAngles = null;\n _time = null;\n _accuracy = null;\n\n /**\n *\n * @param {number[]} quaternion\n * @param {number} time\n * @param {number} accuracy\n */\n constructor(quaternion, time, accuracy) {\n this.quaternion = quaternion;\n this.time = time;\n this.accuracy = accuracy;\n }\n\n static unitary() {\n return new Attitude([1, 0, 0, 0]);\n }\n\n /**\n * @returns {number[]}\n */\n get quaternion() {\n return this._quaternion;\n }\n\n /**\n * @param {number[]} quaternion\n */\n set quaternion(quaternion) {\n if (!Array.isArray(quaternion)\n || quaternion.length !== 4\n || Math.abs(1 - Quaternion.norm(quaternion)) > 1e-4) {\n throw new Error('quaternion is not a unit quaternion');\n }\n this._quaternion = quaternion;\n this._heading = null;\n this._eulerAngles = null;\n }\n\n /**\n * @returns {number}\n */\n get time() {\n return this._time;\n }\n\n /**\n * @param {number} time\n */\n set time(time) {\n if (typeof time === 'number') {\n this._time = time;\n } else {\n if (typeof time !== 'undefined' && time !== null) {\n throw new Error('time argument is not a number');\n }\n this._time = null;\n }\n }\n\n /**\n * @returns {number}\n */\n get accuracy() {\n return this._accuracy;\n }\n\n /**\n * @param {number} accuracy\n */\n set accuracy(accuracy) {\n if (typeof accuracy === 'number' && accuracy >= 0 && accuracy <= Math.PI) {\n this._accuracy = accuracy;\n } else {\n if (typeof accuracy !== 'undefined' && accuracy !== null) {\n throw new Error('accuracy argument (' + accuracy + ') is not in range [0; PI]');\n }\n this._accuracy = null;\n }\n }\n\n /** @type {number[]} */\n get eulerAngles() {\n if (this._eulerAngles === null) {\n this._eulerAngles = Rotations.quaternionToEulerZXY(this.quaternion);\n }\n return this._eulerAngles;\n }\n\n /** @type {number[]} */\n get eulerAnglesDegrees() {\n return this.eulerAngles.map(x => rad2deg(x));\n }\n\n /** @type {number} */\n get heading() {\n if (this._heading === null) {\n let offset = 0;\n if (typeof (window) !== 'undefined' && window && window.orientation) {\n offset = deg2rad(window.orientation);\n }\n this._heading = Rotations.getHeadingFromQuaternion(this.quaternion) + offset;\n }\n return this._heading;\n }\n\n /** @type {number} */\n get headingDegrees() {\n return rad2deg(this.heading);\n }\n\n /**\n * Compares two Attitude\n * @param {Attitude} att1 attitude 1\n * @param {Attitude} att2 attitude 2\n */\n static equalsTo(att1, att2) {\n\n // Handle null comparison\n if (att1 === null && att1 === att2) {\n // TODO not sure to return true here.\n return true;\n }\n\n if (!(att1 instanceof Attitude) || !(att2 instanceof Attitude)) {\n return false;\n }\n\n if (att1 === att2) {\n return true;\n }\n\n return Quaternion.equalsTo(att1.quaternion, att2.quaternion);\n }\n\n /**\n * @param {Attitude} other\n * @returns {boolean}\n */\n equalsTo(other) {\n return Attitude.equalsTo(this, other);\n }\n\n /**\n * @returns {object}\n */\n toJson() {\n return this.quaternion;\n }\n\n /**\n * @param {object} json\n * @returns {Attitude}\n */\n static fromJson(json) {\n return new Attitude(json);\n }\n\n /**\n * @returns {Attitude}\n */\n clone() {\n return new Attitude(this.quaternion.slice(0), this.time, this.accuracy);\n }\n}\n\nexport default Attitude;\n","import { Quaternion } from '@wemap/maths';\n\nimport Attitude from './Attitude.js';\n\nclass AbsoluteHeading {\n\n _heading = null;\n _time = null;\n _accuracy = null;\n\n /**\n *\n * @param {Number} heading\n * @param {Number} time\n * @param {Number} accuracy\n */\n constructor(heading, time, accuracy) {\n this.heading = heading;\n this.time = time;\n this.accuracy = accuracy;\n }\n\n /**\n * @returns {Number}\n */\n get heading() {\n return this._heading;\n }\n\n /**\n * @param {Number} heading\n */\n set heading(heading) {\n if (typeof heading === 'number') {\n this._heading = heading;\n } else {\n throw new Error('heading argument is not a number');\n }\n }\n\n /**\n * @returns {Number}\n */\n get time() {\n return this._time;\n }\n\n /**\n * @param {Number} time\n */\n set time(time) {\n if (typeof time === 'number') {\n this._time = time;\n } else {\n if (typeof time !== 'undefined' && time !== null) {\n throw new Error('time argument is not a number');\n }\n this._time = null;\n }\n }\n\n /**\n * @returns {Number}\n */\n get accuracy() {\n return this._accuracy;\n }\n\n /**\n * @param {Number} accuracy\n */\n set accuracy(accuracy) {\n if (typeof accuracy === 'number' && accuracy >= 0 && accuracy <= Math.PI) {\n this._accuracy = accuracy;\n } else {\n if (typeof accuracy !== 'undefined' && accuracy !== null) {\n throw new Error('accuracy argument (' + accuracy + ') is not in range [0; PI]');\n }\n this._accuracy = null;\n }\n }\n\n /**\n * @returns {Attitude}\n */\n toAttitude() {\n /**\n * Heading is given around z-axis in NED frame and our attitude in ENU frame, that is why\n * -1* is applied to heading.\n */\n return new Attitude(\n Quaternion.fromAxisAngle([0, 0, 1], -this.heading),\n this.time,\n this.accuracy\n );\n }\n\n\n /**\n * Compares two AbsoluteHeading\n * @param {AbsoluteHeading} heading1 heading 1\n * @param {AbsoluteHeading} heading2 heading 2\n */\n static equalsTo(heading1, heading2) {\n\n // Handle null comparison\n if (heading1 === null && heading1 === heading2) {\n return true;\n }\n\n if (!(heading1 instanceof AbsoluteHeading) || !(heading2 instanceof AbsoluteHeading)) {\n return false;\n }\n\n return Math.abs(heading1.heading - heading2.heading) < 1e-8;\n }\n\n equalsTo(other) {\n return AbsoluteHeading.equalsTo(this, other);\n }\n\n toJson() {\n const output = { heading: this.heading };\n if (this.accuracy !== null) {\n output.accuracy = this.accuracy;\n }\n if (this.time !== null) {\n output.time = this.time;\n }\n return output;\n }\n\n static fromJson({\n heading, time, accuracy\n }) {\n return new AbsoluteHeading(heading, time, accuracy);\n }\n\n clone() {\n return new AbsoluteHeading(this.heading, this.time, this.accuracy);\n }\n}\n\nexport default AbsoluteHeading;\n","import Logger from '@wemap/logger';\n\nimport Coordinates from '../coordinates/Coordinates.js';\nimport Level from '../coordinates/Level.js';\n\nimport Edge from './GraphEdge.js';\n\n/**\n * @template T\n */\nclass GraphNode {\n\n /** @type {Coordinates} */\n _coords;\n\n /** @type {Edge<T>[]} */\n edges = [];\n\n /** @type {?T} */\n builtFrom = null;\n\n /**\n * @param {Coordinates} coords\n * @param {T} builtFrom\n */\n constructor(coords, builtFrom = null) {\n this.coords = coords;\n this.builtFrom = builtFrom;\n this.edges = [];\n }\n\n /** @type {!Coordinates} */\n get coords() {\n return this._coords;\n }\n\n /** @type {!Coordinates} */\n set coords(coords) {\n if (!(coords instanceof Coordinates)) {\n throw new Error('coords is not a Coordinates');\n }\n this._coords = coords;\n }\n\n /**\n * @param {GraphNode} other\n * @returns {number}\n */\n distanceTo(other) {\n return this.coords.distanceTo(other.coords);\n }\n\n /**\n * @param {GraphNode} other\n * @returns {number}\n */\n bearingTo(other) {\n return this.coords.bearingTo(other.coords);\n }\n\n /**\n * @param {GraphNode} other\n * @returns {boolean}\n */\n equalsTo(other) {\n return this.coords.equalsTo(other.coords)\n && this.builtFrom === other.builtFrom;\n }\n\n /**\n * @returns {GraphNode}\n */\n clone() {\n const node = new GraphNode(this.coords);\n node.edges = this.edges.slice(0);\n node.builtFrom = this.builtFrom;\n return node;\n }\n\n /**\n * Does not include \"edges\" and \"builtFrom\" properties\n * @returns {object}\n */\n toJson() {\n return this.coords.toCompressedJson();\n }\n\n /**\n * @template T\n * @returns {GraphNode<T>}\n */\n static fromJson(json) {\n return new GraphNode(Coordinates.fromCompressedJson(json));\n }\n\n generateLevelFromEdges() {\n let tmpLevel;\n for (let i = 0; i < this.edges.length; i++) {\n const edge = this.edges[i];\n if (edge.level) {\n if (!tmpLevel) {\n tmpLevel = edge.level.clone();\n } else {\n tmpLevel = tmpLevel.intersect(edge.level);\n if (!tmpLevel) {\n Logger.error('Error: Something bad happend during parsing: We cannot retrieve node level from adjacent ways: ' + this.coords);\n return false;\n }\n }\n }\n }\n this.coords.level = tmpLevel;\n return true;\n }\n\n\n /**\n * We suppose generateLevelFromEdges() was called before\n */\n inferNodeLevelByRecursion() {\n const { level } = this.coords;\n if (!level || !level.isRange) {\n return true;\n }\n\n /**\n * We can infer node level only if this one have one edge attached\n */\n if (this.edges.length > 1) {\n return true;\n }\n\n /**\n * This method looks for single level nodes recursively from a multi-level node\n * The result of this method is an union of all single level nodes found.\n * @param {GraphNode} node node to explore\n * @param {GraphNode[]} visitedNodes list of visited nodes\n */\n const lookForLevel = (node, visitedNodes) => {\n\n visitedNodes.push(node);\n\n if (!node.coords.level) {\n return null;\n }\n\n if (!node.coords.level.isRange) {\n return node.coords.level;\n }\n\n let tmpLevel = null;\n for (let i = 0; i < node.edges.length; i++) {\n const edge = node.edges[i];\n const otherNode = edge.node1 === node ? edge.node2 : edge.node1;\n if (!visitedNodes.includes(otherNode)) {\n tmpLevel = Level.union(lookForLevel(otherNode, visitedNodes), tmpLevel);\n }\n }\n return tmpLevel;\n };\n\n const othersLevels = lookForLevel(this, []);\n\n if (othersLevels !== null) {\n if (!othersLevels.isRange) {\n this.coords.level = new Level(othersLevels.val === level.low ? level.up : level.low);\n return true;\n }\n Logger.warn('Level of: ' + this.coords.toString() + ' cannot be decided');\n return false;\n }\n\n return true;\n }\n\n /**\n * We suppose generateLevelFromEdges() was called before\n */\n inferNodeLevelByNeighboors() {\n const { level } = this.coords;\n if (!level || !level.isRange) {\n return true;\n }\n\n let tmpLevel = null;\n for (let i = 0; i < this.edges.length; i++) {\n const edge = this.edges[i];\n const otherNode = edge.node1 === this ? edge.node2 : edge.node1;\n tmpLevel = Level.union(otherNode.coords.level, tmpLevel);\n }\n\n if (tmpLevel === null || !tmpLevel.isRange) {\n this.coords.level = new Level(tmpLevel.val === level.low ? level.up : level.low);\n }\n\n return true;\n }\n\n /**\n * @param {GraphNode[]} nodes\n */\n static generateNodesLevels(nodes) {\n const success = nodes.reduce((acc, node) => acc && node.generateLevelFromEdges(), true);\n if (!success) {\n return false;\n }\n\n // In some cases, node levels cannot be retrieve just using adjacent edges\n // (e.g stairs without network at one of its bounds)\n // To infer this node level, we use inferNodeLevelByRecursion()\n return nodes.reduce((acc, node) => acc\n && node.inferNodeLevelByNeighboors()\n && node.inferNodeLevelByRecursion()\n , true);\n }\n}\n\nexport default GraphNode;\n","import Level from '../coordinates/Level.js';\nimport GraphNode from './GraphNode.js';\n\n/**\n * @template T\n *\n * An Edge is a segment composed of two Node\n * An edge is mostly issued from an OsmWay, but this is not always the case.\n * For example, edges created by mapmatching.\n */\nclass GraphEdge {\n\n /** @type {GraphNode<T>} */\n _node1 = null;\n\n /** @type {GraphNode<T>} */\n _node2 = null;\n\n /** @type {?Level} */\n _level = null;\n\n /** @type {?number} */\n _bearing;\n\n /** @type {?number} */\n _length;\n\n /** @type {boolean} */\n _computedSizeAndBearing = false;\n\n /** @type {?T} */\n builtFrom = null;\n\n /** @type {boolean} */\n isOneway = false;\n\n /**\n * @param {!GraphNode} node1\n * @param {!GraphNode} node2\n * @param {?Level} level\n * @param {?T} builtFrom\n * @param {?string} name\n */\n constructor(node1, node2, level = null, builtFrom = null) {\n this.node1 = node1;\n this.node2 = node2;\n this.level = level;\n this.builtFrom = builtFrom;\n }\n\n /** @type {!GraphNode<T>} */\n get node1() {\n return this._node1;\n }\n\n /** @type {!GraphNode<T>} */\n set node1(node) {\n\n if (!(node instanceof GraphNode)) {\n throw new TypeError('node1 is not a GraphNode');\n }\n\n if (this._node1 !== null && this._node2 !== this._node1) {\n this._node1.edges = this._node1.edges.filter(edge => edge !== this);\n }\n\n node.edges.push(this);\n\n this._node1 = node;\n this._computedSizeAndBearing = false;\n }\n\n /** @type {!GraphNode<T>} */\n get node2() {\n return this._node2;\n }\n\n /** @type {!GraphNode<T>} */\n set node2(node) {\n\n if (!(node instanceof GraphNode)) {\n throw new TypeError('node2 is not a GraphNode');\n }\n\n if (this._node2 !== null && this._node2 !== this._node1) {\n this._node2.edges = this._node2.edges.filter(edge => edge !== this);\n }\n\n node.edges.push(this);\n\n this._node2 = node;\n this._computedSizeAndBearing = false;\n }\n\n /** @type {?Level} */\n get level() {\n return this._level;\n }\n\n /** @type {?Level} */\n set level(level) {\n if (level instanceof Level) {\n this._level = level;\n } else {\n if (typeof level !== 'undefined' && level !== null) {\n throw new Error('level argument is not a Level object');\n }\n this._level = null;\n }\n }\n\n /**\n * Get edge bearing from node1 to node2\n * @type {number}\n */\n get bearing() {\n if (!this._computedSizeAndBearing) {\n this._computeSizeAndBearing();\n }\n return this._bearing;\n }\n\n /**\n * get edge length\n * @type {number}\n */\n get length() {\n if (!this._computedSizeAndBearing) {\n this._computeSizeAndBearing();\n }\n return this._length;\n }\n\n _computeSizeAndBearing() {\n this._length = this.node1.distanceTo(this.node2);\n this._bearing = this.node1.bearingTo(this.node2);\n this._computedSizeAndBearing = true;\n }\n\n /**\n * @param {GraphEdge<T>} other\n * @returns {boolean}\n */\n equalsTo(other) {\n\n if (this === other) {\n return true;\n }\n\n if (!(other instanceof GraphEdge)) {\n return false;\n }\n\n return other.node1.equalsTo(this.node1)\n && other.node2.equalsTo(this.node2)\n && Level.equalsTo(other.level, this.level)\n && other.isOneway === this.isOneway\n && other.builtFrom === this.builtFrom;\n }\n\n /**\n * @returns {GraphEdge<T>}\n */\n clone() {\n const edge = new GraphEdge(this.node1, this.node2);\n edge.level = this.level;\n edge.isOneway = this.isOneway;\n edge.builtFrom = this.builtFrom;\n return edge;\n }\n\n}\n\nexport default GraphEdge;\n","\nimport GraphEdge from './GraphEdge.js';\nimport GraphNode from './GraphNode.js';\n\n/**\n * @template T\n * @param {GraphEdge<T>[]} edges\n * @param {GraphNode<T>} node1\n * @param {GraphNode<T>} node2\n * @returns {?GraphEdge<T>}\n */\nexport function getEdgeByNodes(edges, node1, node2) {\n return edges.find(edge =>\n node1 === edge.node1 && node2 === edge.node2\n || node2 === edge.node1 && node1 === edge.node2\n );\n}\n","import BoundingBox from '../coordinates/BoundingBox.js';\nimport Coordinates from '../coordinates/Coordinates.js';\nimport Level from '../coordinates/Level.js';\n\nimport GraphEdge from './GraphEdge.js';\nimport GraphNode from './GraphNode.js';\nimport { getEdgeByNodes } from './GraphUtils.js';\n\n/**\n * @template T\n *\n * A typical network with nodes (Node) and edges (Edge)\n */\nclass Network {\n\n /** @type {GraphNode<T>[]} */\n nodes;\n\n /** @type {GraphEdge<T>[]} */\n edges;\n\n /**\n * @template T\n * @param {GraphNode<T>[]} nodes\n * @param {GraphEdge<T>[]} edges\n */\n constructor(nodes, edges) {\n this.nodes = Array.isArray(nodes) ? nodes : [];\n this.edges = Array.isArray(edges) ? edges : [];\n }\n\n /**\n * @template T\n * @param {Coordinates} coords\n * @returns {?GraphNode<T>}\n */\n getNodeByCoords(coords) {\n return this.nodes.find(node => node.coords.equalsTo(coords));\n }\n\n /**\n * @template T\n * @param {GraphNode<T>} node1\n * @param {GraphNode<T>} node2\n * @returns {?GraphEdge<T>}\n */\n getEdgeByNodes(node1, node2) {\n return getEdgeByNodes(this.edges, node1, node2);\n }\n\n\n /**\n * @param {?number} extendedMeasure\n * @returns {BoundingBox}\n */\n getBoundingBox(extendedMeasure) {\n const boundingBox = this.nodes.reduce(\n (acc, node) => acc.extend(node.coords), new BoundingBox()\n );\n if (extendedMeasure) {\n boundingBox.extendsWithMeasure(extendedMeasure);\n }\n return boundingBox;\n }\n\n /**\n * @param {function} _nodeToStringFn\n * @param {function} _edgeToStringFn\n * @returns {string}\n */\n toDetailedString(_nodeToStringFn, _edgeToStringFn) {\n\n let nodeToStringFn = _nodeToStringFn;\n if (!nodeToStringFn) {\n nodeToStringFn = node => `${node.builtFrom}`;\n }\n\n let edgeToStringFn = _edgeToStringFn;\n if (!_edgeToStringFn) {\n edgeToStringFn = edge => `${edge.builtFrom}`;\n }\n\n let output\n = '--- Network ---\\n'\n + `Nodes: ${this.nodes.length}\\n`\n + `Edges: ${this.edges.length}\\n`\n + '---\\n'\n + 'Nodes\\n';\n this.nodes.forEach(node => {\n output += `${nodeToStringFn(node)} [edges: ${node.edges.length}]\\n`;\n });\n output += '---\\n'\n + 'Edges\\n';\n this.edges.forEach(edge => {\n output += `${edgeToStringFn(edge)} `;\n output += `[${nodeToStringFn(edge.node1)} -- ${nodeToStringFn(edge.node2)}]\\n`;\n });\n output += '---';\n return output;\n }\n\n /**\n * @returns {object}\n */\n toCompressedJson() {\n return {\n nodes: this.nodes.map(node => node.toJson()),\n edges: this.edges.map(edge => {\n const output = [\n this.nodes.indexOf(edge.node1),\n this.nodes.indexOf(edge.node2)\n ];\n if (edge.level !== null) {\n output.push(edge.level.toString());\n }\n if (edge.isOneway) {\n if (edge.level === null) {\n output.push(null);\n }\n output.push(true);\n }\n return output;\n })\n };\n }\n\n /**\n * @param {object} json\n * @returns {Network}\n */\n static fromCompressedJson(json) {\n\n const network = new Network();\n\n network.nodes = json.nodes.map(GraphNode.fromJson);\n\n network.edges = json.edges.map(jsonEdge => {\n const edge = new GraphEdge(\n network.nodes[jsonEdge[0]],\n network.nodes[jsonEdge[1]]\n );\n if (jsonEdge.length > 2 && jsonEdge[2] !== null) {\n edge.level = Level.fromString(jsonEdge[2]);\n }\n if (jsonEdge.length > 3 && jsonEdge[3]) {\n edge.isOneway = true;\n }\n return edge;\n });\n\n return network;\n }\n\n\n /**\n * Convert Array of Coordinates array to a network\n * @param {Coordinates[][]} segments\n * @returns {Network}\n */\n static fromCoordinates(segments) {\n\n const network = new Network();\n\n const getOrCreateNode = coords =>\n network.nodes.find(_coords => _coords.equalsTo(coords)) || new GraphNode(coords);\n\n\n const createEdgeFromNodes = (node1, node2) =>\n new GraphEdge(node1, node2, Level.union(node1.coords.level, node2.coords.level));\n\n for (const segment of segments) {\n\n let previousNode = null;\n for (const coords of segment) {\n const currentNode = getOrCreateNode(coords);\n\n if (previousNode) {\n const edge = createEdgeFromNodes(currentNode, previousNode);\n network.edges.push(edge);\n }\n\n network.nodes.push(currentNode);\n previousNode = currentNode;\n }\n }\n\n return network;\n }\n\n /**\n * Create edges From MultiLevel Itinerary for a given level\n * @param {Level} targetLevel level for selection.\n * @param {Boolean} useMultiLevelEdges use segments which intersect both levels (stairs, elevators...)\n * @returns {GraphEdge[]} Ordered edges\n */\n getEdgesAtLevel(targetLevel, useMultiLevelEdges = true) {\n return this.edges.filter(\n ({ level }) => useMultiLevelEdges\n ? Level.intersect(targetLevel, level) !== null\n : Level.contains(targetLevel, level)\n );\n }\n\n}\n\nexport default Network;\n","import Coordinates from '../coordinates/Coordinates.js';\nimport Edge from './GraphEdge.js';\nimport Node from './GraphNode.js';\n\nclass GraphProjection {\n\n /** @type {Coordinates} */\n origin;\n\n /** @type {number} */\n distanceFromNearestElement;\n\n /** @type {Coordinates} */\n projection;\n\n /** @type {Node|Edge} */\n nearestElement;\n\n}\n\nexport default GraphProjection;\n","/* eslint-disable complexity */\n/* eslint-disable max-statements */\nimport { diffAngleLines } from '@wemap/maths';\n\nimport Constants from '../Constants.js';\nimport Coordinates from '../coordinates/Coordinates.js';\nimport UserPosition from '../coordinates/UserPosition.js';\nimport Level from '../coordinates/Level.js';\n\nimport Network from './Network.js';\nimport GraphProjection from './GraphProjection.js';\n\nclass MapMatching {\n\n /** @type {Network} */\n _network = null;\n\n /** @type {number} */\n _maxDistance = Number.MAX_VALUE;\n\n /** @type {number} */\n _maxAngleBearing = Math.PI;\n\n /**\n * Constructor of Map-matching\n * @param {?Network} network\n */\n constructor(network) {\n this.network = network;\n }\n\n /** @type {!number} */\n set maxAngleBearing(maxAngleBearing) {\n this._maxAngleBearing = maxAngleBearing;\n }\n\n /** @type {!number} */\n set maxDistance(maxDistance) {\n this._maxDistance = maxDistance;\n }\n\n /** @type {!number} */\n get maxAngleBearing() {\n return this._maxAngleBearing;\n }\n\n /** @type {!number} */\n get maxDistance() {\n return this._maxDistance;\n }\n\n /** @type {?Network} */\n get network() {\n return this._network;\n }\n\n /** @type {?Network} */\n set network(network) {\n if (network instanceof Network) {\n this._network = network;\n } else {\n if (typeof network !== 'undefined' && network !== null) {\n throw new Error('network argument is not a Network object');\n }\n this._network = null;\n }\n }\n\n /**\n * Check if the specified edge and its nodes can be used for projection\n * @returns {boolean} an array of two elements.\n * First is true if projection will be used on the specified edge, false otherwise.\n * Second is true if projection will be used on the nodes of the specified edge, false otherwise.\n */\n _shouldProjectOnEdgeAndNodes(edge, location, useBearing, useMultiLevelSegments, acceptEdgeFn) {\n\n if (!acceptEdgeFn(edge)) {\n // if edge selection is not verified\n return [false, false, false];\n }\n\n let checkNode1 = true;\n let checkNode2 = true;\n let checkEdge = true;\n\n if (\n // Verify if edge level only if one of both is defined\n (location.level || edge.level)\n && (\n // if edge level intersect location level\n !Level.intersect(location.level, edge.level)\n // ignore MultiLevelSegments if option used\n || (!useMultiLevelSegments && edge.level && edge.level.isRange)\n )) {\n checkEdge = false;\n }\n\n if (!Level.equalsTo(location.level, edge.node1.coords.level)) {\n checkNode1 = false;\n }\n\n if (!Level.equalsTo(location.level, edge.node2.coords.level)) {\n checkNode2 = false;\n }\n\n if (useBearing) {\n // if mapmatching bearing is enabled do not use nodes matching\n if (checkEdge) {\n // condition for optimisation\n const diffAngle = diffAngleLines(edge.bearing, location.bearing);\n if (diffAngle > this._maxAngleBearing) {\n // Do not try to project if angle is greater than the threshold\n checkEdge = false;\n }\n }\n checkNode1 = false;\n checkNode2 = false;\n }\n\n return [checkEdge, checkNode1, checkNode2];\n }\n\n\n /**\n * @param {Coordinates} fromCoordinates\n * @param {Coordinates} toCoordinates\n */\n static _assignLatLngLevel(fromCoordinates, toCoordinates) {\n toCoordinates.lat = fromCoordinates.lat;\n toCoordinates.lng = fromCoordinates.lng;\n toCoordinates.level = fromCoordinates.level;\n }\n\n /**\n * @param {Edge} _edge\n * @param {Coordinates} _projection\n */\n static _updateProjectionLevelFromEdge = (_edge, _projection) => {\n if (_edge.level) {\n _projection.level = _edge.level.clone();\n }\n };\n\n /**\n * @param {!Coordinates} location\n * @param {boolean} useDistance\n * @param {boolean} useBearing\n * @param {boolean} useMultiLevelSegments\n * @param {function} acceptEdgeFn\n * @returns {GraphProjection}\n */\n getProjection(location, useDistance = false, useBearing = false,\n useMultiLevelSegments = true, acceptEdgeFn = () => true) {\n\n if (this.network === null) {\n throw new Error('Network has not been set yet');\n }\n\n if (!(location instanceof Coordinates)) {\n throw new TypeError('location is not an instance of Coordinates');\n }\n\n if (useBearing && (!location.bearing || !this._maxAngleBearing)) {\n return null;\n }\n\n const projection = new GraphProjection();\n projection.origin = location;\n projection.distanceFromNearestElement = Number.MAX_VALUE;\n projection.projection = location.clone();\n\n const isProjectionBetter = (distanceOfNewProjection) => {\n return distanceOfNewProjection < projection.distanceFromNearestElement\n && (!useDistance || distanceOfNewProjection <= this._maxDistance);\n };\n\n for (let i = 0; i < this.network.edges.length; i++) {\n const edge = this.network.edges[i];\n\n const [checkEdge, checkNode1, checkNode2] = this._shouldProjectOnEdgeAndNodes(\n edge, location, useBearing, useMultiLevelSegments, acceptEdgeFn);\n\n if (checkNode1) {\n\n const distNode1 = location.distanceTo(edge.node1.coords);\n if (isProjectionBetter(distNode1) || distNode1 <= Constants.EPS_MM) {\n projection.distanceFromNearestElement = distNode1;\n projection.nearestElement = edge.node1;\n MapMatching._assignLatLngLevel(edge.node1.coords, projection.projection);\n MapMatching._updateProjectionLevelFromEdge(edge, projection.projection);\n\n if (distNode1 <= Constants.EPS_MM\n && location.level === edge.node1.coords.level) {\n break;\n }\n }\n }\n\n if (checkNode2) {\n\n const distNode2 = location.distanceTo(edge.node2.coords);\n if (isProjectionBetter(distNode2) || distNode2 <= Constants.EPS_MM) {\n\n projection.distanceFromNearestElement = distNode2;\n projection.nearestElement = edge.node2;\n MapMatching._assignLatLngLevel(edge.node2.coords, projection.projection);\n MapMatching._updateProjectionLevelFromEdge(edge, projection.projection);\n\n if (distNode2 <= Constants.EPS_MM\n && location.level === edge.node2.coords.level) {\n break;\n }\n }\n }\n\n if (checkEdge) {\n const segmentProjection = location.getSegmentProjection(edge.node1.coords, edge.node2.coords);\n if (segmentProjection) {\n const distEdge = location.distanceTo(segmentProjection);\n if (isProjectionBetter(distEdge)) {\n projection.distanceFromNearestElement = distEdge;\n projection.nearestElement = edge;\n MapMatching._assignLatLngLevel(segmentProjection, projection.projection);\n MapMatching._updateProjectionLevelFromEdge(edge, projection.projection);\n }\n }\n }\n }\n\n\n if (!projection.nearestElement) {\n return null;\n }\n\n if (projection.projection instanceof UserPosition) {\n projection.projection.accuracy += projection.distanceFromNearestElement;\n }\n return projection;\n }\n\n}\n\nexport default MapMatching;\n","import Coordinates from '../coordinates/Coordinates.js';\nimport GraphNode from '../graph/GraphNode.js';\nimport GraphEdge from '../graph/GraphEdge.js';\nimport { getEdgeByNodes } from '../graph/GraphUtils.js';\n\n/**\n * @template T\n */\nclass GraphItinerary {\n\n /** @type {Coordinates} */\n start;\n\n /** @type {Coordinates} */\n end;\n\n /** @type {GraphNode<T>[]} */\n nodes;\n\n /** @type {GraphEdge<T>[]} */\n edges;\n\n /** @type {number[]} */\n edgesWeights;\n\n\n /**\n * @template T\n * @param {GraphNode<T>[]} networkNodes\n * @param {number[]} edgesWeights\n * @returns {GraphItinerary<T>}\n */\n static fromNetworkNodes(networkNodes, edgesWeights) {\n const itinerary = new GraphItinerary();\n itinerary.edgesWeights = edgesWeights;\n\n itinerary.nodes = networkNodes.map(node => {\n const newNode = node.clone();\n // Remove node edges, they will be added later.\n newNode.edges = [];\n return newNode;\n });\n\n itinerary.edges = [];\n networkNodes.forEach((node, idx, arr) => {\n if (idx === 0) {\n return;\n }\n\n // Retrieve network edge\n const prevNode = arr[idx - 1];\n const edge = getEdgeByNodes(prevNode.edges, prevNode, node);\n\n // Create itinerary edge\n const newEdge = new GraphEdge(\n itinerary.nodes[idx - 1],\n itinerary.nodes[idx],\n edge.level,\n edge.builtFrom\n );\n newEdge.isOneway = edge.isOneway;\n itinerary.edges.push(newEdge);\n });\n\n return itinerary;\n\n }\n}\n\nexport default GraphItinerary;\n","import Node from '../graph/GraphNode.js';\n\nclass NoRouteFoundError extends Error {\n\n constructor(start, end, details) {\n super();\n this.start = start;\n this.end = end;\n this.details = details;\n }\n\n get startStr() {\n if (this.start instanceof Node) {\n return `Node ${this.start.coords.toString()}`;\n }\n\n // if (this.start instanceof Coordinates) {\n return this.start.toString();\n }\n\n get endStr() {\n if (this.end instanceof Node) {\n return `Node ${this.end.coords.toString()}`;\n }\n\n // if (this.end instanceof Coordinates) {\n return this.end.toString();\n }\n\n get message() {\n let message = `No route found from ${this.startStr} to ${this.endStr}.`;\n if (this.details) {\n message += ` Details: ${this.details}`;\n }\n return message;\n }\n}\n\nexport default NoRouteFoundError;\n","import GraphEdge from '../graph/GraphEdge.js';\n\n/**\n * @template T\n */\nclass GraphRouterOptions {\n\n /** @type {number} in meters */\n projectionMaxDistance = 50;\n\n /** @type {function(GraphEdge<T>):boolean} */\n weightEdgeFn = edge => edge.length;\n\n /** @type {function(GraphEdge<T>):boolean} */\n acceptEdgeFn = () => true;\n\n}\n\nexport default GraphRouterOptions;\n","import Coordinates from '../coordinates/Coordinates.js';\n\nimport GraphEdge from '../graph/GraphEdge.js';\nimport Network from '../graph/Network.js';\nimport GraphNode from '../graph/GraphNode.js';\nimport MapMatching from '../graph/MapMatching.js';\n\nimport NoRouteFoundError from './NoRouteFoundError.js';\nimport GraphRouterOptions from './GraphRouterOptions.js';\nimport GraphItinerary from './GraphItinerary.js';\n\n/**\n * @template T\n * @abstract\n */\nclass GraphRouter {\n\n /** @type {!Network<T>} */\n _network;\n\n /**\n * @param {!Network<T>} network\n */\n constructor(network) {\n this._network = network;\n this._mapMatching = new MapMatching(network);\n }\n\n /**\n * @template T\n * @param {!GraphNode<T>|!Coordinates} start\n * @param {!GraphNode<T>|!Coordinates} end\n * @param {GraphRouterOptions} _options\n * @returns {GraphItinerary<T>}\n */\n getShortestPath(start, end, options = new GraphRouterOptions()) {\n\n if (!(start instanceof GraphNode) && !(start instanceof Coordinates)) {\n throw new Error('Unknown start type');\n }\n\n if (!(end instanceof GraphNode) && !(end instanceof Coordinates)) {\n throw new Error('Unknown end type');\n }\n\n const { acceptEdgeFn, weightEdgeFn, projectionMaxDistance } = options;\n this._mapMatching.maxDistance = projectionMaxDistance;\n\n const createdNodes = [];\n\n const retrieveOrCreateNearestNode = point => {\n if (point instanceof GraphNode) {\n return point;\n }\n\n const closeNode = this._network.getNodeByCoords(point);\n if (closeNode) {\n return closeNode;\n }\n\n const proj = this._mapMatching.getProjection(point, true, false, false, acceptEdgeFn);\n if (!proj) {\n throw new NoRouteFoundError(start, end,\n `Point ${point.toString()} is too far from the network `\n + `> ${this._mapMatching.maxDistance.toFixed(0)} meters`\n );\n }\n if (proj.nearestElement instanceof GraphNode) {\n return proj.nearestElement;\n }\n // if (proj.nearestElement instanceof Edge)\n const nodeCreated = this.createNodeInsideEdge(\n proj.nearestElement,\n proj.projection\n );\n createdNodes.push(nodeCreated);\n return nodeCreated;\n };\n\n const removeCreatedNodes = () => {\n while (createdNodes.length) {\n this.removeNodeFromPreviouslyCreatedEdge(createdNodes.pop());\n }\n };\n\n const startNode = retrieveOrCreateNearestNode(start);\n const endNode = retrieveOrCreateNearestNode(end);\n\n const graphItinerary = this.getShortestPathBetweenGraphNodes(\n startNode,\n endNode,\n acceptEdgeFn,\n weightEdgeFn\n );\n graphItinerary.start = start instanceof GraphNode ? start.coords : start;\n graphItinerary.end = end instanceof GraphNode ? end.coords : end;\n\n removeCreatedNodes();\n\n if (!graphItinerary.nodes.length) {\n throw new NoRouteFoundError(start, end);\n }\n\n return graphItinerary;\n\n }\n\n /**\n * @param {GraphEdge<T>} edge\n * @param {Coordinates} point\n */\n createNodeInsideEdge(edge, point) {\n const a = edge.node1;\n const b = edge.node2;\n\n const m = new GraphNode(point);\n m.coords.level = edge.level;\n m.builtFrom = edge.builtFrom;\n\n const u = edge.clone();\n u.node1 = a;\n u.node2 = m;\n\n const v = edge.clone();\n v.node1 = m;\n v.node2 = b;\n\n a.edges = a.edges.filter(_edge => _edge !== edge);\n b.edges = b.edges.filter(_edge => _edge !== edge);\n\n this._network.nodes.push(m);\n this._network.edges.push(u, v);\n\n this._network.edges = this._network.edges.filter(\n _edge => _edge !== edge\n );\n\n return m;\n }\n\n /**\n * @param {GraphNode<T>} _node\n */\n removeNodeFromPreviouslyCreatedEdge(_node) {\n const u = _node.edges[0];\n const v = _node.edges[1];\n\n u.node1.edges = u.node1.edges.filter(edge => edge !== u);\n v.node1.edges = v.node1.edges.filter(edge => edge !== v);\n\n const oldEdge = u.clone();\n oldEdge.node1 = u.node1;\n oldEdge.node2 = v.node2;\n this._network.edges.push(oldEdge);\n\n this._network.nodes = this._network.nodes.filter(node => node !== _node);\n this._network.edges = this._network.edges.filter(\n edge => edge !== u && edge !== v\n );\n }\n\n getShortestPathBetweenGraphNodes(start, end, acceptEdgeFn, weightFn) {\n const distanceMap = {},\n checking = {},\n vertexList = {},\n vertexNodes = {},\n parentVertices = {},\n path = [];\n let vertexId = 1;\n\n // Initially, we assume each vertex is unreachable\n this._network.nodes.forEach(vertex => {\n\n // Generate Unique Router Id\n vertex.uniqueRouterId = vertexId;\n vertexNodes[vertexId] = vertex;\n\n distanceMap[vertexId] = Infinity;\n checking[vertexId] = null;\n vertexList[vertexId] = true;\n\n vertexId++;\n });\n\n // The cost from the starting vertex to the starting vertex is 0\n distanceMap[start.uniqueRouterId] = 0;\n\n // check each vertex\n while (Object.keys(vertexList).length > 0) {\n const current = Number(\n Object.keys(vertexList).reduce((_checking, vertex) => {\n return distanceMap[_checking] > distanceMap[vertex]\n ? vertex\n : _checking;\n }, Object.keys(vertexList)[0])\n );\n\n // all the vertices accessible from current vertex\n this._network.edges\n .filter(edge => {\n\n if (!acceptEdgeFn(edge)) {\n return false;\n }\n\n const from = edge.node1.uniqueRouterId,\n to = edge.node2.uniqueRouterId;\n // are these vertices joined?\n return from === current || to === current;\n })\n // for each vertex we can reach\n .forEach(edge => {\n let to, from, reversed = false;\n // determine the direction of travel\n if (edge.node1.uniqueRouterId === current) {\n to = edge.node2.uniqueRouterId;\n from = edge.node1.uniqueRouterId;\n } else {\n to = edge.node1.uniqueRouterId;\n from = edge.node2.uniqueRouterId;\n reversed = true;\n }\n\n if (edge.isOneway && reversed) {\n return;\n }\n\n // distance is how far we travelled to reach the\n // current vertex, plus cost of travel the next(to)\n const distance = distanceMap[current] + weightFn(edge);\n\n // if we have found a cheaper path\n // update the hash of costs\n // and record which vertex we came from\n if (distanceMap[to] > distance) {\n distanceMap[to] = distance;\n checking[to] = current;\n parentVertices[to] = from;\n }\n });\n\n // remove vertex so we don't revisit it\n delete vertexList[current];\n }\n\n const edgesWeights = [];\n\n // now we have the most efficient paths for all vertices\n // build the path for the user specified vertex(end)\n let endId = end.uniqueRouterId;\n while (parentVertices[endId]) {\n path.unshift(vertexNodes[endId]);\n edgesWeights.unshift(distanceMap[endId] - distanceMap[parentVertices[endId]]);\n endId = parentVertices[endId];\n }\n if (path.length !== 0) {\n path.unshift(start);\n }\n\n // Remove Unique Router Id\n this._network.nodes.forEach(vertex => {\n delete vertex.uniqueRouterId;\n });\n\n // This clone the itinerary and temporary nodes\n return GraphItinerary.fromNetworkNodes(path, edgesWeights);\n }\n}\nexport default GraphRouter;\n"],"names":["Node"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"wemap-geo.es.js","sources":["../src/Constants.js","../src/coordinates/Level.js","../src/coordinates/Coordinates.js","../src/coordinates/UserPosition.js","../src/Utils.js","../src/coordinates/BoundingBox.js","../src/coordinates/RelativePosition.js","../src/coordinates/GeoRelativePosition.js","../src/rotations/Attitude.js","../src/rotations/AbsoluteHeading.js","../src/graph/GraphNode.js","../src/graph/GraphEdge.js","../src/graph/GraphUtils.js","../src/graph/Network.js","../src/graph/GraphProjection.js","../src/graph/MapMatching.js","../src/router/GraphItinerary.js","../src/router/NoRouteFoundError.js","../src/router/GraphRouterOptions.js","../src/router/GraphRouter.js"],"sourcesContent":["const Constants = {\n R_MAJOR: 6378137.0,\n R_MINOR: 6356752.3142,\n EARTH_GRAVITY: 9.80665,\n\n /**\n * latitude and longitude epsilon in degrees\n * 1e-8° correspond to ~1mm at latitude = 0\n */\n EPS_DEG_MM: 1e-8,\n\n /**\n * epsilon in meters which corresponds to 1 millimeter\n */\n EPS_MM: 1e-3\n};\n\nConstants.ELLIPSOID_FLATNESS = (Constants.R_MAJOR - Constants.R_MINOR) / Constants.R_MAJOR;\n\nConstants.ECCENTRICITY = Math.sqrt(Constants.ELLIPSOID_FLATNESS * (2 - Constants.ELLIPSOID_FLATNESS));\n\nConstants.R_MAJOR_2 = Constants.R_MAJOR * Constants.R_MAJOR;\nConstants.R_MAJOR_4 = Constants.R_MAJOR_2 * Constants.R_MAJOR_2;\nConstants.R_MINOR_2 = Constants.R_MINOR * Constants.R_MINOR;\nConstants.R_MINOR_4 = Constants.R_MINOR_2 * Constants.R_MINOR_2;\nConstants.ECCENTRICITY_2 = Constants.ECCENTRICITY * Constants.ECCENTRICITY;\nConstants.CIRCUMFERENCE = Constants.R_MAJOR * 2 * Math.PI;\n\nexport default Constants;\n","import Logger from '@wemap/logger';\n\n/**\n * A Level is the representation of a building floor number\n * A level can be a simple number (val) or a range (low, up)\n * To know if a level is a range or a number, isRange can be used\n */\nclass Level {\n\n /** @type {number?} */\n val = null;\n\n /** @type {boolean} */\n isRange = false;\n\n /** @type {number?} */\n low = null;\n\n /** @type {number?} */\n up = null;\n\n /**\n * Level constructor\n * 1 argument: level is not a range and first argument is the level\n * 2 arguments: level is a range\n * @param {number} arg1 if arg2: low value, otherwise: level\n * @param {number} arg2 (optional) up value\n */\n constructor(arg1, arg2) {\n if (typeof arg1 !== 'number' || isNaN(arg1)) {\n throw new Error('first argument is mandatory');\n }\n if (typeof arg2 === 'number' && !isNaN(arg2)) {\n if (arg1 === arg2) {\n this.isRange = false;\n this.val = arg1;\n } else {\n this.isRange = true;\n this.low = Math.min(arg1, arg2);\n this.up = Math.max(arg1, arg2);\n }\n } else if (typeof arg2 === 'undefined') {\n this.isRange = false;\n this.val = arg1;\n } else {\n throw new Error('second argument is not a number');\n }\n }\n\n clone() {\n if (this.isRange) {\n return new Level(this.low, this.up);\n }\n return new Level(this.val);\n }\n\n /**\n * Create a level from a string\n * @param {string} str level in str format (eg. 1, -2, 1;2, -2;3, 2;-1, 0.5;1 ...)\n */\n static fromString(str) {\n\n if (typeof str !== 'string') {\n return null;\n }\n\n if (!isNaN(Number(str))) {\n return new Level(parseFloat(str));\n }\n\n const splited = str.split(';');\n if (splited.length === 2) {\n if (!isNaN(Number(splited[0])) && !isNaN(Number(splited[1]))) {\n return new Level(parseFloat(splited[0]), parseFloat(splited[1]));\n }\n }\n\n Logger.warn('Cannot parse following level: ' + str);\n return null;\n }\n\n /**\n * Returns if the level is inside the given level\n * @param {Level} level the container level\n */\n isInside(level) {\n return Level.contains(level, this);\n }\n\n /**\n * Returns if the level is inside the given level\n * @param {Level} level the container level\n */\n contains(level) {\n return Level.contains(this, level);\n }\n\n\n /**\n * Returns if a level is contained in another\n * @param {Level} container The container level\n * @param {Level} targeted The targeted level\n */\n static contains(container, targeted) {\n\n if (container === targeted) {\n return true;\n }\n\n if (!container || !targeted) {\n return false;\n }\n\n if (!container.isRange) {\n if (targeted.isRange) {\n return false;\n }\n return container.val === targeted.val;\n }\n\n return container.up >= (targeted.isRange ? targeted.up : targeted.val)\n && container.low <= (targeted.isRange ? targeted.low : targeted.val);\n }\n\n /**\n * Retrieve the intersection of two levels\n * @param {Level} other The other level\n */\n intersect(other) {\n return Level.intersect(this, other);\n }\n\n /**\n * Retrieve the intersection of two levels\n * @param {Level} first The first level\n * @param {Level} second The second level\n */\n static intersect(first, second) {\n\n if (first === second) {\n if (first instanceof Level) {\n return first.clone();\n }\n return null;\n }\n\n if (!second) {\n return null;\n }\n\n if (!first) {\n return null;\n }\n\n if (first.isRange && !second.isRange) {\n if (first.contains(second)) {\n return second.clone();\n }\n return null;\n }\n if (!first.isRange && second.isRange) {\n if (second.contains(first)) {\n return first.clone();\n }\n return null;\n }\n if (first.isRange && second.isRange) {\n const up = Math.min(first.up, second.up);\n const low = Math.max(first.low, second.low);\n if (up < low) {\n return null;\n }\n return new Level(low, up);\n }\n return first.val === second.val ? first : null;\n }\n\n /**\n * Retrieve the union of two levels\n * @param {Level} other The other level\n */\n union(other) {\n return Level.union(this, other);\n }\n\n /**\n * Retrieve the union of two levels\n * @param {Level} other The other level\n */\n static union(first, second) {\n\n if (first === second) {\n if (first instanceof Level) {\n return first.clone();\n }\n return null;\n }\n\n if (!second) {\n return first.clone();\n }\n\n if (!first) {\n return second.clone();\n }\n\n let low, up;\n if (!first.isRange && !second.isRange) {\n low = Math.min(first.val, second.val);\n up = Math.max(first.val, second.val);\n } else if (first.isRange && !second.isRange) {\n low = Math.min(first.low, second.val);\n up = Math.max(first.up, second.val);\n } else if (!first.isRange && second.isRange) {\n low = Math.min(second.low, first.val);\n up = Math.max(second.up, first.val);\n } else {\n /* if (first.isRange && second.isRange) */\n low = Math.min(second.low, first.low);\n up = Math.max(second.up, first.up);\n }\n\n if (low === up) {\n return new Level(low);\n }\n return new Level(low, up);\n }\n\n multiplyBy(factor) {\n if (this.isRange) {\n this.low *= factor;\n this.up *= factor;\n } else {\n this.val *= factor;\n }\n return this;\n }\n\n toString() {\n return this.isRange ? this.low + ';' + this.up : String(this.val);\n }\n\n static equalsTo(first, second) {\n\n if (first === second) {\n return true;\n }\n if (!first && !second) {\n return true;\n }\n if (!first && second) {\n return false;\n }\n if (first && !second) {\n return false;\n }\n if (!first.isRange && second.isRange) {\n return false;\n }\n if (first.isRange && !second.isRange) {\n return false;\n }\n if (first.isRange && second.isRange) {\n return first.low === second.low && first.up === second.up;\n }\n // !first.isRange && !second.isRange\n return first.val === second.val;\n\n }\n\n static diff(first, second) {\n\n if (first === null || second === null) {\n return null;\n }\n\n if (!first.isRange && !second.isRange) {\n return second.val - first.val;\n }\n\n if (first.isRange && !second.isRange) {\n if (first.low === second.val) {\n return second.val - first.up;\n }\n if (first.up === second.val) {\n return second.val - first.low;\n }\n return null;\n }\n\n if (second.isRange && !first.isRange) {\n if (first.val === second.low) {\n return second.up - first.val;\n }\n if (first.val === second.up) {\n return second.low - first.val;\n }\n return null;\n }\n\n if (Level.equalsTo(first, second)) {\n return 0;\n }\n\n return null;\n }\n\n}\n\nexport default Level;\n","import {\n deg2rad, Vector3, Quaternion, rad2deg, wrap\n} from '@wemap/maths';\n\nimport Constants from '../Constants.js';\nimport Level from './Level.js';\n\n/**\n * A Coordinates position using at least latitude (lat) and longitude (lng).\n * Optionnal fields are: altitude (alt) and level.\n *\n * Basic geo methods are directly accessibles from here:\n * distanceTo, bearingTo, toEcef...\n *\n * /!\\ This class has been adapted to use earth as a sphere and not as an ellipsoid\n * /!\\ So, this class does not stricly represent WGS84 coordinates anymore\n * /!\\ This modifications have been made for computational improvements.\n */\nclass Coordinates {\n\n autoWrap = true;\n\n constructor(lat, lng, alt, level) {\n this.lat = lat;\n this.lng = lng;\n this.alt = alt;\n this.level = level;\n this._ecef = null;\n }\n\n get lat() {\n return this._lat;\n }\n\n get latitude() {\n return this._lat;\n }\n\n get lng() {\n return this._lng;\n }\n\n get longitude() {\n return this._lng;\n }\n\n /**\n * alt does not denote the altitude of a point but its height from\n * the \"level\" field (if defined) or from the ground\n */\n get alt() {\n return this._alt;\n }\n\n get level() {\n return this._level;\n }\n\n set lat(lat) {\n if (typeof lat === 'number' && Math.abs(lat) <= 90) {\n this._lat = lat;\n } else {\n throw new Error('lat argument is not in [-90; 90]');\n }\n this._ecef = null;\n }\n\n set latitude(lat) {\n throw new Error('Please use Coordinate#lat setter instead of Coordinate#latitude');\n }\n\n set lng(lng) {\n if (typeof lng === 'number') {\n this._lng = lng;\n if (this.autoWrap) {\n this.wrap();\n }\n } else {\n throw new Error('lng argument is not a number');\n }\n this._ecef = null;\n }\n\n set longitude(lng) {\n throw new Error('Please use Coordinate#lng setter instead of Coordinate#longitude');\n }\n\n set alt(alt) {\n if (typeof alt === 'number') {\n this._alt = alt;\n } else {\n if (typeof alt !== 'undefined' && alt !== null) {\n throw new Error('alt argument is not a finite number');\n }\n this._alt = null;\n }\n this._ecef = null;\n }\n\n set level(level) {\n if (level instanceof Level) {\n this._level = level;\n } else {\n if (typeof level !== 'undefined' && level !== null) {\n throw new Error('level argument is not a Level object');\n }\n this._level = null;\n }\n }\n\n clone() {\n const output = new Coordinates(this.lat, this.lng, this.alt);\n if (this.level) {\n output.level = this.level.clone();\n }\n return output;\n }\n\n wrap() {\n if (this._lng <= -180 || this._lng > 180) {\n this._lng = wrap(this._lng, -180, 180);\n }\n }\n\n /**\n * Compares two Coordinates\n * @param {Coordinates} pos1 position 1\n * @param {Coordinates} pos2 position 2\n * @param {Number} eps latitude and longitude epsilon in degrees (default: 1e-8 [~1mm at lat=0])\n * @param {Number} epsAlt altitude epsilon in meters (default: 1e-3 [= 1mm])\n */\n static equalsTo(pos1, pos2, eps = Constants.EPS_DEG_MM, epsAlt = Constants.EPS_MM) {\n\n // Handle null comparison\n if (pos1 === null && pos1 === pos2) {\n return true;\n }\n\n if (!(pos1 instanceof Coordinates) || !(pos2 instanceof Coordinates)) {\n return false;\n }\n\n return Math.abs(pos2.lat - pos1.lat) < eps\n && Math.abs(pos2.lng - pos1.lng) < eps\n && (pos1.alt === pos2.alt\n || pos1.alt !== null && pos2.alt !== null\n && Math.abs(pos2.alt - pos1.alt) < epsAlt)\n && Level.equalsTo(pos1.level, pos2.level);\n }\n\n equalsTo(other) {\n return Coordinates.equalsTo(this, other);\n }\n\n destinationPoint(distance, bearing, elevation) {\n const newPoint = this.clone();\n newPoint.move(distance, bearing, elevation);\n return newPoint;\n }\n\n // Source: http://www.movable-type.co.uk/scripts/latlong.html#destPoint\n move(distance, bearing, elevation) {\n\n const dR = distance / Constants.R_MAJOR;\n const cosDr = Math.cos(dR);\n const sinDr = Math.sin(dR);\n\n const phi1 = deg2rad(this.lat);\n const lambda1 = deg2rad(this.lng);\n\n const phi2 = Math.asin(\n Math.sin(phi1) * cosDr\n + Math.cos(phi1) * sinDr * Math.cos(bearing)\n );\n const lambda2 = lambda1 + Math.atan2(\n Math.sin(bearing) * sinDr * Math.cos(phi1),\n cosDr - Math.sin(phi1) * Math.sin(phi2)\n );\n\n this.lat = rad2deg(phi2);\n this.lng = rad2deg(lambda2);\n\n if (typeof elevation === 'number') {\n if (this.alt === null) {\n throw new Error('Point altitude is not defined');\n }\n this.alt += elevation;\n }\n\n\n return this;\n }\n\n /**\n * Returns a distance between two points in meters\n * @param {Coordinates} location2 latitude / longitude point\n * @return {Number} distance in meters\n */\n distanceTo(location2) {\n const lat1 = this.lat;\n const lng1 = this.lng;\n\n const lat2 = location2.lat;\n const lng2 = location2.lng;\n\n const dlat = deg2rad(lat2 - lat1);\n const dlng = deg2rad(lng2 - lng1);\n\n const dlngsin = Math.sin(dlng / 2);\n const dlatsin = Math.sin(dlat / 2);\n const lat1rad = deg2rad(lat1);\n const lat1cos = Math.cos(lat1rad);\n const lat2rad = deg2rad(lat2);\n const lat2cos = Math.cos(lat2rad);\n const angle = dlatsin * dlatsin + lat1cos * lat2cos * dlngsin * dlngsin;\n\n // arctangent\n const tangy = Math.sqrt(angle);\n const tangx = Math.sqrt(1 - angle);\n const cosn = 2 * Math.atan2(tangy, tangx);\n\n return Constants.R_MAJOR * cosn;\n }\n\n static distanceBetween(point1, point2) {\n return point1.distanceTo(point2);\n }\n\n bearingTo(location2) {\n const lat1 = deg2rad(this.lat);\n const lat2 = deg2rad(location2.lat);\n const diffLng = deg2rad(location2.lng - this.lng);\n\n return Math.atan2(Math.sin(diffLng) * Math.cos(lat2),\n Math.cos(lat1) * Math.sin(lat2) - Math.sin(lat1) * Math.cos(lat2) * Math.cos(diffLng));\n }\n\n static bearingTo(point1, point2) {\n return point1.bearingTo(point2);\n }\n\n\n /**\n * ECEF Transformations\n * Here we used a light version of ECEF considering earth\n * as a sphere instead of an ellipse\n */\n\n get enuToEcefRotation() {\n const rot1 = Quaternion.fromAxisAngle([0, 0, 1], Math.PI / 2 + deg2rad(this.lng));\n const rot2 = Quaternion.fromAxisAngle([1, 0, 0], Math.PI / 2 - deg2rad(this.lat));\n return Quaternion.multiply(rot1, rot2);\n }\n\n get ecefToEnuRotation() {\n const rot1 = Quaternion.fromAxisAngle([1, 0, 0], deg2rad(this.lat) - Math.PI / 2);\n const rot2 = Quaternion.fromAxisAngle([0, 0, 1], -deg2rad(this.lng) - Math.PI / 2);\n return Quaternion.multiply(rot1, rot2);\n }\n\n // https://gist.github.com/klucar/1536194\n // Adapted for spherical formula\n get ecef() {\n\n if (!this._ecef) {\n const lat = deg2rad(this.lat);\n const lng = deg2rad(this.lng);\n const alt = this.alt || 0;\n\n const x = (Constants.R_MAJOR + alt) * Math.cos(lat) * Math.cos(lng);\n const y = (Constants.R_MAJOR + alt) * Math.cos(lat) * Math.sin(lng);\n const z = (Constants.R_MAJOR + alt) * Math.sin(lat);\n\n this._ecef = [x, y, z];\n }\n\n return this._ecef;\n }\n\n static fromECEF(ecef) {\n\n const x = ecef[0];\n const y = ecef[1];\n const z = ecef[2];\n\n const p = Math.sqrt(x ** 2 + y ** 2);\n\n let lng = Math.atan2(y, x);\n const lat = Math.atan2(z, p);\n const alt = p / Math.cos(lat) - Constants.R_MAJOR;\n\n lng = lng % (2 * Math.PI);\n\n const newPoint = new Coordinates(rad2deg(lat), rad2deg(lng), alt);\n newPoint._ecef = ecef;\n return newPoint;\n }\n\n\n // https://stackoverflow.com/questions/1299567/how-to-calculate-distance-from-a-point-to-a-line-segment-on-a-sphere\n // Adapted to ECEF\n getSegmentProjection(p1, p2) {\n\n const a = Vector3.normalize(p1.ecef);\n const b = Vector3.normalize(p2.ecef);\n const c = Vector3.normalize(this.ecef);\n\n const G = Vector3.cross(a, b);\n if (Vector3.norm(G) === 0) {\n return null;\n }\n\n const F = Vector3.cross(c, G);\n const t = Vector3.normalize(Vector3.cross(G, F));\n\n const posECEF = Vector3.multiplyScalar(t, Constants.R_MAJOR);\n const poseCoordinates = Coordinates.fromECEF(posECEF);\n\n // poseCoordinates.alt is not 0 here due to the ECEF transformation residual.\n // So if p1.alt and p2.alt are defined we take the middle elevation between p1 and p2.\n // Otherwise we remove alt from projection because the residual has no sense.\n let alt;\n if (p1.alt !== null && p2.alt !== null) {\n // This formula is maybe not the best one.\n alt = (p1.alt + p2.alt) / 2;\n }\n const projection = new Coordinates(poseCoordinates.lat, poseCoordinates.lng,\n alt, Level.intersect(p1.level, p2.level));\n\n if (Math.abs((p1.distanceTo(p2) - p1.distanceTo(projection) - p2.distanceTo(projection))) > Constants.EPS_MM) {\n return null;\n }\n\n return projection;\n }\n\n /**\n * Input / Output\n */\n\n toString() {\n let str = '[' + this._lat.toFixed(7) + ', ' + this._lng.toFixed(7);\n if (this._alt !== null) {\n str += ', ' + this._alt.toFixed(2);\n }\n if (this._level !== null) {\n str += ', [' + this._level.toString() + ']';\n }\n str += ']';\n return str;\n }\n\n toJson() {\n const output = {\n lat: this.lat,\n lng: this.lng\n };\n if (this.alt !== null) {\n output.alt = this.alt;\n }\n if (this.level !== null) {\n output.level = this.level.toString();\n }\n return output;\n }\n\n static fromJson(json) {\n return new Coordinates(json.lat, json.lng, json.alt, Level.fromString(json.level));\n }\n\n toCompressedJson() {\n const output = [this.lat, this.lng];\n if (this.alt !== null || this.level !== null) {\n output.push(this.alt);\n }\n if (this.level !== null) {\n output.push(this.level.toString());\n }\n return output;\n }\n\n static fromCompressedJson(json) {\n const coords = new Coordinates(json[0], json[1]);\n if (json.length > 2) {\n coords.alt = json[2];\n }\n if (json.length > 3) {\n coords.level = Level.fromString(json[3]);\n }\n return coords;\n }\n}\n\nexport default Coordinates;\n","import Coordinates from './Coordinates.js';\nimport Constants from '../Constants.js';\n\n/**\n * A Coordinates User Position is a Coordinates position with specific data related to user (bearing, time, accuracy)\n */\nclass UserPosition extends Coordinates {\n\n _time = null;\n _accuracy = null;\n _bearing = null;\n\n constructor(lat, lng, alt, level, time, accuracy, bearing) {\n super(lat, lng, alt, level);\n this.time = time;\n this.accuracy = accuracy;\n this.bearing = bearing;\n }\n\n get time() {\n return this._time;\n }\n\n set time(time) {\n if (typeof time === 'number') {\n this._time = time;\n } else {\n if (typeof time !== 'undefined' && time !== null) {\n throw new Error('time argument is not a number');\n }\n this._time = null;\n }\n }\n\n\n get accuracy() {\n return this._accuracy;\n }\n\n set accuracy(accuracy) {\n if (typeof accuracy === 'number' && accuracy >= 0) {\n this._accuracy = accuracy;\n } else {\n if (typeof accuracy !== 'undefined' && accuracy !== null) {\n throw new Error('accuracy argument is not a positive number');\n }\n this._accuracy = null;\n }\n }\n\n\n get bearing() {\n return this._bearing;\n }\n\n set bearing(bearing) {\n if (typeof bearing === 'number') {\n this._bearing = bearing % (2 * Math.PI);\n } else {\n if (typeof bearing !== 'undefined' && bearing !== null) {\n throw new Error('bearing argument is not a number');\n }\n this._bearing = null;\n }\n }\n\n\n // Create a UserPosition with lat, lng, alt from Coordinates coordinates and\n // other fields from another UserPosition\n static fromCoordinates(coordinates) {\n return new UserPosition(coordinates.lat, coordinates.lng,\n coordinates.alt, coordinates.level);\n }\n\n clone() {\n const cloned = UserPosition.fromCoordinates(super.clone());\n cloned.time = this.time;\n cloned.accuracy = this.accuracy;\n cloned.bearing = this.bearing;\n return cloned;\n }\n\n\n /**\n * Compares two UserPosition\n * @param {UserPosition} pos1 position 1\n * @param {UserPosition} pos2 position 2\n * @param {Number} eps latitude and longitude epsilon in degrees (default: 1e-8 [~1mm at lat=0])\n * @param {Number} epsAlt altitude epsilon in meters (default: 1e-3 [= 1mm])\n */\n static equalsTo(pos1, pos2, eps = Constants.EPS_DEG_MM, epsAlt = Constants.EPS_MM) {\n\n // Handle null comparison\n if (pos1 === null && pos1 === pos2) {\n return true;\n }\n\n if (!(pos1 instanceof UserPosition) || !(pos2 instanceof UserPosition)) {\n return false;\n }\n\n if (!super.equalsTo(pos1, pos2, eps, epsAlt)) {\n return false;\n }\n\n return pos1.time === pos2.time\n && pos1.accuracy === pos2.accuracy\n && pos1.bearing === pos2.bearing;\n }\n\n equalsTo(other) {\n return UserPosition.equalsTo(this, other);\n }\n\n\n toJson() {\n const output = super.toJson();\n if (this.time !== null) {\n output.time = this.time;\n }\n if (this.accuracy !== null) {\n output.accuracy = this.accuracy;\n }\n if (this.bearing !== null) {\n output.bearing = this.bearing;\n }\n return output;\n }\n\n static fromJson(json) {\n const position = UserPosition.fromCoordinates(Coordinates.fromJson(json));\n position.time = json.time;\n position.accuracy = json.accuracy;\n position.bearing = json.bearing;\n return position;\n }\n}\n\nexport default UserPosition;\n","/* eslint-disable max-statements */\n\nimport {\n deg2rad, positiveMod\n} from '@wemap/maths';\n\nimport Constants from './Constants.js';\nimport Coordinates from './coordinates/Coordinates.js';\nimport UserPosition from './coordinates/UserPosition.js';\n\n/**\n * Sample a route of Coordinates\n * @param {Array.<Coordinates>} route ordered points\n * @param {*} stepSize step size to sample\n * @param {*} maxLength max route length to sample\n */\nexport function sampleRoute(route, stepSize = 0.7, startSampling = 0, length = Number.MAX_VALUE) {\n\n const endSampling = startSampling + length;\n\n const sampledRoute = [];\n\n let lastSample = null;\n\n let totalDistanceTraveled = 0;\n let distanceToNextSample;\n let startFound = false;\n\n for (let segmentIndex = 0; segmentIndex < route.length - 1; segmentIndex++) {\n\n const p1 = route[segmentIndex];\n const p2 = route[segmentIndex + 1];\n const segmentSize = p1.distanceTo(p2);\n const segmentBearing = p1.bearingTo(p2);\n\n let distanceTraveledOnSegment = 0;\n\n if (!startFound) {\n if (startSampling < totalDistanceTraveled + segmentSize) {\n startFound = true;\n distanceToNextSample = startSampling - totalDistanceTraveled;\n } else {\n totalDistanceTraveled += segmentSize;\n continue;\n }\n }\n\n lastSample = p1;\n while (distanceTraveledOnSegment + distanceToNextSample < segmentSize\n && totalDistanceTraveled + distanceToNextSample <= endSampling) {\n\n const newPoint = lastSample.destinationPoint(distanceToNextSample, segmentBearing);\n newPoint.bearing = segmentBearing;\n sampledRoute.push(newPoint);\n lastSample = newPoint;\n\n distanceTraveledOnSegment += distanceToNextSample;\n totalDistanceTraveled += distanceToNextSample;\n distanceToNextSample = stepSize;\n }\n\n if (totalDistanceTraveled + distanceToNextSample > endSampling) {\n break;\n }\n\n const rest = segmentSize - distanceTraveledOnSegment;\n totalDistanceTraveled += rest;\n distanceToNextSample -= rest;\n }\n\n return sampledRoute;\n}\n\n/**\n * Trim a route of Coordinates\n * @param {Array.<Coordinates>} route ordered points\n * @param {Coordinates} startPosition position where the trim starts. startPosition has to be on the route.\n * @param {*} maxLength max route length\n */\nexport function trimRoute(route, startPosition = route[0], length = Number.MAX_VALUE) {\n\n const newRoute = [];\n let previousPoint;\n\n let currentPointIndex;\n let cumulativeDistance = 0;\n\n if (route.length <= 1) {\n throw new Error('Route must have at least 2 points');\n }\n\n for (currentPointIndex = 1; currentPointIndex < route.length; currentPointIndex++) {\n\n const p1 = route[currentPointIndex - 1];\n const p2 = route[currentPointIndex];\n\n if (Coordinates.equalsTo(startPosition, p1)) {\n newRoute.push(p1);\n previousPoint = p1;\n break;\n }\n\n const proj = startPosition.getSegmentProjection(p1, p2);\n if (proj && Coordinates.equalsTo(startPosition, proj) && !proj.equalsTo(p2)) {\n newRoute.push(proj);\n previousPoint = proj;\n break;\n }\n }\n\n if (!newRoute.length) {\n throw new Error('startPosition is not on the route');\n }\n\n while (currentPointIndex < route.length) {\n const currentPoint = route[currentPointIndex];\n const dist = previousPoint.distanceTo(currentPoint);\n if (cumulativeDistance + dist >= length\n || Math.abs(cumulativeDistance + dist - length) <= Constants.EPS_MM) {\n const bearing = previousPoint.bearingTo(currentPoint);\n const remainingLength = length - cumulativeDistance;\n const end = previousPoint.destinationPoint(remainingLength, bearing);\n newRoute.push(end);\n break;\n }\n newRoute.push(currentPoint);\n previousPoint = currentPoint;\n cumulativeDistance += dist;\n currentPointIndex++;\n }\n\n return newRoute;\n}\n\n/**\n * @param {Coordinates[]} coords\n * @param {number} precision\n * @returns {Coordinates[]}\n */\nexport function simplifyRoute(coords, precisionAngle = deg2rad(5)) {\n\n const isClosed = (coords[0].equalsTo(coords[coords.length - 1]));\n\n let newRoute = coords.slice(0, coords.length - (isClosed ? 1 : 0));\n\n const len = newRoute.length;\n for (let i = isClosed ? 0 : 1; i < len; i++) {\n\n const p0 = coords[positiveMod(i - 1, len)];\n const p1 = coords[i];\n const p2 = coords[positiveMod(i + 1, len)];\n\n const seg1Dir = p0.bearingTo(p1);\n const seg2Dir = p1.bearingTo(p2);\n\n if (Math.abs(seg2Dir - seg1Dir) < precisionAngle) {\n newRoute = newRoute.filter(coord => coord !== p1);\n }\n }\n\n if (isClosed) {\n newRoute.push(newRoute[0]);\n }\n\n return newRoute;\n}\n\n/**\n * @param {GeolocationPosition} geolocationPosition\n * @returns {UserPosition}\n */\nexport function geolocationPositionToUserPosition(geolocationPosition) {\n if (geolocationPosition === null) {\n return null;\n }\n\n const { latitude, longitude, accuracy, heading } = geolocationPosition.coords;\n\n const userPosition = new UserPosition(latitude, longitude);\n userPosition.time = geolocationPosition.timestamp;\n userPosition.accuracy = accuracy;\n userPosition.bearing = heading ? deg2rad(heading) : null;\n return userPosition;\n}\n","import Coordinates from './Coordinates.js';\n\nclass BoundingBox {\n\n northEast;\n southWest;\n\n constructor(northEast, southWest) {\n this.northEast = northEast || null;\n this.southWest = southWest || null;\n\n if (this.northEast && this.southWest && this.getNorth() < this.getSouth()) {\n throw new Error('Incorrect bounding box');\n }\n }\n\n /**\n * Returns the geographical coordinate equidistant from the bounding box's corners.\n *\n * @returns {Coordinates} The bounding box's center.\n */\n get center() {\n const latCenter = (this.southWest.lat + this.northEast.lat) / 2;\n const lngCenter = (this.northEast.lng + this.southWest.lng) / 2;\n return new Coordinates(latCenter, lngCenter);\n }\n\n /**\n * Check if a point is contained in the bounding box.\n *\n * @returns {Coordinates} The point to analyze.\n */\n contains(point) {\n return point.lat <= this.northEast.lat\n && point.lat >= this.southWest.lat\n && point.lng <= this.northEast.lng\n && point.lng >= this.southWest.lng;\n }\n\n /**\n * Extend the bounds to include a given LngLat or LngLatBounds.\n *\n * @param {Coordinates|BoundingBox} obj object to extend to\n * @returns {BoundingBox} `this`\n */\n extend(obj) {\n const sw = this.southWest,\n ne = this.northEast;\n let sw2, ne2;\n\n if (obj instanceof Coordinates) {\n sw2 = obj;\n ne2 = obj;\n\n } else if (obj instanceof BoundingBox) {\n sw2 = obj.southWest;\n ne2 = obj.northEast;\n\n if (!sw2 || !ne2) {\n return this;\n }\n } else {\n throw new Error('Unknown parameter');\n }\n\n if (!sw && !ne) {\n this.southWest = new Coordinates(sw2.lat, sw2.lng);\n this.northEast = new Coordinates(ne2.lat, ne2.lng);\n\n } else {\n this.southWest = new Coordinates(\n Math.min(sw2.lat, sw.lat),\n Math.min(sw2.lng, sw.lng)\n );\n this.northEast = new Coordinates(\n Math.max(ne2.lat, ne.lat),\n Math.max(ne2.lng, ne.lng)\n );\n }\n\n return this;\n }\n\n /**\n * This method extends the bounding box with a value in meters\n * /*\\ This method is not precise as distance differs in function of latitude\n * @param {!number} measure in meters\n */\n extendsWithMeasure(measure) {\n\n if (typeof measure !== 'number') {\n throw new Error('measure is not a number');\n }\n\n this.northEast = this.northEast\n .destinationPoint(measure, 0)\n .move(measure, Math.PI / 2);\n\n this.southWest = this.southWest.clone()\n .destinationPoint(measure, -Math.PI / 2)\n .destinationPoint(measure, Math.PI);\n\n return this;\n }\n\n /**\n * Returns bounds created by extending or retracting the current bounds by a given ratio in each direction.\n * For example, a ratio of 0.5 extends the bounds by 50% in each direction.\n * Negative values will retract the bounds.\n * @param {Number} bufferRatio\n * @returns {BoundingBox} `this`\n */\n pad(bufferRatio) {\n const sw = this.southWest;\n const ne = this.northEast;\n\n const heightBuffer = Math.abs(sw.lat - ne.lat) * bufferRatio;\n const widthBuffer = Math.abs(sw.lng - ne.lng) * bufferRatio;\n\n this.southWest = new Coordinates(sw.lat - heightBuffer, sw.lng - widthBuffer);\n this.northEast = new Coordinates(ne.lat + heightBuffer, ne.lng + widthBuffer);\n\n return this;\n }\n\n /**\n * Returns the southwest corner of the bounding box.\n *\n * @returns {Coordinates} The southwest corner of the bounding box.\n */\n getSouthWest() {\n return this.southWest;\n }\n\n /**\n * Returns the northeast corner of the bounding box.\n *\n * @returns {Coordinates} The northeast corner of the bounding box.\n */\n getNorthEast() {\n return this.northEast;\n }\n\n /**\n * Returns the northwest corner of the bounding box.\n *\n * @returns {Coordinates} The northwest corner of the bounding box.\n */\n getNorthWest() {\n return new Coordinates(this.getNorth(), this.getWest());\n }\n\n /**\n * Returns the southeast corner of the bounding box.\n *\n * @returns {LngLat} The southeast corner of the bounding box.\n */\n getSouthEast() {\n return new Coordinates(this.getSouth(), this.getEast());\n }\n\n /**\n * Returns the west edge of the bounding box.\n *\n * @returns {number} The west edge of the bounding box.\n */\n getWest() {\n return this.southWest.lng;\n }\n\n /**\n * Returns the south edge of the bounding box.\n *\n * @returns {number} The south edge of the bounding box.\n */\n getSouth() {\n return this.southWest.lat;\n }\n\n /**\n * Returns the east edge of the bounding box.\n *\n * @returns {number} The east edge of the bounding box.\n */\n getEast() {\n return this.northEast.lng;\n }\n\n /**\n * Returns the north edge of the bounding box.\n *\n * @returns {number} The north edge of the bounding box.\n */\n getNorth() {\n return this.northEast.lat;\n }\n\n static equalsTo(bb1, bb2) {\n return Coordinates.equalsTo(bb1.northEast, bb2.northEast)\n && Coordinates.equalsTo(bb1.southWest, bb2.southWest);\n }\n\n equalsTo(other) {\n return BoundingBox.equalsTo(this, other);\n }\n\n /**\n * Create a BoundingBox from a WSEN array\n * @param {Number[4]} bounds a WSEN array\n * @returns {BoundingBox} the corresponding BoundingBox\n */\n static fromArray(bounds) {\n return new BoundingBox(\n new Coordinates(bounds[3], bounds[2]),\n new Coordinates(bounds[1], bounds[0])\n );\n }\n\n /**\n * Returns the WSEN array\n * @returns {Number[4]} the WSEN array\n */\n toArray() {\n return [this.getWest(), this.getSouth(), this.getEast(), this.getNorth()];\n }\n}\n\nexport default BoundingBox;\n","import Constants from '../Constants.js';\n\nclass RelativePosition {\n\n _x = 0;\n _y = 0;\n _z = 0;\n _time = null;\n _accuracy = null;\n _bearing = null;\n\n constructor(x, y, z, time, accuracy, bearing) {\n this.x = x;\n this.y = y;\n this.z = z;\n this.time = time;\n this.accuracy = accuracy;\n this.bearing = bearing;\n }\n\n get x() {\n return this._x;\n }\n\n set x(x) {\n if (typeof x === 'number') {\n this._x = x;\n } else {\n throw new Error('x argument is not a number');\n }\n }\n\n get y() {\n return this._y;\n }\n\n set y(y) {\n if (typeof y === 'number') {\n this._y = y;\n } else {\n throw new Error('y argument is not a number');\n }\n }\n\n get z() {\n return this._z;\n }\n\n set z(z) {\n if (typeof z === 'number') {\n this._z = z;\n } else {\n throw new Error('z argument is not a number');\n }\n }\n\n get time() {\n return this._time;\n }\n\n set time(time) {\n if (typeof time === 'number') {\n this._time = time;\n } else {\n if (typeof time !== 'undefined' && time !== null) {\n throw new Error('time argument is not a number');\n }\n this._time = null;\n }\n }\n\n\n get accuracy() {\n return this._accuracy;\n }\n\n set accuracy(accuracy) {\n if (typeof accuracy === 'number' && accuracy >= 0) {\n this._accuracy = accuracy;\n } else {\n if (typeof accuracy !== 'undefined' && accuracy !== null) {\n throw new Error('accuracy argument is not a positive number');\n }\n this._accuracy = null;\n }\n }\n\n\n get bearing() {\n return this._bearing;\n }\n\n set bearing(bearing) {\n if (typeof bearing === 'number') {\n this._bearing = bearing % (2 * Math.PI);\n } else {\n if (typeof bearing !== 'undefined' && bearing !== null) {\n throw new Error('bearing argument is not a number');\n }\n this._bearing = null;\n }\n }\n\n clone() {\n return new RelativePosition(this.x, this.y, this.z, this.time, this.accuracy, this.bearing);\n }\n\n\n /**\n * Compares two RelativePosition\n * @param {RelativePosition} pos1 position 1\n * @param {RelativePosition} pos2 position 2\n * @param {Number} eps x, y, z epsilon in meters (default: 1e-3 [= 1mm])\n */\n static equalsTo(pos1, pos2, eps = Constants.EPS_MM) {\n\n // Handle null comparison\n if (pos1 === null && pos1 === pos2) {\n return true;\n }\n\n if (!(pos1 instanceof RelativePosition) || !(pos2 instanceof RelativePosition)) {\n return false;\n }\n\n return Math.abs(pos2.x - pos1.x) < eps\n && Math.abs(pos2.y - pos1.y) < eps\n && Math.abs(pos2.z - pos1.z) < eps\n && pos1.time === pos2.time\n && pos1.accuracy === pos2.accuracy\n && pos1.bearing === pos2.bearing;\n }\n\n equalsTo(other) {\n return RelativePosition.equalsTo(this, other);\n }\n\n\n toJson() {\n const output = {\n x: this.x,\n y: this.y,\n z: this.z\n };\n\n if (this.time !== null) {\n output.time = this.time;\n }\n if (this.accuracy !== null) {\n output.accuracy = this.accuracy;\n }\n if (this.bearing !== null) {\n output.bearing = this.bearing;\n }\n return output;\n }\n\n static fromJson(json) {\n return new RelativePosition(json.x, json.y, json.z, json.time, json.accuracy, json.bearing);\n }\n}\n\nexport default RelativePosition;\n","import RelativePosition from './RelativePosition.js';\n\n/**\n * Position is defined in EUS (East-Up-South) frame with: x pointing to East, y pointing to Up, z pointing to South\n * This frame is close to ThreeJS / OpenGL frame.\n */\nclass GeoRelativePosition extends RelativePosition { }\n\nexport default GeoRelativePosition;\n","import {\n Rotations, Quaternion, rad2deg, deg2rad\n} from '@wemap/maths';\n\nclass Attitude {\n\n _quaternion = [1, 0, 0, 0];\n _heading = null;\n _eulerAngles = null;\n _time = null;\n _accuracy = null;\n\n /**\n *\n * @param {number[]} quaternion\n * @param {number} time\n * @param {number} accuracy\n */\n constructor(quaternion, time, accuracy) {\n this.quaternion = quaternion;\n this.time = time;\n this.accuracy = accuracy;\n }\n\n static unitary() {\n return new Attitude([1, 0, 0, 0]);\n }\n\n /**\n * @returns {number[]}\n */\n get quaternion() {\n return this._quaternion;\n }\n\n /**\n * @param {number[]} quaternion\n */\n set quaternion(quaternion) {\n if (!Array.isArray(quaternion)\n || quaternion.length !== 4\n || Math.abs(1 - Quaternion.norm(quaternion)) > 1e-4) {\n throw new Error('quaternion is not a unit quaternion');\n }\n this._quaternion = quaternion;\n this._heading = null;\n this._eulerAngles = null;\n }\n\n /**\n * @returns {number}\n */\n get time() {\n return this._time;\n }\n\n /**\n * @param {number} time\n */\n set time(time) {\n if (typeof time === 'number') {\n this._time = time;\n } else {\n if (typeof time !== 'undefined' && time !== null) {\n throw new Error('time argument is not a number');\n }\n this._time = null;\n }\n }\n\n /**\n * @returns {number}\n */\n get accuracy() {\n return this._accuracy;\n }\n\n /**\n * @param {number} accuracy\n */\n set accuracy(accuracy) {\n if (typeof accuracy === 'number' && accuracy >= 0 && accuracy <= Math.PI) {\n this._accuracy = accuracy;\n } else {\n if (typeof accuracy !== 'undefined' && accuracy !== null) {\n throw new Error('accuracy argument (' + accuracy + ') is not in range [0; PI]');\n }\n this._accuracy = null;\n }\n }\n\n /** @type {number[]} */\n get eulerAngles() {\n if (this._eulerAngles === null) {\n this._eulerAngles = Rotations.quaternionToEulerZXY(this.quaternion);\n }\n return this._eulerAngles;\n }\n\n /** @type {number[]} */\n get eulerAnglesDegrees() {\n return this.eulerAngles.map(x => rad2deg(x));\n }\n\n /** @type {number} */\n get heading() {\n if (this._heading === null) {\n let offset = 0;\n if (typeof (window) !== 'undefined' && window && window.orientation) {\n offset = deg2rad(window.orientation);\n }\n this._heading = Rotations.getHeadingFromQuaternion(this.quaternion) + offset;\n }\n return this._heading;\n }\n\n /** @type {number} */\n get headingDegrees() {\n return rad2deg(this.heading);\n }\n\n /**\n * Compares two Attitude\n * @param {Attitude} att1 attitude 1\n * @param {Attitude} att2 attitude 2\n */\n static equalsTo(att1, att2) {\n\n // Handle null comparison\n if (att1 === null && att1 === att2) {\n // TODO not sure to return true here.\n return true;\n }\n\n if (!(att1 instanceof Attitude) || !(att2 instanceof Attitude)) {\n return false;\n }\n\n if (att1 === att2) {\n return true;\n }\n\n return Quaternion.equalsTo(att1.quaternion, att2.quaternion);\n }\n\n /**\n * @param {Attitude} other\n * @returns {boolean}\n */\n equalsTo(other) {\n return Attitude.equalsTo(this, other);\n }\n\n /**\n * @returns {object}\n */\n toJson() {\n return this.quaternion;\n }\n\n /**\n * @param {object} json\n * @returns {Attitude}\n */\n static fromJson(json) {\n return new Attitude(json);\n }\n\n /**\n * @returns {Attitude}\n */\n clone() {\n return new Attitude(this.quaternion.slice(0), this.time, this.accuracy);\n }\n}\n\nexport default Attitude;\n","import { Quaternion } from '@wemap/maths';\n\nimport Attitude from './Attitude.js';\n\nclass AbsoluteHeading {\n\n _heading = null;\n _time = null;\n _accuracy = null;\n\n /**\n *\n * @param {Number} heading\n * @param {Number} time\n * @param {Number} accuracy\n */\n constructor(heading, time, accuracy) {\n this.heading = heading;\n this.time = time;\n this.accuracy = accuracy;\n }\n\n /**\n * @returns {Number}\n */\n get heading() {\n return this._heading;\n }\n\n /**\n * @param {Number} heading\n */\n set heading(heading) {\n if (typeof heading === 'number') {\n this._heading = heading;\n } else {\n throw new Error('heading argument is not a number');\n }\n }\n\n /**\n * @returns {Number}\n */\n get time() {\n return this._time;\n }\n\n /**\n * @param {Number} time\n */\n set time(time) {\n if (typeof time === 'number') {\n this._time = time;\n } else {\n if (typeof time !== 'undefined' && time !== null) {\n throw new Error('time argument is not a number');\n }\n this._time = null;\n }\n }\n\n /**\n * @returns {Number}\n */\n get accuracy() {\n return this._accuracy;\n }\n\n /**\n * @param {Number} accuracy\n */\n set accuracy(accuracy) {\n if (typeof accuracy === 'number' && accuracy >= 0 && accuracy <= Math.PI) {\n this._accuracy = accuracy;\n } else {\n if (typeof accuracy !== 'undefined' && accuracy !== null) {\n throw new Error('accuracy argument (' + accuracy + ') is not in range [0; PI]');\n }\n this._accuracy = null;\n }\n }\n\n /**\n * @returns {Attitude}\n */\n toAttitude() {\n /**\n * Heading is given around z-axis in NED frame and our attitude in ENU frame, that is why\n * -1* is applied to heading.\n */\n return new Attitude(\n Quaternion.fromAxisAngle([0, 0, 1], -this.heading),\n this.time,\n this.accuracy\n );\n }\n\n\n /**\n * Compares two AbsoluteHeading\n * @param {AbsoluteHeading} heading1 heading 1\n * @param {AbsoluteHeading} heading2 heading 2\n */\n static equalsTo(heading1, heading2) {\n\n // Handle null comparison\n if (heading1 === null && heading1 === heading2) {\n return true;\n }\n\n if (!(heading1 instanceof AbsoluteHeading) || !(heading2 instanceof AbsoluteHeading)) {\n return false;\n }\n\n return Math.abs(heading1.heading - heading2.heading) < 1e-8;\n }\n\n equalsTo(other) {\n return AbsoluteHeading.equalsTo(this, other);\n }\n\n toJson() {\n const output = { heading: this.heading };\n if (this.accuracy !== null) {\n output.accuracy = this.accuracy;\n }\n if (this.time !== null) {\n output.time = this.time;\n }\n return output;\n }\n\n static fromJson({\n heading, time, accuracy\n }) {\n return new AbsoluteHeading(heading, time, accuracy);\n }\n\n clone() {\n return new AbsoluteHeading(this.heading, this.time, this.accuracy);\n }\n}\n\nexport default AbsoluteHeading;\n","import Logger from '@wemap/logger';\n\nimport Coordinates from '../coordinates/Coordinates.js';\nimport Level from '../coordinates/Level.js';\n\nimport Edge from './GraphEdge.js';\n\n/**\n * @template T\n */\nclass GraphNode {\n\n /** @type {Coordinates} */\n _coords;\n\n /** @type {Edge<T>[]} */\n edges = [];\n\n /** @type {?T} */\n builtFrom = null;\n\n /** @type {boolean} */\n io = false;\n\n /**\n * @param {Coordinates} coords\n * @param {T} builtFrom\n */\n constructor(coords, builtFrom = null) {\n this.coords = coords;\n this.builtFrom = builtFrom;\n this.edges = [];\n }\n\n /** @type {!Coordinates} */\n get coords() {\n return this._coords;\n }\n\n /** @type {!Coordinates} */\n set coords(coords) {\n if (!(coords instanceof Coordinates)) {\n throw new Error('coords is not a Coordinates');\n }\n this._coords = coords;\n }\n\n /**\n * @param {GraphNode} other\n * @returns {number}\n */\n distanceTo(other) {\n return this.coords.distanceTo(other.coords);\n }\n\n /**\n * @param {GraphNode} other\n * @returns {number}\n */\n bearingTo(other) {\n return this.coords.bearingTo(other.coords);\n }\n\n /**\n * @param {GraphNode} other\n * @returns {boolean}\n */\n equalsTo(other) {\n return this.coords.equalsTo(other.coords)\n && this.builtFrom === other.builtFrom;\n }\n\n /**\n * @returns {GraphNode}\n */\n clone() {\n const node = new GraphNode(this.coords);\n node.edges = this.edges.slice(0);\n node.builtFrom = this.builtFrom;\n node.io = this.io;\n return node;\n }\n\n /**\n * Does not include \"edges\" and \"builtFrom\" properties\n * @returns {object}\n */\n toJson() {\n return this.coords.toCompressedJson();\n }\n\n /**\n * @template T\n * @returns {GraphNode<T>}\n */\n static fromJson(json) {\n return new GraphNode(Coordinates.fromCompressedJson(json));\n }\n\n generateLevelFromEdges() {\n let tmpLevel = null;\n for (let i = 0; i < this.edges.length; i++) {\n const edge = this.edges[i];\n if (edge.level) {\n if (!tmpLevel) {\n tmpLevel = edge.level.clone();\n } else {\n tmpLevel = tmpLevel.intersect(edge.level);\n if (!tmpLevel) {\n Logger.error('Error: Something bad happend during parsing: We cannot retrieve node level from adjacent ways: ' + this.coords);\n return false;\n }\n }\n }\n }\n this.coords.level = tmpLevel;\n return true;\n }\n\n\n /**\n * We suppose generateLevelFromEdges() was called before\n */\n inferNodeLevelByRecursion() {\n const { level } = this.coords;\n if (!level || !level.isRange) {\n return true;\n }\n\n /**\n * We can infer node level only if this one have one edge attached\n */\n if (this.edges.length > 1) {\n return true;\n }\n\n /**\n * This method looks for single level nodes recursively from a multi-level node\n * The result of this method is an union of all single level nodes found.\n * @param {GraphNode} node node to explore\n * @param {GraphNode[]} visitedNodes list of visited nodes\n */\n const lookForLevel = (node, visitedNodes) => {\n\n visitedNodes.push(node);\n\n if (!node.coords.level) {\n return null;\n }\n\n if (!node.coords.level.isRange) {\n return node.coords.level;\n }\n\n let tmpLevel = null;\n for (let i = 0; i < node.edges.length; i++) {\n const edge = node.edges[i];\n const otherNode = edge.node1 === node ? edge.node2 : edge.node1;\n if (!visitedNodes.includes(otherNode)) {\n tmpLevel = Level.union(lookForLevel(otherNode, visitedNodes), tmpLevel);\n }\n }\n return tmpLevel;\n };\n\n const othersLevels = lookForLevel(this, []);\n\n if (othersLevels !== null) {\n if (!othersLevels.isRange) {\n this.coords.level = new Level(othersLevels.val === level.low ? level.up : level.low);\n return true;\n }\n Logger.warn('Level of: ' + this.coords.toString() + ' cannot be decided');\n return false;\n }\n\n return true;\n }\n\n /**\n * We suppose generateLevelFromEdges() was called before\n */\n inferNodeLevelByNeighboors() {\n const { level } = this.coords;\n if (!level || !level.isRange) {\n return true;\n }\n\n let tmpLevel = null;\n for (let i = 0; i < this.edges.length; i++) {\n const edge = this.edges[i];\n const otherNode = edge.node1 === this ? edge.node2 : edge.node1;\n tmpLevel = Level.union(otherNode.coords.level, tmpLevel);\n }\n\n if (tmpLevel === null || !tmpLevel.isRange) {\n this.coords.level = new Level(tmpLevel.val === level.low ? level.up : level.low);\n }\n\n return true;\n }\n\n /**\n * Set node.io to true for nodes that make the link between\n * indoor and outdoor edges\n */\n checkIO() {\n this.io = this._coords.level !== null\n && this.edges.some(edge => edge.level === null);\n return true;\n }\n\n /**\n * @param {GraphNode[]} nodes\n */\n static generateNodesLevels(nodes) {\n const success = nodes.reduce((acc, node) => acc && node.generateLevelFromEdges(), true);\n if (!success) {\n return false;\n }\n\n // In some cases, node levels cannot be retrieve just using adjacent edges\n // (e.g stairs without network at one of its bounds)\n // To infer this node level, we use inferNodeLevelByRecursion()\n const res = nodes.reduce((acc, node) => acc\n && node.inferNodeLevelByNeighboors()\n && node.inferNodeLevelByRecursion()\n , true);\n\n // Finally define nodes that are links between indoor and outdoor\n nodes.forEach(node => node.checkIO());\n\n return res;\n }\n}\n\nexport default GraphNode;\n","import Level from '../coordinates/Level.js';\nimport GraphNode from './GraphNode.js';\n\n/**\n * @template T\n *\n * An Edge is a segment composed of two Node\n * An edge is mostly issued from an OsmWay, but this is not always the case.\n * For example, edges created by mapmatching.\n */\nclass GraphEdge {\n\n /** @type {GraphNode<T>} */\n _node1 = null;\n\n /** @type {GraphNode<T>} */\n _node2 = null;\n\n /** @type {?Level} */\n _level = null;\n\n /** @type {?number} */\n _bearing;\n\n /** @type {?number} */\n _length;\n\n /** @type {boolean} */\n _computedSizeAndBearing = false;\n\n /** @type {?T} */\n builtFrom = null;\n\n /** @type {boolean} */\n isOneway = false;\n\n /**\n * @param {!GraphNode} node1\n * @param {!GraphNode} node2\n * @param {?Level} level\n * @param {?T} builtFrom\n * @param {?string} name\n */\n constructor(node1, node2, level = null, builtFrom = null) {\n this.node1 = node1;\n this.node2 = node2;\n this.level = level;\n this.builtFrom = builtFrom;\n }\n\n /** @type {!GraphNode<T>} */\n get node1() {\n return this._node1;\n }\n\n /** @type {!GraphNode<T>} */\n set node1(node) {\n\n if (!(node instanceof GraphNode)) {\n throw new TypeError('node1 is not a GraphNode');\n }\n\n if (this._node1 !== null && this._node2 !== this._node1) {\n this._node1.edges = this._node1.edges.filter(edge => edge !== this);\n }\n\n node.edges.push(this);\n\n this._node1 = node;\n this._computedSizeAndBearing = false;\n }\n\n /** @type {!GraphNode<T>} */\n get node2() {\n return this._node2;\n }\n\n /** @type {!GraphNode<T>} */\n set node2(node) {\n\n if (!(node instanceof GraphNode)) {\n throw new TypeError('node2 is not a GraphNode');\n }\n\n if (this._node2 !== null && this._node2 !== this._node1) {\n this._node2.edges = this._node2.edges.filter(edge => edge !== this);\n }\n\n node.edges.push(this);\n\n this._node2 = node;\n this._computedSizeAndBearing = false;\n }\n\n /** @type {?Level} */\n get level() {\n return this._level;\n }\n\n /** @type {?Level} */\n set level(level) {\n if (level instanceof Level) {\n this._level = level;\n } else {\n if (typeof level !== 'undefined' && level !== null) {\n throw new Error('level argument is not a Level object');\n }\n this._level = null;\n }\n }\n\n /**\n * Get edge bearing from node1 to node2\n * @type {number}\n */\n get bearing() {\n if (!this._computedSizeAndBearing) {\n this._computeSizeAndBearing();\n }\n return this._bearing;\n }\n\n /**\n * get edge length\n * @type {number}\n */\n get length() {\n if (!this._computedSizeAndBearing) {\n this._computeSizeAndBearing();\n }\n return this._length;\n }\n\n _computeSizeAndBearing() {\n this._length = this.node1.distanceTo(this.node2);\n this._bearing = this.node1.bearingTo(this.node2);\n this._computedSizeAndBearing = true;\n }\n\n /**\n * @param {GraphEdge<T>} other\n * @returns {boolean}\n */\n equalsTo(other) {\n\n if (this === other) {\n return true;\n }\n\n if (!(other instanceof GraphEdge)) {\n return false;\n }\n\n return other.node1.equalsTo(this.node1)\n && other.node2.equalsTo(this.node2)\n && Level.equalsTo(other.level, this.level)\n && other.isOneway === this.isOneway\n && other.builtFrom === this.builtFrom;\n }\n\n /**\n * @returns {GraphEdge<T>}\n */\n clone() {\n const edge = new GraphEdge(this.node1, this.node2);\n edge.level = this.level;\n edge.isOneway = this.isOneway;\n edge.builtFrom = this.builtFrom;\n return edge;\n }\n\n}\n\nexport default GraphEdge;\n","\nimport GraphEdge from './GraphEdge.js';\nimport GraphNode from './GraphNode.js';\n\n/**\n * @template T\n * @param {GraphEdge<T>[]} edges\n * @param {GraphNode<T>} node1\n * @param {GraphNode<T>} node2\n * @returns {?GraphEdge<T>}\n */\nexport function getEdgeByNodes(edges, node1, node2) {\n return edges.find(edge =>\n node1 === edge.node1 && node2 === edge.node2\n || node2 === edge.node1 && node1 === edge.node2\n );\n}\n","import BoundingBox from '../coordinates/BoundingBox.js';\nimport Coordinates from '../coordinates/Coordinates.js';\nimport Level from '../coordinates/Level.js';\n\nimport GraphEdge from './GraphEdge.js';\nimport GraphNode from './GraphNode.js';\nimport { getEdgeByNodes } from './GraphUtils.js';\n\n/**\n * @template T\n *\n * A typical network with nodes (Node) and edges (Edge)\n */\nclass Network {\n\n /** @type {GraphNode<T>[]} */\n nodes;\n\n /** @type {GraphEdge<T>[]} */\n edges;\n\n /**\n * @template T\n * @param {GraphNode<T>[]} nodes\n * @param {GraphEdge<T>[]} edges\n */\n constructor(nodes, edges) {\n this.nodes = Array.isArray(nodes) ? nodes : [];\n this.edges = Array.isArray(edges) ? edges : [];\n }\n\n /**\n * @template T\n * @param {Coordinates} coords\n * @returns {?GraphNode<T>}\n */\n getNodeByCoords(coords) {\n return this.nodes.find(node => node.coords.equalsTo(coords));\n }\n\n /**\n * @template T\n * @param {GraphNode<T>} node1\n * @param {GraphNode<T>} node2\n * @returns {?GraphEdge<T>}\n */\n getEdgeByNodes(node1, node2) {\n return getEdgeByNodes(this.edges, node1, node2);\n }\n\n\n /**\n * @param {?number} extendedMeasure\n * @returns {BoundingBox}\n */\n getBoundingBox(extendedMeasure) {\n const boundingBox = this.nodes.reduce(\n (acc, node) => acc.extend(node.coords), new BoundingBox()\n );\n if (extendedMeasure) {\n boundingBox.extendsWithMeasure(extendedMeasure);\n }\n return boundingBox;\n }\n\n /**\n * @param {function} _nodeToStringFn\n * @param {function} _edgeToStringFn\n * @returns {string}\n */\n toDetailedString(_nodeToStringFn, _edgeToStringFn) {\n\n let nodeToStringFn = _nodeToStringFn;\n if (!nodeToStringFn) {\n nodeToStringFn = node => `${node.builtFrom}`;\n }\n\n let edgeToStringFn = _edgeToStringFn;\n if (!_edgeToStringFn) {\n edgeToStringFn = edge => `${edge.builtFrom}`;\n }\n\n let output\n = '--- Network ---\\n'\n + `Nodes: ${this.nodes.length}\\n`\n + `Edges: ${this.edges.length}\\n`\n + '---\\n'\n + 'Nodes\\n';\n this.nodes.forEach(node => {\n output += `${nodeToStringFn(node)} [edges: ${node.edges.length}]\\n`;\n });\n output += '---\\n'\n + 'Edges\\n';\n this.edges.forEach(edge => {\n output += `${edgeToStringFn(edge)} `;\n output += `[${nodeToStringFn(edge.node1)} -- ${nodeToStringFn(edge.node2)}]\\n`;\n });\n output += '---';\n return output;\n }\n\n /**\n * @returns {object}\n */\n toCompressedJson() {\n return {\n nodes: this.nodes.map(node => node.toJson()),\n edges: this.edges.map(edge => {\n const output = [\n this.nodes.indexOf(edge.node1),\n this.nodes.indexOf(edge.node2)\n ];\n if (edge.level !== null) {\n output.push(edge.level.toString());\n }\n if (edge.isOneway) {\n if (edge.level === null) {\n output.push(null);\n }\n output.push(true);\n }\n return output;\n })\n };\n }\n\n /**\n * @param {object} json\n * @returns {Network}\n */\n static fromCompressedJson(json) {\n\n const network = new Network();\n\n network.nodes = json.nodes.map(GraphNode.fromJson);\n\n network.edges = json.edges.map(jsonEdge => {\n const edge = new GraphEdge(\n network.nodes[jsonEdge[0]],\n network.nodes[jsonEdge[1]]\n );\n if (jsonEdge.length > 2 && jsonEdge[2] !== null) {\n edge.level = Level.fromString(jsonEdge[2]);\n }\n if (jsonEdge.length > 3 && jsonEdge[3]) {\n edge.isOneway = true;\n }\n return edge;\n });\n\n return network;\n }\n\n\n /**\n * Convert Array of Coordinates array to a network\n * @param {Coordinates[][]} segments\n * @returns {Network}\n */\n static fromCoordinates(segments) {\n\n const network = new Network();\n\n const getOrCreateNode = coords =>\n network.nodes.find(_coords => _coords.equalsTo(coords)) || new GraphNode(coords);\n\n\n const createEdgeFromNodes = (node1, node2) =>\n new GraphEdge(node1, node2, Level.union(node1.coords.level, node2.coords.level));\n\n for (const segment of segments) {\n\n let previousNode = null;\n for (const coords of segment) {\n const currentNode = getOrCreateNode(coords);\n\n if (previousNode) {\n const edge = createEdgeFromNodes(currentNode, previousNode);\n network.edges.push(edge);\n }\n\n network.nodes.push(currentNode);\n previousNode = currentNode;\n }\n }\n\n return network;\n }\n\n /**\n * Create edges From MultiLevel Itinerary for a given level\n * @param {Level} targetLevel level for selection.\n * @param {Boolean} useMultiLevelEdges use segments which intersect both levels (stairs, elevators...)\n * @returns {GraphEdge[]} Ordered edges\n */\n getEdgesAtLevel(targetLevel, useMultiLevelEdges = true) {\n return this.edges.filter(\n ({ level }) => useMultiLevelEdges\n ? Level.intersect(targetLevel, level) !== null\n : Level.contains(targetLevel, level)\n );\n }\n\n}\n\nexport default Network;\n","import Coordinates from '../coordinates/Coordinates.js';\nimport Edge from './GraphEdge.js';\nimport Node from './GraphNode.js';\n\nclass GraphProjection {\n\n /** @type {Coordinates} */\n origin;\n\n /** @type {number} */\n distanceFromNearestElement;\n\n /** @type {Coordinates} */\n projection;\n\n /** @type {Node|Edge} */\n nearestElement;\n\n}\n\nexport default GraphProjection;\n","/* eslint-disable complexity */\n/* eslint-disable max-statements */\nimport { diffAngleLines } from '@wemap/maths';\nimport { GraphEdge } from '@wemap/geo';\n\nimport Constants from '../Constants.js';\nimport Coordinates from '../coordinates/Coordinates.js';\nimport UserPosition from '../coordinates/UserPosition.js';\nimport Level from '../coordinates/Level.js';\n\nimport Network from './Network.js';\nimport GraphProjection from './GraphProjection.js';\n\nclass MapMatching {\n\n /** @type {Network} */\n _network = null;\n\n /** @type {number} */\n _maxDistance = Number.MAX_VALUE;\n\n /** @type {number} */\n _maxAngleBearing = Math.PI;\n\n /**\n * Constructor of Map-matching\n * @param {?Network} network\n */\n constructor(network) {\n this.network = network;\n }\n\n /** @type {!number} */\n set maxAngleBearing(maxAngleBearing) {\n this._maxAngleBearing = maxAngleBearing;\n }\n\n /** @type {!number} */\n set maxDistance(maxDistance) {\n this._maxDistance = maxDistance;\n }\n\n /** @type {!number} */\n get maxAngleBearing() {\n return this._maxAngleBearing;\n }\n\n /** @type {!number} */\n get maxDistance() {\n return this._maxDistance;\n }\n\n /** @type {?Network} */\n get network() {\n return this._network;\n }\n\n /** @type {?Network} */\n set network(network) {\n if (network instanceof Network) {\n this._network = network;\n } else {\n if (typeof network !== 'undefined' && network !== null) {\n throw new Error('network argument is not a Network object');\n }\n this._network = null;\n }\n }\n\n /**\n * Check if the specified edge and its nodes can be used for projection\n * @returns {boolean} an array of two elements.\n * First is true if projection will be used on the specified edge, false otherwise.\n * Second is true if projection will be used on the nodes of the specified edge, false otherwise.\n *\n * @param {GraphEdge} edge\n * @param {Coordinates} location\n * @param {boolean} useBearing\n * @param {boolean} useMultiLevelSegments\n * @param {Function} acceptEdgeFn\n */\n _shouldProjectOnEdgeAndNodes(edge, location, useBearing, useMultiLevelSegments, acceptEdgeFn) {\n\n if (!acceptEdgeFn(edge)) {\n // if edge selection is not verified\n return [false, false, false];\n }\n\n let checkNode1 = true;\n let checkNode2 = true;\n let checkEdge = true;\n\n if (\n // Verify if edge level only if one of both is defined\n (location.level || edge.level)\n && (\n // if edge level intersect location level\n !Level.intersect(location.level, edge.level)\n // ignore MultiLevelSegments if option used\n || (!useMultiLevelSegments && edge.level && edge.level.isRange)\n )) {\n checkEdge = false;\n }\n\n if (!Level.equalsTo(location.level, edge.node1.coords.level) && !edge.node1.io) {\n checkNode1 = false;\n }\n\n if (!Level.equalsTo(location.level, edge.node2.coords.level) && !edge.node2.io) {\n checkNode2 = false;\n }\n\n if (useBearing) {\n // if mapmatching bearing is enabled do not use nodes matching\n if (checkEdge) {\n // condition for optimisation\n const diffAngle = diffAngleLines(edge.bearing, location.bearing);\n if (diffAngle > this._maxAngleBearing) {\n // Do not try to project if angle is greater than the threshold\n checkEdge = false;\n }\n }\n checkNode1 = false;\n checkNode2 = false;\n }\n\n return [checkEdge, checkNode1, checkNode2];\n }\n\n\n /**\n * @param {Coordinates} fromCoordinates\n * @param {Coordinates} toCoordinates\n */\n static _assignLatLngLevel(fromCoordinates, toCoordinates) {\n toCoordinates.lat = fromCoordinates.lat;\n toCoordinates.lng = fromCoordinates.lng;\n toCoordinates.level = fromCoordinates.level;\n }\n\n /**\n * @param {Edge} _edge\n * @param {Coordinates} _projection\n */\n static _updateProjectionLevelFromEdge = (_edge, _projection) => {\n if (_edge.level) {\n _projection.level = _edge.level.clone();\n }\n };\n\n /**\n * @param {!Coordinates} location\n * @param {boolean} useDistance\n * @param {boolean} useBearing\n * @param {boolean} useMultiLevelSegments\n * @param {function} acceptEdgeFn\n * @returns {GraphProjection}\n */\n getProjection(location, useDistance = false, useBearing = false,\n useMultiLevelSegments = true, acceptEdgeFn = () => true) {\n\n if (this.network === null) {\n throw new Error('Network has not been set yet');\n }\n\n if (!(location instanceof Coordinates)) {\n throw new TypeError('location is not an instance of Coordinates');\n }\n\n if (useBearing && (!location.bearing || !this._maxAngleBearing)) {\n return null;\n }\n\n const projection = new GraphProjection();\n projection.origin = location;\n projection.distanceFromNearestElement = Number.MAX_VALUE;\n projection.projection = location.clone();\n\n const isProjectionBetter = (distanceOfNewProjection) => {\n return distanceOfNewProjection < projection.distanceFromNearestElement\n && (!useDistance || distanceOfNewProjection <= this._maxDistance);\n };\n\n for (let i = 0; i < this.network.edges.length; i++) {\n const edge = this.network.edges[i];\n\n const [checkEdge, checkNode1, checkNode2] = this._shouldProjectOnEdgeAndNodes(\n edge, location, useBearing, useMultiLevelSegments, acceptEdgeFn);\n\n if (checkNode1) {\n\n const distNode1 = location.distanceTo(edge.node1.coords);\n if (isProjectionBetter(distNode1) || distNode1 <= Constants.EPS_MM) {\n projection.distanceFromNearestElement = distNode1;\n projection.nearestElement = edge.node1;\n MapMatching._assignLatLngLevel(edge.node1.coords, projection.projection);\n MapMatching._updateProjectionLevelFromEdge(edge, projection.projection);\n\n if (distNode1 <= Constants.EPS_MM\n && location.level === edge.node1.coords.level) {\n break;\n }\n }\n }\n\n if (checkNode2) {\n\n const distNode2 = location.distanceTo(edge.node2.coords);\n if (isProjectionBetter(distNode2) || distNode2 <= Constants.EPS_MM) {\n\n projection.distanceFromNearestElement = distNode2;\n projection.nearestElement = edge.node2;\n MapMatching._assignLatLngLevel(edge.node2.coords, projection.projection);\n MapMatching._updateProjectionLevelFromEdge(edge, projection.projection);\n\n if (distNode2 <= Constants.EPS_MM\n && location.level === edge.node2.coords.level) {\n break;\n }\n }\n }\n\n if (checkEdge) {\n const segmentProjection = location.getSegmentProjection(edge.node1.coords, edge.node2.coords);\n if (segmentProjection) {\n const distEdge = location.distanceTo(segmentProjection);\n if (isProjectionBetter(distEdge)) {\n projection.distanceFromNearestElement = distEdge;\n projection.nearestElement = edge;\n MapMatching._assignLatLngLevel(segmentProjection, projection.projection);\n MapMatching._updateProjectionLevelFromEdge(edge, projection.projection);\n }\n }\n }\n }\n\n\n if (!projection.nearestElement) {\n return null;\n }\n\n if (projection.projection instanceof UserPosition) {\n projection.projection.accuracy += projection.distanceFromNearestElement;\n }\n return projection;\n }\n\n}\n\nexport default MapMatching;\n","import Coordinates from '../coordinates/Coordinates.js';\nimport GraphNode from '../graph/GraphNode.js';\nimport GraphEdge from '../graph/GraphEdge.js';\nimport { getEdgeByNodes } from '../graph/GraphUtils.js';\n\n/**\n * @template T\n */\nclass GraphItinerary {\n\n /** @type {Coordinates} */\n start;\n\n /** @type {Coordinates} */\n end;\n\n /** @type {GraphNode<T>[]} */\n nodes;\n\n /** @type {GraphEdge<T>[]} */\n edges;\n\n /** @type {number[]} */\n edgesWeights;\n\n\n /**\n * @template T\n * @param {GraphNode<T>[]} networkNodes\n * @param {number[]} edgesWeights\n * @returns {GraphItinerary<T>}\n */\n static fromNetworkNodes(networkNodes, edgesWeights) {\n const itinerary = new GraphItinerary();\n itinerary.edgesWeights = edgesWeights;\n\n itinerary.nodes = networkNodes.map(node => {\n const newNode = node.clone();\n\n // Remove node edges, they will be added later.\n newNode.edges = [];\n\n // Let consider io nodes level = null for GraphItinerary\n if (newNode.io) {\n newNode.coords = newNode.coords.clone();\n newNode.coords.level = null;\n }\n\n return newNode;\n });\n\n itinerary.edges = [];\n networkNodes.forEach((node, idx, arr) => {\n if (idx === 0) {\n return;\n }\n\n // Retrieve network edge\n const prevNode = arr[idx - 1];\n const edge = getEdgeByNodes(prevNode.edges, prevNode, node);\n\n // Create itinerary edge\n const newEdge = new GraphEdge(\n itinerary.nodes[idx - 1],\n itinerary.nodes[idx],\n edge.level,\n edge.builtFrom\n );\n newEdge.isOneway = edge.isOneway;\n itinerary.edges.push(newEdge);\n });\n\n return itinerary;\n\n }\n}\n\nexport default GraphItinerary;\n","import Node from '../graph/GraphNode.js';\n\nclass NoRouteFoundError extends Error {\n\n constructor(start, end, details) {\n super();\n this.start = start;\n this.end = end;\n this.details = details;\n }\n\n get startStr() {\n if (this.start instanceof Node) {\n return `Node ${this.start.coords.toString()}`;\n }\n\n // if (this.start instanceof Coordinates) {\n return this.start.toString();\n }\n\n get endStr() {\n if (this.end instanceof Node) {\n return `Node ${this.end.coords.toString()}`;\n }\n\n // if (this.end instanceof Coordinates) {\n return this.end.toString();\n }\n\n get message() {\n let message = `No route found from ${this.startStr} to ${this.endStr}.`;\n if (this.details) {\n message += ` Details: ${this.details}`;\n }\n return message;\n }\n}\n\nexport default NoRouteFoundError;\n","import GraphEdge from '../graph/GraphEdge.js';\n\n/**\n * @template T\n */\nclass GraphRouterOptions {\n\n /** @type {number} in meters */\n projectionMaxDistance = 50;\n\n /** @type {function(GraphEdge<T>):boolean} */\n weightEdgeFn = edge => edge.length;\n\n /** @type {function(GraphEdge<T>):boolean} */\n acceptEdgeFn = () => true;\n\n}\n\nexport default GraphRouterOptions;\n","import Coordinates from '../coordinates/Coordinates.js';\n\nimport GraphEdge from '../graph/GraphEdge.js';\nimport Network from '../graph/Network.js';\nimport GraphNode from '../graph/GraphNode.js';\nimport MapMatching from '../graph/MapMatching.js';\n\nimport NoRouteFoundError from './NoRouteFoundError.js';\nimport GraphRouterOptions from './GraphRouterOptions.js';\nimport GraphItinerary from './GraphItinerary.js';\n\n/**\n * @template T\n * @abstract\n */\nclass GraphRouter {\n\n /** @type {!Network<T>} */\n _network;\n\n /**\n * @param {!Network<T>} network\n */\n constructor(network) {\n this._network = network;\n this._mapMatching = new MapMatching(network);\n }\n\n /**\n * @template T\n * @param {!GraphNode<T>|!Coordinates} start\n * @param {!GraphNode<T>|!Coordinates} end\n * @param {GraphRouterOptions} _options\n * @returns {GraphItinerary<T>}\n */\n getShortestPath(start, end, options = new GraphRouterOptions()) {\n\n if (!(start instanceof GraphNode) && !(start instanceof Coordinates)) {\n throw new Error('Unknown start type');\n }\n\n if (!(end instanceof GraphNode) && !(end instanceof Coordinates)) {\n throw new Error('Unknown end type');\n }\n\n const { acceptEdgeFn, weightEdgeFn, projectionMaxDistance } = options;\n this._mapMatching.maxDistance = projectionMaxDistance;\n\n const createdNodes = [];\n\n const retrieveOrCreateNearestNode = point => {\n if (point instanceof GraphNode) {\n return point;\n }\n\n const closeNode = this._network.getNodeByCoords(point);\n if (closeNode) {\n return closeNode;\n }\n\n const proj = this._mapMatching.getProjection(point, true, false, false, acceptEdgeFn);\n if (!proj) {\n throw new NoRouteFoundError(start, end,\n `Point ${point.toString()} is too far from the network `\n + `> ${this._mapMatching.maxDistance.toFixed(0)} meters`\n );\n }\n if (proj.nearestElement instanceof GraphNode) {\n return proj.nearestElement;\n }\n // if (proj.nearestElement instanceof Edge)\n const nodeCreated = this.createNodeInsideEdge(\n proj.nearestElement,\n proj.projection\n );\n createdNodes.push(nodeCreated);\n return nodeCreated;\n };\n\n const removeCreatedNodes = () => {\n while (createdNodes.length) {\n this.removeNodeFromPreviouslyCreatedEdge(createdNodes.pop());\n }\n };\n\n const startNode = retrieveOrCreateNearestNode(start);\n const endNode = retrieveOrCreateNearestNode(end);\n\n let graphItinerary;\n\n if (startNode === endNode) {\n graphItinerary = GraphItinerary.fromNetworkNodes([startNode], []);\n } else {\n graphItinerary = this.getShortestPathBetweenGraphNodes(\n startNode,\n endNode,\n acceptEdgeFn,\n weightEdgeFn\n );\n }\n\n graphItinerary.start = start instanceof GraphNode ? start.coords : start;\n graphItinerary.end = end instanceof GraphNode ? end.coords : end;\n\n removeCreatedNodes();\n\n if (!graphItinerary.nodes.length) {\n throw new NoRouteFoundError(start, end);\n }\n\n return graphItinerary;\n\n }\n\n /**\n * @param {GraphEdge<T>} edge\n * @param {Coordinates} point\n */\n createNodeInsideEdge(edge, point) {\n const a = edge.node1;\n const b = edge.node2;\n\n const m = new GraphNode(point);\n m.coords.level = edge.level;\n m.builtFrom = edge.builtFrom;\n\n const u = edge.clone();\n u.node1 = a;\n u.node2 = m;\n\n const v = edge.clone();\n v.node1 = m;\n v.node2 = b;\n\n a.edges = a.edges.filter(_edge => _edge !== edge);\n b.edges = b.edges.filter(_edge => _edge !== edge);\n\n this._network.nodes.push(m);\n this._network.edges.push(u, v);\n\n this._network.edges = this._network.edges.filter(\n _edge => _edge !== edge\n );\n\n return m;\n }\n\n /**\n * @param {GraphNode<T>} _node\n */\n removeNodeFromPreviouslyCreatedEdge(_node) {\n const u = _node.edges[0];\n const v = _node.edges[1];\n\n u.node1.edges = u.node1.edges.filter(edge => edge !== u);\n v.node1.edges = v.node1.edges.filter(edge => edge !== v);\n\n const oldEdge = u.clone();\n oldEdge.node1 = u.node1;\n oldEdge.node2 = v.node2;\n this._network.edges.push(oldEdge);\n\n this._network.nodes = this._network.nodes.filter(node => node !== _node);\n this._network.edges = this._network.edges.filter(\n edge => edge !== u && edge !== v\n );\n }\n\n getShortestPathBetweenGraphNodes(start, end, acceptEdgeFn, weightFn) {\n const distanceMap = {},\n checking = {},\n vertexList = {},\n vertexNodes = {},\n parentVertices = {},\n path = [];\n let vertexId = 1;\n\n // Initially, we assume each vertex is unreachable\n this._network.nodes.forEach(vertex => {\n\n // Generate Unique Router Id\n vertex.uniqueRouterId = vertexId;\n vertexNodes[vertexId] = vertex;\n\n distanceMap[vertexId] = Infinity;\n checking[vertexId] = null;\n vertexList[vertexId] = true;\n\n vertexId++;\n });\n\n // The cost from the starting vertex to the starting vertex is 0\n distanceMap[start.uniqueRouterId] = 0;\n\n // check each vertex\n while (Object.keys(vertexList).length > 0) {\n const current = Number(\n Object.keys(vertexList).reduce((_checking, vertex) => {\n return distanceMap[_checking] > distanceMap[vertex]\n ? vertex\n : _checking;\n }, Object.keys(vertexList)[0])\n );\n\n // all the vertices accessible from current vertex\n this._network.edges\n .filter(edge => {\n\n if (!acceptEdgeFn(edge)) {\n return false;\n }\n\n const from = edge.node1.uniqueRouterId,\n to = edge.node2.uniqueRouterId;\n // are these vertices joined?\n return from === current || to === current;\n })\n // for each vertex we can reach\n .forEach(edge => {\n let to, from, reversed = false;\n // determine the direction of travel\n if (edge.node1.uniqueRouterId === current) {\n to = edge.node2.uniqueRouterId;\n from = edge.node1.uniqueRouterId;\n } else {\n to = edge.node1.uniqueRouterId;\n from = edge.node2.uniqueRouterId;\n reversed = true;\n }\n\n if (edge.isOneway && reversed) {\n return;\n }\n\n // distance is how far we travelled to reach the\n // current vertex, plus cost of travel the next(to)\n const distance = distanceMap[current] + weightFn(edge);\n\n // if we have found a cheaper path\n // update the hash of costs\n // and record which vertex we came from\n if (distanceMap[to] > distance) {\n distanceMap[to] = distance;\n checking[to] = current;\n parentVertices[to] = from;\n }\n });\n\n // remove vertex so we don't revisit it\n delete vertexList[current];\n }\n\n const edgesWeights = [];\n\n // now we have the most efficient paths for all vertices\n // build the path for the user specified vertex(end)\n let endId = end.uniqueRouterId;\n while (parentVertices[endId]) {\n path.unshift(vertexNodes[endId]);\n edgesWeights.unshift(distanceMap[endId] - distanceMap[parentVertices[endId]]);\n endId = parentVertices[endId];\n }\n if (path.length !== 0) {\n path.unshift(start);\n }\n\n // Remove Unique Router Id\n this._network.nodes.forEach(vertex => {\n delete vertex.uniqueRouterId;\n });\n\n // This clone the itinerary and temporary nodes\n return GraphItinerary.fromNetworkNodes(path, edgesWeights);\n }\n}\nexport default GraphRouter;\n"],"names":["Node"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
"directory": "packages/geo"
|
|
13
13
|
},
|
|
14
14
|
"name": "@wemap/geo",
|
|
15
|
-
"version": "
|
|
15
|
+
"version": "7.0.0",
|
|
16
16
|
"bugs": {
|
|
17
17
|
"url": "https://github.com/wemap/wemap-modules-js/issues"
|
|
18
18
|
},
|
|
@@ -27,8 +27,8 @@
|
|
|
27
27
|
],
|
|
28
28
|
"license": "ISC",
|
|
29
29
|
"dependencies": {
|
|
30
|
-
"@wemap/logger": "^
|
|
31
|
-
"@wemap/maths": "^
|
|
30
|
+
"@wemap/logger": "^7.0.0",
|
|
31
|
+
"@wemap/maths": "^7.0.0"
|
|
32
32
|
},
|
|
33
|
-
"gitHead": "
|
|
33
|
+
"gitHead": "cfd70d1f998599c53689c1b1996a517247f04dce"
|
|
34
34
|
}
|
package/src/Utils.js
CHANGED
|
@@ -85,6 +85,10 @@ export function trimRoute(route, startPosition = route[0], length = Number.MAX_V
|
|
|
85
85
|
let currentPointIndex;
|
|
86
86
|
let cumulativeDistance = 0;
|
|
87
87
|
|
|
88
|
+
if (route.length <= 1) {
|
|
89
|
+
throw new Error('Route must have at least 2 points');
|
|
90
|
+
}
|
|
91
|
+
|
|
88
92
|
for (currentPointIndex = 1; currentPointIndex < route.length; currentPointIndex++) {
|
|
89
93
|
|
|
90
94
|
const p1 = route[currentPointIndex - 1];
|
package/src/Utils.spec.js
CHANGED
|
@@ -60,6 +60,8 @@ describe('Geo Utils', () => {
|
|
|
60
60
|
const route = [p1, p2, p3];
|
|
61
61
|
|
|
62
62
|
expect(() => trimRoute(route, new Coordinates(0, 0))).throw(Error);
|
|
63
|
+
expect(() => trimRoute([p1], p1)).throw(Error);
|
|
64
|
+
expect(() => trimRoute([], null)).throw(Error);
|
|
63
65
|
|
|
64
66
|
newRoute = trimRoute(route);
|
|
65
67
|
expect(newRoute.length).equals(3);
|