@turf/line-slice-along
Advanced tools
+82
| 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 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); | ||
| } | ||
| return lineString(coords[coords.length - 1]); | ||
| } | ||
| export default lineSliceAlong; |
+5
-5
@@ -36,3 +36,3 @@ 'use strict'; | ||
| options = options || {}; | ||
| if (!helpers.isObject(options)) { throw new Error('options is invalid'); } | ||
| if (!helpers.isObject(options)) throw new Error('options is invalid'); | ||
@@ -43,5 +43,5 @@ var coords; | ||
| // 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'); } | ||
| 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'); | ||
@@ -51,3 +51,3 @@ var travelled = 0; | ||
| for (var i = 0; i < coords.length; i++) { | ||
| if (startDist >= travelled && i === coords.length - 1) { break; } | ||
| if (startDist >= travelled && i === coords.length - 1) break; | ||
| else if (travelled > startDist && slice.length === 0) { | ||
@@ -54,0 +54,0 @@ overshot = startDist - travelled; |
+9
-9
| { | ||
| "name": "@turf/line-slice-along", | ||
| "version": "5.1.0", | ||
| "version": "5.1.5", | ||
| "description": "turf line-slice-along module", | ||
| "main": "main.js", | ||
| "module": "main.mjs", | ||
| "module": "main.es.js", | ||
| "types": "index.d.ts", | ||
@@ -12,3 +12,3 @@ "files": [ | ||
| "main.js", | ||
| "main.mjs" | ||
| "main.es.js" | ||
| ], | ||
@@ -18,2 +18,3 @@ "scripts": { | ||
| "test": "node -r @std/esm test.js", | ||
| "posttest": "node -r @std/esm ../../scripts/validate-es5-dependencies.js", | ||
| "bench": "node -r @std/esm bench.js", | ||
@@ -39,14 +40,13 @@ "docs": "node ../../scripts/generate-readmes" | ||
| "@std/esm": "*", | ||
| "@turf/along": "^5.1.0", | ||
| "@turf/along": "^5.1.5", | ||
| "benchmark": "*", | ||
| "load-json-file": "*", | ||
| "rollup": "*", | ||
| "rollup-plugin-buble": "*", | ||
| "tape": "*" | ||
| }, | ||
| "dependencies": { | ||
| "@turf/bearing": "^5.1.0", | ||
| "@turf/destination": "^5.1.0", | ||
| "@turf/distance": "^5.1.0", | ||
| "@turf/helpers": "^5.1.0" | ||
| "@turf/bearing": "^5.1.5", | ||
| "@turf/destination": "^5.1.5", | ||
| "@turf/distance": "^5.1.5", | ||
| "@turf/helpers": "^5.1.5" | ||
| }, | ||
@@ -53,0 +53,0 @@ "@std/esm": { |
-82
| 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 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); | ||
| } | ||
| return lineString(coords[coords.length - 1]); | ||
| } | ||
| export default lineSliceAlong; |
14510
0.21%6
-14.29%Updated
Updated
Updated
Updated