| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133 | "use strict";var __importDefault = (this && this.__importDefault) || function (mod) {    return (mod && mod.__esModule) ? mod : { "default": mod };};Object.defineProperty(exports, "__esModule", { value: true });var geojson_rbush_1 = __importDefault(require("geojson-rbush"));var line_segment_1 = __importDefault(require("@turf/line-segment"));var nearest_point_on_line_1 = __importDefault(require("@turf/nearest-point-on-line"));var boolean_point_on_line_1 = __importDefault(require("@turf/boolean-point-on-line"));var invariant_1 = require("@turf/invariant");var meta_1 = require("@turf/meta");var helpers_1 = require("@turf/helpers");var deep_equal_1 = __importDefault(require("deep-equal"));/** * Takes any LineString or Polygon and returns the overlapping lines between both features. * * @name lineOverlap * @param {Geometry|Feature<LineString|MultiLineString|Polygon|MultiPolygon>} line1 any LineString or Polygon * @param {Geometry|Feature<LineString|MultiLineString|Polygon|MultiPolygon>} line2 any LineString or Polygon * @param {Object} [options={}] Optional parameters * @param {number} [options.tolerance=0] Tolerance distance to match overlapping line segments (in kilometers) * @returns {FeatureCollection<LineString>} lines(s) that are overlapping between both features * @example * var line1 = turf.lineString([[115, -35], [125, -30], [135, -30], [145, -35]]); * var line2 = turf.lineString([[115, -25], [125, -30], [135, -30], [145, -25]]); * * var overlapping = turf.lineOverlap(line1, line2); * * //addToMap * var addToMap = [line1, line2, overlapping] */function lineOverlap(line1, line2, options) {    if (options === void 0) { options = {}; }    // Optional parameters    options = options || {};    if (!helpers_1.isObject(options))        throw new Error("options is invalid");    var tolerance = options.tolerance || 0;    // Containers    var features = [];    // Create Spatial Index    var tree = geojson_rbush_1.default();    // To-Do -- HACK way to support typescript    var line = line_segment_1.default(line1);    tree.load(line);    var overlapSegment;    // Line Intersection    // Iterate over line segments    meta_1.segmentEach(line2, function (segment) {        var doesOverlaps = false;        if (!segment) {            return;        }        // Iterate over each segments which falls within the same bounds        meta_1.featureEach(tree.search(segment), function (match) {            if (doesOverlaps === false) {                var coordsSegment = invariant_1.getCoords(segment).sort();                var coordsMatch = invariant_1.getCoords(match).sort();                // Segment overlaps feature                if (deep_equal_1.default(coordsSegment, coordsMatch)) {                    doesOverlaps = true;                    // Overlaps already exists - only append last coordinate of segment                    if (overlapSegment)                        overlapSegment = concatSegment(overlapSegment, segment);                    else                        overlapSegment = segment;                    // Match segments which don't share nodes (Issue #901)                }                else if (tolerance === 0                    ? boolean_point_on_line_1.default(coordsSegment[0], match) &&                        boolean_point_on_line_1.default(coordsSegment[1], match)                    : nearest_point_on_line_1.default(match, coordsSegment[0]).properties.dist <=                        tolerance &&                        nearest_point_on_line_1.default(match, coordsSegment[1]).properties.dist <=                            tolerance) {                    doesOverlaps = true;                    if (overlapSegment)                        overlapSegment = concatSegment(overlapSegment, segment);                    else                        overlapSegment = segment;                }                else if (tolerance === 0                    ? boolean_point_on_line_1.default(coordsMatch[0], segment) &&                        boolean_point_on_line_1.default(coordsMatch[1], segment)                    : nearest_point_on_line_1.default(segment, coordsMatch[0]).properties.dist <=                        tolerance &&                        nearest_point_on_line_1.default(segment, coordsMatch[1]).properties.dist <=                            tolerance) {                    // Do not define (doesOverlap = true) since more matches can occur within the same segment                    // doesOverlaps = true;                    if (overlapSegment)                        overlapSegment = concatSegment(overlapSegment, match);                    else                        overlapSegment = match;                }            }        });        // Segment doesn't overlap - add overlaps to results & reset        if (doesOverlaps === false && overlapSegment) {            features.push(overlapSegment);            overlapSegment = undefined;        }    });    // Add last segment if exists    if (overlapSegment)        features.push(overlapSegment);    return helpers_1.featureCollection(features);}/** * Concat Segment * * @private * @param {Feature<LineString>} line LineString * @param {Feature<LineString>} segment 2-vertex LineString * @returns {Feature<LineString>} concat linestring */function concatSegment(line, segment) {    var coords = invariant_1.getCoords(segment);    var lineCoords = invariant_1.getCoords(line);    var start = lineCoords[0];    var end = lineCoords[lineCoords.length - 1];    var geom = line.geometry.coordinates;    if (deep_equal_1.default(coords[0], start))        geom.unshift(coords[1]);    else if (deep_equal_1.default(coords[0], end))        geom.push(coords[1]);    else if (deep_equal_1.default(coords[1], start))        geom.unshift(coords[0]);    else if (deep_equal_1.default(coords[1], end))        geom.push(coords[0]);    return line;}exports.default = lineOverlap;
 |