import { lineStringLength } from "./chunk-JFXZSSOM.js"; import { assignClosestPoint, douglasPeucker, inflateCoordinates, maxSquaredDelta } from "./chunk-NLIGXLAR.js"; import { forEach, intersectsLineString } from "./chunk-YUSNUQO6.js"; import { SimpleGeometry_default, deflateCoordinates } from "./chunk-YUTQGDGI.js"; import { lerp } from "./chunk-54BTDBAD.js"; import { closestSquaredDistanceXY } from "./chunk-CKDBVGKM.js"; import { binarySearch, extend } from "./chunk-FQY6EMA7.js"; // node_modules/ol/geom/flat/interpolate.js function interpolatePoint(flatCoordinates, offset, end, stride, fraction, dest, dimension) { let o, t; const n = (end - offset) / stride; if (n === 1) { o = offset; } else if (n === 2) { o = offset; t = fraction; } else if (n !== 0) { let x1 = flatCoordinates[offset]; let y1 = flatCoordinates[offset + 1]; let length = 0; const cumulativeLengths = [0]; for (let i = offset + stride; i < end; i += stride) { const x2 = flatCoordinates[i]; const y2 = flatCoordinates[i + 1]; length += Math.sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1)); cumulativeLengths.push(length); x1 = x2; y1 = y2; } const target = fraction * length; const index = binarySearch(cumulativeLengths, target); if (index < 0) { t = (target - cumulativeLengths[-index - 2]) / (cumulativeLengths[-index - 1] - cumulativeLengths[-index - 2]); o = offset + (-index - 2) * stride; } else { o = offset + index * stride; } } dimension = dimension > 1 ? dimension : 2; dest = dest ? dest : new Array(dimension); for (let i = 0; i < dimension; ++i) { dest[i] = o === void 0 ? NaN : t === void 0 ? flatCoordinates[o + i] : lerp(flatCoordinates[o + i], flatCoordinates[o + stride + i], t); } return dest; } function lineStringCoordinateAtM(flatCoordinates, offset, end, stride, m, extrapolate) { if (end == offset) { return null; } let coordinate; if (m < flatCoordinates[offset + stride - 1]) { if (extrapolate) { coordinate = flatCoordinates.slice(offset, offset + stride); coordinate[stride - 1] = m; return coordinate; } return null; } if (flatCoordinates[end - 1] < m) { if (extrapolate) { coordinate = flatCoordinates.slice(end - stride, end); coordinate[stride - 1] = m; return coordinate; } return null; } if (m == flatCoordinates[offset + stride - 1]) { return flatCoordinates.slice(offset, offset + stride); } let lo = offset / stride; let hi = end / stride; while (lo < hi) { const mid = lo + hi >> 1; if (m < flatCoordinates[(mid + 1) * stride - 1]) { hi = mid; } else { lo = mid + 1; } } const m0 = flatCoordinates[lo * stride - 1]; if (m == m0) { return flatCoordinates.slice((lo - 1) * stride, (lo - 1) * stride + stride); } const m1 = flatCoordinates[(lo + 1) * stride - 1]; const t = (m - m0) / (m1 - m0); coordinate = []; for (let i = 0; i < stride - 1; ++i) { coordinate.push( lerp( flatCoordinates[(lo - 1) * stride + i], flatCoordinates[lo * stride + i], t ) ); } coordinate.push(m); return coordinate; } function lineStringsCoordinateAtM(flatCoordinates, offset, ends, stride, m, extrapolate, interpolate) { if (interpolate) { return lineStringCoordinateAtM( flatCoordinates, offset, ends[ends.length - 1], stride, m, extrapolate ); } let coordinate; if (m < flatCoordinates[stride - 1]) { if (extrapolate) { coordinate = flatCoordinates.slice(0, stride); coordinate[stride - 1] = m; return coordinate; } return null; } if (flatCoordinates[flatCoordinates.length - 1] < m) { if (extrapolate) { coordinate = flatCoordinates.slice(flatCoordinates.length - stride); coordinate[stride - 1] = m; return coordinate; } return null; } for (let i = 0, ii = ends.length; i < ii; ++i) { const end = ends[i]; if (offset == end) { continue; } if (m < flatCoordinates[offset + stride - 1]) { return null; } if (m <= flatCoordinates[end - 1]) { return lineStringCoordinateAtM( flatCoordinates, offset, end, stride, m, false ); } offset = end; } return null; } // node_modules/ol/geom/LineString.js var LineString = class _LineString extends SimpleGeometry_default { /** * @param {Array|Array} coordinates Coordinates. * For internal use, flat coordinates in combination with `layout` are also accepted. * @param {import("./Geometry.js").GeometryLayout} [layout] Layout. */ constructor(coordinates, layout) { super(); this.flatMidpoint_ = null; this.flatMidpointRevision_ = -1; this.maxDelta_ = -1; this.maxDeltaRevision_ = -1; if (layout !== void 0 && !Array.isArray(coordinates[0])) { this.setFlatCoordinates( layout, /** @type {Array} */ coordinates ); } else { this.setCoordinates( /** @type {Array} */ coordinates, layout ); } } /** * Append the passed coordinate to the coordinates of the linestring. * @param {import("../coordinate.js").Coordinate} coordinate Coordinate. * @api */ appendCoordinate(coordinate) { extend(this.flatCoordinates, coordinate); this.changed(); } /** * Make a complete copy of the geometry. * @return {!LineString} Clone. * @api * @override */ clone() { const lineString = new _LineString( this.flatCoordinates.slice(), this.layout ); lineString.applyProperties(this); return lineString; } /** * @param {number} x X. * @param {number} y Y. * @param {import("../coordinate.js").Coordinate} closestPoint Closest point. * @param {number} minSquaredDistance Minimum squared distance. * @return {number} Minimum squared distance. * @override */ closestPointXY(x, y, closestPoint, minSquaredDistance) { if (minSquaredDistance < closestSquaredDistanceXY(this.getExtent(), x, y)) { return minSquaredDistance; } if (this.maxDeltaRevision_ != this.getRevision()) { this.maxDelta_ = Math.sqrt( maxSquaredDelta( this.flatCoordinates, 0, this.flatCoordinates.length, this.stride, 0 ) ); this.maxDeltaRevision_ = this.getRevision(); } return assignClosestPoint( this.flatCoordinates, 0, this.flatCoordinates.length, this.stride, this.maxDelta_, false, x, y, closestPoint, minSquaredDistance ); } /** * Iterate over each segment, calling the provided callback. * If the callback returns a truthy value the function returns that * value immediately. Otherwise the function returns `false`. * * @param {function(this: S, import("../coordinate.js").Coordinate, import("../coordinate.js").Coordinate): T} callback Function * called for each segment. The function will receive two arguments, the start and end coordinates of the segment. * @return {T|boolean} Value. * @template T,S * @api */ forEachSegment(callback) { return forEach( this.flatCoordinates, 0, this.flatCoordinates.length, this.stride, callback ); } /** * Returns the coordinate at `m` using linear interpolation, or `null` if no * such coordinate exists. * * `extrapolate` controls extrapolation beyond the range of Ms in the * MultiLineString. If `extrapolate` is `true` then Ms less than the first * M will return the first coordinate and Ms greater than the last M will * return the last coordinate. * * @param {number} m M. * @param {boolean} [extrapolate] Extrapolate. Default is `false`. * @return {import("../coordinate.js").Coordinate|null} Coordinate. * @api */ getCoordinateAtM(m, extrapolate) { if (this.layout != "XYM" && this.layout != "XYZM") { return null; } extrapolate = extrapolate !== void 0 ? extrapolate : false; return lineStringCoordinateAtM( this.flatCoordinates, 0, this.flatCoordinates.length, this.stride, m, extrapolate ); } /** * Return the coordinates of the linestring. * @return {Array} Coordinates. * @api * @override */ getCoordinates() { return inflateCoordinates( this.flatCoordinates, 0, this.flatCoordinates.length, this.stride ); } /** * Return the coordinate at the provided fraction along the linestring. * The `fraction` is a number between 0 and 1, where 0 is the start of the * linestring and 1 is the end. * @param {number} fraction Fraction. * @param {import("../coordinate.js").Coordinate} [dest] Optional coordinate whose values will * be modified. If not provided, a new coordinate will be returned. * @return {import("../coordinate.js").Coordinate} Coordinate of the interpolated point. * @api */ getCoordinateAt(fraction, dest) { return interpolatePoint( this.flatCoordinates, 0, this.flatCoordinates.length, this.stride, fraction, dest, this.stride ); } /** * Return the length of the linestring on projected plane. * @return {number} Length (on projected plane). * @api */ getLength() { return lineStringLength( this.flatCoordinates, 0, this.flatCoordinates.length, this.stride ); } /** * @return {Array} Flat midpoint. */ getFlatMidpoint() { if (this.flatMidpointRevision_ != this.getRevision()) { this.flatMidpoint_ = this.getCoordinateAt( 0.5, this.flatMidpoint_ ?? void 0 ); this.flatMidpointRevision_ = this.getRevision(); } return ( /** @type {Array} */ this.flatMidpoint_ ); } /** * @param {number} squaredTolerance Squared tolerance. * @return {LineString} Simplified LineString. * @protected * @override */ getSimplifiedGeometryInternal(squaredTolerance) { const simplifiedFlatCoordinates = []; simplifiedFlatCoordinates.length = douglasPeucker( this.flatCoordinates, 0, this.flatCoordinates.length, this.stride, squaredTolerance, simplifiedFlatCoordinates, 0 ); return new _LineString(simplifiedFlatCoordinates, "XY"); } /** * Get the type of this geometry. * @return {import("./Geometry.js").Type} Geometry type. * @api * @override */ getType() { return "LineString"; } /** * Test if the geometry and the passed extent intersect. * @param {import("../extent.js").Extent} extent Extent. * @return {boolean} `true` if the geometry and the extent intersect. * @api * @override */ intersectsExtent(extent) { return intersectsLineString( this.flatCoordinates, 0, this.flatCoordinates.length, this.stride, extent, this.getExtent() ); } /** * Set the coordinates of the linestring. * @param {!Array} coordinates Coordinates. * @param {import("./Geometry.js").GeometryLayout} [layout] Layout. * @api * @override */ setCoordinates(coordinates, layout) { this.setLayout(layout, coordinates, 1); if (!this.flatCoordinates) { this.flatCoordinates = []; } this.flatCoordinates.length = deflateCoordinates( this.flatCoordinates, 0, coordinates, this.stride ); this.changed(); } }; var LineString_default = LineString; export { interpolatePoint, lineStringsCoordinateAtM, LineString_default }; //# sourceMappingURL=chunk-CXIHWQDX.js.map