"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var helpers_1 = require("@turf/helpers"); var invariant_1 = require("@turf/invariant"); var meta_1 = require("@turf/meta"); /** * Creates a {@link FeatureCollection} of 2-vertex {@link LineString} segments from a * {@link LineString|(Multi)LineString} or {@link Polygon|(Multi)Polygon}. * * @name lineSegment * @param {GeoJSON} geojson GeoJSON Polygon or LineString * @returns {FeatureCollection} 2-vertex line segments * @example * var polygon = turf.polygon([[[-50, 5], [-40, -10], [-50, -10], [-40, 5], [-50, 5]]]); * var segments = turf.lineSegment(polygon); * * //addToMap * var addToMap = [polygon, segments] */ function lineSegment(geojson) { if (!geojson) { throw new Error("geojson is required"); } var results = []; meta_1.flattenEach(geojson, function (feature) { lineSegmentFeature(feature, results); }); return helpers_1.featureCollection(results); } /** * Line Segment * * @private * @param {Feature} geojson Line or polygon feature * @param {Array} results push to results * @returns {void} */ function lineSegmentFeature(geojson, results) { var coords = []; var geometry = geojson.geometry; if (geometry !== null) { switch (geometry.type) { case "Polygon": coords = invariant_1.getCoords(geometry); break; case "LineString": coords = [invariant_1.getCoords(geometry)]; } coords.forEach(function (coord) { var segments = createSegments(coord, geojson.properties); segments.forEach(function (segment) { segment.id = results.length; results.push(segment); }); }); } } /** * Create Segments from LineString coordinates * * @private * @param {Array>} coords LineString coordinates * @param {*} properties GeoJSON properties * @returns {Array>} line segments */ function createSegments(coords, properties) { var segments = []; coords.reduce(function (previousCoords, currentCoords) { var segment = helpers_1.lineString([previousCoords, currentCoords], properties); segment.bbox = bbox(previousCoords, currentCoords); segments.push(segment); return currentCoords; }); return segments; } /** * Create BBox between two coordinates (faster than @turf/bbox) * * @private * @param {Array} coords1 Point coordinate * @param {Array} coords2 Point coordinate * @returns {BBox} [west, south, east, north] */ function bbox(coords1, coords2) { var x1 = coords1[0]; var y1 = coords1[1]; var x2 = coords2[0]; var y2 = coords2[1]; var west = x1 < x2 ? x1 : x2; var south = y1 < y2 ? y1 : y2; var east = x1 > x2 ? x1 : x2; var north = y1 > y2 ? y1 : y2; return [west, south, east, north]; } exports.default = lineSegment;