index.js 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. 'use strict';
  2. var bearing = require('@turf/bearing');
  3. var distance = require('@turf/distance');
  4. var destination = require('@turf/destination');
  5. var helpers = require('@turf/helpers');
  6. function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
  7. var bearing__default = /*#__PURE__*/_interopDefaultLegacy(bearing);
  8. var distance__default = /*#__PURE__*/_interopDefaultLegacy(distance);
  9. var destination__default = /*#__PURE__*/_interopDefaultLegacy(destination);
  10. /**
  11. * Takes a {@link LineString|line}, a specified distance along the line to a start {@link Point},
  12. * and a specified distance along the line to a stop point
  13. * and returns a subsection of the line in-between those points.
  14. *
  15. * This can be useful for extracting only the part of a route between two distances.
  16. *
  17. * @name lineSliceAlong
  18. * @param {Feature<LineString>|LineString} line input line
  19. * @param {number} startDist distance along the line to starting point
  20. * @param {number} stopDist distance along the line to ending point
  21. * @param {Object} [options={}] Optional parameters
  22. * @param {string} [options.units='kilometers'] can be degrees, radians, miles, or kilometers
  23. * @returns {Feature<LineString>} sliced line
  24. * @example
  25. * var line = turf.lineString([[7, 45], [9, 45], [14, 40], [14, 41]]);
  26. * var start = 12.5;
  27. * var stop = 25;
  28. * var sliced = turf.lineSliceAlong(line, start, stop, {units: 'miles'});
  29. *
  30. * //addToMap
  31. * var addToMap = [line, start, stop, sliced]
  32. */
  33. function lineSliceAlong(line, startDist, stopDist, options) {
  34. // Optional parameters
  35. options = options || {};
  36. if (!helpers.isObject(options)) throw new Error("options is invalid");
  37. var coords;
  38. var slice = [];
  39. // Validation
  40. if (line.type === "Feature") coords = line.geometry.coordinates;
  41. else if (line.type === "LineString") coords = line.coordinates;
  42. else throw new Error("input must be a LineString Feature or Geometry");
  43. var origCoordsLength = coords.length;
  44. var travelled = 0;
  45. var overshot, direction, interpolated;
  46. for (var i = 0; i < coords.length; i++) {
  47. if (startDist >= travelled && i === coords.length - 1) break;
  48. else if (travelled > startDist && slice.length === 0) {
  49. overshot = startDist - travelled;
  50. if (!overshot) {
  51. slice.push(coords[i]);
  52. return helpers.lineString(slice);
  53. }
  54. direction = bearing__default['default'](coords[i], coords[i - 1]) - 180;
  55. interpolated = destination__default['default'](coords[i], overshot, direction, options);
  56. slice.push(interpolated.geometry.coordinates);
  57. }
  58. if (travelled >= stopDist) {
  59. overshot = stopDist - travelled;
  60. if (!overshot) {
  61. slice.push(coords[i]);
  62. return helpers.lineString(slice);
  63. }
  64. direction = bearing__default['default'](coords[i], coords[i - 1]) - 180;
  65. interpolated = destination__default['default'](coords[i], overshot, direction, options);
  66. slice.push(interpolated.geometry.coordinates);
  67. return helpers.lineString(slice);
  68. }
  69. if (travelled >= startDist) {
  70. slice.push(coords[i]);
  71. }
  72. if (i === coords.length - 1) {
  73. return helpers.lineString(slice);
  74. }
  75. travelled += distance__default['default'](coords[i], coords[i + 1], options);
  76. }
  77. if (travelled < startDist && coords.length === origCoordsLength)
  78. throw new Error("Start position is beyond line");
  79. var last = coords[coords.length - 1];
  80. return helpers.lineString([last, last]);
  81. }
  82. module.exports = lineSliceAlong;
  83. module.exports.default = lineSliceAlong;