@wemap/geo 11.0.0 → 11.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +8 -1094
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +5 -1091
- package/dist/index.mjs.map +1 -1
- package/package.json +5 -4
- package/src/graph/GeoGraphRouter.spec.ts +25 -0
- package/src/graph/GeoGraphRouter.ts +4 -3
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/Constants.ts","../src/coordinates/Level.ts","../src/coordinates/Coordinates.ts","../src/coordinates/UserPosition.ts","../src/Utils.ts","../src/coordinates/BoundingBox.ts","../src/coordinates/RelativePosition.ts","../src/coordinates/GeoRelativePosition.ts","../src/coordinates/GeoRef.ts","../src/rotations/Attitude.ts","../src/rotations/AbsoluteHeading.ts","../../../node_modules/ua-parser-js/src/ua-parser.js","../../utils/dist/index.mjs","../src/graph/GeoGraphEdge.ts","../src/graph/GeoGraphVertex.ts","../src/graph/GeoGraph.ts","../src/graph/GeoGraphProjection.ts","../src/graph/GeoGraphProjectionHandler.ts","../src/graph/GeoGraphItinerary.ts","../src/graph/NoRouteFoundError.ts","../src/graph/GeoGraphRouter.ts"],"sourcesContent":["export const R_MAJOR = 6378137.0;\nexport const R_MINOR = 6356752.3142;\nexport const EARTH_GRAVITY = 9.80665;\n\n/**\n * latitude and longitude epsilon in degrees\n * 1e-8° correspond to ~1mm at latitude = 0\n */\nexport const EPS_DEG_MM = 1e-8;\n\n/**\n * epsilon in meters which corresponds to 1 millimeter\n */\nexport const EPS_MM = 1e-3;\n\n\nexport const ELLIPSOID_FLATNESS = (R_MAJOR - R_MINOR) / R_MAJOR;\n\nexport const ECCENTRICITY = Math.sqrt(ELLIPSOID_FLATNESS * (2 - ELLIPSOID_FLATNESS));\nexport const ECCENTRICITY_2 = ECCENTRICITY * ECCENTRICITY;\n\nexport const R_MAJOR_2 = R_MAJOR * R_MAJOR;\nexport const R_MAJOR_4 = R_MAJOR_2 * R_MAJOR_2;\nexport const R_MINOR_2 = R_MINOR * R_MINOR;\nexport const R_MINOR_4 = R_MINOR_2 * R_MINOR_2;\nexport const CIRCUMFERENCE = R_MAJOR * 2 * Math.PI;\n","import { Level_t } from \"../types\";\n\n/**\n * A Level is the representation of a building floor number\n * A level can be a simple number or a range (low, up)\n * The range is an array of two numbers\n */\nclass Level {\n\n static VERIFY_TYPING = false;\n\n static checkType(level: Level_t) {\n if (level === null) {\n return;\n }\n if (typeof level === 'number' && !isNaN(level)) {\n return;\n }\n if (Array.isArray(level) && level.length === 2) {\n const [low, up] = level;\n if (typeof low === 'number' && !isNaN(low)\n && typeof up === 'number' && !isNaN(up)) {\n if (low > up || low === up) {\n throw Error(`Invalid level range: [${low}, ${up}]`);\n }\n return;\n }\n }\n throw Error(`Unknown level format: ${level}`);\n }\n\n /**\n * Return true if the level is a range, false otherwise\n */\n static isRange(level: Level_t): level is [number, number] {\n if (Level.VERIFY_TYPING) {\n this.checkType(level);\n }\n return Array.isArray(level);\n }\n\n static clone(level: Level_t): Level_t {\n if (Level.VERIFY_TYPING) {\n this.checkType(level);\n }\n if (level === null) {\n return null;\n }\n if (typeof level === 'number') {\n return level;\n }\n\n return [level[0], level[1]];\n }\n\n /**\n * Create a level from a string (eg. 1, -2, 1;2, -2;3, 2;-1, 0.5;1 ...)\n */\n static fromString(str: string | null): Level_t {\n\n if (str === null) {\n return null;\n }\n\n if (typeof str !== 'string' || !str.length) {\n throw Error(`argument must be a non empty string, got ${typeof str}`);\n }\n\n if (!isNaN(Number(str))) {\n return parseFloat(str);\n }\n\n const splited = str.split(';');\n if (splited.length > 1) {\n const levels = splited.map(str => Number(str));\n const low = Math.min(...levels);\n const up = Math.max(...levels);\n this.checkType([low, up]);\n return [low, up];\n } else {\n const rangeSeparator = str.substring(1).indexOf('-') + 1;\n if (rangeSeparator > 0) {\n const low = Number(str.substring(0, rangeSeparator));\n const up = Number(str.substring(rangeSeparator + 1));\n this.checkType([low, up]);\n return [low, up];\n }\n }\n\n throw Error(`Cannot parse following level: ${str}`);\n }\n\n\n /**\n * Returns if a level is contained in another\n * @param {null|number|[number, number]} container The container level\n * @param {null|number|[number, number]} targeted The targeted level\n */\n static contains(container: Level_t, targeted: Level_t): boolean {\n if (Level.VERIFY_TYPING) {\n this.checkType(container);\n this.checkType(targeted);\n }\n\n // Covers null and number\n if (container === targeted) {\n return true;\n }\n\n if (Array.isArray(container)) {\n if (Array.isArray(targeted)) {\n return container[0] <= targeted[0] && container[1] >= targeted[1];\n }\n if (targeted === null) {\n return false;\n }\n return container[0] <= targeted && container[1] >= targeted;\n }\n if (container === null || targeted === null) {\n return false;\n }\n return container <= (targeted as [number, number])[0]\n && container >= (targeted as [number, number])[1];\n }\n\n /**\n * Retrieve the intersection of two levels\n */\n static intersection(first: Level_t, second: Level_t): Level_t {\n\n if (Level.VERIFY_TYPING) {\n this.checkType(first);\n this.checkType(second);\n }\n\n if (first === null || second === null) {\n return null;\n }\n\n if (this.equals(first, second)) {\n return this.clone(first);\n }\n\n if (typeof first === 'number' && typeof second === 'number') {\n return first === second ? first : null;\n }\n\n if (Array.isArray(first) && !Array.isArray(second)) {\n if (this.contains(first, second)) {\n return second;\n }\n return null;\n }\n if (!Array.isArray(first) && Array.isArray(second)) {\n if (this.contains(second, first)) {\n return first;\n }\n return null;\n }\n\n // There are two ranges\n const low = Math.max((first as [number, number])[0], (second as [number, number])[0]);\n const up = Math.min((first as [number, number])[1], (second as [number, number])[1]);\n if (up === low) {\n return up;\n }\n return up < low ? null : [low, up];\n }\n\n /**\n * Retrieve the intersection of two levels\n * @param {null|number|[number, number]} first The first level\n * @param {null|number|[number, number]} second The second level\n * @returns {boolean}\n */\n static intersect(first: Level_t, second: Level_t): boolean {\n\n if (Level.VERIFY_TYPING) {\n this.checkType(first);\n this.checkType(second);\n }\n\n if (first === null && second === null) {\n return true;\n }\n\n return this.intersection(first, second) !== null;\n }\n\n /**\n * Retrieve the union of two levels\n */\n static union(first: Level_t, second: Level_t): Level_t {\n\n if (Level.VERIFY_TYPING) {\n this.checkType(first);\n this.checkType(second);\n }\n\n if (first === second) {\n return this.clone(first);\n }\n\n if (second === null) {\n return this.clone(first);\n }\n\n if (first === null) {\n return this.clone(second);\n }\n\n let low, up;\n if (!Array.isArray(first) && !Array.isArray(second)) {\n low = Math.min(first, second);\n up = Math.max(first, second);\n } else if (Array.isArray(first) && !Array.isArray(second)) {\n low = Math.min(first[0], second);\n up = Math.max(first[1], second);\n } else if (!Array.isArray(first) && Array.isArray(second)) {\n low = Math.min(second[0], first);\n up = Math.max(second[1], first);\n } else {\n /* if (Array.isArray(first) && Array.isArray(second)) */\n low = Math.min((first as [number, number])[0], (second as [number, number])[0]);\n up = Math.max((first as [number, number])[1], (second as [number, number])[1]);\n }\n\n if (low === up) {\n return low;\n }\n return [low, up];\n }\n\n /**\n * Multiply a level by a factor\n * @param {null|number|[number, number]} level the level to multiply\n * @param {number} factor\n * @returns {null|number|[number, number]}\n */\n static multiplyBy(level: Level_t, factor: number): Level_t {\n if (Level.VERIFY_TYPING) {\n this.checkType(level);\n }\n\n if (level === null) {\n return null;\n }\n\n return Array.isArray(level) ? [level[0] * factor, level[1] * factor] : level * factor;\n }\n\n static toString(level: Level_t): string | null {\n if (Level.VERIFY_TYPING) {\n this.checkType(level);\n }\n if (level === null) {\n return null;\n }\n return Array.isArray(level) ? level[0] + ';' + level[1] : String(level);\n }\n\n static equals(first: Level_t, second: Level_t): boolean {\n\n if (Level.VERIFY_TYPING) {\n this.checkType(first);\n this.checkType(second);\n }\n\n if (first === second) {\n return true;\n }\n\n if (Array.isArray(first) && Array.isArray(second)) {\n return first[0] === second[0] && first[1] === second[1];\n }\n\n return false;\n }\n\n\n static diff(first: Level_t, second: Level_t): null | number {\n\n if (Level.VERIFY_TYPING) {\n this.checkType(first);\n this.checkType(second);\n }\n\n if (first === null || second === null) {\n return null;\n }\n\n if (!Array.isArray(first) && !Array.isArray(second)) {\n return second - first;\n }\n\n if (Array.isArray(first) && !Array.isArray(second)) {\n if (first[0] === second) {\n return second - first[1];\n }\n if (first[1] === second) {\n return second - first[0];\n }\n return null;\n }\n\n if (Array.isArray(second) && !Array.isArray(first)) {\n if (first === second[0]) {\n return second[1] - first;\n }\n if (first === second[1]) {\n return second[0] - first;\n }\n return null;\n }\n\n if (Level.equals(first, second)) {\n return 0;\n }\n\n return null;\n }\n}\n\nexport default Level;\n","import {\n deg2rad, Vector3, Quaternion, rad2deg, wrap, Vector3_t, Quaternion_t\n} from '@wemap/maths';\nimport { EPS_DEG_MM, EPS_MM, R_MAJOR } from '../Constants.js';\n\nimport { CoordinatesCompressedJson, CoordinatesJson, Level_t } from '../types.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 private _lat!: number;\n private _lng!: number;\n private _alt: number | null = null;\n private _level: Level_t | null = null;\n\n private _ecef: Vector3_t | null;\n\n autoWrap = true;\n\n constructor(lat: number, lng: number, alt: number | null = null, level: Level_t | null = null) {\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 set lat(lat: number) {\n if (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 get latitude() {\n return this._lat;\n }\n\n set latitude(_) {\n throw new Error('Please use Coordinates#lat setter instead of Coordinate#latitude');\n }\n\n get lng() {\n return this._lng;\n }\n\n set lng(lng) {\n this._lng = lng;\n if (this.autoWrap) {\n this.wrap();\n }\n this._ecef = null;\n }\n\n get longitude() {\n return this._lng;\n }\n\n set longitude(_) {\n throw new Error('Please use Coordinates#lng setter instead of Coordinate#longitude');\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 set alt(alt) {\n this._alt = alt;\n this._ecef = null;\n }\n\n get level() {\n return this._level;\n }\n\n set level(level) {\n Level.checkType(level);\n this._level = level;\n }\n\n /**\n * Deep clone coordinates\n */\n clone() {\n const output = new Coordinates(this.lat, this.lng, this.alt);\n if (this.level !== null) {\n output.level = Level.clone(this.level);\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 static equals(pos1: Coordinates | null, pos2: Coordinates | null, eps = EPS_DEG_MM, epsAlt = 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.equals(pos1.level, pos2.level);\n }\n\n equals(other: Coordinates) {\n return Coordinates.equals(this, other);\n }\n\n /**\n * @throws {Error} if elevation is defined and point altitude is not defined\n */\n destinationPoint(distance: number, bearing: number, elevation: number | null = null) {\n const newPoint = this.clone();\n newPoint.move(distance, bearing, elevation);\n return newPoint;\n }\n\n /**\n * Source: http://www.movable-type.co.uk/scripts/latlong.html#destPoint\n * @throws {Error} if elevation is defined and point altitude is not defined\n */\n move(distance: number, bearing: number, elevation: number | null = null) {\n\n const dR = distance / 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 (elevation !== null) {\n if (this.alt === null) {\n throw new Error('Point altitude is not defined');\n }\n this.alt += elevation;\n }\n\n return this;\n }\n\n /**\n * Returns a distance between two points in meters\n */\n distanceTo(location2: Coordinates) {\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 R_MAJOR * cosn;\n }\n\n static distanceBetween(point1: Coordinates, point2: Coordinates) {\n return point1.distanceTo(point2);\n }\n\n bearingTo(location2: Coordinates) {\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: Coordinates, point2: Coordinates) {\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(): Quaternion_t {\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(): Quaternion_t {\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 /**\n * https://gist.github.com/klucar/1536194\n * Adapted for spherical formula\n */\n get ecef(): Vector3_t {\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 = (R_MAJOR + alt) * Math.cos(lat) * Math.cos(lng);\n const y = (R_MAJOR + alt) * Math.cos(lat) * Math.sin(lng);\n const z = (R_MAJOR + alt) * Math.sin(lat);\n\n this._ecef = [x, y, z];\n }\n\n return this._ecef;\n }\n\n\n static fromECEF(ecef: Vector3_t): Coordinates {\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) - 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 /**\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 */\n getSegmentProjection(p1: Coordinates, p2: Coordinates): Coordinates | null {\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, 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.intersection(p1.level, p2.level));\n\n if (Math.abs((p1.distanceTo(p2) - p1.distanceTo(projection) - p2.distanceTo(projection))) > 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 += ', [' + Level.toString(this._level) + ']';\n }\n str += ']';\n return str;\n }\n\n toJson(): CoordinatesJson {\n return {\n lat: Number(this.lat.toFixed(8)),\n lng: Number(this.lng.toFixed(8)),\n ...(this.alt !== null && { alt: Number(this.alt.toFixed(3)) }),\n ...(this.level !== null && { level: this.level })\n };\n }\n\n static fromJson(json: CoordinatesJson) {\n return new Coordinates(json.lat, json.lng, json.alt, json.level);\n }\n\n\n toCompressedJson(): CoordinatesCompressedJson {\n if (this.level !== null) {\n return [\n Number(this.lat.toFixed(8)),\n Number(this.lng.toFixed(8)),\n this.alt === null ? null : Number(this.alt.toFixed(3)),\n this.level\n ];\n }\n if (this.alt !== null) {\n return [\n Number(this.lat.toFixed(8)),\n Number(this.lng.toFixed(8)),\n Number(this.alt.toFixed(3))\n ];\n }\n return [Number(this.lat.toFixed(8)), Number(this.lng.toFixed(8))];\n }\n\n static fromCompressedJson(json: CoordinatesCompressedJson) {\n const coords = new Coordinates(json[0], json[1]);\n if (json.length > 2) {\n coords.alt = json[2] as null | number;\n }\n if (json.length > 3) {\n coords.level = json[3] as number | [number, number];\n }\n return coords;\n }\n}\n\nexport default Coordinates;\n","import Coordinates from './Coordinates.js';\nimport { Level_t, UserPositionJson } from '../types.js';\nimport { EPS_DEG_MM, EPS_MM } 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 private _time: number | null = null;\n private _accuracy: number | null = null;\n private _bearing: number | null = null;\n\n constructor(\n lat: number, lng: number, alt: number | null = null, level: Level_t = null,\n time: number | null = null, accuracy: number | null = null, bearing: number | null = null\n ) {\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 this._time = time;\n }\n\n\n get accuracy() {\n return this._accuracy;\n }\n\n set accuracy(accuracy) {\n if (accuracy !== null && accuracy < 0) {\n throw new Error('accuracy argument is not a positive number');\n }\n this._accuracy = accuracy;\n }\n\n get bearing() {\n return this._bearing;\n }\n\n set bearing(bearing) {\n this._bearing = bearing !== null ? bearing % (2 * Math.PI) : null;\n }\n\n move(distance: number, bearing: number, elevation: number | null = null) {\n super.move(distance, bearing, elevation);\n return this;\n }\n\n destinationPoint(distance: number, bearing: number, elevation: number | null = null) {\n const newPoint = this.clone();\n newPoint.move(distance, bearing, elevation);\n return newPoint;\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: 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 static equals(pos1: UserPosition | Coordinates | null,\n pos2: UserPosition | Coordinates | null,\n eps = EPS_DEG_MM, epsAlt = EPS_MM\n ) {\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.equals(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 equals(other: UserPosition | Coordinates | null, eps = EPS_DEG_MM, epsAlt = EPS_MM) {\n return UserPosition.equals(this, other, eps, epsAlt);\n }\n\n\n toJson(): UserPositionJson {\n return {\n ...super.toJson(),\n ...(this.time !== null && { time: this.time }),\n ...(this.accuracy !== null && { accuracy: this.accuracy }),\n ...(this.bearing !== null && { bearing: this.bearing })\n };\n }\n\n static fromJson(json: UserPositionJson) {\n const position = UserPosition.fromCoordinates(Coordinates.fromJson(json));\n if (typeof json.time !== 'undefined') {\n position.time = json.time;\n }\n if (typeof json.accuracy !== 'undefined') {\n position.accuracy = json.accuracy;\n }\n if (typeof json.bearing !== 'undefined') {\n position.bearing = json.bearing;\n }\n return position;\n }\n}\n\nexport default UserPosition;\n","/* eslint-disable max-statements */\n\nimport { deg2rad, positiveMod } from '@wemap/maths';\nimport { EPS_MM } from './Constants.js';\n\nimport Coordinates from './coordinates/Coordinates.js';\nimport UserPosition from './coordinates/UserPosition.js';\n\nexport type RouteSample = Coordinates & { bearing: number };\n\n/**\n * Sample a route of Coordinates\n * @param route ordered points\n * @param stepSize step size to sample\n * @param maxLength max route length to sample\n */\nexport function sampleRoute(\n route: Coordinates[],\n stepSize = 0.7,\n startSampling = 0,\n length = Number.MAX_VALUE\n) {\n\n const endSampling = startSampling + length;\n\n const sampledRoute = [];\n\n let lastSample: RouteSample;\n\n let totalDistanceTraveled = 0;\n let distanceToNextSample = 0;\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 = Object.assign(p1.clone(), { bearing: segmentBearing });\n while (distanceTraveledOnSegment + distanceToNextSample < segmentSize\n && totalDistanceTraveled + distanceToNextSample <= endSampling) {\n\n const newPoint = lastSample.destinationPoint(distanceToNextSample, segmentBearing) as RouteSample;\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: Coordinates[], startPosition = route[0], length = Number.MAX_VALUE) {\n\n const newRoute = [];\n let previousPoint: Coordinates | null = null;\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.equals(startPosition, p1)) {\n newRoute.push(p1);\n previousPoint = p1;\n break;\n }\n\n const proj = startPosition.getSegmentProjection(p1, p2);\n if (proj && Coordinates.equals(startPosition, proj) && !proj.equals(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 (previousPoint && 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) <= 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\nexport function simplifyRoute(coords: Coordinates[], precisionAngle = deg2rad(5)) {\n\n const isClosed = (coords[0].equals(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\nexport function geolocationPositionToUserPosition(geolocationPosition: 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\nexport function calcDistance(coords: Coordinates[]) {\n return coords.reduce((acc, coords, idx, arr) =>\n acc + (idx ? arr[idx - 1].distanceTo(coords) : 0), 0);\n}\n","import Coordinates from './Coordinates.js';\n\nclass BoundingBox {\n\n northEast: Coordinates;\n southWest: Coordinates;\n\n constructor(northEast: Coordinates, southWest: Coordinates) {\n this.northEast = northEast;\n this.southWest = southWest;\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 get center(): Coordinates {\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 contains(point: Coordinates): boolean {\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 extend(obj: Coordinates | BoundingBox): BoundingBox {\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 } else {\n throw new Error('Unknown parameter');\n }\n\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 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 */\n extendsWithMeasure(measure: number): BoundingBox {\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 */\n pad(bufferRatio: number): BoundingBox {\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 getSouthWest() {\n return this.southWest;\n }\n\n /**\n * Returns 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 getNorthWest() {\n return new Coordinates(this.getNorth(), this.getWest());\n }\n\n /**\n * Returns 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 getWest() {\n return this.southWest.lng;\n }\n\n /**\n * Returns 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 getEast() {\n return this.northEast.lng;\n }\n\n /**\n * Returns the north edge of the bounding box.\n */\n getNorth() {\n return this.northEast.lat;\n }\n\n static equals(bb1: BoundingBox, bb2: BoundingBox) {\n return Coordinates.equals(bb1.northEast, bb2.northEast)\n && Coordinates.equals(bb1.southWest, bb2.southWest);\n }\n\n equals(other: BoundingBox) {\n return BoundingBox.equals(this, other);\n }\n\n /**\n * Create a BoundingBox from a WSEN array\n */\n static fromArray(bounds: [number, number, number, number]) {\n return new BoundingBox(\n new Coordinates(bounds[3], bounds[2]),\n new Coordinates(bounds[1], bounds[0])\n );\n }\n\n static fromCoordinates(coords: Coordinates[]) {\n if (coords.length === 0) {\n return null;\n }\n return coords.reduce(\n (acc, _coords) => acc.extend(_coords),\n new BoundingBox(coords[0], coords[0])\n );\n }\n\n /**\n * Returns the WSEN array\n */\n toArray(): [number, number, number, number] {\n return [this.getWest(), this.getSouth(), this.getEast(), this.getNorth()];\n }\n}\n\nexport default BoundingBox;\n","import { EPS_MM } from '../Constants.js';\nimport { RelativePositionJson } from '../types.js';\n\nclass RelativePosition {\n\n x: number;\n y: number;\n z: number;\n time: number | null = null;\n private _accuracy: number | null = null;\n private _bearing: number | null = null;\n\n constructor(\n x: number, y: number, z: number,\n time: number | null = null, accuracy: number | null = null, bearing: number | null = null\n ) {\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 accuracy() {\n return this._accuracy;\n }\n\n set accuracy(accuracy) {\n if (accuracy !== null && accuracy < 0) {\n throw new Error('accuracy argument is not a positive number');\n }\n this._accuracy = accuracy;\n }\n\n get bearing() {\n return this._bearing;\n }\n\n set bearing(bearing) {\n this._bearing = bearing !== null ? bearing % (2 * Math.PI) : null;\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 equals(pos1: RelativePosition | null, pos2: RelativePosition | null, eps = 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 equals(other: RelativePosition) {\n return RelativePosition.equals(this, other);\n }\n\n toJson(): RelativePositionJson {\n return {\n x: this.x,\n y: this.y,\n z: this.z,\n ...(this.time !== null && { time: this.time }),\n ...(this.accuracy !== null && { accuracy: this.accuracy }),\n ...(this.bearing !== null && { bearing: this.bearing })\n };\n }\n\n static fromJson(json: RelativePositionJson) {\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 { Quaternion, Vector3, Vector3_t } from '@wemap/maths';\nimport { GeoRefJson } from '../types.js';\n\nimport Coordinates from './Coordinates.js';\n\nclass GeoRef {\n\n origin: Coordinates;\n scale = 1;\n heading = 0;\n\n constructor(origin: Coordinates) {\n this.origin = origin;\n }\n\n /**\n * LocalPosition in ENU frame\n */\n localToWorld(localPosition: Vector3_t) {\n const enuTranslationScaled = Vector3.multiplyScalar(localPosition, this.scale);\n const rotationOffset = Quaternion.fromAxisAngle([0, 0, 1], this.heading);\n const enuToEcefRotationOrigin = Quaternion.multiply(rotationOffset, this.origin.enuToEcefRotation);\n const ecefTranslation = Quaternion.rotate(enuToEcefRotationOrigin, enuTranslationScaled);\n const ecef = Vector3.sum(this.origin.ecef, ecefTranslation);\n return Coordinates.fromECEF(ecef);\n }\n\n /**\n * LocalPosition in ENU frame\n */\n worldToLocal(coords: Coordinates) {\n const rotationOffset = Quaternion.fromAxisAngle([0, 0, 1], -this.heading);\n const ecefToEnuRotationOrigin = Quaternion.multiply(this.origin.ecefToEnuRotation, rotationOffset);\n const ecefTranslation = Vector3.subtract(coords.ecef, this.origin.ecef);\n const ecefTranslationScaled = Vector3.multiplyScalar(ecefTranslation, 1 / this.scale);\n return Quaternion.rotate(ecefToEnuRotationOrigin, ecefTranslationScaled);\n }\n\n toJson(): GeoRefJson {\n return {\n origin: this.origin.toJson(),\n ...(this.scale !== 1 && { scale: this.scale }),\n ...(this.heading !== 0 && { heading: this.heading })\n };\n }\n\n static fromJson(json: GeoRefJson) {\n const geoRef = new GeoRef(Coordinates.fromJson(json.origin));\n geoRef.scale = typeof json.scale !== 'undefined' ? json.scale : 1;\n geoRef.heading = typeof json.heading !== 'undefined' ? json.heading : 0;\n return geoRef;\n }\n}\n\nexport default GeoRef;\n","import {\n Rotations, Quaternion, rad2deg, deg2rad,\n Quaternion_t, EulerAngles_t, EulerAnglesDegrees_t\n} from '@wemap/maths';\nimport { AttitudeJson } from '../types';\n\nclass Attitude {\n\n _quaternion: Quaternion_t = [1, 0, 0, 0];\n _heading: number | null = null;\n _eulerAngles: EulerAngles_t | null = null;\n _time: number | null = null;\n _accuracy: number | null = null;\n\n constructor(quaternion: Quaternion_t,\n time: number | null = null,\n accuracy: number | null = null\n ) {\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 get quaternion() {\n return this._quaternion;\n }\n\n set quaternion(quaternion) {\n if (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 get time() {\n return this._time;\n }\n\n set time(time) {\n this._time = time;\n }\n\n\n get accuracy() {\n return this._accuracy;\n }\n\n set accuracy(accuracy) {\n if (accuracy !== null && (accuracy < 0 || accuracy > Math.PI)) {\n throw new Error('accuracy argument (' + accuracy + ') is not in range [0; PI]');\n }\n this._accuracy = accuracy;\n }\n\n get eulerAngles(): EulerAngles_t {\n if (this._eulerAngles === null) {\n this._eulerAngles = Rotations.quaternionToEulerZXY(this.quaternion);\n }\n return this._eulerAngles;\n }\n\n get eulerAnglesDegrees(): EulerAnglesDegrees_t {\n return this.eulerAngles.map(x => rad2deg(x)) as EulerAnglesDegrees_t;\n }\n\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 get headingDegrees() {\n return rad2deg(this.heading);\n }\n\n\n static equals(att1: Attitude | null, att2: Attitude | null) {\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.equals(att1.quaternion, att2.quaternion);\n }\n\n equals(other: Attitude) {\n return Attitude.equals(this, other);\n }\n\n toJson(): AttitudeJson {\n if (this.time === null && this.accuracy === null) {\n return this.quaternion;\n }\n return {\n q: this.quaternion,\n ...(this.time !== null && { time: this.time }),\n ...(this.accuracy !== null && { accuracy: this.accuracy })\n };\n }\n\n\n static fromJson(json: AttitudeJson) {\n if (Array.isArray(json)) {\n return new Attitude(json, null, null);\n }\n return new Attitude(json.q, json.time, json.accuracy);\n }\n\n\n clone() {\n return new Attitude(this.quaternion.slice(0) as Quaternion_t, this.time, this.accuracy);\n }\n\n /**\n * Calculate the relative attitude between two given attitudes\n */\n static diff(attitudeStart: Attitude, attitudeEnd: Attitude) {\n\n const quaternionDiff = Quaternion.multiply(\n Quaternion.inverse(attitudeStart.quaternion),\n attitudeEnd.quaternion\n );\n\n let timeDiff = null;\n if (attitudeEnd.time !== null && attitudeStart.time !== null) {\n timeDiff = attitudeEnd.time - attitudeStart.time;\n }\n\n let accuracyDiff = null;\n if (attitudeStart.accuracy !== null && attitudeEnd.accuracy !== null) {\n // Approximation\n accuracyDiff = Math.max(attitudeEnd.accuracy - attitudeStart.accuracy);\n }\n\n return new Attitude(quaternionDiff, timeDiff, accuracyDiff);\n }\n}\n\nexport default Attitude;\n","import { Quaternion } from '@wemap/maths';\nimport { AbsoluteHeadingJson } from '../types.js';\n\nimport Attitude from './Attitude.js';\n\nclass AbsoluteHeading {\n\n heading: number;\n time: number | null = null;\n private _accuracy: number | null = null;\n\n constructor(heading: number,\n time: number | null = null,\n accuracy: number | null = null\n ) {\n this.heading = heading;\n this.time = time;\n this.accuracy = accuracy;\n }\n\n\n get accuracy() {\n return this._accuracy;\n }\n\n set accuracy(accuracy) {\n if (accuracy !== null && (accuracy < 0 || accuracy > Math.PI)) {\n throw new Error('accuracy argument (' + accuracy + ') is not in range [0; PI]');\n }\n this._accuracy = accuracy;\n }\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 equals(heading1: AbsoluteHeading | null, heading2: AbsoluteHeading | null) {\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 equals(other: AbsoluteHeading | null) {\n return AbsoluteHeading.equals(this, other);\n }\n\n toJson(): AbsoluteHeadingJson {\n return {\n heading: this.heading,\n ...(this.time !== null && { time: this.time }),\n ...(this.accuracy !== null && { accuracy: this.accuracy })\n };\n }\n\n static fromJson(json: AbsoluteHeadingJson) {\n return new AbsoluteHeading(json.heading, json.time, json.accuracy);\n }\n\n clone() {\n return new AbsoluteHeading(this.heading, this.time, this.accuracy);\n }\n}\n\nexport default AbsoluteHeading;\n","/////////////////////////////////////////////////////////////////////////////////\n/* UAParser.js v1.0.33\n Copyright © 2012-2021 Faisal Salman <f@faisalman.com>\n MIT License *//*\n Detect Browser, Engine, OS, CPU, and Device type/model from User-Agent data.\n Supports browser & node.js environment. \n Demo : https://faisalman.github.io/ua-parser-js\n Source : https://github.com/faisalman/ua-parser-js */\n/////////////////////////////////////////////////////////////////////////////////\n\n(function (window, undefined) {\n\n 'use strict';\n\n //////////////\n // Constants\n /////////////\n\n\n var LIBVERSION = '1.0.33',\n EMPTY = '',\n UNKNOWN = '?',\n FUNC_TYPE = 'function',\n UNDEF_TYPE = 'undefined',\n OBJ_TYPE = 'object',\n STR_TYPE = 'string',\n MAJOR = 'major',\n MODEL = 'model',\n NAME = 'name',\n TYPE = 'type',\n VENDOR = 'vendor',\n VERSION = 'version',\n ARCHITECTURE= 'architecture',\n CONSOLE = 'console',\n MOBILE = 'mobile',\n TABLET = 'tablet',\n SMARTTV = 'smarttv',\n WEARABLE = 'wearable',\n EMBEDDED = 'embedded',\n UA_MAX_LENGTH = 350;\n\n var AMAZON = 'Amazon',\n APPLE = 'Apple',\n ASUS = 'ASUS',\n BLACKBERRY = 'BlackBerry',\n BROWSER = 'Browser',\n CHROME = 'Chrome',\n EDGE = 'Edge',\n FIREFOX = 'Firefox',\n GOOGLE = 'Google',\n HUAWEI = 'Huawei',\n LG = 'LG',\n MICROSOFT = 'Microsoft',\n MOTOROLA = 'Motorola',\n OPERA = 'Opera',\n SAMSUNG = 'Samsung',\n SHARP = 'Sharp',\n SONY = 'Sony',\n XIAOMI = 'Xiaomi',\n ZEBRA = 'Zebra',\n FACEBOOK = 'Facebook';\n\n ///////////\n // Helper\n //////////\n\n var extend = function (regexes, extensions) {\n var mergedRegexes = {};\n for (var i in regexes) {\n if (extensions[i] && extensions[i].length % 2 === 0) {\n mergedRegexes[i] = extensions[i].concat(regexes[i]);\n } else {\n mergedRegexes[i] = regexes[i];\n }\n }\n return mergedRegexes;\n },\n enumerize = function (arr) {\n var enums = {};\n for (var i=0; i<arr.length; i++) {\n enums[arr[i].toUpperCase()] = arr[i];\n }\n return enums;\n },\n has = function (str1, str2) {\n return typeof str1 === STR_TYPE ? lowerize(str2).indexOf(lowerize(str1)) !== -1 : false;\n },\n lowerize = function (str) {\n return str.toLowerCase();\n },\n majorize = function (version) {\n return typeof(version) === STR_TYPE ? version.replace(/[^\\d\\.]/g, EMPTY).split('.')[0] : undefined;\n },\n trim = function (str, len) {\n if (typeof(str) === STR_TYPE) {\n str = str.replace(/^\\s\\s*/, EMPTY);\n return typeof(len) === UNDEF_TYPE ? str : str.substring(0, UA_MAX_LENGTH);\n }\n };\n\n ///////////////\n // Map helper\n //////////////\n\n var rgxMapper = function (ua, arrays) {\n\n var i = 0, j, k, p, q, matches, match;\n\n // loop through all regexes maps\n while (i < arrays.length && !matches) {\n\n var regex = arrays[i], // even sequence (0,2,4,..)\n props = arrays[i + 1]; // odd sequence (1,3,5,..)\n j = k = 0;\n\n // try matching uastring with regexes\n while (j < regex.length && !matches) {\n\n matches = regex[j++].exec(ua);\n\n if (!!matches) {\n for (p = 0; p < props.length; p++) {\n match = matches[++k];\n q = props[p];\n // check if given property is actually array\n if (typeof q === OBJ_TYPE && q.length > 0) {\n if (q.length === 2) {\n if (typeof q[1] == FUNC_TYPE) {\n // assign modified match\n this[q[0]] = q[1].call(this, match);\n } else {\n // assign given value, ignore regex match\n this[q[0]] = q[1];\n }\n } else if (q.length === 3) {\n // check whether function or regex\n if (typeof q[1] === FUNC_TYPE && !(q[1].exec && q[1].test)) {\n // call function (usually string mapper)\n this[q[0]] = match ? q[1].call(this, match, q[2]) : undefined;\n } else {\n // sanitize match using given regex\n this[q[0]] = match ? match.replace(q[1], q[2]) : undefined;\n }\n } else if (q.length === 4) {\n this[q[0]] = match ? q[3].call(this, match.replace(q[1], q[2])) : undefined;\n }\n } else {\n this[q] = match ? match : undefined;\n }\n }\n }\n }\n i += 2;\n }\n },\n\n strMapper = function (str, map) {\n\n for (var i in map) {\n // check if current value is array\n if (typeof map[i] === OBJ_TYPE && map[i].length > 0) {\n for (var j = 0; j < map[i].length; j++) {\n if (has(map[i][j], str)) {\n return (i === UNKNOWN) ? undefined : i;\n }\n }\n } else if (has(map[i], str)) {\n return (i === UNKNOWN) ? undefined : i;\n }\n }\n return str;\n };\n\n ///////////////\n // String map\n //////////////\n\n // Safari < 3.0\n var oldSafariMap = {\n '1.0' : '/8',\n '1.2' : '/1',\n '1.3' : '/3',\n '2.0' : '/412',\n '2.0.2' : '/416',\n '2.0.3' : '/417',\n '2.0.4' : '/419',\n '?' : '/'\n },\n windowsVersionMap = {\n 'ME' : '4.90',\n 'NT 3.11' : 'NT3.51',\n 'NT 4.0' : 'NT4.0',\n '2000' : 'NT 5.0',\n 'XP' : ['NT 5.1', 'NT 5.2'],\n 'Vista' : 'NT 6.0',\n '7' : 'NT 6.1',\n '8' : 'NT 6.2',\n '8.1' : 'NT 6.3',\n '10' : ['NT 6.4', 'NT 10.0'],\n 'RT' : 'ARM'\n };\n\n //////////////\n // Regex map\n /////////////\n\n var regexes = {\n\n browser : [[\n\n /\\b(?:crmo|crios)\\/([\\w\\.]+)/i // Chrome for Android/iOS\n ], [VERSION, [NAME, 'Chrome']], [\n /edg(?:e|ios|a)?\\/([\\w\\.]+)/i // Microsoft Edge\n ], [VERSION, [NAME, 'Edge']], [\n\n // Presto based\n /(opera mini)\\/([-\\w\\.]+)/i, // Opera Mini\n /(opera [mobiletab]{3,6})\\b.+version\\/([-\\w\\.]+)/i, // Opera Mobi/Tablet\n /(opera)(?:.+version\\/|[\\/ ]+)([\\w\\.]+)/i // Opera\n ], [NAME, VERSION], [\n /opios[\\/ ]+([\\w\\.]+)/i // Opera mini on iphone >= 8.0\n ], [VERSION, [NAME, OPERA+' Mini']], [\n /\\bopr\\/([\\w\\.]+)/i // Opera Webkit\n ], [VERSION, [NAME, OPERA]], [\n\n // Mixed\n /(kindle)\\/([\\w\\.]+)/i, // Kindle\n /(lunascape|maxthon|netfront|jasmine|blazer)[\\/ ]?([\\w\\.]*)/i, // Lunascape/Maxthon/Netfront/Jasmine/Blazer\n // Trident based\n /(avant |iemobile|slim)(?:browser)?[\\/ ]?([\\w\\.]*)/i, // Avant/IEMobile/SlimBrowser\n /(ba?idubrowser)[\\/ ]?([\\w\\.]+)/i, // Baidu Browser\n /(?:ms|\\()(ie) ([\\w\\.]+)/i, // Internet Explorer\n\n // Webkit/KHTML based // Flock/RockMelt/Midori/Epiphany/Silk/Skyfire/Bolt/Iron/Iridium/PhantomJS/Bowser/QupZilla/Falkon\n /(flock|rockmelt|midori|epiphany|silk|skyfire|ovibrowser|bolt|iron|vivaldi|iridium|phantomjs|bowser|quark|qupzilla|falkon|rekonq|puffin|brave|whale|qqbrowserlite|qq|duckduckgo)\\/([-\\w\\.]+)/i,\n // Rekonq/Puffin/Brave/Whale/QQBrowserLite/QQ, aka ShouQ\n /(weibo)__([\\d\\.]+)/i // Weibo\n ], [NAME, VERSION], [\n /(?:\\buc? ?browser|(?:juc.+)ucweb)[\\/ ]?([\\w\\.]+)/i // UCBrowser\n ], [VERSION, [NAME, 'UC'+BROWSER]], [\n /microm.+\\bqbcore\\/([\\w\\.]+)/i, // WeChat Desktop for Windows Built-in Browser\n /\\bqbcore\\/([\\w\\.]+).+microm/i\n ], [VERSION, [NAME, 'WeChat(Win) Desktop']], [\n /micromessenger\\/([\\w\\.]+)/i // WeChat\n ], [VERSION, [NAME, 'WeChat']], [\n /konqueror\\/([\\w\\.]+)/i // Konqueror\n ], [VERSION, [NAME, 'Konqueror']], [\n /trident.+rv[: ]([\\w\\.]{1,9})\\b.+like gecko/i // IE11\n ], [VERSION, [NAME, 'IE']], [\n /yabrowser\\/([\\w\\.]+)/i // Yandex\n ], [VERSION, [NAME, 'Yandex']], [\n /(avast|avg)\\/([\\w\\.]+)/i // Avast/AVG Secure Browser\n ], [[NAME, /(.+)/, '$1 Secure '+BROWSER], VERSION], [\n /\\bfocus\\/([\\w\\.]+)/i // Firefox Focus\n ], [VERSION, [NAME, FIREFOX+' Focus']], [\n /\\bopt\\/([\\w\\.]+)/i // Opera Touch\n ], [VERSION, [NAME, OPERA+' Touch']], [\n /coc_coc\\w+\\/([\\w\\.]+)/i // Coc Coc Browser\n ], [VERSION, [NAME, 'Coc Coc']], [\n /dolfin\\/([\\w\\.]+)/i // Dolphin\n ], [VERSION, [NAME, 'Dolphin']], [\n /coast\\/([\\w\\.]+)/i // Opera Coast\n ], [VERSION, [NAME, OPERA+' Coast']], [\n /miuibrowser\\/([\\w\\.]+)/i // MIUI Browser\n ], [VERSION, [NAME, 'MIUI '+BROWSER]], [\n /fxios\\/([-\\w\\.]+)/i // Firefox for iOS\n ], [VERSION, [NAME, FIREFOX]], [\n /\\bqihu|(qi?ho?o?|360)browser/i // 360\n ], [[NAME, '360 '+BROWSER]], [\n /(oculus|samsung|sailfish|huawei)browser\\/([\\w\\.]+)/i\n ], [[NAME, /(.+)/, '$1 '+BROWSER], VERSION], [ // Oculus/Samsung/Sailfish/Huawei Browser\n /(comodo_dragon)\\/([\\w\\.]+)/i // Comodo Dragon\n ], [[NAME, /_/g, ' '], VERSION], [\n /(electron)\\/([\\w\\.]+) safari/i, // Electron-based App\n /(tesla)(?: qtcarbrowser|\\/(20\\d\\d\\.[-\\w\\.]+))/i, // Tesla\n /m?(qqbrowser|baiduboxapp|2345Explorer)[\\/ ]?([\\w\\.]+)/i // QQBrowser/Baidu App/2345 Browser\n ], [NAME, VERSION], [\n /(metasr)[\\/ ]?([\\w\\.]+)/i, // SouGouBrowser\n /(lbbrowser)/i, // LieBao Browser\n /\\[(linkedin)app\\]/i // LinkedIn App for iOS & Android\n ], [NAME], [\n\n // WebView\n /((?:fban\\/fbios|fb_iab\\/fb4a)(?!.+fbav)|;fbav\\/([\\w\\.]+);)/i // Facebook App for iOS & Android\n ], [[NAME, FACEBOOK], VERSION], [\n /safari (line)\\/([\\w\\.]+)/i, // Line App for iOS\n /\\b(line)\\/([\\w\\.]+)\\/iab/i, // Line App for Android\n /(chromium|instagram)[\\/ ]([-\\w\\.]+)/i // Chromium/Instagram\n ], [NAME, VERSION], [\n /\\bgsa\\/([\\w\\.]+) .*safari\\//i // Google Search Appliance on iOS\n ], [VERSION, [NAME, 'GSA']], [\n\n /headlesschrome(?:\\/([\\w\\.]+)| )/i // Chrome Headless\n ], [VERSION, [NAME, CHROME+' Headless']], [\n\n / wv\\).+(chrome)\\/([\\w\\.]+)/i // Chrome WebView\n ], [[NAME, CHROME+' WebView'], VERSION], [\n\n /droid.+ version\\/([\\w\\.]+)\\b.+(?:mobile safari|safari)/i // Android Browser\n ], [VERSION, [NAME, 'Android '+BROWSER]], [\n\n /(chrome|omniweb|arora|[tizenoka]{5} ?browser)\\/v?([\\w\\.]+)/i // Chrome/OmniWeb/Arora/Tizen/Nokia\n ], [NAME, VERSION], [\n\n /version\\/([\\w\\.\\,]+) .*mobile\\/\\w+ (safari)/i // Mobile Safari\n ], [VERSION, [NAME, 'Mobile Safari']], [\n /version\\/([\\w(\\.|\\,)]+) .*(mobile ?safari|safari)/i // Safari & Safari Mobile\n ], [VERSION, NAME], [\n /webkit.+?(mobile ?safari|safari)(\\/[\\w\\.]+)/i // Safari < 3.0\n ], [NAME, [VERSION, strMapper, oldSafariMap]], [\n\n /(webkit|khtml)\\/([\\w\\.]+)/i\n ], [NAME, VERSION], [\n\n // Gecko based\n /(navigator|netscape\\d?)\\/([-\\w\\.]+)/i // Netscape\n ], [[NAME, 'Netscape'], VERSION], [\n /mobile vr; rv:([\\w\\.]+)\\).+firefox/i // Firefox Reality\n ], [VERSION, [NAME, FIREFOX+' Reality']], [\n /ekiohf.+(flow)\\/([\\w\\.]+)/i, // Flow\n /(swiftfox)/i, // Swiftfox\n /(icedragon|iceweasel|camino|chimera|fennec|maemo browser|minimo|conkeror|klar)[\\/ ]?([\\w\\.\\+]+)/i,\n // IceDragon/Iceweasel/Camino/Chimera/Fennec/Maemo/Minimo/Conkeror/Klar\n /(seamonkey|k-meleon|icecat|iceape|firebird|phoenix|palemoon|basilisk|waterfox)\\/([-\\w\\.]+)$/i,\n // Firefox/SeaMonkey/K-Meleon/IceCat/IceApe/Firebird/Phoenix\n /(firefox)\\/([\\w\\.]+)/i, // Other Firefox-based\n /(mozilla)\\/([\\w\\.]+) .+rv\\:.+gecko\\/\\d+/i, // Mozilla\n\n // Other\n /(polaris|lynx|dillo|icab|doris|amaya|w3m|netsurf|sleipnir|obigo|mosaic|(?:go|ice|up)[\\. ]?browser)[-\\/ ]?v?([\\w\\.]+)/i,\n // Polaris/Lynx/Dillo/iCab/Doris/Amaya/w3m/NetSurf/Sleipnir/Obigo/Mosaic/Go/ICE/UP.Browser\n /(links) \\(([\\w\\.]+)/i // Links\n ], [NAME, VERSION], [\n \n /(cobalt)\\/([\\w\\.]+)/i // Cobalt\n ], [NAME, [VERSION, /master.|lts./, \"\"]]\n ],\n\n cpu : [[\n\n /(?:(amd|x(?:(?:86|64)[-_])?|wow|win)64)[;\\)]/i // AMD64 (x64)\n ], [[ARCHITECTURE, 'amd64']], [\n\n /(ia32(?=;))/i // IA32 (quicktime)\n ], [[ARCHITECTURE, lowerize]], [\n\n /((?:i[346]|x)86)[;\\)]/i // IA32 (x86)\n ], [[ARCHITECTURE, 'ia32']], [\n\n /\\b(aarch64|arm(v?8e?l?|_?64))\\b/i // ARM64\n ], [[ARCHITECTURE, 'arm64']], [\n\n /\\b(arm(?:v[67])?ht?n?[fl]p?)\\b/i // ARMHF\n ], [[ARCHITECTURE, 'armhf']], [\n\n // PocketPC mistakenly identified as PowerPC\n /windows (ce|mobile); ppc;/i\n ], [[ARCHITECTURE, 'arm']], [\n\n /((?:ppc|powerpc)(?:64)?)(?: mac|;|\\))/i // PowerPC\n ], [[ARCHITECTURE, /ower/, EMPTY, lowerize]], [\n\n /(sun4\\w)[;\\)]/i // SPARC\n ], [[ARCHITECTURE, 'sparc']], [\n\n /((?:avr32|ia64(?=;))|68k(?=\\))|\\barm(?=v(?:[1-7]|[5-7]1)l?|;|eabi)|(?=atmel )avr|(?:irix|mips|sparc)(?:64)?\\b|pa-risc)/i\n // IA64, 68K, ARM/64, AVR/32, IRIX/64, MIPS/64, SPARC/64, PA-RISC\n ], [[ARCHITECTURE, lowerize]]\n ],\n\n device : [[\n\n //////////////////////////\n // MOBILES & TABLETS\n // Ordered by popularity\n /////////////////////////\n\n // Samsung\n /\\b(sch-i[89]0\\d|shw-m380s|sm-[ptx]\\w{2,4}|gt-[pn]\\d{2,4}|sgh-t8[56]9|nexus 10)/i\n ], [MODEL, [VENDOR, SAMSUNG], [TYPE, TABLET]], [\n /\\b((?:s[cgp]h|gt|sm)-\\w+|galaxy nexus)/i,\n /samsung[- ]([-\\w]+)/i,\n /sec-(sgh\\w+)/i\n ], [MODEL, [VENDOR, SAMSUNG], [TYPE, MOBILE]], [\n\n // Apple\n /\\((ip(?:hone|od)[\\w ]*);/i // iPod/iPhone\n ], [MODEL, [VENDOR, APPLE], [TYPE, MOBILE]], [\n /\\((ipad);[-\\w\\),; ]+apple/i, // iPad\n /applecoremedia\\/[\\w\\.]+ \\((ipad)/i,\n /\\b(ipad)\\d\\d?,\\d\\d?[;\\]].+ios/i\n ], [MODEL, [VENDOR, APPLE], [TYPE, TABLET]], [\n /(macintosh);/i\n ], [MODEL, [VENDOR, APPLE]], [\n\n // Huawei\n /\\b((?:ag[rs][23]?|bah2?|sht?|btv)-a?[lw]\\d{2})\\b(?!.+d\\/s)/i\n ], [MODEL, [VENDOR, HUAWEI], [TYPE, TABLET]], [\n /(?:huawei|honor)([-\\w ]+)[;\\)]/i,\n /\\b(nexus 6p|\\w{2,4}e?-[atu]?[ln][\\dx][012359c][adn]?)\\b(?!.+d\\/s)/i\n ], [MODEL, [VENDOR, HUAWEI], [TYPE, MOBILE]], [\n\n // Xiaomi\n /\\b(poco[\\w ]+)(?: bui|\\))/i, // Xiaomi POCO\n /\\b; (\\w+) build\\/hm\\1/i, // Xiaomi Hongmi 'numeric' models\n /\\b(hm[-_ ]?note?[_ ]?(?:\\d\\w)?) bui/i, // Xiaomi Hongmi\n /\\b(redmi[\\-_ ]?(?:note|k)?[\\w_ ]+)(?: bui|\\))/i, // Xiaomi Redmi\n /\\b(mi[-_ ]?(?:a\\d|one|one[_ ]plus|note lte|max|cc)?[_ ]?(?:\\d?\\w?)[_ ]?(?:plus|se|lite)?)(?: bui|\\))/i // Xiaomi Mi\n ], [[MODEL, /_/g, ' '], [VENDOR, XIAOMI], [TYPE, MOBILE]], [\n /\\b(mi[-_ ]?(?:pad)(?:[\\w_ ]+))(?: bui|\\))/i // Mi Pad tablets\n ],[[MODEL, /_/g, ' '], [VENDOR, XIAOMI], [TYPE, TABLET]], [\n\n // OPPO\n /; (\\w+) bui.+ oppo/i,\n /\\b(cph[12]\\d{3}|p(?:af|c[al]|d\\w|e[ar])[mt]\\d0|x9007|a101op)\\b/i\n ], [MODEL, [VENDOR, 'OPPO'], [TYPE, MOBILE]], [\n\n // Vivo\n /vivo (\\w+)(?: bui|\\))/i,\n /\\b(v[12]\\d{3}\\w?[at])(?: bui|;)/i\n ], [MODEL, [VENDOR, 'Vivo'], [TYPE, MOBILE]], [\n\n // Realme\n /\\b(rmx[12]\\d{3})(?: bui|;|\\))/i\n ], [MODEL, [VENDOR, 'Realme'], [TYPE, MOBILE]], [\n\n // Motorola\n /\\b(milestone|droid(?:[2-4x]| (?:bionic|x2|pro|razr))?:?( 4g)?)\\b[\\w ]+build\\//i,\n /\\bmot(?:orola)?[- ](\\w*)/i,\n /((?:moto[\\w\\(\\) ]+|xt\\d{3,4}|nexus 6)(?= bui|\\)))/i\n ], [MODEL, [VENDOR, MOTOROLA], [TYPE, MOBILE]], [\n /\\b(mz60\\d|xoom[2 ]{0,2}) build\\//i\n ], [MODEL, [VENDOR, MOTOROLA], [TYPE, TABLET]], [\n\n // LG\n /((?=lg)?[vl]k\\-?\\d{3}) bui| 3\\.[-\\w; ]{10}lg?-([06cv9]{3,4})/i\n ], [MODEL, [VENDOR, LG], [TYPE, TABLET]], [\n /(lm(?:-?f100[nv]?|-[\\w\\.]+)(?= bui|\\))|nexus [45])/i,\n /\\blg[-e;\\/ ]+((?!browser|netcast|android tv)\\w+)/i,\n /\\blg-?([\\d\\w]+) bui/i\n ], [MODEL, [VENDOR, LG], [TYPE, MOBILE]], [\n\n // Lenovo\n /(ideatab[-\\w ]+)/i,\n /lenovo ?(s[56]000[-\\w]+|tab(?:[\\w ]+)|yt[-\\d\\w]{6}|tb[-\\d\\w]{6})/i\n ], [MODEL, [VENDOR, 'Lenovo'], [TYPE, TABLET]], [\n\n // Nokia\n /(?:maemo|nokia).*(n900|lumia \\d+)/i,\n /nokia[-_ ]?([-\\w\\.]*)/i\n ], [[MODEL, /_/g, ' '], [VENDOR, 'Nokia'], [TYPE, MOBILE]], [\n\n // Google\n /(pixel c)\\b/i // Google Pixel C\n ], [MODEL, [VENDOR, GOOGLE], [TYPE, TABLET]], [\n /droid.+; (pixel[\\daxl ]{0,6})(?: bui|\\))/i // Google Pixel\n ], [MODEL, [VENDOR, GOOGLE], [TYPE, MOBILE]], [\n\n // Sony\n /droid.+ (a?\\d[0-2]{2}so|[c-g]\\d{4}|so[-gl]\\w+|xq-a\\w[4-7][12])(?= bui|\\).+chrome\\/(?![1-6]{0,1}\\d\\.))/i\n ], [MODEL, [VENDOR, SONY], [TYPE, MOBILE]], [\n /sony tablet [ps]/i,\n /\\b(?:sony)?sgp\\w+(?: bui|\\))/i\n ], [[MODEL, 'Xperia Tablet'], [VENDOR, SONY], [TYPE, TABLET]], [\n\n // OnePlus\n / (kb2005|in20[12]5|be20[12][59])\\b/i,\n /(?:one)?(?:plus)? (a\\d0\\d\\d)(?: b|\\))/i\n ], [MODEL, [VENDOR, 'OnePlus'], [TYPE, MOBILE]], [\n\n // Amazon\n /(alexa)webm/i,\n /(kf[a-z]{2}wi)( bui|\\))/i, // Kindle Fire without Silk\n /(kf[a-z]+)( bui|\\)).+silk\\//i // Kindle Fire HD\n ], [MODEL, [VENDOR, AMAZON], [TYPE, TABLET]], [\n /((?:sd|kf)[0349hijorstuw]+)( bui|\\)).+silk\\//i // Fire Phone\n ], [[MODEL, /(.+)/g, 'Fire Phone $1'], [VENDOR, AMAZON], [TYPE, MOBILE]], [\n\n // BlackBerry\n /(playbook);[-\\w\\),; ]+(rim)/i // BlackBerry PlayBook\n ], [MODEL, VENDOR, [TYPE, TABLET]], [\n /\\b((?:bb[a-f]|st[hv])100-\\d)/i,\n /\\(bb10; (\\w+)/i // BlackBerry 10\n ], [MODEL, [VENDOR, BLACKBERRY], [TYPE, MOBILE]], [\n\n // Asus\n /(?:\\b|asus_)(transfo[prime ]{4,10} \\w+|eeepc|slider \\w+|nexus 7|padfone|p00[cj])/i\n ], [MODEL, [VENDOR, ASUS], [TYPE, TABLET]], [\n / (z[bes]6[027][012][km][ls]|zenfone \\d\\w?)\\b/i\n ], [MODEL, [VENDOR, ASUS], [TYPE, MOBILE]], [\n\n // HTC\n /(nexus 9)/i // HTC Nexus 9\n ], [MODEL, [VENDOR, 'HTC'], [TYPE, TABLET]], [\n /(htc)[-;_ ]{1,2}([\\w ]+(?=\\)| bui)|\\w+)/i, // HTC\n\n // ZTE\n /(zte)[- ]([\\w ]+?)(?: bui|\\/|\\))/i,\n /(alcatel|geeksphone|nexian|panasonic|sony(?!-bra))[-_ ]?([-\\w]*)/i // Alcatel/GeeksPhone/Nexian/Panasonic/Sony\n ], [VENDOR, [MODEL, /_/g, ' '], [TYPE, MOBILE]], [\n\n // Acer\n /droid.+; ([ab][1-7]-?[0178a]\\d\\d?)/i\n ], [MODEL, [VENDOR, 'Acer'], [TYPE, TABLET]], [\n\n // Meizu\n /droid.+; (m[1-5] note) bui/i,\n /\\bmz-([-\\w]{2,})/i\n ], [MODEL, [VENDOR, 'Meizu'], [TYPE, MOBILE]], [\n\n // Sharp\n /\\b(sh-?[altvz]?\\d\\d[a-ekm]?)/i\n ], [MODEL, [VENDOR, SHARP], [TYPE, MOBILE]], [\n\n // MIXED\n /(blackberry|benq|palm(?=\\-)|sonyericsson|acer|asus|dell|meizu|motorola|polytron)[-_ ]?([-\\w]*)/i,\n // BlackBerry/BenQ/Palm/Sony-Ericsson/Acer/Asus/Dell/Meizu/Motorola/Polytron\n /(hp) ([\\w ]+\\w)/i, // HP iPAQ\n /(asus)-?(\\w+)/i, // Asus\n /(microsoft); (lumia[\\w ]+)/i, // Microsoft Lumia\n /(lenovo)[-_ ]?([-\\w]+)/i, // Lenovo\n /(jolla)/i, // Jolla\n /(oppo) ?([\\w ]+) bui/i // OPPO\n ], [VENDOR, MODEL, [TYPE, MOBILE]], [\n\n /(archos) (gamepad2?)/i, // Archos\n /(hp).+(touchpad(?!.+tablet)|tablet)/i, // HP TouchPad\n /(kindle)\\/([\\w\\.]+)/i, // Kindle\n /(nook)[\\w ]+build\\/(\\w+)/i, // Nook\n /(dell) (strea[kpr\\d ]*[\\dko])/i, // Dell Streak\n /(le[- ]+pan)[- ]+(\\w{1,9}) bui/i, // Le Pan Tablets\n /(trinity)[- ]*(t\\d{3}) bui/i, // Trinity Tablets\n /(gigaset)[- ]+(q\\w{1,9}) bui/i, // Gigaset Tablets\n /(vodafone) ([\\w ]+)(?:\\)| bui)/i // Vodafone\n ], [VENDOR, MODEL, [TYPE, TABLET]], [\n\n /(surface duo)/i // Surface Duo\n ], [MODEL, [VENDOR, MICROSOFT], [TYPE, TABLET]], [\n /droid [\\d\\.]+; (fp\\du?)(?: b|\\))/i // Fairphone\n ], [MODEL, [VENDOR, 'Fairphone'], [TYPE, MOBILE]], [\n /(u304aa)/i // AT&T\n ], [MODEL, [VENDOR, 'AT&T'], [TYPE, MOBILE]], [\n /\\bsie-(\\w*)/i // Siemens\n ], [MODEL, [VENDOR, 'Siemens'], [TYPE, MOBILE]], [\n /\\b(rct\\w+) b/i // RCA Tablets\n ], [MODEL, [VENDOR, 'RCA'], [TYPE, TABLET]], [\n /\\b(venue[\\d ]{2,7}) b/i // Dell Venue Tablets\n ], [MODEL, [VENDOR, 'Dell'], [TYPE, TABLET]], [\n /\\b(q(?:mv|ta)\\w+) b/i // Verizon Tablet\n ], [MODEL, [VENDOR, 'Verizon'], [TYPE, TABLET]], [\n /\\b(?:barnes[& ]+noble |bn[rt])([\\w\\+ ]*) b/i // Barnes & Noble Tablet\n ], [MODEL, [VENDOR, 'Barnes & Noble'], [TYPE, TABLET]], [\n /\\b(tm\\d{3}\\w+) b/i\n ], [MODEL, [VENDOR, 'NuVision'], [TYPE, TABLET]], [\n /\\b(k88) b/i // ZTE K Series Tablet\n ], [MODEL, [VENDOR, 'ZTE'], [TYPE, TABLET]], [\n /\\b(nx\\d{3}j) b/i // ZTE Nubia\n ], [MODEL, [VENDOR, 'ZTE'], [TYPE, MOBILE]], [\n /\\b(gen\\d{3}) b.+49h/i // Swiss GEN Mobile\n ], [MODEL, [VENDOR, 'Swiss'], [TYPE, MOBILE]], [\n /\\b(zur\\d{3}) b/i // Swiss ZUR Tablet\n ], [MODEL, [VENDOR, 'Swiss'], [TYPE, TABLET]], [\n /\\b((zeki)?tb.*\\b) b/i // Zeki Tablets\n ], [MODEL, [VENDOR, 'Zeki'], [TYPE, TABLET]], [\n /\\b([yr]\\d{2}) b/i,\n /\\b(dragon[- ]+touch |dt)(\\w{5}) b/i // Dragon Touch Tablet\n ], [[VENDOR, 'Dragon Touch'], MODEL, [TYPE, TABLET]], [\n /\\b(ns-?\\w{0,9}) b/i // Insignia Tablets\n ], [MODEL, [VENDOR, 'Insignia'], [TYPE, TABLET]], [\n /\\b((nxa|next)-?\\w{0,9}) b/i // NextBook Tablets\n ], [MODEL, [VENDOR, 'NextBook'], [TYPE, TABLET]], [\n /\\b(xtreme\\_)?(v(1[045]|2[015]|[3469]0|7[05])) b/i // Voice Xtreme Phones\n ], [[VENDOR, 'Voice'], MODEL, [TYPE, MOBILE]], [\n /\\b(lvtel\\-)?(v1[12]) b/i // LvTel Phones\n ], [[VENDOR, 'LvTel'], MODEL, [TYPE, MOBILE]], [\n /\\b(ph-1) /i // Essential PH-1\n ], [MODEL, [VENDOR, 'Essential'], [TYPE, MOBILE]], [\n /\\b(v(100md|700na|7011|917g).*\\b) b/i // Envizen Tablets\n ], [MODEL, [VENDOR, 'Envizen'], [TYPE, TABLET]], [\n /\\b(trio[-\\w\\. ]+) b/i // MachSpeed Tablets\n ], [MODEL, [VENDOR, 'MachSpeed'], [TYPE, TABLET]], [\n /\\btu_(1491) b/i // Rotor Tablets\n ], [MODEL, [VENDOR, 'Rotor'], [TYPE, TABLET]], [\n /(shield[\\w ]+) b/i // Nvidia Shield Tablets\n ], [MODEL, [VENDOR, 'Nvidia'], [TYPE, TABLET]], [\n /(sprint) (\\w+)/i // Sprint Phones\n ], [VENDOR, MODEL, [TYPE, MOBILE]], [\n /(kin\\.[onetw]{3})/i // Microsoft Kin\n ], [[MODEL, /\\./g, ' '], [VENDOR, MICROSOFT], [TYPE, MOBILE]], [\n /droid.+; (cc6666?|et5[16]|mc[239][23]x?|vc8[03]x?)\\)/i // Zebra\n ], [MODEL, [VENDOR, ZEBRA], [TYPE, TABLET]], [\n /droid.+; (ec30|ps20|tc[2-8]\\d[kx])\\)/i\n ], [MODEL, [VENDOR, ZEBRA], [TYPE, MOBILE]], [\n\n ///////////////////\n // CONSOLES\n ///////////////////\n\n /(ouya)/i, // Ouya\n /(nintendo) ([wids3utch]+)/i // Nintendo\n ], [VENDOR, MODEL, [TYPE, CONSOLE]], [\n /droid.+; (shield) bui/i // Nvidia\n ], [MODEL, [VENDOR, 'Nvidia'], [TYPE, CONSOLE]], [\n /(playstation [345portablevi]+)/i // Playstation\n ], [MODEL, [VENDOR, SONY], [TYPE, CONSOLE]], [\n /\\b(xbox(?: one)?(?!; xbox))[\\); ]/i // Microsoft Xbox\n ], [MODEL, [VENDOR, MICROSOFT], [TYPE, CONSOLE]], [\n\n ///////////////////\n // SMARTTVS\n ///////////////////\n\n /smart-tv.+(samsung)/i // Samsung\n ], [VENDOR, [TYPE, SMARTTV]], [\n /hbbtv.+maple;(\\d+)/i\n ], [[MODEL, /^/, 'SmartTV'], [VENDOR, SAMSUNG], [TYPE, SMARTTV]], [\n /(nux; netcast.+smarttv|lg (netcast\\.tv-201\\d|android tv))/i // LG SmartTV\n ], [[VENDOR, LG], [TYPE, SMARTTV]], [\n /(apple) ?tv/i // Apple TV\n ], [VENDOR, [MODEL, APPLE+' TV'], [TYPE, SMARTTV]], [\n /crkey/i // Google Chromecast\n ], [[MODEL, CHROME+'cast'], [VENDOR, GOOGLE], [TYPE, SMARTTV]], [\n /droid.+aft(\\w)( bui|\\))/i // Fire TV\n ], [MODEL, [VENDOR, AMAZON], [TYPE, SMARTTV]], [\n /\\(dtv[\\);].+(aquos)/i,\n /(aquos-tv[\\w ]+)\\)/i // Sharp\n ], [MODEL, [VENDOR, SHARP], [TYPE, SMARTTV]],[\n /(bravia[\\w ]+)( bui|\\))/i // Sony\n ], [MODEL, [VENDOR, SONY], [TYPE, SMARTTV]], [\n /(mitv-\\w{5}) bui/i // Xiaomi\n ], [MODEL, [VENDOR, XIAOMI], [TYPE, SMARTTV]], [\n /\\b(roku)[\\dx]*[\\)\\/]((?:dvp-)?[\\d\\.]*)/i, // Roku\n /hbbtv\\/\\d+\\.\\d+\\.\\d+ +\\([\\w ]*; *(\\w[^;]*);([^;]*)/i // HbbTV devices\n ], [[VENDOR, trim], [MODEL, trim], [TYPE, SMARTTV]], [\n /\\b(android tv|smart[- ]?tv|opera tv|tv; rv:)\\b/i // SmartTV from Unidentified Vendors\n ], [[TYPE, SMARTTV]], [\n\n ///////////////////\n // WEARABLES\n ///////////////////\n\n /((pebble))app/i // Pebble\n ], [VENDOR, MODEL, [TYPE, WEARABLE]], [\n /droid.+; (glass) \\d/i // Google Glass\n ], [MODEL, [VENDOR, GOOGLE], [TYPE, WEARABLE]], [\n /droid.+; (wt63?0{2,3})\\)/i\n ], [MODEL, [VENDOR, ZEBRA], [TYPE, WEARABLE]], [\n /(quest( 2)?)/i // Oculus Quest\n ], [MODEL, [VENDOR, FACEBOOK], [TYPE, WEARABLE]], [\n\n ///////////////////\n // EMBEDDED\n ///////////////////\n\n /(tesla)(?: qtcarbrowser|\\/[-\\w\\.]+)/i // Tesla\n ], [VENDOR, [TYPE, EMBEDDED]], [\n\n ////////////////////\n // MIXED (GENERIC)\n ///////////////////\n\n /droid .+?; ([^;]+?)(?: bui|\\) applew).+? mobile safari/i // Android Phones from Unidentified Vendors\n ], [MODEL, [TYPE, MOBILE]], [\n /droid .+?; ([^;]+?)(?: bui|\\) applew).+?(?! mobile) safari/i // Android Tablets from Unidentified Vendors\n ], [MODEL, [TYPE, TABLET]], [\n /\\b((tablet|tab)[;\\/]|focus\\/\\d(?!.+mobile))/i // Unidentifiable Tablet\n ], [[TYPE, TABLET]], [\n /(phone|mobile(?:[;\\/]| [ \\w\\/\\.]*safari)|pda(?=.+windows ce))/i // Unidentifiable Mobile\n ], [[TYPE, MOBILE]], [\n /(android[-\\w\\. ]{0,9});.+buil/i // Generic Android Device\n ], [MODEL, [VENDOR, 'Generic']]\n ],\n\n engine : [[\n\n /windows.+ edge\\/([\\w\\.]+)/i // EdgeHTML\n ], [VERSION, [NAME, EDGE+'HTML']], [\n\n /webkit\\/537\\.36.+chrome\\/(?!27)([\\w\\.]+)/i // Blink\n ], [VERSION, [NAME, 'Blink']], [\n\n /(presto)\\/([\\w\\.]+)/i, // Presto\n /(webkit|trident|netfront|netsurf|amaya|lynx|w3m|goanna)\\/([\\w\\.]+)/i, // WebKit/Trident/NetFront/NetSurf/Amaya/Lynx/w3m/Goanna\n /ekioh(flow)\\/([\\w\\.]+)/i, // Flow\n /(khtml|tasman|links)[\\/ ]\\(?([\\w\\.]+)/i, // KHTML/Tasman/Links\n /(icab)[\\/ ]([23]\\.[\\d\\.]+)/i // iCab\n ], [NAME, VERSION], [\n\n /rv\\:([\\w\\.]{1,9})\\b.+(gecko)/i // Gecko\n ], [VERSION, NAME]\n ],\n\n os : [[\n\n // Windows\n /microsoft (windows) (vista|xp)/i // Windows (iTunes)\n ], [NAME, VERSION], [\n /(windows) nt 6\\.2; (arm)/i, // Windows RT\n /(windows (?:phone(?: os)?|mobile))[\\/ ]?([\\d\\.\\w ]*)/i, // Windows Phone\n /(windows)[\\/ ]?([ntce\\d\\. ]+\\w)(?!.+xbox)/i\n ], [NAME, [VERSION, strMapper, windowsVersionMap]], [\n /(win(?=3|9|n)|win 9x )([nt\\d\\.]+)/i\n ], [[NAME, 'Windows'], [VERSION, strMapper, windowsVersionMap]], [\n\n // iOS/macOS\n /ip[honead]{2,4}\\b(?:.*os ([\\w]+) like mac|; opera)/i, // iOS\n /cfnetwork\\/.+darwin/i\n ], [[VERSION, /_/g, '.'], [NAME, 'iOS']], [\n /(mac os x) ?([\\w\\. ]*)/i,\n /(macintosh|mac_powerpc\\b)(?!.+haiku)/i // Mac OS\n ], [[NAME, 'Mac OS'], [VERSION, /_/g, '.']], [\n\n // Mobile OSes\n /droid ([\\w\\.]+)\\b.+(android[- ]x86|harmonyos)/i // Android-x86/HarmonyOS\n ], [VERSION, NAME], [ // Android/WebOS/QNX/Bada/RIM/Maemo/MeeGo/Sailfish OS\n /(android|webos|qnx|bada|rim tablet os|maemo|meego|sailfish)[-\\/ ]?([\\w\\.]*)/i,\n /(blackberry)\\w*\\/([\\w\\.]*)/i, // Blackberry\n /(tizen|kaios)[\\/ ]([\\w\\.]+)/i, // Tizen/KaiOS\n /\\((series40);/i // Series 40\n ], [NAME, VERSION], [\n /\\(bb(10);/i // BlackBerry 10\n ], [VERSION, [NAME, BLACKBERRY]], [\n /(?:symbian ?os|symbos|s60(?=;)|series60)[-\\/ ]?([\\w\\.]*)/i // Symbian\n ], [VERSION, [NAME, 'Symbian']], [\n /mozilla\\/[\\d\\.]+ \\((?:mobile|tablet|tv|mobile; [\\w ]+); rv:.+ gecko\\/([\\w\\.]+)/i // Firefox OS\n ], [VERSION, [NAME, FIREFOX+' OS']], [\n /web0s;.+rt(tv)/i,\n /\\b(?:hp)?wos(?:browser)?\\/([\\w\\.]+)/i // WebOS\n ], [VERSION, [NAME, 'webOS']], [\n\n // Google Chromecast\n /crkey\\/([\\d\\.]+)/i // Google Chromecast\n ], [VERSION, [NAME, CHROME+'cast']], [\n /(cros) [\\w]+ ([\\w\\.]+\\w)/i // Chromium OS\n ], [[NAME, 'Chromium OS'], VERSION],[\n\n // Console\n /(nintendo|playstation) ([wids345portablevuch]+)/i, // Nintendo/Playstation\n /(xbox); +xbox ([^\\);]+)/i, // Microsoft Xbox (360, One, X, S, Series X, Series S)\n\n // Other\n /\\b(joli|palm)\\b ?(?:os)?\\/?([\\w\\.]*)/i, // Joli/Palm\n /(mint)[\\/\\(\\) ]?(\\w*)/i, // Mint\n /(mageia|vectorlinux)[; ]/i, // Mageia/VectorLinux\n /([kxln]?ubuntu|debian|suse|opensuse|gentoo|arch(?= linux)|slackware|fedora|mandriva|centos|pclinuxos|red ?hat|zenwalk|linpus|raspbian|plan 9|minix|risc os|contiki|deepin|manjaro|elementary os|sabayon|linspire)(?: gnu\\/linux)?(?: enterprise)?(?:[- ]linux)?(?:-gnu)?[-\\/ ]?(?!chrom|package)([-\\w\\.]*)/i,\n // Ubuntu/Debian/SUSE/Gentoo/Arch/Slackware/Fedora/Mandriva/CentOS/PCLinuxOS/RedHat/Zenwalk/Linpus/Raspbian/Plan9/Minix/RISCOS/Contiki/Deepin/Manjaro/elementary/Sabayon/Linspire\n /(hurd|linux) ?([\\w\\.]*)/i, // Hurd/Linux\n /(gnu) ?([\\w\\.]*)/i, // GNU\n /\\b([-frentopcghs]{0,5}bsd|dragonfly)[\\/ ]?(?!amd|[ix346]{1,2}86)([\\w\\.]*)/i, // FreeBSD/NetBSD/OpenBSD/PC-BSD/GhostBSD/DragonFly\n /(haiku) (\\w+)/i // Haiku\n ], [NAME, VERSION], [\n /(sunos) ?([\\w\\.\\d]*)/i // Solaris\n ], [[NAME, 'Solaris'], VERSION], [\n /((?:open)?solaris)[-\\/ ]?([\\w\\.]*)/i, // Solaris\n /(aix) ((\\d)(?=\\.|\\)| )[\\w\\.])*/i, // AIX\n /\\b(beos|os\\/2|amigaos|morphos|openvms|fuchsia|hp-ux)/i, // BeOS/OS2/AmigaOS/MorphOS/OpenVMS/Fuchsia/HP-UX\n /(unix) ?([\\w\\.]*)/i // UNIX\n ], [NAME, VERSION]\n ]\n };\n\n /////////////////\n // Constructor\n ////////////////\n\n var UAParser = function (ua, extensions) {\n\n if (typeof ua === OBJ_TYPE) {\n extensions = ua;\n ua = undefined;\n }\n\n if (!(this instanceof UAParser)) {\n return new UAParser(ua, extensions).getResult();\n }\n\n var _ua = ua || ((typeof window !== UNDEF_TYPE && window.navigator && window.navigator.userAgent) ? window.navigator.userAgent : EMPTY);\n var _rgxmap = extensions ? extend(regexes, extensions) : regexes;\n\n this.getBrowser = function () {\n var _browser = {};\n _browser[NAME] = undefined;\n _browser[VERSION] = undefined;\n rgxMapper.call(_browser, _ua, _rgxmap.browser);\n _browser.major = majorize(_browser.version);\n return _browser;\n };\n this.getCPU = function () {\n var _cpu = {};\n _cpu[ARCHITECTURE] = undefined;\n rgxMapper.call(_cpu, _ua, _rgxmap.cpu);\n return _cpu;\n };\n this.getDevice = function () {\n var _device = {};\n _device[VENDOR] = undefined;\n _device[MODEL] = undefined;\n _device[TYPE] = undefined;\n rgxMapper.call(_device, _ua, _rgxmap.device);\n return _device;\n };\n this.getEngine = function () {\n var _engine = {};\n _engine[NAME] = undefined;\n _engine[VERSION] = undefined;\n rgxMapper.call(_engine, _ua, _rgxmap.engine);\n return _engine;\n };\n this.getOS = function () {\n var _os = {};\n _os[NAME] = undefined;\n _os[VERSION] = undefined;\n rgxMapper.call(_os, _ua, _rgxmap.os);\n return _os;\n };\n this.getResult = function () {\n return {\n ua : this.getUA(),\n browser : this.getBrowser(),\n engine : this.getEngine(),\n os : this.getOS(),\n device : this.getDevice(),\n cpu : this.getCPU()\n };\n };\n this.getUA = function () {\n return _ua;\n };\n this.setUA = function (ua) {\n _ua = (typeof ua === STR_TYPE && ua.length > UA_MAX_LENGTH) ? trim(ua, UA_MAX_LENGTH) : ua;\n return this;\n };\n this.setUA(_ua);\n return this;\n };\n\n UAParser.VERSION = LIBVERSION;\n UAParser.BROWSER = enumerize([NAME, VERSION, MAJOR]);\n UAParser.CPU = enumerize([ARCHITECTURE]);\n UAParser.DEVICE = enumerize([MODEL, VENDOR, TYPE, CONSOLE, MOBILE, SMARTTV, TABLET, WEARABLE, EMBEDDED]);\n UAParser.ENGINE = UAParser.OS = enumerize([NAME, VERSION]);\n\n ///////////\n // Export\n //////////\n\n // check js environment\n if (typeof(exports) !== UNDEF_TYPE) {\n // nodejs env\n if (typeof module !== UNDEF_TYPE && module.exports) {\n exports = module.exports = UAParser;\n }\n exports.UAParser = UAParser;\n } else {\n // requirejs env (optional)\n if (typeof(define) === FUNC_TYPE && define.amd) {\n define(function () {\n return UAParser;\n });\n } else if (typeof window !== UNDEF_TYPE) {\n // browser env\n window.UAParser = UAParser;\n }\n }\n\n // jQuery/Zepto specific (optional)\n // Note:\n // In AMD env the global scope should be kept clean, but jQuery is an exception.\n // jQuery always exports to global scope, unless jQuery.noConflict(true) is used,\n // and we should catch that.\n var $ = typeof window !== UNDEF_TYPE && (window.jQuery || window.Zepto);\n if ($ && !$.ua) {\n var parser = new UAParser();\n $.ua = parser.getResult();\n $.ua.get = function () {\n return parser.getUA();\n };\n $.ua.set = function (ua) {\n parser.setUA(ua);\n var result = parser.getResult();\n for (var prop in result) {\n $.ua[prop] = result[prop];\n }\n };\n }\n\n})(typeof window === 'object' ? window : this);\n","var __defProp = Object.defineProperty;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __publicField = (obj, key, value) => {\n __defNormalProp(obj, typeof key !== \"symbol\" ? key + \"\" : key, value);\n return value;\n};\nimport UAParser from \"ua-parser-js\";\nconst Browser = {\n UNKNOWN: \"Unknown\",\n SAFARI: \"Safari\",\n FIREFOX: \"Firefox\",\n OPERA: \"Opera\",\n CHROME: \"Chrome\",\n IOS_WEBVIEW: \"iOS-webview\"\n};\nclass BrowserUtils {\n static getName() {\n if (!this._name) {\n if (typeof navigator === \"undefined\" || !navigator) {\n this._name = Browser.UNKNOWN;\n } else {\n const { userAgent } = navigator;\n if (userAgent.match(/Firefox/i)) {\n this._name = Browser.FIREFOX;\n } else if (userAgent.match(/(Opera|OPR)/i)) {\n this._name = Browser.OPERA;\n } else if (userAgent.match(/Chrome/i)) {\n this._name = Browser.CHROME;\n } else if (userAgent.match(/Safari/i)) {\n this._name = Browser.SAFARI;\n } else if (userAgent.match(/(iPhone|iPod|iPad).*AppleWebKit(?!.*Version)/i)) {\n this._name = Browser.IOS_WEBVIEW;\n } else {\n this._name = Browser.UNKNOWN;\n }\n }\n }\n return this._name;\n }\n static get isMobile() {\n if (this._isMobile === null) {\n this._isMobile = false;\n if (typeof navigator !== \"undefined\" && navigator) {\n const userAgent = navigator.userAgent || navigator.vendor;\n if (userAgent && (/(android|bb\\d+|meego).+mobile|avantgo|bada\\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\\.(browser|link)|vodafone|wap|windows ce|xda|xiino|android|ipad|playbook|silk/i.test(userAgent) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\\-(n|u)|c55\\/|capi|ccwa|cdm\\-|cell|chtm|cldc|cmd\\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\\-s|devi|dica|dmob|do(c|p)o|ds(12|\\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\\-|_)|g1 u|g560|gene|gf\\-5|g\\-mo|go(\\.w|od)|gr(ad|un)|haie|hcit|hd\\-(m|p|t)|hei\\-|hi(pt|ta)|hp( i|ip)|hs\\-c|ht(c(\\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\\-(20|go|ma)|i230|iac( |\\-|\\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\\/)|klon|kpt |kwc\\-|kyo(c|k)|le(no|xi)|lg( g|\\/(k|l|u)|50|54|\\-[a-w])|libw|lynx|m1\\-w|m3ga|m50\\/|ma(te|ui|xo)|mc(01|21|ca)|m\\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\\-2|po(ck|rt|se)|prox|psio|pt\\-g|qa\\-a|qc(07|12|21|32|60|\\-[2-7]|i\\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\\-|oo|p\\-)|sdk\\/|se(c(\\-|0|1)|47|mc|nd|ri)|sgh\\-|shar|sie(\\-|m)|sk\\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\\-|v\\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\\-|tdg\\-|tel(i|m)|tim\\-|t\\-mo|to(pl|sh)|ts(70|m\\-|m3|m5)|tx\\-9|up(\\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\\-|your|zeto|zte\\-/i.test(userAgent.substr(0, 4)))) {\n this._isMobile = true;\n }\n }\n }\n return this._isMobile;\n }\n static clearCache() {\n this._name = null;\n this._isMobile = null;\n }\n}\n__publicField(BrowserUtils, \"_name\", null);\n__publicField(BrowserUtils, \"_isMobile\", null);\nconst QUALITATIVE_COLORS = [\n 4215763,\n 14529296,\n 11869460,\n 48895,\n 16468400,\n 45661,\n 13290186\n];\nfunction getQualitativeColor(number) {\n return QUALITATIVE_COLORS[number % QUALITATIVE_COLORS.length];\n}\nconst ColorUtils = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({\n __proto__: null,\n getQualitativeColor\n}, Symbol.toStringTag, { value: \"Module\" }));\nfunction getDeviceFromUserAgent() {\n const info = new UAParser().getResult();\n if (!info) {\n return null;\n }\n const res = {\n vendor: info.device.vendor,\n model: info.device.model\n };\n if (!res.vendor && !res.model && info.os.name === \"Mac OS\") {\n res.vendor = \"Apple\";\n res.model = \"Mac\";\n }\n return res;\n}\nconst UserAgentUtils = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({\n __proto__: null,\n getDeviceFromUserAgent\n}, Symbol.toStringTag, { value: \"Module\" }));\nfunction any(promises) {\n return new Promise((resolve, reject) => {\n let count = promises.length, resolved = false;\n const reasons = [];\n promises.forEach((p) => {\n Promise.resolve(p).then((value) => {\n resolved = true;\n count--;\n resolve(value);\n }, (reason) => {\n count--;\n reasons.push(reason);\n if (count === 0 && !resolved) {\n reject(new Error(reasons.join(\"\\n\")));\n }\n });\n });\n });\n}\nconst PromiseUtils = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({\n __proto__: null,\n any\n}, Symbol.toStringTag, { value: \"Module\" }));\nfunction generateString(strLength) {\n return Math.random().toString(36).substring(2, strLength + 2);\n}\nconst RandomUtils = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({\n __proto__: null,\n generateString\n}, Symbol.toStringTag, { value: \"Module\" }));\nfunction formatSO(value, ...xargs) {\n let str = value.toString();\n if (xargs.length) {\n const t = typeof xargs[0];\n const args = t === \"string\" || t === \"number\" ? xargs.slice() : xargs[0];\n for (const key in args) {\n str = str.replace(new RegExp(\"\\\\{\" + key + \"\\\\}\", \"gi\"), args[key]);\n }\n }\n return str;\n}\nconst StringUtils = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({\n __proto__: null,\n formatSO\n}, Symbol.toStringTag, { value: \"Module\" }));\nfunction preciseTime() {\n if (typeof window !== \"undefined\" && window.performance) {\n return window.performance.now();\n }\n const hrtime = process.hrtime();\n return Math.round(hrtime[0] * 1e3 + hrtime[1] / 1e6);\n}\nfunction unixTimestampToPreciseTime(timestamp) {\n return preciseTime() + timestamp - new Date().getTime();\n}\nfunction preciseTimeToUnixTimestamp(_preciseTime) {\n return new Date().getTime() + _preciseTime - preciseTime();\n}\nconst TimeUtils = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({\n __proto__: null,\n preciseTime,\n unixTimestampToPreciseTime,\n preciseTimeToUnixTimestamp\n}, Symbol.toStringTag, { value: \"Module\" }));\nconst _GraphVertex = class {\n constructor(params = {}) {\n __publicField(this, \"name\", null);\n __publicField(this, \"data\", null);\n __publicField(this, \"id\");\n __publicField(this, \"edges\", []);\n Object.assign(this, params);\n if (typeof params.id === \"number\") {\n this.id = params.id;\n GraphEdge.currentUniqueId = Math.max(GraphEdge.currentUniqueId, params.id + 1);\n } else {\n this.id = _GraphVertex.currentUniqueId++;\n }\n }\n};\nlet GraphVertex = _GraphVertex;\n__publicField(GraphVertex, \"currentUniqueId\", 0);\nconst _GraphEdge = class {\n constructor(vertex1, vertex2, params = {}) {\n __publicField(this, \"name\", null);\n __publicField(this, \"data\", null);\n __publicField(this, \"id\");\n __publicField(this, \"_vertex1\");\n __publicField(this, \"_vertex2\");\n Object.assign(this, params);\n this.vertex1 = vertex1;\n this.vertex2 = vertex2;\n if (typeof params.id === \"number\") {\n this.id = params.id;\n _GraphEdge.currentUniqueId = Math.max(_GraphEdge.currentUniqueId, params.id + 1);\n } else {\n this.id = GraphVertex.currentUniqueId++;\n }\n }\n get vertex1() {\n return this._vertex1;\n }\n set vertex1(vertex) {\n if (this._vertex1 && this._vertex2 !== this._vertex1) {\n this._vertex1.edges = this._vertex1.edges.filter((edge) => edge !== this);\n }\n vertex.edges.push(this);\n this._vertex1 = vertex;\n }\n get vertex2() {\n return this._vertex2;\n }\n set vertex2(vertex) {\n if (this._vertex2 && this._vertex2 !== this._vertex1) {\n this._vertex2.edges = this._vertex2.edges.filter((edge) => edge !== this);\n }\n vertex.edges.push(this);\n this._vertex2 = vertex;\n }\n static getEdgeByVertices(edges, vertex1, vertex2) {\n return edges.find(\n (edge) => vertex1 === edge.vertex1 && vertex2 === edge.vertex2 || vertex2 === edge.vertex1 && vertex1 === edge.vertex2\n );\n }\n};\nlet GraphEdge = _GraphEdge;\n__publicField(GraphEdge, \"currentUniqueId\", 0);\nclass Graph {\n constructor(vertices, edges) {\n __publicField(this, \"vertices\");\n __publicField(this, \"edges\");\n this.vertices = Array.isArray(vertices) ? vertices : [];\n this.edges = Array.isArray(edges) ? edges : [];\n }\n getEdgeByVertices(vertex1, vertex2) {\n return GraphEdge.getEdgeByVertices(this.edges, vertex1, vertex2);\n }\n getVertexByName(name) {\n return this.vertices.find((vertex) => vertex.name === name);\n }\n getEdgeByName(name) {\n return this.edges.find((edge) => edge.name === name);\n }\n toDetailedString() {\n let output = `--- Network ---\nVertices: ${this.vertices.length}\nEdges: ${this.edges.length}\n---\nVertices\n`;\n this.vertices.forEach((vertex) => {\n output += `${vertex.id} [edges: ${vertex.edges.length}]\n`;\n });\n output += \"---\\nEdges\\n\";\n this.edges.forEach((edge) => {\n output += `${edge.id} `;\n output += `[${edge.vertex1.id} -- ${edge.vertex2.id}]\n`;\n });\n output += \"---\";\n return output;\n }\n}\nexport {\n Browser,\n BrowserUtils,\n ColorUtils,\n Graph,\n GraphEdge,\n GraphVertex,\n PromiseUtils,\n RandomUtils,\n StringUtils,\n TimeUtils,\n UserAgentUtils\n};\n//# sourceMappingURL=index.mjs.map\n","import { GraphEdge } from '@wemap/utils';\n\nimport Level from '../coordinates/Level.js';\nimport GeoGraphVertex from './GeoGraphVertex.js';\nimport { Level_t } from '../types.js';\n\n/**\n * An Edge is a segment composed of two Vertex\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 GeoGraphEdge<VertexData = unknown, EdgeData = unknown> extends GraphEdge<VertexData, EdgeData> {\n\n declare protected _vertex1: GeoGraphVertex<VertexData, EdgeData>;\n declare protected _vertex2: GeoGraphVertex<VertexData, EdgeData>;\n\n private _level: Level_t = null;\n\n private _bearing: number | null = null;\n private _length: number | null = null;\n\n private _computedSizeAndBearing = false;\n\n isOneway = false;\n\n constructor(\n vertex1: GeoGraphVertex<VertexData, EdgeData>,\n vertex2: GeoGraphVertex<VertexData, EdgeData>,\n params?: Omit<Partial<GraphEdge<VertexData, EdgeData> & { level: Level_t, isOneway: boolean }>, 'vertex1' | 'vertex2'>\n ) {\n super(vertex1, vertex2, params);\n Object.assign(this, params);\n }\n\n set vertex1(vertex) {\n super.vertex1 = vertex;\n this._computedSizeAndBearing = false;\n }\n\n get vertex1() {\n return this._vertex1;\n }\n\n set vertex2(vertex) {\n super.vertex2 = vertex;\n this._computedSizeAndBearing = false;\n }\n\n get vertex2() {\n return this._vertex2;\n }\n\n get level() {\n return this._level;\n }\n\n set level(level) {\n Level.checkType(level);\n this._level = level;\n }\n\n /**\n * Get edge bearing from vertex1 to vertex2\n */\n get bearing(): number {\n if (!this._computedSizeAndBearing) {\n this._computeSizeAndBearing();\n }\n return this._bearing as number;\n }\n\n /**\n * get edge length\n */\n get length(): number {\n if (!this._computedSizeAndBearing) {\n this._computeSizeAndBearing();\n }\n return this._length as number;\n }\n\n _computeSizeAndBearing() {\n this._length = this.vertex1.distanceTo(this.vertex2);\n this._bearing = this.vertex1.bearingTo(this.vertex2);\n this._computedSizeAndBearing = true;\n }\n\n static getEdgeByVertices<VertexData = unknown, EdgeData = unknown>(\n edges: GeoGraphEdge<VertexData, EdgeData>[],\n vertex1: GeoGraphVertex<VertexData, EdgeData>,\n vertex2: GeoGraphVertex<VertexData, EdgeData>\n ) {\n return super.getEdgeByVertices(edges, vertex1, vertex2) as GeoGraphEdge<VertexData, EdgeData> | undefined;\n }\n\n}\n\nexport default GeoGraphEdge;\n","import { GraphVertex } from '@wemap/utils';\n\nimport Coordinates from '../coordinates/Coordinates.js';\nimport Level from '../coordinates/Level.js';\nimport { GraphVertexJson, Level_t } from '../types.js';\nimport GeoGraphEdge from './GeoGraphEdge.js';\n\n\n\nclass GeoGraphVertex<VertexData = unknown, EdgeData = unknown> extends GraphVertex<VertexData, EdgeData> {\n\n declare edges: GeoGraphEdge<VertexData, EdgeData>[];\n\n coords: Coordinates;\n io = false;\n\n constructor(coords: Coordinates, params?: Omit<Partial<GraphVertex<VertexData, EdgeData>>, 'edges'> & { io?: boolean }) {\n super(params);\n this.coords = coords;\n }\n\n distanceTo(other: GeoGraphVertex) {\n return this.coords.distanceTo(other.coords);\n }\n\n bearingTo(other: GeoGraphVertex) {\n return this.coords.bearingTo(other.coords);\n }\n\n /**\n * Does not include \"edges\" property\n */\n toJson(): GraphVertexJson {\n return this.coords.toCompressedJson();\n }\n\n static fromJson<VertexData = unknown, EdgeData = unknown>(json: GraphVertexJson) {\n return new GeoGraphVertex<VertexData, EdgeData>(Coordinates.fromCompressedJson(json));\n }\n\n inferVertexLevelFromEdges() {\n let tmpLevel = null;\n for (let i = 0; i < this.edges.length; i++) {\n const edge = this.edges[i];\n if (edge.level !== null) {\n if (tmpLevel === null) {\n tmpLevel = Level.clone(edge.level);\n } else {\n tmpLevel = Level.intersection(tmpLevel, edge.level);\n if (tmpLevel === null) {\n throw Error('Something bad happend during parsing: We cannot retrieve vertex level from adjacent ways: ' + this.coords);\n }\n }\n }\n }\n this.coords.level = tmpLevel;\n }\n\n\n /**\n * We suppose inferVertexLevelFromEdges() was called before\n */\n inferVertexLevelByNeighboors() {\n const { level } = this.coords;\n if (level === null || !Level.isRange(level)) {\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 otherVertex = edge.vertex1 === this ? edge.vertex2 : edge.vertex1;\n tmpLevel = Level.union(otherVertex.coords.level, tmpLevel);\n }\n\n if (tmpLevel === null || !Level.isRange(tmpLevel)) {\n this.coords.level = tmpLevel === level[0] ? level[1] : level[0];\n }\n\n return true;\n }\n\n /**\n * We suppose inferVertexLevelFromEdges() and inferVertexLevelByNeighboors() were called before\n */\n inferVertexLevelByRecursion() {\n const { level } = this.coords;\n if (level === null || !Level.isRange(level)) {\n return;\n }\n\n /**\n * We can infer vertex level only if this one have one edge attached\n */\n if (this.edges.length > 1) {\n return;\n }\n\n /**\n * This method looks for single level vertices recursively from a multi-level vertex\n * The result of this method is an union of all single level vertices found.\n */\n const lookForLevel = (vertex: GeoGraphVertex, visitedVertices: GeoGraphVertex[]): Level_t => {\n\n visitedVertices.push(vertex);\n\n if (vertex.coords.level === null) {\n return null;\n }\n\n if (!Level.isRange(vertex.coords.level)) {\n return vertex.coords.level;\n }\n\n let tmpLevel = null;\n for (let i = 0; i < vertex.edges.length; i++) {\n const edge = vertex.edges[i];\n const otherVertex = edge.vertex1 === vertex ? edge.vertex2 : edge.vertex1;\n if (!visitedVertices.includes(otherVertex)) {\n tmpLevel = Level.union(lookForLevel(otherVertex, visitedVertices), tmpLevel);\n }\n }\n return tmpLevel;\n };\n\n const othersLevels = lookForLevel(this, []);\n\n if (othersLevels !== null) {\n if (!Level.isRange(othersLevels)) {\n this.coords.level = othersLevels === level[0] ? level[1] : level[0];\n return;\n }\n throw Error('Level of: ' + this.coords.toString() + ' cannot be decided');\n }\n }\n\n}\n\nexport default GeoGraphVertex;\n","import { Graph } from '@wemap/utils';\n\nimport BoundingBox from '../coordinates/BoundingBox.js';\nimport Coordinates from '../coordinates/Coordinates.js';\nimport Level from '../coordinates/Level.js';\nimport { Level_t, GeoGraphJson } from '../types.js';\n\nimport GeoGraphEdge from './GeoGraphEdge.js';\nimport GeoGraphVertex from './GeoGraphVertex.js';\n\nclass GeoGraph<VertexData = unknown, EdgeData = unknown> extends Graph<VertexData, EdgeData> {\n\n declare vertices: GeoGraphVertex<VertexData, EdgeData>[];\n declare edges: GeoGraphEdge<VertexData, EdgeData>[];\n\n constructor(vertices?: GeoGraphVertex<VertexData, EdgeData>[], edges?: GeoGraphEdge<VertexData, EdgeData>[], generateVerticesLevels = false) {\n super(vertices, edges);\n generateVerticesLevels && this.generateVerticesLevels();\n }\n\n getVertexByCoords(coords: Coordinates) {\n return GeoGraph.getVertexByCoords(this.vertices, coords);\n }\n\n static getVertexByCoords<VertexData = unknown, EdgeData = unknown>(\n vertices: GeoGraphVertex<VertexData, EdgeData>[],\n coords: Coordinates\n ) {\n return vertices.find(vertex => vertex.coords.equals(coords));\n }\n\n getVertexByName(name: string) {\n return super.getVertexByName(name) as GeoGraphVertex<VertexData, EdgeData> | undefined;\n }\n\n getEdgeByName(name: string) {\n return super.getEdgeByName(name) as GeoGraphEdge<VertexData, EdgeData> | undefined;\n }\n\n getBoundingBox(extendedMeasure?: number) {\n if (!this.vertices.length) {\n return null;\n }\n const boundingBox = BoundingBox.fromCoordinates(this.vertices.map(vertex => vertex.coords)) as BoundingBox;\n if (extendedMeasure) {\n boundingBox.extendsWithMeasure(extendedMeasure);\n }\n return boundingBox;\n }\n\n\n toCompressedJson(): GeoGraphJson {\n return {\n vertices: this.vertices.map(vertex => vertex.toJson()),\n edges: this.edges.map(edge => {\n const vertex1Idx = this.vertices.indexOf(edge.vertex1);\n const vertex2Idx = this.vertices.indexOf(edge.vertex2);\n if (edge.isOneway) {\n return [vertex1Idx, vertex2Idx, edge.level, true];\n }\n if (edge.level !== null) {\n return [vertex1Idx, vertex2Idx, edge.level];\n }\n return [vertex1Idx, vertex2Idx];\n })\n };\n }\n\n\n static fromCompressedJson<VertexData = unknown, EdgeData = unknown>(json: GeoGraphJson) {\n\n const geograph = new GeoGraph<VertexData, EdgeData>();\n\n geograph.vertices = json.vertices.map(vertex => GeoGraphVertex.fromJson<VertexData, EdgeData>(vertex));\n\n geograph.edges = json.edges.map(jsonEdge => {\n const edge = new GeoGraphEdge<VertexData, EdgeData>(\n geograph.vertices[jsonEdge[0]],\n geograph.vertices[jsonEdge[1]],\n { level: jsonEdge.length > 2 ? jsonEdge[2] : null }\n );\n if (jsonEdge.length > 3 && jsonEdge[3]) {\n edge.isOneway = true;\n }\n return edge;\n });\n\n return geograph;\n }\n\n\n static fromCoordinates<VertexData = unknown, EdgeData = unknown>(segments: Coordinates[][]) {\n\n const geograph = new GeoGraph<VertexData, EdgeData>();\n\n const getOrCreateVertex = (coords: Coordinates) => {\n const vertex = geograph.vertices.find(otherVertex => otherVertex.coords.equals(coords));\n if (vertex) {\n return vertex;\n }\n const newVertex = new GeoGraphVertex<VertexData, EdgeData>(coords);\n geograph.vertices.push(newVertex);\n return newVertex;\n };\n\n\n const createEdgeFromVertices = (\n vertex1: GeoGraphVertex<VertexData, EdgeData>,\n vertex2: GeoGraphVertex<VertexData, EdgeData>\n ) =>\n new GeoGraphEdge(\n vertex1,\n vertex2,\n { level: Level.union(vertex1.coords.level, vertex2.coords.level) }\n );\n\n for (const segment of segments) {\n\n let previousVertex = null;\n for (const coords of segment) {\n const currentVertex = getOrCreateVertex(coords);\n\n if (previousVertex) {\n const edge = createEdgeFromVertices(currentVertex, previousVertex);\n geograph.edges.push(edge);\n }\n\n previousVertex = currentVertex;\n }\n }\n\n return geograph;\n }\n\n /**\n * Create edges From MultiLevel Itinerary for a given level\n * @param useMultiLevelEdges use segments which intersect both levels (stairs, elevators...)\n */\n getEdgesAtLevel(targetLevel: Level_t, useMultiLevelEdges = true) {\n return this.edges.filter(\n ({ level }) => useMultiLevelEdges\n ? Level.intersect(targetLevel, level)\n : Level.contains(targetLevel, level)\n );\n }\n\n\n generateVerticesLevels() {\n\n const { vertices } = this;\n\n vertices.forEach(vertex => vertex.inferVertexLevelFromEdges());\n\n // In some cases, vertex levels cannot be retrieve just using adjacent edges\n // (e.g stairs without network at one of its bounds)\n // To infer this vertex level, we use inferVertexLevelByRecursion()\n vertices.forEach(vertex => vertex.inferVertexLevelByNeighboors());\n vertices.forEach(vertex => vertex.inferVertexLevelByRecursion());\n\n // Finally define vertices that are links between indoor and outdoor\n // Set vertex.io to true for vertices that make the link between\n // indoor and outdoor edges\n vertices.forEach(vertex => {\n vertex.io = vertex.coords.level !== null\n && vertex.edges.some(edge => edge.level === null);\n });\n }\n}\n\nexport default GeoGraph;\n","import Coordinates from '../coordinates/Coordinates.js';\nimport UserPosition from '../coordinates/UserPosition.js';\nimport GeoGraphEdge from './GeoGraphEdge.js';\nimport GeoGraphVertex from './GeoGraphVertex.js';\n\nclass GeoGraphProjection<VertexData = unknown, EdgeData = unknown, U extends Coordinates | UserPosition = Coordinates> {\n\n origin: U;\n distanceFromNearestElement: number;\n coords: U;\n nearestElement: GeoGraphVertex<VertexData, EdgeData> | GeoGraphEdge<VertexData, EdgeData>;\n\n constructor(origin: U, distanceFromNearestElement: number,\n coords: U, nearestElement: GeoGraphVertex<VertexData, EdgeData> | GeoGraphEdge<VertexData, EdgeData>\n ) {\n this.origin = origin;\n this.distanceFromNearestElement = distanceFromNearestElement;\n this.coords = coords;\n this.nearestElement = nearestElement;\n }\n\n}\n\nexport default GeoGraphProjection;\n","import { diffAngleLines } from '@wemap/maths';\n\nimport Coordinates from '../coordinates/Coordinates.js';\nimport UserPosition from '../coordinates/UserPosition.js';\nimport Level from '../coordinates/Level.js';\n\nimport GeoGraph from './GeoGraph.js';\nimport GeoGraphEdge from './GeoGraphEdge.js';\nimport GeoGraphVertex from './GeoGraphVertex.js';\nimport GeoGraphProjection from './GeoGraphProjection.js';\nimport { EPS_MM } from '../Constants.js';\n\nclass GeoGraphProjectionHandler<VertexData = unknown, EdgeData = unknown> {\n\n graph: GeoGraph<VertexData, EdgeData> | null = null;\n\n private _maxDistance = Number.MAX_VALUE;\n private _maxAngleBearing = Math.PI;\n\n constructor(graph: GeoGraph<VertexData, EdgeData> | null = null) {\n this.graph = graph;\n }\n\n set maxAngleBearing(maxAngleBearing) {\n this._maxAngleBearing = maxAngleBearing;\n }\n\n get maxAngleBearing() {\n return this._maxAngleBearing;\n }\n\n set maxDistance(maxDistance) {\n this._maxDistance = maxDistance;\n }\n\n get maxDistance() {\n return this._maxDistance;\n }\n\n\n /**\n * Check if the specified edge and its nodes can be used for projection\n * @returns 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(\n edge: GeoGraphEdge<VertexData, EdgeData>,\n location: Coordinates | UserPosition,\n useBearing: boolean,\n useMultiLevelSegments: boolean,\n acceptEdgeFn: (edge: GeoGraphEdge<VertexData, EdgeData>) => boolean) {\n\n // ignore projections if edge is not accepted\n if (!acceptEdgeFn(edge)) {\n return [false, false, false];\n }\n\n // First, check if levels intersects\n let checkEdge = Level.intersect(location.level, edge.level);\n let checkNode1 = Level.intersect(location.level, edge.vertex1.coords.level);\n let checkNode2 = Level.intersect(location.level, edge.vertex2.coords.level);\n\n // Second, in case of IO nodes, accept matching if location's level is null\n checkNode1 = checkNode1 || edge.vertex1.io && location.level === null;\n checkNode2 = checkNode2 || edge.vertex2.io && location.level === null;\n\n // Third, check if level is a range if useMultiLevelSegments is false\n if (!useMultiLevelSegments) {\n checkEdge = checkEdge && !Level.isRange(edge.level);\n checkNode1 = checkNode1 && !Level.isRange(edge.vertex1.coords.level);\n checkNode2 = checkNode2 && !Level.isRange(edge.vertex2.coords.level);\n }\n\n // Finally, check edges bearing if option is used\n if (useBearing) {\n if (checkEdge) {\n // condition for optimisation\n const diffAngle = diffAngleLines(edge.bearing, (location as UserPosition).bearing as number);\n if (diffAngle > this._maxAngleBearing) {\n // Do not try to project if angle is greater than the threshold\n checkEdge = false;\n }\n }\n // if mapmatching bearing is enabled do not use nodes matching\n checkNode1 = false;\n checkNode2 = false;\n }\n\n return [checkEdge, checkNode1, checkNode2];\n }\n\n\n static _assignLatLngLevel(fromCoordinates: Coordinates, toCoordinates: Coordinates) {\n toCoordinates.lat = fromCoordinates.lat;\n toCoordinates.lng = fromCoordinates.lng;\n toCoordinates.level = Level.clone(fromCoordinates.level);\n }\n\n /**\n * IO Nodes are typical because they have a non-null level but projection car works on them.\n * This function handles the case where the projection is on an IO node and a location with\n * a null level is required.\n */\n static _handleLevelsWithIONodes(projection: Coordinates, location: Coordinates, projectionNode: GeoGraphVertex) {\n if (location.level === null && projectionNode.io) {\n projection.level = null;\n }\n }\n\n static _updateProjectionLevelFromEdge = (_edge: GeoGraphEdge, _projection: Coordinates) => {\n _projection.level = Level.clone(_edge.level);\n };\n\n /**\n * Main function for map-matching, the networks have to be set before calling this function\n * The function will returns a GraphProjection object given a coordinates object and a set\n * of options (useDistance, useBearing, useMultiLevelSegments, acceptEdgeFn).\n */\n getProjection<U extends Coordinates | UserPosition>(\n location: U,\n useDistance = false,\n useBearing = false,\n useMultiLevelSegments = true,\n acceptEdgeFn: (edge: GeoGraphEdge<VertexData, EdgeData>) => boolean = () => true\n ) {\n\n if (this.graph === null) {\n throw new Error('Graph has not been set yet');\n }\n\n if (useBearing && (!('bearing' in location && location.bearing !== null) || !this._maxAngleBearing)) {\n // If useBearing is true and bearing is not set in coordinates, return null\n return null;\n }\n\n let distanceFromNearestElement = Number.MAX_VALUE;\n const projection = location.clone() as U;\n let nearestElement = null;\n\n // Define a function to know if a projection is better than the current one\n const isProjectionBetter = (distanceOfNewProjection: number) => {\n return distanceOfNewProjection < distanceFromNearestElement\n && (!useDistance || distanceOfNewProjection <= this._maxDistance);\n };\n\n // Loop on all the network edges\n // Each time a better projection is found (see isProjectionBetter()),\n // the current projection is replaced\n for (const edge of this.graph.edges) {\n\n // Check if the specified edge and its nodes can be used for projection. See the\n // documentation of the corresponding function for more information.\n const [checkEdge, checkNode1, checkNode2] = this._shouldProjectOnEdgeAndNodes(\n edge, location, useBearing, useMultiLevelSegments, acceptEdgeFn);\n\n if (checkNode1) {\n\n const distNode1 = location.distanceTo(edge.vertex1.coords);\n if (isProjectionBetter(distNode1) || distNode1 <= EPS_MM) {\n distanceFromNearestElement = distNode1;\n nearestElement = edge.vertex1 as typeof this.graph.vertices[0];\n GeoGraphProjectionHandler._assignLatLngLevel(edge.vertex1.coords, projection as Coordinates);\n GeoGraphProjectionHandler._handleLevelsWithIONodes(projection as Coordinates, location, edge.vertex1);\n\n if (distNode1 <= EPS_MM) {\n break;\n }\n }\n }\n\n if (checkNode2) {\n\n const distNode2 = location.distanceTo(edge.vertex2.coords);\n if (isProjectionBetter(distNode2) || distNode2 <= EPS_MM) {\n distanceFromNearestElement = distNode2;\n nearestElement = edge.vertex2 as typeof this.graph.vertices[0];\n GeoGraphProjectionHandler._assignLatLngLevel(edge.vertex2.coords, projection as Coordinates);\n GeoGraphProjectionHandler._handleLevelsWithIONodes(projection as Coordinates, location, edge.vertex2);\n\n if (distNode2 <= EPS_MM) {\n break;\n }\n }\n }\n\n if (checkEdge) {\n const segmentProjection = location.getSegmentProjection(edge.vertex1.coords, edge.vertex2.coords);\n if (segmentProjection) {\n const distEdge = location.distanceTo(segmentProjection);\n if (isProjectionBetter(distEdge)) {\n distanceFromNearestElement = distEdge;\n nearestElement = edge;\n GeoGraphProjectionHandler._assignLatLngLevel(segmentProjection, projection as Coordinates);\n GeoGraphProjectionHandler._updateProjectionLevelFromEdge(edge, projection as Coordinates);\n }\n }\n }\n }\n\n\n if (!nearestElement) {\n return null;\n }\n\n if (projection instanceof UserPosition && projection.accuracy !== null) {\n projection.accuracy += distanceFromNearestElement;\n }\n\n return new GeoGraphProjection(\n location,\n distanceFromNearestElement,\n projection,\n nearestElement\n );\n }\n\n}\n\nexport default GeoGraphProjectionHandler;\n","import Logger from '@wemap/logger';\n\nimport Coordinates from '../coordinates/Coordinates.js';\nimport GeoGraph from './GeoGraph.js';\nimport GeoGraphEdge from './GeoGraphEdge.js';\nimport GeoGraphVertex from './GeoGraphVertex.js';\n\n\n/**\n * GeoGraphItinerary is an oriented graph\n */\nclass GeoGraphItinerary<VertexData = unknown, EdgeData = unknown> extends GeoGraph<VertexData, EdgeData> {\n\n protected constructor(\n public start: Coordinates,\n public end: Coordinates,\n vertices: GeoGraphVertex<VertexData, EdgeData>[],\n edges: GeoGraphEdge<VertexData, EdgeData>[],\n public edgesWeights: number[]\n ) {\n super(vertices, edges);\n }\n\n static fromGraphVertices<VertexData = unknown, EdgeData = unknown>(\n start: Coordinates,\n end: Coordinates,\n networkVertices: GeoGraphVertex<VertexData, EdgeData>[],\n edgesWeights: number[]\n ) {\n\n const vertices = networkVertices.map(vertex => {\n return new GeoGraphVertex<VertexData, EdgeData>(vertex.coords.clone(),\n { name: vertex.name, id: vertex.id, data: vertex.data, io: vertex.io }\n );\n });\n\n const edges: GeoGraphEdge<VertexData, EdgeData>[] = [];\n networkVertices.forEach((vertex, idx, arr) => {\n if (idx === 0) {\n return;\n }\n\n // Retrieve network edge\n const prevVertex = arr[idx - 1];\n const edge = GeoGraphEdge.getEdgeByVertices(prevVertex.edges, prevVertex, vertex);\n\n if (!edge) {\n Logger.error('Cannot retrieve edge to create itinerary');\n return;\n }\n\n edges.push(new GeoGraphEdge<VertexData, EdgeData>(vertices[idx - 1], vertices[idx],\n { name: edge.name, id: edge.id, data: edge.data, level: edge.level, isOneway: edge.isOneway }\n ));\n });\n\n return new GeoGraphItinerary(start, end, vertices, edges, edgesWeights);\n }\n}\n\nexport default GeoGraphItinerary;\n","import Coordinates from '../coordinates/Coordinates.js';\nimport GeoGraphVertex from './GeoGraphVertex.js';\n\nclass NoRouteFoundError extends Error {\n\n constructor(\n public start: GeoGraphVertex | Coordinates,\n public end: GeoGraphVertex | Coordinates,\n public details: string | null = null\n ) { super(); }\n\n get startStr() {\n if (this.start instanceof GeoGraphVertex) {\n return `GraphNode ${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 GeoGraphVertex) {\n return `GraphNode ${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 Coordinates from '../coordinates/Coordinates.js';\nimport Level from '../coordinates/Level.js';\n\nimport GeoGraph from './GeoGraph.js';\nimport GeoGraphVertex from './GeoGraphVertex.js';\nimport GeoGraphEdge from './GeoGraphEdge.js';\nimport GeoGraphProjectionHandler from './GeoGraphProjectionHandler.js'\n\nimport NoRouteFoundError from './NoRouteFoundError.js';\nimport GeoGraphItinerary from './GeoGraphItinerary.js';\n\nexport type GeoGraphRouterOptions<VertexData = unknown, EdgeData = unknown> = {\n projectionMaxDistance: number; // in meters\n weightEdgeFn: (edge: GeoGraphEdge<VertexData, EdgeData>) => number;\n acceptEdgeFn?: (edge: GeoGraphEdge<VertexData, EdgeData>) => boolean;\n}\n\nconst DEFAULT_OPTIONS = {\n projectionMaxDistance: 50,\n weightEdgeFn: (edge: GeoGraphEdge) => edge.length,\n acceptEdgeFn: () => true\n}\n\nclass GeoGraphRouter<VertexData = unknown, EdgeData = unknown> {\n\n static DEFAULT_OPTIONS = DEFAULT_OPTIONS;\n\n _mapMatching: GeoGraphProjectionHandler<VertexData, EdgeData>;\n _graph: GeoGraph<VertexData, EdgeData>;\n disabledEdges: Set<GeoGraphEdge<VertexData, EdgeData>> = new Set();\n\n constructor(graph: GeoGraph<VertexData, EdgeData>) {\n this._graph = graph;\n this._mapMatching = new GeoGraphProjectionHandler(graph);\n }\n\n getShortestPath(\n start: GeoGraphVertex<VertexData, EdgeData> | Coordinates,\n end: GeoGraphVertex<VertexData, EdgeData> | Coordinates,\n options: GeoGraphRouterOptions<VertexData, EdgeData> = DEFAULT_OPTIONS\n ) {\n\n const { acceptEdgeFn, weightEdgeFn, projectionMaxDistance } = options;\n this._mapMatching.maxDistance = projectionMaxDistance;\n\n const createdVertices: GeoGraphVertex<VertexData, EdgeData>[] = [];\n\n const retrieveOrCreateNearestVertex = (point: GeoGraphVertex<VertexData, EdgeData> | Coordinates) => {\n if (point instanceof GeoGraphVertex) {\n return point;\n }\n\n const closeVertex = this._graph.getVertexByCoords(point);\n if (closeVertex) {\n return closeVertex;\n }\n\n const proj = this._mapMatching.getProjection(point, true, false, false, acceptEdgeFn);\n if (!proj) {\n let message = `Point ${point.toString()} is too far from the graph `\n + `> ${this._mapMatching.maxDistance.toFixed(0)} meters.`;\n if (point.level !== null) {\n message += ' If it is a multi-level map, please verify if you have'\n + ` a graph at level ${Level.toString(point.level)}.`;\n }\n throw new NoRouteFoundError(start, end, message);\n }\n if (proj.nearestElement instanceof GeoGraphVertex) {\n return proj.nearestElement;\n }\n // if (proj.nearestElement instanceof Edge)\n const vertexCreated = this.createVertexInsideEdge(\n proj.nearestElement,\n proj.coords\n );\n createdVertices.push(vertexCreated);\n return vertexCreated;\n };\n\n const removeCreatedVertices = () => {\n while (createdVertices.length) {\n this.removeVertexFromPreviouslyCreatedEdge(createdVertices.pop() as GeoGraphVertex<VertexData, EdgeData>);\n }\n };\n\n const startVertex = retrieveOrCreateNearestVertex(start);\n const endVertex = retrieveOrCreateNearestVertex(end);\n\n\n const startCoords = start instanceof GeoGraphVertex ? start.coords : start;\n const endCoords = end instanceof GeoGraphVertex ? end.coords : end;\n\n let graphItinerary;\n if (startVertex === endVertex) {\n graphItinerary = GeoGraphItinerary.fromGraphVertices(\n startCoords, endCoords, [startVertex], []\n );\n } else {\n graphItinerary = this.getShortestPathBetweenGeoGraphVertices(\n startVertex,\n endVertex,\n weightEdgeFn,\n acceptEdgeFn\n );\n }\n\n // In the case of start or end are not a vertex, graphItinerary.start/end are first vertex or \n // last vertex. We have to override their values.\n graphItinerary.start = startCoords;\n graphItinerary.end = endCoords;\n\n removeCreatedVertices();\n\n if (!graphItinerary.vertices.length) {\n throw new NoRouteFoundError(start, end);\n }\n\n return graphItinerary;\n\n }\n\n createVertexInsideEdge(edge: GeoGraphEdge<VertexData, EdgeData>, point: Coordinates) {\n const a = edge.vertex1;\n const b = edge.vertex2;\n\n const m = new GeoGraphVertex<VertexData, EdgeData>(point, { name: `proj on ${edge.name || null} (tmp)` });\n\n const newEdgesParams = { name: `splitted ${edge.name || null} (tmp)`, data: edge.data, isOneway: edge.isOneway, level: edge.level };\n const u = new GeoGraphEdge<VertexData, EdgeData>(a, m, newEdgesParams);\n const v = new GeoGraphEdge<VertexData, EdgeData>(m, b, newEdgesParams);\n\n a.edges = a.edges.filter(_edge => _edge !== edge);\n b.edges = b.edges.filter(_edge => _edge !== edge);\n\n this._graph.vertices.push(m);\n this._graph.edges.push(u, v);\n\n this._graph.edges = this._graph.edges.filter(\n _edge => _edge !== edge\n );\n\n return m;\n }\n\n removeVertexFromPreviouslyCreatedEdge(_vertex: GeoGraphVertex<VertexData, EdgeData>) {\n const u = _vertex.edges[0];\n const v = _vertex.edges[1];\n\n u.vertex1.edges = u.vertex1.edges.filter(edge => edge !== u);\n v.vertex1.edges = v.vertex1.edges.filter(edge => edge !== v);\n\n const oldEdgeName = u.name!.substring('splitted '.length, u.name!.length - ' (tmp)'.length);\n const oldEdgeParams = { name: oldEdgeName, data: u.data, isOneway: u.isOneway, level: u.level };\n const oldEdge = new GeoGraphEdge<VertexData, EdgeData>(u.vertex1, v.vertex2, oldEdgeParams);\n this._graph.edges.push(oldEdge);\n\n this._graph.vertices = this._graph.vertices.filter(vertex => vertex !== _vertex);\n this._graph.edges = this._graph.edges.filter(\n edge => edge !== u && edge !== v\n );\n }\n\n getShortestPathBetweenGeoGraphVertices(\n start: GeoGraphVertex<VertexData, EdgeData>,\n end: GeoGraphVertex<VertexData, EdgeData>,\n weightFn: (edge: GeoGraphEdge<VertexData, EdgeData>) => number,\n acceptEdgeFn?: (edge: GeoGraphEdge<VertexData, EdgeData>) => boolean\n ) {\n\n const distanceMap: { [key: number]: number } = {},\n checking: { [key: number]: null | number } = {},\n vertexList: { [key: number]: boolean } = {},\n vertices: { [key: number]: GeoGraphVertex } = {},\n parentVertices: { [key: number]: number } = {},\n path = [];\n\n // Initially, we assume each vertex is unreachable\n this._graph.vertices.forEach(vertex => {\n\n // Generate Unique Router Id\n vertices[vertex.id] = vertex;\n distanceMap[vertex.id] = Infinity;\n checking[vertex.id] = null;\n vertexList[vertex.id] = true;\n });\n\n // The cost from the starting vertex to the starting vertex is 0\n distanceMap[start.id] = 0;\n\n // check each vertex\n while (Object.keys(vertexList).length > 0) {\n const keys = Object.keys(vertexList).map(Number);\n const current = Number(\n keys.reduce((_checking, vertexId) => {\n return distanceMap[_checking] > distanceMap[vertexId]\n ? vertexId\n : _checking;\n }, keys[0])\n );\n\n // all the vertices accessible from current vertex\n this._graph.edges\n .filter(edge => {\n\n if (acceptEdgeFn && !acceptEdgeFn(edge) || this.disabledEdges.has(edge)) {\n return false;\n }\n\n const from = edge.vertex1.id,\n to = edge.vertex2.id;\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.vertex1.id === current) {\n to = edge.vertex2.id;\n from = edge.vertex1.id;\n } else {\n to = edge.vertex1.id;\n from = edge.vertex2.id;\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.id;\n while (typeof parentVertices[endId] !== 'undefined') {\n path.unshift(vertices[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 // This clone the itinerary and temporary vertices\n return GeoGraphItinerary.fromGraphVertices(start.coords, end.coords, path, edgesWeights);\n }\n}\nexport default GeoGraphRouter;\n"],"names":["str","wrap","deg2rad","rad2deg","Quaternion","Vector3","positiveMod","coords","Rotations","window","undefined","regexes","ua","module","exports","this","__defProp","__defNormalProp","__publicField","diffAngleLines","Logger"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/Constants.ts","../src/coordinates/Level.ts","../src/coordinates/Coordinates.ts","../src/coordinates/UserPosition.ts","../src/Utils.ts","../src/coordinates/BoundingBox.ts","../src/coordinates/RelativePosition.ts","../src/coordinates/GeoRelativePosition.ts","../src/coordinates/GeoRef.ts","../src/rotations/Attitude.ts","../src/rotations/AbsoluteHeading.ts","../src/graph/GeoGraphEdge.ts","../src/graph/GeoGraphVertex.ts","../src/graph/GeoGraph.ts","../src/graph/GeoGraphProjection.ts","../src/graph/GeoGraphProjectionHandler.ts","../src/graph/GeoGraphItinerary.ts","../src/graph/NoRouteFoundError.ts","../src/graph/GeoGraphRouter.ts"],"sourcesContent":["export const R_MAJOR = 6378137.0;\nexport const R_MINOR = 6356752.3142;\nexport const EARTH_GRAVITY = 9.80665;\n\n/**\n * latitude and longitude epsilon in degrees\n * 1e-8° correspond to ~1mm at latitude = 0\n */\nexport const EPS_DEG_MM = 1e-8;\n\n/**\n * epsilon in meters which corresponds to 1 millimeter\n */\nexport const EPS_MM = 1e-3;\n\n\nexport const ELLIPSOID_FLATNESS = (R_MAJOR - R_MINOR) / R_MAJOR;\n\nexport const ECCENTRICITY = Math.sqrt(ELLIPSOID_FLATNESS * (2 - ELLIPSOID_FLATNESS));\nexport const ECCENTRICITY_2 = ECCENTRICITY * ECCENTRICITY;\n\nexport const R_MAJOR_2 = R_MAJOR * R_MAJOR;\nexport const R_MAJOR_4 = R_MAJOR_2 * R_MAJOR_2;\nexport const R_MINOR_2 = R_MINOR * R_MINOR;\nexport const R_MINOR_4 = R_MINOR_2 * R_MINOR_2;\nexport const CIRCUMFERENCE = R_MAJOR * 2 * Math.PI;\n","import { Level_t } from \"../types\";\n\n/**\n * A Level is the representation of a building floor number\n * A level can be a simple number or a range (low, up)\n * The range is an array of two numbers\n */\nclass Level {\n\n static VERIFY_TYPING = false;\n\n static checkType(level: Level_t) {\n if (level === null) {\n return;\n }\n if (typeof level === 'number' && !isNaN(level)) {\n return;\n }\n if (Array.isArray(level) && level.length === 2) {\n const [low, up] = level;\n if (typeof low === 'number' && !isNaN(low)\n && typeof up === 'number' && !isNaN(up)) {\n if (low > up || low === up) {\n throw Error(`Invalid level range: [${low}, ${up}]`);\n }\n return;\n }\n }\n throw Error(`Unknown level format: ${level}`);\n }\n\n /**\n * Return true if the level is a range, false otherwise\n */\n static isRange(level: Level_t): level is [number, number] {\n if (Level.VERIFY_TYPING) {\n this.checkType(level);\n }\n return Array.isArray(level);\n }\n\n static clone(level: Level_t): Level_t {\n if (Level.VERIFY_TYPING) {\n this.checkType(level);\n }\n if (level === null) {\n return null;\n }\n if (typeof level === 'number') {\n return level;\n }\n\n return [level[0], level[1]];\n }\n\n /**\n * Create a level from a string (eg. 1, -2, 1;2, -2;3, 2;-1, 0.5;1 ...)\n */\n static fromString(str: string | null): Level_t {\n\n if (str === null) {\n return null;\n }\n\n if (typeof str !== 'string' || !str.length) {\n throw Error(`argument must be a non empty string, got ${typeof str}`);\n }\n\n if (!isNaN(Number(str))) {\n return parseFloat(str);\n }\n\n const splited = str.split(';');\n if (splited.length > 1) {\n const levels = splited.map(str => Number(str));\n const low = Math.min(...levels);\n const up = Math.max(...levels);\n this.checkType([low, up]);\n return [low, up];\n } else {\n const rangeSeparator = str.substring(1).indexOf('-') + 1;\n if (rangeSeparator > 0) {\n const low = Number(str.substring(0, rangeSeparator));\n const up = Number(str.substring(rangeSeparator + 1));\n this.checkType([low, up]);\n return [low, up];\n }\n }\n\n throw Error(`Cannot parse following level: ${str}`);\n }\n\n\n /**\n * Returns if a level is contained in another\n * @param {null|number|[number, number]} container The container level\n * @param {null|number|[number, number]} targeted The targeted level\n */\n static contains(container: Level_t, targeted: Level_t): boolean {\n if (Level.VERIFY_TYPING) {\n this.checkType(container);\n this.checkType(targeted);\n }\n\n // Covers null and number\n if (container === targeted) {\n return true;\n }\n\n if (Array.isArray(container)) {\n if (Array.isArray(targeted)) {\n return container[0] <= targeted[0] && container[1] >= targeted[1];\n }\n if (targeted === null) {\n return false;\n }\n return container[0] <= targeted && container[1] >= targeted;\n }\n if (container === null || targeted === null) {\n return false;\n }\n return container <= (targeted as [number, number])[0]\n && container >= (targeted as [number, number])[1];\n }\n\n /**\n * Retrieve the intersection of two levels\n */\n static intersection(first: Level_t, second: Level_t): Level_t {\n\n if (Level.VERIFY_TYPING) {\n this.checkType(first);\n this.checkType(second);\n }\n\n if (first === null || second === null) {\n return null;\n }\n\n if (this.equals(first, second)) {\n return this.clone(first);\n }\n\n if (typeof first === 'number' && typeof second === 'number') {\n return first === second ? first : null;\n }\n\n if (Array.isArray(first) && !Array.isArray(second)) {\n if (this.contains(first, second)) {\n return second;\n }\n return null;\n }\n if (!Array.isArray(first) && Array.isArray(second)) {\n if (this.contains(second, first)) {\n return first;\n }\n return null;\n }\n\n // There are two ranges\n const low = Math.max((first as [number, number])[0], (second as [number, number])[0]);\n const up = Math.min((first as [number, number])[1], (second as [number, number])[1]);\n if (up === low) {\n return up;\n }\n return up < low ? null : [low, up];\n }\n\n /**\n * Retrieve the intersection of two levels\n * @param {null|number|[number, number]} first The first level\n * @param {null|number|[number, number]} second The second level\n * @returns {boolean}\n */\n static intersect(first: Level_t, second: Level_t): boolean {\n\n if (Level.VERIFY_TYPING) {\n this.checkType(first);\n this.checkType(second);\n }\n\n if (first === null && second === null) {\n return true;\n }\n\n return this.intersection(first, second) !== null;\n }\n\n /**\n * Retrieve the union of two levels\n */\n static union(first: Level_t, second: Level_t): Level_t {\n\n if (Level.VERIFY_TYPING) {\n this.checkType(first);\n this.checkType(second);\n }\n\n if (first === second) {\n return this.clone(first);\n }\n\n if (second === null) {\n return this.clone(first);\n }\n\n if (first === null) {\n return this.clone(second);\n }\n\n let low, up;\n if (!Array.isArray(first) && !Array.isArray(second)) {\n low = Math.min(first, second);\n up = Math.max(first, second);\n } else if (Array.isArray(first) && !Array.isArray(second)) {\n low = Math.min(first[0], second);\n up = Math.max(first[1], second);\n } else if (!Array.isArray(first) && Array.isArray(second)) {\n low = Math.min(second[0], first);\n up = Math.max(second[1], first);\n } else {\n /* if (Array.isArray(first) && Array.isArray(second)) */\n low = Math.min((first as [number, number])[0], (second as [number, number])[0]);\n up = Math.max((first as [number, number])[1], (second as [number, number])[1]);\n }\n\n if (low === up) {\n return low;\n }\n return [low, up];\n }\n\n /**\n * Multiply a level by a factor\n * @param {null|number|[number, number]} level the level to multiply\n * @param {number} factor\n * @returns {null|number|[number, number]}\n */\n static multiplyBy(level: Level_t, factor: number): Level_t {\n if (Level.VERIFY_TYPING) {\n this.checkType(level);\n }\n\n if (level === null) {\n return null;\n }\n\n return Array.isArray(level) ? [level[0] * factor, level[1] * factor] : level * factor;\n }\n\n static toString(level: Level_t): string | null {\n if (Level.VERIFY_TYPING) {\n this.checkType(level);\n }\n if (level === null) {\n return null;\n }\n return Array.isArray(level) ? level[0] + ';' + level[1] : String(level);\n }\n\n static equals(first: Level_t, second: Level_t): boolean {\n\n if (Level.VERIFY_TYPING) {\n this.checkType(first);\n this.checkType(second);\n }\n\n if (first === second) {\n return true;\n }\n\n if (Array.isArray(first) && Array.isArray(second)) {\n return first[0] === second[0] && first[1] === second[1];\n }\n\n return false;\n }\n\n\n static diff(first: Level_t, second: Level_t): null | number {\n\n if (Level.VERIFY_TYPING) {\n this.checkType(first);\n this.checkType(second);\n }\n\n if (first === null || second === null) {\n return null;\n }\n\n if (!Array.isArray(first) && !Array.isArray(second)) {\n return second - first;\n }\n\n if (Array.isArray(first) && !Array.isArray(second)) {\n if (first[0] === second) {\n return second - first[1];\n }\n if (first[1] === second) {\n return second - first[0];\n }\n return null;\n }\n\n if (Array.isArray(second) && !Array.isArray(first)) {\n if (first === second[0]) {\n return second[1] - first;\n }\n if (first === second[1]) {\n return second[0] - first;\n }\n return null;\n }\n\n if (Level.equals(first, second)) {\n return 0;\n }\n\n return null;\n }\n}\n\nexport default Level;\n","import {\n deg2rad, Vector3, Quaternion, rad2deg, wrap, Vector3_t, Quaternion_t\n} from '@wemap/maths';\nimport { EPS_DEG_MM, EPS_MM, R_MAJOR } from '../Constants.js';\n\nimport { CoordinatesCompressedJson, CoordinatesJson, Level_t } from '../types.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 private _lat!: number;\n private _lng!: number;\n private _alt: number | null = null;\n private _level: Level_t | null = null;\n\n private _ecef: Vector3_t | null;\n\n autoWrap = true;\n\n constructor(lat: number, lng: number, alt: number | null = null, level: Level_t | null = null) {\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 set lat(lat: number) {\n if (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 get latitude() {\n return this._lat;\n }\n\n set latitude(_) {\n throw new Error('Please use Coordinates#lat setter instead of Coordinate#latitude');\n }\n\n get lng() {\n return this._lng;\n }\n\n set lng(lng) {\n this._lng = lng;\n if (this.autoWrap) {\n this.wrap();\n }\n this._ecef = null;\n }\n\n get longitude() {\n return this._lng;\n }\n\n set longitude(_) {\n throw new Error('Please use Coordinates#lng setter instead of Coordinate#longitude');\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 set alt(alt) {\n this._alt = alt;\n this._ecef = null;\n }\n\n get level() {\n return this._level;\n }\n\n set level(level) {\n Level.checkType(level);\n this._level = level;\n }\n\n /**\n * Deep clone coordinates\n */\n clone() {\n const output = new Coordinates(this.lat, this.lng, this.alt);\n if (this.level !== null) {\n output.level = Level.clone(this.level);\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 static equals(pos1: Coordinates | null, pos2: Coordinates | null, eps = EPS_DEG_MM, epsAlt = 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.equals(pos1.level, pos2.level);\n }\n\n equals(other: Coordinates) {\n return Coordinates.equals(this, other);\n }\n\n /**\n * @throws {Error} if elevation is defined and point altitude is not defined\n */\n destinationPoint(distance: number, bearing: number, elevation: number | null = null) {\n const newPoint = this.clone();\n newPoint.move(distance, bearing, elevation);\n return newPoint;\n }\n\n /**\n * Source: http://www.movable-type.co.uk/scripts/latlong.html#destPoint\n * @throws {Error} if elevation is defined and point altitude is not defined\n */\n move(distance: number, bearing: number, elevation: number | null = null) {\n\n const dR = distance / 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 (elevation !== null) {\n if (this.alt === null) {\n throw new Error('Point altitude is not defined');\n }\n this.alt += elevation;\n }\n\n return this;\n }\n\n /**\n * Returns a distance between two points in meters\n */\n distanceTo(location2: Coordinates) {\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 R_MAJOR * cosn;\n }\n\n static distanceBetween(point1: Coordinates, point2: Coordinates) {\n return point1.distanceTo(point2);\n }\n\n bearingTo(location2: Coordinates) {\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: Coordinates, point2: Coordinates) {\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(): Quaternion_t {\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(): Quaternion_t {\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 /**\n * https://gist.github.com/klucar/1536194\n * Adapted for spherical formula\n */\n get ecef(): Vector3_t {\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 = (R_MAJOR + alt) * Math.cos(lat) * Math.cos(lng);\n const y = (R_MAJOR + alt) * Math.cos(lat) * Math.sin(lng);\n const z = (R_MAJOR + alt) * Math.sin(lat);\n\n this._ecef = [x, y, z];\n }\n\n return this._ecef;\n }\n\n\n static fromECEF(ecef: Vector3_t): Coordinates {\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) - 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 /**\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 */\n getSegmentProjection(p1: Coordinates, p2: Coordinates): Coordinates | null {\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, 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.intersection(p1.level, p2.level));\n\n if (Math.abs((p1.distanceTo(p2) - p1.distanceTo(projection) - p2.distanceTo(projection))) > 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 += ', [' + Level.toString(this._level) + ']';\n }\n str += ']';\n return str;\n }\n\n toJson(): CoordinatesJson {\n return {\n lat: Number(this.lat.toFixed(8)),\n lng: Number(this.lng.toFixed(8)),\n ...(this.alt !== null && { alt: Number(this.alt.toFixed(3)) }),\n ...(this.level !== null && { level: this.level })\n };\n }\n\n static fromJson(json: CoordinatesJson) {\n return new Coordinates(json.lat, json.lng, json.alt, json.level);\n }\n\n\n toCompressedJson(): CoordinatesCompressedJson {\n if (this.level !== null) {\n return [\n Number(this.lat.toFixed(8)),\n Number(this.lng.toFixed(8)),\n this.alt === null ? null : Number(this.alt.toFixed(3)),\n this.level\n ];\n }\n if (this.alt !== null) {\n return [\n Number(this.lat.toFixed(8)),\n Number(this.lng.toFixed(8)),\n Number(this.alt.toFixed(3))\n ];\n }\n return [Number(this.lat.toFixed(8)), Number(this.lng.toFixed(8))];\n }\n\n static fromCompressedJson(json: CoordinatesCompressedJson) {\n const coords = new Coordinates(json[0], json[1]);\n if (json.length > 2) {\n coords.alt = json[2] as null | number;\n }\n if (json.length > 3) {\n coords.level = json[3] as number | [number, number];\n }\n return coords;\n }\n}\n\nexport default Coordinates;\n","import Coordinates from './Coordinates.js';\nimport { Level_t, UserPositionJson } from '../types.js';\nimport { EPS_DEG_MM, EPS_MM } 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 private _time: number | null = null;\n private _accuracy: number | null = null;\n private _bearing: number | null = null;\n\n constructor(\n lat: number, lng: number, alt: number | null = null, level: Level_t = null,\n time: number | null = null, accuracy: number | null = null, bearing: number | null = null\n ) {\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 this._time = time;\n }\n\n\n get accuracy() {\n return this._accuracy;\n }\n\n set accuracy(accuracy) {\n if (accuracy !== null && accuracy < 0) {\n throw new Error('accuracy argument is not a positive number');\n }\n this._accuracy = accuracy;\n }\n\n get bearing() {\n return this._bearing;\n }\n\n set bearing(bearing) {\n this._bearing = bearing !== null ? bearing % (2 * Math.PI) : null;\n }\n\n move(distance: number, bearing: number, elevation: number | null = null) {\n super.move(distance, bearing, elevation);\n return this;\n }\n\n destinationPoint(distance: number, bearing: number, elevation: number | null = null) {\n const newPoint = this.clone();\n newPoint.move(distance, bearing, elevation);\n return newPoint;\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: 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 static equals(pos1: UserPosition | Coordinates | null,\n pos2: UserPosition | Coordinates | null,\n eps = EPS_DEG_MM, epsAlt = EPS_MM\n ) {\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.equals(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 equals(other: UserPosition | Coordinates | null, eps = EPS_DEG_MM, epsAlt = EPS_MM) {\n return UserPosition.equals(this, other, eps, epsAlt);\n }\n\n\n toJson(): UserPositionJson {\n return {\n ...super.toJson(),\n ...(this.time !== null && { time: this.time }),\n ...(this.accuracy !== null && { accuracy: this.accuracy }),\n ...(this.bearing !== null && { bearing: this.bearing })\n };\n }\n\n static fromJson(json: UserPositionJson) {\n const position = UserPosition.fromCoordinates(Coordinates.fromJson(json));\n if (typeof json.time !== 'undefined') {\n position.time = json.time;\n }\n if (typeof json.accuracy !== 'undefined') {\n position.accuracy = json.accuracy;\n }\n if (typeof json.bearing !== 'undefined') {\n position.bearing = json.bearing;\n }\n return position;\n }\n}\n\nexport default UserPosition;\n","/* eslint-disable max-statements */\n\nimport { deg2rad, positiveMod } from '@wemap/maths';\nimport { EPS_MM } from './Constants.js';\n\nimport Coordinates from './coordinates/Coordinates.js';\nimport UserPosition from './coordinates/UserPosition.js';\n\nexport type RouteSample = Coordinates & { bearing: number };\n\n/**\n * Sample a route of Coordinates\n * @param route ordered points\n * @param stepSize step size to sample\n * @param maxLength max route length to sample\n */\nexport function sampleRoute(\n route: Coordinates[],\n stepSize = 0.7,\n startSampling = 0,\n length = Number.MAX_VALUE\n) {\n\n const endSampling = startSampling + length;\n\n const sampledRoute = [];\n\n let lastSample: RouteSample;\n\n let totalDistanceTraveled = 0;\n let distanceToNextSample = 0;\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 = Object.assign(p1.clone(), { bearing: segmentBearing });\n while (distanceTraveledOnSegment + distanceToNextSample < segmentSize\n && totalDistanceTraveled + distanceToNextSample <= endSampling) {\n\n const newPoint = lastSample.destinationPoint(distanceToNextSample, segmentBearing) as RouteSample;\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: Coordinates[], startPosition = route[0], length = Number.MAX_VALUE) {\n\n const newRoute = [];\n let previousPoint: Coordinates | null = null;\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.equals(startPosition, p1)) {\n newRoute.push(p1);\n previousPoint = p1;\n break;\n }\n\n const proj = startPosition.getSegmentProjection(p1, p2);\n if (proj && Coordinates.equals(startPosition, proj) && !proj.equals(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 (previousPoint && 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) <= 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\nexport function simplifyRoute(coords: Coordinates[], precisionAngle = deg2rad(5)) {\n\n const isClosed = (coords[0].equals(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\nexport function geolocationPositionToUserPosition(geolocationPosition: 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\nexport function calcDistance(coords: Coordinates[]) {\n return coords.reduce((acc, coords, idx, arr) =>\n acc + (idx ? arr[idx - 1].distanceTo(coords) : 0), 0);\n}\n","import Coordinates from './Coordinates.js';\n\nclass BoundingBox {\n\n northEast: Coordinates;\n southWest: Coordinates;\n\n constructor(northEast: Coordinates, southWest: Coordinates) {\n this.northEast = northEast;\n this.southWest = southWest;\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 get center(): Coordinates {\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 contains(point: Coordinates): boolean {\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 extend(obj: Coordinates | BoundingBox): BoundingBox {\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 } else {\n throw new Error('Unknown parameter');\n }\n\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 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 */\n extendsWithMeasure(measure: number): BoundingBox {\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 */\n pad(bufferRatio: number): BoundingBox {\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 getSouthWest() {\n return this.southWest;\n }\n\n /**\n * Returns 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 getNorthWest() {\n return new Coordinates(this.getNorth(), this.getWest());\n }\n\n /**\n * Returns 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 getWest() {\n return this.southWest.lng;\n }\n\n /**\n * Returns 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 getEast() {\n return this.northEast.lng;\n }\n\n /**\n * Returns the north edge of the bounding box.\n */\n getNorth() {\n return this.northEast.lat;\n }\n\n static equals(bb1: BoundingBox, bb2: BoundingBox) {\n return Coordinates.equals(bb1.northEast, bb2.northEast)\n && Coordinates.equals(bb1.southWest, bb2.southWest);\n }\n\n equals(other: BoundingBox) {\n return BoundingBox.equals(this, other);\n }\n\n /**\n * Create a BoundingBox from a WSEN array\n */\n static fromArray(bounds: [number, number, number, number]) {\n return new BoundingBox(\n new Coordinates(bounds[3], bounds[2]),\n new Coordinates(bounds[1], bounds[0])\n );\n }\n\n static fromCoordinates(coords: Coordinates[]) {\n if (coords.length === 0) {\n return null;\n }\n return coords.reduce(\n (acc, _coords) => acc.extend(_coords),\n new BoundingBox(coords[0], coords[0])\n );\n }\n\n /**\n * Returns the WSEN array\n */\n toArray(): [number, number, number, number] {\n return [this.getWest(), this.getSouth(), this.getEast(), this.getNorth()];\n }\n}\n\nexport default BoundingBox;\n","import { EPS_MM } from '../Constants.js';\nimport { RelativePositionJson } from '../types.js';\n\nclass RelativePosition {\n\n x: number;\n y: number;\n z: number;\n time: number | null = null;\n private _accuracy: number | null = null;\n private _bearing: number | null = null;\n\n constructor(\n x: number, y: number, z: number,\n time: number | null = null, accuracy: number | null = null, bearing: number | null = null\n ) {\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 accuracy() {\n return this._accuracy;\n }\n\n set accuracy(accuracy) {\n if (accuracy !== null && accuracy < 0) {\n throw new Error('accuracy argument is not a positive number');\n }\n this._accuracy = accuracy;\n }\n\n get bearing() {\n return this._bearing;\n }\n\n set bearing(bearing) {\n this._bearing = bearing !== null ? bearing % (2 * Math.PI) : null;\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 equals(pos1: RelativePosition | null, pos2: RelativePosition | null, eps = 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 equals(other: RelativePosition) {\n return RelativePosition.equals(this, other);\n }\n\n toJson(): RelativePositionJson {\n return {\n x: this.x,\n y: this.y,\n z: this.z,\n ...(this.time !== null && { time: this.time }),\n ...(this.accuracy !== null && { accuracy: this.accuracy }),\n ...(this.bearing !== null && { bearing: this.bearing })\n };\n }\n\n static fromJson(json: RelativePositionJson) {\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 { Quaternion, Vector3, Vector3_t } from '@wemap/maths';\nimport { GeoRefJson } from '../types.js';\n\nimport Coordinates from './Coordinates.js';\n\nclass GeoRef {\n\n origin: Coordinates;\n scale = 1;\n heading = 0;\n\n constructor(origin: Coordinates) {\n this.origin = origin;\n }\n\n /**\n * LocalPosition in ENU frame\n */\n localToWorld(localPosition: Vector3_t) {\n const enuTranslationScaled = Vector3.multiplyScalar(localPosition, this.scale);\n const rotationOffset = Quaternion.fromAxisAngle([0, 0, 1], this.heading);\n const enuToEcefRotationOrigin = Quaternion.multiply(rotationOffset, this.origin.enuToEcefRotation);\n const ecefTranslation = Quaternion.rotate(enuToEcefRotationOrigin, enuTranslationScaled);\n const ecef = Vector3.sum(this.origin.ecef, ecefTranslation);\n return Coordinates.fromECEF(ecef);\n }\n\n /**\n * LocalPosition in ENU frame\n */\n worldToLocal(coords: Coordinates) {\n const rotationOffset = Quaternion.fromAxisAngle([0, 0, 1], -this.heading);\n const ecefToEnuRotationOrigin = Quaternion.multiply(this.origin.ecefToEnuRotation, rotationOffset);\n const ecefTranslation = Vector3.subtract(coords.ecef, this.origin.ecef);\n const ecefTranslationScaled = Vector3.multiplyScalar(ecefTranslation, 1 / this.scale);\n return Quaternion.rotate(ecefToEnuRotationOrigin, ecefTranslationScaled);\n }\n\n toJson(): GeoRefJson {\n return {\n origin: this.origin.toJson(),\n ...(this.scale !== 1 && { scale: this.scale }),\n ...(this.heading !== 0 && { heading: this.heading })\n };\n }\n\n static fromJson(json: GeoRefJson) {\n const geoRef = new GeoRef(Coordinates.fromJson(json.origin));\n geoRef.scale = typeof json.scale !== 'undefined' ? json.scale : 1;\n geoRef.heading = typeof json.heading !== 'undefined' ? json.heading : 0;\n return geoRef;\n }\n}\n\nexport default GeoRef;\n","import {\n Rotations, Quaternion, rad2deg, deg2rad,\n Quaternion_t, EulerAngles_t, EulerAnglesDegrees_t\n} from '@wemap/maths';\nimport { AttitudeJson } from '../types';\n\nclass Attitude {\n\n _quaternion: Quaternion_t = [1, 0, 0, 0];\n _heading: number | null = null;\n _eulerAngles: EulerAngles_t | null = null;\n _time: number | null = null;\n _accuracy: number | null = null;\n\n constructor(quaternion: Quaternion_t,\n time: number | null = null,\n accuracy: number | null = null\n ) {\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 get quaternion() {\n return this._quaternion;\n }\n\n set quaternion(quaternion) {\n if (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 get time() {\n return this._time;\n }\n\n set time(time) {\n this._time = time;\n }\n\n\n get accuracy() {\n return this._accuracy;\n }\n\n set accuracy(accuracy) {\n if (accuracy !== null && (accuracy < 0 || accuracy > Math.PI)) {\n throw new Error('accuracy argument (' + accuracy + ') is not in range [0; PI]');\n }\n this._accuracy = accuracy;\n }\n\n get eulerAngles(): EulerAngles_t {\n if (this._eulerAngles === null) {\n this._eulerAngles = Rotations.quaternionToEulerZXY(this.quaternion);\n }\n return this._eulerAngles;\n }\n\n get eulerAnglesDegrees(): EulerAnglesDegrees_t {\n return this.eulerAngles.map(x => rad2deg(x)) as EulerAnglesDegrees_t;\n }\n\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 get headingDegrees() {\n return rad2deg(this.heading);\n }\n\n\n static equals(att1: Attitude | null, att2: Attitude | null) {\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.equals(att1.quaternion, att2.quaternion);\n }\n\n equals(other: Attitude) {\n return Attitude.equals(this, other);\n }\n\n toJson(): AttitudeJson {\n if (this.time === null && this.accuracy === null) {\n return this.quaternion;\n }\n return {\n q: this.quaternion,\n ...(this.time !== null && { time: this.time }),\n ...(this.accuracy !== null && { accuracy: this.accuracy })\n };\n }\n\n\n static fromJson(json: AttitudeJson) {\n if (Array.isArray(json)) {\n return new Attitude(json, null, null);\n }\n return new Attitude(json.q, json.time, json.accuracy);\n }\n\n\n clone() {\n return new Attitude(this.quaternion.slice(0) as Quaternion_t, this.time, this.accuracy);\n }\n\n /**\n * Calculate the relative attitude between two given attitudes\n */\n static diff(attitudeStart: Attitude, attitudeEnd: Attitude) {\n\n const quaternionDiff = Quaternion.multiply(\n Quaternion.inverse(attitudeStart.quaternion),\n attitudeEnd.quaternion\n );\n\n let timeDiff = null;\n if (attitudeEnd.time !== null && attitudeStart.time !== null) {\n timeDiff = attitudeEnd.time - attitudeStart.time;\n }\n\n let accuracyDiff = null;\n if (attitudeStart.accuracy !== null && attitudeEnd.accuracy !== null) {\n // Approximation\n accuracyDiff = Math.max(attitudeEnd.accuracy - attitudeStart.accuracy);\n }\n\n return new Attitude(quaternionDiff, timeDiff, accuracyDiff);\n }\n}\n\nexport default Attitude;\n","import { Quaternion } from '@wemap/maths';\nimport { AbsoluteHeadingJson } from '../types.js';\n\nimport Attitude from './Attitude.js';\n\nclass AbsoluteHeading {\n\n heading: number;\n time: number | null = null;\n private _accuracy: number | null = null;\n\n constructor(heading: number,\n time: number | null = null,\n accuracy: number | null = null\n ) {\n this.heading = heading;\n this.time = time;\n this.accuracy = accuracy;\n }\n\n\n get accuracy() {\n return this._accuracy;\n }\n\n set accuracy(accuracy) {\n if (accuracy !== null && (accuracy < 0 || accuracy > Math.PI)) {\n throw new Error('accuracy argument (' + accuracy + ') is not in range [0; PI]');\n }\n this._accuracy = accuracy;\n }\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 equals(heading1: AbsoluteHeading | null, heading2: AbsoluteHeading | null) {\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 equals(other: AbsoluteHeading | null) {\n return AbsoluteHeading.equals(this, other);\n }\n\n toJson(): AbsoluteHeadingJson {\n return {\n heading: this.heading,\n ...(this.time !== null && { time: this.time }),\n ...(this.accuracy !== null && { accuracy: this.accuracy })\n };\n }\n\n static fromJson(json: AbsoluteHeadingJson) {\n return new AbsoluteHeading(json.heading, json.time, json.accuracy);\n }\n\n clone() {\n return new AbsoluteHeading(this.heading, this.time, this.accuracy);\n }\n}\n\nexport default AbsoluteHeading;\n","import { GraphEdge } from '@wemap/utils';\n\nimport Level from '../coordinates/Level.js';\nimport GeoGraphVertex from './GeoGraphVertex.js';\nimport { Level_t } from '../types.js';\n\n/**\n * An Edge is a segment composed of two Vertex\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 GeoGraphEdge<VertexData = unknown, EdgeData = unknown> extends GraphEdge<VertexData, EdgeData> {\n\n declare protected _vertex1: GeoGraphVertex<VertexData, EdgeData>;\n declare protected _vertex2: GeoGraphVertex<VertexData, EdgeData>;\n\n private _level: Level_t = null;\n\n private _bearing: number | null = null;\n private _length: number | null = null;\n\n private _computedSizeAndBearing = false;\n\n isOneway = false;\n\n constructor(\n vertex1: GeoGraphVertex<VertexData, EdgeData>,\n vertex2: GeoGraphVertex<VertexData, EdgeData>,\n params?: Omit<Partial<GraphEdge<VertexData, EdgeData> & { level: Level_t, isOneway: boolean }>, 'vertex1' | 'vertex2'>\n ) {\n super(vertex1, vertex2, params);\n Object.assign(this, params);\n }\n\n set vertex1(vertex) {\n super.vertex1 = vertex;\n this._computedSizeAndBearing = false;\n }\n\n get vertex1() {\n return this._vertex1;\n }\n\n set vertex2(vertex) {\n super.vertex2 = vertex;\n this._computedSizeAndBearing = false;\n }\n\n get vertex2() {\n return this._vertex2;\n }\n\n get level() {\n return this._level;\n }\n\n set level(level) {\n Level.checkType(level);\n this._level = level;\n }\n\n /**\n * Get edge bearing from vertex1 to vertex2\n */\n get bearing(): number {\n if (!this._computedSizeAndBearing) {\n this._computeSizeAndBearing();\n }\n return this._bearing as number;\n }\n\n /**\n * get edge length\n */\n get length(): number {\n if (!this._computedSizeAndBearing) {\n this._computeSizeAndBearing();\n }\n return this._length as number;\n }\n\n _computeSizeAndBearing() {\n this._length = this.vertex1.distanceTo(this.vertex2);\n this._bearing = this.vertex1.bearingTo(this.vertex2);\n this._computedSizeAndBearing = true;\n }\n\n static getEdgeByVertices<VertexData = unknown, EdgeData = unknown>(\n edges: GeoGraphEdge<VertexData, EdgeData>[],\n vertex1: GeoGraphVertex<VertexData, EdgeData>,\n vertex2: GeoGraphVertex<VertexData, EdgeData>\n ) {\n return super.getEdgeByVertices(edges, vertex1, vertex2) as GeoGraphEdge<VertexData, EdgeData> | undefined;\n }\n\n}\n\nexport default GeoGraphEdge;\n","import { GraphVertex } from '@wemap/utils';\n\nimport Coordinates from '../coordinates/Coordinates.js';\nimport Level from '../coordinates/Level.js';\nimport { GraphVertexJson, Level_t } from '../types.js';\nimport GeoGraphEdge from './GeoGraphEdge.js';\n\n\n\nclass GeoGraphVertex<VertexData = unknown, EdgeData = unknown> extends GraphVertex<VertexData, EdgeData> {\n\n declare edges: GeoGraphEdge<VertexData, EdgeData>[];\n\n coords: Coordinates;\n io = false;\n\n constructor(coords: Coordinates, params?: Omit<Partial<GraphVertex<VertexData, EdgeData>>, 'edges'> & { io?: boolean }) {\n super(params);\n this.coords = coords;\n }\n\n distanceTo(other: GeoGraphVertex) {\n return this.coords.distanceTo(other.coords);\n }\n\n bearingTo(other: GeoGraphVertex) {\n return this.coords.bearingTo(other.coords);\n }\n\n /**\n * Does not include \"edges\" property\n */\n toJson(): GraphVertexJson {\n return this.coords.toCompressedJson();\n }\n\n static fromJson<VertexData = unknown, EdgeData = unknown>(json: GraphVertexJson) {\n return new GeoGraphVertex<VertexData, EdgeData>(Coordinates.fromCompressedJson(json));\n }\n\n inferVertexLevelFromEdges() {\n let tmpLevel = null;\n for (let i = 0; i < this.edges.length; i++) {\n const edge = this.edges[i];\n if (edge.level !== null) {\n if (tmpLevel === null) {\n tmpLevel = Level.clone(edge.level);\n } else {\n tmpLevel = Level.intersection(tmpLevel, edge.level);\n if (tmpLevel === null) {\n throw Error('Something bad happend during parsing: We cannot retrieve vertex level from adjacent ways: ' + this.coords);\n }\n }\n }\n }\n this.coords.level = tmpLevel;\n }\n\n\n /**\n * We suppose inferVertexLevelFromEdges() was called before\n */\n inferVertexLevelByNeighboors() {\n const { level } = this.coords;\n if (level === null || !Level.isRange(level)) {\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 otherVertex = edge.vertex1 === this ? edge.vertex2 : edge.vertex1;\n tmpLevel = Level.union(otherVertex.coords.level, tmpLevel);\n }\n\n if (tmpLevel === null || !Level.isRange(tmpLevel)) {\n this.coords.level = tmpLevel === level[0] ? level[1] : level[0];\n }\n\n return true;\n }\n\n /**\n * We suppose inferVertexLevelFromEdges() and inferVertexLevelByNeighboors() were called before\n */\n inferVertexLevelByRecursion() {\n const { level } = this.coords;\n if (level === null || !Level.isRange(level)) {\n return;\n }\n\n /**\n * We can infer vertex level only if this one have one edge attached\n */\n if (this.edges.length > 1) {\n return;\n }\n\n /**\n * This method looks for single level vertices recursively from a multi-level vertex\n * The result of this method is an union of all single level vertices found.\n */\n const lookForLevel = (vertex: GeoGraphVertex, visitedVertices: GeoGraphVertex[]): Level_t => {\n\n visitedVertices.push(vertex);\n\n if (vertex.coords.level === null) {\n return null;\n }\n\n if (!Level.isRange(vertex.coords.level)) {\n return vertex.coords.level;\n }\n\n let tmpLevel = null;\n for (let i = 0; i < vertex.edges.length; i++) {\n const edge = vertex.edges[i];\n const otherVertex = edge.vertex1 === vertex ? edge.vertex2 : edge.vertex1;\n if (!visitedVertices.includes(otherVertex)) {\n tmpLevel = Level.union(lookForLevel(otherVertex, visitedVertices), tmpLevel);\n }\n }\n return tmpLevel;\n };\n\n const othersLevels = lookForLevel(this, []);\n\n if (othersLevels !== null) {\n if (!Level.isRange(othersLevels)) {\n this.coords.level = othersLevels === level[0] ? level[1] : level[0];\n return;\n }\n throw Error('Level of: ' + this.coords.toString() + ' cannot be decided');\n }\n }\n\n}\n\nexport default GeoGraphVertex;\n","import { Graph } from '@wemap/utils';\n\nimport BoundingBox from '../coordinates/BoundingBox.js';\nimport Coordinates from '../coordinates/Coordinates.js';\nimport Level from '../coordinates/Level.js';\nimport { Level_t, GeoGraphJson } from '../types.js';\n\nimport GeoGraphEdge from './GeoGraphEdge.js';\nimport GeoGraphVertex from './GeoGraphVertex.js';\n\nclass GeoGraph<VertexData = unknown, EdgeData = unknown> extends Graph<VertexData, EdgeData> {\n\n declare vertices: GeoGraphVertex<VertexData, EdgeData>[];\n declare edges: GeoGraphEdge<VertexData, EdgeData>[];\n\n constructor(vertices?: GeoGraphVertex<VertexData, EdgeData>[], edges?: GeoGraphEdge<VertexData, EdgeData>[], generateVerticesLevels = false) {\n super(vertices, edges);\n generateVerticesLevels && this.generateVerticesLevels();\n }\n\n getVertexByCoords(coords: Coordinates) {\n return GeoGraph.getVertexByCoords(this.vertices, coords);\n }\n\n static getVertexByCoords<VertexData = unknown, EdgeData = unknown>(\n vertices: GeoGraphVertex<VertexData, EdgeData>[],\n coords: Coordinates\n ) {\n return vertices.find(vertex => vertex.coords.equals(coords));\n }\n\n getVertexByName(name: string) {\n return super.getVertexByName(name) as GeoGraphVertex<VertexData, EdgeData> | undefined;\n }\n\n getEdgeByName(name: string) {\n return super.getEdgeByName(name) as GeoGraphEdge<VertexData, EdgeData> | undefined;\n }\n\n getBoundingBox(extendedMeasure?: number) {\n if (!this.vertices.length) {\n return null;\n }\n const boundingBox = BoundingBox.fromCoordinates(this.vertices.map(vertex => vertex.coords)) as BoundingBox;\n if (extendedMeasure) {\n boundingBox.extendsWithMeasure(extendedMeasure);\n }\n return boundingBox;\n }\n\n\n toCompressedJson(): GeoGraphJson {\n return {\n vertices: this.vertices.map(vertex => vertex.toJson()),\n edges: this.edges.map(edge => {\n const vertex1Idx = this.vertices.indexOf(edge.vertex1);\n const vertex2Idx = this.vertices.indexOf(edge.vertex2);\n if (edge.isOneway) {\n return [vertex1Idx, vertex2Idx, edge.level, true];\n }\n if (edge.level !== null) {\n return [vertex1Idx, vertex2Idx, edge.level];\n }\n return [vertex1Idx, vertex2Idx];\n })\n };\n }\n\n\n static fromCompressedJson<VertexData = unknown, EdgeData = unknown>(json: GeoGraphJson) {\n\n const geograph = new GeoGraph<VertexData, EdgeData>();\n\n geograph.vertices = json.vertices.map(vertex => GeoGraphVertex.fromJson<VertexData, EdgeData>(vertex));\n\n geograph.edges = json.edges.map(jsonEdge => {\n const edge = new GeoGraphEdge<VertexData, EdgeData>(\n geograph.vertices[jsonEdge[0]],\n geograph.vertices[jsonEdge[1]],\n { level: jsonEdge.length > 2 ? jsonEdge[2] : null }\n );\n if (jsonEdge.length > 3 && jsonEdge[3]) {\n edge.isOneway = true;\n }\n return edge;\n });\n\n return geograph;\n }\n\n\n static fromCoordinates<VertexData = unknown, EdgeData = unknown>(segments: Coordinates[][]) {\n\n const geograph = new GeoGraph<VertexData, EdgeData>();\n\n const getOrCreateVertex = (coords: Coordinates) => {\n const vertex = geograph.vertices.find(otherVertex => otherVertex.coords.equals(coords));\n if (vertex) {\n return vertex;\n }\n const newVertex = new GeoGraphVertex<VertexData, EdgeData>(coords);\n geograph.vertices.push(newVertex);\n return newVertex;\n };\n\n\n const createEdgeFromVertices = (\n vertex1: GeoGraphVertex<VertexData, EdgeData>,\n vertex2: GeoGraphVertex<VertexData, EdgeData>\n ) =>\n new GeoGraphEdge(\n vertex1,\n vertex2,\n { level: Level.union(vertex1.coords.level, vertex2.coords.level) }\n );\n\n for (const segment of segments) {\n\n let previousVertex = null;\n for (const coords of segment) {\n const currentVertex = getOrCreateVertex(coords);\n\n if (previousVertex) {\n const edge = createEdgeFromVertices(currentVertex, previousVertex);\n geograph.edges.push(edge);\n }\n\n previousVertex = currentVertex;\n }\n }\n\n return geograph;\n }\n\n /**\n * Create edges From MultiLevel Itinerary for a given level\n * @param useMultiLevelEdges use segments which intersect both levels (stairs, elevators...)\n */\n getEdgesAtLevel(targetLevel: Level_t, useMultiLevelEdges = true) {\n return this.edges.filter(\n ({ level }) => useMultiLevelEdges\n ? Level.intersect(targetLevel, level)\n : Level.contains(targetLevel, level)\n );\n }\n\n\n generateVerticesLevels() {\n\n const { vertices } = this;\n\n vertices.forEach(vertex => vertex.inferVertexLevelFromEdges());\n\n // In some cases, vertex levels cannot be retrieve just using adjacent edges\n // (e.g stairs without network at one of its bounds)\n // To infer this vertex level, we use inferVertexLevelByRecursion()\n vertices.forEach(vertex => vertex.inferVertexLevelByNeighboors());\n vertices.forEach(vertex => vertex.inferVertexLevelByRecursion());\n\n // Finally define vertices that are links between indoor and outdoor\n // Set vertex.io to true for vertices that make the link between\n // indoor and outdoor edges\n vertices.forEach(vertex => {\n vertex.io = vertex.coords.level !== null\n && vertex.edges.some(edge => edge.level === null);\n });\n }\n}\n\nexport default GeoGraph;\n","import Coordinates from '../coordinates/Coordinates.js';\nimport UserPosition from '../coordinates/UserPosition.js';\nimport GeoGraphEdge from './GeoGraphEdge.js';\nimport GeoGraphVertex from './GeoGraphVertex.js';\n\nclass GeoGraphProjection<VertexData = unknown, EdgeData = unknown, U extends Coordinates | UserPosition = Coordinates> {\n\n origin: U;\n distanceFromNearestElement: number;\n coords: U;\n nearestElement: GeoGraphVertex<VertexData, EdgeData> | GeoGraphEdge<VertexData, EdgeData>;\n\n constructor(origin: U, distanceFromNearestElement: number,\n coords: U, nearestElement: GeoGraphVertex<VertexData, EdgeData> | GeoGraphEdge<VertexData, EdgeData>\n ) {\n this.origin = origin;\n this.distanceFromNearestElement = distanceFromNearestElement;\n this.coords = coords;\n this.nearestElement = nearestElement;\n }\n\n}\n\nexport default GeoGraphProjection;\n","import { diffAngleLines } from '@wemap/maths';\n\nimport Coordinates from '../coordinates/Coordinates.js';\nimport UserPosition from '../coordinates/UserPosition.js';\nimport Level from '../coordinates/Level.js';\n\nimport GeoGraph from './GeoGraph.js';\nimport GeoGraphEdge from './GeoGraphEdge.js';\nimport GeoGraphVertex from './GeoGraphVertex.js';\nimport GeoGraphProjection from './GeoGraphProjection.js';\nimport { EPS_MM } from '../Constants.js';\n\nclass GeoGraphProjectionHandler<VertexData = unknown, EdgeData = unknown> {\n\n graph: GeoGraph<VertexData, EdgeData> | null = null;\n\n private _maxDistance = Number.MAX_VALUE;\n private _maxAngleBearing = Math.PI;\n\n constructor(graph: GeoGraph<VertexData, EdgeData> | null = null) {\n this.graph = graph;\n }\n\n set maxAngleBearing(maxAngleBearing) {\n this._maxAngleBearing = maxAngleBearing;\n }\n\n get maxAngleBearing() {\n return this._maxAngleBearing;\n }\n\n set maxDistance(maxDistance) {\n this._maxDistance = maxDistance;\n }\n\n get maxDistance() {\n return this._maxDistance;\n }\n\n\n /**\n * Check if the specified edge and its nodes can be used for projection\n * @returns 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(\n edge: GeoGraphEdge<VertexData, EdgeData>,\n location: Coordinates | UserPosition,\n useBearing: boolean,\n useMultiLevelSegments: boolean,\n acceptEdgeFn: (edge: GeoGraphEdge<VertexData, EdgeData>) => boolean) {\n\n // ignore projections if edge is not accepted\n if (!acceptEdgeFn(edge)) {\n return [false, false, false];\n }\n\n // First, check if levels intersects\n let checkEdge = Level.intersect(location.level, edge.level);\n let checkNode1 = Level.intersect(location.level, edge.vertex1.coords.level);\n let checkNode2 = Level.intersect(location.level, edge.vertex2.coords.level);\n\n // Second, in case of IO nodes, accept matching if location's level is null\n checkNode1 = checkNode1 || edge.vertex1.io && location.level === null;\n checkNode2 = checkNode2 || edge.vertex2.io && location.level === null;\n\n // Third, check if level is a range if useMultiLevelSegments is false\n if (!useMultiLevelSegments) {\n checkEdge = checkEdge && !Level.isRange(edge.level);\n checkNode1 = checkNode1 && !Level.isRange(edge.vertex1.coords.level);\n checkNode2 = checkNode2 && !Level.isRange(edge.vertex2.coords.level);\n }\n\n // Finally, check edges bearing if option is used\n if (useBearing) {\n if (checkEdge) {\n // condition for optimisation\n const diffAngle = diffAngleLines(edge.bearing, (location as UserPosition).bearing as number);\n if (diffAngle > this._maxAngleBearing) {\n // Do not try to project if angle is greater than the threshold\n checkEdge = false;\n }\n }\n // if mapmatching bearing is enabled do not use nodes matching\n checkNode1 = false;\n checkNode2 = false;\n }\n\n return [checkEdge, checkNode1, checkNode2];\n }\n\n\n static _assignLatLngLevel(fromCoordinates: Coordinates, toCoordinates: Coordinates) {\n toCoordinates.lat = fromCoordinates.lat;\n toCoordinates.lng = fromCoordinates.lng;\n toCoordinates.level = Level.clone(fromCoordinates.level);\n }\n\n /**\n * IO Nodes are typical because they have a non-null level but projection car works on them.\n * This function handles the case where the projection is on an IO node and a location with\n * a null level is required.\n */\n static _handleLevelsWithIONodes(projection: Coordinates, location: Coordinates, projectionNode: GeoGraphVertex) {\n if (location.level === null && projectionNode.io) {\n projection.level = null;\n }\n }\n\n static _updateProjectionLevelFromEdge = (_edge: GeoGraphEdge, _projection: Coordinates) => {\n _projection.level = Level.clone(_edge.level);\n };\n\n /**\n * Main function for map-matching, the networks have to be set before calling this function\n * The function will returns a GraphProjection object given a coordinates object and a set\n * of options (useDistance, useBearing, useMultiLevelSegments, acceptEdgeFn).\n */\n getProjection<U extends Coordinates | UserPosition>(\n location: U,\n useDistance = false,\n useBearing = false,\n useMultiLevelSegments = true,\n acceptEdgeFn: (edge: GeoGraphEdge<VertexData, EdgeData>) => boolean = () => true\n ) {\n\n if (this.graph === null) {\n throw new Error('Graph has not been set yet');\n }\n\n if (useBearing && (!('bearing' in location && location.bearing !== null) || !this._maxAngleBearing)) {\n // If useBearing is true and bearing is not set in coordinates, return null\n return null;\n }\n\n let distanceFromNearestElement = Number.MAX_VALUE;\n const projection = location.clone() as U;\n let nearestElement = null;\n\n // Define a function to know if a projection is better than the current one\n const isProjectionBetter = (distanceOfNewProjection: number) => {\n return distanceOfNewProjection < distanceFromNearestElement\n && (!useDistance || distanceOfNewProjection <= this._maxDistance);\n };\n\n // Loop on all the network edges\n // Each time a better projection is found (see isProjectionBetter()),\n // the current projection is replaced\n for (const edge of this.graph.edges) {\n\n // Check if the specified edge and its nodes can be used for projection. See the\n // documentation of the corresponding function for more information.\n const [checkEdge, checkNode1, checkNode2] = this._shouldProjectOnEdgeAndNodes(\n edge, location, useBearing, useMultiLevelSegments, acceptEdgeFn);\n\n if (checkNode1) {\n\n const distNode1 = location.distanceTo(edge.vertex1.coords);\n if (isProjectionBetter(distNode1) || distNode1 <= EPS_MM) {\n distanceFromNearestElement = distNode1;\n nearestElement = edge.vertex1 as typeof this.graph.vertices[0];\n GeoGraphProjectionHandler._assignLatLngLevel(edge.vertex1.coords, projection as Coordinates);\n GeoGraphProjectionHandler._handleLevelsWithIONodes(projection as Coordinates, location, edge.vertex1);\n\n if (distNode1 <= EPS_MM) {\n break;\n }\n }\n }\n\n if (checkNode2) {\n\n const distNode2 = location.distanceTo(edge.vertex2.coords);\n if (isProjectionBetter(distNode2) || distNode2 <= EPS_MM) {\n distanceFromNearestElement = distNode2;\n nearestElement = edge.vertex2 as typeof this.graph.vertices[0];\n GeoGraphProjectionHandler._assignLatLngLevel(edge.vertex2.coords, projection as Coordinates);\n GeoGraphProjectionHandler._handleLevelsWithIONodes(projection as Coordinates, location, edge.vertex2);\n\n if (distNode2 <= EPS_MM) {\n break;\n }\n }\n }\n\n if (checkEdge) {\n const segmentProjection = location.getSegmentProjection(edge.vertex1.coords, edge.vertex2.coords);\n if (segmentProjection) {\n const distEdge = location.distanceTo(segmentProjection);\n if (isProjectionBetter(distEdge)) {\n distanceFromNearestElement = distEdge;\n nearestElement = edge;\n GeoGraphProjectionHandler._assignLatLngLevel(segmentProjection, projection as Coordinates);\n GeoGraphProjectionHandler._updateProjectionLevelFromEdge(edge, projection as Coordinates);\n }\n }\n }\n }\n\n\n if (!nearestElement) {\n return null;\n }\n\n if (projection instanceof UserPosition && projection.accuracy !== null) {\n projection.accuracy += distanceFromNearestElement;\n }\n\n return new GeoGraphProjection(\n location,\n distanceFromNearestElement,\n projection,\n nearestElement\n );\n }\n\n}\n\nexport default GeoGraphProjectionHandler;\n","import Logger from '@wemap/logger';\n\nimport Coordinates from '../coordinates/Coordinates.js';\nimport GeoGraph from './GeoGraph.js';\nimport GeoGraphEdge from './GeoGraphEdge.js';\nimport GeoGraphVertex from './GeoGraphVertex.js';\n\n\n/**\n * GeoGraphItinerary is an oriented graph\n */\nclass GeoGraphItinerary<VertexData = unknown, EdgeData = unknown> extends GeoGraph<VertexData, EdgeData> {\n\n protected constructor(\n public start: Coordinates,\n public end: Coordinates,\n vertices: GeoGraphVertex<VertexData, EdgeData>[],\n edges: GeoGraphEdge<VertexData, EdgeData>[],\n public edgesWeights: number[]\n ) {\n super(vertices, edges);\n }\n\n static fromGraphVertices<VertexData = unknown, EdgeData = unknown>(\n start: Coordinates,\n end: Coordinates,\n networkVertices: GeoGraphVertex<VertexData, EdgeData>[],\n edgesWeights: number[]\n ) {\n\n const vertices = networkVertices.map(vertex => {\n return new GeoGraphVertex<VertexData, EdgeData>(vertex.coords.clone(),\n { name: vertex.name, id: vertex.id, data: vertex.data, io: vertex.io }\n );\n });\n\n const edges: GeoGraphEdge<VertexData, EdgeData>[] = [];\n networkVertices.forEach((vertex, idx, arr) => {\n if (idx === 0) {\n return;\n }\n\n // Retrieve network edge\n const prevVertex = arr[idx - 1];\n const edge = GeoGraphEdge.getEdgeByVertices(prevVertex.edges, prevVertex, vertex);\n\n if (!edge) {\n Logger.error('Cannot retrieve edge to create itinerary');\n return;\n }\n\n edges.push(new GeoGraphEdge<VertexData, EdgeData>(vertices[idx - 1], vertices[idx],\n { name: edge.name, id: edge.id, data: edge.data, level: edge.level, isOneway: edge.isOneway }\n ));\n });\n\n return new GeoGraphItinerary(start, end, vertices, edges, edgesWeights);\n }\n}\n\nexport default GeoGraphItinerary;\n","import Coordinates from '../coordinates/Coordinates.js';\nimport GeoGraphVertex from './GeoGraphVertex.js';\n\nclass NoRouteFoundError extends Error {\n\n constructor(\n public start: GeoGraphVertex | Coordinates,\n public end: GeoGraphVertex | Coordinates,\n public details: string | null = null\n ) { super(); }\n\n get startStr() {\n if (this.start instanceof GeoGraphVertex) {\n return `GraphNode ${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 GeoGraphVertex) {\n return `GraphNode ${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 Coordinates from '../coordinates/Coordinates.js';\nimport Level from '../coordinates/Level.js';\n\nimport GeoGraph from './GeoGraph.js';\nimport GeoGraphVertex from './GeoGraphVertex.js';\nimport GeoGraphEdge from './GeoGraphEdge.js';\nimport GeoGraphProjectionHandler from './GeoGraphProjectionHandler.js'\n\nimport NoRouteFoundError from './NoRouteFoundError.js';\nimport GeoGraphItinerary from './GeoGraphItinerary.js';\n\nexport type GeoGraphRouterOptions<VertexData = unknown, EdgeData = unknown> = {\n projectionMaxDistance: number; // in meters\n weightEdgeFn: (edge: GeoGraphEdge<VertexData, EdgeData>) => number;\n acceptEdgeFn?: (edge: GeoGraphEdge<VertexData, EdgeData>) => boolean;\n}\n\nconst DEFAULT_OPTIONS = {\n projectionMaxDistance: 50,\n weightEdgeFn: (edge: GeoGraphEdge) => edge.length,\n acceptEdgeFn: () => true\n}\n\nclass GeoGraphRouter<VertexData = unknown, EdgeData = unknown> {\n\n static DEFAULT_OPTIONS = DEFAULT_OPTIONS;\n\n _mapMatching: GeoGraphProjectionHandler<VertexData, EdgeData>;\n _graph: GeoGraph<VertexData, EdgeData>;\n disabledEdges: Set<GeoGraphEdge<VertexData, EdgeData>> = new Set();\n\n constructor(graph: GeoGraph<VertexData, EdgeData>) {\n this._graph = graph;\n this._mapMatching = new GeoGraphProjectionHandler(graph);\n }\n\n getShortestPath(\n start: GeoGraphVertex<VertexData, EdgeData> | Coordinates,\n end: GeoGraphVertex<VertexData, EdgeData> | Coordinates,\n options: GeoGraphRouterOptions<VertexData, EdgeData> = DEFAULT_OPTIONS\n ) {\n\n const { acceptEdgeFn, weightEdgeFn, projectionMaxDistance } = options;\n this._mapMatching.maxDistance = projectionMaxDistance;\n\n const createdVertices: GeoGraphVertex<VertexData, EdgeData>[] = [];\n\n const retrieveOrCreateNearestVertex = (point: GeoGraphVertex<VertexData, EdgeData> | Coordinates) => {\n if (point instanceof GeoGraphVertex) {\n return point;\n }\n\n const closeVertex = this._graph.getVertexByCoords(point);\n if (closeVertex) {\n return closeVertex;\n }\n\n const proj = this._mapMatching.getProjection(point, true, false, false, acceptEdgeFn);\n if (!proj) {\n let message = `Point ${point.toString()} is too far from the graph `\n + `> ${this._mapMatching.maxDistance.toFixed(0)} meters.`;\n if (point.level !== null) {\n message += ' If it is a multi-level map, please verify if you have'\n + ` a graph at level ${Level.toString(point.level)}.`;\n }\n throw new NoRouteFoundError(start, end, message);\n }\n if (proj.nearestElement instanceof GeoGraphVertex) {\n return proj.nearestElement;\n }\n // if (proj.nearestElement instanceof Edge)\n const vertexCreated = this.createVertexInsideEdge(\n proj.nearestElement,\n proj.coords\n );\n createdVertices.push(vertexCreated);\n return vertexCreated;\n };\n\n const removeCreatedVertices = () => {\n while (createdVertices.length) {\n this.removeVertexFromPreviouslyCreatedEdge(createdVertices.pop() as GeoGraphVertex<VertexData, EdgeData>);\n }\n };\n\n const startVertex = retrieveOrCreateNearestVertex(start);\n const endVertex = retrieveOrCreateNearestVertex(end);\n\n\n const startCoords = start instanceof GeoGraphVertex ? start.coords : start;\n const endCoords = end instanceof GeoGraphVertex ? end.coords : end;\n\n let graphItinerary;\n if (startVertex === endVertex) {\n graphItinerary = GeoGraphItinerary.fromGraphVertices(\n startCoords, endCoords, [startVertex], []\n );\n } else {\n graphItinerary = this.getShortestPathBetweenGeoGraphVertices(\n startVertex,\n endVertex,\n weightEdgeFn,\n acceptEdgeFn\n );\n }\n\n // In the case of start or end are not a vertex, graphItinerary.start/end are first vertex or \n // last vertex. We have to override their values.\n graphItinerary.start = startCoords;\n graphItinerary.end = endCoords;\n\n removeCreatedVertices();\n\n if (!graphItinerary.vertices.length) {\n throw new NoRouteFoundError(start, end);\n }\n\n return graphItinerary;\n\n }\n\n createVertexInsideEdge(edge: GeoGraphEdge<VertexData, EdgeData>, point: Coordinates) {\n const a = edge.vertex1;\n const b = edge.vertex2;\n\n const m = new GeoGraphVertex<VertexData, EdgeData>(point, { name: `proj on ${edge.name || null} (tmp)` });\n\n const newEdgesParams = { name: `splitted ${edge.name || null} (tmp)`, data: edge.data, isOneway: edge.isOneway, level: edge.level };\n const u = new GeoGraphEdge<VertexData, EdgeData>(a, m, newEdgesParams);\n const v = new GeoGraphEdge<VertexData, EdgeData>(m, b, newEdgesParams);\n\n a.edges = a.edges.filter(_edge => _edge !== edge);\n b.edges = b.edges.filter(_edge => _edge !== edge);\n\n this._graph.vertices.push(m);\n this._graph.edges.push(u, v);\n\n this._graph.edges = this._graph.edges.filter(\n _edge => _edge !== edge\n );\n\n return m;\n }\n\n removeVertexFromPreviouslyCreatedEdge(_vertex: GeoGraphVertex<VertexData, EdgeData>) {\n const isUfirstEdge = _vertex.edges[0].vertex2 === _vertex;\n const u = _vertex.edges[isUfirstEdge ? 0 : 1];\n const v = _vertex.edges[isUfirstEdge ? 1 : 0];\n\n u.vertex1.edges = u.vertex1.edges.filter(edge => edge !== u);\n v.vertex2.edges = v.vertex2.edges.filter(edge => edge !== v);\n\n const oldEdgeName = u.name!.substring('splitted '.length, u.name!.length - ' (tmp)'.length);\n const oldEdgeParams = { name: oldEdgeName, data: u.data, isOneway: u.isOneway, level: u.level };\n const oldEdge = new GeoGraphEdge<VertexData, EdgeData>(u.vertex1, v.vertex2, oldEdgeParams);\n this._graph.edges.push(oldEdge);\n\n this._graph.vertices = this._graph.vertices.filter(vertex => vertex !== _vertex);\n this._graph.edges = this._graph.edges.filter(\n edge => edge !== u && edge !== v\n );\n }\n\n getShortestPathBetweenGeoGraphVertices(\n start: GeoGraphVertex<VertexData, EdgeData>,\n end: GeoGraphVertex<VertexData, EdgeData>,\n weightFn: (edge: GeoGraphEdge<VertexData, EdgeData>) => number,\n acceptEdgeFn?: (edge: GeoGraphEdge<VertexData, EdgeData>) => boolean\n ) {\n\n const distanceMap: { [key: number]: number } = {},\n checking: { [key: number]: null | number } = {},\n vertexList: { [key: number]: boolean } = {},\n vertices: { [key: number]: GeoGraphVertex } = {},\n parentVertices: { [key: number]: number } = {},\n path = [];\n\n // Initially, we assume each vertex is unreachable\n this._graph.vertices.forEach(vertex => {\n\n // Generate Unique Router Id\n vertices[vertex.id] = vertex;\n distanceMap[vertex.id] = Infinity;\n checking[vertex.id] = null;\n vertexList[vertex.id] = true;\n });\n\n // The cost from the starting vertex to the starting vertex is 0\n distanceMap[start.id] = 0;\n\n // check each vertex\n while (Object.keys(vertexList).length > 0) {\n const keys = Object.keys(vertexList).map(Number);\n const current = Number(\n keys.reduce((_checking, vertexId) => {\n return distanceMap[_checking] > distanceMap[vertexId]\n ? vertexId\n : _checking;\n }, keys[0])\n );\n\n // all the vertices accessible from current vertex\n this._graph.edges\n .filter(edge => {\n\n if (acceptEdgeFn && !acceptEdgeFn(edge) || this.disabledEdges.has(edge)) {\n return false;\n }\n\n const from = edge.vertex1.id,\n to = edge.vertex2.id;\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.vertex1.id === current) {\n to = edge.vertex2.id;\n from = edge.vertex1.id;\n } else {\n to = edge.vertex1.id;\n from = edge.vertex2.id;\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.id;\n while (typeof parentVertices[endId] !== 'undefined') {\n path.unshift(vertices[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 // This clone the itinerary and temporary vertices\n return GeoGraphItinerary.fromGraphVertices(start.coords, end.coords, path, edgesWeights);\n }\n}\nexport default GeoGraphRouter;\n"],"names":["str","wrap","deg2rad","rad2deg","Quaternion","Vector3","positiveMod","coords","Rotations","GraphEdge","GraphVertex","Graph","diffAngleLines","Logger"],"mappings":"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"}
|