@wemap/routers 12.11.3 → 12.11.4

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.
@@ -0,0 +1,2 @@
1
+ "use strict";var e=Object.defineProperty,t=(t,s,r)=>(((t,s,r)=>{s in t?e(t,s,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[s]=r})(t,"symbol"!=typeof s?s+"":s,r),r);const s=require("@wemap/geo"),r=require("@wemap/maths"),n=require("@wemap/logger"),o=class e{constructor(r,n,o={},i=e.currentUniqueId++){t(this,"level"),t(this,"bearing"),t(this,"length"),this.vertex1=r,this.vertex2=n,this.properties=o,this.id=i,this.level=s.Level.union(r.coords.level,n.coords.level),this.length=this.vertex1.distanceTo(this.vertex2),this.bearing=this.vertex1.bearingTo(this.vertex2)}static getEdgeByVertices(e,t,s){return e.find((e=>t===e.vertex1&&s===e.vertex2||s===e.vertex1&&t===e.vertex2))}reverseProperties(){const{properties:e}=this;e.incline&&(e.incline="up"===e.incline?"down":"up"),e.isOneway&&(e.isOneway=!1)}};t(o,"currentUniqueId",0);let i=o;class a{constructor(e,t,s,r){this.origin=e,this.distanceFromNearestElement=t,this.coords=s,this.nearestElement=r}}class l{constructor(e,s={}){t(this,"id",-1),this.coords=e,this.properties=s}distanceTo(e){return this.coords.distanceTo(e.coords)}bearingTo(e){return this.coords.bearingTo(e.coords)}toJson(){return{id:this.id,coords:this.coords.toCompressedJson(),...Object.keys(this.properties).length>0&&{properties:this.properties}}}static fromJson(e){const t=new l(s.Coordinates.fromCompressedJson(e.coords),e.properties);return t.id=e.id,t}}class d{constructor(e,s){t(this,"exitVertices"),this.vertices=e,this.edges=s;const r=s.filter((e=>null===e.level)).map((e=>[e.vertex1,e.vertex2])).flat(),n=s.filter((e=>null!==e.level)).map((e=>[e.vertex1,e.vertex2])).flat();this.exitVertices=new Set(r.filter((e=>n.includes(e))))}getEdgeByVertices(e,t){return i.getEdgeByVertices(this.edges,e,t)}getVertexByCoords(e){return d.getVertexByCoords(this.vertices,e)}static getVertexByCoords(e,t){return e.find((e=>e.coords.equals(t)))}getVertexByName(e){return this.vertices.find((t=>t.properties.name===e))}getEdgeByName(e){return this.edges.find((t=>t.properties.name===e))}getBoundingBox(e){if(!this.vertices.length)return null;const t=s.BoundingBox.fromCoordinates(this.vertices.map((e=>e.coords)));return e&&t.extendsWithMeasure(e),t}getProjection(e,t={}){const n="maxDistance"in t,o=t.maxDistance,i="maxBearingAngle"in t;if(i&&(!(e instanceof s.UserPosition)||null===e.bearing))return null;const l=t.maxBearingAngle,d="acceptEdgeFn"in t,c=!("useMultiLevelSegments"in t)||t.useMultiLevelSegments;let u=null;const h=t=>{if(!(e instanceof s.UserPosition))return t;const r=e.clone();return r.lat=t.lat,r.lng=t.lng,r.level=t.level,r.alt=t.alt,r.heightFromFloor=t.heightFromFloor,r.heightFromGround=t.heightFromGround,r};return this.edges.forEach((p=>{if(d&&!t.acceptEdgeFn(p))return;if(!c&&s.Level.isRange(p.level))return;if(!s.Level.intersect(p.level,e.level))return;if(i&&r.diffAngleLines(p.bearing,e.bearing)>l)return;const g=e.getSegmentProjection(p.vertex1.coords,p.vertex2.coords);if(!g)return;const m=g.distanceTo(e);n&&m>o||m<((null==u?void 0:u.distanceFromNearestElement)??Number.MAX_VALUE)&&(u=new a(e,m,h(g),p))})),i||this.vertices.forEach((t=>{let r=t.coords;if(this.exitVertices.has(t)&&null===e.level&&(r=t.coords.clone(),r.level=null),!c&&s.Level.isRange(r.level))return;if(!s.Level.intersect(r.level,e.level))return;const i=r.distanceTo(e);i<s.Constants.EPS_MM?u=new a(e,0,h(r),t):n&&i>o||i<((null==u?void 0:u.distanceFromNearestElement)??Number.MAX_VALUE)&&(u=new a(e,i,h(r),t))})),u}toJson(){return{vertices:this.vertices.map((e=>e.toJson())),edges:this.edges.map((e=>({id:e.id,vertex1Idx:this.vertices.indexOf(e.vertex1),vertex2Idx:this.vertices.indexOf(e.vertex2),...Object.keys(e.properties).length>0&&{properties:e.properties}})))}}static fromJson(e){const t=e.vertices.map((e=>l.fromJson(e))),s=e.edges.map((e=>new i(t[e.vertex1Idx],t[e.vertex2Idx],e.properties,e.id)));return new d(t,s)}toCompressedJson(){return{vertices:this.vertices.map((e=>e.coords.toCompressedJson())),verticesIds:this.vertices.map((e=>e.id)),edges:this.edges.map((e=>{const t=this.vertices.indexOf(e.vertex1),s=this.vertices.indexOf(e.vertex2),r=e.properties;return Object.keys(r).length>0?[t,s,r]:[t,s]}))}}static fromCompressedJson(e){const t=e.vertices.map((e=>new l(s.Coordinates.fromCompressedJson(e)))),r=e.edges.map((e=>new i(t[e[0]],t[e[1]],e.length>2?e[2]:{})));return new d(t,r)}static fromCoordinatesSegments(e){const t=[],s=[],r=e=>{const s=t.find((t=>t.coords.equals(e)));if(s)return s;const r=new l(e);return t.push(r),r};for(const n of e){let e=null;for(const t of n){const n=r(t);e&&s.push(new i(n,e)),e=n}}return new d(t,s)}getEdgesAtLevel(e,t=!0){return this.edges.filter((({level:r})=>t?s.Level.intersect(e,r):s.Level.contains(e,r)))}toDetailedString(){let e=`--- Network ---\nVertices: ${this.vertices.length}\nEdges: ${this.edges.length}\n---\nVertices\n`;return this.vertices.forEach((t=>{e+=t.id;const s=t.properties;0!==Object.keys(s).length&&(e+=` ${s}`)})),e+="---\nEdges\n",this.edges.forEach((t=>{e+=`${t.id} - [v1: ${t.vertex1.id}, v2: ${t.vertex2.id}]`;const s=t.properties;0!==Object.keys(s).length&&(e+=` ${s}`)})),e+="---",e}}function c(e,t=5){return e/(1e3*t/3600)}function u(e){return["AIRPLANE","BOAT","BUS","FERRY","FUNICULAR","METRO","MULTI","TRAIN","TRAM"].includes(e)}function h(e){return{...e.firstStep&&{firstStep:!0},...e.lastStep&&{lastStep:!0},number:e.number,coords:e.coords.toCompressedJson(),...null!==e.name&&{name:e.name},angle:Number(e.angle.toFixed(2)),previousBearing:Number(e.previousBearing.toFixed(2)),nextBearing:Number(e.nextBearing.toFixed(2)),distance:Number(e.distance.toFixed(1)),duration:Number(e.duration.toFixed(1)),...null!==e.levelChange&&{levelChange:e.levelChange},...e.extras&&0!==Object.keys(e.extras).length&&{extras:e.extras}}}function p(e){return Object.assign({},e,{coords:s.Coordinates.fromCompressedJson(e.coords),firstStep:Boolean(e.firstStep),lastStep:Boolean(e.lastStep),name:e.name||null,levelChange:e.levelChange||null,extras:e.extras||null})}function g(e,t){var s,r,n,o,i,a;return e.coords.equals(t.coords)&&Math.abs(e.angle-t.angle)<=.005&&Math.abs(e.distance-t.distance)<=.05&&Math.abs(e.duration-t.duration)<=.05&&e.firstStep===t.firstStep&&e.lastStep===t.lastStep&&(null==(s=e.levelChange)?void 0:s.difference)===(null==(r=t.levelChange)?void 0:r.difference)&&(null==(n=e.levelChange)?void 0:n.direction)===(null==(o=t.levelChange)?void 0:o.direction)&&(null==(i=e.levelChange)?void 0:i.type)===(null==(a=t.levelChange)?void 0:a.type)&&e.name===t.name&&Math.abs(e.nextBearing-t.nextBearing)<=.005&&e.number===t.number&&Math.abs(e.previousBearing-t.previousBearing)<=.005}class m extends d{constructor(e,t,s,r,n){super(s,r),this.start=e,this.end=t,this.vertices=s,this.edges=r,this.edgesWeights=n}reverse(){const e=this.vertices.slice().reverse(),t=this.edges.slice().reverse(),s=this.edgesWeights.slice().reverse();return t.map((e=>new i(e.vertex2,e.vertex1,e.properties))),new m(this.start,this.end,e,t,s)}static fromCoordinates(e,t,s){const r=d.fromCoordinatesSegments([s]),n=r.edges.map((e=>c(e.length)));return new m(e,t,r.vertices,r.edges,n)}get hasRoute(){return Boolean(this.vertices.length)}}const v=r.deg2rad(20);class f{constructor(){t(this,"start",null),t(this,"end",null),t(this,"pathCoords",null),t(this,"stepsInfo",[])}setStart(e){return this.start=e,this}setEnd(e){return this.end=e,this}setPathCoords(e){return this.pathCoords=e,this}setStepsInfo(e){return this.stepsInfo=e,this}addStepInfo(e){return this.stepsInfo.push(e),this}setGraphRoute(e){const t=[],{start:n,end:o}=e;if(!e.hasRoute)return this;let i=null,a=n.bearingTo(e.vertices[0].coords);for(let d=0;d<e.vertices.length-1;d++){const n=0===d,o=e.vertices[d],l=o.coords,c=e.vertices[d+1],u=c.coords,h=e.edges[d],p=o.bearingTo(c),g=r.diffAngle(a,p+Math.PI),m=t.length?t[t.length-1]:null,{isSubwayEntrance:f,isGate:T,subwayEntranceRef:x}=o.properties,{isElevator:y,areEscalators:C,areStairs:w,isMovingWalkway:b,incline:N}=h.properties;let E,I=null;I=y?"elevator":C?"escalator":w?"stairs":b?"moving walkway":"incline plane",(w||y)&&N&&!(null==m?void 0:m.levelChange)&&(E=N);const M=d>0?e.edges[d-1]:null,L=(null==M?void 0:M.properties)||{},A=Boolean(L.incline&&L.areStairs&&(!N||!w)),S=o.properties.isSubwayEntrance,R=h.properties.name||null,B=e.edgesWeights[d],O={...f&&{isSubwayEntrance:f},...x&&{subwayEntranceRef:x},...T&&{isGate:T}};let U=Math.abs(r.diffAngle(Math.PI,g))>=v;const F=s.Level.isRange(h.level)&&!s.Level.isRange(l.level)||E;U=U&&!(l.level&&s.Level.isRange(l.level));const J=(null==m?void 0:m.levelChange)&&!s.Level.isRange(l.level)||A;if(n||(U||F||J||S)){let e;if(F){const t=s.Level.diff(l.level,u.level)||0;let r=t>0?"up":"down";E&&(r=E),e={difference:t,direction:r,...I&&{type:I}}}i={coords:l,...R&&{name:R},extras:O,levelChange:e,distance:0,duration:0},t.push(i)}i.distance+=l.distanceTo(u),i.duration+=B,a=p}const l=e.vertices[e.vertices.length-1].coords;return s.Coordinates.equals(l,o)||t.push({coords:l}),this.setStart(n),this.setEnd(o),this.setPathCoords(e.vertices.map((e=>e.coords))),this.setStepsInfo(t),this}build(){const{pathCoords:e,start:t,end:s}=this;if(!e)return n.warn('StepsBuilder: Missing "pathCoords" property to build steps'),[];if(!t)return n.warn('StepsBuilder: Missing "from" property to build steps'),[];if(!s)return n.warn('StepsBuilder: Missing "to" property to build steps'),[];0===this.stepsInfo.length&&this.setGraphRoute(m.fromCoordinates(t,s,e));const{stepsInfo:o}=this;return o.map(((n,i)=>{const a=e.findIndex((e=>e.equals(n.coords)));if(-1===a)throw new Error("Cannot find step coordinates in itinerary coordinates.");const l=0===a?t:e[a-1],d=a===e.length-1?s:e[a+1],u=l.bearingTo(n.coords),h=n.coords.bearingTo(d);let p=0;const g=i===o.length-1,m=g?e[e.length-1]:o[i+1].coords;let v=a;for(;!e[v].equals(m);)p+=e[v].distanceTo(e[v+1]),v++;return{coords:n.coords,name:n.name||null,number:i+1,previousBearing:u,nextBearing:h,angle:r.diffAngle(u,h+Math.PI),firstStep:0===i,lastStep:g,distance:p,duration:n.duration||c(p),levelChange:n.levelChange||null,extras:n.extras||null}}))}}class T{constructor({start:e,end:r,coords:n,transitMode:o,duration:i,startTime:a,endTime:l,transportInfo:d,steps:u}){t(this,"start"),t(this,"end"),t(this,"coords"),t(this,"distance"),t(this,"transitMode"),t(this,"duration"),t(this,"startTime"),t(this,"endTime"),t(this,"steps"),t(this,"transportInfo"),this.start={name:e.name||null,coords:e.coords},this.end={name:r.name||null,coords:r.coords},this.coords=n,this.transitMode=o,this.distance=s.Utils.calcDistance(n),this.duration="number"==typeof i?i:c(this.distance),this.startTime="number"==typeof a?a:null,this.endTime="number"==typeof l?l:null,this.transportInfo=d||null,this.steps=Array.isArray(u)?u:(new f).setStart(e.coords).setEnd(r.coords).setPathCoords(n).build()}isPublicTransport(){return u(this.transitMode)}toGraph(){return d.fromCoordinatesSegments([this.coords])}static equals(e,t){var s,r;if(!(e.transitMode===t.transitMode&&Math.abs(e.duration-t.duration)<=.05&&e.startTime===t.startTime&&e.endTime===t.endTime&&e.start.name===t.start.name&&e.start.coords.equals(t.start.coords)&&e.end.name===t.end.name&&e.end.coords.equals(t.end.coords)&&e.coords.length===t.coords.length&&(e.steps===t.steps||(null==(s=e.steps)?void 0:s.length)===(null==(r=t.steps)?void 0:r.length))))return!1;let n;for(n=0;n<e.coords.length;n++)if(!e.coords[n].equals(t.coords[n]))return!1;for(n=0;n<e.steps.length;n++)if(!g(e.steps[n],t.steps[n]))return!1;if(e.transportInfo!==t.transportInfo){if(null===e.transportInfo||null===t.transportInfo)return!1;if(e.transportInfo.name!==t.transportInfo.name||e.transportInfo.routeColor!==t.transportInfo.routeColor||e.transportInfo.routeTextColor!==t.transportInfo.routeTextColor||e.transportInfo.directionName!==t.transportInfo.directionName)return!1}return!0}equals(e){return T.equals(this,e)}toJson(){return{transitMode:this.transitMode,start:{coords:this.start.coords.toCompressedJson(),...this.start.name&&{name:this.start.name}},end:{coords:this.end.coords.toCompressedJson(),...this.end.name&&{name:this.end.name}},distance:Number(this.distance.toFixed(1)),duration:Number(this.duration.toFixed(1)),coords:this.coords.map((e=>e.toCompressedJson())),steps:this.steps.map(h),...null!==this.startTime&&{startTime:this.startTime},...null!==this.endTime&&{endTime:this.endTime},...null!==this.transportInfo&&{transportInfo:this.transportInfo}}}static fromJson(e){var t;return new T(Object.assign({},e,{start:{coords:s.Coordinates.fromCompressedJson(e.start.coords),name:e.start.name||null},end:{coords:s.Coordinates.fromCompressedJson(e.end.coords),name:e.end.name||null},coords:e.coords.map(s.Coordinates.fromCompressedJson),steps:(null==(t=e.steps)?void 0:t.map(p))||null}))}static fromGraphRoute(e,t="WALK"){return new T({start:{coords:e.start},end:{coords:e.end},coords:e.vertices.map((e=>e.coords)),duration:e.edgesWeights.reduce(((e,t)=>e+t),0),transitMode:t,steps:(new f).setGraphRoute(e).build()})}multiplyLevel(e){this.start.coords.level=s.Level.multiplyBy(this.start.coords.level,e),this.end.coords.level=s.Level.multiplyBy(this.end.coords.level,e);for(const t of this.coords)t.level=s.Level.multiplyBy(t.level,e);this.steps.forEach((t=>{t.coords.level=s.Level.multiplyBy(t.coords.level,e)}))}}class x{constructor({origin:e,destination:s,duration:r,legs:n,startTime:o,endTime:i}){t(this,"origin"),t(this,"destination"),t(this,"duration"),t(this,"legs"),t(this,"_transitMode",null),t(this,"startTime"),t(this,"endTime"),t(this,"_coords",null),t(this,"_distance",null),this.origin=e,this.destination=s,this.legs=n,this.duration="number"==typeof r?r:this.legs.reduce(((e,t)=>e+t.duration),0),this.startTime="number"==typeof o?o:null,this.endTime="number"==typeof i?i:null,this.updateStepsFromLegs()}set coords(e){throw new Error("Itinerary.coords cannot be set. They are calculated from Itinerary.legs.")}get coords(){return this._coords||(this._coords=this.legs.map((e=>e.coords)).flat().filter(((e,t,s)=>0===t||!s[t-1].equals(e)))),this._coords}set steps(e){throw new Error("Itinerary.step cannot be set. They are calculated from Itinerary.legs.")}get steps(){return this.legs.map((e=>e.steps)).flat()}set transitMode(e){throw new Error("Itinerary.transitMode cannot be set. They are calculated from Itinerary.legs.")}get transitMode(){if(!this._transitMode){const e=new Set(this.legs.map((e=>e.transitMode)));if(e.delete("WALK"),e.size>1)return this._transitMode="MULTI",this._transitMode;if(1===e.size)return this._transitMode=e.values().next().value,this._transitMode;this._transitMode="WALK"}return this._transitMode}set distance(e){throw new Error("Itinerary.distance cannot be set. They are calculated from Itinerary.legs.")}get distance(){return null===this._distance&&(this._distance=s.Utils.calcDistance(this.coords)),this._distance}toGraph(){return d.fromCoordinatesSegments([this.coords])}static fromItineraries(...e){return new x({origin:e[0].origin,destination:e[e.length-1].destination,legs:e.map((e=>e.legs)).flat()})}static fromOrderedPointsArray(e,t,r){const n=e=>new s.Coordinates(e[0],e[1],null,e[2]);return this.fromOrderedCoordinates(e.map(n),n(t),n(r))}static fromOrderedCoordinates(e,t,s,r="WALK"){const n=(new f).setPathCoords(e).setStart(t).setEnd(s).build(),o=new T({start:{coords:t},end:{coords:s},coords:e,transitMode:r,steps:n});return new x({origin:t,destination:s,legs:[o]})}static equals(e,t){if(!(e.origin.equals(t.origin)&&e.destination.equals(t.destination)&&Math.abs(e.distance-t.distance)<=.05&&Math.abs(e.duration-t.duration)<=.05&&e.startTime===t.startTime&&e.endTime===t.endTime&&e.legs.length===t.legs.length))return!1;for(let s=0;s<e.legs.length;s++)if(!e.legs[s].equals(t.legs[s]))return!1;return!0}equals(e){return x.equals(this,e)}toJson(){return{origin:this.origin.toJson(),destination:this.destination.toJson(),distance:Number(this.distance.toFixed(1)),duration:Number(this.duration.toFixed(1)),transitMode:this.transitMode,legs:this.legs.map((e=>e.toJson())),...null!==this.startTime&&{startTime:this.startTime},...null!==this.endTime&&{endTime:this.endTime}}}static fromJson(e){return new x({origin:s.Coordinates.fromJson(e.origin),destination:s.Coordinates.fromJson(e.destination),duration:e.duration,legs:e.legs.map(T.fromJson),startTime:e.startTime,endTime:e.endTime})}static fromGraphRoute(e,t="WALK"){const s=T.fromGraphRoute(e,t);return new x({origin:e.start,destination:e.end,legs:[s]})}multiplyLevel(e){this.origin.level=s.Level.multiplyBy(this.origin.level,e),this.destination.level=s.Level.multiplyBy(this.destination.level,e),this.legs.forEach((t=>t.multiplyLevel(e)))}forceUnknownLevelTo0(){this.origin.level=this.origin.level||0,this.destination.level=this.destination.level||0;for(const e of this.legs){e.start.coords.level=e.start.coords.level||0,e.end.coords.level=e.end.coords.level||0;for(const t of e.coords)t.level=t.level||0;if(e.steps)for(const t of e.steps)t.coords.level=t.coords.level||0}if(this._coords)for(const e of this._coords)e.level=e.level||0}toGeoJson(){const e=(e,t,s)=>({type:"Feature",properties:{name:t,level:e.level,...s&&{type:s}},geometry:{type:"Point",coordinates:[e.lng,e.lat]}}),t=[...new Set(this.coords.map((e=>s.Level.toString(e.level))))].map(s.Level.fromString).map((e=>[e,s.Utils.createSegmentsAtLevel(this.coords,e,!0)])).map((([e,t])=>((e,t)=>({type:"Feature",properties:{level:t,name:null==t?void 0:t.toString()},geometry:{type:"MultiLineString",coordinates:e.map((e=>e.map((({lat:e,lng:t})=>[t,e]))))}}))(t,e))),r=this.legs.map(((t,s)=>e(t.start.coords,`Leg ${s} start`,"leg-start"))),n=this.legs.map(((t,s)=>e(t.end.coords,`Leg ${s} end`,"leg-end"))),o=this.steps.map((t=>e(t.coords,`Step ${t.number}`,"step")));return{type:"FeatureCollection",features:[e(this.origin,"origin","origin"),e(this.destination,"destination","destination"),...t,...r,...n,...o]}}updateStepsFromLegs(){const e=this.coords.filter(((e,t,s)=>0===t||!s[t-1].equals(e))),t=this.legs.map((e=>e.steps)).flat();t.map(((s,n)=>{const o=e.findIndex((e=>e.equals(s.coords)));if(-1===o)throw new Error("Cannot find step coordinates in itinerary coordinates.");const i=0===o?this.origin:e[o-1],a=o===e.length-1?this.destination:e[o+1];s.previousBearing=i.bearingTo(s.coords),s.nextBearing=s.coords.bearingTo(a),s.angle=r.diffAngle(s.previousBearing,s.nextBearing+Math.PI),s.number=n+1,s.firstStep=0===n,s.lastStep=n===t.length-1}))}}class y{}var C=(e=>(e[e.OK=0]="OK",e[e.CANCELLED=1]="CANCELLED",e[e.UNKNOWN=2]="UNKNOWN",e[e.INVALID_ARGUMENT=3]="INVALID_ARGUMENT",e[e.NOT_FOUND=5]="NOT_FOUND",e[e.UNIMPLEMENTED=12]="UNIMPLEMENTED",e[e.INTERNAL=13]="INTERNAL",e[e.UNAVAILABLE=14]="UNAVAILABLE",e[e.UNAUTHENTICATED=16]="UNAUTHENTICATED",e))(C||{});class w extends Error{constructor(e=C.UNKNOWN,s){super(s),t(this,"customMapName"),this.code=e}static notFound(e){return new w(C.NOT_FOUND,`Cannot found an itinerary. Details: ${e}`)}}class b extends w{constructor(e=C.UNKNOWN,t,s){super(e,s),this.code=e,this.mapName=t,this.mapName=t}static notFound(e,t){return new b(C.NOT_FOUND,e,`Cannot found an itinerary in map ${e}. Details: ${t||"No details"}`)}}class N extends w{constructor(e=C.UNKNOWN,t,s){super(e,s),this.code=e,this.routerName=t,this.routerName=t}static notFound(e,t){return new N(C.NOT_FOUND,e,`Cannot found an itinerary with ${e}. Details: ${t||"No details"}`)}static missingApiKey(e,t){return new N(C.UNAUTHENTICATED,e,`API key is missing for ${e}. Details: ${t}`)}static unreachableServer(e,t){return new N(C.NOT_FOUND,e,`Remote router server ${e} is unreachable. URL: ${t}`)}static responseNotParsing(e,t){return new N(C.NOT_FOUND,e,`Remote router server response ${e} cannot be parsed. URL: ${t}`)}static travelModeUnimplemented(e,t){return new N(C.UNIMPLEMENTED,e,`Travel mode "${t}" is not implemented for ${e}`)}}const E=new Map;E.set("CAR","CAR"),E.set("WALK","WALK"),E.set("BIKE","BIKE");const I=new class extends y{constructor(){super(...arguments),t(this,"inputModeCorrespondance",(e=>{var t;const{travelMode:s,travelModePreference:r}=e;if("WALK"===s&&(null==(t=e.itineraryModifiers)?void 0:t.isWheelchair))return"pmr";if("WALK"===s)return"walking";if("BIKE"===s)return"FASTEST"===r?"bike-fastest":"bike-safest";if("CAR"===s)return"driving";throw N.travelModeUnimplemented(this.rname,s)}))}get rname(){return"osrm"}async getItineraries(e,t){const s=this.getURL(e,t),r=await fetch(s).catch((()=>{throw N.unreachableServer(this.rname,s)})),n=await r.json().catch((()=>{throw N.responseNotParsing(this.rname,s)}));return this.parseResponse(n,t.origin,t.destination,t.travelMode)}getURL(e,t){const{origin:s,destination:r}=t;let n=e+"/route/v1/"+this.inputModeCorrespondance(t)+"/";return n+=[s,...t.waypoints||[],r].map((e=>[e.longitude+","+e.latitude])).join(";"),n+="?geometries=geojson&overview=full&steps=true",t.provideItineraryAlternatives&&(n+="&alternatives=true"),n}coordinatesToJson({lat:e,lng:t,level:r}){return null===r?[t,e]:s.Level.isRange(r)?[t,e,r[0]]:[t,e,r]}jsonToCoordinates(e){const t=new s.Coordinates(e[1],e[0]);return e.length>2&&(t.level=e[2]),t}getModifierFromAngle(e){const t=r.positiveMod(r.rad2deg(e),360);return t>0&&t<60?"sharp right":t>=60&&t<140?"right":t>=140&&t<160?"slight right":t>=160&&t<=200?"straight":t>200&&t<=220?"slight left":t>220&&t<=300?"left":t>300&&t<360?"sharp left":"u turn"}noRouteFoundJson(e){return{code:"NoRoute",message:e}}itineraryToOsrmJson(e){const t=e.legs.length-1,s=e.steps,n=e.legs.map((({distance:e,duration:n,coords:o},i)=>{const a=s.filter((e=>o.find((t=>t.equals(e.coords))))),l=a.length-1;return{distance:e,duration:n||0,steps:a.map(((e,s,n)=>{let a=0===s&&0===i?"depart":"turn";a=s===l&&i===t?"arrive":a;const d=o.findIndex((t=>t.equals(e.coords))),c=s===l?d:o.findIndex((e=>e.equals(n[s+1].coords)));return{geometry:{type:"LineString",coordinates:o.slice(d,c+1).map(this.coordinatesToJson)},distance:e.distance,duration:e.duration||0,...e.name&&{name:e.name},maneuver:{bearing_before:r.rad2deg(e.previousBearing),bearing_after:r.rad2deg(e.nextBearing),location:this.coordinatesToJson(e.coords),modifier:this.getModifierFromAngle(e.angle),type:a}}}))}}));return{code:"Ok",routes:[{geometry:{type:"LineString",coordinates:e.coords.map(this.coordinatesToJson)},legs:n,distance:e.distance,duration:e.duration,weight_name:"routability",weight:0}],waypoints:[]}}parseResponse(e,t,s,r){const n=E.get(r),{routes:o}=e;if(!o)throw N.notFound(this.rname,e.message);return o.map((e=>{const r=e.legs.map((e=>{var t;const s=e.steps.map((e=>e.geometry.coordinates.map(this.jsonToCoordinates))).flat().filter(((e,t,s)=>0===t||!s[t-1].equals(e))),r=s[0],o=s[s.length-1],i=(new f).setPathCoords(s).setStart(r).setEnd(o);return null==(t=e.steps)||t.forEach((({maneuver:e,name:t,distance:r,duration:n})=>{const o=this.jsonToCoordinates(e.location),a=s.map((e=>e.distanceTo(o))),l=a.indexOf(Math.min(...a));if(l<0)throw new Error("Osrm Parser: Cannot find step coords in leg coordinates");i.addStepInfo({coords:s[l],name:t,distance:r,duration:n})})),new T({transitMode:n,duration:e.duration,coords:s,start:{coords:r},end:{coords:o},steps:i.build()})}));return new x({duration:e.duration,origin:t,destination:s,legs:r})}))}};exports.Edge=i,exports.Graph=d,exports.GraphProjection=a,exports.GraphRoute=m,exports.Itinerary=x,exports.Leg=T,exports.OsrmRemoteRouter=I,exports.RemoteRouter=y,exports.RemoteRoutingError=N,exports.RoutingError=w,exports.StatusCode=C,exports.StepsBuilder=f,exports.Vertex=l,exports.WemapMultiRoutingError=b,exports.areTransitAndTravelModeConsistent=function(e,t){return e===t||u(e)&&"TRANSIT"===t||"WALK"===e&&"TRANSIT"===t},exports.getDurationFromLength=c,exports.isTransitModePublicTransport=u;
2
+ //# sourceMappingURL=OsrmRemoteRouter-df92c42f.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OsrmRemoteRouter-df92c42f.cjs","sources":["../src/graph/Edge.ts","../src/graph/GraphProjection.ts","../src/graph/Vertex.ts","../src/graph/Graph.ts","../src/Utils.ts","../src/model/TransitMode.ts","../src/model/Step.ts","../src/graph/GraphRoute.ts","../src/model/StepsBuilder.ts","../src/model/Leg.ts","../src/model/Itinerary.ts","../src/remote/RemoteRouter.ts","../src/StatusCode.ts","../src/RoutingError.ts","../src/remote/osrm/OsrmRemoteRouter.ts"],"sourcesContent":["import { Level, type Level_t } from '@wemap/geo';\n\nimport Vertex from './Vertex.js';\n\nexport type EdgeSmoothness = 'excellent' | 'good' | 'intermediate' | 'bad' | 'horrible';\nexport type EdgeSurface = 'asphalt' | 'compacted' | 'concrete' | 'grass' | 'gravel' | 'ground' | 'metal' | 'paving_stones' | 'wood';\nexport type EdgeWheelchair = 'yes' | 'no' | 'designated'; // Default is 'yes'\n\nexport type EdgeProperties = {\n \n name?: string;\n externalId?: string | number;\n\n isOneway?: boolean;\n areStairs?: boolean;\n isElevator?: boolean;\n areEscalators?: boolean;\n isMovingWalkway?: boolean;\n needTicket?: boolean;\n incline?: 'up' | 'down';\n wheelchair?: EdgeWheelchair;\n smoothness?: EdgeSmoothness;\n surface?: EdgeSurface;\n}\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 */\nexport default class Edge {\n\n static currentUniqueId = 0;\n\n public readonly level: Level_t;\n\n /** Edge bearing from vertex1 to vertex2 */\n public readonly bearing: number;\n public readonly length: number;\n\n constructor(\n public vertex1: Vertex,\n public vertex2: Vertex,\n public properties: EdgeProperties = {},\n public readonly id: number = Edge.currentUniqueId++\n ) {\n this.level = Level.union(vertex1.coords.level, vertex2.coords.level)\n this.length = this.vertex1.distanceTo(this.vertex2);\n this.bearing = this.vertex1.bearingTo(this.vertex2);\n }\n\n static getEdgeByVertices(\n edges: Edge[],\n vertex1: Vertex,\n vertex2: Vertex\n ) {\n return edges.find(edge => vertex1 === edge.vertex1 && vertex2 === edge.vertex2\n || vertex2 === edge.vertex1 && vertex1 === edge.vertex2\n );\n }\n\n reverseProperties() {\n const { properties } = this;\n if (properties.incline) {\n properties.incline = properties.incline === 'up' ? 'down' : 'up';\n }\n if (properties.isOneway) {\n properties.isOneway = false;\n }\n }\n}\n","import { Coordinates, UserPosition } from '@wemap/geo';\n\nimport Edge from './Edge.js';\nimport Vertex from './Vertex.js';\n\nclass GraphProjection<U extends Coordinates | UserPosition = Coordinates> {\n constructor(\n public readonly origin: U,\n public readonly distanceFromNearestElement: number,\n public readonly coords: U,\n public readonly nearestElement: Vertex | Edge\n ) { }\n}\n\nexport default GraphProjection;\n","import { Coordinates } from '@wemap/geo';\n\nimport { GraphVertexJson } from '../types.js';\n\nexport type VertexProperties = {\n\n name?: string;\n externalId?: string | number;\n\n isGate?: boolean;\n isSubwayEntrance?: boolean;\n subwayEntranceRef?: string;\n}\n\nexport default class Vertex {\n\n public id = -1;\n\n constructor(public coords: Coordinates, public properties: VertexProperties = {}) { }\n\n distanceTo(other: Vertex) {\n return this.coords.distanceTo(other.coords);\n }\n\n bearingTo(other: Vertex) {\n return this.coords.bearingTo(other.coords);\n }\n\n toJson(): GraphVertexJson {\n return {\n id: this.id,\n coords: this.coords.toCompressedJson(),\n ...(Object.keys(this.properties).length > 0 && { properties: this.properties })\n }\n }\n\n static fromJson(json: GraphVertexJson) {\n const v = new Vertex(\n Coordinates.fromCompressedJson(json.coords),\n json.properties\n );\n v.id = json.id;\n return v;\n }\n}\n","import { diffAngleLines } from '@wemap/maths';\nimport { BoundingBox, Coordinates, Level, UserPosition, Level_t, Constants as GeoConstants } from '@wemap/geo';\n\nimport Edge from './Edge.js';\nimport GraphProjection from './GraphProjection.js';\nimport Vertex from './Vertex.js';\nimport { type CompressedGeoGraphJson, type GeoGraphJson } from '../types.js';\nimport { type GraphProjectionOptions } from './GraphProjectionOptions.js';\n\n\nclass Graph {\n\n /**\n * exitVertices are vertices that have at least one indoor edge and one outdoor edge\n * They are stored because the Level model cannot handle an indoor and outdoor state like [null, 1] or [null, [1,2]]\n * This vertices are used to cover the projection case:\n * - if projection origin is null, an exit vertex can be used\n * - if projection origin is not null, the intersection level with an exit vertex can be used\n */\n public readonly exitVertices: Set<Vertex>;\n\n constructor(public readonly vertices: Vertex[], public readonly edges: Edge[]) {\n const nullVertices = edges.filter(e => e.level === null).map(e => [e.vertex1, e.vertex2]).flat();\n const levelVertices = edges.filter(e => e.level !== null).map(e => [e.vertex1, e.vertex2]).flat();\n this.exitVertices = new Set(nullVertices.filter(v1 => levelVertices.includes(v1)));\n }\n\n getEdgeByVertices(vertex1: Vertex, vertex2: Vertex) {\n return Edge.getEdgeByVertices(this.edges, vertex1, vertex2);\n }\n\n getVertexByCoords(coords: Coordinates) {\n return Graph.getVertexByCoords(this.vertices, coords);\n }\n\n static getVertexByCoords(vertices: Vertex[], coords: Coordinates) {\n return vertices.find(vertex => vertex.coords.equals(coords));\n }\n\n getVertexByName(name: string) {\n return this.vertices.find(vertex => vertex.properties.name === name);\n }\n\n getEdgeByName(name: string) {\n return this.edges.find(edge => edge.properties.name === name);\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 getProjection<U extends (Coordinates | UserPosition)>(\n origin: U,\n options: GraphProjectionOptions = {}\n ): GraphProjection<U> | null {\n\n const useMaxDistance = 'maxDistance' in options;\n const maxDistance = options.maxDistance!\n\n const useMaxBearingAngle = 'maxBearingAngle' in options;\n if (useMaxBearingAngle && (!(origin instanceof UserPosition) || origin.bearing === null)) return null;\n const maxBearingAngle = options.maxBearingAngle!;\n\n const useAcceptEdgeFn = 'acceptEdgeFn' in options;\n\n const useMultiLevelSegments = !('useMultiLevelSegments' in options) || options.useMultiLevelSegments;\n\n let bestProjection: GraphProjection<U> | null = null;\n\n // (for as any) See. https://www.totaltypescript.com/any-considered-harmful#returning-conditional-types-from-generic-functions\n const adaptProjectionCoords = (projCoords: Coordinates): U => {\n if (!(origin instanceof UserPosition)) return projCoords as any;\n const p = origin.clone();\n p.lat = projCoords.lat;\n p.lng = projCoords.lng;\n p.level = projCoords.level;\n p.alt = projCoords.alt;\n p.heightFromFloor = projCoords.heightFromFloor;\n p.heightFromGround = projCoords.heightFromGround;\n return p as any;\n }\n\n this.edges.forEach(edge => {\n\n if (useAcceptEdgeFn && !options.acceptEdgeFn!(edge)) return;\n if (!useMultiLevelSegments && Level.isRange(edge.level)) return;\n if (!Level.intersect(edge.level, origin.level)) return;\n\n if (useMaxBearingAngle) {\n // Do not try to project if angle is greater than the threshold\n if (diffAngleLines(edge.bearing, (origin as UserPosition).bearing!) > maxBearingAngle) return;\n }\n\n const segmentProjection = origin.getSegmentProjection(edge.vertex1.coords, edge.vertex2.coords);\n if (!segmentProjection) return;\n const distanceToSegment = segmentProjection.distanceTo(origin);\n\n if (useMaxDistance && distanceToSegment > maxDistance) return;\n\n if (distanceToSegment < (bestProjection?.distanceFromNearestElement ?? Number.MAX_VALUE)) {\n bestProjection = new GraphProjection(origin, distanceToSegment, adaptProjectionCoords(segmentProjection), edge);\n }\n });\n\n // if mapmatching bearing is enabled do not use vertices matching\n if (useMaxBearingAngle) {\n return bestProjection;\n }\n\n this.vertices.forEach(vertex => {\n let vertexCoords = vertex.coords;\n\n // Specific case of io nodes that have a non-null level but can be matched to a null origin level\n if (this.exitVertices.has(vertex) && origin.level === null) {\n vertexCoords = vertex.coords.clone();\n vertexCoords.level = null;\n }\n\n if (!useMultiLevelSegments && Level.isRange(vertexCoords.level)) return;\n if (!Level.intersect(vertexCoords.level, origin.level)) return;\n\n const distanceToVertex = vertexCoords.distanceTo(origin);\n\n // If distance below epsilon consider it as best projection\n if (distanceToVertex < GeoConstants.EPS_MM) {\n bestProjection = new GraphProjection(origin, 0, adaptProjectionCoords(vertexCoords), vertex);\n return;\n }\n\n if (useMaxDistance && distanceToVertex > maxDistance) return;\n\n if (distanceToVertex < (bestProjection?.distanceFromNearestElement ?? Number.MAX_VALUE)) {\n bestProjection = new GraphProjection(origin, distanceToVertex, adaptProjectionCoords(vertexCoords), vertex);\n }\n });\n\n return bestProjection;\n }\n\n\n toJson(): GeoGraphJson {\n return {\n vertices: this.vertices.map(vertex => vertex.toJson()),\n edges: this.edges.map(edge => ({\n id: edge.id,\n vertex1Idx: this.vertices.indexOf(edge.vertex1),\n vertex2Idx: this.vertices.indexOf(edge.vertex2),\n ...(Object.keys(edge.properties).length > 0 && { properties: edge.properties })\n }))\n };\n }\n\n static fromJson(json: GeoGraphJson) {\n\n const vertices = json.vertices.map(vertex => Vertex.fromJson(vertex));\n const edges = json.edges.map(jsonEdge => new Edge(\n vertices[jsonEdge.vertex1Idx],\n vertices[jsonEdge.vertex2Idx],\n jsonEdge.properties,\n jsonEdge.id\n ));\n\n return new Graph(vertices, edges);\n }\n\n /** @deprecated */\n toCompressedJson(): CompressedGeoGraphJson {\n return {\n vertices: this.vertices.map(vertex => vertex.coords.toCompressedJson()),\n verticesIds: this.vertices.map(vertex => vertex.id),\n edges: this.edges.map(edge => {\n const vertex1Idx = this.vertices.indexOf(edge.vertex1);\n const vertex2Idx = this.vertices.indexOf(edge.vertex2);\n const edgeExtras = edge.properties;\n if (Object.keys(edgeExtras).length > 0) {\n return [vertex1Idx, vertex2Idx, edgeExtras];\n }\n return [vertex1Idx, vertex2Idx];\n })\n };\n }\n\n /** @deprecated */\n static fromCompressedJson(json: CompressedGeoGraphJson) {\n const vertices = json.vertices.map(vertex => new Vertex(Coordinates.fromCompressedJson(vertex)));\n const edges = json.edges.map(jsonEdge => new Edge(\n vertices[jsonEdge[0]],\n vertices[jsonEdge[1]],\n jsonEdge.length > 2 ? jsonEdge[2] : {}\n ));\n\n return new Graph(vertices, edges);\n }\n\n\n static fromCoordinatesSegments(segments: Coordinates[][]) {\n\n const vertices: Vertex[] = [];\n const edges: Edge[] = [];\n\n const getOrCreateVertex = (coords: Coordinates) => {\n const vertex = vertices.find(otherVertex => otherVertex.coords.equals(coords));\n if (vertex) {\n return vertex;\n }\n const newVertex = new Vertex(coords);\n vertices.push(newVertex);\n return newVertex;\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 edges.push(new Edge(currentVertex, previousVertex));\n }\n\n previousVertex = currentVertex;\n }\n }\n\n return new Graph(vertices, edges);\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 toDetailedString() {\n let output\n = '--- Network ---\\n'\n + `Vertices: ${this.vertices.length}\\n`\n + `Edges: ${this.edges.length}\\n`\n + '---\\n'\n + 'Vertices\\n';\n this.vertices.forEach(vertex => {\n output += vertex.id;\n const vertexProps = vertex.properties;\n if (Object.keys(vertexProps).length !== 0) { output += ` ${vertexProps}` }\n });\n output += '---\\n'\n + 'Edges\\n';\n this.edges.forEach(edge => {\n output += `${edge.id} - [v1: ${edge.vertex1.id}, v2: ${edge.vertex2.id}]`;\n const edgeProps = edge.properties;\n if (Object.keys(edgeProps).length !== 0) { output += ` ${edgeProps}` }\n });\n output += '---';\n return output;\n }\n}\n\nexport default Graph;\n","/**\n * Get route duration\n * @param {Number} speed in km/h\n * @returns {Number} duration in seconds\n */\nexport function getDurationFromLength(length: number, speed = 5) {\n return length / (speed * 1000 / 3600);\n}\n","import { TravelMode } from \"./TravelMode\";\n\nexport type TransitMode = 'AIRPLANE' | 'BOAT' | 'BIKE' | 'BUS' | 'CAR' |\n 'FERRY' | 'FUNICULAR' | 'METRO' | 'MOTO' | 'TRAIN' | 'TAXI' |\n 'TRAM' | 'WALK' | 'MULTI' | 'UNKNOWN';\n\nexport type PublicTransport = 'AIRPLANE' | 'BOAT' | 'BUS' |\n 'FERRY' | 'FUNICULAR' | 'METRO' | 'MULTI' | 'TRAIN' | 'TRAM';\n\nexport function isTransitModePublicTransport(transitMode: TransitMode): transitMode is PublicTransport {\n return [\n 'AIRPLANE', 'BOAT', 'BUS', 'FERRY',\n 'FUNICULAR', 'METRO', 'MULTI', 'TRAIN', 'TRAM'\n ].includes(transitMode);\n}\n\n// Check if the transit mode and the travel mode are consistent\n// If they are strictly equal\n// Edge cases:\n// If the transit mode is public transport and the travel mode is 'TRANSIT'\n// If the transit mode is 'WALK' and the travel mode is 'TRANSIT'\nexport function areTransitAndTravelModeConsistent(transitMode: TransitMode, travelMode: TravelMode): boolean {\n return (\n transitMode === travelMode\n || (isTransitModePublicTransport(transitMode) && travelMode === 'TRANSIT')\n || (transitMode === 'WALK' && travelMode === 'TRANSIT')\n );\n}\n","import { Coordinates, CoordinatesCompressedJson } from '@wemap/geo';\n\nimport { LevelChange } from './LevelChange.js';\nimport { StepExtra } from './StepExtra.js';\n\nexport type Step = {\n\n firstStep: boolean;\n lastStep: boolean;\n number: number;\n\n angle: number;\n previousBearing: number;\n nextBearing: number;\n distance: number;\n duration: number;\n\n readonly coords: Coordinates;\n readonly name: string | null;\n readonly levelChange: LevelChange | null;\n readonly extras: StepExtra | null;\n}\n\nexport type StepJson = {\n firstStep?: boolean,\n lastStep?: boolean\n number: number,\n coords: CoordinatesCompressedJson,\n name?: string,\n angle: number,\n previousBearing: number,\n nextBearing: number,\n distance: number,\n duration: number\n levelChange?: LevelChange\n extras?: StepExtra,\n};\n\nexport type MinStepInfo = {\n coords: Coordinates,\n name?: string,\n levelChange?: LevelChange\n extras?: StepExtra,\n distance?: number,\n duration?: number\n};\n\nexport function stepToJson(step: Step): StepJson {\n return {\n ...(step.firstStep && { firstStep: true }),\n ...(step.lastStep && { lastStep: true }),\n number: step.number,\n coords: step.coords.toCompressedJson(),\n ...(step.name !== null && { name: step.name }),\n angle: Number(step.angle.toFixed(2)),\n previousBearing: Number(step.previousBearing.toFixed(2)),\n nextBearing: Number(step.nextBearing.toFixed(2)),\n distance: Number(step.distance.toFixed(1)),\n duration: Number(step.duration.toFixed(1)),\n ...(step.levelChange !== null && { levelChange: step.levelChange }),\n ...(step.extras && Object.keys(step.extras).length !== 0 && { extras: step.extras }),\n };\n}\n\nexport function jsonToStep(json: StepJson): Step {\n return Object.assign({}, json, {\n coords: Coordinates.fromCompressedJson(json.coords),\n firstStep: Boolean(json.firstStep),\n lastStep: Boolean(json.lastStep),\n name: json.name || null,\n levelChange: json.levelChange || null,\n extras: json.extras || null\n });\n}\n\nexport function stepEquals(step1: Step, step2: Step) {\n return step1.coords.equals(step2.coords)\n && Math.abs(step1.angle - step2.angle) <= 0.005\n && Math.abs(step1.distance - step2.distance) <= 0.05\n && Math.abs(step1.duration - step2.duration) <= 0.05\n && step1.firstStep === step2.firstStep\n && step1.lastStep === step2.lastStep\n && step1.levelChange?.difference === step2.levelChange?.difference\n && step1.levelChange?.direction === step2.levelChange?.direction\n && step1.levelChange?.type === step2.levelChange?.type\n && step1.name === step2.name\n && Math.abs(step1.nextBearing - step2.nextBearing) <= 0.005\n && step1.number === step2.number\n && Math.abs(step1.previousBearing - step2.previousBearing) <= 0.005\n}\n","import { Coordinates } from '@wemap/geo';\n\nimport Graph from \"./Graph.js\";\nimport Edge from './Edge.js';\nimport Vertex from './Vertex.js';\nimport { getDurationFromLength } from '../Utils.js';\n\n\n/**\n * GraphRoute is an oriented graph\n */\nclass GraphRoute extends Graph {\n constructor(\n public start: Coordinates,\n public end: Coordinates,\n public vertices: Vertex[],\n public edges: Edge[],\n public edgesWeights: number[]\n ) {\n super(vertices, edges);\n }\n\n // /!\\ Does not clone vertices\n // /!\\ Create new Edges but does not deep clone properties\n // /!\\ Does not revert edge oneway property\n reverse() {\n const vertices = this.vertices.slice().reverse();\n const edges = this.edges.slice().reverse();\n const edgesWeights = this.edgesWeights.slice().reverse();\n edges.map(oldEdge => new Edge(oldEdge.vertex2, oldEdge.vertex1, oldEdge.properties));\n return new GraphRoute(this.start, this.end, vertices, edges, edgesWeights);\n }\n\n static fromCoordinates(start: Coordinates, end: Coordinates, coordinates: Coordinates[]) {\n const graph = Graph.fromCoordinatesSegments([coordinates]);\n const edgesWeights = graph.edges.map(e => getDurationFromLength(e.length));\n return new GraphRoute(start, end, graph.vertices, graph.edges, edgesWeights);\n }\n\n get hasRoute() { return Boolean(this.vertices.length) }\n}\n\nexport default GraphRoute;\n","import { Coordinates, Level } from '@wemap/geo';\nimport Logger from '@wemap/logger';\nimport { diffAngle, deg2rad } from '@wemap/maths';\n\nimport { type LevelChange, type LevelChangeType } from './LevelChange.js';\nimport { type Step, type MinStepInfo } from './Step.js';\nimport { getDurationFromLength } from '../Utils.js';\nimport GraphRoute from '../graph/GraphRoute.js';\n\nconst SKIP_STEP_ANGLE_MAX = deg2rad(20);\n\nexport default class StepsBuilder {\n\n private start: Coordinates | null = null;\n private end: Coordinates | null = null;\n private pathCoords: Coordinates[] | null = null;\n private stepsInfo: MinStepInfo[] = [];\n\n setStart(start: Coordinates) {\n this.start = start;\n return this;\n }\n\n setEnd(end: Coordinates) {\n this.end = end;\n return this;\n }\n\n setPathCoords(pathCoords: Coordinates[]) {\n this.pathCoords = pathCoords;\n return this;\n }\n\n setStepsInfo(stepsInfo: MinStepInfo[]) {\n this.stepsInfo = stepsInfo;\n return this;\n }\n\n addStepInfo(stepInfo: MinStepInfo) {\n this.stepsInfo.push(stepInfo);\n return this;\n }\n\n setGraphRoute(graphRoute: GraphRoute) {\n\n const stepsInfo: MinStepInfo[] = [];\n\n const { start, end } = graphRoute;\n\n if (!graphRoute.hasRoute) { return this; }\n\n let currentStep: MinStepInfo | null = null;\n let previousBearing = start.bearingTo(graphRoute.vertices[0].coords);\n\n for (let i = 0; i < graphRoute.vertices.length - 1; i++) {\n\n const isFirstStep = i === 0;\n\n const vertex = graphRoute.vertices[i];\n const currentCoords = vertex.coords;\n const nextVertex = graphRoute.vertices[i + 1];\n const nextCoords = nextVertex.coords;\n\n const edge = graphRoute.edges[i];\n\n const nextBearing = vertex.bearingTo(nextVertex);\n const angle = diffAngle(previousBearing, nextBearing + Math.PI);\n\n const previousStep = stepsInfo.length ? stepsInfo[stepsInfo.length - 1] : null;\n\n const { isSubwayEntrance, isGate, subwayEntranceRef } = vertex.properties;\n const { isElevator, areEscalators, areStairs, isMovingWalkway, incline } = edge.properties;\n\n let levelChangeType: LevelChangeType | null = null;\n if (isElevator) {\n levelChangeType = 'elevator';\n } else if (areEscalators) {\n levelChangeType = 'escalator';\n } else if (areStairs) {\n levelChangeType = 'stairs';\n } else if (isMovingWalkway) {\n levelChangeType = 'moving walkway';\n } else {\n levelChangeType = 'incline plane';\n }\n\n // Handle stairs/elevators/escalators/moving walkway/incline plane without change in level coordinates\n let forceLevelChange: 'up' | 'down' | undefined;\n if (\n (areStairs || isElevator)\n && incline\n && !previousStep?.levelChange\n ) {\n forceLevelChange = incline;\n }\n\n const previousEdge = i > 0 ? graphRoute.edges[i - 1] : null;\n const previousEdgeProperties = previousEdge?.properties || {};\n const forceEndOfLevelChange = Boolean(\n previousEdgeProperties.incline && previousEdgeProperties.areStairs\n && (!incline || !areStairs)\n );\n const isEntrance = vertex.properties.isSubwayEntrance;\n\n const stepName = edge.properties.name || null;\n const duration = graphRoute.edgesWeights[i];\n const stepExtras = {\n ...(isSubwayEntrance && { isSubwayEntrance }),\n ...(subwayEntranceRef && { subwayEntranceRef }),\n ...(isGate && { isGate })\n };\n\n let splitByAngle = Math.abs(diffAngle(Math.PI, angle)) >= SKIP_STEP_ANGLE_MAX;\n\n const splitByLevel = Level.isRange(edge.level) && !Level.isRange(currentCoords.level) || forceLevelChange;\n splitByAngle = splitByAngle && !(currentCoords.level && Level.isRange(currentCoords.level));\n\n\n const splitByEndOfLevelChange = previousStep?.levelChange && !Level.isRange(currentCoords.level)\n || forceEndOfLevelChange;\n\n const splitStepCondition = splitByAngle || splitByLevel || splitByEndOfLevelChange || isEntrance;\n\n // New step creation\n if (isFirstStep || splitStepCondition) {\n\n let levelChange: LevelChange | undefined;\n\n if (splitByLevel) {\n const difference = Level.diff(currentCoords.level, nextCoords.level) || 0;\n let direction: 'up' | 'down' = difference > 0 ? 'up' : 'down';\n if (forceLevelChange) {\n direction = forceLevelChange;\n }\n levelChange = {\n difference, direction, ...(levelChangeType && { type: levelChangeType })\n };\n }\n\n currentStep = {\n coords: currentCoords,\n ...(stepName && { name: stepName }),\n extras: stepExtras,\n levelChange,\n distance: 0,\n duration: 0\n };\n\n stepsInfo.push(currentStep);\n }\n\n currentStep!.distance! += currentCoords.distanceTo(nextCoords);\n currentStep!.duration! += duration;\n\n previousBearing = nextBearing;\n }\n\n const lastCoords = graphRoute.vertices[graphRoute.vertices.length - 1].coords;\n\n // Create a last step if end is not on the graph\n if (!Coordinates.equals(lastCoords, end)) {\n stepsInfo.push({ coords: lastCoords });\n }\n\n this.setStart(start);\n this.setEnd(end);\n this.setPathCoords(graphRoute.vertices.map(v => v.coords));\n this.setStepsInfo(stepsInfo);\n\n return this;\n }\n\n build(): Step[] {\n\n const { pathCoords, start, end } = this;\n\n if (!pathCoords) {\n Logger.warn(`StepsBuilder: Missing \"pathCoords\" property to build steps`);\n return [];\n }\n\n if (!start) {\n Logger.warn(`StepsBuilder: Missing \"from\" property to build steps`);\n return [];\n }\n\n if (!end) {\n Logger.warn(`StepsBuilder: Missing \"to\" property to build steps`);\n return [];\n }\n\n if (this.stepsInfo.length === 0) {\n // If there is no steps info, steps coordinates are calculated using our steps calculation algorithm above.\n this.setGraphRoute(GraphRoute.fromCoordinates(start, end, pathCoords));\n }\n\n const { stepsInfo } = this;\n\n return stepsInfo.map((stepInfo, stepId) => {\n const coordsId = pathCoords.findIndex(coords => coords.equals(stepInfo.coords));\n if (coordsId === -1) {\n throw new Error('Cannot find step coordinates in itinerary coordinates.');\n }\n\n const coordsBeforeStep = coordsId === 0 ? start : pathCoords[coordsId - 1];\n const coordsAfterStep = coordsId === pathCoords.length - 1\n ? end\n : pathCoords[coordsId + 1];\n\n const previousBearing = coordsBeforeStep.bearingTo(stepInfo.coords);\n const nextBearing = stepInfo.coords.bearingTo(coordsAfterStep);\n\n let distance = 0;\n const isLastStep = stepId === stepsInfo.length - 1;\n const coordsToStopCalculation = isLastStep\n ? pathCoords[pathCoords.length - 1]\n : stepsInfo[stepId + 1].coords;\n\n let currentCoordsId = coordsId;\n while (!pathCoords[currentCoordsId].equals(coordsToStopCalculation)) {\n distance += pathCoords[currentCoordsId].distanceTo(pathCoords[currentCoordsId + 1]);\n currentCoordsId++;\n }\n\n return {\n coords: stepInfo.coords,\n name: stepInfo.name || null,\n number: stepId + 1,\n previousBearing,\n nextBearing,\n angle: diffAngle(previousBearing, nextBearing + Math.PI),\n firstStep: stepId === 0,\n lastStep: isLastStep,\n distance, // stepInfo.distance is overwritten\n duration: stepInfo.duration || getDurationFromLength(distance),\n levelChange: stepInfo.levelChange || null,\n extras: stepInfo.extras || null\n }\n });\n }\n\n}\n","import {\n Coordinates, CoordinatesCompressedJson, Level, Utils as GeoUtils\n} from '@wemap/geo';\n\nimport Graph from '../graph/Graph.js';\nimport GraphRoute from '../graph/GraphRoute.js';\nimport { getDurationFromLength } from '../Utils.js';\nimport { TransitMode, isTransitModePublicTransport } from './TransitMode.js';\n\nimport { jsonToStep, Step, stepEquals, StepJson, stepToJson } from './Step.js'\nimport StepsBuilder from './StepsBuilder.js';\n\nexport type Destination = {\n name: string | null,\n coords: Coordinates\n};\n\nexport type DestinationConstructor = {\n name?: string,\n coords: Coordinates\n};\n\nexport type DestinationJson = {\n name?: string,\n coords: CoordinatesCompressedJson\n};\n\nexport type TransportInfo = {\n name: string,\n routeColor?: string,\n routeTextColor?: string,\n directionName?: string\n}\n\ntype LegCommon = {\n transitMode: TransitMode,\n startTime?: number,\n endTime?: number,\n transportInfo?: TransportInfo,\n}\n\ntype LegConstructor =\n {\n start: DestinationConstructor,\n end: DestinationConstructor,\n coords: Coordinates[],\n steps?: Step[],\n duration?: number\n }\n & LegCommon;\n\nexport type LegJson = {\n start: DestinationJson,\n end: DestinationJson,\n coords: CoordinatesCompressedJson[],\n steps: StepJson[],\n distance: number,\n duration: number\n} & LegCommon;\n\nexport default class Leg {\n\n start: Destination;\n end: Destination;\n coords: Coordinates[];\n distance: number;\n transitMode: TransitMode;\n\n duration: number;\n startTime: number | null;\n endTime: number | null;\n\n steps: Step[];\n transportInfo: TransportInfo | null;\n\n constructor({\n start, end, coords, transitMode, duration,\n startTime, endTime, transportInfo, steps\n }: LegConstructor) {\n this.start = {\n name: start.name || null,\n coords: start.coords\n };\n this.end = {\n name: end.name || null,\n coords: end.coords\n };\n this.coords = coords;\n this.transitMode = transitMode;\n this.distance = GeoUtils.calcDistance(coords)\n this.duration = typeof duration === 'number' ? duration : getDurationFromLength(this.distance);\n this.startTime = typeof startTime === 'number' ? startTime : null;\n this.endTime = typeof endTime === 'number' ? endTime : null;\n this.transportInfo = transportInfo || null;\n this.steps = Array.isArray(steps)\n ? steps\n : new StepsBuilder().setStart(start.coords).setEnd(end.coords).setPathCoords(coords).build();\n }\n\n isPublicTransport() {\n return isTransitModePublicTransport(this.transitMode);\n }\n\n toGraph() {\n return Graph.fromCoordinatesSegments([this.coords]);\n }\n\n static equals(obj1: Leg, obj2: Leg) {\n const intermediate = obj1.transitMode === obj2.transitMode\n && Math.abs(obj1.duration - obj2.duration) <= 0.05\n && obj1.startTime === obj2.startTime\n && obj1.endTime === obj2.endTime\n && obj1.start.name === obj2.start.name\n && obj1.start.coords.equals(obj2.start.coords)\n && obj1.end.name === obj2.end.name\n && obj1.end.coords.equals(obj2.end.coords)\n && obj1.coords.length === obj2.coords.length\n && (\n obj1.steps === obj2.steps\n || obj1.steps?.length === obj2.steps?.length\n );\n\n if (!intermediate) {\n return false;\n }\n\n let i;\n for (i = 0; i < obj1.coords.length; i++) {\n if (!obj1.coords[i].equals(obj2.coords[i])) {\n return false;\n }\n }\n for (i = 0; i < obj1.steps.length; i++) {\n if (!stepEquals(obj1.steps[i], obj2.steps[i])) {\n return false;\n }\n }\n\n if (obj1.transportInfo !== obj2.transportInfo) {\n if (obj1.transportInfo === null || obj2.transportInfo === null) {\n return false;\n }\n if (\n obj1.transportInfo.name !== obj2.transportInfo.name\n || obj1.transportInfo.routeColor !== obj2.transportInfo.routeColor\n || obj1.transportInfo.routeTextColor !== obj2.transportInfo.routeTextColor\n || obj1.transportInfo.directionName !== obj2.transportInfo.directionName\n ) {\n return false;\n }\n }\n\n return true;\n }\n\n equals(obj: Leg) {\n return Leg.equals(this, obj);\n }\n\n toJson(): LegJson {\n return {\n transitMode: this.transitMode,\n start: {\n coords: this.start.coords.toCompressedJson(),\n ...(this.start.name && { name: this.start.name }),\n },\n end: {\n coords: this.end.coords.toCompressedJson(),\n ...(this.end.name && { name: this.end.name }),\n },\n distance: Number(this.distance.toFixed(1)),\n duration: Number(this.duration.toFixed(1)),\n coords: this.coords.map(coords => coords.toCompressedJson()),\n steps: this.steps.map(stepToJson),\n ...(this.startTime !== null && { startTime: this.startTime }),\n ...(this.endTime !== null && { endTime: this.endTime }),\n ...(this.transportInfo !== null && { transportInfo: this.transportInfo }),\n };\n }\n\n static fromJson(json: LegJson) {\n const leg = new Leg(Object.assign({}, json, {\n start: {\n coords: Coordinates.fromCompressedJson(json.start.coords),\n name: json.start.name || null\n },\n end: {\n coords: Coordinates.fromCompressedJson(json.end.coords),\n name: json.end.name || null\n },\n coords: json.coords.map(Coordinates.fromCompressedJson),\n steps: json.steps?.map(jsonToStep) || null,\n }));\n\n return leg;\n }\n\n static fromGraphRoute(\n graphRoute: GraphRoute,\n transitMode: TransitMode = 'WALK'\n ) {\n return new Leg({\n start: { coords: graphRoute.start },\n end: { coords: graphRoute.end },\n coords: graphRoute.vertices.map(vertex => vertex.coords),\n duration: graphRoute.edgesWeights.reduce((acc, weight) => acc + weight, 0),\n transitMode,\n steps: new StepsBuilder().setGraphRoute(graphRoute).build()\n });\n }\n\n // TODO: Remove when possible...\n // Livemap specific\n multiplyLevel(levelFactor: number) {\n this.start.coords.level = Level.multiplyBy(this.start.coords.level, levelFactor);\n this.end.coords.level = Level.multiplyBy(this.end.coords.level, levelFactor);\n for (const coords of this.coords) {\n coords.level = Level.multiplyBy(coords.level, levelFactor);\n }\n this.steps.forEach(step => {\n step.coords.level = Level.multiplyBy(step.coords.level, levelFactor);\n });\n }\n}\n","import { Feature, FeatureCollection, MultiLineString, Point } from 'geojson';\nimport { Coordinates, Level, Utils as GeoUtils, CoordinatesJson, Level_t } from '@wemap/geo';\nimport { diffAngle, Point2_t, Vector3_t } from '@wemap/maths';\n\nimport Graph from '../graph/Graph.js';\nimport Leg, { type LegJson } from './Leg.js';\nimport { isTransitModePublicTransport, type TransitMode } from './TransitMode.js';\nimport { Step } from './Step.js';\nimport { getDurationFromLength } from '../Utils.js';\nimport StepsBuilder from './StepsBuilder.js';\nimport GraphRoute from '../graph/GraphRoute.js';\n\n\nexport type ItineraryCommon = {\n startTime?: number,\n endTime?: number\n};\n\nexport type ItineraryJson = {\n transitMode: TransitMode,\n origin: CoordinatesJson,\n destination: CoordinatesJson,\n distance: number,\n duration: number,\n legs: LegJson[]\n} & ItineraryCommon;\n\n\nexport type ItineraryConstructor = {\n origin: Coordinates,\n destination: Coordinates,\n duration?: number\n legs: Leg[],\n} & ItineraryCommon;\n\n/**\n * Main attributes are:\n * nodes: the ordered list of Node\n * edges: the ordered list of Edge\n * start: the start point (Coordinates)\n * end: the end point (Coordinates)\n * length: the route length\n */\nexport default class Itinerary {\n\n origin: Coordinates;\n destination: Coordinates;\n duration: number;\n readonly legs: Leg[];\n\n private _transitMode: TransitMode | null = null;\n startTime: number | null;\n endTime: number | null;\n\n private _coords: Coordinates[] | null = null;\n private _distance: number | null = null;\n\n constructor({\n origin, destination, duration, legs, startTime, endTime\n }: ItineraryConstructor) {\n this.origin = origin;\n this.destination = destination;\n this.legs = legs;\n if (typeof duration === 'number') {\n this.duration = duration;\n } else {\n this.duration = this.legs.reduce((dur, leg) => dur + leg.duration, 0);\n }\n this.startTime = typeof startTime === 'number' ? startTime : null;\n this.endTime = typeof endTime === 'number' ? endTime : null;\n\n this.updateStepsFromLegs();\n }\n\n set coords(_) {\n throw new Error('Itinerary.coords cannot be set. They are calculated from Itinerary.legs.');\n }\n\n public get coords() {\n if (!this._coords) {\n this._coords = this.legs.map(leg => leg.coords)\n .flat()\n // Remove duplicates\n .filter((coords, idx, arr) => idx === 0 || !arr[idx - 1].equals(coords));\n }\n return this._coords;\n }\n\n set steps(_) {\n throw new Error('Itinerary.step cannot be set. They are calculated from Itinerary.legs.');\n }\n\n get steps(): Step[] {\n return this.legs.map(leg => leg.steps).flat();\n }\n\n set transitMode(_) {\n throw new Error('Itinerary.transitMode cannot be set. They are calculated from Itinerary.legs.');\n }\n\n // Transit mode will return MULTI if there are several transit modes except WALK\n // Else it will return the only transit mode\n // fallback to WALK if no transit mode\n get transitMode() {\n if (!this._transitMode) {\n const legTransitModes = new Set(this.legs.map(leg => leg.transitMode));\n\n // Remove WALK from transit modes\n legTransitModes.delete('WALK');\n\n if (legTransitModes.size > 1) {\n this._transitMode = 'MULTI';\n\n return this._transitMode;\n }\n\n if (legTransitModes.size === 1) {\n this._transitMode = legTransitModes.values().next().value as TransitMode;\n\n return this._transitMode;\n }\n\n this._transitMode = 'WALK';\n }\n\n return this._transitMode;\n\n }\n\n set distance(_) {\n throw new Error('Itinerary.distance cannot be set. They are calculated from Itinerary.legs.');\n }\n\n get distance() {\n if (this._distance === null) {\n this._distance = GeoUtils.calcDistance(this.coords);\n }\n return this._distance;\n\n // Does not work if legs does not intersect\n // return this.legs.reduce((dist, leg) => dist + leg.distance, 0);\n }\n\n toGraph() {\n return Graph.fromCoordinatesSegments([this.coords]);\n }\n\n static fromItineraries(...itineraries: Itinerary[]) {\n return new Itinerary({\n origin: itineraries[0].origin,\n destination: itineraries[itineraries.length - 1].destination,\n legs: itineraries.map(itinerary => itinerary.legs).flat(),\n });\n }\n\n /**\n * Convert lat/lng/level? points to Itinerary\n */\n static fromOrderedPointsArray(\n points: (Point2_t | Vector3_t)[],\n start: (Point2_t | Vector3_t),\n end: (Point2_t | Vector3_t)) {\n\n const pointToCoordinates = (point: Point2_t | Vector3_t) =>\n new Coordinates(point[0], point[1], null, point[2]);\n\n return this.fromOrderedCoordinates(\n points.map(pointToCoordinates),\n pointToCoordinates(start),\n pointToCoordinates(end)\n );\n }\n\n /**\n * Convert ordered Coordinates to Itinerary\n */\n static fromOrderedCoordinates(\n coords: Coordinates[],\n origin: Coordinates,\n destination: Coordinates,\n transitMode: TransitMode = 'WALK'\n ) {\n\n const steps = new StepsBuilder().setPathCoords(coords).setStart(origin).setEnd(destination).build();\n\n const leg = new Leg({\n start: { coords: origin },\n end: { coords: destination },\n coords,\n transitMode,\n steps\n });\n\n return new Itinerary({ origin, destination, legs: [leg] });\n }\n\n\n static equals(obj1: Itinerary, obj2: Itinerary) {\n const intermediate = obj1.origin.equals(obj2.origin)\n && obj1.destination.equals(obj2.destination)\n && Math.abs(obj1.distance - obj2.distance) <= 0.05\n && Math.abs(obj1.duration - obj2.duration) <= 0.05\n && obj1.startTime === obj2.startTime\n && obj1.endTime === obj2.endTime\n && obj1.legs.length === obj2.legs.length;\n\n if (!intermediate) {\n return false;\n }\n\n for (let i = 0; i < obj1.legs.length; i++) {\n if (!obj1.legs[i].equals(obj2.legs[i])) {\n return false;\n }\n }\n\n return true;\n }\n\n equals(obj: Itinerary) {\n return Itinerary.equals(this, obj);\n }\n\n toJson(): ItineraryJson {\n return {\n origin: this.origin.toJson(),\n destination: this.destination.toJson(),\n distance: Number(this.distance.toFixed(1)),\n duration: Number(this.duration.toFixed(1)),\n transitMode: this.transitMode,\n legs: this.legs.map(leg => leg.toJson()),\n ...(this.startTime !== null && { startTime: this.startTime }),\n ...(this.endTime !== null && { endTime: this.endTime })\n };\n }\n\n static fromJson(json: ItineraryJson) {\n return new Itinerary({\n origin: Coordinates.fromJson(json.origin),\n destination: Coordinates.fromJson(json.destination),\n duration: json.duration,\n legs: json.legs.map(Leg.fromJson),\n startTime: json.startTime,\n endTime: json.endTime\n });\n }\n\n static fromGraphRoute(graphRoute: GraphRoute, transitMode: TransitMode = 'WALK') {\n const leg = Leg.fromGraphRoute(graphRoute, transitMode);\n return new Itinerary({\n origin: graphRoute.start,\n destination: graphRoute.end,\n legs: [leg]\n });\n }\n\n // TODO: Remove when possible...\n // Livemap specific\n multiplyLevel(levelFactor: number) {\n\n this.origin.level = Level.multiplyBy(this.origin.level, levelFactor);\n this.destination.level = Level.multiplyBy(this.destination.level, levelFactor);\n\n this.legs.forEach(leg => leg.multiplyLevel(levelFactor));\n\n // It is not necessary to multiply this._coords because \n // coords are not cloned between legs and itinerary\n }\n\n // TODO: Remove when possible...\n // Livemap specific\n forceUnknownLevelTo0() {\n\n this.origin.level = this.origin.level || 0;\n this.destination.level = this.destination.level || 0;\n\n for (const leg of this.legs) {\n leg.start.coords.level = leg.start.coords.level || 0;\n leg.end.coords.level = leg.end.coords.level || 0;\n for (const coords of leg.coords) {\n coords.level = coords.level || 0;\n }\n if (leg.steps) {\n for (const step of leg.steps) {\n step.coords.level = step.coords.level || 0;\n }\n }\n }\n\n if (this._coords) {\n for (const coords of this._coords) {\n coords.level = coords.level || 0;\n }\n }\n }\n\n toGeoJson(): FeatureCollection {\n const transformToPoint = (point: Coordinates, name?: string, type?: string): Feature<Point> => ({\n type: \"Feature\",\n properties: { name, level: point.level, ...(type && { type }) },\n geometry: {\n type: 'Point',\n coordinates: [point.lng, point.lat]\n }\n });\n const transformToMultiLineStrings = (segments: Coordinates[][], level: Level_t): Feature<MultiLineString> => ({\n type: \"Feature\",\n properties: { level, name: level?.toString() },\n geometry: {\n type: 'MultiLineString',\n coordinates: segments.map(s => s.map(({ lat, lng }) => [lng, lat]))\n }\n });\n\n const levelsOfItinerary = [...new Set(this.coords.map(c => Level.toString(c.level)))].map(Level.fromString);\n const segmentsSplitted: [Level_t, Coordinates[][]][] = levelsOfItinerary.map(loi => [loi, GeoUtils.createSegmentsAtLevel(this.coords, loi, true)]);\n const multiLineStrings = segmentsSplitted.map(([loi, segments]) => transformToMultiLineStrings(segments, loi))\n const legsStarts = this.legs.map((leg, idx) => transformToPoint(leg.start.coords, `Leg ${idx} start`, 'leg-start'));\n const legsEnds = this.legs.map((leg, idx) => transformToPoint(leg.end.coords, `Leg ${idx} end`, 'leg-end'));\n const steps = this.steps.map(step => transformToPoint(step.coords, `Step ${step.number}`, 'step'))\n return {\n type: \"FeatureCollection\",\n features: [\n transformToPoint(this.origin, 'origin', 'origin'),\n transformToPoint(this.destination, 'destination', 'destination'),\n ...multiLineStrings,\n ...legsStarts,\n ...legsEnds,\n ...steps\n ]\n };\n }\n\n /**\n * TODO: Remove it in router v3\n * Update steps info thanks to the coordinates of the whole itinerary.\n * This method will update:\n * - all steps number\n * - first/last steps\n * - previousBearing/nextBearing/angle of first and last step of each leg\n */\n updateStepsFromLegs() {\n\n const itineraryCoords = this.coords\n // Remove duplicates\n .filter((coords, idx, arr) => idx === 0 || !arr[idx - 1].equals(coords));\n const steps = this.legs.map(leg => leg.steps).flat();\n\n\n steps.map((step, stepId) => {\n const coordsId = itineraryCoords.findIndex(coords => coords.equals(step.coords));\n if (coordsId === -1) {\n throw new Error('Cannot find step coordinates in itinerary coordinates.');\n }\n\n const coordsBeforeStep = coordsId === 0 ? this.origin : itineraryCoords[coordsId - 1];\n const coordsAfterStep = coordsId === itineraryCoords.length - 1\n ? this.destination\n : itineraryCoords[coordsId + 1];\n\n step.previousBearing = coordsBeforeStep.bearingTo(step.coords);\n step.nextBearing = step.coords.bearingTo(coordsAfterStep);\n step.angle = diffAngle(step.previousBearing, step.nextBearing + Math.PI);\n\n step.number = stepId + 1;\n step.firstStep = stepId === 0;\n step.lastStep = stepId === steps.length - 1;\n });\n }\n}\n","import { RouterRequest } from '../model/RouterRequest.js';\nimport Itinerary from '../model/Itinerary.js';\n\nabstract class RemoteRouter {\n\n /**\n * Get the router name\n */\n abstract get rname(): string;\n\n abstract getItineraries(endpointUrl: string, routerRequest: RouterRequest): Promise<Itinerary[]>;\n\n}\n\nexport default RemoteRouter;\n","// https://developers.google.com/actions-center/reference/grpc-api/status_codes\nexport enum StatusCode {\n OK = 0,\n CANCELLED = 1,\n UNKNOWN = 2,\n INVALID_ARGUMENT = 3,\n NOT_FOUND = 5,\n UNIMPLEMENTED = 12,\n INTERNAL = 13,\n UNAVAILABLE = 14,\n UNAUTHENTICATED = 16\n}","// Based on GRPC status code\n\nimport { StatusCode } from \"./StatusCode\";\nimport { TravelMode } from \"./model/TravelMode\";\n\n\nexport class RoutingError extends Error {\n\n public customMapName?: string | null;\n\n constructor(public code = StatusCode.UNKNOWN, message?: string) {\n super(message)\n }\n\n static notFound(details?: string) {\n return new RoutingError(StatusCode.NOT_FOUND, `Cannot found an itinerary. Details: ${details}`)\n }\n}\n\n\nexport class WemapMultiRoutingError extends RoutingError {\n \n constructor(public code = StatusCode.UNKNOWN, public mapName: string | null, message?: string) {\n super(code, message);\n this.mapName = mapName;\n }\n\n static notFound(mapName: string, details?: string) {\n return new WemapMultiRoutingError(StatusCode.NOT_FOUND, mapName, `Cannot found an itinerary in map ${mapName}. Details: ${details || 'No details'}`)\n }\n\n}\n\nexport class RemoteRoutingError extends RoutingError {\n \n constructor(public code = StatusCode.UNKNOWN, public routerName: string, message?: string) {\n super(code, message);\n this.routerName = routerName;\n }\n\n static notFound(routerName: string, details?: string) {\n return new RemoteRoutingError(StatusCode.NOT_FOUND, routerName, `Cannot found an itinerary with ${routerName}. Details: ${details || 'No details'}`)\n }\n\n static missingApiKey(routerName: string, details?: string) {\n return new RemoteRoutingError(StatusCode.UNAUTHENTICATED, routerName, `API key is missing for ${routerName}. Details: ${details}`)\n }\n\n static unreachableServer(routerName: string, url: string) {\n return new RemoteRoutingError(StatusCode.NOT_FOUND, routerName, `Remote router server ${routerName} is unreachable. URL: ${url}`)\n }\n\n static responseNotParsing(routerName: string, url: string) {\n return new RemoteRoutingError(StatusCode.NOT_FOUND, routerName, `Remote router server response ${routerName} cannot be parsed. URL: ${url}`)\n }\n\n static travelModeUnimplemented(routerName: string, travelMode: TravelMode) {\n return new RemoteRoutingError(StatusCode.UNIMPLEMENTED, routerName, `Travel mode \"${travelMode}\" is not implemented for ${routerName}`)\n }\n}","/* eslint-disable max-statements */\n\nimport { Coordinates, Level } from '@wemap/geo';\nimport { rad2deg, positiveMod } from '@wemap/maths';\nimport { LineString, Position } from 'geojson';\n\nimport Itinerary from '../../model/Itinerary.js';\nimport Leg from '../../model/Leg.js';\nimport StepsBuilder from '../../model/StepsBuilder.js';\nimport RemoteRouter from '../RemoteRouter.js';\nimport { type TravelMode } from '../../model/TravelMode.js';\nimport { type TransitMode } from '../../model/TransitMode.js';\nimport { type RouterRequest } from '../../model/RouterRequest.js';\nimport { RemoteRoutingError } from '../../RoutingError.js';\n\ntype OsrmCoordinates = Position;\ntype OsrmModifier = 'sharp right' | 'sharp left' | 'slight right'\n | 'slight left' | 'right' | 'left' | 'u turn' | 'straight';\ntype OsrmManeuverType = 'depart' | 'turn' | 'arrive';\ntype OsrmStep = {\n geometry: LineString,\n distance: number,\n duration: number,\n name?: string,\n maneuver: {\n bearing_before: number,\n bearing_after: number,\n location: OsrmCoordinates,\n modifier: OsrmModifier,\n type: OsrmManeuverType\n }\n};\ntype OsrmJson = {\n code?: string,\n message?: string,\n routes?: {\n geometry: LineString,\n legs: {\n distance: number,\n duration: number,\n steps: OsrmStep[]\n }[],\n distance: number,\n duration: number,\n weight_name: string,\n weight: number\n }[],\n waypoints?: []\n};\n\ntype OsrmMode = 'driving' | 'walking' | 'bike' | 'pmr' | 'bike-safest' | 'bike-fastest';\n\nconst outputModeCorrespondance = new Map<TravelMode, TransitMode>();\noutputModeCorrespondance.set('CAR', 'CAR');\noutputModeCorrespondance.set('WALK', 'WALK');\noutputModeCorrespondance.set('BIKE', 'BIKE');\n\n/**\n * Singleton.\n */\nclass OsrmRemoteRouter extends RemoteRouter {\n\n get rname() { return 'osrm' as const; }\n\n async getItineraries(endpointUrl: string, routerRequest: RouterRequest) {\n const url = this.getURL(endpointUrl, routerRequest);\n\n const res = await (fetch(url).catch(() => {\n throw RemoteRoutingError.unreachableServer(this.rname, url);\n }));\n\n const jsonResponse = await res.json().catch(() => {\n throw RemoteRoutingError.responseNotParsing(this.rname, url);\n });\n\n return this.parseResponse(jsonResponse, routerRequest.origin, routerRequest.destination, routerRequest.travelMode);\n }\n\n /**\n * @throws {TravelModeCorrespondanceNotFound}\n */\n getURL(endpointUrl: string, routerRequest: RouterRequest) {\n const { origin, destination } = routerRequest;\n\n const osrmMode = this.inputModeCorrespondance(routerRequest);\n const waypoints = [origin, ...routerRequest.waypoints || [], destination];\n\n let url = endpointUrl + '/route/v1/' + osrmMode + '/';\n url += waypoints.map(waypoint => [waypoint.longitude + ',' + waypoint.latitude]).join(';');\n url += '?geometries=geojson&overview=full&steps=true';\n routerRequest.provideItineraryAlternatives && (url += '&alternatives=true')\n return url;\n }\n\n inputModeCorrespondance = (routerRequest: RouterRequest): OsrmMode => {\n const { travelMode, travelModePreference: preference } = routerRequest;\n if (travelMode === 'WALK' && routerRequest.itineraryModifiers?.isWheelchair) return 'pmr';\n if (travelMode === 'WALK') return 'walking';\n if (travelMode === 'BIKE') {\n if (preference === 'FASTEST') return 'bike-fastest';\n if (preference === 'SAFEST') return 'bike-safest';\n if (preference === 'TOURISM') return 'bike-safest';\n return 'bike-safest';\n }\n if (travelMode === 'CAR') return 'driving';\n throw RemoteRoutingError.travelModeUnimplemented(this.rname, travelMode);\n }\n\n coordinatesToJson({ lat, lng, level }: Coordinates): OsrmCoordinates {\n if (level === null) {\n return [lng, lat];\n }\n if (Level.isRange(level)) {\n return [lng, lat, level[0]];\n }\n return [lng, lat, level];\n }\n\n /**\n * @param {object} json\n * @returns {Coordinates}\n */\n jsonToCoordinates(json: OsrmCoordinates): Coordinates {\n const coords = new Coordinates(json[1], json[0]);\n if (json.length > 2) {\n coords.level = json[2] as number;\n }\n return coords;\n }\n\n getModifierFromAngle(_angle: number): OsrmModifier {\n\n const angle = positiveMod(rad2deg(_angle), 360);\n\n if (angle > 0 && angle < 60) {\n return 'sharp right';\n }\n if (angle >= 60 && angle < 140) {\n return 'right';\n }\n if (angle >= 140 && angle < 160) {\n return 'slight right';\n }\n if (angle >= 160 && angle <= 200) {\n return 'straight';\n }\n if (angle > 200 && angle <= 220) {\n return 'slight left';\n }\n if (angle > 220 && angle <= 300) {\n return 'left';\n }\n if (angle > 300 && angle < 360) {\n return 'sharp left';\n }\n return 'u turn';\n }\n\n noRouteFoundJson(message: object) {\n return {\n 'code': 'NoRoute',\n message\n };\n }\n\n /**\n * @deprecated\n */\n itineraryToOsrmJson(itinerary: Itinerary): OsrmJson {\n\n const lastLegId = itinerary.legs.length - 1;\n const itinerarySteps = itinerary.steps;\n\n const jsonLegs = itinerary.legs.map(({ distance, duration, coords }, idLeg) => {\n\n // Filter steps which are in leg\n const legSteps = itinerarySteps.filter(step =>\n coords.find(_coords => _coords.equals(step.coords))\n );\n\n const lastStepId = legSteps.length - 1;\n\n return {\n distance,\n duration: duration || 0,\n steps: legSteps.map((step, idStep, arr) => {\n\n let type: OsrmManeuverType = idStep === 0 && idLeg === 0 ? 'depart' : 'turn';\n type = idStep === lastStepId && idLeg === lastLegId ? 'arrive' : type;\n\n const stepCoordsIdx = coords.findIndex(p => p.equals(step.coords));\n const nextStepCoordsIdx = idStep === lastStepId\n ? stepCoordsIdx\n : coords.findIndex(p => p.equals(arr[idStep + 1].coords));\n\n const osrmStep: OsrmStep = {\n geometry: {\n type: 'LineString',\n coordinates: coords.slice(stepCoordsIdx, nextStepCoordsIdx + 1).map(this.coordinatesToJson)\n },\n distance: step.distance,\n duration: step.duration || 0,\n ...(step.name && { name: step.name }),\n maneuver: {\n bearing_before: rad2deg(step.previousBearing),\n bearing_after: rad2deg(step.nextBearing),\n location: this.coordinatesToJson(step.coords),\n modifier: this.getModifierFromAngle(step.angle),\n type\n },\n };\n return osrmStep;\n })\n };\n });\n\n return {\n 'code': 'Ok',\n 'routes': [\n {\n 'geometry': {\n 'type': 'LineString',\n 'coordinates': itinerary.coords.map(this.coordinatesToJson)\n },\n 'legs': jsonLegs,\n 'distance': itinerary.distance,\n 'duration': itinerary.duration,\n 'weight_name': 'routability',\n 'weight': 0\n }\n ],\n 'waypoints': []\n };\n }\n\n parseResponse(json: OsrmJson, origin: Coordinates, destination: Coordinates, travelMode: TravelMode) {\n\n const transitMode = outputModeCorrespondance.get(travelMode)!;\n\n const { routes: jsonRoutes } = json;\n if (!jsonRoutes) {\n throw RemoteRoutingError.notFound(this.rname, json.message);\n }\n\n return jsonRoutes.map(jsonItinerary => {\n\n const legs = jsonItinerary.legs.map((jsonLeg) => {\n const legCoords = jsonLeg.steps\n .map(step => step.geometry.coordinates.map(this.jsonToCoordinates))\n .flat()\n // Remove duplicates\n .filter((coords, idx, arr) => idx === 0 || !arr[idx - 1].equals(coords));\n\n const startCoords = legCoords[0];\n const endCoords = legCoords[legCoords.length - 1];\n\n const stepsBuilder = new StepsBuilder().setPathCoords(legCoords).setStart(startCoords).setEnd(endCoords);\n jsonLeg.steps?.forEach(({ maneuver, name, distance, duration }) => {\n\n const stepCoords = this.jsonToCoordinates(maneuver.location);\n\n // Sometimes, OSRM step does not have the same coordinates than a point in legCoords.\n // ex: first step of https://routing-orsm.getwemap.com/route/v1/walking/2.33222164147,48.87084765712;2.3320734,48.8730212?geometries=geojson&overview=full&steps=true\n // That is why we look for the closest point.\n const distances = legCoords.map(coords => coords.distanceTo(stepCoords));\n const idStepCoordsInLeg = distances.indexOf(Math.min(...distances));\n if (idStepCoordsInLeg < 0) {\n throw new Error('Osrm Parser: Cannot find step coords in leg coordinates');\n }\n\n stepsBuilder.addStepInfo({\n coords: legCoords[idStepCoordsInLeg],\n name,\n distance,\n duration\n });\n })\n\n return new Leg({\n transitMode,\n duration: jsonLeg.duration,\n coords: legCoords,\n start: {\n coords: startCoords\n },\n end: {\n coords: endCoords\n },\n steps: stepsBuilder.build()\n });\n });\n\n return new Itinerary({\n duration: jsonItinerary.duration,\n origin,\n destination,\n legs\n });\n });\n }\n}\n\nexport default new OsrmRemoteRouter();"],"names":["_Edge","constructor","vertex1","vertex2","properties","id","currentUniqueId","__publicField","this","level","Level","union","coords","length","distanceTo","bearing","bearingTo","getEdgeByVertices","edges","find","edge","reverseProperties","incline","isOneway","Edge","GraphProjection","origin","distanceFromNearestElement","nearestElement","Vertex","other","toJson","toCompressedJson","Object","keys","fromJson","json","v","Coordinates","fromCompressedJson","Graph","vertices","nullVertices","filter","e","map","flat","levelVertices","exitVertices","Set","includes","v1","getVertexByCoords","vertex","equals","getVertexByName","name","getEdgeByName","getBoundingBox","extendedMeasure","boundingBox","BoundingBox","fromCoordinates","extendsWithMeasure","getProjection","options","useMaxDistance","maxDistance","useMaxBearingAngle","UserPosition","maxBearingAngle","useAcceptEdgeFn","useMultiLevelSegments","bestProjection","adaptProjectionCoords","projCoords","p","clone","lat","lng","alt","heightFromFloor","heightFromGround","forEach","acceptEdgeFn","isRange","intersect","diffAngleLines","segmentProjection","getSegmentProjection","distanceToSegment","Number","MAX_VALUE","vertexCoords","has","distanceToVertex","GeoConstants","EPS_MM","vertex1Idx","indexOf","vertex2Idx","jsonEdge","verticesIds","edgeExtras","fromCoordinatesSegments","segments","getOrCreateVertex","otherVertex","newVertex","push","segment","previousVertex","currentVertex","getEdgesAtLevel","targetLevel","useMultiLevelEdges","contains","toDetailedString","output","vertexProps","edgeProps","getDurationFromLength","speed","isTransitModePublicTransport","transitMode","stepToJson","step","firstStep","lastStep","number","angle","toFixed","previousBearing","nextBearing","distance","duration","levelChange","extras","jsonToStep","assign","Boolean","stepEquals","step1","step2","Math","abs","_a","difference","_b","_c","direction","_d","_e","type","_f","GraphRoute","start","end","edgesWeights","super","reverse","slice","oldEdge","coordinates","graph","hasRoute","SKIP_STEP_ANGLE_MAX","deg2rad","StepsBuilder","setStart","setEnd","setPathCoords","pathCoords","setStepsInfo","stepsInfo","addStepInfo","stepInfo","setGraphRoute","graphRoute","currentStep","i","isFirstStep","currentCoords","nextVertex","nextCoords","diffAngle","PI","previousStep","isSubwayEntrance","isGate","subwayEntranceRef","isElevator","areEscalators","areStairs","isMovingWalkway","forceLevelChange","levelChangeType","previousEdge","previousEdgeProperties","forceEndOfLevelChange","isEntrance","stepName","stepExtras","splitByAngle","splitByLevel","splitByEndOfLevelChange","diff","lastCoords","build","Logger","warn","stepId","coordsId","findIndex","Error","coordsBeforeStep","coordsAfterStep","isLastStep","coordsToStopCalculation","currentCoordsId","Leg","startTime","endTime","transportInfo","steps","GeoUtils","calcDistance","Array","isArray","isPublicTransport","toGraph","obj1","obj2","routeColor","routeTextColor","directionName","obj","fromGraphRoute","reduce","acc","weight","multiplyLevel","levelFactor","multiplyBy","Itinerary","destination","legs","dur","leg","updateStepsFromLegs","_","_coords","idx","arr","_transitMode","legTransitModes","delete","size","values","next","value","_distance","Utils","fromItineraries","itineraries","itinerary","fromOrderedPointsArray","points","pointToCoordinates","point","fromOrderedCoordinates","forceUnknownLevelTo0","toGeoJson","transformToPoint","geometry","multiLineStrings","c","toString","fromString","loi","createSegmentsAtLevel","s","transformToMultiLineStrings","legsStarts","legsEnds","features","itineraryCoords","RemoteRouter","StatusCode","RoutingError","code","UNKNOWN","message","notFound","details","NOT_FOUND","WemapMultiRoutingError","mapName","RemoteRoutingError","routerName","missingApiKey","UNAUTHENTICATED","unreachableServer","url","responseNotParsing","travelModeUnimplemented","travelMode","UNIMPLEMENTED","outputModeCorrespondance","Map","set","OsrmRemoteRouter$1","arguments","routerRequest","travelModePreference","preference","itineraryModifiers","isWheelchair","rname","getItineraries","endpointUrl","getURL","res","fetch","catch","jsonResponse","parseResponse","inputModeCorrespondance","waypoints","waypoint","longitude","latitude","join","provideItineraryAlternatives","coordinatesToJson","jsonToCoordinates","getModifierFromAngle","_angle","positiveMod","rad2deg","noRouteFoundJson","itineraryToOsrmJson","lastLegId","itinerarySteps","jsonLegs","idLeg","legSteps","lastStepId","idStep","stepCoordsIdx","nextStepCoordsIdx","maneuver","bearing_before","bearing_after","location","modifier","routes","weight_name","get","jsonRoutes","jsonItinerary","jsonLeg","legCoords","startCoords","endCoords","stepsBuilder","stepCoords","distances","idStepCoordsInLeg","min"],"mappings":"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"}