| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 | 
							- import bearing from '@turf/bearing';
 
- import distance from '@turf/distance';
 
- import destination from '@turf/destination';
 
- import { isObject, lineString } from '@turf/helpers';
 
- /**
 
-  * Takes a {@link LineString|line}, a specified distance along the line to a start {@link Point},
 
-  * and a specified  distance along the line to a stop point
 
-  * and returns a subsection of the line in-between those points.
 
-  *
 
-  * This can be useful for extracting only the part of a route between two distances.
 
-  *
 
-  * @name lineSliceAlong
 
-  * @param {Feature<LineString>|LineString} line input line
 
-  * @param {number} startDist distance along the line to starting point
 
-  * @param {number} stopDist distance along the line to ending point
 
-  * @param {Object} [options={}] Optional parameters
 
-  * @param {string} [options.units='kilometers'] can be degrees, radians, miles, or kilometers
 
-  * @returns {Feature<LineString>} sliced line
 
-  * @example
 
-  * var line = turf.lineString([[7, 45], [9, 45], [14, 40], [14, 41]]);
 
-  * var start = 12.5;
 
-  * var stop = 25;
 
-  * var sliced = turf.lineSliceAlong(line, start, stop, {units: 'miles'});
 
-  *
 
-  * //addToMap
 
-  * var addToMap = [line, start, stop, sliced]
 
-  */
 
- function lineSliceAlong(line, startDist, stopDist, options) {
 
-   // Optional parameters
 
-   options = options || {};
 
-   if (!isObject(options)) throw new Error("options is invalid");
 
-   var coords;
 
-   var slice = [];
 
-   // Validation
 
-   if (line.type === "Feature") coords = line.geometry.coordinates;
 
-   else if (line.type === "LineString") coords = line.coordinates;
 
-   else throw new Error("input must be a LineString Feature or Geometry");
 
-   var origCoordsLength = coords.length;
 
-   var travelled = 0;
 
-   var overshot, direction, interpolated;
 
-   for (var i = 0; i < coords.length; i++) {
 
-     if (startDist >= travelled && i === coords.length - 1) break;
 
-     else if (travelled > startDist && slice.length === 0) {
 
-       overshot = startDist - travelled;
 
-       if (!overshot) {
 
-         slice.push(coords[i]);
 
-         return lineString(slice);
 
-       }
 
-       direction = bearing(coords[i], coords[i - 1]) - 180;
 
-       interpolated = destination(coords[i], overshot, direction, options);
 
-       slice.push(interpolated.geometry.coordinates);
 
-     }
 
-     if (travelled >= stopDist) {
 
-       overshot = stopDist - travelled;
 
-       if (!overshot) {
 
-         slice.push(coords[i]);
 
-         return lineString(slice);
 
-       }
 
-       direction = bearing(coords[i], coords[i - 1]) - 180;
 
-       interpolated = destination(coords[i], overshot, direction, options);
 
-       slice.push(interpolated.geometry.coordinates);
 
-       return lineString(slice);
 
-     }
 
-     if (travelled >= startDist) {
 
-       slice.push(coords[i]);
 
-     }
 
-     if (i === coords.length - 1) {
 
-       return lineString(slice);
 
-     }
 
-     travelled += distance(coords[i], coords[i + 1], options);
 
-   }
 
-   if (travelled < startDist && coords.length === origCoordsLength)
 
-     throw new Error("Start position is beyond line");
 
-   var last = coords[coords.length - 1];
 
-   return lineString([last, last]);
 
- }
 
- export default lineSliceAlong;
 
 
  |