@wemap/geo 10.10.0 → 10.11.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 +1848 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +1846 -0
- package/dist/index.mjs.map +1 -0
- package/index.d.ts +24 -6
- package/package.json +3 -3
- package/src/graph/Network.js +1 -0
- package/dist/wemap-geo.es.js +0 -3271
- package/dist/wemap-geo.es.js.map +0 -1
|
@@ -0,0 +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","../src/graph/GraphNode.ts","../src/graph/GraphEdge.ts","../src/graph/GraphUtils.ts","../src/graph/Network.ts","../src/graph/GraphProjection.ts","../src/graph/MapMatching.ts","../src/router/GraphItinerary.ts","../src/router/NoRouteFoundError.ts","../src/router/GraphRouterOptions.ts","../src/router/GraphRouter.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') {\n throw Error(`argument must be a 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 === 2) {\n const low = Number(splited[0]);\n const up = Number(splited[1]);\n this.checkType([low, up]);\n return [parseFloat(splited[0]), parseFloat(splited[1])];\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: this.lat,\n lng: this.lng,\n ...(this.alt !== null && { alt: this.alt }),\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 [this.lat, this.lng, this.alt, this.level];\n }\n if (this.alt !== null) {\n return [this.lat, this.lng, this.alt];\n }\n return [this.lat, this.lng];\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\ntype RouteSample = Coordinates & { bearing: number };\n\n/**\n * Sample a route of Coordinates\n * @param {Array.<Coordinates>} route ordered points\n * @param {*} stepSize step size to sample\n * @param {*} maxLength max route length to sample\n */\nexport function sampleRoute(\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 Coordinates from '../coordinates/Coordinates.js';\nimport Level from '../coordinates/Level.js';\nimport { GraphNodeJson, Level_t } from '../types.js';\n\nimport GraphEdge from './GraphEdge.js';\n\n\nclass GraphNode<N = unknown, E = unknown> {\n\n coords: Coordinates;\n\n edges: GraphEdge<E, N>[] = [];\n builtFrom: N | null;\n io = false;\n\n constructor(coords: Coordinates, builtFrom: N | null = null) {\n this.coords = coords;\n this.builtFrom = builtFrom;\n }\n\n distanceTo(other: GraphNode<N, E>) {\n return this.coords.distanceTo(other.coords);\n }\n\n bearingTo(other: GraphNode<N, E>) {\n return this.coords.bearingTo(other.coords);\n }\n\n equals(other: GraphNode<N, E>) {\n return this.coords.equals(other.coords)\n && this.builtFrom === other.builtFrom;\n }\n\n\n clone() {\n const node = new GraphNode<N, E>(this.coords, this.builtFrom);\n node.edges = this.edges.slice(0);\n node.io = this.io;\n return node;\n }\n\n /**\n * Does not include \"edges\" and \"builtFrom\" properties\n */\n toJson(): GraphNodeJson {\n return this.coords.toCompressedJson();\n }\n\n static fromJson<N2, E2>(json: GraphNodeJson, builtFrom: N2 | null = null) {\n return new GraphNode<N2, E2>(Coordinates.fromCompressedJson(json), builtFrom);\n }\n\n _generateLevelFromEdges() {\n let tmpLevel = null;\n for (let i = 0; i < this.edges.length; i++) {\n const edge = this.edges[i];\n if (edge.level !== 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 node level from adjacent ways: ' + this.coords);\n }\n }\n }\n }\n this.coords.level = tmpLevel;\n }\n\n\n /**\n * We suppose generateLevelFromEdges() was called before\n */\n _inferNodeLevelByRecursion() {\n const { level } = this.coords;\n if (level === null || !Level.isRange(level)) {\n return;\n }\n\n /**\n * We can infer node level only if this one have one edge attached\n */\n if (this.edges.length > 1) {\n return;\n }\n\n /**\n * This method looks for single level nodes recursively from a multi-level node\n * The result of this method is an union of all single level nodes found.\n */\n const lookForLevel = (node: GraphNode<N, E>, visitedNodes: GraphNode<N, E>[]): Level_t => {\n\n visitedNodes.push(node);\n\n if (node.coords.level === null) {\n return null;\n }\n\n if (!Level.isRange(node.coords.level)) {\n return node.coords.level;\n }\n\n let tmpLevel = null;\n for (let i = 0; i < node.edges.length; i++) {\n const edge = node.edges[i];\n const otherNode = edge.node1 === node ? edge.node2 : edge.node1;\n if (!visitedNodes.includes(otherNode)) {\n tmpLevel = Level.union(lookForLevel(otherNode, visitedNodes), tmpLevel);\n }\n }\n return tmpLevel;\n };\n\n const othersLevels = lookForLevel(this, []);\n\n if (othersLevels !== null) {\n if (!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 * We suppose generateLevelFromEdges() was called before\n */\n _inferNodeLevelByNeighboors() {\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 otherNode = edge.node1 === this ? edge.node2 : edge.node1;\n tmpLevel = Level.union(otherNode.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 * Set node.io to true for nodes that make the link between\n * indoor and outdoor edges\n */\n _checkIO() {\n this.io = this.coords.level !== null\n && this.edges.some(edge => edge.level === null);\n return true;\n }\n\n static generateNodesLevels<N2, E2>(nodes: GraphNode<N2, E2>[]) {\n\n nodes.forEach(node => node._generateLevelFromEdges());\n\n // In some cases, node levels cannot be retrieve just using adjacent edges\n // (e.g stairs without network at one of its bounds)\n // To infer this node level, we use inferNodeLevelByRecursion()\n nodes.forEach(node => node._inferNodeLevelByNeighboors());\n nodes.forEach(node => node._inferNodeLevelByRecursion());\n\n // Finally define nodes that are links between indoor and outdoor\n nodes.forEach(node => node._checkIO());\n }\n}\n\nexport default GraphNode;\n","import Level from '../coordinates/Level.js';\nimport GraphNode from './GraphNode.js';\nimport { Level_t } from '../types.js';\n\n/**\n * An Edge is a segment composed of two Node\n * An edge is mostly issued from an OsmWay, but this is not always the case.\n * For example, edges created by mapmatching.\n */\nclass GraphEdge<E = unknown, N = unknown> {\n\n private _node1!: GraphNode<N, E>;\n private _node2!: GraphNode<N, E>;\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 builtFrom: E | null;\n\n isOneway = false;\n\n constructor(node1: GraphNode<N, E>, node2: GraphNode<N, E>,\n level: Level_t = null, builtFrom: E | null = null,\n ) {\n this.node1 = node1;\n this.node2 = node2;\n this.level = level;\n this.builtFrom = builtFrom;\n }\n\n get node1() {\n return this._node1;\n }\n\n set node1(node) {\n\n if (!(node instanceof GraphNode)) {\n throw new TypeError('node1 is not a GraphNode');\n }\n\n if (this._node1 instanceof GraphNode && this._node2 !== this._node1) {\n this._node1.edges = this._node1.edges.filter(edge => edge !== this);\n }\n\n node.edges.push(this);\n\n this._node1 = node;\n this._computedSizeAndBearing = false;\n }\n\n get node2() {\n return this._node2;\n }\n\n set node2(node) {\n\n if (!(node instanceof GraphNode)) {\n throw new TypeError('node2 is not a GraphNode');\n }\n\n if (this._node2 instanceof GraphNode && this._node2 !== this._node1) {\n this._node2.edges = this._node2.edges.filter(edge => edge !== this);\n }\n\n node.edges.push(this);\n\n this._node2 = node;\n this._computedSizeAndBearing = false;\n }\n\n 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 node1 to node2\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.node1.distanceTo(this.node2);\n this._bearing = this.node1.bearingTo(this.node2);\n this._computedSizeAndBearing = true;\n }\n\n equals(other: GraphEdge<E, N>) {\n\n if (this === other) {\n return true;\n }\n\n if (!(other instanceof GraphEdge)) {\n return false;\n }\n\n return other.node1.equals(this.node1)\n && other.node2.equals(this.node2)\n && Level.equals(other.level, this.level)\n && other.isOneway === this.isOneway\n && other.builtFrom === this.builtFrom;\n }\n\n clone() {\n const edge = new GraphEdge<E, N>(this.node1, this.node2, this.level, this.builtFrom);\n edge.isOneway = this.isOneway;\n return edge;\n }\n\n}\n\nexport default GraphEdge;\n","\nimport Coordinates from '../coordinates/Coordinates.js';\nimport GraphEdge from './GraphEdge.js';\nimport GraphNode from './GraphNode.js';\n\nexport function getEdgeByNodes<E, N>(\n edges: GraphEdge<E, N>[],\n node1: GraphNode<N, E>, node2: GraphNode<N, E>\n) {\n return edges.find(edge => node1 === edge.node1 && node2 === edge.node2\n || node2 === edge.node1 && node1 === edge.node2\n );\n}\n\n\nexport function getNodeByCoords<N, E>(\n nodes: GraphNode<N, E>[],\n coords: Coordinates\n) {\n return nodes.find(node => node.coords.equals(coords));\n}","import BoundingBox from '../coordinates/BoundingBox.js';\nimport Coordinates from '../coordinates/Coordinates.js';\nimport Level from '../coordinates/Level.js';\nimport { Level_t, NetworkJson } from '../types.js';\n\nimport GraphEdge from './GraphEdge.js';\nimport GraphNode from './GraphNode.js';\nimport { getEdgeByNodes } from './GraphUtils.js';\n\n/**\n * TODO: rename to GraphNetwork\n * A typical network with nodes (Node) and edges (Edge)\n */\nclass Network<N = unknown, E = unknown> {\n\n nodes: GraphNode<N, E>[];\n edges: GraphEdge<E, N>[];\n\n constructor(nodes?: GraphNode<N, E>[], edges?: GraphEdge<E, N>[]) {\n this.nodes = Array.isArray(nodes) ? nodes : [];\n this.edges = Array.isArray(edges) ? edges : [];\n }\n\n\n getNodeByCoords(coords: Coordinates) {\n return this.nodes.find(node => node.coords.equals(coords));\n }\n\n getEdgeByNodes(node1: GraphNode<N>, node2: GraphNode<N>) {\n return getEdgeByNodes(this.edges, node1, node2);\n }\n\n getBoundingBox(extendedMeasure?: number) {\n if (!this.nodes.length) {\n return null;\n }\n const boundingBox = BoundingBox.fromCoordinates(this.nodes.map(node => node.coords)) as BoundingBox;\n if (extendedMeasure) {\n boundingBox.extendsWithMeasure(extendedMeasure);\n }\n return boundingBox;\n }\n\n toDetailedString(\n _nodeToStringFn: (node: GraphNode<N, E>) => string,\n _edgeToStringFn: (edge: GraphEdge<E, N>) => string\n ) {\n\n let nodeToStringFn = _nodeToStringFn;\n if (!nodeToStringFn) {\n nodeToStringFn = node => `${node.builtFrom}`;\n }\n\n let edgeToStringFn = _edgeToStringFn;\n if (!_edgeToStringFn) {\n edgeToStringFn = edge => `${edge.builtFrom}`;\n }\n\n let output\n = '--- Network ---\\n'\n + `Nodes: ${this.nodes.length}\\n`\n + `Edges: ${this.edges.length}\\n`\n + '---\\n'\n + 'Nodes\\n';\n this.nodes.forEach(node => {\n output += `${nodeToStringFn(node)} [edges: ${node.edges.length}]\\n`;\n });\n output += '---\\n'\n + 'Edges\\n';\n this.edges.forEach(edge => {\n output += `${edgeToStringFn(edge)} `;\n output += `[${nodeToStringFn(edge.node1)} -- ${nodeToStringFn(edge.node2)}]\\n`;\n });\n output += '---';\n return output;\n }\n\n\n toCompressedJson(): NetworkJson {\n return {\n nodes: this.nodes.map(node => node.toJson()),\n edges: this.edges.map(edge => {\n const node1Idx = this.nodes.indexOf(edge.node1);\n const node2Idx = this.nodes.indexOf(edge.node2);\n if (edge.isOneway) {\n return [node1Idx, node2Idx, edge.level, true];\n }\n if (edge.level) {\n return [node1Idx, node2Idx, edge.level];\n }\n return [node1Idx, node2Idx];\n })\n };\n }\n\n\n static fromCompressedJson<N2, E2>(json: NetworkJson) {\n\n const network = new Network<N2 | null, E2 | null>();\n\n network.nodes = json.nodes.map(node => GraphNode.fromJson<N2, E2>(node, null));\n\n network.edges = json.edges.map(jsonEdge => {\n const edge = new GraphEdge<E2 | null, N2 | null>(\n network.nodes[jsonEdge[0]],\n network.nodes[jsonEdge[1]],\n jsonEdge[2],\n null\n );\n if (jsonEdge.length > 3 && jsonEdge[3]) {\n edge.isOneway = true;\n }\n return edge;\n });\n\n return network;\n }\n\n\n static fromCoordinates<N2, E2>(segments: Coordinates[][]) {\n\n const network = new Network<N2 | null, E2 | null>();\n\n const getOrCreateNode = (coords: Coordinates) => {\n const node = network.nodes.find(otherNode => otherNode.coords.equals(coords));\n if (node) {\n return node;\n }\n const newNode = new GraphNode<N2 | null, E2 | null>(coords, null);\n network.nodes.push(newNode);\n return newNode;\n };\n\n\n const createEdgeFromNodes = (\n node1: GraphNode<N2 | null, E2 | null>,\n node2: GraphNode<N2 | null, E2 | null>\n ) => new GraphEdge<E2 | null, N2 | null>(\n node1,\n node2,\n Level.union(node1.coords.level, node2.coords.level),\n null\n );\n\n for (const segment of segments) {\n\n let previousNode = null;\n for (const coords of segment) {\n const currentNode = getOrCreateNode(coords);\n\n if (previousNode) {\n const edge = createEdgeFromNodes(currentNode, previousNode);\n network.edges.push(edge);\n }\n\n previousNode = currentNode;\n }\n }\n\n return network;\n }\n\n /**\n * Create edges From MultiLevel Itinerary for a given level\n * @param {Boolean} 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\nexport default Network;\n","import Coordinates from '../coordinates/Coordinates.js';\nimport GraphEdge from './GraphEdge.js';\nimport GraphNode from './GraphNode.js';\n\nclass GraphProjection<N = unknown, E = unknown, U extends Coordinates = Coordinates> {\n\n origin: U;\n distanceFromNearestElement: number;\n coords: U;\n nearestElement: GraphNode<N, E> | GraphEdge<E, N>;\n\n constructor(origin: U, distanceFromNearestElement: number,\n coords: U, nearestElement: GraphNode<N, E> | GraphEdge<E, N>\n ) {\n this.origin = origin;\n this.distanceFromNearestElement = distanceFromNearestElement;\n this.coords = coords;\n this.nearestElement = nearestElement;\n }\n\n}\n\nexport default GraphProjection;\n","/* eslint-disable complexity */\n/* eslint-disable max-statements */\nimport { 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 Network from './Network.js';\nimport GraphProjection from './GraphProjection.js';\nimport GraphEdge from './GraphEdge.js';\nimport GraphNode from './GraphNode.js';\nimport { EPS_MM } from '../Constants.js';\n\nclass MapMatching<N = unknown, E = unknown> {\n\n network: Network<N, E> | null = null;\n\n private _maxDistance = Number.MAX_VALUE;\n private _maxAngleBearing = Math.PI;\n\n constructor(network: Network<N, E> | null = null) {\n this.network = network;\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 {boolean} an array of two elements.\n * First is true if projection will be used on the specified edge, false otherwise.\n * Second is true if projection will be used on the nodes of the specified edge, false otherwise.\n */\n _shouldProjectOnEdgeAndNodes(\n edge: GraphEdge<E, N>,\n location: Coordinates | UserPosition,\n useBearing: boolean,\n useMultiLevelSegments: boolean,\n acceptEdgeFn: (edge: GraphEdge<E, N>) => 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.node1.coords.level);\n let checkNode2 = Level.intersect(location.level, edge.node2.coords.level);\n\n // Second, in case of IO nodes, accept matching if location's level is null\n checkNode1 = checkNode1 || edge.node1.io && location.level === null;\n checkNode2 = checkNode2 || edge.node2.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.node1.coords.level);\n checkNode2 = checkNode2 && !Level.isRange(edge.node2.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<T>(projection: Coordinates, location: Coordinates, projectionNode: GraphNode<T>) {\n if (location.level === null && projectionNode.io) {\n projection.level = null;\n }\n }\n\n static _updateProjectionLevelFromEdge = <T>(_edge: GraphEdge<T>, _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 = Coordinates>(\n location: U,\n useDistance = false,\n useBearing = false,\n useMultiLevelSegments = true,\n acceptEdgeFn: (edge: GraphEdge<E, N>) => boolean = () => true) {\n\n if (this.network === null) {\n throw new Error('Network has not been set yet');\n }\n\n if (!(location instanceof Coordinates)) {\n throw new TypeError('location is not an instance of Coordinates');\n }\n\n if (useBearing && (!('bearing' in location as unknown && (location as any).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.network.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.node1.coords);\n if (isProjectionBetter(distNode1) || distNode1 <= EPS_MM) {\n distanceFromNearestElement = distNode1;\n nearestElement = edge.node1;\n MapMatching._assignLatLngLevel(edge.node1.coords, projection);\n MapMatching._handleLevelsWithIONodes(projection, location, edge.node1);\n\n if (distNode1 <= EPS_MM) {\n break;\n }\n }\n }\n\n if (checkNode2) {\n\n const distNode2 = location.distanceTo(edge.node2.coords);\n if (isProjectionBetter(distNode2) || distNode2 <= EPS_MM) {\n distanceFromNearestElement = distNode2;\n nearestElement = edge.node2;\n MapMatching._assignLatLngLevel(edge.node2.coords, projection);\n MapMatching._handleLevelsWithIONodes(projection, location, edge.node2);\n\n if (distNode2 <= EPS_MM) {\n break;\n }\n }\n }\n\n if (checkEdge) {\n const segmentProjection = location.getSegmentProjection(edge.node1.coords, edge.node2.coords);\n if (segmentProjection) {\n const distEdge = location.distanceTo(segmentProjection);\n if (isProjectionBetter(distEdge)) {\n distanceFromNearestElement = distEdge;\n nearestElement = edge;\n MapMatching._assignLatLngLevel(segmentProjection, projection);\n MapMatching._updateProjectionLevelFromEdge(edge, projection);\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 GraphProjection<N, E, U>(\n location,\n distanceFromNearestElement,\n projection,\n nearestElement\n );\n }\n\n}\n\nexport default MapMatching;\n","import Logger from '@wemap/logger';\nimport Coordinates from '../coordinates/Coordinates.js';\nimport GraphNode from '../graph/GraphNode.js';\nimport GraphEdge from '../graph/GraphEdge.js';\nimport { getEdgeByNodes } from '../graph/GraphUtils.js';\n\n\nclass GraphItinerary<N = unknown, E = unknown> {\n\n start: Coordinates;\n end: Coordinates;\n\n nodes: GraphNode<N, E>[];\n edges: GraphEdge<E, N>[];\n\n edgesWeights: number[];\n\n protected constructor(\n start: Coordinates, end: Coordinates,\n nodes: GraphNode<N, E>[], edges: GraphEdge<E, N>[],\n edgesWeights: number[]\n ) {\n this.start = start;\n this.end = end;\n this.nodes = nodes;\n this.edges = edges;\n this.edgesWeights = edgesWeights;\n }\n\n static fromNetworkNodes<N2, E2>(\n start: Coordinates, end: Coordinates,\n networkNodes: GraphNode<N2, E2>[], edgesWeights: number[]\n ) {\n\n const nodes = networkNodes.map(node => {\n const newNode = node.clone();\n\n // Remove node edges, they will be added later.\n newNode.edges = [];\n\n // Let consider io nodes level = null for GraphItinerary\n if (newNode.io) {\n newNode.coords = newNode.coords.clone();\n newNode.coords.level = null;\n }\n\n return newNode;\n });\n\n const edges: GraphEdge<E2, N2>[] = [];\n networkNodes.forEach((node, idx, arr) => {\n if (idx === 0) {\n return;\n }\n\n // Retrieve network edge\n const prevNode = arr[idx - 1];\n const edge = getEdgeByNodes(prevNode.edges, prevNode, node);\n\n if (!edge) {\n Logger.error('Cannot retrieve edge to create itinerary');\n return;\n }\n\n // Create itinerary edge\n const newEdge = new GraphEdge(\n nodes[idx - 1],\n nodes[idx],\n edge.level,\n edge.builtFrom\n );\n newEdge.isOneway = edge.isOneway;\n edges.push(newEdge);\n });\n\n return new GraphItinerary(start, end, nodes, edges, edgesWeights);\n }\n}\n\nexport default GraphItinerary;\n","import Coordinates from '../coordinates/Coordinates.js';\nimport GraphNode from '../graph/GraphNode.js';\n\nclass NoRouteFoundError<T> extends Error {\n\n details?: string | null;\n end: GraphNode<T> | Coordinates;\n start: GraphNode<T> | Coordinates;\n\n constructor(start: GraphNode<T> | Coordinates, end: GraphNode<T> | Coordinates, details?: string | null) {\n super();\n this.start = start;\n this.end = end;\n this.details = details;\n }\n\n get startStr() {\n if (this.start instanceof GraphNode<T>) {\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 GraphNode<T>) {\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 GraphEdge from '../graph/GraphEdge.js';\n\n\nclass GraphRouterOptions<N, E> {\n\n /** in meters */\n projectionMaxDistance = 50;\n\n weightEdgeFn = (edge: GraphEdge<E, N>) => edge.length;\n acceptEdgeFn: (edge: GraphEdge<E, N>) => boolean = () => true;\n\n}\n\nexport default GraphRouterOptions;\n","import Coordinates from '../coordinates/Coordinates.js';\nimport Level from '../coordinates/Level.js';\n\nimport GraphEdge from '../graph/GraphEdge.js';\nimport Network from '../graph/Network.js';\nimport GraphNode from '../graph/GraphNode.js';\nimport MapMatching from '../graph/MapMatching.js';\n\nimport NoRouteFoundError from './NoRouteFoundError.js';\nimport GraphRouterOptions from './GraphRouterOptions.js';\nimport GraphItinerary from './GraphItinerary.js';\n\ntype Vertex<N, E> = GraphNode<N, E> & { uniqueRouterId: number };\n\nclass GraphRouter<N, E> {\n\n _mapMatching: MapMatching<N, E>;\n _network: Network<N, E>;\n disabledEdges: Set<GraphEdge<E, N>> = new Set();\n\n constructor(network: Network<N, E>) {\n this._network = network;\n this._mapMatching = new MapMatching(network);\n }\n\n getShortestPath(\n start: GraphNode<N, E> | Coordinates,\n end: GraphNode<N, E> | Coordinates,\n options = new GraphRouterOptions<N, E>()\n ) {\n\n if (!(start instanceof GraphNode) && !(start instanceof Coordinates)) {\n throw new Error('Unknown start type');\n }\n\n if (!(end instanceof GraphNode) && !(end instanceof Coordinates)) {\n throw new Error('Unknown end type');\n }\n\n const { acceptEdgeFn, weightEdgeFn, projectionMaxDistance } = options;\n this._mapMatching.maxDistance = projectionMaxDistance;\n\n const createdNodes: GraphNode<N, E>[] = [];\n\n\n const retrieveOrCreateNearestNode = (point: GraphNode<N, E> | Coordinates) => {\n if (point instanceof GraphNode) {\n return point;\n }\n\n const closeNode = this._network.getNodeByCoords(point);\n if (closeNode) {\n return closeNode;\n }\n\n const proj = this._mapMatching.getProjection(point, true, false, false, acceptEdgeFn);\n if (!proj) {\n let message = `Point ${point.toString()} is too far from the network `\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 network at level ${Level.toString(point.level)}.`;\n }\n throw new NoRouteFoundError(start, end, message);\n }\n if (proj.nearestElement instanceof GraphNode) {\n return proj.nearestElement;\n }\n // if (proj.nearestElement instanceof Edge)\n const nodeCreated = this.createNodeInsideEdge(\n proj.nearestElement,\n proj.coords\n );\n createdNodes.push(nodeCreated);\n return nodeCreated;\n };\n\n const removeCreatedNodes = () => {\n while (createdNodes.length) {\n this.removeNodeFromPreviouslyCreatedEdge(createdNodes.pop() as GraphNode<N, E>);\n }\n };\n\n const startNode = retrieveOrCreateNearestNode(start);\n const endNode = retrieveOrCreateNearestNode(end);\n\n\n const startCoords = start instanceof GraphNode ? start.coords : start;\n const endCoords = end instanceof GraphNode ? end.coords : end;\n\n let graphItinerary;\n if (startNode === endNode) {\n graphItinerary = GraphItinerary.fromNetworkNodes<N, E>(\n startCoords, endCoords, [startNode], []\n );\n } else {\n graphItinerary = this.getShortestPathBetweenGraphNodes(\n startNode,\n endNode,\n acceptEdgeFn,\n weightEdgeFn\n );\n }\n\n // In the case of start or end are not a node, graphItinerary.start/end are first node or \n // last node. We have to override their values.\n graphItinerary.start = startCoords;\n graphItinerary.end = endCoords;\n\n removeCreatedNodes();\n\n if (!graphItinerary.nodes.length) {\n throw new NoRouteFoundError(start, end);\n }\n\n return graphItinerary;\n\n }\n\n createNodeInsideEdge(edge: GraphEdge<E, N>, point: Coordinates) {\n const a = edge.node1;\n const b = edge.node2;\n\n const m = new GraphNode<N, E>(point, null); // cannot use edge.builtFrom because of typing\n m.coords.level = edge.level;\n\n const u = edge.clone();\n u.node1 = a;\n u.node2 = m;\n\n const v = edge.clone();\n v.node1 = m;\n v.node2 = b;\n\n a.edges = a.edges.filter(_edge => _edge !== edge);\n b.edges = b.edges.filter(_edge => _edge !== edge);\n\n this._network.nodes.push(m);\n this._network.edges.push(u, v);\n\n this._network.edges = this._network.edges.filter(\n _edge => _edge !== edge\n );\n\n return m;\n }\n\n removeNodeFromPreviouslyCreatedEdge(_node: GraphNode<N, E>) {\n const u = _node.edges[0];\n const v = _node.edges[1];\n\n u.node1.edges = u.node1.edges.filter(edge => edge !== u);\n v.node1.edges = v.node1.edges.filter(edge => edge !== v);\n\n const oldEdge = u.clone();\n oldEdge.node1 = u.node1;\n oldEdge.node2 = v.node2;\n this._network.edges.push(oldEdge);\n\n this._network.nodes = this._network.nodes.filter(node => node !== _node);\n this._network.edges = this._network.edges.filter(\n edge => edge !== u && edge !== v\n );\n }\n\n getShortestPathBetweenGraphNodes(\n start: GraphNode<N, E>,\n end: GraphNode<N, E>,\n acceptEdgeFn: (edge: GraphEdge<E, N>) => boolean,\n weightFn: (edge: GraphEdge<E, N>) => number\n ) {\n\n const distanceMap: { [key: number]: number } = {},\n checking: { [key: number]: null | number } = {},\n vertexList: { [key: number]: boolean } = {},\n vertexNodes: { [key: number]: Vertex<N, E> } = {},\n parentVertices: { [key: number]: number } = {},\n path = [];\n let vertexId = 1;\n\n\n // Initially, we assume each vertex is unreachable\n this._network.nodes.forEach(vertex => {\n\n // Generate Unique Router Id\n (vertex as Vertex<N, E>).uniqueRouterId = vertexId;\n vertexNodes[vertexId] = vertex as Vertex<N, E>;\n distanceMap[vertexId] = Infinity;\n checking[vertexId] = null;\n vertexList[vertexId] = true;\n\n vertexId++;\n });\n\n const startVertex = Object.values(vertexNodes).find(vertex => start.equals(vertex)) as Vertex<N, E>;\n const endVertex = Object.values(vertexNodes).find(vertex => end.equals(vertex)) as Vertex<N, E>;\n\n // The cost from the starting vertex to the starting vertex is 0\n distanceMap[startVertex.uniqueRouterId] = 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._network.edges\n .filter(edge => {\n\n if (!acceptEdgeFn(edge) || this.disabledEdges.has(edge)) {\n return false;\n }\n\n const from = (edge.node1 as Vertex<N, E>).uniqueRouterId,\n to = (edge.node2 as Vertex<N, E>).uniqueRouterId;\n // are these vertices joined?\n return from === current || to === current;\n })\n // for each vertex we can reach\n .forEach(edge => {\n let to, from, reversed = false;\n // determine the direction of travel\n if ((edge.node1 as Vertex<N, E>).uniqueRouterId === current) {\n to = (edge.node2 as Vertex<N, E>).uniqueRouterId;\n from = (edge.node1 as Vertex<N, E>).uniqueRouterId;\n } else {\n to = (edge.node1 as Vertex<N, E>).uniqueRouterId;\n from = (edge.node2 as Vertex<N, E>).uniqueRouterId;\n reversed = true;\n }\n\n if (edge.isOneway && reversed) {\n return;\n }\n\n // distance is how far we travelled to reach the\n // current vertex, plus cost of travel the next(to)\n const distance = distanceMap[current] + weightFn(edge);\n\n // if we have found a cheaper path\n // update the hash of costs\n // and record which vertex we came from\n if (distanceMap[to] > distance) {\n distanceMap[to] = distance;\n checking[to] = current;\n parentVertices[to] = from;\n }\n });\n\n // remove vertex so we don't revisit it\n delete vertexList[current];\n }\n\n const edgesWeights = [];\n\n // now we have the most efficient paths for all vertices\n // build the path for the user specified vertex(end)\n let endId = endVertex.uniqueRouterId;\n while (parentVertices[endId]) {\n path.unshift(vertexNodes[endId]);\n edgesWeights.unshift(distanceMap[endId] - distanceMap[parentVertices[endId]]);\n endId = parentVertices[endId];\n }\n if (path.length !== 0) {\n path.unshift(start);\n }\n\n // Remove Unique Router Id\n this._network.nodes.forEach(vertex => {\n delete (vertex as GraphNode<N, E> & { uniqueRouterId?: number }).uniqueRouterId;\n });\n\n // This clone the itinerary and temporary nodes\n return GraphItinerary.fromNetworkNodes<N, E>(start.coords, end.coords, path, edgesWeights);\n }\n}\nexport default GraphRouter;\n"],"names":["wrap","deg2rad","rad2deg","Quaternion","Vector3","positiveMod","coords","Rotations","diffAngleLines","Logger","vertexId"],"mappings":"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"}
|