398 lines
11 KiB
JavaScript
398 lines
11 KiB
JavaScript
|
|
import {
|
||
|
|
lerp,
|
||
|
|
squaredDistance,
|
||
|
|
squaredSegmentDistance
|
||
|
|
} from "./chunk-54BTDBAD.js";
|
||
|
|
|
||
|
|
// node_modules/ol/geom/flat/closest.js
|
||
|
|
function assignClosest(flatCoordinates, offset1, offset2, stride, x, y, closestPoint) {
|
||
|
|
const x1 = flatCoordinates[offset1];
|
||
|
|
const y1 = flatCoordinates[offset1 + 1];
|
||
|
|
const dx = flatCoordinates[offset2] - x1;
|
||
|
|
const dy = flatCoordinates[offset2 + 1] - y1;
|
||
|
|
let offset;
|
||
|
|
if (dx === 0 && dy === 0) {
|
||
|
|
offset = offset1;
|
||
|
|
} else {
|
||
|
|
const t = ((x - x1) * dx + (y - y1) * dy) / (dx * dx + dy * dy);
|
||
|
|
if (t > 1) {
|
||
|
|
offset = offset2;
|
||
|
|
} else if (t > 0) {
|
||
|
|
for (let i = 0; i < stride; ++i) {
|
||
|
|
closestPoint[i] = lerp(
|
||
|
|
flatCoordinates[offset1 + i],
|
||
|
|
flatCoordinates[offset2 + i],
|
||
|
|
t
|
||
|
|
);
|
||
|
|
}
|
||
|
|
closestPoint.length = stride;
|
||
|
|
return;
|
||
|
|
} else {
|
||
|
|
offset = offset1;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
for (let i = 0; i < stride; ++i) {
|
||
|
|
closestPoint[i] = flatCoordinates[offset + i];
|
||
|
|
}
|
||
|
|
closestPoint.length = stride;
|
||
|
|
}
|
||
|
|
function maxSquaredDelta(flatCoordinates, offset, end, stride, max) {
|
||
|
|
let x1 = flatCoordinates[offset];
|
||
|
|
let y1 = flatCoordinates[offset + 1];
|
||
|
|
for (offset += stride; offset < end; offset += stride) {
|
||
|
|
const x2 = flatCoordinates[offset];
|
||
|
|
const y2 = flatCoordinates[offset + 1];
|
||
|
|
const squaredDelta = squaredDistance(x1, y1, x2, y2);
|
||
|
|
if (squaredDelta > max) {
|
||
|
|
max = squaredDelta;
|
||
|
|
}
|
||
|
|
x1 = x2;
|
||
|
|
y1 = y2;
|
||
|
|
}
|
||
|
|
return max;
|
||
|
|
}
|
||
|
|
function arrayMaxSquaredDelta(flatCoordinates, offset, ends, stride, max) {
|
||
|
|
for (let i = 0, ii = ends.length; i < ii; ++i) {
|
||
|
|
const end = ends[i];
|
||
|
|
max = maxSquaredDelta(flatCoordinates, offset, end, stride, max);
|
||
|
|
offset = end;
|
||
|
|
}
|
||
|
|
return max;
|
||
|
|
}
|
||
|
|
function multiArrayMaxSquaredDelta(flatCoordinates, offset, endss, stride, max) {
|
||
|
|
for (let i = 0, ii = endss.length; i < ii; ++i) {
|
||
|
|
const ends = endss[i];
|
||
|
|
max = arrayMaxSquaredDelta(flatCoordinates, offset, ends, stride, max);
|
||
|
|
offset = ends[ends.length - 1];
|
||
|
|
}
|
||
|
|
return max;
|
||
|
|
}
|
||
|
|
function assignClosestPoint(flatCoordinates, offset, end, stride, maxDelta, isRing, x, y, closestPoint, minSquaredDistance, tmpPoint) {
|
||
|
|
if (offset == end) {
|
||
|
|
return minSquaredDistance;
|
||
|
|
}
|
||
|
|
let i, squaredDistance2;
|
||
|
|
if (maxDelta === 0) {
|
||
|
|
squaredDistance2 = squaredDistance(
|
||
|
|
x,
|
||
|
|
y,
|
||
|
|
flatCoordinates[offset],
|
||
|
|
flatCoordinates[offset + 1]
|
||
|
|
);
|
||
|
|
if (squaredDistance2 < minSquaredDistance) {
|
||
|
|
for (i = 0; i < stride; ++i) {
|
||
|
|
closestPoint[i] = flatCoordinates[offset + i];
|
||
|
|
}
|
||
|
|
closestPoint.length = stride;
|
||
|
|
return squaredDistance2;
|
||
|
|
}
|
||
|
|
return minSquaredDistance;
|
||
|
|
}
|
||
|
|
tmpPoint = tmpPoint ? tmpPoint : [NaN, NaN];
|
||
|
|
let index = offset + stride;
|
||
|
|
while (index < end) {
|
||
|
|
assignClosest(
|
||
|
|
flatCoordinates,
|
||
|
|
index - stride,
|
||
|
|
index,
|
||
|
|
stride,
|
||
|
|
x,
|
||
|
|
y,
|
||
|
|
tmpPoint
|
||
|
|
);
|
||
|
|
squaredDistance2 = squaredDistance(x, y, tmpPoint[0], tmpPoint[1]);
|
||
|
|
if (squaredDistance2 < minSquaredDistance) {
|
||
|
|
minSquaredDistance = squaredDistance2;
|
||
|
|
for (i = 0; i < stride; ++i) {
|
||
|
|
closestPoint[i] = tmpPoint[i];
|
||
|
|
}
|
||
|
|
closestPoint.length = stride;
|
||
|
|
index += stride;
|
||
|
|
} else {
|
||
|
|
index += stride * Math.max(
|
||
|
|
(Math.sqrt(squaredDistance2) - Math.sqrt(minSquaredDistance)) / maxDelta | 0,
|
||
|
|
1
|
||
|
|
);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
if (isRing) {
|
||
|
|
assignClosest(
|
||
|
|
flatCoordinates,
|
||
|
|
end - stride,
|
||
|
|
offset,
|
||
|
|
stride,
|
||
|
|
x,
|
||
|
|
y,
|
||
|
|
tmpPoint
|
||
|
|
);
|
||
|
|
squaredDistance2 = squaredDistance(x, y, tmpPoint[0], tmpPoint[1]);
|
||
|
|
if (squaredDistance2 < minSquaredDistance) {
|
||
|
|
minSquaredDistance = squaredDistance2;
|
||
|
|
for (i = 0; i < stride; ++i) {
|
||
|
|
closestPoint[i] = tmpPoint[i];
|
||
|
|
}
|
||
|
|
closestPoint.length = stride;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return minSquaredDistance;
|
||
|
|
}
|
||
|
|
function assignClosestArrayPoint(flatCoordinates, offset, ends, stride, maxDelta, isRing, x, y, closestPoint, minSquaredDistance, tmpPoint) {
|
||
|
|
tmpPoint = tmpPoint ? tmpPoint : [NaN, NaN];
|
||
|
|
for (let i = 0, ii = ends.length; i < ii; ++i) {
|
||
|
|
const end = ends[i];
|
||
|
|
minSquaredDistance = assignClosestPoint(
|
||
|
|
flatCoordinates,
|
||
|
|
offset,
|
||
|
|
end,
|
||
|
|
stride,
|
||
|
|
maxDelta,
|
||
|
|
isRing,
|
||
|
|
x,
|
||
|
|
y,
|
||
|
|
closestPoint,
|
||
|
|
minSquaredDistance,
|
||
|
|
tmpPoint
|
||
|
|
);
|
||
|
|
offset = end;
|
||
|
|
}
|
||
|
|
return minSquaredDistance;
|
||
|
|
}
|
||
|
|
function assignClosestMultiArrayPoint(flatCoordinates, offset, endss, stride, maxDelta, isRing, x, y, closestPoint, minSquaredDistance, tmpPoint) {
|
||
|
|
tmpPoint = tmpPoint ? tmpPoint : [NaN, NaN];
|
||
|
|
for (let i = 0, ii = endss.length; i < ii; ++i) {
|
||
|
|
const ends = endss[i];
|
||
|
|
minSquaredDistance = assignClosestArrayPoint(
|
||
|
|
flatCoordinates,
|
||
|
|
offset,
|
||
|
|
ends,
|
||
|
|
stride,
|
||
|
|
maxDelta,
|
||
|
|
isRing,
|
||
|
|
x,
|
||
|
|
y,
|
||
|
|
closestPoint,
|
||
|
|
minSquaredDistance,
|
||
|
|
tmpPoint
|
||
|
|
);
|
||
|
|
offset = ends[ends.length - 1];
|
||
|
|
}
|
||
|
|
return minSquaredDistance;
|
||
|
|
}
|
||
|
|
|
||
|
|
// node_modules/ol/geom/flat/inflate.js
|
||
|
|
function inflateCoordinates(flatCoordinates, offset, end, stride, coordinates) {
|
||
|
|
coordinates = coordinates !== void 0 ? coordinates : [];
|
||
|
|
let i = 0;
|
||
|
|
for (let j = offset; j < end; j += stride) {
|
||
|
|
coordinates[i++] = flatCoordinates.slice(j, j + stride);
|
||
|
|
}
|
||
|
|
coordinates.length = i;
|
||
|
|
return coordinates;
|
||
|
|
}
|
||
|
|
function inflateCoordinatesArray(flatCoordinates, offset, ends, stride, coordinatess) {
|
||
|
|
coordinatess = coordinatess !== void 0 ? coordinatess : [];
|
||
|
|
let i = 0;
|
||
|
|
for (let j = 0, jj = ends.length; j < jj; ++j) {
|
||
|
|
const end = ends[j];
|
||
|
|
coordinatess[i++] = inflateCoordinates(
|
||
|
|
flatCoordinates,
|
||
|
|
offset,
|
||
|
|
end,
|
||
|
|
stride,
|
||
|
|
coordinatess[i]
|
||
|
|
);
|
||
|
|
offset = end;
|
||
|
|
}
|
||
|
|
coordinatess.length = i;
|
||
|
|
return coordinatess;
|
||
|
|
}
|
||
|
|
function inflateMultiCoordinatesArray(flatCoordinates, offset, endss, stride, coordinatesss) {
|
||
|
|
coordinatesss = coordinatesss !== void 0 ? coordinatesss : [];
|
||
|
|
let i = 0;
|
||
|
|
for (let j = 0, jj = endss.length; j < jj; ++j) {
|
||
|
|
const ends = endss[j];
|
||
|
|
coordinatesss[i++] = ends.length === 1 && ends[0] === offset ? [] : inflateCoordinatesArray(
|
||
|
|
flatCoordinates,
|
||
|
|
offset,
|
||
|
|
ends,
|
||
|
|
stride,
|
||
|
|
coordinatesss[i]
|
||
|
|
);
|
||
|
|
offset = ends[ends.length - 1];
|
||
|
|
}
|
||
|
|
coordinatesss.length = i;
|
||
|
|
return coordinatesss;
|
||
|
|
}
|
||
|
|
|
||
|
|
// node_modules/ol/geom/flat/simplify.js
|
||
|
|
function douglasPeucker(flatCoordinates, offset, end, stride, squaredTolerance, simplifiedFlatCoordinates, simplifiedOffset) {
|
||
|
|
const n = (end - offset) / stride;
|
||
|
|
if (n < 3) {
|
||
|
|
for (; offset < end; offset += stride) {
|
||
|
|
simplifiedFlatCoordinates[simplifiedOffset++] = flatCoordinates[offset];
|
||
|
|
simplifiedFlatCoordinates[simplifiedOffset++] = flatCoordinates[offset + 1];
|
||
|
|
}
|
||
|
|
return simplifiedOffset;
|
||
|
|
}
|
||
|
|
const markers = new Array(n);
|
||
|
|
markers[0] = 1;
|
||
|
|
markers[n - 1] = 1;
|
||
|
|
const stack = [offset, end - stride];
|
||
|
|
let index = 0;
|
||
|
|
while (stack.length > 0) {
|
||
|
|
const last = stack.pop();
|
||
|
|
const first = stack.pop();
|
||
|
|
let maxSquaredDistance = 0;
|
||
|
|
const x1 = flatCoordinates[first];
|
||
|
|
const y1 = flatCoordinates[first + 1];
|
||
|
|
const x2 = flatCoordinates[last];
|
||
|
|
const y2 = flatCoordinates[last + 1];
|
||
|
|
for (let i = first + stride; i < last; i += stride) {
|
||
|
|
const x = flatCoordinates[i];
|
||
|
|
const y = flatCoordinates[i + 1];
|
||
|
|
const squaredDistance2 = squaredSegmentDistance(x, y, x1, y1, x2, y2);
|
||
|
|
if (squaredDistance2 > maxSquaredDistance) {
|
||
|
|
index = i;
|
||
|
|
maxSquaredDistance = squaredDistance2;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
if (maxSquaredDistance > squaredTolerance) {
|
||
|
|
markers[(index - offset) / stride] = 1;
|
||
|
|
if (first + stride < index) {
|
||
|
|
stack.push(first, index);
|
||
|
|
}
|
||
|
|
if (index + stride < last) {
|
||
|
|
stack.push(index, last);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
for (let i = 0; i < n; ++i) {
|
||
|
|
if (markers[i]) {
|
||
|
|
simplifiedFlatCoordinates[simplifiedOffset++] = flatCoordinates[offset + i * stride];
|
||
|
|
simplifiedFlatCoordinates[simplifiedOffset++] = flatCoordinates[offset + i * stride + 1];
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return simplifiedOffset;
|
||
|
|
}
|
||
|
|
function douglasPeuckerArray(flatCoordinates, offset, ends, stride, squaredTolerance, simplifiedFlatCoordinates, simplifiedOffset, simplifiedEnds) {
|
||
|
|
for (let i = 0, ii = ends.length; i < ii; ++i) {
|
||
|
|
const end = ends[i];
|
||
|
|
simplifiedOffset = douglasPeucker(
|
||
|
|
flatCoordinates,
|
||
|
|
offset,
|
||
|
|
end,
|
||
|
|
stride,
|
||
|
|
squaredTolerance,
|
||
|
|
simplifiedFlatCoordinates,
|
||
|
|
simplifiedOffset
|
||
|
|
);
|
||
|
|
simplifiedEnds.push(simplifiedOffset);
|
||
|
|
offset = end;
|
||
|
|
}
|
||
|
|
return simplifiedOffset;
|
||
|
|
}
|
||
|
|
function snap(value, tolerance) {
|
||
|
|
return tolerance * Math.round(value / tolerance);
|
||
|
|
}
|
||
|
|
function quantize(flatCoordinates, offset, end, stride, tolerance, simplifiedFlatCoordinates, simplifiedOffset) {
|
||
|
|
if (offset == end) {
|
||
|
|
return simplifiedOffset;
|
||
|
|
}
|
||
|
|
let x1 = snap(flatCoordinates[offset], tolerance);
|
||
|
|
let y1 = snap(flatCoordinates[offset + 1], tolerance);
|
||
|
|
offset += stride;
|
||
|
|
simplifiedFlatCoordinates[simplifiedOffset++] = x1;
|
||
|
|
simplifiedFlatCoordinates[simplifiedOffset++] = y1;
|
||
|
|
let x2, y2;
|
||
|
|
do {
|
||
|
|
x2 = snap(flatCoordinates[offset], tolerance);
|
||
|
|
y2 = snap(flatCoordinates[offset + 1], tolerance);
|
||
|
|
offset += stride;
|
||
|
|
if (offset == end) {
|
||
|
|
simplifiedFlatCoordinates[simplifiedOffset++] = x2;
|
||
|
|
simplifiedFlatCoordinates[simplifiedOffset++] = y2;
|
||
|
|
return simplifiedOffset;
|
||
|
|
}
|
||
|
|
} while (x2 == x1 && y2 == y1);
|
||
|
|
while (offset < end) {
|
||
|
|
const x3 = snap(flatCoordinates[offset], tolerance);
|
||
|
|
const y3 = snap(flatCoordinates[offset + 1], tolerance);
|
||
|
|
offset += stride;
|
||
|
|
if (x3 == x2 && y3 == y2) {
|
||
|
|
continue;
|
||
|
|
}
|
||
|
|
const dx1 = x2 - x1;
|
||
|
|
const dy1 = y2 - y1;
|
||
|
|
const dx2 = x3 - x1;
|
||
|
|
const dy2 = y3 - y1;
|
||
|
|
if (dx1 * dy2 == dy1 * dx2 && (dx1 < 0 && dx2 < dx1 || dx1 == dx2 || dx1 > 0 && dx2 > dx1) && (dy1 < 0 && dy2 < dy1 || dy1 == dy2 || dy1 > 0 && dy2 > dy1)) {
|
||
|
|
x2 = x3;
|
||
|
|
y2 = y3;
|
||
|
|
continue;
|
||
|
|
}
|
||
|
|
simplifiedFlatCoordinates[simplifiedOffset++] = x2;
|
||
|
|
simplifiedFlatCoordinates[simplifiedOffset++] = y2;
|
||
|
|
x1 = x2;
|
||
|
|
y1 = y2;
|
||
|
|
x2 = x3;
|
||
|
|
y2 = y3;
|
||
|
|
}
|
||
|
|
simplifiedFlatCoordinates[simplifiedOffset++] = x2;
|
||
|
|
simplifiedFlatCoordinates[simplifiedOffset++] = y2;
|
||
|
|
return simplifiedOffset;
|
||
|
|
}
|
||
|
|
function quantizeArray(flatCoordinates, offset, ends, stride, tolerance, simplifiedFlatCoordinates, simplifiedOffset, simplifiedEnds) {
|
||
|
|
for (let i = 0, ii = ends.length; i < ii; ++i) {
|
||
|
|
const end = ends[i];
|
||
|
|
simplifiedOffset = quantize(
|
||
|
|
flatCoordinates,
|
||
|
|
offset,
|
||
|
|
end,
|
||
|
|
stride,
|
||
|
|
tolerance,
|
||
|
|
simplifiedFlatCoordinates,
|
||
|
|
simplifiedOffset
|
||
|
|
);
|
||
|
|
simplifiedEnds.push(simplifiedOffset);
|
||
|
|
offset = end;
|
||
|
|
}
|
||
|
|
return simplifiedOffset;
|
||
|
|
}
|
||
|
|
function quantizeMultiArray(flatCoordinates, offset, endss, stride, tolerance, simplifiedFlatCoordinates, simplifiedOffset, simplifiedEndss) {
|
||
|
|
for (let i = 0, ii = endss.length; i < ii; ++i) {
|
||
|
|
const ends = endss[i];
|
||
|
|
const simplifiedEnds = [];
|
||
|
|
simplifiedOffset = quantizeArray(
|
||
|
|
flatCoordinates,
|
||
|
|
offset,
|
||
|
|
ends,
|
||
|
|
stride,
|
||
|
|
tolerance,
|
||
|
|
simplifiedFlatCoordinates,
|
||
|
|
simplifiedOffset,
|
||
|
|
simplifiedEnds
|
||
|
|
);
|
||
|
|
simplifiedEndss.push(simplifiedEnds);
|
||
|
|
offset = ends[ends.length - 1];
|
||
|
|
}
|
||
|
|
return simplifiedOffset;
|
||
|
|
}
|
||
|
|
|
||
|
|
export {
|
||
|
|
maxSquaredDelta,
|
||
|
|
arrayMaxSquaredDelta,
|
||
|
|
multiArrayMaxSquaredDelta,
|
||
|
|
assignClosestPoint,
|
||
|
|
assignClosestArrayPoint,
|
||
|
|
assignClosestMultiArrayPoint,
|
||
|
|
inflateCoordinates,
|
||
|
|
inflateCoordinatesArray,
|
||
|
|
inflateMultiCoordinatesArray,
|
||
|
|
douglasPeucker,
|
||
|
|
douglasPeuckerArray,
|
||
|
|
snap,
|
||
|
|
quantizeArray,
|
||
|
|
quantizeMultiArray
|
||
|
|
};
|
||
|
|
//# sourceMappingURL=chunk-NLIGXLAR.js.map
|