@opentripplanner/core-utils 5.0.3-alpha.1 → 7.0.0-alpha.1

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.
Files changed (45) hide show
  1. package/esm/itinerary.js +74 -11
  2. package/esm/itinerary.js.map +1 -1
  3. package/esm/map.js +20 -239
  4. package/esm/map.js.map +1 -1
  5. package/esm/query.js +14 -11
  6. package/esm/query.js.map +1 -1
  7. package/esm/time.js +5 -56
  8. package/esm/time.js.map +1 -1
  9. package/lib/itinerary.d.ts +14 -7
  10. package/lib/itinerary.d.ts.map +1 -1
  11. package/lib/itinerary.js +79 -65
  12. package/lib/itinerary.js.map +1 -1
  13. package/lib/map.d.ts +4 -13
  14. package/lib/map.d.ts.map +1 -1
  15. package/lib/map.js +18 -251
  16. package/lib/map.js.map +1 -1
  17. package/lib/query.js +11 -15
  18. package/lib/query.js.map +1 -1
  19. package/lib/time.d.ts +1 -16
  20. package/lib/time.d.ts.map +1 -1
  21. package/lib/time.js +4 -72
  22. package/lib/time.js.map +1 -1
  23. package/package.json +4 -5
  24. package/src/__tests__/__snapshots__/itinerary.js.snap +2 -38
  25. package/src/__tests__/__snapshots__/time.js.snap +7 -13
  26. package/src/__tests__/itinerary.js +6 -29
  27. package/src/__tests__/time.js +7 -27
  28. package/src/itinerary.ts +72 -27
  29. package/src/map.ts +19 -287
  30. package/src/query.js +19 -16
  31. package/src/time.ts +11 -76
  32. package/tsconfig.tsbuildinfo +1381 -1288
  33. package/esm/deprecated-with-types.js +0 -47
  34. package/esm/deprecated-with-types.js.map +0 -1
  35. package/esm/deprecated.js +0 -325
  36. package/esm/deprecated.js.map +0 -1
  37. package/lib/deprecated-with-types.d.ts +0 -23
  38. package/lib/deprecated-with-types.d.ts.map +0 -1
  39. package/lib/deprecated-with-types.js +0 -61
  40. package/lib/deprecated-with-types.js.map +0 -1
  41. package/lib/deprecated.js +0 -355
  42. package/lib/deprecated.js.map +0 -1
  43. package/src/__tests__/__mocks__/multi-currency-itinerary.json +0 -1728
  44. package/src/deprecated-with-types.ts +0 -62
  45. package/src/deprecated.js +0 -334
package/esm/itinerary.js CHANGED
@@ -1,8 +1,32 @@
1
1
  import _toConsumableArray from "@babel/runtime/helpers/toConsumableArray";
2
2
  import polyline from "@mapbox/polyline";
3
3
  import turfAlong from "@turf/along";
4
- import { calculateFares, getLegModeLabel, getModeForPlace, getPlaceName, getStepDirection, getStepInstructions, getStepStreetName, getTimeZoneOffset, getTransitFare } from "./deprecated";
5
- export { calculateFares, getLegModeLabel, getModeForPlace, getPlaceName, getStepDirection, getStepInstructions, getStepStreetName, getTimeZoneOffset, getTransitFare }; // All OTP transit modes
4
+ /*
5
+ import {
6
+ // calculateFares,
7
+ // getLegModeLabel,
8
+ // getModeForPlace,
9
+ // getPlaceName,
10
+ // getStepDirection,
11
+ // getStepInstructions,
12
+ // getStepStreetName,
13
+ // getTimeZoneOffset,
14
+ // getTransitFare
15
+ } from "./deprecated";
16
+
17
+ export {
18
+ // calculateFares,
19
+ // getLegModeLabel,
20
+ // getModeForPlace,
21
+ // getPlaceName,
22
+ // getStepDirection,
23
+ // getStepInstructions,
24
+ // getStepStreetName,
25
+ // getTimeZoneOffset,
26
+ // getTransitFare
27
+ };
28
+ */
29
+ // All OTP transit modes
6
30
 
7
31
  export var transitModes = ["TRAM", "BUS", "SUBWAY", "FERRY", "RAIL", "GONDOLA"];
8
32
  /**
@@ -390,18 +414,57 @@ export function calculatePhysicalActivity(itinerary) {
390
414
  walkDuration: walkDuration
391
415
  };
392
416
  }
393
- export function calculateTncFares(itinerary) {
394
- // TODO: don't rely on deprecated methods!
395
- // At the moment this is safe as none of these exported variables contain strings
396
- var _calculateFares = calculateFares(itinerary, true),
397
- maxTNCFare = _calculateFares.maxTNCFare,
398
- minTNCFare = _calculateFares.minTNCFare,
399
- tncCurrencyCode = _calculateFares.tncCurrencyCode;
417
+ /**
418
+ * For an itinerary, calculates the TNC fares and returns an object with
419
+ * these values and currency info.
420
+ * It is assumed that the same currency is used for all TNC legs.
421
+ */
400
422
 
423
+ export function calculateTncFares(itinerary) {
424
+ var minTNCFare = 0;
425
+ var maxTNCFare = 0;
426
+ var currencyCode;
427
+ itinerary.legs.forEach(function (_ref) {
428
+ var hailedCar = _ref.hailedCar,
429
+ mode = _ref.mode,
430
+ tncData = _ref.tncData;
431
+
432
+ if (mode === "CAR" && hailedCar && tncData) {
433
+ var currency = tncData.currency,
434
+ maxCost = tncData.maxCost,
435
+ minCost = tncData.minCost;
436
+ minTNCFare += minCost;
437
+ maxTNCFare += maxCost; // Assumes a single currency for entire itinerary.
438
+
439
+ currencyCode = currency;
440
+ }
441
+ });
401
442
  return {
443
+ currencyCode: currencyCode,
402
444
  maxTNCFare: maxTNCFare,
403
- minTNCFare: minTNCFare,
404
- tncCurrencyCode: tncCurrencyCode
445
+ minTNCFare: minTNCFare
446
+ };
447
+ }
448
+ /**
449
+ * For a given fare component (either total fare or component parts), returns
450
+ * an object with the fare value (in cents).
451
+ */
452
+
453
+ export function getTransitFare(fareComponent) {
454
+ // Default values (if fare component is not valid).
455
+ var transitFare = 0;
456
+ var currencyCode = "USD";
457
+
458
+ if (fareComponent) {
459
+ // Assign values without declaration.
460
+ // See: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment#assignment_without_declaration
461
+ currencyCode = fareComponent.currency.currencyCode;
462
+ transitFare = fareComponent.cents;
463
+ }
464
+
465
+ return {
466
+ currencyCode: currencyCode,
467
+ transitFare: transitFare
405
468
  };
406
469
  }
407
470
  //# sourceMappingURL=itinerary.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/itinerary.ts"],"names":["polyline","turfAlong","calculateFares","getLegModeLabel","getModeForPlace","getPlaceName","getStepDirection","getStepInstructions","getStepStreetName","getTimeZoneOffset","getTransitFare","transitModes","getTransitModes","config","modes","map","tm","mode","isTransit","includes","isReservationRequired","leg","boardRule","isContinuousDropoff","alightRule","isFlex","isAdvanceBookingRequired","info","latestBookingTime","daysPrior","legDropoffRequiresAdvanceBooking","dropOffBookingInfo","isWalk","isBicycle","isBicycleRent","isCar","startsWith","isMicromobility","isAccessMode","hasTransit","modesStr","split","some","hasCar","hasBike","hasMicromobility","hasHail","indexOf","hasRental","getMapColor","get","toSentenceCase","str","String","charAt","toUpperCase","substr","toLowerCase","getCompanyFromLeg","from","rentedBike","rentedCar","rentedVehicle","tncData","networks","company","getItineraryBounds","itinerary","coords","legs","forEach","legCoords","toGeoJSON","legGeometry","points","coordinates","c","getLegBounds","length","push","lat","lon","to","legLocationAtDistance","distance","line","pt","units","geometry","e","legElevationAtDistance","traversed","unshift","i","start","elevDistanceSpan","console","warn","pct","elevSpan","getElevationProfile","steps","unitConversion","minElev","maxElev","gain","loss","previous","step","elevation","elev","diff","second","first","convertedElevation","getTextWidth","text","font","canvas","document","createElement","context","getContext","metrics","measureText","width","getCompanyForNetwork","networkString","companies","find","co","id","getCompaniesLabelFromNetworks","network","filter","label","join","getTNCLocation","type","location","toFixed","calculatePhysicalActivity","walkDuration","bikeDuration","duration","caloriesBurned","calculateTncFares","maxTNCFare","minTNCFare","tncCurrencyCode"],"mappings":"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","sourcesContent":["import polyline from \"@mapbox/polyline\";\nimport {\n Company,\n Config,\n ElevationProfile,\n FlexBookingInfo,\n Itinerary,\n LatLngArray,\n Leg,\n Step\n} from \"@opentripplanner/types\";\nimport turfAlong from \"@turf/along\";\n\nimport {\n calculateFares,\n getLegModeLabel,\n getModeForPlace,\n getPlaceName,\n getStepDirection,\n getStepInstructions,\n getStepStreetName,\n getTimeZoneOffset,\n getTransitFare\n} from \"./deprecated\";\n\nexport {\n calculateFares,\n getLegModeLabel,\n getModeForPlace,\n getPlaceName,\n getStepDirection,\n getStepInstructions,\n getStepStreetName,\n getTimeZoneOffset,\n getTransitFare\n};\n\n// All OTP transit modes\nexport const transitModes = [\n \"TRAM\",\n \"BUS\",\n \"SUBWAY\",\n \"FERRY\",\n \"RAIL\",\n \"GONDOLA\"\n];\n\n/**\n * @param {config} config OTP-RR configuration object\n * @return {Array} List of all transit modes defined in config; otherwise default mode list\n */\n\nexport function getTransitModes(config: Config): string[] {\n if (!config || !config.modes || !config.modes.transitModes)\n return transitModes;\n\n return config.modes.transitModes.map(tm =>\n typeof tm !== \"string\" ? tm.mode : tm\n );\n}\n\nexport function isTransit(mode: string): boolean {\n return transitModes.includes(mode) || mode === \"TRANSIT\";\n}\n\n/**\n * Returns true if the leg pickup rules enabled which require\n * calling ahead for the service to run. \"mustPhone\" is the only\n * property of boardRule which encodes this info.\n */\nexport function isReservationRequired(leg: Leg): boolean {\n return leg.boardRule === \"mustPhone\";\n}\n/**\n * Returns true if the leg has continuous dropoff enabled which requires\n * asking the driver to let the user off. \"coordinateWithDriver\" is the only\n * property of alightRule which encodes this info.\n */\nexport function isContinuousDropoff(leg: Leg): boolean {\n return leg.alightRule === \"coordinateWithDriver\";\n}\n/**\n * The two rules checked by the above two functions are the only values\n * returned by OTP when a leg is a flex leg.\n */\nexport function isFlex(leg: Leg): boolean {\n return isReservationRequired(leg) || isContinuousDropoff(leg);\n}\n\nexport function isAdvanceBookingRequired(info: FlexBookingInfo): boolean {\n return info?.latestBookingTime?.daysPrior > 0;\n}\nexport function legDropoffRequiresAdvanceBooking(leg: Leg): boolean {\n return isAdvanceBookingRequired(leg.dropOffBookingInfo);\n}\n\nexport function isWalk(mode: string): boolean {\n if (!mode) return false;\n\n return mode === \"WALK\";\n}\n\nexport function isBicycle(mode: string): boolean {\n if (!mode) return false;\n\n return mode === \"BICYCLE\";\n}\n\nexport function isBicycleRent(mode: string): boolean {\n if (!mode) return false;\n\n return mode === \"BICYCLE_RENT\";\n}\n\nexport function isCar(mode: string): boolean {\n if (!mode) return false;\n return mode.startsWith(\"CAR\");\n}\n\nexport function isMicromobility(mode: string): boolean {\n if (!mode) return false;\n return mode.startsWith(\"MICROMOBILITY\") || mode.startsWith(\"SCOOTER\");\n}\n\nexport function isAccessMode(mode: string): boolean {\n return (\n isWalk(mode) ||\n isBicycle(mode) ||\n isBicycleRent(mode) ||\n isCar(mode) ||\n isMicromobility(mode)\n );\n}\n\n/**\n * @param {string} modesStr a comma-separated list of OTP modes\n * @return {boolean} whether any of the modes are transit modes\n */\nexport function hasTransit(modesStr: string): boolean {\n return modesStr.split(\",\").some(mode => isTransit(mode));\n}\n\n/**\n * @param {string} modesStr a comma-separated list of OTP modes\n * @return {boolean} whether any of the modes are car-based modes\n */\nexport function hasCar(modesStr: string): boolean {\n return modesStr.split(\",\").some(mode => isCar(mode));\n}\n\n/**\n * @param {string} modesStr a comma-separated list of OTP modes\n * @return {boolean} whether any of the modes are bicycle-based modes\n */\nexport function hasBike(modesStr: string): boolean {\n return modesStr\n .split(\",\")\n .some(mode => isBicycle(mode) || isBicycleRent(mode));\n}\n\n/**\n * @param {string} modesStr a comma-separated list of OTP modes\n * @return {boolean} whether any of the modes are micromobility-based modes\n */\nexport function hasMicromobility(modesStr: string): boolean {\n return modesStr.split(\",\").some(mode => isMicromobility(mode));\n}\n\n/**\n * @param {string} modesStr a comma-separated list of OTP modes\n * @return {boolean} whether any of the modes is a hailing mode\n */\nexport function hasHail(modesStr: string): boolean {\n return modesStr.split(\",\").some(mode => mode.indexOf(\"_HAIL\") > -1);\n}\n\n/**\n * @param {string} modesStr a comma-separated list of OTP modes\n * @return {boolean} whether any of the modes is a rental mode\n */\nexport function hasRental(modesStr: string): boolean {\n return modesStr.split(\",\").some(mode => mode.indexOf(\"_RENT\") > -1);\n}\n\nexport function getMapColor(mode: string): string {\n mode = mode || this.get(\"mode\");\n if (mode === \"WALK\") return \"#444\";\n if (mode === \"BICYCLE\") return \"#0073e5\";\n if (mode === \"SUBWAY\") return \"#e60000\";\n if (mode === \"RAIL\") return \"#b00\";\n if (mode === \"BUS\") return \"#080\";\n if (mode === \"TRAM\") return \"#800\";\n if (mode === \"FERRY\") return \"#008\";\n if (mode === \"CAR\") return \"#444\";\n if (mode === \"MICROMOBILITY\" || mode === \"SCOOTER\") return \"#f5a729\";\n return \"#aaa\";\n}\n\nexport function toSentenceCase(str: string): string {\n if (str == null) {\n return \"\";\n }\n str = String(str);\n return str.charAt(0).toUpperCase() + str.substr(1).toLowerCase();\n}\n\n/**\n * Derive the company string based on mode and network associated with leg.\n */\nexport function getCompanyFromLeg(leg: Leg): string {\n if (!leg) return null;\n const { from, mode, rentedBike, rentedCar, rentedVehicle, tncData } = leg;\n if (mode === \"CAR\" && rentedCar) {\n return from.networks[0];\n }\n if (mode === \"CAR\" && tncData) {\n return tncData.company;\n }\n if (mode === \"BICYCLE\" && rentedBike && from.networks) {\n return from.networks[0];\n }\n if (\n (mode === \"MICROMOBILITY\" || mode === \"SCOOTER\") &&\n rentedVehicle &&\n from.networks\n ) {\n return from.networks[0];\n }\n return null;\n}\n\nexport function getItineraryBounds(itinerary: Itinerary): LatLngArray[] {\n let coords = [];\n itinerary.legs.forEach(leg => {\n const legCoords = polyline\n .toGeoJSON(leg.legGeometry.points)\n .coordinates.map((c: number[]) => [c[1], c[0]]);\n coords = [...coords, ...legCoords];\n });\n return coords;\n}\n\n/**\n * Return a coords object that encloses the given leg's geometry.\n */\nexport function getLegBounds(leg: Leg): number[] {\n const coords = polyline\n .toGeoJSON(leg.legGeometry.points)\n .coordinates.map(c => [c[1], c[0]]);\n\n // in certain cases, there might be zero-length coordinates in the leg\n // geometry. In these cases, build us an array of coordinates using the from\n // and to data of the leg.\n if (coords.length === 0) {\n coords.push([leg.from.lat, leg.from.lon], [leg.to.lat, leg.to.lon]);\n }\n return coords;\n}\n\n/* Returns an interpolated lat-lon at a specified distance along a leg */\n\nexport function legLocationAtDistance(leg: Leg, distance: number): number[] {\n if (!leg.legGeometry) return null;\n\n try {\n const line = polyline.toGeoJSON(leg.legGeometry.points);\n const pt = turfAlong(line, distance, { units: \"meters\" });\n if (pt && pt.geometry && pt.geometry.coordinates) {\n return [pt.geometry.coordinates[1], pt.geometry.coordinates[0]];\n }\n } catch (e) {\n // FIXME handle error!\n }\n\n return null;\n}\n\n/* Returns an interpolated elevation at a specified distance along a leg */\n\nexport function legElevationAtDistance(\n points: number[][],\n distance: number\n): number {\n // Iterate through the combined elevation profile\n let traversed = 0;\n // If first point distance is not zero, insert starting point at zero with\n // null elevation. Encountering this value should trigger the warning below.\n if (points[0][0] > 0) {\n points.unshift([0, null]);\n }\n for (let i = 1; i < points.length; i++) {\n const start = points[i - 1];\n const elevDistanceSpan = points[i][0] - start[0];\n if (distance >= traversed && distance <= traversed + elevDistanceSpan) {\n // Distance falls within this point and the previous one;\n // compute & return iterpolated elevation value\n if (start[1] === null) {\n console.warn(\n \"Elevation value does not exist for distance.\",\n distance,\n traversed\n );\n return null;\n }\n const pct = (distance - traversed) / elevDistanceSpan;\n const elevSpan = points[i][1] - start[1];\n return start[1] + elevSpan * pct;\n }\n traversed += elevDistanceSpan;\n }\n console.warn(\n \"Elevation value does not exist for distance.\",\n distance,\n traversed\n );\n return null;\n}\n\n// Iterate through the steps, building the array of elevation points and\n// keeping track of the minimum and maximum elevations reached\nexport function getElevationProfile(\n steps: Step[],\n unitConversion = 1\n): ElevationProfile {\n let minElev = 100000;\n let maxElev = -100000;\n let traversed = 0;\n let gain = 0;\n let loss = 0;\n let previous = null;\n const points = [];\n steps.forEach(step => {\n if (!step.elevation || step.elevation.length === 0) {\n traversed += step.distance;\n return;\n }\n for (let i = 0; i < step.elevation.length; i++) {\n const elev = step.elevation[i];\n if (previous) {\n const diff = (elev.second - previous.second) * unitConversion;\n if (diff > 0) gain += diff;\n else loss += diff;\n }\n if (i === 0 && elev.first !== 0) {\n // console.warn(`No elevation data available for step ${stepIndex}-${i} at beginning of segment`, elev)\n }\n const convertedElevation = elev.second * unitConversion;\n if (convertedElevation < minElev) minElev = convertedElevation;\n if (convertedElevation > maxElev) maxElev = convertedElevation;\n points.push([traversed + elev.first, elev.second]);\n // Insert \"filler\" point if the last point in elevation profile does not\n // reach the full distance of the step.\n if (i === step.elevation.length - 1 && elev.first !== step.distance) {\n // points.push([traversed + step.distance, elev.second])\n }\n previous = elev;\n }\n traversed += step.distance;\n });\n return { maxElev, minElev, points, traversed, gain, loss };\n}\n\n/**\n * Uses canvas.measureText to compute and return the width of the given text of given font in pixels.\n *\n * @param {string} text The text to be rendered.\n * @param {string} font The css font descriptor that text is to be rendered with (e.g. \"bold 14px verdana\").\n *\n * @see https://stackoverflow.com/questions/118241/calculate-text-width-with-javascript/21015393#21015393\n */\nexport function getTextWidth(text: string, font = \"22px Arial\"): number {\n // Create custom type for function including re-used canvas object\n type GetTextWidth = typeof getTextWidth & { canvas: HTMLCanvasElement };\n\n // re-use canvas object for better performance\n const canvas =\n (getTextWidth as GetTextWidth).canvas ||\n ((getTextWidth as GetTextWidth).canvas = document.createElement(\"canvas\"));\n const context = canvas.getContext(\"2d\");\n context.font = font;\n const metrics = context.measureText(text);\n return metrics.width;\n}\n\n/**\n * Get the configured company object for the given network string if the company\n * has been defined in the provided companies array config.\n */\nexport function getCompanyForNetwork(\n networkString: string,\n companies: Company[] = []\n): Company {\n const company = companies.find(co => co.id === networkString);\n if (!company) {\n console.warn(\n `No company found in config.yml that matches rented vehicle network: ${networkString}`,\n companies\n );\n }\n return company;\n}\n\n/**\n * Get a string label to display from a list of vehicle rental networks.\n *\n * @param {Array<string>} networks A list of network ids.\n * @param {Array<object>} [companies=[]] An optional list of the companies config.\n * @return {string} A label for use in presentation on a website.\n */\nexport function getCompaniesLabelFromNetworks(\n networks: string[],\n companies: Company[] = []\n): string {\n return networks\n .map(network => getCompanyForNetwork(network, companies))\n .filter(co => !!co)\n .map(co => co.label)\n .join(\"/\");\n}\n\nexport function getTNCLocation(leg: Leg, type: string): string {\n const location = leg[type];\n return `${location.lat.toFixed(5)},${location.lon.toFixed(5)}`;\n}\n\nexport function calculatePhysicalActivity(\n itinerary: Itinerary\n): {\n bikeDuration: number;\n caloriesBurned: number;\n walkDuration: number;\n} {\n let walkDuration = 0;\n let bikeDuration = 0;\n itinerary.legs.forEach(leg => {\n if (leg.mode.startsWith(\"WALK\")) walkDuration += leg.duration;\n if (leg.mode.startsWith(\"BICYCLE\")) bikeDuration += leg.duration;\n });\n const caloriesBurned =\n (walkDuration / 3600) * 280 + (bikeDuration / 3600) * 290;\n return {\n bikeDuration,\n caloriesBurned,\n walkDuration\n };\n}\n\nexport function calculateTncFares(itinerary) {\n // TODO: don't rely on deprecated methods!\n // At the moment this is safe as none of these exported variables contain strings\n const { maxTNCFare, minTNCFare, tncCurrencyCode } = calculateFares(\n itinerary,\n true\n );\n return { maxTNCFare, minTNCFare, tncCurrencyCode };\n}\n"],"file":"itinerary.js"}
1
+ {"version":3,"sources":["../src/itinerary.ts"],"names":["polyline","turfAlong","transitModes","getTransitModes","config","modes","map","tm","mode","isTransit","includes","isReservationRequired","leg","boardRule","isContinuousDropoff","alightRule","isFlex","isAdvanceBookingRequired","info","latestBookingTime","daysPrior","legDropoffRequiresAdvanceBooking","dropOffBookingInfo","isWalk","isBicycle","isBicycleRent","isCar","startsWith","isMicromobility","isAccessMode","hasTransit","modesStr","split","some","hasCar","hasBike","hasMicromobility","hasHail","indexOf","hasRental","getMapColor","get","toSentenceCase","str","String","charAt","toUpperCase","substr","toLowerCase","getCompanyFromLeg","from","rentedBike","rentedCar","rentedVehicle","tncData","networks","company","getItineraryBounds","itinerary","coords","legs","forEach","legCoords","toGeoJSON","legGeometry","points","coordinates","c","getLegBounds","length","push","lat","lon","to","legLocationAtDistance","distance","line","pt","units","geometry","e","legElevationAtDistance","traversed","unshift","i","start","elevDistanceSpan","console","warn","pct","elevSpan","getElevationProfile","steps","unitConversion","minElev","maxElev","gain","loss","previous","step","elevation","elev","diff","second","first","convertedElevation","getTextWidth","text","font","canvas","document","createElement","context","getContext","metrics","measureText","width","getCompanyForNetwork","networkString","companies","find","co","id","getCompaniesLabelFromNetworks","network","filter","label","join","getTNCLocation","type","location","toFixed","calculatePhysicalActivity","walkDuration","bikeDuration","duration","caloriesBurned","calculateTncFares","minTNCFare","maxTNCFare","currencyCode","hailedCar","currency","maxCost","minCost","getTransitFare","fareComponent","transitFare","cents"],"mappings":"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","sourcesContent":["import polyline from \"@mapbox/polyline\";\nimport {\n Company,\n Config,\n ElevationProfile,\n FlexBookingInfo,\n Itinerary,\n LatLngArray,\n Leg,\n Money,\n Step,\n TncFare\n} from \"@opentripplanner/types\";\nimport turfAlong from \"@turf/along\";\n\n/*\nimport {\n // calculateFares,\n // getLegModeLabel,\n // getModeForPlace,\n // getPlaceName,\n // getStepDirection,\n // getStepInstructions,\n // getStepStreetName,\n // getTimeZoneOffset,\n // getTransitFare\n} from \"./deprecated\";\n\nexport {\n // calculateFares,\n // getLegModeLabel,\n // getModeForPlace,\n // getPlaceName,\n // getStepDirection,\n // getStepInstructions,\n // getStepStreetName,\n // getTimeZoneOffset,\n // getTransitFare\n};\n*/\n\n// All OTP transit modes\nexport const transitModes = [\n \"TRAM\",\n \"BUS\",\n \"SUBWAY\",\n \"FERRY\",\n \"RAIL\",\n \"GONDOLA\"\n];\n\n/**\n * @param {config} config OTP-RR configuration object\n * @return {Array} List of all transit modes defined in config; otherwise default mode list\n */\n\nexport function getTransitModes(config: Config): string[] {\n if (!config || !config.modes || !config.modes.transitModes)\n return transitModes;\n\n return config.modes.transitModes.map(tm =>\n typeof tm !== \"string\" ? tm.mode : tm\n );\n}\n\nexport function isTransit(mode: string): boolean {\n return transitModes.includes(mode) || mode === \"TRANSIT\";\n}\n\n/**\n * Returns true if the leg pickup rules enabled which require\n * calling ahead for the service to run. \"mustPhone\" is the only\n * property of boardRule which encodes this info.\n */\nexport function isReservationRequired(leg: Leg): boolean {\n return leg.boardRule === \"mustPhone\";\n}\n/**\n * Returns true if the leg has continuous dropoff enabled which requires\n * asking the driver to let the user off. \"coordinateWithDriver\" is the only\n * property of alightRule which encodes this info.\n */\nexport function isContinuousDropoff(leg: Leg): boolean {\n return leg.alightRule === \"coordinateWithDriver\";\n}\n/**\n * The two rules checked by the above two functions are the only values\n * returned by OTP when a leg is a flex leg.\n */\nexport function isFlex(leg: Leg): boolean {\n return isReservationRequired(leg) || isContinuousDropoff(leg);\n}\n\nexport function isAdvanceBookingRequired(info: FlexBookingInfo): boolean {\n return info?.latestBookingTime?.daysPrior > 0;\n}\nexport function legDropoffRequiresAdvanceBooking(leg: Leg): boolean {\n return isAdvanceBookingRequired(leg.dropOffBookingInfo);\n}\n\nexport function isWalk(mode: string): boolean {\n if (!mode) return false;\n\n return mode === \"WALK\";\n}\n\nexport function isBicycle(mode: string): boolean {\n if (!mode) return false;\n\n return mode === \"BICYCLE\";\n}\n\nexport function isBicycleRent(mode: string): boolean {\n if (!mode) return false;\n\n return mode === \"BICYCLE_RENT\";\n}\n\nexport function isCar(mode: string): boolean {\n if (!mode) return false;\n return mode.startsWith(\"CAR\");\n}\n\nexport function isMicromobility(mode: string): boolean {\n if (!mode) return false;\n return mode.startsWith(\"MICROMOBILITY\") || mode.startsWith(\"SCOOTER\");\n}\n\nexport function isAccessMode(mode: string): boolean {\n return (\n isWalk(mode) ||\n isBicycle(mode) ||\n isBicycleRent(mode) ||\n isCar(mode) ||\n isMicromobility(mode)\n );\n}\n\n/**\n * @param {string} modesStr a comma-separated list of OTP modes\n * @return {boolean} whether any of the modes are transit modes\n */\nexport function hasTransit(modesStr: string): boolean {\n return modesStr.split(\",\").some(mode => isTransit(mode));\n}\n\n/**\n * @param {string} modesStr a comma-separated list of OTP modes\n * @return {boolean} whether any of the modes are car-based modes\n */\nexport function hasCar(modesStr: string): boolean {\n return modesStr.split(\",\").some(mode => isCar(mode));\n}\n\n/**\n * @param {string} modesStr a comma-separated list of OTP modes\n * @return {boolean} whether any of the modes are bicycle-based modes\n */\nexport function hasBike(modesStr: string): boolean {\n return modesStr\n .split(\",\")\n .some(mode => isBicycle(mode) || isBicycleRent(mode));\n}\n\n/**\n * @param {string} modesStr a comma-separated list of OTP modes\n * @return {boolean} whether any of the modes are micromobility-based modes\n */\nexport function hasMicromobility(modesStr: string): boolean {\n return modesStr.split(\",\").some(mode => isMicromobility(mode));\n}\n\n/**\n * @param {string} modesStr a comma-separated list of OTP modes\n * @return {boolean} whether any of the modes is a hailing mode\n */\nexport function hasHail(modesStr: string): boolean {\n return modesStr.split(\",\").some(mode => mode.indexOf(\"_HAIL\") > -1);\n}\n\n/**\n * @param {string} modesStr a comma-separated list of OTP modes\n * @return {boolean} whether any of the modes is a rental mode\n */\nexport function hasRental(modesStr: string): boolean {\n return modesStr.split(\",\").some(mode => mode.indexOf(\"_RENT\") > -1);\n}\n\nexport function getMapColor(mode: string): string {\n mode = mode || this.get(\"mode\");\n if (mode === \"WALK\") return \"#444\";\n if (mode === \"BICYCLE\") return \"#0073e5\";\n if (mode === \"SUBWAY\") return \"#e60000\";\n if (mode === \"RAIL\") return \"#b00\";\n if (mode === \"BUS\") return \"#080\";\n if (mode === \"TRAM\") return \"#800\";\n if (mode === \"FERRY\") return \"#008\";\n if (mode === \"CAR\") return \"#444\";\n if (mode === \"MICROMOBILITY\" || mode === \"SCOOTER\") return \"#f5a729\";\n return \"#aaa\";\n}\n\nexport function toSentenceCase(str: string): string {\n if (str == null) {\n return \"\";\n }\n str = String(str);\n return str.charAt(0).toUpperCase() + str.substr(1).toLowerCase();\n}\n\n/**\n * Derive the company string based on mode and network associated with leg.\n */\nexport function getCompanyFromLeg(leg: Leg): string {\n if (!leg) return null;\n const { from, mode, rentedBike, rentedCar, rentedVehicle, tncData } = leg;\n if (mode === \"CAR\" && rentedCar) {\n return from.networks[0];\n }\n if (mode === \"CAR\" && tncData) {\n return tncData.company;\n }\n if (mode === \"BICYCLE\" && rentedBike && from.networks) {\n return from.networks[0];\n }\n if (\n (mode === \"MICROMOBILITY\" || mode === \"SCOOTER\") &&\n rentedVehicle &&\n from.networks\n ) {\n return from.networks[0];\n }\n return null;\n}\n\nexport function getItineraryBounds(itinerary: Itinerary): LatLngArray[] {\n let coords = [];\n itinerary.legs.forEach(leg => {\n const legCoords = polyline\n .toGeoJSON(leg.legGeometry.points)\n .coordinates.map((c: number[]) => [c[1], c[0]]);\n coords = [...coords, ...legCoords];\n });\n return coords;\n}\n\n/**\n * Return a coords object that encloses the given leg's geometry.\n */\nexport function getLegBounds(leg: Leg): number[] {\n const coords = polyline\n .toGeoJSON(leg.legGeometry.points)\n .coordinates.map(c => [c[1], c[0]]);\n\n // in certain cases, there might be zero-length coordinates in the leg\n // geometry. In these cases, build us an array of coordinates using the from\n // and to data of the leg.\n if (coords.length === 0) {\n coords.push([leg.from.lat, leg.from.lon], [leg.to.lat, leg.to.lon]);\n }\n return coords;\n}\n\n/* Returns an interpolated lat-lon at a specified distance along a leg */\n\nexport function legLocationAtDistance(leg: Leg, distance: number): number[] {\n if (!leg.legGeometry) return null;\n\n try {\n const line = polyline.toGeoJSON(leg.legGeometry.points);\n const pt = turfAlong(line, distance, { units: \"meters\" });\n if (pt && pt.geometry && pt.geometry.coordinates) {\n return [pt.geometry.coordinates[1], pt.geometry.coordinates[0]];\n }\n } catch (e) {\n // FIXME handle error!\n }\n\n return null;\n}\n\n/* Returns an interpolated elevation at a specified distance along a leg */\n\nexport function legElevationAtDistance(\n points: number[][],\n distance: number\n): number {\n // Iterate through the combined elevation profile\n let traversed = 0;\n // If first point distance is not zero, insert starting point at zero with\n // null elevation. Encountering this value should trigger the warning below.\n if (points[0][0] > 0) {\n points.unshift([0, null]);\n }\n for (let i = 1; i < points.length; i++) {\n const start = points[i - 1];\n const elevDistanceSpan = points[i][0] - start[0];\n if (distance >= traversed && distance <= traversed + elevDistanceSpan) {\n // Distance falls within this point and the previous one;\n // compute & return iterpolated elevation value\n if (start[1] === null) {\n console.warn(\n \"Elevation value does not exist for distance.\",\n distance,\n traversed\n );\n return null;\n }\n const pct = (distance - traversed) / elevDistanceSpan;\n const elevSpan = points[i][1] - start[1];\n return start[1] + elevSpan * pct;\n }\n traversed += elevDistanceSpan;\n }\n console.warn(\n \"Elevation value does not exist for distance.\",\n distance,\n traversed\n );\n return null;\n}\n\n// Iterate through the steps, building the array of elevation points and\n// keeping track of the minimum and maximum elevations reached\nexport function getElevationProfile(\n steps: Step[],\n unitConversion = 1\n): ElevationProfile {\n let minElev = 100000;\n let maxElev = -100000;\n let traversed = 0;\n let gain = 0;\n let loss = 0;\n let previous = null;\n const points = [];\n steps.forEach(step => {\n if (!step.elevation || step.elevation.length === 0) {\n traversed += step.distance;\n return;\n }\n for (let i = 0; i < step.elevation.length; i++) {\n const elev = step.elevation[i];\n if (previous) {\n const diff = (elev.second - previous.second) * unitConversion;\n if (diff > 0) gain += diff;\n else loss += diff;\n }\n if (i === 0 && elev.first !== 0) {\n // console.warn(`No elevation data available for step ${stepIndex}-${i} at beginning of segment`, elev)\n }\n const convertedElevation = elev.second * unitConversion;\n if (convertedElevation < minElev) minElev = convertedElevation;\n if (convertedElevation > maxElev) maxElev = convertedElevation;\n points.push([traversed + elev.first, elev.second]);\n // Insert \"filler\" point if the last point in elevation profile does not\n // reach the full distance of the step.\n if (i === step.elevation.length - 1 && elev.first !== step.distance) {\n // points.push([traversed + step.distance, elev.second])\n }\n previous = elev;\n }\n traversed += step.distance;\n });\n return { maxElev, minElev, points, traversed, gain, loss };\n}\n\n/**\n * Uses canvas.measureText to compute and return the width of the given text of given font in pixels.\n *\n * @param {string} text The text to be rendered.\n * @param {string} font The css font descriptor that text is to be rendered with (e.g. \"bold 14px verdana\").\n *\n * @see https://stackoverflow.com/questions/118241/calculate-text-width-with-javascript/21015393#21015393\n */\nexport function getTextWidth(text: string, font = \"22px Arial\"): number {\n // Create custom type for function including re-used canvas object\n type GetTextWidth = typeof getTextWidth & { canvas: HTMLCanvasElement };\n\n // re-use canvas object for better performance\n const canvas =\n (getTextWidth as GetTextWidth).canvas ||\n ((getTextWidth as GetTextWidth).canvas = document.createElement(\"canvas\"));\n const context = canvas.getContext(\"2d\");\n context.font = font;\n const metrics = context.measureText(text);\n return metrics.width;\n}\n\n/**\n * Get the configured company object for the given network string if the company\n * has been defined in the provided companies array config.\n */\nexport function getCompanyForNetwork(\n networkString: string,\n companies: Company[] = []\n): Company {\n const company = companies.find(co => co.id === networkString);\n if (!company) {\n console.warn(\n `No company found in config.yml that matches rented vehicle network: ${networkString}`,\n companies\n );\n }\n return company;\n}\n\n/**\n * Get a string label to display from a list of vehicle rental networks.\n *\n * @param {Array<string>} networks A list of network ids.\n * @param {Array<object>} [companies=[]] An optional list of the companies config.\n * @return {string} A label for use in presentation on a website.\n */\nexport function getCompaniesLabelFromNetworks(\n networks: string[],\n companies: Company[] = []\n): string {\n return networks\n .map(network => getCompanyForNetwork(network, companies))\n .filter(co => !!co)\n .map(co => co.label)\n .join(\"/\");\n}\n\nexport function getTNCLocation(leg: Leg, type: string): string {\n const location = leg[type];\n return `${location.lat.toFixed(5)},${location.lon.toFixed(5)}`;\n}\n\nexport function calculatePhysicalActivity(\n itinerary: Itinerary\n): {\n bikeDuration: number;\n caloriesBurned: number;\n walkDuration: number;\n} {\n let walkDuration = 0;\n let bikeDuration = 0;\n itinerary.legs.forEach(leg => {\n if (leg.mode.startsWith(\"WALK\")) walkDuration += leg.duration;\n if (leg.mode.startsWith(\"BICYCLE\")) bikeDuration += leg.duration;\n });\n const caloriesBurned =\n (walkDuration / 3600) * 280 + (bikeDuration / 3600) * 290;\n return {\n bikeDuration,\n caloriesBurned,\n walkDuration\n };\n}\n\n/**\n * For an itinerary, calculates the TNC fares and returns an object with\n * these values and currency info.\n * It is assumed that the same currency is used for all TNC legs.\n */\nexport function calculateTncFares(itinerary: Itinerary): TncFare {\n let minTNCFare = 0;\n let maxTNCFare = 0;\n let currencyCode;\n itinerary.legs.forEach(({ hailedCar, mode, tncData }) => {\n if (mode === \"CAR\" && hailedCar && tncData) {\n const { currency, maxCost, minCost } = tncData;\n minTNCFare += minCost;\n maxTNCFare += maxCost;\n // Assumes a single currency for entire itinerary.\n currencyCode = currency;\n }\n });\n\n return {\n currencyCode,\n maxTNCFare,\n minTNCFare\n };\n}\n\n/**\n * For a given fare component (either total fare or component parts), returns\n * an object with the fare value (in cents).\n */\nexport function getTransitFare(\n fareComponent: Money\n): {\n currencyCode: string;\n transitFare: number;\n} {\n // Default values (if fare component is not valid).\n let transitFare = 0;\n let currencyCode = \"USD\";\n if (fareComponent) {\n // Assign values without declaration.\n // See: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment#assignment_without_declaration\n ({ currencyCode } = fareComponent.currency);\n transitFare = fareComponent.cents;\n }\n return {\n currencyCode,\n transitFare\n };\n}\n"],"file":"itinerary.js"}
package/esm/map.js CHANGED
@@ -1,7 +1,15 @@
1
- import _toConsumableArray from "@babel/runtime/helpers/toConsumableArray";
2
- import { getPlaceName, isAccessMode, isFlex, isTransit, toSentenceCase } from "./itinerary";
3
- import { coordsToString, getDetailText, latlngToString, logDeprecationWarning } from "./deprecated";
4
- export { coordsToString, getDetailText, latlngToString };
1
+ import { toSentenceCase } from "./itinerary";
2
+ /*
3
+ import {
4
+ // coordsToString,
5
+ // getDetailText //,
6
+ // latlngToString,
7
+ // logDeprecationWarning
8
+ } from "./deprecated";
9
+
10
+ export { coordsToString, getDetailText , latlngToString };
11
+ */
12
+
5
13
  export function currentPositionToLocation(currentPosition) {
6
14
  if (currentPosition.error || !currentPosition.coords) {
7
15
  console.warn("Cannot construct location from current position due to geolocation error or missing coordinates.");
@@ -13,6 +21,13 @@ export function currentPositionToLocation(currentPosition) {
13
21
  lon: currentPosition.coords.longitude,
14
22
  category: "CURRENT_LOCATION"
15
23
  };
24
+ } // TRICKY: It is used in query.js and in the context of
25
+ // otp-rr actions where the intl context is not available.
26
+
27
+ export function coordsToString(coords) {
28
+ return coords.length && coords.map(function (c) {
29
+ return (+c).toFixed(5);
30
+ }).join(", ");
16
31
  }
17
32
  export function stringToCoords(str) {
18
33
  return str && str.split(",").map(function (c) {
@@ -26,246 +41,12 @@ export function constructLocation(latlng) {
26
41
  };
27
42
  }
28
43
  export function formatStoredPlaceName(location) {
29
- var withDetails = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
30
-
31
- if (withDetails) {
32
- logDeprecationWarning("the formatStoredPlaceName withDetails parameter");
33
- }
34
-
35
- var displayName = location.type === "home" || location.type === "work" ? toSentenceCase(location.type) : location.name;
36
-
37
- if (withDetails) {
38
- var detailText = getDetailText(location);
39
- if (detailText) displayName += " (".concat(detailText, ")");
40
- }
41
-
42
- return displayName;
44
+ return location.type === "home" || location.type === "work" ? toSentenceCase(location.type) : location.name;
43
45
  }
44
46
  export function matchLatLon(location1, location2) {
45
47
  if (!location1 || !location2) return location1 === location2;
46
48
  return location1.lat === location2.lat && location1.lon === location2.lon;
47
49
  }
48
- /**
49
- * Converts an OTP itinerary object to a transtive.js itinerary object.
50
- * @param {*} itin Required OTP itinerary (see @opentripplanner/core-utils/types#itineraryType) to convert.
51
- * @param {*} companies Optional list of companies, used for labeling vehicle rental locations.
52
- * @param {*} getRouteLabel Optional function that takes an itinerary leg (see @opentripplanner/core-utils/types#legType)
53
- * and returns a string representing the route label to display for that leg.
54
- * @returns An itinerary in the transitive.js format.
55
- */
56
-
57
- export function itineraryToTransitive(itin, companies, getRouteLabel, disableFlexArc) {
58
- var _tdata$routes, _tdata$stops;
59
-
60
- var tdata = {
61
- journeys: [],
62
- streetEdges: [],
63
- places: [],
64
- patterns: [],
65
- routes: [],
66
- stops: []
67
- };
68
- var routes = {};
69
- var stops = {};
70
- var streetEdgeId = 0;
71
- var patternId = 0;
72
- var journey = {
73
- journey_id: "itin",
74
- // This string is not shown in the UI
75
- journey_name: "Iterarary-derived Journey",
76
- segments: []
77
- }; // add 'from' and 'to' places to the tdata places array
78
-
79
- tdata.places.push({
80
- place_id: "from",
81
- place_lat: itin.legs[0].from.lat,
82
- place_lon: itin.legs[0].from.lon
83
- });
84
- tdata.places.push({
85
- place_id: "to",
86
- place_lat: itin.legs[itin.legs.length - 1].to.lat,
87
- place_lon: itin.legs[itin.legs.length - 1].to.lon
88
- });
89
- itin.legs.forEach(function (leg, idx) {
90
- if (isAccessMode(leg.mode)) {
91
- var fromPlaceId;
92
-
93
- if (leg.from.bikeShareId) {
94
- fromPlaceId = "bicycle_rent_station_".concat(leg.from.bikeShareId);
95
-
96
- if ( // OTP2 Scooter case
97
- leg.mode === "SCOOTER") {
98
- fromPlaceId = "escooter_rent_station_".concat(leg.from.bikeShareId);
99
- }
100
- } else if (leg.from.vertexType === "VEHICLERENTAL") {
101
- // OTP1 Scooter case
102
- fromPlaceId = "escooter_rent_station_".concat(leg.from.name);
103
- } else if (leg.mode === "CAR" && idx > 0 && itin.legs[idx - 1].mode === "WALK") {
104
- // create a special place ID for car legs preceded by walking legs
105
- fromPlaceId = "itin_car_".concat(streetEdgeId, "_from");
106
- } else if (!fromPlaceId) {
107
- fromPlaceId = "itin_street_".concat(streetEdgeId, "_from");
108
- }
109
-
110
- var toPlaceId;
111
-
112
- if (leg.to.bikeShareId) {
113
- var _itin$legs;
114
-
115
- toPlaceId = "bicycle_rent_station_".concat(leg.to.bikeShareId); // OTP2 scooter case
116
- // Need to check next leg since this is a "to" place "
117
-
118
- if (leg.mode === "SCOOTER" || ((_itin$legs = itin.legs) === null || _itin$legs === void 0 ? void 0 : _itin$legs[idx + 1].mode) === "SCOOTER") {
119
- toPlaceId = "escooter_rent_station_".concat(leg.to.bikeShareId);
120
- }
121
- } else if (leg.to.vertexType === "VEHICLERENTAL") {
122
- toPlaceId = "escooter_rent_station_".concat(leg.to.name);
123
- } else if (leg.mode === "CAR" && idx < itin.legs.length - 1 && itin.legs[idx + 1].mode === "WALK") {
124
- // create a special place ID for car legs followed by walking legs
125
- toPlaceId = "itin_car_".concat(streetEdgeId, "_to");
126
- } else if (!toPlaceId) {
127
- toPlaceId = "itin_street_".concat(streetEdgeId, "_to");
128
- }
129
-
130
- var segment = {
131
- arc: false,
132
- type: leg.mode,
133
- streetEdges: [streetEdgeId],
134
- from: {
135
- type: "PLACE",
136
- place_id: fromPlaceId
137
- },
138
- to: {
139
- type: "PLACE",
140
- place_id: toPlaceId
141
- }
142
- }; // For TNC segments, draw using an arc
143
-
144
- if (leg.mode === "CAR" && leg.hailedCar) segment.arc = true;
145
- journey.segments.push(segment);
146
- tdata.streetEdges.push({
147
- edge_id: streetEdgeId,
148
- geometry: leg.legGeometry
149
- });
150
- tdata.places.push({
151
- place_id: fromPlaceId,
152
- // Do not label the from place in addition to the to place. Otherwise,
153
- // in some cases (bike rental station) the label for a single place will
154
- // appear twice on the rendered transitive view.
155
- // See https://github.com/conveyal/trimet-mod-otp/issues/152
156
- // place_name: leg.from.name,
157
- place_lat: leg.from.lat,
158
- place_lon: leg.from.lon
159
- });
160
- tdata.places.push({
161
- place_id: toPlaceId,
162
- // This string is not shown in the UI
163
- place_name: getPlaceName(leg.to, companies),
164
- place_lat: leg.to.lat,
165
- place_lon: leg.to.lon
166
- });
167
- streetEdgeId++;
168
- }
169
-
170
- if (isTransit(leg.mode)) {
171
- var _leg$legGeometry;
172
-
173
- // Flex routes sometimes have the same from and to IDs, but
174
- // these stops still need to be rendered separately!
175
- if (leg.from.stopId === leg.to.stopId) {
176
- leg.to.stopId = "".concat(leg.to.stopId, "_flexed_to");
177
- } // determine if we have valid inter-stop geometry
178
-
179
-
180
- var hasInterStopGeometry = !!leg.interStopGeometry;
181
- var hasLegGeometry = !!((_leg$legGeometry = leg.legGeometry) !== null && _leg$legGeometry !== void 0 && _leg$legGeometry.points);
182
- var hasIntermediateStopGeometry = hasInterStopGeometry && leg.intermediateStops && leg.interStopGeometry.length === leg.intermediateStops.length + 1; // create leg-specific pattern
183
-
184
- var ptnId = "ptn_".concat(patternId);
185
- var pattern = {
186
- pattern_id: ptnId,
187
- // This string is not shown in the UI
188
- pattern_name: "Pattern ".concat(patternId),
189
- route_id: leg.routeId,
190
- stops: []
191
- }; // add 'from' stop to stops dictionary and pattern object
192
-
193
- stops[leg.from.stopId] = {
194
- stop_id: leg.from.stopId,
195
- stop_name: leg.from.name,
196
- stop_lat: leg.from.lat,
197
- stop_lon: leg.from.lon
198
- };
199
- pattern.stops.push({
200
- stop_id: leg.from.stopId
201
- }); // add intermediate stops to stops dictionary and pattern object
202
- // If there is no intermediateStopGeometry, do not add the intermediate stops
203
- // as it will be straight lines instead of the nice legGeometry (but only if
204
- // the legGeometry exists).
205
-
206
- if (leg.intermediateStops && (hasIntermediateStopGeometry || !hasLegGeometry)) {
207
- leg.intermediateStops.forEach(function (stop, i) {
208
- stops[stop.stopId] = {
209
- stop_id: stop.stopId,
210
- stop_name: stop.name,
211
- stop_lat: stop.lat,
212
- stop_lon: stop.lon
213
- };
214
- pattern.stops.push({
215
- stop_id: stop.stopId,
216
- geometry: hasIntermediateStopGeometry && leg.interStopGeometry[i].points
217
- });
218
- });
219
- } // add 'to' stop to stops dictionary and pattern object
220
-
221
-
222
- stops[leg.to.stopId] = {
223
- stop_id: leg.to.stopId,
224
- stop_name: leg.to.name,
225
- stop_lat: leg.to.lat,
226
- stop_lon: leg.to.lon
227
- };
228
- pattern.stops.push({
229
- stop_id: leg.to.stopId,
230
- geometry: // Some legs don't have intermediateStopGeometry, but do have valid legGeometry
231
- (hasInterStopGeometry || hasLegGeometry) && (hasIntermediateStopGeometry ? leg.interStopGeometry[leg.interStopGeometry.length - 1].points : leg.legGeometry.points)
232
- }); // add route to the route dictionary
233
- // with a custom route label if specified.
234
-
235
- var routeLabel = typeof getRouteLabel === "function" ? getRouteLabel(leg) : leg.routeShortName;
236
- routes[leg.routeId] = {
237
- agency_id: leg.agencyId,
238
- route_id: leg.routeId,
239
- route_short_name: routeLabel || "",
240
- route_long_name: leg.routeLongName || "",
241
- route_type: leg.routeType,
242
- route_color: leg.routeColor
243
- }; // add the pattern to the tdata patterns array
244
-
245
- tdata.patterns.push(pattern); // add the pattern reference to the journey object
246
-
247
- journey.segments.push({
248
- arc: typeof disableFlexArc === "undefined" ? isFlex(leg) : !disableFlexArc,
249
- type: "TRANSIT",
250
- patterns: [{
251
- pattern_id: ptnId,
252
- from_stop_index: 0,
253
- to_stop_index: hasIntermediateStopGeometry ? leg.intermediateStops.length + 2 - 1 : 1
254
- }]
255
- });
256
- patternId++;
257
- }
258
- }); // add the routes and stops to the tdata arrays
259
-
260
- (_tdata$routes = tdata.routes).push.apply(_tdata$routes, _toConsumableArray(Object.values(routes)));
261
-
262
- (_tdata$stops = tdata.stops).push.apply(_tdata$stops, _toConsumableArray(Object.values(stops))); // add the journey to the tdata journeys array
263
-
264
-
265
- tdata.journeys.push(journey); // console.log('derived tdata', tdata);
266
-
267
- return tdata;
268
- }
269
50
  export function isBikeshareStation(place) {
270
51
  return place.place_id.lastIndexOf("bicycle_rent_station") !== -1;
271
52
  }
package/esm/map.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/map.ts"],"names":["getPlaceName","isAccessMode","isFlex","isTransit","toSentenceCase","coordsToString","getDetailText","latlngToString","logDeprecationWarning","currentPositionToLocation","currentPosition","error","coords","console","warn","lat","latitude","lon","longitude","category","stringToCoords","str","split","map","c","constructLocation","latlng","lng","formatStoredPlaceName","location","withDetails","displayName","type","name","detailText","matchLatLon","location1","location2","itineraryToTransitive","itin","companies","getRouteLabel","disableFlexArc","tdata","journeys","streetEdges","places","patterns","routes","stops","streetEdgeId","patternId","journey","journey_id","journey_name","segments","push","place_id","place_lat","legs","from","place_lon","length","to","forEach","leg","idx","mode","fromPlaceId","bikeShareId","vertexType","toPlaceId","segment","arc","hailedCar","edge_id","geometry","legGeometry","place_name","stopId","hasInterStopGeometry","interStopGeometry","hasLegGeometry","points","hasIntermediateStopGeometry","intermediateStops","ptnId","pattern","pattern_id","pattern_name","route_id","routeId","stop_id","stop_name","stop_lat","stop_lon","stop","i","routeLabel","routeShortName","agency_id","agencyId","route_short_name","route_long_name","routeLongName","route_type","routeType","route_color","routeColor","from_stop_index","to_stop_index","Object","values","isBikeshareStation","place","lastIndexOf","isEScooterStation","isCarWalkTransition","isValidLat","Number","isFinite","isValidLng","isValidLatLng","arr","Array","isArray"],"mappings":"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","sourcesContent":["import {\n Company,\n Itinerary,\n LatLngArray,\n Leg,\n Location,\n TransitiveData,\n UserPosition\n} from \"@opentripplanner/types\";\nimport {\n getPlaceName,\n isAccessMode,\n isFlex,\n isTransit,\n toSentenceCase\n} from \"./itinerary\";\n\nimport {\n coordsToString,\n getDetailText,\n latlngToString,\n logDeprecationWarning\n} from \"./deprecated\";\n\nexport { coordsToString, getDetailText, latlngToString };\n\nexport function currentPositionToLocation(\n currentPosition: UserPosition\n): Location {\n if (currentPosition.error || !currentPosition.coords) {\n console.warn(\n \"Cannot construct location from current position due to geolocation error or missing coordinates.\"\n );\n return null;\n }\n return {\n lat: currentPosition.coords.latitude,\n lon: currentPosition.coords.longitude,\n category: \"CURRENT_LOCATION\"\n };\n}\n\nexport function stringToCoords(str: string): number[] {\n return (str && str.split(\",\").map(c => +c)) || [];\n}\n\nexport function constructLocation(latlng: {\n lat: number;\n lng: number;\n}): Location {\n return {\n lat: latlng.lat,\n lon: latlng.lng\n };\n}\n\nexport function formatStoredPlaceName(\n location: Location,\n withDetails = true\n): string {\n if (withDetails) {\n logDeprecationWarning(\"the formatStoredPlaceName withDetails parameter\");\n }\n\n let displayName =\n location.type === \"home\" || location.type === \"work\"\n ? toSentenceCase(location.type)\n : location.name;\n if (withDetails) {\n const detailText = getDetailText(location);\n if (detailText) displayName += ` (${detailText})`;\n }\n return displayName;\n}\n\nexport function matchLatLon(location1: Location, location2: Location): boolean {\n if (!location1 || !location2) return location1 === location2;\n return location1.lat === location2.lat && location1.lon === location2.lon;\n}\n\n/**\n * Converts an OTP itinerary object to a transtive.js itinerary object.\n * @param {*} itin Required OTP itinerary (see @opentripplanner/core-utils/types#itineraryType) to convert.\n * @param {*} companies Optional list of companies, used for labeling vehicle rental locations.\n * @param {*} getRouteLabel Optional function that takes an itinerary leg (see @opentripplanner/core-utils/types#legType)\n * and returns a string representing the route label to display for that leg.\n * @returns An itinerary in the transitive.js format.\n */\nexport function itineraryToTransitive(\n itin: Itinerary,\n companies: Company[],\n getRouteLabel: (leg: Leg) => string,\n disableFlexArc: boolean\n): TransitiveData {\n const tdata = {\n journeys: [],\n streetEdges: [],\n places: [],\n patterns: [],\n routes: [],\n stops: []\n };\n const routes = {};\n const stops = {};\n let streetEdgeId = 0;\n let patternId = 0;\n\n const journey = {\n journey_id: \"itin\",\n // This string is not shown in the UI\n journey_name: \"Iterarary-derived Journey\",\n segments: []\n };\n\n // add 'from' and 'to' places to the tdata places array\n tdata.places.push({\n place_id: \"from\",\n place_lat: itin.legs[0].from.lat,\n place_lon: itin.legs[0].from.lon\n });\n tdata.places.push({\n place_id: \"to\",\n place_lat: itin.legs[itin.legs.length - 1].to.lat,\n place_lon: itin.legs[itin.legs.length - 1].to.lon\n });\n\n itin.legs.forEach((leg, idx) => {\n if (isAccessMode(leg.mode)) {\n let fromPlaceId: string;\n if (leg.from.bikeShareId) {\n fromPlaceId = `bicycle_rent_station_${leg.from.bikeShareId}`;\n if (\n // OTP2 Scooter case\n leg.mode === \"SCOOTER\"\n ) {\n fromPlaceId = `escooter_rent_station_${leg.from.bikeShareId}`;\n }\n } else if (leg.from.vertexType === \"VEHICLERENTAL\") {\n // OTP1 Scooter case\n fromPlaceId = `escooter_rent_station_${leg.from.name}`;\n } else if (\n leg.mode === \"CAR\" &&\n idx > 0 &&\n itin.legs[idx - 1].mode === \"WALK\"\n ) {\n // create a special place ID for car legs preceded by walking legs\n fromPlaceId = `itin_car_${streetEdgeId}_from`;\n } else if (!fromPlaceId) {\n fromPlaceId = `itin_street_${streetEdgeId}_from`;\n }\n\n let toPlaceId;\n if (leg.to.bikeShareId) {\n toPlaceId = `bicycle_rent_station_${leg.to.bikeShareId}`;\n // OTP2 scooter case\n // Need to check next leg since this is a \"to\" place \"\n if (leg.mode === \"SCOOTER\" || itin.legs?.[idx + 1].mode === \"SCOOTER\") {\n toPlaceId = `escooter_rent_station_${leg.to.bikeShareId}`;\n }\n } else if (leg.to.vertexType === \"VEHICLERENTAL\") {\n toPlaceId = `escooter_rent_station_${leg.to.name}`;\n } else if (\n leg.mode === \"CAR\" &&\n idx < itin.legs.length - 1 &&\n itin.legs[idx + 1].mode === \"WALK\"\n ) {\n // create a special place ID for car legs followed by walking legs\n toPlaceId = `itin_car_${streetEdgeId}_to`;\n } else if (!toPlaceId) {\n toPlaceId = `itin_street_${streetEdgeId}_to`;\n }\n\n const segment = {\n arc: false,\n type: leg.mode,\n streetEdges: [streetEdgeId],\n from: { type: \"PLACE\", place_id: fromPlaceId },\n to: { type: \"PLACE\", place_id: toPlaceId }\n };\n // For TNC segments, draw using an arc\n if (leg.mode === \"CAR\" && leg.hailedCar) segment.arc = true;\n journey.segments.push(segment);\n\n tdata.streetEdges.push({\n edge_id: streetEdgeId,\n geometry: leg.legGeometry\n });\n tdata.places.push({\n place_id: fromPlaceId,\n // Do not label the from place in addition to the to place. Otherwise,\n // in some cases (bike rental station) the label for a single place will\n // appear twice on the rendered transitive view.\n // See https://github.com/conveyal/trimet-mod-otp/issues/152\n // place_name: leg.from.name,\n place_lat: leg.from.lat,\n place_lon: leg.from.lon\n });\n tdata.places.push({\n place_id: toPlaceId,\n // This string is not shown in the UI\n place_name: getPlaceName(leg.to, companies),\n place_lat: leg.to.lat,\n place_lon: leg.to.lon\n });\n streetEdgeId++;\n }\n\n if (isTransit(leg.mode)) {\n // Flex routes sometimes have the same from and to IDs, but\n // these stops still need to be rendered separately!\n if (leg.from.stopId === leg.to.stopId) {\n leg.to.stopId = `${leg.to.stopId}_flexed_to`;\n }\n // determine if we have valid inter-stop geometry\n const hasInterStopGeometry = !!leg.interStopGeometry;\n const hasLegGeometry = !!leg.legGeometry?.points;\n const hasIntermediateStopGeometry =\n hasInterStopGeometry &&\n leg.intermediateStops &&\n leg.interStopGeometry.length === leg.intermediateStops.length + 1;\n\n // create leg-specific pattern\n const ptnId = `ptn_${patternId}`;\n const pattern = {\n pattern_id: ptnId,\n // This string is not shown in the UI\n pattern_name: `Pattern ${patternId}`,\n route_id: leg.routeId,\n stops: []\n };\n\n // add 'from' stop to stops dictionary and pattern object\n stops[leg.from.stopId] = {\n stop_id: leg.from.stopId,\n stop_name: leg.from.name,\n stop_lat: leg.from.lat,\n stop_lon: leg.from.lon\n };\n pattern.stops.push({ stop_id: leg.from.stopId });\n\n // add intermediate stops to stops dictionary and pattern object\n // If there is no intermediateStopGeometry, do not add the intermediate stops\n // as it will be straight lines instead of the nice legGeometry (but only if\n // the legGeometry exists).\n if (\n leg.intermediateStops &&\n (hasIntermediateStopGeometry || !hasLegGeometry)\n ) {\n leg.intermediateStops.forEach((stop, i) => {\n stops[stop.stopId] = {\n stop_id: stop.stopId,\n stop_name: stop.name,\n stop_lat: stop.lat,\n stop_lon: stop.lon\n };\n pattern.stops.push({\n stop_id: stop.stopId,\n geometry:\n hasIntermediateStopGeometry && leg.interStopGeometry[i].points\n });\n });\n }\n\n // add 'to' stop to stops dictionary and pattern object\n stops[leg.to.stopId] = {\n stop_id: leg.to.stopId,\n stop_name: leg.to.name,\n stop_lat: leg.to.lat,\n stop_lon: leg.to.lon\n };\n pattern.stops.push({\n stop_id: leg.to.stopId,\n geometry:\n // Some legs don't have intermediateStopGeometry, but do have valid legGeometry\n (hasInterStopGeometry || hasLegGeometry) &&\n (hasIntermediateStopGeometry\n ? leg.interStopGeometry[leg.interStopGeometry.length - 1].points\n : leg.legGeometry.points)\n });\n\n // add route to the route dictionary\n // with a custom route label if specified.\n const routeLabel =\n typeof getRouteLabel === \"function\"\n ? getRouteLabel(leg)\n : leg.routeShortName;\n routes[leg.routeId] = {\n agency_id: leg.agencyId,\n route_id: leg.routeId,\n route_short_name: routeLabel || \"\",\n route_long_name: leg.routeLongName || \"\",\n route_type: leg.routeType,\n route_color: leg.routeColor\n };\n\n // add the pattern to the tdata patterns array\n tdata.patterns.push(pattern);\n\n // add the pattern reference to the journey object\n journey.segments.push({\n arc:\n typeof disableFlexArc === \"undefined\" ? isFlex(leg) : !disableFlexArc,\n type: \"TRANSIT\",\n patterns: [\n {\n pattern_id: ptnId,\n from_stop_index: 0,\n to_stop_index: hasIntermediateStopGeometry\n ? leg.intermediateStops.length + 2 - 1\n : 1\n }\n ]\n });\n\n patternId++;\n }\n });\n\n // add the routes and stops to the tdata arrays\n tdata.routes.push(...Object.values(routes));\n tdata.stops.push(...Object.values(stops));\n\n // add the journey to the tdata journeys array\n tdata.journeys.push(journey);\n\n // console.log('derived tdata', tdata);\n return tdata;\n}\n\ntype TransitivePlaceRaw = {\n place_id: string;\n};\nexport function isBikeshareStation(place: TransitivePlaceRaw): boolean {\n return place.place_id.lastIndexOf(\"bicycle_rent_station\") !== -1;\n}\n\nexport function isEScooterStation(place: TransitivePlaceRaw): boolean {\n return place.place_id.lastIndexOf(\"escooter_rent_station\") !== -1;\n}\n\nexport function isCarWalkTransition(place: TransitivePlaceRaw): boolean {\n return place.place_id.lastIndexOf(\"itin_car_\") !== -1;\n}\n\nexport function isValidLat(lat: number): boolean {\n return Number.isFinite(lat) && lat >= -90 && lat <= 90;\n}\n\nexport function isValidLng(lng: number): boolean {\n return Number.isFinite(lng) && lng >= -180 && lng <= 180;\n}\n\nexport function isValidLatLng(arr: LatLngArray): boolean {\n return (\n Array.isArray(arr) &&\n arr.length === 2 &&\n isValidLat(arr[0]) &&\n isValidLng(arr[1])\n );\n}\n"],"file":"map.js"}
1
+ {"version":3,"sources":["../src/map.ts"],"names":["toSentenceCase","currentPositionToLocation","currentPosition","error","coords","console","warn","lat","latitude","lon","longitude","category","coordsToString","length","map","c","toFixed","join","stringToCoords","str","split","constructLocation","latlng","lng","formatStoredPlaceName","location","type","name","matchLatLon","location1","location2","isBikeshareStation","place","place_id","lastIndexOf","isEScooterStation","isCarWalkTransition","isValidLat","Number","isFinite","isValidLng","isValidLatLng","arr","Array","isArray"],"mappings":"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","sourcesContent":["import { LatLngArray, Location, UserPosition } from \"@opentripplanner/types\";\nimport { toSentenceCase } from \"./itinerary\";\n\n/*\nimport {\n // coordsToString,\n // getDetailText //,\n // latlngToString,\n // logDeprecationWarning\n} from \"./deprecated\";\n\nexport { coordsToString, getDetailText , latlngToString };\n*/\n\nexport function currentPositionToLocation(\n currentPosition: UserPosition\n): Location {\n if (currentPosition.error || !currentPosition.coords) {\n console.warn(\n \"Cannot construct location from current position due to geolocation error or missing coordinates.\"\n );\n return null;\n }\n return {\n lat: currentPosition.coords.latitude,\n lon: currentPosition.coords.longitude,\n category: \"CURRENT_LOCATION\"\n };\n}\n\n// TRICKY: It is used in query.js and in the context of\n// otp-rr actions where the intl context is not available.\nexport function coordsToString(coords: number[]): string {\n return coords.length && coords.map(c => (+c).toFixed(5)).join(\", \");\n}\n\nexport function stringToCoords(str: string): number[] {\n return (str && str.split(\",\").map(c => +c)) || [];\n}\n\nexport function constructLocation(latlng: {\n lat: number;\n lng: number;\n}): Location {\n return {\n lat: latlng.lat,\n lon: latlng.lng\n };\n}\n\nexport function formatStoredPlaceName(location: Location): string {\n return location.type === \"home\" || location.type === \"work\"\n ? toSentenceCase(location.type)\n : location.name;\n}\n\nexport function matchLatLon(location1: Location, location2: Location): boolean {\n if (!location1 || !location2) return location1 === location2;\n return location1.lat === location2.lat && location1.lon === location2.lon;\n}\n\ntype TransitivePlaceRaw = {\n place_id: string;\n};\nexport function isBikeshareStation(place: TransitivePlaceRaw): boolean {\n return place.place_id.lastIndexOf(\"bicycle_rent_station\") !== -1;\n}\n\nexport function isEScooterStation(place: TransitivePlaceRaw): boolean {\n return place.place_id.lastIndexOf(\"escooter_rent_station\") !== -1;\n}\n\nexport function isCarWalkTransition(place: TransitivePlaceRaw): boolean {\n return place.place_id.lastIndexOf(\"itin_car_\") !== -1;\n}\n\nexport function isValidLat(lat: number): boolean {\n return Number.isFinite(lat) && lat >= -90 && lat <= 90;\n}\n\nexport function isValidLng(lng: number): boolean {\n return Number.isFinite(lng) && lng >= -180 && lng <= 180;\n}\n\nexport function isValidLatLng(arr: LatLngArray): boolean {\n return (\n Array.isArray(arr) &&\n arr.length === 2 &&\n isValidLat(arr[0]) &&\n isValidLng(arr[1])\n );\n}\n"],"file":"map.js"}