1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 |
- 'use strict';
- var length = require('@turf/length');
- var lineSliceAlong = require('@turf/line-slice-along');
- var meta = require('@turf/meta');
- var helpers = require('@turf/helpers');
- function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
- var length__default = /*#__PURE__*/_interopDefaultLegacy(length);
- var lineSliceAlong__default = /*#__PURE__*/_interopDefaultLegacy(lineSliceAlong);
- /**
- * Divides a {@link LineString} into chunks of a specified length.
- * If the line is shorter than the segment length then the original line is returned.
- *
- * @name lineChunk
- * @param {FeatureCollection|Geometry|Feature<LineString|MultiLineString>} geojson the lines to split
- * @param {number} segmentLength how long to make each segment
- * @param {Object} [options={}] Optional parameters
- * @param {string} [options.units='kilometers'] units can be degrees, radians, miles, or kilometers
- * @param {boolean} [options.reverse=false] reverses coordinates to start the first chunked segment at the end
- * @returns {FeatureCollection<LineString>} collection of line segments
- * @example
- * var line = turf.lineString([[-95, 40], [-93, 45], [-85, 50]]);
- *
- * var chunk = turf.lineChunk(line, 15, {units: 'miles'});
- *
- * //addToMap
- * var addToMap = [chunk];
- */
- function lineChunk(geojson, segmentLength, options) {
- // Optional parameters
- options = options || {};
- if (!helpers.isObject(options)) throw new Error("options is invalid");
- var units = options.units;
- var reverse = options.reverse;
- // Validation
- if (!geojson) throw new Error("geojson is required");
- if (segmentLength <= 0)
- throw new Error("segmentLength must be greater than 0");
- // Container
- var results = [];
- // Flatten each feature to simple LineString
- meta.flattenEach(geojson, function (feature) {
- // reverses coordinates to start the first chunked segment at the end
- if (reverse)
- feature.geometry.coordinates = feature.geometry.coordinates.reverse();
- sliceLineSegments(feature, segmentLength, units, function (segment) {
- results.push(segment);
- });
- });
- return helpers.featureCollection(results);
- }
- /**
- * Slice Line Segments
- *
- * @private
- * @param {Feature<LineString>} line GeoJSON LineString
- * @param {number} segmentLength how long to make each segment
- * @param {string}[units='kilometers'] units can be degrees, radians, miles, or kilometers
- * @param {Function} callback iterate over sliced line segments
- * @returns {void}
- */
- function sliceLineSegments(line, segmentLength, units, callback) {
- var lineLength = length__default['default'](line, { units: units });
- // If the line is shorter than the segment length then the orginal line is returned.
- if (lineLength <= segmentLength) return callback(line);
- var numberOfSegments = lineLength / segmentLength;
- // If numberOfSegments is integer, no need to plus 1
- if (!Number.isInteger(numberOfSegments)) {
- numberOfSegments = Math.floor(numberOfSegments) + 1;
- }
- for (var i = 0; i < numberOfSegments; i++) {
- var outline = lineSliceAlong__default['default'](
- line,
- segmentLength * i,
- segmentLength * (i + 1),
- { units: units }
- );
- callback(outline, i);
- }
- }
- module.exports = lineChunk;
- module.exports.default = lineChunk;
|