@spatial/along
Version:
turf along module
63 lines (55 loc) • 2.48 kB
JavaScript
;
var bearing = require('@spatial/bearing');
var destination = require('@spatial/destination');
var measureDistance = require('@spatial/distance');
var helpers = require('@spatial/helpers');
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
var bearing__default = /*#__PURE__*/_interopDefaultLegacy(bearing);
var destination__default = /*#__PURE__*/_interopDefaultLegacy(destination);
var measureDistance__default = /*#__PURE__*/_interopDefaultLegacy(measureDistance);
/**
* Takes a {@link LineString} and returns a {@link Point} at a specified distance along the line.
*
* @name along
* @param {Feature<LineString>} line input line
* @param {number} distance distance along the line
* @param {Object} [options] Optional parameters
* @param {string} [options.units="kilometers"] can be degrees, radians, miles, or kilometers
* @returns {Feature<Point>} Point `distance` `units` along the line
* @example
* var line = turf.lineString([[-83, 30], [-84, 36], [-78, 41]]);
* var options = {units: 'miles'};
*
* var along = turf.along(line, 200, options);
*
* //addToMap
* var addToMap = [along, line]
*/
function along(line, distance, options) {
// Optional parameters
options = options || {};
if (!helpers.isObject(options)) throw new Error('options is invalid');
// Validation
let coords;
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 (!helpers.isNumber(distance)) throw new Error('distance must be a number');
let travelled = 0;
for (let i = 0; i < coords.length; i++) {
if (distance >= travelled && i === coords.length - 1) break;
else if (travelled >= distance) {
const overshot = distance - travelled;
if (!overshot) return helpers.point(coords[i]);
else {
const direction = bearing__default['default'](coords[i], coords[i - 1]) - 180;
const interpolated = destination__default['default'](coords[i], overshot, direction, options);
return interpolated;
}
} else {
travelled += measureDistance__default['default'](coords[i], coords[i + 1], options);
}
}
return helpers.point(coords[coords.length - 1]);
}
module.exports = along;