211 lines
5.5 KiB
JavaScript
211 lines
5.5 KiB
JavaScript
|
|
import {
|
|||
|
|
modulo,
|
|||
|
|
toFixed
|
|||
|
|
} from "./chunk-54BTDBAD.js";
|
|||
|
|
import {
|
|||
|
|
getWidth
|
|||
|
|
} from "./chunk-CKDBVGKM.js";
|
|||
|
|
|
|||
|
|
// node_modules/ol/string.js
|
|||
|
|
function padNumber(number, width, precision) {
|
|||
|
|
const numberString = precision !== void 0 ? number.toFixed(precision) : "" + number;
|
|||
|
|
let decimal = numberString.indexOf(".");
|
|||
|
|
decimal = decimal === -1 ? numberString.length : decimal;
|
|||
|
|
return decimal > width ? numberString : new Array(1 + width - decimal).join("0") + numberString;
|
|||
|
|
}
|
|||
|
|
function compareVersions(v1, v2) {
|
|||
|
|
const s1 = ("" + v1).split(".");
|
|||
|
|
const s2 = ("" + v2).split(".");
|
|||
|
|
for (let i = 0; i < Math.max(s1.length, s2.length); i++) {
|
|||
|
|
const n1 = parseInt(s1[i] || "0", 10);
|
|||
|
|
const n2 = parseInt(s2[i] || "0", 10);
|
|||
|
|
if (n1 > n2) {
|
|||
|
|
return 1;
|
|||
|
|
}
|
|||
|
|
if (n2 > n1) {
|
|||
|
|
return -1;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return 0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// node_modules/ol/coordinate.js
|
|||
|
|
function add(coordinate, delta) {
|
|||
|
|
coordinate[0] += +delta[0];
|
|||
|
|
coordinate[1] += +delta[1];
|
|||
|
|
return coordinate;
|
|||
|
|
}
|
|||
|
|
function closestOnCircle(coordinate, circle) {
|
|||
|
|
const r = circle.getRadius();
|
|||
|
|
const center = circle.getCenter();
|
|||
|
|
const x0 = center[0];
|
|||
|
|
const y0 = center[1];
|
|||
|
|
const x1 = coordinate[0];
|
|||
|
|
const y1 = coordinate[1];
|
|||
|
|
let dx = x1 - x0;
|
|||
|
|
const dy = y1 - y0;
|
|||
|
|
if (dx === 0 && dy === 0) {
|
|||
|
|
dx = 1;
|
|||
|
|
}
|
|||
|
|
const d = Math.sqrt(dx * dx + dy * dy);
|
|||
|
|
const x = x0 + r * dx / d;
|
|||
|
|
const y = y0 + r * dy / d;
|
|||
|
|
return [x, y];
|
|||
|
|
}
|
|||
|
|
function closestOnSegment(coordinate, segment) {
|
|||
|
|
const x0 = coordinate[0];
|
|||
|
|
const y0 = coordinate[1];
|
|||
|
|
const start = segment[0];
|
|||
|
|
const end = segment[1];
|
|||
|
|
const x1 = start[0];
|
|||
|
|
const y1 = start[1];
|
|||
|
|
const x2 = end[0];
|
|||
|
|
const y2 = end[1];
|
|||
|
|
const dx = x2 - x1;
|
|||
|
|
const dy = y2 - y1;
|
|||
|
|
const along = dx === 0 && dy === 0 ? 0 : (dx * (x0 - x1) + dy * (y0 - y1)) / (dx * dx + dy * dy || 0);
|
|||
|
|
let x, y;
|
|||
|
|
if (along <= 0) {
|
|||
|
|
x = x1;
|
|||
|
|
y = y1;
|
|||
|
|
} else if (along >= 1) {
|
|||
|
|
x = x2;
|
|||
|
|
y = y2;
|
|||
|
|
} else {
|
|||
|
|
x = x1 + along * dx;
|
|||
|
|
y = y1 + along * dy;
|
|||
|
|
}
|
|||
|
|
return [x, y];
|
|||
|
|
}
|
|||
|
|
function createStringXY(fractionDigits) {
|
|||
|
|
return (
|
|||
|
|
/**
|
|||
|
|
* @param {Coordinate} coordinate Coordinate.
|
|||
|
|
* @return {string} String XY.
|
|||
|
|
*/
|
|||
|
|
(function(coordinate) {
|
|||
|
|
return toStringXY(coordinate, fractionDigits);
|
|||
|
|
})
|
|||
|
|
);
|
|||
|
|
}
|
|||
|
|
function degreesToStringHDMS(hemispheres, degrees, fractionDigits) {
|
|||
|
|
const normalizedDegrees = modulo(degrees + 180, 360) - 180;
|
|||
|
|
const x = Math.abs(3600 * normalizedDegrees);
|
|||
|
|
const decimals = fractionDigits || 0;
|
|||
|
|
let deg = Math.floor(x / 3600);
|
|||
|
|
let min = Math.floor((x - deg * 3600) / 60);
|
|||
|
|
let sec = toFixed(x - deg * 3600 - min * 60, decimals);
|
|||
|
|
if (sec >= 60) {
|
|||
|
|
sec = 0;
|
|||
|
|
min += 1;
|
|||
|
|
}
|
|||
|
|
if (min >= 60) {
|
|||
|
|
min = 0;
|
|||
|
|
deg += 1;
|
|||
|
|
}
|
|||
|
|
let hdms = deg + "°";
|
|||
|
|
if (min !== 0 || sec !== 0) {
|
|||
|
|
hdms += " " + padNumber(min, 2) + "′";
|
|||
|
|
}
|
|||
|
|
if (sec !== 0) {
|
|||
|
|
hdms += " " + padNumber(sec, 2, decimals) + "″";
|
|||
|
|
}
|
|||
|
|
if (normalizedDegrees !== 0) {
|
|||
|
|
hdms += " " + hemispheres.charAt(normalizedDegrees < 0 ? 1 : 0);
|
|||
|
|
}
|
|||
|
|
return hdms;
|
|||
|
|
}
|
|||
|
|
function format(coordinate, template, fractionDigits) {
|
|||
|
|
if (coordinate) {
|
|||
|
|
return template.replace("{x}", coordinate[0].toFixed(fractionDigits)).replace("{y}", coordinate[1].toFixed(fractionDigits));
|
|||
|
|
}
|
|||
|
|
return "";
|
|||
|
|
}
|
|||
|
|
function equals(coordinate1, coordinate2) {
|
|||
|
|
let equals2 = true;
|
|||
|
|
for (let i = coordinate1.length - 1; i >= 0; --i) {
|
|||
|
|
if (coordinate1[i] != coordinate2[i]) {
|
|||
|
|
equals2 = false;
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return equals2;
|
|||
|
|
}
|
|||
|
|
function rotate(coordinate, angle) {
|
|||
|
|
const cosAngle = Math.cos(angle);
|
|||
|
|
const sinAngle = Math.sin(angle);
|
|||
|
|
const x = coordinate[0] * cosAngle - coordinate[1] * sinAngle;
|
|||
|
|
const y = coordinate[1] * cosAngle + coordinate[0] * sinAngle;
|
|||
|
|
coordinate[0] = x;
|
|||
|
|
coordinate[1] = y;
|
|||
|
|
return coordinate;
|
|||
|
|
}
|
|||
|
|
function scale(coordinate, scale2) {
|
|||
|
|
coordinate[0] *= scale2;
|
|||
|
|
coordinate[1] *= scale2;
|
|||
|
|
return coordinate;
|
|||
|
|
}
|
|||
|
|
function squaredDistance(coord1, coord2) {
|
|||
|
|
const dx = coord1[0] - coord2[0];
|
|||
|
|
const dy = coord1[1] - coord2[1];
|
|||
|
|
return dx * dx + dy * dy;
|
|||
|
|
}
|
|||
|
|
function distance(coord1, coord2) {
|
|||
|
|
return Math.sqrt(squaredDistance(coord1, coord2));
|
|||
|
|
}
|
|||
|
|
function squaredDistanceToSegment(coordinate, segment) {
|
|||
|
|
return squaredDistance(coordinate, closestOnSegment(coordinate, segment));
|
|||
|
|
}
|
|||
|
|
function toStringHDMS(coordinate, fractionDigits) {
|
|||
|
|
if (coordinate) {
|
|||
|
|
return degreesToStringHDMS("NS", coordinate[1], fractionDigits) + " " + degreesToStringHDMS("EW", coordinate[0], fractionDigits);
|
|||
|
|
}
|
|||
|
|
return "";
|
|||
|
|
}
|
|||
|
|
function toStringXY(coordinate, fractionDigits) {
|
|||
|
|
return format(coordinate, "{x}, {y}", fractionDigits);
|
|||
|
|
}
|
|||
|
|
function wrapX(coordinate, projection) {
|
|||
|
|
if (projection.canWrapX()) {
|
|||
|
|
const worldWidth = getWidth(projection.getExtent());
|
|||
|
|
const worldsAway = getWorldsAway(coordinate, projection, worldWidth);
|
|||
|
|
if (worldsAway) {
|
|||
|
|
coordinate[0] -= worldsAway * worldWidth;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return coordinate;
|
|||
|
|
}
|
|||
|
|
function getWorldsAway(coordinate, projection, sourceExtentWidth) {
|
|||
|
|
const projectionExtent = projection.getExtent();
|
|||
|
|
let worldsAway = 0;
|
|||
|
|
if (projection.canWrapX() && (coordinate[0] < projectionExtent[0] || coordinate[0] > projectionExtent[2])) {
|
|||
|
|
sourceExtentWidth = sourceExtentWidth || getWidth(projectionExtent);
|
|||
|
|
worldsAway = Math.floor(
|
|||
|
|
(coordinate[0] - projectionExtent[0]) / sourceExtentWidth
|
|||
|
|
);
|
|||
|
|
}
|
|||
|
|
return worldsAway;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
export {
|
|||
|
|
padNumber,
|
|||
|
|
compareVersions,
|
|||
|
|
add,
|
|||
|
|
closestOnCircle,
|
|||
|
|
closestOnSegment,
|
|||
|
|
createStringXY,
|
|||
|
|
degreesToStringHDMS,
|
|||
|
|
format,
|
|||
|
|
equals,
|
|||
|
|
rotate,
|
|||
|
|
scale,
|
|||
|
|
squaredDistance,
|
|||
|
|
distance,
|
|||
|
|
squaredDistanceToSegment,
|
|||
|
|
toStringHDMS,
|
|||
|
|
toStringXY,
|
|||
|
|
wrapX,
|
|||
|
|
getWorldsAway
|
|||
|
|
};
|
|||
|
|
//# sourceMappingURL=chunk-3JZANJYE.js.map
|