@watergis/maplibre-gl-terradraw
Version:
This plugin is to add controls to your Maplibre for drawing powered by Terra Draw library.
9,355 lines • 362 kB
JavaScript
import { LngLat as e } from "maplibre-gl";
//#region node_modules/.pnpm/terra-draw@1.31.0/node_modules/terra-draw/dist/terra-draw.modern.js
function t() {
return t = Object.assign ? Object.assign.bind() : function(e) {
for (var t = 1; t < arguments.length; t++) {
var n = arguments[t];
for (var r in n) ({}).hasOwnProperty.call(n, r) && (e[r] = n[r]);
}
return e;
}, t.apply(null, arguments);
}
var n = "draw", r = "edit", i = "deleteCoordinate", a = "insertMidpoint", o;
(function(e) {
e.Commit = "commit", e.Provisional = "provisional", e.Finish = "finish";
})(o ||= {});
var s = "https://raw.githubusercontent.com/JamesLMilner/terra-draw/refs/heads/main/assets/markers/marker-blue.png", c = {
SELECTED: "selected",
MID_POINT: "midPoint",
SELECTION_POINT_FEATURE_ID: "selectionPointFeatureId",
SELECTION_POINT: "selectionPoint"
}, l = {
MODE: "mode",
CURRENTLY_DRAWING: "currentlyDrawing",
EDITED: "edited",
CLOSING_POINT: "closingPoint",
SNAPPING_POINT: "snappingPoint",
COORDINATE_POINT: "coordinatePoint",
COORDINATE_POINT_FEATURE_ID: "coordinatePointFeatureId",
COORDINATE_POINT_IDS: "coordinatePointIds",
PROVISIONAL_COORDINATE_COUNT: "provisionalCoordinateCount",
COMMITTED_COORDINATE_COUNT: "committedCoordinateCount",
MARKER: "marker"
}, u = 10;
function d(e) {
return !!(e && typeof e == "object" && e && !Array.isArray(e));
}
function f(e) {
return !!(e && typeof e == "object" && "properties" in e && typeof e.properties == "object" && e.properties !== null && "mode" in e.properties);
}
function p(e) {
return !!function(e) {
return typeof e == "number" && !isNaN(new Date(e).valueOf());
}(e);
}
var m = "Feature mode property does not match the mode being added to", h;
(function(e) {
e.Drawing = "drawing", e.Select = "select", e.Static = "static", e.Render = "render";
})(h ||= {});
var g = {
rightClick: !0,
contextMenu: !1,
leftClick: !0,
onDragStart: !0,
onDrag: !0,
onDragEnd: !0
}, _ = class {
get state() {
return this._state;
}
set state(e) {
throw Error("Please use the modes lifecycle methods");
}
get styles() {
return this._styles;
}
set styles(e) {
if (typeof e != "object") throw Error("Styling must be an object");
this.onStyleChange && this.onStyleChange([], "styling"), this._styles = e;
}
registerBehaviors(e) {}
constructor(e, n = !1) {
this._state = "unregistered", this._styles = {}, this.pointerEvents = g, this.behaviors = [], this.validate = void 0, this.pointerDistance = 40, this.coordinatePrecision = void 0, this.undoRedoMaxStackSize = void 0, this.onStyleChange = void 0, this.store = void 0, this.projection = "web-mercator", this.setDoubleClickToZoom = void 0, this.unproject = void 0, this.project = void 0, this.setCursor = void 0, this.isInitialUpdate = !1, this.type = h.Drawing, this.mode = "base", n ? this.isInitialUpdate = !0 : this.updateOptions(t({}, e));
}
updateOptions(e) {
e != null && e.styles && (this.styles = t({}, this._styles, e.styles)), e != null && e.pointerDistance && (this.pointerDistance = e.pointerDistance), e != null && e.validation && (this.validate = e && e.validation), e != null && e.projection && (this.projection = e.projection), e?.pointerEvents !== void 0 && (this.pointerEvents = e.pointerEvents), e != null && e.modeName && !0 === this.isInitialUpdate && (this.mode = e.modeName), this.isInitialUpdate = !1;
}
allowPointerEvent(e, t) {
return typeof e == "boolean" ? e : typeof e != "function" || e(t);
}
setDrawing() {
if (this._state !== "started") throw Error("Mode must be unregistered or stopped to start");
this._state = "drawing";
}
setStarted() {
if (this._state !== "stopped" && this._state !== "registered" && this._state !== "drawing" && this._state !== "selecting") throw Error("Mode must be unregistered or stopped to start");
this._state = "started", this.setDoubleClickToZoom(!1);
}
setStopped() {
if (this._state !== "started") throw Error("Mode must be started to be stopped");
this._state = "stopped", this.setDoubleClickToZoom(!0);
}
register(e) {
if (this._state !== "unregistered") throw Error("Can not register unless mode is unregistered");
this._state = "registered", this.store = e.store, this.store.registerOnChange(e.onChange), this.setDoubleClickToZoom = e.setDoubleClickToZoom, this.project = e.project, this.unproject = e.unproject, this.onSelect = e.onSelect, this.onDeselect = e.onDeselect, this.setCursor = e.setCursor, this.onStyleChange = e.onChange, this.onFinish = e.onFinish, this.coordinatePrecision = e.coordinatePrecision, this.undoRedoMaxStackSize = e.undoRedoMaxStackSize, this.registerBehaviors({
mode: e.mode,
store: this.store,
project: this.project,
unproject: this.unproject,
pointerDistance: this.pointerDistance,
coordinatePrecision: e.coordinatePrecision,
projection: this.projection,
undoRedoMaxStackSize: e.undoRedoMaxStackSize
});
}
validateFeature(e) {
return this.performFeatureValidation(e);
}
afterFeatureAdded(e) {}
afterFeatureUpdated(e) {}
performFeatureValidation(e) {
if (this._state === "unregistered") throw Error("Mode must be registered");
let t = function(e, t) {
let n;
if (d(e)) if (e.id == null) n = "Feature has no id";
else if (typeof e.id != "string" && typeof e.id != "number") n = "Feature must be string or number as per GeoJSON spec";
else if (t(e.id)) if (d(e.geometry)) if (d(e.properties)) if (typeof e.geometry.type == "string" && [
"Polygon",
"LineString",
"Point"
].includes(e.geometry.type)) if (Array.isArray(e.geometry.coordinates)) {
if (!e.properties.mode || typeof e.properties.mode != "string") return {
valid: !1,
reason: "Feature does not have a valid mode property"
};
} else n = "Feature coordinates is not an array";
else n = "Feature is not Point, LineString or Polygon";
else n = "Feature has no properties";
else n = "Feature has no geometry";
else n = "Feature must match the id strategy (default is UUID4)";
else n = "Feature is not object";
return n ? {
valid: !1,
reason: n
} : { valid: !0 };
}(e, this.store.idStrategy.isValidId);
if (!t.valid) return t;
if (this.validate) {
let n = this.validate(e, {
project: this.project,
unproject: this.unproject,
coordinatePrecision: this.coordinatePrecision,
updateType: o.Provisional
});
return {
valid: t.valid && n.valid,
reason: n.reason
};
}
return {
valid: t.valid,
reason: t.reason
};
}
validateModeFeature(e, t) {
let n = this.performFeatureValidation(e);
return n.valid ? e.properties.mode === this.mode ? t(e) : {
valid: !1,
reason: m
} : {
valid: !1,
reason: n.reason
};
}
onFinish(e, t) {}
onDeselect(e) {}
onSelect(e) {}
onKeyDown(e) {}
onKeyUp(e) {}
undo() {}
clearHistory() {}
undoSize() {
return 0;
}
redoSize() {
return 0;
}
redo() {}
onMouseMove(e) {}
onClick(e) {}
onDragStart(e, t) {}
onDrag(e, t) {}
onDragEnd(e, t) {}
getHexColorStylingValue(e, t, n) {
return this.getStylingValue(e, t, n);
}
getNumericStylingValue(e, t, n) {
return this.getStylingValue(e, t, n);
}
getUrlStylingValue(e, t, n) {
return this.getStylingValue(e, t, n);
}
getStylingValue(e, t, n) {
return e === void 0 ? t : typeof e == "function" ? (r = e(n)) ?? t : e;
var r;
}
}, v = class extends _ {
constructor(...e) {
super(...e), this.type = h.Select;
}
};
function y(e, t) {
let n = (e) => e * Math.PI / 180, r = n(e[1]), i = n(e[0]), a = n(t[1]), o = a - r, s = n(t[0]) - i, c = Math.sin(o / 2) * Math.sin(o / 2) + Math.cos(r) * Math.cos(a) * Math.sin(s / 2) * Math.sin(s / 2);
return 2 * Math.atan2(Math.sqrt(c), Math.sqrt(1 - c)) * 6371e3 / 1e3;
}
var b = 6371008.8;
function x(e) {
return e % 360 * Math.PI / 180;
}
function ee(e) {
return e / 6371.0088;
}
function S(e) {
return e % (2 * Math.PI) * 180 / Math.PI;
}
function C(e, t = 9) {
let n = 10 ** t;
return Math.round(e * n) / n;
}
var te = 57.29577951308232, w = .017453292519943295, ne = 6378137, T = (e, t) => ({
x: e === 0 ? 0 : e * w * ne,
y: t === 0 ? 0 : Math.log(Math.tan(Math.PI / 4 + t * w / 2)) * ne
}), E = (e, t) => ({
lng: e === 0 ? 0 : e / ne * te,
lat: t === 0 ? 0 : (2 * Math.atan(Math.exp(t / ne)) - Math.PI / 2) * te
});
function re(e, t, n) {
let r = x(e[0]), i = x(e[1]), a = x(n), o = ee(t), s = Math.asin(Math.sin(i) * Math.cos(o) + Math.cos(i) * Math.sin(o) * Math.cos(a));
return [S(r + Math.atan2(Math.sin(a) * Math.sin(o) * Math.cos(i), Math.cos(o) - Math.sin(i) * Math.sin(s))), S(s)];
}
function ie(e) {
let { center: t, radiusKilometers: n, coordinatePrecision: r } = e, i = e.steps ? e.steps : 64, a = [];
for (let e = 0; e < i; e++) {
let o = re(t, n, -360 * e / i);
a.push([C(o[0], r), C(o[1], r)]);
}
return a.push(a[0]), {
type: "Feature",
geometry: {
type: "Polygon",
coordinates: [a]
},
properties: {}
};
}
function ae(e) {
let t;
if (e.geometry.type === "Polygon") t = e.geometry.coordinates;
else {
if (e.geometry.type !== "LineString") throw Error("Self intersects only accepts Polygons and LineStrings");
t = [e.geometry.coordinates];
}
let n = [];
for (let e = 0; e < t.length; e++) for (let n = 0; n < t[e].length - 1; n++) for (let r = 0; r < t.length; r++) for (let a = 0; a < t[r].length - 1; a++) i(e, n, r, a);
return n.length > 0;
function r(e) {
return e < 0 || e > 1;
}
function i(e, i, a, o) {
let s = t[e][i], c = t[e][i + 1], l = t[a][o], u = t[a][o + 1], d = function(e, t, n, r) {
if (oe(e, n) || oe(e, r) || oe(t, n) || oe(r, n)) return null;
let i = e[0], a = e[1], o = t[0], s = t[1], c = n[0], l = n[1], u = r[0], d = r[1], f = (i - o) * (l - d) - (a - s) * (c - u);
return f === 0 ? null : [((i * s - a * o) * (c - u) - (i - o) * (c * d - l * u)) / f, ((i * s - a * o) * (l - d) - (a - s) * (c * d - l * u)) / f];
}(s, c, l, u);
if (d === null) return;
let f, p;
f = c[0] === s[0] ? (d[1] - s[1]) / (c[1] - s[1]) : (d[0] - s[0]) / (c[0] - s[0]), p = u[0] === l[0] ? (d[1] - l[1]) / (u[1] - l[1]) : (d[0] - l[0]) / (u[0] - l[0]), r(f) || r(p) || (d.toString(), n.push(d));
}
}
function oe(e, t) {
return e[0] === t[0] && e[1] === t[1];
}
function se(e, t) {
return le(e[0]) <= t && le(e[1]) <= t;
}
function ce(e) {
return e.length === 2 && typeof e[0] == "number" && typeof e[1] == "number" && e[0] !== Infinity && e[1] !== Infinity && (n = e[0]) >= -180 && n <= 180 && (t = e[1]) >= -90 && t <= 90;
var t, n;
}
function le(e) {
let t = 1, n = 0;
for (; Math.round(e * t) / t !== e;) t *= 10, n++;
return n;
}
var ue = "Feature has holes", de = "Feature has less than 4 coordinates", fe = "Feature has invalid coordinates", pe = "Feature coordinates are not closed";
function me(e, t) {
if (e.geometry.type !== "Polygon") return {
valid: !1,
reason: "Feature is not a Polygon"
};
if (e.geometry.coordinates.length !== 1) return {
valid: !1,
reason: ue
};
if (e.geometry.coordinates[0].length < 4) return {
valid: !1,
reason: de
};
for (let n = 0; n < e.geometry.coordinates[0].length; n++) {
if (!ce(e.geometry.coordinates[0][n])) return {
valid: !1,
reason: fe
};
if (!se(e.geometry.coordinates[0][n], t)) return {
valid: !1,
reason: "Feature has coordinates with excessive precision"
};
}
return (n = e.geometry.coordinates[0][0])[0] !== (r = e.geometry.coordinates[0][e.geometry.coordinates[0].length - 1])[0] || n[1] !== r[1] ? {
valid: !1,
reason: pe
} : { valid: !0 };
var n, r;
}
function he(e, t) {
let n = me(e, t);
return n.valid ? ae(e) ? {
valid: !1,
reason: "Feature intersects itself"
} : { valid: !0 } : n;
}
var D = class {
constructor({ store: e, mode: t, project: n, unproject: r, pointerDistance: i, coordinatePrecision: a, projection: o, undoRedoMaxStackSize: s }) {
this.store = void 0, this.mode = void 0, this.project = void 0, this.unproject = void 0, this.pointerDistance = void 0, this.coordinatePrecision = void 0, this.projection = void 0, this.undoRedoMaxStackSize = void 0, this.store = e, this.mode = t, this.project = n, this.unproject = r, this.pointerDistance = i, this.coordinatePrecision = a, this.projection = o, this.undoRedoMaxStackSize = s;
}
};
function ge(e) {
if (!function(e) {
let t = e.coordinates[0], n = 0;
for (let e = 0; e < t.length - 1; e++) {
let [r, i] = t[e], [a, o] = t[e + 1];
n += (a - r) * (o + i);
}
return n < 0;
}(e)) return {
type: "Polygon",
coordinates: [e.coordinates[0].reverse()]
};
}
var _e = "insert-before", O = "insert-after", k = "update", A = "delete", j = "replace", M = class extends D {
constructor(e, t) {
super(e), this.options = void 0, this.options = t;
}
createPoint({ coordinates: e, properties: t, context: n }) {
if (n?.updateType !== o.Finish || this.validateGeometryWithUpdateType({
geometry: {
type: "Point",
coordinates: e
},
properties: t,
updateType: o.Finish
})) return this.handleCreateFeature({
geometry: {
type: "Point",
coordinates: e
},
properties: t
});
}
createLineString({ coordinates: e, properties: t }) {
return this.handleCreateFeature({
geometry: {
type: "LineString",
coordinates: e
},
properties: t
});
}
createPolygon({ coordinates: e, properties: t, context: n }) {
let r = ge({
type: "Polygon",
coordinates: [e]
}), i = {
type: "Polygon",
coordinates: r ? r.coordinates : [e]
};
if (n?.updateType !== o.Finish || this.validateGeometryWithUpdateType({
geometry: i,
properties: t,
updateType: o.Finish
})) return this.handleCreateFeature({
geometry: i,
properties: t
});
}
createGuidancePoint({ coordinate: e, type: t }) {
return this.createGuidancePoints({
coordinates: [e],
type: t
})[0];
}
createGuidancePoints({ coordinates: e, type: n, additionalProperties: r }) {
let i = e.map((e, i) => ({
type: "Feature",
geometry: {
type: "Point",
coordinates: e
},
properties: t({
mode: this.mode,
[n]: !0
}, r ? r(i) : {})
}));
return this.createFeatures(i);
}
updatePoint({ featureId: e, coordinateMutations: t, propertyMutations: n, context: r }) {
return this.handleMutateFeature({
type: "Point",
featureId: e,
coordinateMutations: t,
propertyMutations: n,
context: r
});
}
updatePolygon({ featureId: e, coordinateMutations: t, context: n, propertyMutations: r }) {
return this.handleMutateFeature({
type: "Polygon",
featureId: e,
coordinateMutations: t,
propertyMutations: r,
context: n
});
}
updateLineString({ featureId: e, coordinateMutations: t, context: n, propertyMutations: r }) {
return this.handleMutateFeature({
type: "LineString",
featureId: e,
coordinateMutations: t,
propertyMutations: r,
context: n
});
}
deleteFeatureIfPresent(e) {
e && this.store.has(e) && this.store.delete([e]);
}
deleteFeaturesIfPresent(e) {
if (e.length === 0) return;
let t = e.filter((e) => this.store.has(e));
t.length && this.store.delete(t);
}
setDeselected(e) {
let t = e.filter((e) => this.store.has(e)).map((e) => ({
featureId: e,
properties: { [c.SELECTED]: !1 }
}));
this.updateFeatureProperties(t);
}
setSelected(e) {
let { type: t } = this.store.getGeometryCopy(e), n = {
featureId: e,
propertyMutations: { [c.SELECTED]: !0 },
context: { updateType: o.Commit }
};
t === "Polygon" ? this.updatePolygon(n) : t === "LineString" ? this.updateLineString(n) : t === "Point" && this.updatePoint(n);
}
updateGuidancePoints(e) {
this.updateFeatureGeometries(e.map(({ featureId: e, coordinate: t }) => ({
id: e,
geometry: {
type: "Point",
coordinates: t
}
})));
}
handleCreateFeature({ geometry: e, properties: t }) {
return this.createFeatureWithGeometry({
geometry: e,
properties: t
});
}
handleMutateFeature({ type: e, featureId: n, coordinateMutations: r, propertyMutations: i, context: a }) {
if (!this.mutateFeature({
type: e,
featureId: n,
coordinateMutations: r,
propertyMutations: i,
context: a.updateType === o.Finish ? t({}, a, { correctRightHandRule: !0 }) : t({}, a)
})) return null;
let s = this.buildFeatureWithGeometry(n);
return a.updateType !== o.Finish || r || this.validateGeometryWithUpdateType({
geometry: s.geometry,
properties: s.properties,
updateType: a.updateType
}) ? s : null;
}
mutateFeature({ type: e, featureId: t, coordinateMutations: n, propertyMutations: r, context: i }) {
if (!t) return !1;
let a = this.store.getGeometryCopy(t), o = this.store.getPropertiesCopy(t);
if (a.type !== e) throw Error(`${e} geometries cannot be updated on features with ${a.type} geometries`);
if (n) {
let e = this.applyCoordinateMutations(a, n);
if (i.correctRightHandRule && e.type === "Polygon") {
let t = ge(e);
t && (e = t);
}
if (!this.validateGeometryWithUpdateType({
geometry: e,
properties: o,
updateType: i.updateType
})) return !1;
this.updateFeatureGeometries([{
id: t,
geometry: e
}]);
}
return r && this.updateFeatureProperties([{
featureId: t,
properties: r
}]), !0;
}
applyCoordinateMutations(e, n) {
if (this.isReplaceMutation(n)) return t({}, e, { coordinates: n.coordinates });
if (e.type === "Point") throw Error("Coordinate mutations are not supported for Point geometries");
let r = e.type === "Polygon", i = r ? e.coordinates[0].slice() : e.coordinates.slice(), a = i.length, o = (e) => {
let t = e < 0 ? a + e : e;
if (t < 0 || t >= a) throw RangeError(`Index ${e} (normalized to ${t}) is out of bounds`);
return t;
}, s = Array(a).fill(void 0), c = Array.from({ length: a }, () => []), l = Array.from({ length: a }, () => []), u = [];
for (let e of n) {
if (e.type === _e || e.type === O) {
let t = e.index, n = t < 0 ? a + t : t;
if (n < 0 || n > a) throw RangeError(`Index ${e.index} (normalized to ${n}) is out of bounds`);
if (e.type === _e) {
if (n >= a) throw RangeError(`INSERT_BEFORE index ${e.index} (normalized to ${n}) is out of bounds for length ${a}`);
c[n].push(e);
} else n === a ? u.push(e) : l[n].push(e);
continue;
}
let n = o(e.index);
s[n] = t({}, e, { index: n });
}
let d = [];
for (let e = 0; e < a; e++) {
let t = c[e];
for (let e of t) d.push(e.coordinate);
let n = s[e];
n ? n.type === A || d.push(n.coordinate) : d.push(i[e]);
let r = l[e];
for (let e of r) d.push(e.coordinate);
}
for (let e of u) d.push(e.coordinate);
return t({}, e, r ? { coordinates: [d, ...e.coordinates.slice(1)] } : { coordinates: d });
}
isReplaceMutation(e) {
return e.type === j;
}
createFeatureWithGeometry({ geometry: e, properties: t }) {
let [n] = this.createFeatures([{
type: "Feature",
geometry: e,
properties: t
}]);
return {
id: n,
type: "Feature",
properties: this.store.getPropertiesCopy(n),
geometry: this.store.getGeometryCopy(n)
};
}
validateGeometryWithUpdateType({ geometry: e, properties: t, updateType: n }) {
return !this.options.validate || this.options.validate({
type: "Feature",
geometry: e,
properties: t || {}
}, {
project: this.project,
unproject: this.unproject,
coordinatePrecision: this.coordinatePrecision,
updateType: n
}).valid;
}
buildFeatureWithGeometry(e) {
return {
id: e,
type: "Feature",
properties: this.store.getPropertiesCopy(e),
geometry: this.store.getGeometryCopy(e)
};
}
createFeatures(e) {
return this.store.create(e);
}
updateFeatureGeometries(e) {
this.store.updateGeometry(e);
}
updateFeatureProperties(e) {
let t = e.map(({ featureId: e, properties: t }) => Object.entries(t).map(([t, n]) => ({
id: e,
property: t,
value: n
}))).flat();
this.store.updateProperty(t);
}
}, ve = {
cancel: "Escape",
finish: "Enter"
}, ye = { start: "crosshair" }, be = class extends _ {
constructor(e) {
super(e, !0), this.mode = "circle", this.center = void 0, this.endPosition = void 0, this.segments = 64, this.currentCircleId = void 0, this.keyEvents = ve, this.cursors = ye, this.startingRadiusKilometers = 1e-5, this.cursorMovedAfterInitialCursorDown = !1, this.drawInteraction = "click-move", this.drawType = void 0, this.mutateFeature = void 0, this.updateOptions(e);
}
updateOptions(e) {
super.updateOptions(e), e != null && e.cursors && (this.cursors = t({}, this.cursors, e.cursors)), e?.keyEvents === null ? this.keyEvents = {
cancel: null,
finish: null
} : e != null && e.keyEvents && (this.keyEvents = t({}, this.keyEvents, e.keyEvents)), e != null && e.startingRadiusKilometers && (this.startingRadiusKilometers = e.startingRadiusKilometers), e != null && e.drawInteraction && (this.drawInteraction = e.drawInteraction), e != null && e.segments && (this.segments = e.segments < 3 ? 3 : e.segments);
}
close() {
if (this.currentCircleId === void 0 || this.endPosition === void 0 || !this.updateCircle(this.endPosition, o.Finish)) return;
let e = this.currentCircleId;
this.cursorMovedAfterInitialCursorDown = !1, this.center = void 0, this.currentCircleId = void 0, this.drawType = void 0, this.state === "drawing" && this.setStarted(), this.onFinish(e, {
mode: this.mode,
action: n
});
}
beginDrawing(e, t = "click") {
this.center = [e.lng, e.lat], this.endPosition = [e.lng, e.lat];
let n = ie({
center: this.center,
radiusKilometers: this.startingRadiusKilometers,
coordinatePrecision: this.coordinatePrecision
}), r = this.mutateFeature.createPolygon({
coordinates: n.geometry.coordinates[0],
properties: {
mode: this.mode,
radiusKilometers: this.startingRadiusKilometers,
[l.CURRENTLY_DRAWING]: !0
}
});
r && (this.currentCircleId = r.id, this.cursorMovedAfterInitialCursorDown = !1, this.drawType = t, this.setDrawing());
}
dragDrawAllowed() {
return this.drawInteraction === "click-drag" || this.drawInteraction === "click-move-or-drag";
}
moveDrawAllowed() {
return this.drawInteraction === "click-move" || this.drawInteraction === "click-move-or-drag";
}
start() {
this.setStarted(), this.setCursor(this.cursors.start);
}
stop() {
this.cleanUp(), this.setStopped(), this.setCursor("unset");
}
onClick(e) {
this.moveDrawAllowed() && (e.button === "right" && this.allowPointerEvent(this.pointerEvents.rightClick, e) || e.button === "left" && this.allowPointerEvent(this.pointerEvents.leftClick, e) || e.isContextMenu && this.allowPointerEvent(this.pointerEvents.contextMenu, e)) && (this.center ? this.center && this.currentCircleId !== void 0 && (this.endPosition = [e.lng, e.lat], this.close()) : this.beginDrawing(e));
}
onMouseMove(e) {
this.cursorMovedAfterInitialCursorDown = !0, this.endPosition = [e.lng, e.lat], this.updateCircle(this.endPosition, o.Provisional);
}
onKeyDown() {}
onKeyUp(e) {
e.key === this.keyEvents.cancel ? this.cleanUp() : e.key === this.keyEvents.finish && this.close();
}
onDragStart(e, t) {
this.state !== "drawing" && this.allowPointerEvent(this.pointerEvents.onDragStart, e) && this.dragDrawAllowed() && (this.beginDrawing(e, "drag"), t(!1));
}
onDrag(e, t) {
this.allowPointerEvent(this.pointerEvents.onDrag, e) && this.dragDrawAllowed() && this.drawType === "drag" && (this.cursorMovedAfterInitialCursorDown = !0, this.endPosition = [e.lng, e.lat], this.updateCircle(this.endPosition, o.Provisional));
}
onDragEnd(e, t) {
this.allowPointerEvent(this.pointerEvents.onDragEnd, e) && this.dragDrawAllowed() && this.drawType === "drag" && (this.endPosition = [e.lng, e.lat], this.close(), t(!0));
}
cleanUp() {
let e = this.currentCircleId;
this.center = void 0, this.currentCircleId = void 0, this.drawType = void 0, this.state === "drawing" && this.setStarted(), this.mutateFeature.deleteFeatureIfPresent(e);
}
styleFeature(e) {
let n = t({}, {
polygonFillColor: "#3f97e0",
polygonOutlineColor: "#3f97e0",
polygonOutlineWidth: 4,
polygonOutlineOpacity: 1,
polygonFillOpacity: .3,
pointColor: "#3f97e0",
pointOpacity: 1,
pointOutlineColor: "#ffffff",
pointOutlineOpacity: 1,
pointOutlineWidth: 0,
pointWidth: 6,
lineStringColor: "#3f97e0",
lineStringWidth: 4,
lineStringOpacity: 1,
zIndex: 0,
markerUrl: void 0,
markerHeight: void 0,
markerWidth: void 0,
lineStringDash: void 0
});
return e.type === "Feature" && e.geometry.type === "Polygon" && e.properties.mode === this.mode ? (n.polygonFillColor = this.getHexColorStylingValue(this.styles.fillColor, n.polygonFillColor, e), n.polygonOutlineColor = this.getHexColorStylingValue(this.styles.outlineColor, n.polygonOutlineColor, e), n.polygonOutlineWidth = this.getNumericStylingValue(this.styles.outlineWidth, n.polygonOutlineWidth, e), n.polygonOutlineOpacity = this.getNumericStylingValue(this.styles.outlineOpacity, 1, e), n.polygonFillOpacity = this.getNumericStylingValue(this.styles.fillOpacity, n.polygonFillOpacity, e), n.zIndex = u, n) : n;
}
validateFeature(e) {
return this.validateModeFeature(e, (e) => he(e, this.coordinatePrecision));
}
updateCircle(e, t) {
if (this.currentCircleId === void 0 || this.center === void 0) return;
let r = t === o.Finish, i, a;
if (this.cursorMovedAfterInitialCursorDown) if (a = y(this.center, e), this.projection === "web-mercator") {
let t = function(e, t) {
let n = 1e3 * y(e, t);
if (n === 0) return 1;
let { x: r, y: i } = T(e[0], e[1]), { x: a, y: o } = T(t[0], t[1]);
return Math.sqrt((a - r) ** 2 + (o - i) ** 2) / n;
}(this.center, e);
i = function(e) {
let { center: t, radiusKilometers: n, coordinatePrecision: r } = e, i = e.steps ? e.steps : 64, a = 1e3 * n, [o, s] = t, { x: c, y: l } = T(o, s), u = [];
for (let e = 0; e < i; e++) {
let t = 360 * e / i * Math.PI / 180, n = a * Math.cos(t), o = a * Math.sin(t), [s, d] = [c + n, l + o], { lng: f, lat: p } = E(s, d);
u.push([C(f, r), C(p, r)]);
}
return u.push(u[0]), {
type: "Feature",
geometry: {
type: "Polygon",
coordinates: [u]
},
properties: {}
};
}({
center: this.center,
radiusKilometers: a * t,
coordinatePrecision: this.coordinatePrecision,
steps: this.segments
});
} else {
if (this.projection !== "globe") throw Error("Invalid projection");
i = ie({
center: this.center,
radiusKilometers: a,
coordinatePrecision: this.coordinatePrecision,
steps: this.segments
});
}
let s = {};
return i && a && (s.radiusKilometers = a), r && (s[l.CURRENTLY_DRAWING] = void 0), this.mutateFeature.updatePolygon({
featureId: this.currentCircleId,
coordinateMutations: i ? {
type: j,
coordinates: i.geometry.coordinates
} : void 0,
propertyMutations: s,
context: r ? {
updateType: t,
action: n
} : { updateType: t }
});
}
afterFeatureUpdated(e) {
this.currentCircleId === e.id && (this.cursorMovedAfterInitialCursorDown = !1, this.center = void 0, this.currentCircleId = void 0, this.drawType = void 0, this.state === "drawing" && this.setStarted());
}
registerBehaviors(e) {
this.mutateFeature = new M(e, { validate: this.validate });
}
}, N = (e, t) => {
let { x: n, y: r } = e, { x: i, y: a } = t, o = i - n, s = a - r;
return Math.sqrt(s * s + o * o);
};
function xe(e, t) {
return e[0] === t[0] && e[1] === t[1];
}
var P = class extends D {
constructor(e) {
super(e);
}
getGeometryType(e) {
return this.store.getGeometryCopy(e).type;
}
coordinateAtIndexIsIdentical({ featureId: e, newCoordinate: t, index: n }) {
let r = this.store.getGeometryCopy(e), i;
if (r.type === "Polygon") i = r.coordinates[0][n];
else if (r.type === "LineString") i = r.coordinates[n];
else {
if (n !== 0) throw Error("Point geometries only have one coordinate at index 0");
i = r.coordinates;
}
return xe(t, i);
}
getGeometry(e) {
return this.store.getGeometryCopy(e);
}
getCoordinates(e) {
let { type: t, coordinates: n } = this.store.getGeometryCopy(e);
return t === "Polygon" ? n[0] : n;
}
getCoordinate(e, t) {
let n = this.getCoordinates(e), r = t < 0 ? n.length + t : t;
if (r < 0 || r >= n.length) throw RangeError(`Index ${t} (normalized to ${r}) is out of bounds`);
return n[r];
}
getProperties(e) {
return this.store.getPropertiesCopy(e);
}
hasFeature(e) {
return this.store.has(e);
}
getAllFeatureIdsWhere(e) {
return this.store.copyAllWhere(e).map(({ id: e }) => e);
}
}, Se = {
cancel: "Escape",
finish: "Enter"
}, Ce = {
start: "crosshair",
close: "pointer"
}, we = class extends _ {
constructor(e) {
super(e, !0), this.mode = "freehand", this.canClose = !1, this.currentId = void 0, this.closingPointId = void 0, this.minDistance = 20, this.keyEvents = Se, this.cursors = Ce, this.preventPointsNearClose = !0, this.autoClose = !1, this.autoCloseTimeout = 500, this.hasLeftStartingPoint = !1, this.preventNewFeature = !1, this.drawInteraction = "click-move", this.drawType = void 0, this.smoothing = 0, this.mutateFeature = void 0, this.readFeature = void 0, this.updateOptions(e);
}
updateOptions(e) {
super.updateOptions(e), e != null && e.minDistance && (this.minDistance = e.minDistance), e?.smoothing !== void 0 && (this.smoothing = Math.min(Math.max(e.smoothing, 0), .999)), e?.preventPointsNearClose !== void 0 && (this.preventPointsNearClose = e.preventPointsNearClose), e?.autoClose !== void 0 && (this.autoClose = e.autoClose), e != null && e.autoCloseTimeout && (this.autoCloseTimeout = e.autoCloseTimeout), e?.keyEvents === null ? this.keyEvents = {
cancel: null,
finish: null
} : e != null && e.keyEvents && (this.keyEvents = t({}, this.keyEvents, e.keyEvents)), e != null && e.cursors && (this.cursors = t({}, this.cursors, e.cursors)), e != null && e.drawInteraction && (this.drawInteraction = e.drawInteraction);
}
moveDrawAllowed() {
return this.drawInteraction === "click-move" || this.drawInteraction === "click-move-or-drag";
}
dragDrawAllowed() {
return this.drawInteraction === "click-drag" || this.drawInteraction === "click-move-or-drag";
}
beginDrawing(e, t = "click") {
let { id: n } = this.mutateFeature.createPolygon({
coordinates: [
[e.lng, e.lat],
[e.lng, e.lat],
[e.lng, e.lat],
[e.lng, e.lat]
],
properties: {
mode: this.mode,
[l.CURRENTLY_DRAWING]: !0
}
});
this.currentId = n, this.drawType = t, this.closingPointId = this.mutateFeature.createGuidancePoint({
coordinate: [e.lng, e.lat],
type: l.CLOSING_POINT
}), this.canClose = !0, this.state !== "drawing" && this.setDrawing();
}
addCoordinate(e) {
if (this.currentId === void 0 || !1 === this.canClose) return void this.setCursor(this.cursors.start);
let [t, n] = this.readFeature.getCoordinate(this.currentId, -2), { x: r, y: i } = this.project(t, n), a = N({
x: r,
y: i
}, {
x: e.containerX,
y: e.containerY
}), [s, c] = this.readFeature.getCoordinate(this.currentId, 0), { x: l, y: u } = this.project(s, c);
if (N({
x: l,
y: u
}, {
x: e.containerX,
y: e.containerY
}) < this.pointerDistance) {
if (this.autoClose && this.hasLeftStartingPoint && (this.preventNewFeature = !0, setTimeout(() => {
this.preventNewFeature = !1;
}, this.autoCloseTimeout), this.close()), this.setCursor(this.cursors.close), this.preventPointsNearClose) return;
} else this.hasLeftStartingPoint = !0, this.setCursor(this.cursors.start);
if (a < this.minDistance) return;
let d = this.getSmoothedCoordinate([t, n], [e.lng, e.lat]);
this.mutateFeature.updatePolygon({
featureId: this.currentId,
coordinateMutations: [{
type: _e,
index: -1,
coordinate: d
}],
context: { updateType: o.Provisional }
});
}
getSmoothedCoordinate(e, t) {
if (this.smoothing === 0) return t;
let [n, r] = e, [i, a] = t;
return [n * this.smoothing + i * (1 - this.smoothing), r * this.smoothing + a * (1 - this.smoothing)];
}
close() {
if (this.currentId === void 0 || !this.mutateFeature.updatePolygon({
featureId: this.currentId,
propertyMutations: { [l.CURRENTLY_DRAWING]: void 0 },
context: {
updateType: o.Finish,
action: n
}
})) return;
let e = this.currentId;
this.mutateFeature.deleteFeatureIfPresent(this.closingPointId), this.canClose = !1, this.currentId = void 0, this.closingPointId = void 0, this.hasLeftStartingPoint = !1, this.drawType = void 0, this.state === "drawing" && this.setStarted(), this.onFinish(e, {
mode: this.mode,
action: n
});
}
start() {
this.setStarted(), this.setCursor(this.cursors.start);
}
stop() {
this.cleanUp(), this.setStopped(), this.setCursor("unset");
}
onMouseMove(e) {
this.moveDrawAllowed() && this.drawType === "click" && this.addCoordinate(e);
}
onClick(e) {
if (this.moveDrawAllowed() && (e.button === "right" && this.allowPointerEvent(this.pointerEvents.rightClick, e) || e.button === "left" && this.allowPointerEvent(this.pointerEvents.leftClick, e) || e.isContextMenu && this.allowPointerEvent(this.pointerEvents.contextMenu, e))) {
if (this.preventNewFeature) return;
if (!1 === this.canClose) return void this.beginDrawing(e);
this.close();
}
}
onKeyDown() {}
onKeyUp(e) {
e.key === this.keyEvents.cancel ? this.cleanUp() : e.key === this.keyEvents.finish && !0 === this.canClose && this.close();
}
onDragStart(e, t) {
this.state !== "drawing" && (this.preventNewFeature || this.allowPointerEvent(this.pointerEvents.onDragStart, e) && this.dragDrawAllowed() && (this.beginDrawing(e, "drag"), t(!1)));
}
onDrag(e, t) {
this.allowPointerEvent(this.pointerEvents.onDrag, e) && this.dragDrawAllowed() && this.drawType === "drag" && this.addCoordinate(e);
}
onDragEnd(e, t) {
this.allowPointerEvent(this.pointerEvents.onDragEnd, e) && this.dragDrawAllowed() && this.drawType === "drag" && (this.preventNewFeature = !0, setTimeout(() => {
this.preventNewFeature = !1;
}, this.autoCloseTimeout), this.close(), t(!0));
}
cleanUp() {
let e = this.currentId, t = this.closingPointId;
this.closingPointId = void 0, this.currentId = void 0, this.canClose = !1, this.hasLeftStartingPoint = !1, this.drawType = void 0, this.state === "drawing" && this.setStarted(), this.mutateFeature.deleteFeatureIfPresent(e), this.mutateFeature.deleteFeatureIfPresent(t);
}
styleFeature(e) {
let n = t({}, {
polygonFillColor: "#3f97e0",
polygonOutlineColor: "#3f97e0",
polygonOutlineWidth: 4,
polygonOutlineOpacity: 1,
polygonFillOpacity: .3,
pointColor: "#3f97e0",
pointOpacity: 1,
pointOutlineColor: "#ffffff",
pointOutlineOpacity: 1,
pointOutlineWidth: 0,
pointWidth: 6,
lineStringColor: "#3f97e0",
lineStringWidth: 4,
lineStringOpacity: 1,
zIndex: 0,
markerUrl: void 0,
markerHeight: void 0,
markerWidth: void 0,
lineStringDash: void 0
});
return e.type === "Feature" && e.geometry.type === "Polygon" && e.properties.mode === this.mode ? (n.polygonFillColor = this.getHexColorStylingValue(this.styles.fillColor, n.polygonFillColor, e), n.polygonOutlineColor = this.getHexColorStylingValue(this.styles.outlineColor, n.polygonOutlineColor, e), n.polygonOutlineOpacity = this.getNumericStylingValue(this.styles.outlineOpacity, 1, e), n.polygonOutlineWidth = this.getNumericStylingValue(this.styles.outlineWidth, n.polygonOutlineWidth, e), n.polygonFillOpacity = this.getNumericStylingValue(this.styles.fillOpacity, n.polygonFillOpacity, e), n.zIndex = u, n) : e.type === "Feature" && e.geometry.type === "Point" && e.properties.mode === this.mode ? (n.pointWidth = this.getNumericStylingValue(this.styles.closingPointWidth, n.pointWidth, e), n.pointColor = this.getHexColorStylingValue(this.styles.closingPointColor, n.pointColor, e), n.pointOpacity = this.getNumericStylingValue(this.styles.closingPointOpacity, n.pointOpacity === void 0 ? 1 : n.pointOpacity, e), n.pointOutlineColor = this.getHexColorStylingValue(this.styles.closingPointOutlineColor, n.pointOutlineColor, e), n.pointOutlineWidth = this.getNumericStylingValue(this.styles.closingPointOutlineWidth, 2, e), n.pointOutlineOpacity = this.getNumericStylingValue(this.styles.closingPointOutlineOpacity, n.pointOutlineOpacity === void 0 ? 1 : n.pointOutlineOpacity, e), n.zIndex = 50, n) : n;
}
validateFeature(e) {
return this.validateModeFeature(e, (e) => me(e, this.coordinatePrecision));
}
afterFeatureUpdated(e) {
this.currentId === e.id && (this.mutateFeature.deleteFeatureIfPresent(this.closingPointId), this.canClose = !1, this.currentId = void 0, this.closingPointId = void 0, this.hasLeftStartingPoint = !1);
}
registerBehaviors(e) {
this.readFeature = new P(e), this.mutateFeature = new M(e, { validate: this.validate });
}
};
function Te({ unproject: e, point: t, pointerDistance: n }) {
let r = n / 2, { x: i, y: a } = t;
return {
type: "Feature",
properties: {},
geometry: {
type: "Polygon",
coordinates: [[
e(i - r, a - r),
e(i + r, a - r),
e(i + r, a + r),
e(i - r, a + r),
e(i - r, a - r)
].map((e) => [e.lng, e.lat])]
}
};
}
var Ee = class extends D {
constructor(e) {
super(e);
}
create(e) {
let { containerX: t, containerY: n } = e;
return Te({
unproject: this.unproject,
point: {
x: t,
y: n
},
pointerDistance: this.pointerDistance
});
}
}, F = class extends D {
constructor(e) {
super(e);
}
measure(e, t) {
let { x: n, y: r } = this.project(t[0], t[1]);
return N({
x: n,
y: r
}, {
x: e.containerX,
y: e.containerY
});
}
}, De = class extends D {
constructor(e, t, n) {
super(e), this.config = void 0, this.pixelDistance = void 0, this.clickBoundingBox = void 0, this.getSnappableCoordinateFirstClick = (e) => this.getSnappable(e, (e) => !!(e.properties && e.properties.mode === this.mode)).coordinate, this.getSnappableCoordinate = (e, t) => this.getSnappable(e, (e) => !!(e.properties && e.properties.mode === this.mode && e.id !== t)).coordinate, this.config = e, this.pixelDistance = t, this.clickBoundingBox = n;
}
getSnappable(e, t) {
let n = this.clickBoundingBox.create(e), r = this.store.search(n, t), i = {
featureId: void 0,
featureCoordinateIndex: void 0,
coordinate: void 0,
minDist: Infinity
};
return r.forEach((t) => {
let n;
if (t.geometry.type === "Polygon") n = t.geometry.coordinates[0];
else {
if (t.geometry.type !== "LineString") return;
n = t.geometry.coordinates;
}
n.forEach((n, r) => {
let a = this.pixelDistance.measure(e, n);
a < i.minDist && a < this.pointerDistance && (i.coordinate = n, i.minDist = a, i.featureId = t.id, i.featureCoordinateIndex = r);
});
}), i;
}
};
function Oe(e, t, n) {
let r = x(e[0]), i = x(e[1]), a = x(n), o = ee(t), s = Math.asin(Math.sin(i) * Math.cos(o) + Math.cos(i) * Math.sin(o) * Math.cos(a));
return [S(r + Math.atan2(Math.sin(a) * Math.sin(o) * Math.cos(i), Math.cos(o) - Math.sin(i) * Math.sin(s))), S(s)];
}
function ke({ x: e, y: t }, n, r) {
let i = x(r);
return {
x: e + n * Math.cos(i),
y: t + n * Math.sin(i)
};
}
function Ae(e, t) {
let n = x(e[0]), r = x(t[0]), i = x(e[1]), a = x(t[1]), o = Math.sin(r - n) * Math.cos(a), s = Math.cos(i) * Math.sin(a) - Math.sin(i) * Math.cos(a) * Math.cos(r - n);
return S(Math.atan2(o, s));
}
function I({ x: e, y: t }, { x: n, y: r }) {
let i = n - e, a = r - t;
if (i === 0 && a === 0) return 0;
let o = Math.atan2(a, i);
return o *= 180 / Math.PI, o > 180 ? o -= 360 : o < -180 && (o += 360), o;
}
function L(e) {
return (e + 360) % 360;
}
function je(e, t, n) {
let r = [], i = e.length, a, o, s, c = 0;
for (let i = 0; i < e.length && !(t >= c && i === e.length - 1); i++) {
if (c > t && r.length === 0) {
if (a = t - c, !a) return r.push(e[i]), r;
o = Ae(e[i], e[i - 1]) - 180, s = Oe(e[i], a, o), r.push(s);
}
if (c >= n) return a = n - c, a ? (o = Ae(e[i], e[i - 1]) - 180, s = Oe(e[i], a, o), r.push(s), r) : (r.push(e[i]), r);
if (c >= t && r.push(e[i]), i === e.length - 1) return r;
c += y(e[i], e[i + 1]);
}
if (c < t && e.length === i) throw Error("Start position is beyond line");
let l = e[e.length - 1];
return [l, l];
}
function Me(e) {
return Math.PI / 180 * e;
}
function Ne(e) {
return 180 / Math.PI * e;
}
var Pe = class extends D {
constructor(e) {
super(e), this.config = void 0, this.config = e;
}
generateInsertionCoordinates(e, t, n) {
let r = [e, t], i = 0;
for (let e = 0; e < r.length - 1; e++) i += y(r[0], r[1]);
if (i <= n) return r;
let a = i / n - 1;
Number.isInteger(a) || (a = Math.floor(a) + 1);
let o = [];
for (let e = 0; e < a; e++) {
let t = je(r, n * e, n * (e + 1));
o.push(t);
}
let s = [];
for (let e = 0; e < o.length; e++) s.push(o[e][1]);
return this.limitCoordinates(s);
}
generateInsertionGeodesicCoordinates(e, t, n) {
let r = y(e, t), i = function(e, t, n) {
let r = [], i = Me(e[1]), a = Me(e[0]), o = Me(t[1]), s = Me(t[0]);
n += 1;
let c = 2 * Math.asin(Math.sqrt(Math.sin((o - i) / 2) ** 2 + Math.cos(i) * Math.cos(o) * Math.sin((s - a) / 2) ** 2));
if (c === 0 || isNaN(c)) return r;
for (let e = 0; e <= n; e++) {
let t = e / n, l = Math.sin((1 - t) * c) / Math.sin(c), u = Math.sin(t * c) / Math.sin(c), d = l * Math.cos(i) * Math.cos(a) + u * Math.cos(o) * Math.cos(s), f = l * Math.cos(i) * Math.sin(a) + u * Math.cos(o) * Math.sin(s), p = l * Math.sin(i) + u * Math.sin(o);
if (isNaN(d) || isNaN(f) || isNaN(p)) continue;
let m = Math.atan2(p, Math.sqrt(d ** 2 + f ** 2)), h = Math.atan2(f, d);
isNaN(m) || isNaN(h) || r.push([Ne(h), Ne(m)]);
}
return r.slice(1, -1);
}(e, t, Math.floor(r / n));
return this.limitCoordinates(i);
}
limitCoordinates(e) {
return e.map((e) => [C(e[0], this.config.coordinatePrecision), C(e[1], this.config.coordinatePrecision)]);
}
};
function Fe(e, t) {
if (e.geometry.type !== "LineString") return {
valid: !1,
reason: "Feature is not a LineString"
};
if (e.geometry.coordinates.length < 2) return {
valid: !1,
reason: "Feature has less than 2 coordinates"
};
for (let n = 0; n < e.geometry.coordinates.length; n++) {
if (!ce(e.geometry.coordinates[n])) return {
valid: !1,
reason: "Feature has invalid coordinates"
};
if (!se(e.geometry.coordinates[n], t)) return {
valid: !1,
reason: "Feature has coordinates with excessive precision"
};
}
return { valid: !0 };
}
function Ie(e) {
return Math.sqrt(e[0] ** 2 + e[1] ** 2 + e[2] ** 2);
}
function R(e, t) {
let n = function(e, t) {
let [n, r, i] = e, [a, o, s] = t;
return n * a + r * o + i * s;
}(e, t) / (Ie(e) * Ie(t));
return Math.acos(Math.min(Math.max(n, -1), 1));
}
function Le(e) {
let t = x(e[1]), n = x(e[0]);
return [
Math.cos(t) * Math.cos(n),
Math.cos(t) * Math.sin(n),
Math.sin(t)
];
}
function z(e) {
let [t, n, r] = e, i = S(Math.asin(r));
return [S(Math.atan2(n, t)), i];
}
function Re(e, t, n) {
let r = Le(e), i = Le(t), [a, o, s] = Le(n), [c, l, u] = function(e, t) {
let [n, r, i] = e, [a, o, s] = t;
return [
r * s - i * o,
i * a - n * s,
n * o - r * a
];
}(r, i), d = l * s - u * o, f = u * a - c * s, p = c * o - l * a, m = p * l - f * u, h = d * u - p * c, g = f * c - d * l, _ = 1 / Math.sqrt(m ** 2 + h ** 2 + g ** 2), v = [
m * _,
h * _,
g * _
], b = [
-1 * m * _,
-1 * h * _,
-1 * g * _
], x = R(r, i), ee = R(r, v), S = R(i, v), C = R(r, b), te = R(i, b), w;
return w = ee < C && ee < te || S < C && S < te ? v : b, R(r, w) > x || R(i, w) > x ? y(z(w), z(r)) <= y(z(w), z(i)) ? [
z(r),
!0,
!1
] : [
z(i),
!1,
!0
] : [
z(w),
!1,
!1
];
}
function ze(e, t, n) {
let r = t.x - e.x, i = t.y - e.y, a = Math.max(0, Math.min(1, ((n.x - e.x) * r + (n.y - e.y) * i) / (r * r + i * i)));
return {
x: e.x + a * r,
y: e.y + a * i
};
}
var Be = class extends D {
constructor(e, t, n) {
super(e), this.config = void 0, this.pixelDistance = void 0, this.clickBoundingBox = void 0, this.getSnappableCoordinateFirstClick = (e) => {
let t = this.getSnappable(e, (e) => !!(e.properties && e.properties.mode === this.mode));
return t.coordinate ? [C(t.coordinate[0], this.config.coordinatePrecision), C(t.coordinate[1], this.config.coordinatePrecision)] : void 0;
}, this.getSnappableCoordinate = (e, t) => {
let n = this.getSnappable(e, (e) => !!(e.properties && e.properties.mode === this.mode && e.id !== t));
return n.coordinate ? [C(n.coordinate[0], this.config.coordinatePrecision), C(n.coordinate[1], this.config.coordinatePrecision)] : void 0;
}, this.config = e, this.pixelDistance = t, this.clickBoundingBox = n;
}
getSnappable(e, t) {
let n = this.clickBoundingBox.create(e), r = this.store.search(n, t), i = {
featureId: void 0,
featureCoordinateIndex: void 0,
coordinate: void 0,
minDistance: Infinity
};
return r.forEach((t) => {
let n;
if (t.geometry.type === "Polygon") n = t.geometry.coordinates[0];
else {
if (t.geometry.type !== "LineString") return;
n = t.geometry.coordinates;
}
let r = [];
for (let e = 0; e < n.length - 1; e++) r.push([n[e], n[e + 1]]);
let a, o = [e.lng, e.lat];
if (this.config.projection === "web-mercator" ? a = function(e, t) {
let n = [Infinity, Infinity], r = Infinity, i = 0;
for (let a of t) {
let o = a[0], s = a[1], c, l = Infinity, u = T(o[0], o[1]), d = T(s[0], s[1]), f = T(e[0], e[1]);
if (o[0] === e[0] && o[1] === e[1]) c = o;
else if (s[0] === e[0] && s[1] === e[1]) c = s;
else {
let { x: e, y: t } = ze(u, d, f), { lng: n, lat: r } = E(e, t);
c = [n, r];
}
c && (l = N(f, T(c[0], c[1])), l < r && (n = c, r = l, i = t.indexOf(a)));
}
return r === Infinity ? void 0 : {
coordinate: n,
lineIndex: i,
distance: r
};
}(o, r) : this.config.projection === "globe" && (a = function(e, t) {
let n = [Infinity, Infinity], r = Infinity, i = 0;
for (let a of t) {
let o = a[0], s = a[1], c, l = Infinity;
o[0] === e[0] && o[1] === e[1] ? c = o : s[0] === e[0] && s[1] === e[1] ? c = s : [c] = Re(o, s, e), c && (l = y(e, c), l < r && (n = c, r = l, i = t.indexOf(a)));
}
return r === Infinity ? void 0 : {
coordinate: n,
distance: r,
lineIndex: i
};
}(o, r)), !a) return;
let s = this.pixelDistance.measure(e, a.coordinate);
s < i.minDistance && s < this.pointerDistance && (i.featureId = t.id, i.coordinate = [C(a.coordinate[0], this.config.coordinatePrecision), C(a.coordinate[1], this.config.coordinatePrecision)], i.featureCoordinateIndex = a.lineIndex, i.minDistance = s);
}), i;
}
};
function Ve(e) {
return Array.isArray(e) && e.length > 0 && Array.isArray(e[0]) && Array.isArray(e[0][0]);
}
var He = (e) => Ve(e) ? e[0].slice(0, -1) : e, Ue = (e) => Ve(e) ? e[0] : e, We = class extends D {
constructor(e, t, n, r) {
super(e), this.config = void 0, this.pixelDistance = void 0, this.mutateFeatureBehavior = void 0, this.readFeatureBehavior = void 0, this._startEndPoints = [], this.config = e, this.pixelDistance = t, this.mutateFeatureBehavior = n, this.readFeatureBehavior = r;
}
get ids() {
return this._startEndPoints.concat();
}
set ids(e) {}
create(e) {
if (this.ids.length) throw Error("Opening and closing points already created");
let t = Ve(e), n = Ue(e);
if (t) {
if (n.length <= 3) throw Error("Requires at least 4 coordinates");
this._startEndPoints = this.mutateFeatureBehavior.createGuidancePoints({
coordinates: [n[0], n[n.length - 2]],
type: l.CLOSING_POINT
});
} else this._startEndPoints = [this.mutateFeatureBehavior.createGuidancePoint({
coordinate: n[n.length - 2],
type: l.CLOSING_POINT
})];
}
delete() {
this.ids.length && (this.mutateFeatureBehavior.deleteFeaturesIfPresent(this.ids), this._startEndPoints = []);
}
updateOne(e, t) {
this.mutateFeatureBehavior.updateGuidancePoints([{
featureId: this.ids[e],
coordinate: t
}]);
}
update(e) {
let t = Ue(e);
this.ids.length === 1 ? this.mutateFeatureBehavior.updateGuidancePoints([{
featureId: this.ids[0],
coordinate: t[t.length - 2]
}]) : this.ids.length === 2 && this.mutateFeatureBehavior.updateGuidancePoints([{
featureId: this.ids[0],
coordinate: t[0]
}, {
featureId: this.ids[1],
coordinate: t[t.length - 3]
}]);
}
isLineStringClosingPoint(e) {
if (this.ids.length !== 1) return { isClosing: !1 };
let t = this.readFeatureBehavior.getGeometry(this.ids[0]);
return { isClosing: this.pixelDistance.measure(e, t.coordinates) < this.pointerDistance };
}
isPolygonClosingPoints(e) {
if (this.ids.length !== 2) return {
isClosing: !1,
isPreviousClosing: !1
};
let t = this.readFeatureBehavior.getGeometry(this.ids[0]), n = this.readFeatureBehavior.getGeometry(this.ids[1]), r = this.pixelDistance.measure(e, t.coordinates), i = this.pixelDistance.measure(e, n.coordinates);
return {
isClosing: r < this.pointerDistance,
isPreviousClosing: i < this.pointerDistance
};
}
}, Ge = class extends D {
constructor(e, t, n) {
super(e), this.readFeature = void 0, this.mutateFeature = void 0, this.readFeature = t, this.mutateFeature = n;
}
createOrUpdate({ featureId: e, featureCoordinates: t }) {
if (!this.readFeature.hasFeature(e)) return void this.deleteOrphanedPoints(e);
let n = He(t), r = this.readFeature.getProperties(e), i = r.coordinatePointIds;
if (i) if (i && i.every((e) => this.readFeature.hasFeature(e))) {
let t = r.coordinatePointIds, i = t.map((e) => this.readFeature.getGeometry(e).coordinates);
if (t.length !== n.length) {
this.deleteCoordinatePoints(t);
let i = this.createPoints(n, r.mode, e);
this.setFeatureCoordinatePoints(e, i);
} else {
let e = [];
n.forEach((n, r) => {
n[0] === i[r][0] && n[1] === i[r][1] || e.push({
featureId: t[r],
coordinate: n
});
}), this.mutateFeature.updateGuidancePoints(e);
}
} else {
let t = i.filter((e) => this.readFeature.hasFeature(e));
t.length && this.deleteCoordinatePoints(t);
let a = this.createPoints(n, r.mode, e);
this.setFeatureCoordinatePoints(e, a);
}
else {
let t = this.createPoints(n, r.mode, e);
this.setFeatureCoordinatePoints(e, t);
}
}
deletePointsByFeatureIds(e) {
for (let t of e) this.deleteIfPresent(t);
}
updateOneAtIndex(e, t, n) {
let r = this.readFeature.getProperties(e).coordinatePointIds;
r && r.length !== 0 && r[t] !== void 0 && this.mutateFeature.updateGuidancePoints([{
featureId: r[t],
coordinate: n
}]);
}
updateAllInPlace({ featureId: e, featureCoordinates: t }) {
let n = this.readFeature.getProperties(e);
if (!n.coordinatePointIds) return;
let r = He(t);
r.length === n.coordinatePointIds.length && this.mutateFeature.updateGuidancePoints(n.coordinatePointIds.map((e, t) => ({
featureId: e,
coordinate: r[t]
})));
}
createPoints(e, t, n) {
return this.mutateFeature.createGuidancePoints({
coordinates: e,
type: l.COORDINATE_POINT,
additionalProperties: (e) => ({
mode: t,
[l.COORDINATE_POINT]: !0,
[l.COORDINATE_POINT_FEATURE_ID]: n,
index: e
})
});
}
setFeatureCoordinatePoints(e, t, n = o.Commit) {
let r = this.readFeature.getGeometryType(e), i = {
featureId: e,
propertyMutations: { [l.COORDINATE_POINT_IDS]: t },
context: { updateType: n }
};
if (r === "Polygon") this.mutateFeature.updatePolygon(i);
else {
if (r !== "LineString") throw Error("Unsupported geometry type for coordinate points");
this.mutateFeature.updateLineString(i);
}
}
deleteCoordinatePoints(e) {
this.mutateFeature.deleteFeaturesIfPresent(e);
}
deleteIfPresent(e) {
if (!this.readFeature.hasFeature(e)) return;
let t = this.readFeature.getProperties(e).coordinatePointIds;
t && (this.deleteCoordinatePoints(t), this.setFeatureCoordinatePoints(e, null));
}
deleteOrphanedPoints(e) {
let t = this.readFeature.getAllFeatureIdsWhere((t) => t[l.COORDINATE_POINT_FEATURE_ID] === e);
this.mutateFeature.deleteFeaturesIfPresent(t);
}
}, Ke = class {
constructor(e) {
this.undoHistory = [], this.redoHistory = [], this.cloneCoordinatesFunction = void 0, this.maxStackSize = void 0, this.cloneCoordinatesFunction = (e) => this.cloneRecursively(e);
let t = e?.maxStackSize;
this.maxStackSize = t !== void 0 && Number.isFinite(t) ? Math.max(0, Math.floor(t)) : Infinity;
}
setMaxStackSize(e) {
Number.isFinite(e) ? (this.maxStackSize = Math.max(0, Math.floor(e)), this.trimHistoryToMax(this.undoHistory), this.trimHistoryToMax(this.redoHistory)) : this.maxStackSize = Infinity;
}
trimHistoryToMax(e) {
if (Number.isFinite(this.maxStackSize)) for (; e.length > this.maxStackSize;) e.shift();
}
pushUndoEntry(e) {
this.maxStackSize !== 0 && (this.undoHistory.push(e), this.trimHistoryToMax(this.undoHistory));
}
pushRedoEntry(e) {
this.maxStackSize !== 0 && (this.redoHistory.push(e), this.trimHistoryToMax(this.redoHistory));
}
cloneRecursively(e) {
return Array.isArray(e) ? e.map((e) => this.cloneRecursively(e)) : typeof e == "object" && e ? t({}, e) : e;
}
cloneCoordinates(e) {
return this.cloneCoordinatesFunction(e);
}
cloneEntry(e) {
return {
featureCoordinates: this.cloneCoordinates(e.featureCoordinates),
currentCoordinate: e.currentCoordinate
};
}
clear() {
this.undoHistory = [], this.redoHistory = [];
}
undoSize() {
return this.undoHistory.length;
}
redoSize() {
return this.redoHistory.length;
}
recordSnapshot(e) {
this.pushUndoEntry(this.cloneEntry(e)), this.redoHistory = [];
}
beginUndo() {
let e = this.undoHistory.pop();
if (!e) return;
let t = this.cloneEntry(e);
this.pushRedoEntry(t);
let n = this.undoHistory[this.undoHistory.length - 1];
return {
undoneEntry: t,
previousEntry: n ? this.cloneEntry(n) : void 0
};
}
takeRedo() {
let e = this.redoHistory.pop();
if (e) return this.cloneEntry(e);
}
commitRedo(e) {
this.pushUndoEntry(this.cloneEntry(e));
}
}, qe = {
cancel: "Escape",
finish: "Enter"
}, Je = {
start: "crosshair",
close: "pointer",
dragStart: "grabbing",
dragEnd: "crosshair"
}, Ye = class extends _ {
constructor(e) {
super(e, !0), this.mode = "linestring", this.currentCoordinate = 0, this.currentId = void 0, this.keyEvents = qe, this.snapping = void 0, this.cursors = Je, this.mouseMove = !1, this.insertCoordinates = void 0, this.lastCommittedCoordinates = void 0, this.snappedPointId = void 0, this.lastMouseMoveEvent = void 0, this.showCoordinatePoints = !1, this.finishOnNthCoordinate = void 0, this.editable = !1, this.editedFeatureId = void 0, this.editedFeatureCoordinateIndex = void 0, this.editedSnapType = void 0, this.editedInsertIndex = void 0, this.editedPointId = void 0, this.coordinateSnapping = void 0, this.insertPoint = void 0, this.lineSnapping = void 0, this.pixelDistance = void 0, this.clickBoundingBox = void 0, this.mutateFeature = void 0, this.readFeature = void 0, this.closingPoints = void 0, this.coordinatePoints = void 0, this.undoRedo = void 0, this.updateOptions(e);
}
updateOptions(e) {
if (super.updateOptions(e), e?.finishOnNthCoordinate !== void 0 && Number.isInteger(e.finishOnNthCoordinate) && e.finishOnNthCoordinate > 1 && (this.finishOnNthCoordinate = Math.floor(e.finishOnNthCoordinate)), e != null && e.cursors && (this.cursors = t({}, this.cursors, e.cursors)), e != null && e.snapping && (this.snapping = e.snapping), e?.keyEvents === null ? this.keyEvents = {
cancel: null,
finish: null
} : e != null && e.keyEvents && (this.keyEvents = t({}, this.keyEvents, e.keyEvents)), e != null && e.insertCoordinates && (this.insertCoordinates = e.insertCoordinates), e && e.editable && (this.editable = e.editable), e?.showCoordinatePoints !== void 0) {
if (this.showCoordinatePoints = e.showCoordinatePoints, this.coordinatePoints && !0 === e.showCoordinatePoints) this.store.copyAllWhere((e) => e.mode === this.mode).forEach((e) => {
this.coordinatePoints.createOrUpdate({
featureId: e.id,
featureCoordinates: e.geometry.coordinates
});
});
else if (this.coordinatePoints && !1 === this.showCoordinatePoints) {
let e = this.store.copyAllWhere((e) => e.mode === this.mode && !!e[l.COORDINATE_POINT_IDS]?.length);
this.coordinatePoints.deletePointsByFeatureIds(e.map((e) => e.id));
}
}
}
shouldFinishOnCommit(e) {
return !!this.finishOnNthCoordinate && Math.max(0, e.coordinates.length - 1) >= this.finishOnNthCoordinate;
}
updateSnappedCoordinate(e) {
let t = this.snapCoordinate(e);
return t ? (this.snappedPointId ? this.mutateFeature.updateGuidancePoints([{
featureId: this.snappedPointId,
coordinate: t
}]) : this.snappedPointId = this.mutateFeature.createGuidancePoint({
coordinate: t,
type: l.SNAPPING_POINT
}), e.lng = t[0], e.lat = t[1]) : this.snappedPointId &&= (this.mutateFeature.deleteFeatureIfPresent(this.snappedPointId), void 0), t;
}
close() {
if (this.currentId === void 0) return;
let e = this.mutateFeature.updateLineString({
featureId: this.currentId,
context: {
updateType: o.Finish,
action: n
},
coordinateMutations: [{
type: A,
index: -1
}],
propertyMutations: { [l.CURRENTLY_DRAWING]: void 0 }
});
if (!e) return;
this.showCoordinatePoints && this.coordinatePoints.createOrUpdate({
featureId: this.currentId,
featureCoordinates: e.geometry.coordinates
});
let t = this.currentId;
this.currentCoordinate = 0, this.currentId = void 0, this.lastCommittedCoordinates = void 0, this.undoRedo.clear(), this.state === "drawing" && this.setStarted(), this.closingPoints.delete(), this.snappedPointId &&= (this.mutateFeature.deleteFeatureIfPresent(this.snappedPointId), void 0), this.editedPointId && (this.mutateFeature.deleteFeatureIfPresent(this.editedPointId), this.editedPointId = void 0, this.editedFeatureId = void 0, this.editedFeatureCoordinateIndex = void 0, this.editedInsertIndex = void 0, this.editedSnapType = void 0), this.onFinish(t, {
mode: this.mode,
action: n
});
}
generateInsertCoordinates(e, t) {
if (!this.insertCoordinates || !this.lastCommittedCoordinates) throw Error("Not able to insert coordinates");
if (this.insertCoordinates.strategy !== "amount") throw Error("Strategy does not exist");
let n = y(e, t) / (this.insertCoordinates.value + 1), r = [];
return this.projection === "globe" ? r = this.insertPoint.generateInsertionGeodesicCoordinates(e, t, n) : this.projection === "web-mercator" && (r = this.insertPoint.generateInsertionCoordinates(e, t, n)), r;
}
createLine(e) {
let t = this.mutateFeature.createLineString({
coordinates: [e, e],
properties: {
mode: this.mode,
[l.CURRENTLY_DRAWING]: !0
}
});
this.lastCommittedCoordinates = t.geometry.coordinates, this.currentId = t.id, this.currentCoordinate++, this.pushHistorySnapshot(this.currentId, this.currentCoordinate), this.setDrawing(), this.showCoordinatePoints && this.coordinatePoints.createOrUpdate({
featureId: this.currentId,
featureCoordinates: t.geometry.coordinates
});
}
firstUpdateToLine(e) {
if (!this.currentId) return;
this.setCursor(this.cursors.close);
let t = this.mutateFeature.updateLineString({
featureId: this.currentId,
context: { updateType: o.Commit },
coordinateMutations: [{
type: O,
index: -1,
coordinate: e
}]
});
t && (this.closingPoints.create(t.geometry.coordinates), this.showCoordinatePoints && this.coordinatePoints.createOrUpdate({
featureId: this.currentId,
featureCoordinates: t.geometry.coordinates
}), this.lastCommittedCoordinates = t.geometry.coordinates, this.currentCoordinate++, this.pushHistorySnapshot(this.currentId, this.currentCoordinate), this.shouldFinishOnCommit(t.geometry) && this.close());
}
updateToLine(e, t) {
if (!this.currentId) return;
let { isClosing: n } = this.closingPoints.isLineStringClosingPoint(e);
if (n) return void this.close();
this.setCursor(this.cursors.close);
let r = this.mutateFeature.updateLineString({
featureId: this.currentId,
context: { updateType: o.Commit },
coordinateMutations: [{
type: O,
index: -1,
coordinate: t
}]
});
r && (this.closingPoints.update(r.geometry.coordinates), this.showCoordinatePoints && this.coordinatePoints.createOrUpdate({
featureId: this.currentId,
featureCoordinates: r.geometry.coordinates
}), this.lastCommittedCoordinates = r.geometry.coordinates, this.currentCoordinate++, this.pushHistorySnapshot(this.currentId, this.currentCoordinate), this.shouldFinishOnCommit(r.geometry) && this.close());
}
undoSize() {
return this.undoRedo.undoSize();
}
clearHistory() {
this.undoRedo.clear();
}
pushHistorySnapshot(e, t) {
let n = this.readFeature.getGeometry(e);
this.undoRedo.recordSnapshot({
featureCoordinates: n.coordinates,
currentCoordinate: t
});
}
updateSnappedGuidancePointFromLastMouseMove() {
this.snapping && this.lastMouseMoveEvent ? this.updateSnappedCoordinate(this.lastMouseMoveEvent) : this.snappedPointId &&= (this.mutateFeature.deleteFeatureIfPresent(this.snappedPointId), void 0);
}
syncClosingPoints(e) {
this.currentCoordinate >= 2 ? this.closingPoints.ids.length ? this.closingPoints.update(e) : this.closingPoints.create(e) : this.closingPoints.delete();
}
undo() {
if (this.state !== "drawing" || !this.currentId) return;
let e = this.undoRedo.beginUndo();
if (!e) return;
let { previousEntry: t } = e;
if (!t) {
let e = this.currentId;
this.currentId = void 0, this.currentCoordinate = 0, this.lastCommittedCoordinates = void 0, this.closingPoints.delete(), this.state === "drawing" && this.setStarted(), this.showCoordinatePoints && this.coordinatePoints.deletePointsByFeatureIds([e]), this.mutateFeature.deleteFeatureIfPresent(e), this.updateSnappedGuidancePointFromLastMouseMove();
return;
}
let n = this.mutateFeature.updateLineString({
featureId: this.currentId,
coordinateMutations: {
type: j,
coordinates: t.featureCoordinates
},
propertyMutations: { [l.CURRENTLY_DRAWING]: !0 },
context: { updateType: o.Commit }
});
n && (this.currentCoordinate = t.currentCoordinate, this.lastCommittedCoordinates = n.geometry.coordinates, this.syncClosingPoints(n.geometry.coordinates), this.showCoordinatePoints && this.coordinatePoints.createOrUpdate({
featureId: this.currentId,
featureCoordinates: n.geometry.coordinates
}), this.updateSnappedGuidancePointFromLastMouseMove());
}
redoSize() {
return this.undoRedo.redoSize();
}
redo() {
let e = this.undoRedo.takeRedo();
if (e) {
if (this.currentId) {
let t = this.mutateFeature.updateLineString({
featureId: this.currentId,
coordinateMutations: {
type: j,
coordinates: e.featureCoordinates
},
propertyMutations: { [l.CURRENTLY_DRAWING]: !0 },
context: { updateType: o.Commit }
});
if (!t) return;
this.currentCoordinate = e.currentCoordinate, this.lastCommittedCoordinates = t.geometry.coordinates, this.syncClosingPoints(t.geometry.coordinates), this.showCoordinatePoints && this.coordinatePoints.createOrUpdate({
featureId: this.currentId,
featureCoordinates: t.geometry.coordinates
});
} else {
let { id: t, geometry: n } = this.mutateFeature.createLineString({
coordinates: e.featureCoordinates,
properties: {
mode: this.mode,
[l.CURRENTLY_DRAWING]: !0
}
});
this.currentId = t, this.currentCoordinate = e.currentCoordinate, this.lastCommittedCoordinates = n.coordinates, this.state === "started" && this.setDrawing(), this.syncClosingPoints(n.coordinates), this.showCoordinatePoints && this.coordinatePoints.createOrUpdate({
featureId: t,
featureCoordinates: n.coordinates
});
}
this.undoRedo.commitRedo(e), this.updateSnappedGuidancePointFromLastMouseMove();
}
}
registerBehaviors(e) {
this.insertPoint = new Pe(e), this.clickBoundingBox = new Ee(e), this.pixelDistance = new F(e), this.lineSnapping = new Be(e, this.pixelDistance, this.clickBoundingBox), this.coordinateSnapping = new De(e, this.pixelDistance, this.clickBoundingBox), this.readFeature = new P(e), this.mutateFeature = new M(e, { validate: this.validate }), this.closingPoints = new We(e, this.pixelDistance, this.mutateFeature, this.readFeature), this.coordinatePoints = new Ge(e, this.readFeature, this.mutateFeature), this.undoRedo = new Ke({ maxStackSize: e.undoRedoMaxStackSize });
}
start() {
this.setStarted(), this.setCursor(this.cursors.start);
}
stop() {
this.cleanUp(), this.setStopped(), this.setCursor("unset");
}
onMouseMove(e) {
this.mouseMove = !0, this.setCursor(this.cursors.start), this.lastMouseMoveEvent = e;
let t = this.updateSnappedCoordinate(e) || [e.lng, e.lat];
if (this.currentId === void 0 || this.currentCoordinate === 0) return;
let { isClosing: n } = this.closingPoints.isLineStringClosingPoint(e);
n && this.setCursor(this.cursors.close);
let r = [{
type: k,
index: -1,
coordinate: t
}];
if (this.insertCoordinates) {
let e = this.getInsertCoordinates(t);
e && (r = {
type: j,
coordinates: e
});
}
let i = this.mutateFeature.updateLineString({
coordinateMutations: r,
featureId: this.currentId,
context: { updateType: o.Provisional }
});
i && this.showCoordinatePoints && this.coordinatePoints.createOrUpdate({
featureId: this.currentId,
featureCoordinates: i.geometry.coordinates
});
}
getInsertCoordinates(e) {
if (!this.lastCommittedCoordinates) return;
let t = this.lastCommittedCoordinates[this.lastCommittedCoordinates.length - 1];
if (xe(t, e)) return;
let n = this.generateInsertCoordinates(t, e);
return [
...this.lastCommittedCoordinates.slice(0, -1),
...n,
e
];
}
onRightClick(e) {
if (!this.editable || this.state !== "started") return;
let { featureId: t, featureCoordinateIndex: n } = this.coordinateSnapping.getSnappable(e, (e) => this.lineStringFilter(e));
if (!t || n === void 0) return;
let a = this.readFeature.getGeometry(t), s;
if (a.type !== "LineString" || (s = a.coordinates, s.length <= 2)) return;
let c = this.mutateFeature.updateLineString({
featureId: t,
coordinateMutations: [{
type: A,
index: n
}],
context: {
updateType: o.Finish,
action: r
}
});
c && this.showCoordinatePoints && this.coordinatePoints.createOrUpdate({
featureId: t,
featureCoordinates: c.geometry.coordinates
}), this.snappedPointId &&= (this.mutateFeature.deleteFeatureIfPresent(this.snappedPointId), void 0), this.editedPointId && (this.mutateFeature.deleteFeatureIfPresent(this.editedPointId), this.editedPointId = void 0, this.editedFeatureId = void 0, this.editedFeatureCoordinateIndex = void 0, this.editedInsertIndex = void 0, this.editedSnapType = void 0), this.closingPoints.delete(), this.onFinish(t, {
mode: this.mode,
action: i
});
}
onLeftClick(e) {
this.snappedPointId &&= (this.mutateFeature.deleteFeatureIfPresent(this.snappedPointId), void 0);
let t = this.snapCoordinate(e) || [e.lng, e.lat];
this.currentCoordinate === 0 ? this.createLine(t) : this.currentCoordinate === 1 && this.currentId ? this.firstUpdateToLine(t) : this.currentId && this.updateToLine(e, t);
}
onClick(e) {
this.currentId === void 0 || this.readFeature.hasFeature(this.currentId) || this.cleanUp(), (e.button === "right" && this.allowPointerEvent(this.pointerEvents.rightClick, e) || e.button === "left" && this.allowPointerEvent(this.pointerEvents.leftClick, e) || e.isContextMenu && this.allowPointerEvent(this.pointerEvents.contextMenu, e)) && (this.currentCoordinate > 0 && !this.mouseMove && this.onMouseMove(e), this.mouseMove = !1, e.button === "right" ? this.onRightClick(e) : e.button === "left" && this.onLeftClick(e));
}
onKeyDown() {}
onKeyUp(e) {
e.key === this.keyEvents.cancel && this.cleanUp(), e.key === this.keyEvents.finish && this.close();
}
onDragStart(e, t) {
if (!this.allowPointerEvent(this.pointerEvents.onDragStart, e) || !this.editable) return;
let n;
if (this.state === "started") {
let t = this.lineSnapping.getSnappable(e, (e) => this.lineStringFilter(e));
t.coordinate && (this.editedSnapType = "line", this.editedFeatureCoordinateIndex = t.featureCoordinateIndex, this.editedFeatureId = t.featureId, n = t.coordinate);
let r = this.coordinateSnapping.getSnappable(e, (e) => this.lineStringFilter(e));
r.coordinate && (this.editedSnapType = "coordinate", this.editedFeatureCoordinateIndex = r.featureCoordinateIndex, this.editedFeatureId = r.featureId, n = r.coordinate);
}
this.editedFeatureId && n && (this.editedPointId ||= this.mutateFeature.createGuidancePoint({
coordinate: n,
type: l.EDITED
}), this.setCursor(this.cursors.dragStart), t(!1));
}
onDrag(e, t) {
if (this.allowPointerEvent(this.pointerEvents.onDrag, e) && this.editedFeatureId !== void 0 && this.editedFeatureCoordinateIndex !== void 0) {
if (this.editedSnapType === "coordinate" || this.editedSnapType === "line" && this.editedInsertIndex !== void 0) {
let t = this.mutateFeature.updateLineString({
featureId: this.editedFeatureId,
context: { updateType: o.Provisional },
coordinateMutations: [{
type: k,
index: this.editedFeatureCoordinateIndex,
coordinate: [e.lng, e.lat]
}]
});
if (!t) return;
this.showCoordinatePoints && (this.editedInsertIndex === void 0 ? this.coordinatePoints.updateOneAtIndex(this.editedFeatureId, this.editedFeatureCoordinateIndex, [e.lng, e.lat]) : this.coordinatePoints.createOrUpdate({
featureId: this.editedFeatureId,
featureCoordinates: t.geometry.coordinates
}));
} else if (this.editedSnapType === "line" && this.editedInsertIndex === void 0) {
this.editedInsertIndex = this.editedFeatureCoordinateIndex + 1;
let e = this.mutateFeature.updateLineString({
featureId: this.editedFeatureId,
context: { updateType: o.Provisional }
});
if (!e) return;
this.showCoordinatePoints && this.coordinatePoints.createOrUpdate({
featureId: this.editedFeatureId,
featureCoordinates: e.geometry.coordinates
}), this.editedFeatureCoordinateIndex++;
}
this.snapping && this.snappedPointId && (this.mutateFeature.deleteFeatureIfPresent(this.snappedPointId), this.snappedPointId = void 0), this.editedPointId && this.mutateFeature.updateGuidancePoints([{
featureId: this.editedPointId,
coordinate: [e.lng, e.lat]
}]), this.mutateFeature.updateLineString({
featureId: this.editedFeatureId,
context: { updateType: o.Provisional },
propertyMutations: { [l.EDITED]: !0 }
});
}
}
onDragEnd(e, t) {
if (!this.allowPointerEvent(this.pointerEvents.onDragEnd, e) || this.editedFeatureId === void 0 || (this.setCursor(this.cursors.dragEnd), !this.mutateFeature.updateLineString({
featureId: this.editedFeatureId,
propertyMutations: { [l.EDITED]: !1 },
context: {
updateType: o.Finish,
action: r
}
}))) return;
let n = this.editedFeatureId;
t(!0), this.snappedPointId &&= (this.mutateFeature.deleteFeatureIfPresent(this.snappedPointId), void 0), this.editedPointId && (this.mutateFeature.deleteFeatureIfPresent(this.editedPointId), this.editedPointId = void 0, this.editedFeatureId = void 0, this.editedFeatureCoordinateIndex = void 0, this.editedInsertIndex = void 0, this.editedSnapType = void 0), this.closingPoints.delete(), this.onFinish(n, {
mode: this.mode,
action: r
});
}
cleanUp() {
let e = this.currentId, t = this.snappedPointId;
this.snappedPointId = void 0, this.currentId = void 0, this.currentCoordinate = 0, this.lastCommittedCoordinates = void 0, this.undoRedo.clear(), this.state === "drawing" && this.setStarted(), e && this.showCoordinatePoints && this.coordinatePoints.deletePointsByFeatureIds([e]), this.mutateFeature.deleteFeatureIfPresent(e), this.mutateFeature.deleteFeatureIfPresent(t), this.closingPoints.delete();
}
styleFeature(e) {
let n = t({}, {
polygonFillColor: "#3f97e0",
polygonOutlineColor: "#3f97e0",
polygonOutlineWidth: 4,
polygonOutlineOpacity: 1,
polygonFillOpacity: .3,
pointColor: "#3f97e0",
pointOpacity: 1,
pointOutlineColor: "#ffffff",
pointOutlineOpacity: 1,
pointOutlineWidth: 0,
pointWidth: 6,
lineStringColor: "#3f97e0",
lineStringWidth: 4,
lineStringOpacity: 1,
zIndex: 0,
markerUrl: void 0,
markerHeight: void 0,
markerWidth: void 0,
lineStringDash: void 0
});
if (e.type === "Feature" && e.geometry.type === "LineString" && e.properties.mode === this.mode) return n.lineStringDash = this.styles.lineStringDash, n.lineStringColor = this.getHexColorStylingValue(this.styles.lineStringColor, n.lineStringColor, e), n.lineStringOpacity = this.getNumericStylingValue(this.styles.lineStringOpacity, n.lineStringOpacity === void 0 ? 1 : n.lineStringOpacity, e), n.lineStringWidth = this.getNumericStylingValue(this.styles.lineStringWidth, n.lineStringWidth, e), n.zIndex = u, n;
if (e.type === "Feature" && e.geometry.type === "Point" && e.properties.mode === this.mode) {
let t = e.properties[l.COORDINATE_POINT], r = e.properties[l.CLOSING_POINT] ? "closingPoint" : e.properties[l.SNAPPING_POINT] ? "snappingPoint" : t ? "coordinatePoint" : void 0;
if (!r) return n;
let i = {
closingPoint: {
width: this.styles.closingPointWidth,
color: this.styles.closingPointColor,
opacity: this.styles.closingPointOpacity,
outlineColor: this.styles.closingPointOutlineColor,
outlineWidth: this.styles.closingPointOutlineWidth,
outlineOpacity: this.styles.closingPointOutlineOpacity
},
snappingPoint: {
width: this.styles.snappingPointWidth,
color: this.styles.snappingPointColor,
opacity: this.styles.snappingPointOpacity,
outlineColor: this.styles.snappingPointOutlineColor,
outlineWidth: this.styles.snappingPointOutlineWidth,
outlineOpacity: this.styles.snappingPointOutlineOpacity
},
coordinatePoint: {
width: this.styles.coordinatePointWidth,
color: this.styles.coordinatePointColor,
opacity: this.styles.coordinatePointOpacity,
outlineColor: this.styles.coordinatePointOutlineColor,
outlineWidth: this.styles.coordinatePointOutlineWidth,
outlineOpacity: this.styles.coordinatePointOutlineOpacity
}
};
return n.pointWidth = this.getNumericStylingValue(i[r].width, n.pointWidth, e), n.pointOpacity = this.getNumericStylingValue(i[r].opacity, 1, e), n.pointColor = this.getHexColorStylingValue(i[r].color, n.pointColor, e), n.pointOutlineColor = this.getHexColorStylingValue(i[r].outlineColor, "#ffffff", e), n.pointOutlineWidth = this.getNumericStylingValue(i[r].outlineWidth, 2, e), n.pointOutlineOpacity = this.getNumericStylingValue(i[r].outlineOpacity, 1, e), n.zIndex = t ? 20 : 50, n;
}
return n;
}
validateFeature(e) {
return this.validateModeFeature(e, (e) => Fe(e, this.coordinatePrecision));
}
lineStringFilter(e) {
return !!(e.geometry.type === "LineString" && e.properties && e.properties.mode === this.mode);
}
snapCoordinate(e) {
var t, n, r;
let i;
if ((t = this.snapping) != null && t.toLine) {
let t;
t = this.currentId ? this.lineSnapping.getSnappableCoordinate(e, this.currentId) : this.lineSnapping.getSnappableCoordinateFirstClick(e), t && (i = t);
}
if ((n = this.snapping) != null && n.toCoordinate) {
let t;
t = this.currentId ? this.coordinateSnapping.getSnappableCoordinate(e, this.currentId) : this.coordinateSnapping.getSnappableCoordinateFirstClick(e), t && (i = t);
}
if ((r = this.snapping) != null && r.toCustom) {
let t = this.snapping.toCustom(e, {
currentCoordinate: this.currentCoordinate,
currentId: this.currentId,
getCurrentGeometrySnapshot: this.currentId ? () => this.readFeature.getGeometry(this.currentId) : () => null,
project: this.project,
unproject: this.unproject
});
t && (i = t);
}
return i;
}
afterFeatureUpdated(e) {
this.showCoordinatePoints && this.coordinatePoints.createOrUpdate({
featureId: e.id,
featureCoordinates: e.geometry.coordinates
}), this.editedFeatureId === e.id && this.editedPointId && (this.mutateFeature.deleteFeatureIfPresent(this.editedPointId), this.editedPointId = void 0, this.editedFeatureId = void 0, this.editedFeatureCoordinateIndex = void 0, this.editedSnapType = void 0), this.snappedPointId && this.lastMouseMoveEvent && this.updateSnappedCoordinate(this.lastMouseMoveEvent), this.currentId === e.id && (this.closingPoints.delete(), this.currentCoordinate = 0, this.currentId = void 0, this.lastCommittedCoordinates = void 0, this.undoRedo.clear(), this.state === "drawing" && this.setStarted());
}
afterFeatureAdded(e) {
this.showCoordinatePoints && this.coordinatePoints.createOrUpdate({
featureId: e.id,
featureCoordinates: e.geometry.coordinates
});
}
}, Xe = "Feature is not a Point", Ze = "Feature has invalid coordinates", Qe = "Feature has coordinates with excessive precision";
function $e(e, t) {
return e.geometry.type === "Point" ? ce(e.geometry.coordinates) ? se(e.geometry.coordinates, t) ? { valid: !0 } : {
valid: !1,
reason: Qe
} : {
valid: !1,
reason: Ze
} : {
valid: !1,
reason: Xe
};
}
var et = class extends D {
constructor(e, t, n) {
super(e), this.pixelDistance = void 0, this.clickBoundingBox = void 0, this.pixelDistance = t, this.clickBoundingBox = n;
}
getNearestPointFeature(e) {
let t = this.clickBoundingBox.create(e), n = this.store.search(t), r, i = Infinity;
for (let t = 0; t < n.length; t++) {
let a = n[t];
if (a.geometry.type !== "Point" || a.properties.mode !== this.mode) continue;
let o = this.pixelDistance.measure(e, a.geometry.coordinates);
o > i || o > this.pointerDistance || (i = o, r = a);
}
return r;
}
}, tt = {
create: "crosshair",
dragStart: "grabbing",
dragEnd: "crosshair"
}, nt = class extends _ {
constructor(e) {
super(e, !0), this.mode = "point", this.cursors = tt, this.editable = !1, this.editedFeatureId = void 0, this.pixelDistance = void 0, this.clickBoundingBox = void 0, this.pointSearch = void 0, this.mutateFeature = void 0, this.updateOptions(e);
}
updateOptions(e) {
super.updateOptions(e), e != null && e.cursors && (this.cursors = t({}, this.cursors, e.cursors)), e != null && e.editable && (this.editable = e.editable);
}
start() {
this.setStarted(), this.setCursor(this.cursors.create);
}
stop() {
this.cleanUp(), this.setStopped(), this.setCursor("unset");
}
onClick(e) {
e.button === "right" && this.allowPointerEvent(this.pointerEvents.rightClick, e) || e.isContextMenu && this.allowPointerEvent(this.pointerEvents.contextMenu, e) ? this.onRightClick(e) : e.button === "left" && this.allowPointerEvent(this.pointerEvents.leftClick, e) && this.onLeftClick(e);
}
onMouseMove() {}
onKeyDown() {}
onKeyUp() {}
cleanUp() {
this.editedFeatureId = void 0;
}
onDragStart(e, t) {
if (this.allowPointerEvent(this.pointerEvents.onDragStart, e)) {
if (this.editable) {
let t = this.pointSearch.getNearestPointFeature(e);
this.editedFeatureId = t?.id;
}
this.editedFeatureId && (this.setCursor(this.cursors.dragStart), t(!1));
}
}
onDrag(e, t) {
this.allowPointerEvent(this.pointerEvents.onDrag, e) && this.editedFeatureId !== void 0 && this.mutateFeature.updatePoint({
featureId: this.editedFeatureId,
coordinateMutations: {
type: j,
coordinates: [e.lng, e.lat]
},
propertyMutations: { [l.EDITED]: !0 },
context: { updateType: o.Provisional }
});
}
onDragEnd(e, t) {
if (!this.allowPointerEvent(this.pointerEvents.onDragEnd, e) || this.editedFeatureId === void 0 || !this.mutateFeature.updatePoint({
featureId: this.editedFeatureId,
propertyMutations: {
mode: this.mode,
[l.EDITED]: !1
},
context: {
updateType: o.Finish,
action: "edit"
}
})) return;
let r = this.editedFeatureId;
this.setCursor(this.cursors.dragEnd), this.editedFeatureId = void 0, t(!0), this.onFinish(r, {
mode: this.mode,
action: n
});
}
registerBehaviors(e) {
this.pixelDistance = new F(e), this.clickBoundingBox = new Ee(e), this.pointSearch = new et(e, this.pixelDistance, this.clickBoundingBox), this.mutateFeature = new M(e, { validate: this.validate });
}
styleFeature(e) {
let n = t({}, {
polygonFillColor: "#3f97e0",
polygonOutlineColor: "#3f97e0",
polygonOutlineWidth: 4,
polygonOutlineOpacity: 1,
polygonFillOpacity: .3,
pointColor: "#3f97e0",
pointOpacity: 1,
pointOutlineColor: "#ffffff",
pointOutlineOpacity: 1,
pointOutlineWidth: 0,
pointWidth: 6,
lineStringColor: "#3f97e0",
lineStringWidth: 4,
lineStringOpacity: 1,
zIndex: 0,
markerUrl: void 0,
markerHeight: void 0,
markerWidth: void 0,
lineStringDash: void 0
});
if (e.type === "Feature" && e.geometry.type === "Point" && e.properties.mode === this.mode) {
let t = !!(e.id && this.editedFeatureId === e.id);
n.pointWidth = this.getNumericStylingValue(t ? this.styles.editedPointWidth : this.styles.pointWidth, n.pointWidth, e), n.pointOpacity = this.getNumericStylingValue(this.styles.pointOpacity, n.pointOpacity === void 0 ? 1 : n.pointOpacity, e), n.pointColor = this.getHexColorStylingValue(t ? this.styles.editedPointColor : this.styles.pointColor, n.pointColor, e), n.pointOutlineColor = this.getHexColorStylingValue(t ? this.styles.editedPointOutlineColor : this.styles.pointOutlineColor, n.pointOutlineColor, e), n.pointOutlineOpacity = this.getNumericStylingValue(this.styles.pointOutlineOpacity, n.pointOutlineOpacity === void 0 ? 1 : n.pointOutlineOpacity, e), n.pointOutlineWidth = this.getNumericStylingValue(t ? this.styles.editedPointOutlineWidth : this.styles.pointOutlineWidth, 2, e), n.zIndex = 30;
}
return n;
}
validateFeature(e) {
return this.validateModeFeature(e, (e) => $e(e, this.coordinatePrecision));
}
onLeftClick(e) {
let t = this.mutateFeature.createPoint({
coordinates: [e.lng, e.lat],
properties: { mode: this.mode },
context: {
updateType: o.Finish,
action: n
}
});
t && this.onFinish(t.id, {
mode: this.mode,
action: n
});
}
onRightClick(e) {
if (!this.editable) return;
let t = this.pointSearch.getNearestPointFeature(e);
t && this.mutateFeature.deleteFeatureIfPresent(t.id);
}
afterFeatureUpdated(e) {
this.editedFeatureId === e.id && (this.editedFeatureId = void 0, this.setCursor(this.cursors.create));
}
}, rt = {
cancel: "Escape",
finish: "Enter"
}, it = {
start: "crosshair",
close: "pointer",
dragStart: "grabbing",
dragEnd: "crosshair"
}, at = class extends _ {
constructor(e) {
super(e, !0), this.mode = "polygon", this.currentCoordinate = 0, this.currentId = void 0, this.keyEvents = rt, this.cursors = it, this.mouseMove = !1, this.showCoordinatePoints = !1, this.lastMouseMoveEvent = void 0, this.snapping = void 0, this.snappedPointId = void 0, this.editable = !1, this.editedFeatureId = void 0, this.editedFeatureCoordinateIndex = void 0, this.editedSnapType = void 0, this.editedInsertIndex = void 0, this.editedPointId = void 0, this.coordinatePoints = void 0, this.lineSnapping = void 0, this.coordinateSnapping = void 0, this.pixelDistance = void 0, this.closingPoints = void 0, this.clickBoundingBox = void 0, this.mutateFeature = void 0, this.readFeature = void 0, this.undoRedo = void 0, this.updateOptions(e);
}
updateOptions(e) {
if (super.updateOptions(e), e != null && e.cursors && (this.cursors = t({}, this.cursors, e.cursors)), e?.keyEvents === null ? this.keyEvents = {
cancel: null,
finish: null
} : e != null && e.keyEvents && (this.keyEvents = t({}, this.keyEvents, e.keyEvents)), e != null && e.snapping && (this.snapping = e.snapping), e?.editable !== void 0 && (this.editable = e.editable), e?.pointerEvents !== void 0 && (this.pointerEvents = e.pointerEvents), e?.showCoordinatePoints !== void 0) {
if (this.showCoordinatePoints = e.showCoordinatePoints, this.coordinatePoints && !0 === e.showCoordinatePoints) this.store.copyAllWhere((e) => e.mode === this.mode).filter((e) => e.geometry.type === "Polygon").forEach((e) => {
this.coordinatePoints.createOrUpdate({
featureId: e.id,
featureCoordinates: e.geometry.coordinates
});
});
else if (this.coordinatePoints && !1 === this.showCoordinatePoints) {
let e = this.store.copyAllWhere((e) => e.mode === this.mode && !!e[l.COORDINATE_POINT_IDS]).filter((e) => e.geometry.type === "Polygon");
this.coordinatePoints.deletePointsByFeatureIds(e.map((e) => e.id));
}
}
}
close() {
if (this.currentId === void 0 || this.readFeature.getCoordinates(this.currentId).length < 5) return;
let e = this.mutateFeature.updatePolygon({
featureId: this.currentId,
coordinateMutations: [{
type: A,
index: -2
}],
propertyMutations: {
[l.CURRENTLY_DRAWING]: void 0,
[l.COMMITTED_COORDINATE_COUNT]: void 0,
[l.PROVISIONAL_COORDINATE_COUNT]: void 0
},
context: {
updateType: o.Finish,
action: n
}
});
if (!e) return;
this.showCoordinatePoints && this.coordinatePoints.createOrUpdate({
featureId: this.currentId,
featureCoordinates: e.geometry.coordinates
}), this.state === "drawing" && this.setStarted(), this.editedPointId &&= (this.mutateFeature.deleteFeatureIfPresent(this.editedPointId), void 0), this.snappedPointId &&= (this.mutateFeature.deleteFeatureIfPresent(this.snappedPointId), void 0), this.closingPoints.delete();
let t = this.currentId;
this.currentCoordinate = 0, this.currentId = void 0, this.undoRedo.clear(), this.onFinish(t, {
mode: this.mode,
action: n
});
}
registerBehaviors(e) {
this.readFeature = new P(e), this.mutateFeature = new M(e, { validate: this.validate }), this.clickBoundingBox = new Ee(e), this.pixelDistance = new F(e), this.lineSnapping = new Be(e, this.pixelDistance, this.clickBoundingBox), this.coordinateSnapping = new De(e, this.pixelDistance, this.clickBoundingBox), this.closingPoints = new We(e, this.pixelDistance, this.mutateFeature, this.readFeature), this.coordinatePoints = new Ge(e, this.readFeature, this.mutateFeature), this.undoRedo = new Ke({ maxStackSize: e.undoRedoMaxStackSize });
}
start() {
this.setStarted(), this.setCursor(this.cursors.start);
}
stop() {
this.cleanUp(), this.setStopped(), this.setCursor("unset");
}
updateSnappedCoordinate(e) {
let t = this.snapCoordinate(e);
t ? (this.snappedPointId ? this.mutateFeature.updateGuidancePoints([{
featureId: this.snappedPointId,
coordinate: t
}]) : this.snappedPointId = this.mutateFeature.createGuidancePoint({
coordinate: t,
type: l.SNAPPING_POINT
}), e.lng = t[0], e.lat = t[1]) : this.snappedPointId &&= (this.mutateFeature.deleteFeatureIfPresent(this.snappedPointId), void 0);
}
undoSize() {
return this.undoRedo.undoSize();
}
clearHistory() {
this.undoRedo.clear();
}
pushHistorySnapshot(e, t) {
let n = this.readFeature.getGeometry(e);
this.undoRedo.recordSnapshot({
featureCoordinates: n.coordinates,
currentCoordinate: t
});
}
updateSnappedGuidancePointFromLastMouseMove() {
this.snapping && this.lastMouseMoveEvent ? this.updateSnappedCoordinate(this.lastMouseMoveEvent) : this.snappedPointId &&= (this.mutateFeature.deleteFeatureIfPresent(this.snappedPointId), void 0);
}
syncClosingPoints(e) {
this.currentCoordinate >= 3 ? this.closingPoints.ids.length ? this.closingPoints.update(e) : this.closingPoints.create(e) : this.closingPoints.delete();
}
undo() {
if (this.state !== "drawing" || !this.currentId) return;
let e = this.undoRedo.beginUndo();
if (!e) return;
let { previousEntry: t } = e;
if (!t) {
let e = this.currentId;
this.currentId = void 0, this.currentCoordinate = 0, this.closingPoints.delete(), this.state === "drawing" && this.setStarted(), this.showCoordinatePoints && this.coordinatePoints.deletePointsByFeatureIds([e]), this.mutateFeature.deleteFeatureIfPresent(e), this.updateSnappedGuidancePointFromLastMouseMove();
return;
}
let n = this.mutateFeature.updatePolygon({
featureId: this.currentId,
coordinateMutations: {
type: j,
coordinates: t.featureCoordinates
},
propertyMutations: {
[l.CURRENTLY_DRAWING]: !0,
[l.COMMITTED_COORDINATE_COUNT]: t.currentCoordinate,
[l.PROVISIONAL_COORDINATE_COUNT]: t.currentCoordinate
},
context: { updateType: o.Commit }
});
n && (this.currentCoordinate = t.currentCoordinate, this.syncClosingPoints(n.geometry.coordinates), this.showCoordinatePoints && this.coordinatePoints.createOrUpdate({
featureId: this.currentId,
featureCoordinates: n.geometry.coordinates
}), this.updateSnappedGuidancePointFromLastMouseMove());
}
redoSize() {
return this.undoRedo.redoSize();
}
redo() {
let e = this.undoRedo.takeRedo();
if (e) {
if (this.currentId) {
let t = this.mutateFeature.updatePolygon({
featureId: this.currentId,
coordinateMutations: {
type: j,
coordinates: e.featureCoordinates
},
propertyMutations: {
[l.CURRENTLY_DRAWING]: !0,
[l.COMMITTED_COORDINATE_COUNT]: e.currentCoordinate,
[l.PROVISIONAL_COORDINATE_COUNT]: e.currentCoordinate
},
context: { updateType: o.Commit }
});
if (!t) return;
this.currentCoordinate = e.currentCoordinate, this.syncClosingPoints(t.geometry.coordinates), this.showCoordinatePoints && this.coordinatePoints.createOrUpdate({
featureId: this.currentId,
featureCoordinates: t.geometry.coordinates
});
} else {
let t = this.undoRedo.cloneCoordinates(e.featureCoordinates)[0], { id: n, geometry: r } = this.mutateFeature.createPolygon({
coordinates: t,
properties: {
mode: this.mode,
[l.CURRENTLY_DRAWING]: !0,
[l.COMMITTED_COORDINATE_COUNT]: e.currentCoordinate,
[l.PROVISIONAL_COORDINATE_COUNT]: e.currentCoordinate
}
});
this.currentId = n, this.currentCoordinate = e.currentCoordinate, this.state === "started" && this.setDrawing(), this.syncClosingPoints(r.coordinates), this.showCoordinatePoints && this.coordinatePoints.createOrUpdate({
featureId: n,
featureCoordinates: r.coordinates
});
}
this.undoRedo.commitRedo(e), this.updateSnappedGuidancePointFromLastMouseMove();
}
}
onMouseMove(e) {
if (this.mouseMove = !0, this.setCursor(this.cursors.start), this.lastMouseMoveEvent = e, this.updateSnappedCoordinate(e), this.currentId === void 0 || this.currentCoordinate === 0) return;
let t = this.readFeature.getCoordinate(this.currentId, 0), n = [e.lng, e.lat], r;
if (this.currentCoordinate === 1) r = [{
type: k,
index: 1,
coordinate: n
}, {
type: k,
index: 2,
coordinate: [e.lng, e.lat]
}];
else if (this.currentCoordinate === 2) r = [{
type: k,
index: 2,
coordinate: n
}];
else {
let { isClosing: i, isPreviousClosing: a } = this.closingPoints.isPolygonClosingPoints(e);
a || i ? (this.snappedPointId &&= (this.mutateFeature.deleteFeatureIfPresent(this.snappedPointId), void 0), this.setCursor(this.cursors.close), r = [{
type: k,
index: -1,
coordinate: t
}, {
type: k,
index: -2,
coordinate: t
}]) : r = [{
type: k,
index: -2,
coordinate: n
}, {
type: k,
index: -1,
coordinate: t
}];
}
let i = this.mutateFeature.updatePolygon({
featureId: this.currentId,
coordinateMutations: r,
propertyMutations: { [l.PROVISIONAL_COORDINATE_COUNT]: this.currentCoordinate + 1 },
context: { updateType: o.Provisional }
});
i && this.showCoordinatePoints && this.coordinatePoints.createOrUpdate({
featureId: this.currentId,
featureCoordinates: i.geometry.coordinates
});
}
snapCoordinate(e) {
var t, n, r;
let i;
if ((t = this.snapping) != null && t.toLine) {
let t;
t = this.currentId ? this.lineSnapping.getSnappableCoordinate(e, this.currentId) : this.lineSnapping.getSnappableCoordinateFirstClick(e), t && (i = t);
}
if ((n = this.snapping) != null && n.toCoordinate) {
let t;
t = this.currentId ? this.coordinateSnapping.getSnappableCoordinate(e, this.currentId) : this.coordinateSnapping.getSnappableCoordinateFirstClick(e), t && (i = t);
}
if ((r = this.snapping) != null && r.toCustom) {
let t = this.snapping.toCustom(e, {
currentCoordinate: this.currentCoordinate,
currentId: this.currentId,
getCurrentGeometrySnapshot: this.currentId ? () => this.readFeature.getGeometry(this.currentId) : () => null,
project: this.project,
unproject: this.unproject
});
t && (i = t);
}
return i;
}
polygonFilter(e) {
return !!(e.geometry.type === "Polygon" && e.properties && e.properties.mode === this.mode);
}
onRightClick(e) {
if (!this.editable || this.state !== "started") return;
let { featureId: t, featureCoordinateIndex: n } = this.coordinateSnapping.getSnappable(e, (e) => this.polygonFilter(e));
if (!t || n === void 0) return;
let i = this.readFeature.getGeometry(t);
if (i.type !== "Polygon") return;
let a = i.coordinates[0];
if (a.length <= 4) return;
let s;
s = n === 0 || n === a.length - 1 ? [
{
type: A,
index: 0
},
{
type: A,
index: -1
},
{
type: O,
index: -1,
coordinate: a[1]
}
] : [{
type: A,
index: n
}];
let c = this.mutateFeature.updatePolygon({
featureId: t,
coordinateMutations: s,
context: {
updateType: o.Finish,
action: r
}
});
if (c) {
if (this.showCoordinatePoints && this.coordinatePoints.createOrUpdate({
featureId: t,
featureCoordinates: c.geometry.coordinates
}), this.snappedPointId && (this.mutateFeature.deleteFeatureIfPresent(this.snappedPointId), this.snappedPointId = void 0, this.snapping)) {
let t = this.snapCoordinate(e);
if (t) {
let [e] = this.mutateFeature.createGuidancePoints({
type: l.SNAPPING_POINT,
coordinates: [t]
});
this.snappedPointId = e;
}
}
this.onFinish(t, {
mode: this.mode,
action: r
});
}
}
onLeftClick(e) {
this.snappedPointId &&= (this.mutateFeature.deleteFeatureIfPresent(this.snappedPointId), void 0);
let t = this.snapCoordinate(e) || [e.lng, e.lat];
if (this.currentCoordinate === 0) {
let { id: e, geometry: n } = this.mutateFeature.createPolygon({
coordinates: [
t,
t,
t,
t
],
properties: {
mode: this.mode,
[l.CURRENTLY_DRAWING]: !0,
[l.COMMITTED_COORDINATE_COUNT]: this.currentCoordinate + 1,
[l.PROVISIONAL_COORDINATE_COUNT]: this.currentCoordinate + 1
}
});
this.showCoordinatePoints && this.coordinatePoints.createOrUpdate({
featureId: e,
featureCoordinates: n.coordinates
}), this.currentId = e, this.currentCoordinate++, this.pushHistorySnapshot(this.currentId, this.currentCoordinate), this.setDrawing();
} else if (this.currentCoordinate === 1 && this.currentId) {
if (this.readFeature.coordinateAtIndexIsIdentical({
featureId: this.currentId,
newCoordinate: t,
index: 0
})) return;
let e = this.mutateFeature.updatePolygon({
featureId: this.currentId,
coordinateMutations: [{
type: k,
index: 1,
coordinate: t
}, {
type: k,
index: 2,
coordinate: t
}],
propertyMutations: { [l.COMMITTED_COORDINATE_COUNT]: this.currentCoordinate + 1 },
context: { updateType: o.Commit }
});
if (!e) return;
this.showCoordinatePoints && this.coordinatePoints.createOrUpdate({
featureId: this.currentId,
featureCoordinates: e.geometry.coordinates
}), this.currentCoordinate++, this.pushHistorySnapshot(this.currentId, this.currentCoordinate);
} else if (this.currentCoordinate === 2 && this.currentId) {
if (this.readFeature.coordinateAtIndexIsIdentical({
featureId: this.currentId,
newCoordinate: t,
index: 1
})) return;
let e = this.mutateFeature.updatePolygon({
featureId: this.currentId,
coordinateMutations: [{
type: k,
index: 2,
coordinate: t
}, {
type: O,
index: 2,
coordinate: t
}],
propertyMutations: { [l.COMMITTED_COORDINATE_COUNT]: this.currentCoordinate + 1 },
context: { updateType: o.Commit }
});
if (!e) return;
this.showCoordinatePoints && this.coordinatePoints.createOrUpdate({
featureId: this.currentId,
featureCoordinates: e.geometry.coordinates
}), this.currentCoordinate === 2 && this.closingPoints.create(e.geometry.coordinates), this.currentCoordinate++, this.pushHistorySnapshot(this.currentId, this.currentCoordinate);
} else if (this.currentId) {
let { isClosing: n, isPreviousClosing: r } = this.closingPoints.isPolygonClosingPoints(e);
if (r || n) this.close();
else {
if (this.readFeature.coordinateAtIndexIsIdentical({
featureId: this.currentId,
newCoordinate: t,
index: this.currentCoordinate - 1
})) return;
let e = this.mutateFeature.updatePolygon({
featureId: this.currentId,
coordinateMutations: [{
type: _e,
index: -1,
coordinate: t
}],
propertyMutations: { [l.COMMITTED_COORDINATE_COUNT]: this.currentCoordinate + 1 },
context: { updateType: o.Commit }
});
if (!e) return;
this.showCoordinatePoints && this.coordinatePoints.createOrUpdate({
featureId: this.currentId,
featureCoordinates: e.geometry.coordinates
}), this.currentCoordinate++, this.pushHistorySnapshot(this.currentId, this.currentCoordinate), this.closingPoints.ids.length && this.closingPoints.update(e.geometry.coordinates);
}
}
}
onClick(e) {
this.currentCoordinate > 0 && !this.mouseMove && this.onMouseMove(e), this.mouseMove = !1, e.button === "right" && this.allowPointerEvent(this.pointerEvents.rightClick, e) || e.isContextMenu && this.allowPointerEvent(this.pointerEvents.contextMenu, e) ? this.onRightClick(e) : e.button === "left" && this.allowPointerEvent(this.pointerEvents.leftClick, e) && this.onLeftClick(e);
}
onKeyUp(e) {
e.key === this.keyEvents.cancel ? this.cleanUp() : e.key === this.keyEvents.finish && this.close();
}
onKeyDown() {}
onDragStart(e, t) {
if (!this.allowPointerEvent(this.pointerEvents.onDragStart, e) || !this.editable) return;
let n;
if (this.state === "started") {
let t = this.lineSnapping.getSnappable(e, (e) => this.polygonFilter(e));
t.coordinate && (this.editedSnapType = "line", this.editedFeatureCoordinateIndex = t.featureCoordinateIndex, this.editedFeatureId = t.featureId, n = t.coordinate);
let r = this.coordinateSnapping.getSnappable(e, (e) => this.polygonFilter(e));
r.coordinate && (this.editedSnapType = "coordinate", this.editedFeatureCoordinateIndex = r.featureCoordinateIndex, this.editedFeatureId = r.featureId, n = r.coordinate);
}
this.editedFeatureId && n && (this.editedPointId ||= this.mutateFeature.createGuidancePoint({
coordinate: n,
type: l.EDITED
}), this.setCursor(this.cursors.dragStart), t(!1));
}
onDrag(e, t) {
if (!this.allowPointerEvent(this.pointerEvents.onDrag, e) || this.editedFeatureId === void 0 || this.editedFeatureCoordinateIndex === void 0) return;
let n = this.readFeature.getGeometry(this.editedFeatureId), r = [e.lng, e.lat], i = [];
if (this.editedSnapType === "coordinate" || this.editedSnapType === "line" && this.editedInsertIndex !== void 0 ? i = this.editedFeatureCoordinateIndex === 0 || this.editedFeatureCoordinateIndex === n.coordinates[0].length - 1 ? [{
type: k,
index: 0,
coordinate: r
}, {
type: k,
index: -1,
coordinate: r
}] : [{
type: k,
index: this.editedFeatureCoordinateIndex,
coordinate: r
}] : this.editedSnapType === "line" && this.editedInsertIndex === void 0 && (this.editedInsertIndex = this.editedFeatureCoordinateIndex + 1, i = [{
type: _e,
index: this.editedInsertIndex,
coordinate: r
}], this.editedFeatureCoordinateIndex++), i.length === 0) return;
let a = this.mutateFeature.updatePolygon({
featureId: this.editedFeatureId,
coordinateMutations: i,
propertyMutations: { [l.EDITED]: !0 },
context: { updateType: o.Provisional }
});
a && (this.showCoordinatePoints && (this.editedInsertIndex ? this.coordinatePoints.createOrUpdate({
featureId: this.editedFeatureId,
featureCoordinates: a.geometry.coordinates
}) : this.coordinatePoints.updateOneAtIndex(this.editedFeatureId, this.editedFeatureCoordinateIndex, a.geometry.coordinates[0][this.editedFeatureCoordinateIndex])), this.snapping && this.snappedPointId && (this.mutateFeature.deleteFeatureIfPresent(this.snappedPointId), this.snappedPointId = void 0), this.editedPointId && this.mutateFeature.updateGuidancePoints([{
featureId: this.editedPointId,
coordinate: r
}]));
}
onDragEnd(e, t) {
if (!this.allowPointerEvent(this.pointerEvents.onDragEnd, e) || this.editedFeatureId === void 0 || (this.setCursor(this.cursors.dragEnd), !this.mutateFeature.updatePolygon({
featureId: this.editedFeatureId,
propertyMutations: { [l.EDITED]: !1 },
context: {
updateType: o.Finish,
action: r
}
}))) return;
let n = this.editedFeatureId;
this.editedPointId &&= (this.mutateFeature.deleteFeatureIfPresent(this.editedPointId), void 0), this.snappedPointId &&= (this.mutateFeature.deleteFeatureIfPresent(this.snappedPointId), void 0), this.editedFeatureId = void 0, this.editedFeatureCoordinateIndex = void 0, this.editedInsertIndex = void 0, this.editedSnapType = void 0, t(!0), this.onFinish(n, {
mode: this.mode,
action: r
});
}
cleanUp() {
let e = this.currentId, t = this.snappedPointId, n = this.editedPointId;
this.currentId = void 0, this.snappedPointId = void 0, this.editedPointId = void 0, this.editedFeatureId = void 0, this.editedFeatureCoordinateIndex = void 0, this.editedInsertIndex = void 0, this.editedSnapType = void 0, this.currentCoordinate = 0, this.undoRedo.clear(), this.state === "drawing" && this.setStarted(), e && this.coordinatePoints.deletePointsByFeatureIds([e]), this.mutateFeature.deleteFeatureIfPresent(e), this.mutateFeature.deleteFeatureIfPresent(n), this.mutateFeature.deleteFeatureIfPresent(t), this.closingPoints.ids.length && this.closingPoints.delete();
}
styleFeature(e) {
let n = t({}, {
polygonFillColor: "#3f97e0",
polygonOutlineColor: "#3f97e0",
polygonOutlineWidth: 4,
polygonOutlineOpacity: 1,
polygonFillOpacity: .3,
pointColor: "#3f97e0",
pointOpacity: 1,
pointOutlineColor: "#ffffff",
pointOutlineOpacity: 1,
pointOutlineWidth: 0,
pointWidth: 6,
lineStringColor: "#3f97e0",
lineStringWidth: 4,
lineStringOpacity: 1,
zIndex: 0,
markerUrl: void 0,
markerHeight: void 0,
markerWidth: void 0,
lineStringDash: void 0
});
if (e.properties.mode === this.mode) {
if (e.geometry.type === "Polygon") return n.polygonFillColor = this.getHexColorStylingValue(this.styles.fillColor, n.polygonFillColor, e), n.polygonOutlineColor = this.getHexColorStylingValue(this.styles.outlineColor, n.polygonOutlineColor, e), n.polygonOutlineWidth = this.getNumericStylingValue(this.styles.outlineWidth, n.polygonOutlineWidth, e), n.polygonFillOpacity = this.getNumericStylingValue(this.styles.fillOpacity, n.polygonFillOpacity, e), n.polygonOutlineOpacity = this.getNumericStylingValue(this.styles.outlineOpacity, 1, e), n.zIndex = u, n;
if (e.geometry.type === "Point") {
let t = e.properties[l.EDITED], r = e.properties[l.COORDINATE_POINT], i = t ? "editedPoint" : e.properties[l.CLOSING_POINT] ? "closingPoint" : e.properties[l.SNAPPING_POINT] ? "snappingPoint" : r ? "coordinatePoint" : void 0;
if (!i) return n;
let a = {
editedPoint: {
width: this.styles.editedPointOutlineWidth,
color: this.styles.editedPointColor,
opacity: this.styles.editedPointOpacity,
outlineColor: this.styles.editedPointOutlineColor,
outlineWidth: this.styles.editedPointOutlineWidth,
outlineOpacity: this.styles.editedPointOutlineOpacity
},
closingPoint: {
width: this.styles.closingPointWidth,
color: this.styles.closingPointColor,
opacity: this.styles.closingPointOpacity,
outlineColor: this.styles.closingPointOutlineColor,
outlineWidth: this.styles.closingPointOutlineWidth,
outlineOpacity: this.styles.closingPointOutlineOpacity
},
snappingPoint: {
width: this.styles.snappingPointWidth,
color: this.styles.snappingPointColor,
opacity: this.styles.snappingPointOpacity,
outlineColor: this.styles.snappingPointOutlineColor,
outlineWidth: this.styles.snappingPointOutlineWidth,
outlineOpacity: this.styles.snappingPointOutlineOpacity
},
coordinatePoint: {
width: this.styles.coordinatePointWidth,
color: this.styles.coordinatePointColor,
opacity: this.styles.coordinatePointOpacity,
outlineColor: this.styles.coordinatePointOutlineColor,
outlineWidth: this.styles.coordinatePointOutlineWidth,
outlineOpacity: this.styles.coordinatePointOutlineOpacity
}
};
return n.pointWidth = this.getNumericStylingValue(a[i].width, n.pointWidth, e), n.pointOpacity = this.getNumericStylingValue(a[i].opacity, 1, e), n.pointColor = this.getHexColorStylingValue(a[i].color, n.pointColor, e), n.pointOutlineColor = this.getHexColorStylingValue(a[i].outlineColor, n.pointOutlineColor, e), n.pointOutlineOpacity = this.getNumericStylingValue(a[i].outlineOpacity, 1, e), n.pointOutlineWidth = this.getNumericStylingValue(a[i].outlineWidth, 2, e), n.zIndex = t ? 40 : r ? 20 : 30, n;
}
}
return n;
}
afterFeatureAdded(e) {
this.showCoordinatePoints && this.coordinatePoints.createOrUpdate({
featureId: e.id,
featureCoordinates: e.geometry.coordinates
});
}
afterFeatureUpdated(e) {
this.showCoordinatePoints && this.coordinatePoints.createOrUpdate({
featureId: e.id,
featureCoordinates: e.geometry.coordinates
}), this.editedFeatureId === e.id && this.editedPointId && (this.mutateFeature.deleteFeatureIfPresent(this.editedPointId), this.editedPointId = void 0, this.editedFeatureId = void 0, this.editedFeatureCoordinateIndex = void 0, this.editedSnapType = void 0), this.snappedPointId && this.lastMouseMoveEvent && this.updateSnappedCoordinate(this.lastMouseMoveEvent), this.currentId === e.id && (this.currentCoordinate = 0, this.currentId = void 0, this.undoRedo.clear(), this.closingPoints.delete(), this.state === "drawing" && this.setStarted());
}
validateFeature(e) {
return this.validateModeFeature(e, (e) => me(e, this.coordinatePrecision));
}
}, ot = {
cancel: "Escape",
finish: "Enter"
}, st = { start: "crosshair" }, ct = class extends _ {
constructor(e) {
super(e, !0), this.mode = "rectangle", this.startPosition = void 0, this.endPosition = void 0, this.currentRectangleId = void 0, this.keyEvents = ot, this.cursors = st, this.drawInteraction = "click-move", this.drawType = void 0, this.mutateFeature = void 0, this.readFeature = void 0, this.updateOptions(e);
}
updateOptions(e) {
super.updateOptions(e), e != null && e.cursors && (this.cursors = t({}, this.cursors, e.cursors)), e?.keyEvents === null ? this.keyEvents = {
cancel: null,
finish: null
} : e != null && e.keyEvents && (this.keyEvents = t({}, this.keyEvents, e.keyEvents)), e != null && e.drawInteraction && (this.drawInteraction = e.drawInteraction);
}
updateRectangle(e, t) {
if (!this.startPosition || !this.currentRectangleId) return;
let r = t === o.Finish;
return this.mutateFeature.updatePolygon({
featureId: this.currentRectangleId,
coordinateMutations: [
{
type: k,
index: 1,
coordinate: [e[0], this.startPosition[1]]
},
{
type: k,
index: 2,
coordinate: e
},
{
type: k,
index: 3,
coordinate: [this.startPosition[0], e[1]]
}
],
propertyMutations: r ? { [l.CURRENTLY_DRAWING]: void 0 } : {},
context: r ? {
updateType: t,
action: n
} : { updateType: t }
});
}
close() {
if (!this.currentRectangleId || !this.endPosition || !this.updateRectangle(this.endPosition, o.Finish)) return;
let e = this.currentRectangleId;
this.startPosition = void 0, this.currentRectangleId = void 0, this.drawType = void 0, this.state === "drawing" && this.setStarted(), this.onFinish(e, {
mode: this.mode,
action: n
});
}
beginDrawing(e, t = "click") {
this.startPosition = [e.lng, e.lat], this.endPosition = [e.lng, e.lat];
let n = this.mutateFeature.createPolygon({
coordinates: [
[e.lng, e.lat],
[e.lng, e.lat],
[e.lng, e.lat],
[e.lng, e.lat],
[e.lng, e.lat]
],
properties: {
mode: this.mode,
[l.CURRENTLY_DRAWING]: !0
}
});
this.currentRectangleId = n.id, this.drawType = t, this.setDrawing();
}
moveDrawAllowed() {
return this.drawInteraction === "click-move" || this.drawInteraction === "click-move-or-drag";
}
dragDrawAllowed() {
return this.drawInteraction === "click-drag" || this.drawInteraction === "click-move-or-drag";
}
start() {
this.setStarted(), this.setCursor(this.cursors.start);
}
stop() {
this.cleanUp(), this.setStopped(), this.setCursor("unset");
}
onClick(e) {
this.moveDrawAllowed() && (e.button === "right" && this.allowPointerEvent(this.pointerEvents.rightClick, e) || e.button === "left" && this.allowPointerEvent(this.pointerEvents.leftClick, e) || e.isContextMenu && this.allowPointerEvent(this.pointerEvents.contextMenu, e)) && (this.startPosition ? (this.endPosition = [e.lng, e.lat], this.close()) : this.beginDrawing(e));
}
onMouseMove(e) {
this.endPosition = [e.lng, e.lat], this.updateRectangle(this.endPosition, o.Provisional);
}
onKeyDown() {}
onKeyUp(e) {
e.key === this.keyEvents.cancel ? this.cleanUp() : e.key === this.keyEvents.finish && this.close();
}
onDragStart(e, t) {
this.state !== "drawing" && this.allowPointerEvent(this.pointerEvents.onDragStart, e) && this.dragDrawAllowed() && (this.beginDrawing(e, "drag"), t(!1));
}
onDrag(e, t) {
this.allowPointerEvent(this.pointerEvents.onDrag, e) && this.dragDrawAllowed() && this.drawType === "drag" && (this.endPosition = [e.lng, e.lat], this.updateRectangle(this.endPosition, o.Provisional));
}
onDragEnd(e, t) {
this.allowPointerEvent(this.pointerEvents.onDragEnd, e) && this.dragDrawAllowed() && this.drawType === "drag" && (this.endPosition = [e.lng, e.lat], this.close(), t(!0));
}
cleanUp() {
let e = this.currentRectangleId;
this.startPosition = void 0, this.currentRectangleId = void 0, this.drawType = void 0, this.state === "drawing" && this.setStarted(), this.mutateFeature.deleteFeatureIfPresent(e);
}
styleFeature(e) {
let n = t({}, {
polygonFillColor: "#3f97e0",
polygonOutlineColor: "#3f97e0",
polygonOutlineWidth: 4,
polygonOutlineOpacity: 1,
polygonFillOpacity: .3,
pointColor: "#3f97e0",
pointOpacity: 1,
pointOutlineColor: "#ffffff",
pointOutlineOpacity: 1,
pointOutlineWidth: 0,
pointWidth: 6,
lineStringColor: "#3f97e0",
lineStringWidth: 4,
lineStringOpacity: 1,
zIndex: 0,
markerUrl: void 0,
markerHeight: void 0,
markerWidth: void 0,
lineStringDash: void 0
});
return e.type === "Feature" && e.geometry.type === "Polygon" && e.properties.mode === this.mode ? (n.polygonFillColor = this.getHexColorStylingValue(this.styles.fillColor, n.polygonFillColor, e), n.polygonOutlineColor = this.getHexColorStylingValue(this.styles.outlineColor, n.polygonOutlineColor, e), n.polygonOutlineOpacity = this.getNumericStylingValue(this.styles.outlineOpacity, 1, e), n.polygonOutlineWidth = this.getNumericStylingValue(this.styles.outlineWidth, n.polygonOutlineWidth, e), n.polygonFillOpacity = this.getNumericStylingValue(this.styles.fillOpacity, n.polygonFillOpacity, e), n.zIndex = u, n) : n;
}
validateFeature(e) {
return this.validateModeFeature(e, (e) => he(e, this.coordinatePrecision));
}
afterFeatureUpdated(e) {
this.currentRectangleId === e.id && (this.startPosition = void 0, this.currentRectangleId = void 0, this.drawType = void 0, this.state === "drawing" && this.setStarted());
}
registerBehaviors(e) {
this.readFeature = new P(e), this.mutateFeature = new M(e, { validate: this.validate });
}
}, B = class extends _ {
constructor(e) {
if (!e.modeName) throw Error("Mode name is required for TerraDrawRenderMode");
super(e, !0), this.type = h.Render, this.mode = "render", this.updateOptions(e);
}
updateOptions(e) {
super.updateOptions(e);
}
registerBehaviors(e) {
this.mode = e.mode;
}
start() {
this.setStarted();
}
stop() {
this.setStopped();
}
onKeyUp() {}
onKeyDown() {}
onClick() {}
onDragStart() {}
onDrag() {}
onDragEnd() {}
onMouseMove() {}
cleanUp() {}
styleFeature(e) {
return {
pointColor: this.getHexColorStylingValue(this.styles.pointColor, "#3f97e0", e),
pointWidth: this.getNumericStylingValue(this.styles.pointWidth, 6, e),
pointOpacity: this.getNumericStylingValue(this.styles.pointOpacity, 1, e),
pointOutlineColor: this.getHexColorStylingValue(this.styles.pointOutlineColor, "#ffffff", e),
pointOutlineWidth: this.getNumericStylingValue(this.styles.pointOutlineWidth, 0, e),
pointOutlineOpacity: this.getNumericStylingValue(this.styles.pointOutlineOpacity, 1, e),
polygonFillColor: this.getHexColorStylingValue(this.styles.polygonFillColor, "#3f97e0", e),
polygonFillOpacity: this.getNumericStylingValue(this.styles.polygonFillOpacity, .3, e),
polygonOutlineColor: this.getHexColorStylingValue(this.styles.polygonOutlineColor, "#3f97e0", e),
polygonOutlineWidth: this.getNumericStylingValue(this.styles.polygonOutlineWidth, 4, e),
lineStringWidth: this.getNumericStylingValue(this.styles.lineStringWidth, 4, e),
lineStringColor: this.getHexColorStylingValue(this.styles.lineStringColor, "#3f97e0", e),
lineStringOpacity: this.getNumericStylingValue(this.styles.lineStringOpacity, 1, e),
zIndex: this.getNumericStylingValue(this.styles.zIndex, 0, e),
lineStringDash: void 0
};
}
validateFeature(e) {
let t = super.validateFeature(e);
if (t.valid) {
let t = e, n = $e(t, this.coordinatePrecision).valid || me(t, this.coordinatePrecision).valid || Fe(t, this.coordinatePrecision).valid;
return n ? { valid: !0 } : {
valid: n,
reason: "Feature is not a valid Point, Polygon or LineString feature"
};
}
return t;
}
};
function lt(e, t) {
let n = e, r = t, i = x(n[1]), a = x(r[1]), o = x(r[0] - n[0]);
o > Math.PI && (o -= 2 * Math.PI), o < -Math.PI && (o += 2 * Math.PI);
let s = Math.log(Math.tan(a / 2 + Math.PI / 4) / Math.tan(i / 2 + Math.PI / 4)), c = (S(Math.atan2(o, s)) + 360) % 360;
return c > 180 ? -(360 - c) : c;
}
function ut(e, t, n) {
let r = t;
t < 0 && (r = -Math.abs(r));
let i = r / b, a = e[0] * Math.PI / 180, o = x(e[1]), s = x(n), c = i * Math.cos(s), l = o + c;
Math.abs(l) > Math.PI / 2 && (l = l > 0 ? Math.PI - l : -Math.PI - l);
let u = Math.log(Math.tan(l / 2 + Math.PI / 4) / Math.tan(o / 2 + Math.PI / 4)), d = Math.abs(u) > 1e-11 ? c / u : Math.cos(o), f = [(180 * (a + i * Math.sin(s) / d) / Math.PI + 540) % 360 - 180, 180 * l / Math.PI];
return f[0] += f[0] - e[0] > 180 ? -360 : e[0] - f[0] > 180 ? 360 : 0, f;
}
function dt(e, t, n, r, i) {
let a = r(e[0], e[1]), o = r(t[0], t[1]), { lng: s, lat: c } = i((a.x + o.x) / 2, (a.y + o.y) / 2);
return [C(s, n), C(c, n)];
}
function ft(e, t, n) {
let r = ut(e, 1e3 * y(e, t) / 2, lt(e, t));
return [C(r[0], n), C(r[1], n)];
}
function pt({ featureCoords: e, precision: t, unproject: n, project: r, projection: i }) {
let a = [];
for (let o = 0; o < e.length - 1; o++) {
let s;
if (i === "web-mercator") s = dt(e[o], e[o + 1], t, r, n);
else {
if (i !== "globe") throw Error("Invalid projection");
s = ft(e[o], e[o + 1], t);
}
a.push(s);
}
return a;
}
var mt = class extends D {
constructor(e, t, n, r, i, a) {
super(e), this.config = void 0, this.selectionPointBehavior = void 0, this.coordinatePointBehavior = void 0, this.mutateFeature = void 0, this.readFeature = void 0, this.pixelDistance = void 0, this._midPoints = [], this.config = e, this.selectionPointBehavior = t, this.coordinatePointBehavior = n, this.mutateFeature = r, this.readFeature = i, this.pixelDistance = a;
}
getMidpointConfig(e) {
return {
featureCoords: e,
precision: this.coordinatePrecision,
project: this.config.project,
unproject: this.config.unproject,
projection: this.config.projection
};
}
get ids() {
return this._midPoints.concat();
}
set ids(e) {}
getNearestMidPoint(e) {
let t, n = Infinity;
return this.ids.forEach((r) => {
let i = this.readFeature.getGeometry(r), a = this.pixelDistance.measure(e, i.coordinates);
a < this.pointerDistance && a < n && (n = a, t = r);
}), t;
}
insert({ featureId: e, midPointId: t }) {
let n = this.readFeature.getGeometry(t), { midPointFeatureId: r, midPointSegment: i } = this.readFeature.getProperties(t), a = this.readFeature.getGeometry(r), s = {
featureId: r,
coordinateMutations: [{
type: O,
index: i,
coordinate: n.coordinates
}],
context: { updateType: o.Commit }
}, c = null;
if (a.type === "Polygon") c = this.mutateFeature.updatePolygon(s);
else {
if (a.type !== "LineString") throw Error("Midpoints can only be added to polygons or linestrings");
c = this.mutateFeature.updateLineString(s);
}
if (!c) throw Error("Failed to insert midpoint coordinate");
let u = c.geometry.coordinates;
this.readFeature.getProperties(e)[l.COORDINATE_POINT_IDS] && this.coordinatePointBehavior.createOrUpdate({
featureId: e,
featureCoordinates: u
}), this.mutateFeature.deleteFeaturesIfPresent([...this.selectionPointBehavior.ids, ...this._midPoints]), this.create({
featureCoordinates: u,
featureId: r
}), this.selectionPointBehavior.create({
featureCoordinates: u,
featureId: e
});
}
create({ featureCoordinates: e, featureId: t }) {
if (!this.readFeature.hasFeature(t)) throw Error("Store does not have feature with this id");
let n = Ue(e), r = pt(this.getMidpointConfig(n));
this._midPoints = this.mutateFeature.createGuidancePoints({
additionalProperties: (e) => ({
mode: this.mode,
midPointSegment: e,
midPointFeatureId: t,
[c.MID_POINT]: !0
}),
coordinates: r,
type: c.MID_POINT
});
}
delete() {
this._midPoints.length && (this.mutateFeature.deleteFeaturesIfPresent(this._midPoints), this._midPoints = []);
}
updateAllInPlace({ featureCoordinates: e }) {
if (this._midPoints.length === 0) return;
let t = Ue(e), n = pt(this.getMidpointConfig(t));
this.mutateFeature.updateGuidancePoints(this._midPoints.map((e, t) => ({
featureId: e,
coordinate: n[t]
})));
}
updateOneAtIndex(e, t) {
if (e < 0 && (e = this._midPoints.length + e), this._midPoints[e] === void 0) return;
let n = Ue(t), r = pt(this.getMidpointConfig(n));
this.mutateFeature.updateGuidancePoints([{
featureId: this._midPoints[e],
coordinate: r[e]
}]);
}
}, ht = class extends D {
constructor(e, t) {
super(e), this.mutateFeature = void 0, this._selectionPoints = [], this.mutateFeature = t;
}
get ids() {
return this._selectionPoints.concat();
}
set ids(e) {}
create({ featureId: e, featureCoordinates: t }) {
let n = He(t);
this._selectionPoints = this.mutateFeature.createGuidancePoints({
coordinates: n,
type: c.SELECTION_POINT,
additionalProperties: (t) => ({
[c.SELECTION_POINT_FEATURE_ID]: e,
index: t
})
});
}
delete() {
this.ids.length && (this.mutateFeature.deleteFeaturesIfPresent(this.ids), this._selectionPoints = []);
}
updateAllInPlace({ featureCoordinates: e }) {
if (this._selectionPoints.length === 0) return;
let t = He(e);
t.length === this._selectionPoints.length && this.mutateFeature.updateGuidancePoints(this._selectionPoints.map((e, n) => ({
featureId: e,
coordinate: t[n]
})));
}
updateOneAtIndex(e, t) {
this._selectionPoints[e] !== void 0 && this.mutateFeature.updateGuidancePoints([{
featureId: this._selectionPoints[e],
coordinate: t
}]);
}
};
function gt(e, t) {
let n = !1;
for (let o = 0, s = t.length; o < s; o++) {
let s = t[o];
for (let t = 0, o = s.length, c = o - 1; t < o; c = t++) (i = s[t])[1] > (r = e)[1] != (a = s[c])[1] > r[1] && r[0] < (a[0] - i[0]) * (r[1] - i[1]) / (a[1] - i[1]) + i[0] && (n = !n);
}
var r, i, a;
return n;
}
var _t = (e, t, n) => {
let r = (e) => e * e, i = (e, t) => r(e.x - t.x) + r(e.y - t.y);
return Math.sqrt(((e, t, n) => {
let r = i(t, n);
if (r === 0) return i(e, t);
let a = ((e.x - t.x) * (n.x - t.x) + (e.y - t.y) * (n.y - t.y)) / r;
return a = Math.max(0, Math.min(1, a)), i(e, {
x: t.x + a * (n.x - t.x),
y: t.y + a * (n.y - t.y)
});
})(e, t, n));
}, vt = class extends D {
constructor(e, t, n) {
super(e), this.config = void 0, this.createClickBoundingBox = void 0, this.pixelDistance = void 0, this.config = e, this.createClickBoundingBox = t, this.pixelDistance = n;
}
find(e, t) {
let n, r, i, a = Infinity, o = Infinity, s = this.createClickBoundingBox.create(e), l = this.store.search(s);
for (let s = 0; s < l.length; s++) {
let u = l[s], d = u.geometry;
if (d.type === "Point") {
if (u.properties.selectionPoint || u.properties.coordinatePoint || !t && u.properties[c.MID_POINT]) continue;
let r = this.pixelDistance.measure(e, d.coordinates);
!u.properties[c.MID_POINT] && r < this.pointerDistance && r < a && (a = r, n = u);
} else if (d.type === "LineString") {
if (n) continue;
for (let t = 0; t < d.coordinates.length - 1; t++) {
let n = d.coordinates[t], i = d.coordinates[t + 1], a = _t({
x: e.containerX,
y: e.containerY
}, this.project(n[0], n[1]), this.project(i[0], i[1]));
a < this.pointerDistance && a < o && (o = a, r = u);
}
} else if (d.type === "Polygon") {
if (n || r) continue;
gt([e.lng, e.lat], d.coordinates) && (i = u);
}
}
return { clickedFeature: n || r || i };
}
}, yt = class extends D {
constructor(e, t, n, r, i, a, o) {
super(e), this.config = void 0, this.featuresAtCursorEvent = void 0, this.selectionPoints = void 0, this.midPoints = void 0, this.coordinatePoints = void 0, this.readFeature = void 0, this.mutateFeature = void 0, this.draggedFeatureId = null, this.dragPosition = void 0, this.config = e, this.featuresAtCursorEvent = t, this.selectionPoints = n, this.midPoints = r, this.coordinatePoints = i, this.readFeature = a, this.mutateFeature = o;
}
startDragging(e, t) {
this.draggedFeatureId = t, this.dragPosition = [e.lng, e.lat];
}
stopDragging() {
this.draggedFeatureId = null, this.dragPosition = void 0;
}
isDragging() {
return this.draggedFeatureId !== null;
}
canDrag(e, t) {
let { clickedFeature: n } = this.featuresAtCursorEvent.find(e, !0);
return !(!n || n.id !== t);
}
drag(e) {
if (!this.draggedFeatureId) return;
let t = this.readFeature.getGeometry(this.draggedFeatureId), n = [e.lng, e.lat];
if (t.type === "Polygon" || t.type === "LineString") {
let r, i;
if (t.type === "Polygon" ? (r = t.coordinates[0], i = r.length - 1) : (r = t.coordinates, i = r.length), !this.dragPosition) return !1;
for (let e = 0; e < i; e++) {
let t = r[e], i, a;
if (this.config.projection === "web-mercator") {
let e = T(this.dragPosition[0], this.dragPosition[1]), r = T(n[0], n[1]), o = T(t[0], t[1]), s = {
x: e.x - r.x,
y: e.y - r.y
}, { lng: c, lat: l } = E(o.x - s.x, o.y - s.y);
i = c, a = l;
} else {
let e = [this.dragPosition[0] - n[0], this.dragPosition[1] - n[1]];
i = t[0] - e[0], a = t[1] - e[1];
}
if (i = C(i, this.config.coordinatePrecision), a = C(a, this.config.coordinatePrecision), i > 180 || i < -180 || a > 90 || a < -90) return !1;
r[e] = [i, a];
}
t.type === "Polygon" && (r[r.length - 1] = [r[0][0], r[0][1]]);
let a = this.draggedFeatureId, s = null;
if (t.type === "Polygon") s = this.mutateFeature.updatePolygon({
featureId: a,
coordinateMutations: {
type: j,
coordinates: [r]
},
context: { updateType: o.Provisional }
});
else {
if (t.type !== "LineString") return;
s = this.mutateFeature.updateLineString({
featureId: a,
coordinateMutations: {
type: j,
coordinates: r
},
context: { updateType: o.Provisional }
});
}
if (!s) return !1;
let c = s.geometry.coordinates;
this.midPoints.updateAllInPlace({ featureCoordinates: c }), this.selectionPoints.updateAllInPlace({ featureCoordinates: c }), this.coordinatePoints.updateAllInPlace({
featureId: a,
featureCoordinates: c
}), this.dragPosition = [e.lng, e.lat];
} else t.type === "Point" && (this.mutateFeature.updatePoint({
featureId: this.draggedFeatureId,
coordinateMutations: {
type: j,
coordinates: n
},
context: { updateType: o.Provisional }
}), this.dragPosition = [e.lng, e.lat]);
}
}, bt = class extends D {
constructor(e, t, n, r, i, a, o, s, c) {
super(e), this.config = void 0, this.pixelDistance = void 0, this.selectionPoints = void 0, this.midPoints = void 0, this.coordinatePoints = void 0, this.coordinateSnapping = void 0, this.lineSnapping = void 0, this.readFeature = void 0, this.mutateFeature = void 0, this.draggedCoordinate = {
id: null,
index: -1
}, this.config = e, this.pixelDistance = t, this.selectionPoints = n, this.midPoints = r, this.coordinatePoints = i, this.coordinateSnapping = a, this.lineSnapping = o, this.readFeature = s, this.mutateFeature = c;
}
getClosestCoordinate(e, t) {
let n = {
dist: Infinity,
index: -1,
isFirstOrLastPolygonCoord: !1
}, r;
if (t.type === "LineString") r = t.coordinates;
else {
if (t.type !== "Polygon") return n;
r = t.coordinates[0];
}
for (let i = 0; i < r.length; i++) {
let a = this.pixelDistance.measure(e, r[i]);
if (a < this.pointerDistance && a < n.dist) {
let e = t.type === "Polygon" && (i === r.length - 1 || i === 0);
n.dist = a, n.index = e ? 0 : i, n.isFirstOrLastPolygonCoord = e;
}
}
return n;
}
getDraggable(e, t) {
let n = this.readFeature.getGeometry(t);
return this.getClosestCoordinate(e, n);
}
getDraggableIndex(e, t) {
let n = this.readFeature.getGeometry(t), r = this.getClosestCoordinate(e, n);
return r.index === -1 ? -1 : r.index;
}
snapCoordinate(e, t, n) {
let r = [e.lng, e.lat], i = (e) => !!(e.properties && e.properties.mode === n.properties.mode && e.id !== this.draggedCoordinate.id);
if (t != null && t.toLine) {
let t;
t = this.lineSnapping.getSnappable(e, i).coordinate, t && (r = t);
}
if (t.toCoordinate) {
let t;
t = this.coordinateSnapping.getSnappable(e, i).coordinate, t && (r = t);
}
if (t != null && t.toCustom) {
let i;
i = t.toCustom(e, {
currentCoordinate: this.draggedCoordinate.index,
currentId: n.id,
getCurrentGeometrySnapshot: n.id ? () => this.readFeature.getGeometry(n.id) : () => null,
project: this.project,
unproject: this.unproject
}), i && (r = i);
}
return r;
}
drag(e, t, n) {
let r = this.draggedCoordinate.id;
if (r === null) return !1;
let i = this.draggedCoordinate.index, a = this.readFeature.getGeometry(r), s = this.readFeature.getProperties(r), c = a.type === "LineString" ? a.coordinates : a.coordinates[0], l = a.type === "Polygon" && (i === c.length - 1 || i === 0), u = this.snapCoordinate(e, n, {
type: "Feature",
id: r,
geometry: a,
properties: s
});
if (e.lng > 180 || e.lng < -180 || e.lat > 90 || e.lat < -90) return !1;
if (l) {
let e = c.length - 1;
c[0] = u, c[e] = u;
} else c[i] = u;
if (a.type !== "Point" && !t && ae({
type: "Feature",
geometry: a,
properties: {}
})) return !1;
let d = r, f = null;
return a.type === "Polygon" ? f = this.mutateFeature.updatePolygon({
featureId: d,
coordinateMutations: {
type: j,
coordinates: [c]
},
context: { updateType: o.Provisional }
}) : a.type === "LineString" && (f = this.mutateFeature.updateLineString({
featureId: d,
coordinateMutations: {
type: j,
coordinates: c
},
context: { updateType: o.Provisional }
})), !!f && (this.midPoints.updateOneAtIndex(i > 0 ? i - 1 : -1, c), this.midPoints.updateOneAtIndex(i, c), this.selectionPoints.updateOneAtIndex(i, u), this.coordinatePoints.updateOneAtIndex(d, i, u), !0);
}
isDragging() {
return this.draggedCoordinate.id !== null;
}
startDragging(e, t) {
this.draggedCoordinate = {
id: e,
index: t
};
}
stopDragging() {
this.draggedCoordinate = {
id: null,
index: -1
};
}
};
function xt(e) {
let t = 0, n = 0, r = 0;
return (e.geometry.type === "Polygon" ? e.geometry.coordinates[0].slice(0, -1) : e.geometry.coordinates).forEach((e) => {
t += e[0], n += e[1], r++;
}, !0), [t / r, n / r];
}
var St = (e, t) => {
if (t === 0 || t === 360 || t === -360) return e;
let n = .017453292519943295 * t, r = (e.geometry.type === "Polygon" ? e.geometry.coordinates[0] : e.geometry.coordinates).map(([e, t]) => T(e, t)), i = r.reduce((e, t) => ({
x: e.x + t.x,
y: e.y + t.y
}), {
x: 0,
y: 0
});
i.x /= r.length, i.y /= r.length;
let a = r.map((e) => ({
x: i.x + (e.x - i.x) * Math.cos(n) - (e.y - i.y) * Math.sin(n),
y: i.y + (e.x - i.x) * Math.sin(n) + (e.y - i.y) * Math.cos(n)
})).map(({ x: e, y: t }) => [E(e, t).lng, E(e, t).lat]);
return e.geometry.type === "Polygon" ? e.geometry.coordinates[0] = a : e.geometry.coordinates = a, e;
};
function Ct(e) {
let t = (e.geometry.type === "Polygon" ? e.geometry.coordinates[0] : e.geometry.coordinates).map((e) => {
let { x: t, y: n } = T(e[0], e[1]);
return [t, n];
});
return e.geometry.type === "Polygon" ? function(e) {
let t = 0, n = 0, r = 0, i = e.length;
for (let a = 0; a < i - 1; a++) {
let [i, o] = e[a], [s, c] = e[a + 1], l = i * c - s * o;
t += l, n += (i + s) * l, r += (o + c) * l;
}
return t /= 2, n /= 6 * t, r /= 6 * t, {
x: n,
y: r
};
}(t) : function(e) {
let t = e.length, n = 0, r = 0;
for (let i = 0; i < t; i++) {
let [t, a] = e[i];
n += t, r += a;
}
return {
x: n / t,
y: r / t
};
}(t);
}
var wt = class extends D {
constructor(e, t, n, r, i, a) {
super(e), this.config = void 0, this.selectionPoints = void 0, this.midPoints = void 0, this.coordinatePoints = void 0, this.readFeature = void 0, this.mutateFeature = void 0, this.lastBearing = void 0, this.selectedGeometry = void 0, this.selectedGeometryCentroid = void 0, this.selectedGeometryWebMercatorCentroid = void 0, this.config = e, this.selectionPoints = t, this.midPoints = n, this.coordinatePoints = r, this.readFeature = i, this.mutateFeature = a;
}
reset() {
this.lastBearing = void 0, this.selectedGeometry = void 0, this.selectedGeometryWebMercatorCentroid = void 0, this.selectedGeometryCentroid = void 0;
}
rotate(e, t) {
this.selectedGeometry ||= this.readFeature.getGeometry(t);
let n = this.selectedGeometry;
if (n.type !== "Polygon" && n.type !== "LineString") return;
let r = [e.lng, e.lat], i, a = {
type: "Feature",
geometry: n,
properties: {}
};
if (this.config.projection === "web-mercator") {
this.selectedGeometryWebMercatorCentroid ||= Ct(a);
let t = T(e.lng, e.lat);
if (i = I(this.selectedGeometryWebMercatorCentroid, t), i === 0) return;
if (!this.lastBearing) return void (this.lastBearing = i);
St(a, -(this.lastBearing - i));
} else {
if (this.config.projection !== "globe") throw Error("Unsupported projection");
if (this.selectedGeometryCentroid ||= xt({
type: "Feature",
geometry: n,
properties: {}
}), i = lt(this.selectedGeometryCentroid, r), !this.lastBearing) return void (this.lastBearing = i + 180);
(function(e, t) {
if (t === 0 || t === 360 || t === -360) return e;
let n = xt(e);
(e.geometry.type === "Polygon" ? e.geometry.coordinates[0] : e.geometry.coordinates).forEach((e) => {
let r = lt(n, e) + t, i = ut(n, function(e, t) {
e[0] += e[0] - t[0] > 180 ? -360 : t[0] - e[0] > 180 ? 360 : 0;
let n = b, r = t[1] * Math.PI / 180, i = e[1] * Math.PI / 180, a = i - r, o = Math.abs(e[0] - t[0]) * Math.PI / 180;
o > Math.PI && (o -= 2 * Math.PI);
let s = Math.log(Math.tan(i / 2 + Math.PI / 4) / Math.tan(r / 2 + Math.PI / 4)), c = Math.abs(s) > 1e-11 ? a / s : Math.cos(r);
return Math.sqrt(a * a + c * c * o * o) * n;
}(n, e), r);
e[0] = i[0], e[1] = i[1];
});
})(a, -(this.lastBearing - (i + 180)));
}
let s = n.type === "Polygon" ? n.coordinates[0] : n.coordinates;
s.forEach((e) => {
e[0] = C(e[0], this.coordinatePrecision), e[1] = C(e[1], this.coordinatePrecision);
});
let c = {
featureId: t,
coordinateMutations: {
type: j,
coordinates: n.type === "Polygon" ? [s] : s
},
context: { updateType: o.Provisional }
}, l = null;
if (a.geometry.type === "Polygon") l = this.mutateFeature.updatePolygon(c);
else {
if (a.geometry.type !== "LineString") return;
l = this.mutateFeature.updateLineString(c);
}
if (!l) return !1;
let u = l.geometry.coordinates;
this.midPoints.updateAllInPlace({ featureCoordinates: u }), this.selectionPoints.updateAllInPlace({ featureCoordinates: u }), this.coordinatePoints.updateAllInPlace({
featureId: t,
featureCoordinates: u
}), this.projection === "web-mercator" ? this.lastBearing = i : this.projection === "globe" && (this.lastBearing = i + 180);
}
}, Tt = class extends D {
constructor(e, t) {
super(e), this.config = void 0, this.dragCoordinateResizeBehavior = void 0, this.config = e, this.dragCoordinateResizeBehavior = t;
}
scale(e, t) {
if (!this.dragCoordinateResizeBehavior.isDragging()) {
let n = this.dragCoordinateResizeBehavior.getDraggableIndex(e, t);
this.dragCoordinateResizeBehavior.startDragging(t, n);
}
this.dragCoordinateResizeBehavior.drag(e, "center-fixed");
}
reset() {
this.dragCoordinateResizeBehavior.stopDragging();
}
};
function Et({ coordinates: e, originX: t, originY: n, xScale: r, yScale: i }) {
r === 1 && i === 1 || e.forEach((e) => {
let { x: a, y: o } = T(e[0], e[1]), { lng: s, lat: c } = E(t + (a - t) * r, n + (o - n) * i);
e[0] = s, e[1] = c;
});
}
var Dt = class extends D {
constructor(e, t, n, r, i, a, o) {
super(e), this.config = void 0, this.pixelDistance = void 0, this.selectionPoints = void 0, this.midPoints = void 0, this.coordinatePoints = void 0, this.readFeature = void 0, this.mutateFeature = void 0, this.minimumScale = 1e-4, this.draggedCoordinate = {
id: null,
index: -1
}, this.boundingBoxMaps = { opposite: {
0: 4,
1: 5,
2: 6,
3: 7,
4: 0,
5: 1,
6: 2,
7: 3
} }, this.config = e, this.pixelDistance = t, this.selectionPoints = n, this.midPoints = r, this.coordinatePoints = i, this.readFeature = a, this.mutateFeature = o;
}
getClosestCoordinate(e, t) {
let n = {
dist: Infinity,
index: -1,
isFirstOrLastPolygonCoord: !1
}, r;
if (t.type === "LineString") r = t.coordinates;
else {
if (t.type !== "Polygon") return n;
r = t.coordinates[0];
}
for (let i = 0; i < r.length; i++) {
let a = this.pixelDistance.measure(e, r[i]);
if (a < this.pointerDistance && a < n.dist) {
let e = t.type === "Polygon" && (i === r.length - 1 || i === 0);
n.dist = a, n.index = e ? 0 : i, n.isFirstOrLastPolygonCoord = e;
}
}
return n;
}
isValidDragWebMercator(e, t, n) {
switch (e) {
case 0:
if (t <= 0 || n >= 0) return !1;
break;
case 1:
if (n >= 0) return !1;
break;
case 2:
if (t >= 0 || n >= 0) return !1;
break;
case 3:
if (t >= 0) return !1;
break;
case 4:
if (t >= 0 || n <= 0) return !1;
break;
case 5:
if (n <= 0) return !1;
break;
case 6:
if (t <= 0 || n <= 0) return !1;
break;
case 7: if (t <= 0) return !1;
}
return !0;
}
getSelectedFeatureDataWebMercator() {
if (!this.draggedCoordinate.id || this.draggedCoordinate.index === -1) return null;
let e = this.getFeature(this.draggedCoordinate.id);
if (!e) return null;
let t = this.getNormalisedCoordinates(e.geometry);
return {
boundingBox: this.getBBoxWebMercator(t),
feature: e,
updatedCoords: t,
selectedCoordinate: t[this.draggedCoordinate.index]
};
}
centerWebMercatorDrag(e) {
let t = this.getSelectedFeatureDataWebMercator();
if (!t) return null;
let { feature: n, boundingBox: r, updatedCoords: i, selectedCoordinate: a } = t, o = Ct(n);
if (!o) return null;
let s = T(a[0], a[1]), { closestBBoxIndex: c } = this.getIndexesWebMercator(r, s), l = T(e.lng, e.lat);
return this.scaleWebMercator({
closestBBoxIndex: c,
updatedCoords: i,
webMercatorCursor: l,
webMercatorSelected: s,
webMercatorOrigin: o
}), i;
}
centerFixedWebMercatorDrag(e) {
let t = this.getSelectedFeatureDataWebMercator();
if (!t) return null;
let { feature: n, boundingBox: r, updatedCoords: i, selectedCoordinate: a } = t, o = Ct(n);
if (!o) return null;
let s = T(a[0], a[1]), { closestBBoxIndex: c } = this.getIndexesWebMercator(r, s), l = T(e.lng, e.lat);
return this.scaleFixedWebMercator({
closestBBoxIndex: c,
updatedCoords: i,
webMercatorCursor: l,
webMercatorSelected: s,
webMercatorOrigin: o
}), i;
}
scaleFixedWebMercator({ closestBBoxIndex: e, webMercatorOrigin: t, webMercatorSelected: n, webMercatorCursor: r, updatedCoords: i }) {
if (!this.isValidDragWebMercator(e, t.x - r.x, t.y - r.y)) return null;
let a = N(t, r) / N(t, n);
return a < 0 && (a = this.minimumScale), Et({
coordinates: i,
originX: t.x,
originY: t.y,
xScale: a,
yScale: a
}), i;
}
oppositeFixedWebMercatorDrag(e) {
let t = this.getSelectedFeatureDataWebMercator();
if (!t) return null;
let { boundingBox: n, updatedCoords: r, selectedCoordinate: i } = t, a = T(i[0], i[1]), { oppositeBboxIndex: o, closestBBoxIndex: s } = this.getIndexesWebMercator(n, a), c = {
x: n[o][0],
y: n[o][1]
}, l = T(e.lng, e.lat);
return this.scaleFixedWebMercator({
closestBBoxIndex: s,
updatedCoords: r,
webMercatorCursor: l,
webMercatorSelected: a,
webMercatorOrigin: c
}), r;
}
oppositeWebMercatorDrag(e) {
let t = this.getSelectedFeatureDataWebMercator();
if (!t) return null;
let { boundingBox: n, updatedCoords: r, selectedCoordinate: i } = t, a = T(i[0], i[1]), { oppositeBboxIndex: o, closestBBoxIndex: s } = this.getIndexesWebMercator(n, a), c = {
x: n[o][0],
y: n[o][1]
}, l = T(e.lng, e.lat);
return this.scaleWebMercator({
closestBBoxIndex: s,
updatedCoords: r,
webMercatorCursor: l,
webMercatorSelected: a,
webMercatorOrigin: c
}), r;
}
scaleWebMercator({ closestBBoxIndex: e, webMercatorOrigin: t, webMercatorSelected: n, webMercatorCursor: r, updatedCoords: i }) {
let a = t.x - r.x, o = t.y - r.y;
if (!this.isValidDragWebMercator(e, a, o)) return null;
let s = 1;
a !== 0 && e !== 1 && e !== 5 && (s = 1 - (t.x - n.x - a) / a);
let c = 1;
return o !== 0 && e !== 3 && e !== 7 && (c = 1 - (t.y - n.y - o) / o), this.validateScale(s, c) ? (s < 0 && (s = this.minimumScale), c < 0 && (c = this.minimumScale), this.performWebMercatorScale(i, t.x, t.y, s, c), i) : null;
}
getFeature(e) {
if (this.draggedCoordinate.id === null) return null;
let t = this.readFeature.getGeometry(e);
return t.type !== "Polygon" && t.type !== "LineString" ? null : {
id: e,
type: "Feature",
geometry: t,
properties: {}
};
}
getNormalisedCoordinates(e) {
return e.type === "Polygon" ? e.coordinates[0] : e.coordinates;
}
validateScale(e, t) {
return !isNaN(e) && t < 2 ** 53 - 1 && !isNaN(t) && t < 2 ** 53 - 1;
}
performWebMercatorScale(e, t, n, r, i) {
e.forEach((e) => {
let { x: a, y: o } = T(e[0], e[1]), { lng: s, lat: c } = E(t + (a - t) * r, n + (o - n) * i);
e[0] = s, e[1] = c;
});
}
getBBoxWebMercator(e) {
let t = [
Infinity,
Infinity,
-Infinity,
-Infinity
];
(e = e.map((e) => {
let { x: t, y: n } = T(e[0], e[1]);
return [t, n];
})).forEach(([e, n]) => {
e < t[0] && (t[0] = e), n < t[1] && (t[1] = n), e > t[2] && (t[2] = e), n > t[3] && (t[3] = n);
});
let [n, r, i, a] = t;
return [
[n, a],
[(n + i) / 2, a],
[i, a],
[i, a + (r - a) / 2],
[i, r],
[(n + i) / 2, r],
[n, r],
[n, a + (r - a) / 2]
];
}
getIndexesWebMercator(e, t) {
let n, r = Infinity;
for (let i = 0; i < e.length; i++) {
let a = N({
x: t.x,
y: t.y
}, {
x: e[i][0],
y: e[i][1]
});
a < r && (n = i, r = a);
}
if (n === void 0) throw Error("No closest coordinate found");
return {
oppositeBboxIndex: this.boundingBoxMaps.opposite[n],
closestBBoxIndex: n
};
}
isDragging() {
return this.draggedCoordinate.id !== null;
}
startDragging(e, t) {
this.draggedCoordinate = {
id: e,
index: t
};
}
stopDragging() {
this.draggedCoordinate = {
id: null,
index: -1
};
}
getDraggableIndex(e, t) {
let n = this.readFeature.getGeometry(t), r = this.getClosestCoordinate(e, n);
return r.index === -1 ? -1 : r.index;
}
drag(e, t) {
if (!this.draggedCoordinate.id) return !1;
let n = this.getFeature(this.draggedCoordinate.id);
if (!n) return !1;
let r = null;
if (t === "center" ? r = this.centerWebMercatorDrag(e) : t === "opposite" ? r = this.oppositeWebMercatorDrag(e) : t === "center-fixed" ? r = this.centerFixedWebMercatorDrag(e) : t === "opposite-fixed" && (r = this.oppositeFixedWebMercatorDrag(e)), !r) return !1;
for (let e = 0; e < r.length; e++) {
let t = r[e];
if (t[0] = C(t[0], this.coordinatePrecision), t[1] = C(t[1], this.coordinatePrecision), !se(t, this.coordinatePrecision)) return !1;
}
let i = n.id, a = null;
if (n.geometry.type === "Polygon" ? a = this.mutateFeature.updatePolygon({
featureId: i,
coordinateMutations: {
type: j,
coordinates: [r]
},
context: { updateType: o.Provisional }
}) : n.geometry.type === "LineString" && (a = this.mutateFeature.updateLineString({
featureId: i,
coordinateMutations: {
type: j,
coordinates: r
},
context: { updateType: o.Provisional }
})), !a) return !1;
let s = a.geometry.coordinates;
return this.midPoints.updateAllInPlace({ featureCoordinates: s }), this.selectionPoints.updateAllInPlace({ featureCoordinates: s }), this.coordinatePoints.updateAllInPlace({
featureId: i,
featureCoordinates: s
}), !0;
}
}, Ot = {
deselect: "Escape",
delete: "Delete",
rotate: ["Control", "r"],
scale: ["Control", "s"]
}, kt = {
pointerOver: "move",
dragStart: "move",
dragEnd: "move",
insertMidpoint: "crosshair"
}, At = class extends v {
getPointerOverFeatureCursor() {
return this.cursors.pointerOverFeature ?? this.cursors.pointerOver;
}
getPointerOverCoordinateCursor() {
return this.cursors.pointerOverCoordinate ?? this.cursors.pointerOver;
}
getPointerOverResizeHandleCursor() {
return this.cursors.pointerOverResizeHandle ?? this.cursors.pointerOver;
}
constructor(e) {
super(e, !0), this.mode = "select", this.allowManualDeselection = !0, this.allowManualSelection = !0, this.dragEventThrottle = 5, this.dragEventCount = 0, this.selected = [], this.flags = {}, this.keyEvents = Ot, this.cursors = kt, this.validations = {}, this.dragTarget = { type: "none" }, this.selectionPoints = void 0, this.midPoints = void 0, this.coordinateSnap = void 0, this.featuresAtMouseEvent = void 0, this.pixelDistance = void 0, this.clickBoundingBox = void 0, this.dragFeature = void 0, this.dragCoordinate = void 0, this.rotateFeature = void 0, this.scaleFeature = void 0, this.dragCoordinateResizeFeature = void 0, this.coordinatePoints = void 0, this.lineSnap = void 0, this.mutateFeature = void 0, this.readFeature = void 0, this.updateOptions(e);
}
updateOptions(e) {
if (super.updateOptions(e), this.cursors = e && e.cursors ? t({}, this.cursors, e.cursors) : kt, e?.keyEvents === null ? this.keyEvents = {
deselect: null,
delete: null,
rotate: null,
scale: null
} : e != null && e.keyEvents && (this.keyEvents = t({}, this.keyEvents, e.keyEvents)), e?.dragEventThrottle !== void 0 && (this.dragEventThrottle = e.dragEventThrottle), e?.allowManualDeselection !== void 0 && (this.allowManualDeselection = e.allowManualDeselection), e?.allowManualSelection !== void 0 && (this.allowManualSelection = e.allowManualSelection), e != null && e.flags) {
this.flags = t({}, this.flags, e.flags), this.validations = {};
for (let e in this.flags) {
let t = this.flags[e].feature;
t && t.validation && (this.validations[e] = t.validation);
}
}
}
selectFeature(e) {
this.select(e, !1);
}
setSelecting() {
if (this._state !== "started") throw Error("Mode must be started to move to selecting state");
this._state = "selecting";
}
registerBehaviors(e) {
this.readFeature = new P(e), this.mutateFeature = new M(e, { validate: (e, t) => {
let n = e.properties.mode;
return this.validations && this.validations[n] ? this.validations[n](e, t) : { valid: !0 };
} }), this.pixelDistance = new F(e), this.clickBoundingBox = new Ee(e), this.featuresAtMouseEvent = new vt(e, this.clickBoundingBox, this.pixelDistance), this.selectionPoints = new ht(e, this.mutateFeature), this.coordinatePoints = new Ge(e, this.readFeature, this.mutateFeature), this.midPoints = new mt(e, this.selectionPoints, this.coordinatePoints, this.mutateFeature, this.readFeature, this.pixelDistance), this.coordinateSnap = new De(e, this.pixelDistance, this.clickBoundingBox), this.lineSnap = new Be(e, this.pixelDistance, this.clickBoundingBox), this.rotateFeature = new wt(e, this.selectionPoints, this.midPoints, this.coordinatePoints, this.readFeature, this.mutateFeature), this.dragFeature = new yt(e, this.featuresAtMouseEvent, this.selectionPoints, this.midPoints, this.coordinatePoints, this.readFeature, this.mutateFeature), this.dragCoordinate = new bt(e, this.pixelDistance, this.selectionPoints, this.midPoints, this.coordinatePoints, this.coordinateSnap, this.lineSnap, this.readFeature, this.mutateFeature), this.dragCoordinateResizeFeature = new Dt(e, this.pixelDistance, this.selectionPoints, this.midPoints, this.coordinatePoints, this.readFeature, this.mutateFeature), this.scaleFeature = new Tt(e, this.dragCoordinateResizeFeature);
}
deselectFeature(e) {
this.deselect(e);
}
deselect(e) {
this.selected.includes(e) && (this.mutateFeature.setDeselected(this.selected), this.onDeselect(this.selected[0]), this.selected = [], this.selectionPoints.delete(), this.midPoints.delete(), this.dragTarget = { type: "none" });
}
deleteSelected() {
this.selected.length && this.mutateFeature.deleteFeaturesIfPresent(this.selected), this.selected = [], this.dragTarget = { type: "none" };
}
clearDragTargetAndCursor() {
this.dragTarget = { type: "none" }, this.setCursor("unset");
}
getSelectedFlags(e) {
let t = this.readFeature.getProperties(e), n = this.flags[t.mode]?.feature, r = n?.coordinates;
return {
featureFlags: n,
coordinatesFlags: r,
hasDraggableFlags: n && (n.draggable || r?.draggable || r?.resizable || typeof r?.midpoints == "object" && r.midpoints.draggable)
};
}
onRightClick(e) {
if (!this.selectionPoints.ids.length) return;
let t, n = Infinity;
if (this.selectionPoints.ids.forEach((r) => {
let i = this.readFeature.getGeometry(r), a = this.pixelDistance.measure(e, i.coordinates);
a < this.pointerDistance && a < n && (n = a, t = this.readFeature.getProperties(r));
}), !t) return;
let r = t.selectionPointFeatureId, a = t.index, s = this.readFeature.getProperties(r), c = this.flags[s.mode];
if (!(c && c.feature && c.feature.coordinates && c.feature.coordinates.deletable)) return;
let l = this.readFeature.getGeometry(r), u;
if (l.type === "Polygon") {
if (u = l.coordinates[0], u.length <= 4) return;
} else if (l.type !== "LineString" || (u = l.coordinates, u.length <= 2)) return;
l.type !== "Polygon" || a !== 0 && a !== u.length - 1 ? u.splice(a, 1) : (u.shift(), u.pop(), u.push([u[0][0], u[0][1]]));
let d = null;
if (l.type === "Polygon" ? d = this.mutateFeature.updatePolygon({
featureId: r,
coordinateMutations: {
type: j,
coordinates: [u]
},
context: { updateType: o.Commit }
}) : l.type === "LineString" && (d = this.mutateFeature.updateLineString({
featureId: r,
coordinateMutations: {
type: j,
coordinates: u
},
context: { updateType: o.Commit }
})), !d) return;
let f = d.geometry.coordinates;
this.mutateFeature.deleteFeaturesIfPresent([...this.midPoints.ids, ...this.selectionPoints.ids]), s.coordinatePointIds && this.coordinatePoints.createOrUpdate({
featureId: r,
featureCoordinates: f
}), this.selectionPoints.create({
featureCoordinates: f,
featureId: r
}), c && c.feature && c.feature.coordinates && c.feature.coordinates.midpoints && this.midPoints.create({
featureCoordinates: f,
featureId: r
}), this.onFinish(r, {
action: i,
mode: this.mode
});
}
select(e, t = !0) {
if (this.selected[0] === e) return;
let { mode: n } = this.readFeature.getProperties(e), r = this.flags[n];
if (!r || !r.feature) return;
let i = this.selected[0];
if (i) {
if (i === e) return;
this.deselect(i);
}
t && this.setCursor(this.getPointerOverFeatureCursor()), this.selected = [e], this.mutateFeature.setSelected(e), this.onSelect(e);
let { type: a, coordinates: o } = this.readFeature.getGeometry(e);
a !== "LineString" && a !== "Polygon" || o && r && r.feature.coordinates && (this.selectionPoints.create({
featureCoordinates: o,
featureId: e
}), r.feature.coordinates.midpoints && this.midPoints.create({
featureCoordinates: o,
featureId: e
}));
}
onLeftClick(e) {
let { clickedFeature: t } = this.featuresAtMouseEvent.find(e, this.selected.length > 0), n = this.midPoints.getNearestMidPoint(e), r = this.selected[0];
if (r) {
var i;
let { featureFlags: t } = this.getSelectedFlags(r);
if (t != null && (i = t.coordinates) != null && i.midpoints && n) {
if (t.coordinates.draggable) {
let t = this.pixelDistance.measure(e, this.readFeature.getGeometry(n).coordinates), { dist: i } = this.dragCoordinate.getDraggable(e, r);
if (i !== void 0 && t > i) return;
}
this.midPoints.insert({
featureId: r,
midPointId: n
}), this.onFinish(this.selected[0], {
action: a,
mode: this.mode
});
return;
}
}
if (t != null && t.id) this.allowManualSelection && this.select(t.id, !0);
else if (this.selected.length && this.allowManualDeselection) return void this.deselect(this.selected[0]);
}
start() {
this.setStarted(), this.setSelecting();
}
stop() {
this.cleanUp(), this.setStarted(), this.setStopped();
}
onClick(e) {
e.button === "right" && this.allowPointerEvent(this.pointerEvents.rightClick, e) || e.isContextMenu && this.allowPointerEvent(this.pointerEvents.contextMenu, e) ? this.onRightClick(e) : e.button === "left" && this.allowPointerEvent(this.pointerEvents.leftClick, e) && this.onLeftClick(e);
}
canScale(e) {
return this.keyEvents.scale && this.keyEvents.scale.every((t) => e.heldKeys.includes(t));
}
canRotate(e) {
return this.keyEvents.rotate && this.keyEvents.rotate.every((t) => e.heldKeys.includes(t));
}
preventDefaultKeyEvent(e) {
let t = this.canRotate(e), n = this.canScale(e);
(t || n) && e.preventDefault();
}
onKeyDown(e) {
this.preventDefaultKeyEvent(e);
}
onKeyUp(e) {
if (this.preventDefaultKeyEvent(e), this.keyEvents.delete && e.key === this.keyEvents.delete) {
if (!this.selected.length) return;
let e = this.selected[0];
this.onDeselect(this.selected[0]), this.coordinatePoints.deletePointsByFeatureIds([e]), this.deleteSelected(), this.selectionPoints.delete(), this.midPoints.delete();
} else this.keyEvents.deselect && e.key === this.keyEvents.deselect && this.cleanUp();
}
cleanUp() {
this.selected.length && this.deselect(this.selected[0]);
}
onDragStart(e, t) {
if (!this.allowPointerEvent(this.pointerEvents.onDragStart, e)) return;
let n = this.selected[0];
if (!n) return;
let { featureFlags: r, coordinatesFlags: i, hasDraggableFlags: o } = this.getSelectedFlags(n);
if (!o) return;
this.dragEventCount = 0;
let s = this.dragTarget.type !== "none" && this.dragTarget.featureId === n ? this.dragTarget : { type: "none" }, c = s.type === "coordinate" ? s.coordinateIndex : this.dragCoordinate.getDraggableIndex(e, n), l = s.type === "resize" ? s.coordinateIndex : this.dragCoordinateResizeFeature.getDraggableIndex(e, n), u = i?.resizable && l !== -1, d = i?.draggable && c !== -1, f = i && typeof i.midpoints == "object" && i.midpoints.draggable, p = r?.draggable && (s.type === "feature" || this.dragFeature.canDrag(e, n));
if (u) return this.setCursor(this.cursors.dragStart), this.dragCoordinateResizeFeature.startDragging(n, l), void t(!1);
if (d) return this.setCursor(this.cursors.dragStart), this.dragCoordinate.startDragging(n, c), void t(!1);
if (f) {
let r = s.type === "midpoint" ? s.midPointId : this.midPoints.getNearestMidPoint(e);
if (this.selected.length && r) {
this.midPoints.insert({
featureId: n,
midPointId: r
}), this.onFinish(this.selected[0], {
action: a,
mode: this.mode
});
let i = this.dragCoordinate.getDraggableIndex(e, n);
this.dragCoordinate.startDragging(n, i), t(!1);
return;
}
}
if (p) return this.setCursor(this.cursors.dragStart), this.dragFeature.startDragging(e, n), void t(!1);
this.setCursor("unset");
}
onDrag(e, t) {
if (!this.allowPointerEvent(this.pointerEvents.onDrag, e)) return;
let n = this.selected[0];
if (!n) return;
let r = this.readFeature.getProperties(n), i = this.flags[r.mode], a = !0 === (i && i.feature && i.feature.selfIntersectable);
if (this.dragEventCount++, this.dragEventCount % this.dragEventThrottle != 0) {
if (i && i.feature && i.feature.rotateable && this.canRotate(e)) return t(!1), void this.rotateFeature.rotate(e, n);
if (i && i.feature && i.feature.scaleable && this.canScale(e)) return t(!1), void this.scaleFeature.scale(e, n);
if (this.dragCoordinateResizeFeature.isDragging() && i.feature && i.feature.coordinates && i.feature.coordinates.resizable) {
if (this.projection === "globe") throw Error("Globe is currently unsupported projection for resizable");
t(!1), this.dragCoordinateResizeFeature.drag(e, i.feature.coordinates.resizable);
return;
}
if (this.dragCoordinate.isDragging()) {
var o;
let t = (o = i.feature) == null || (o = o.coordinates) == null ? void 0 : o.snappable, n = { toCoordinate: !1 };
!0 === t ? n = { toCoordinate: !0 } : typeof t == "object" && (n = t), this.dragCoordinate.drag(e, a, n);
return;
}
this.dragFeature.isDragging() ? this.dragFeature.drag(e) : t(!0);
}
}
onDragEnd(e, t) {
this.allowPointerEvent(this.pointerEvents.onDragEnd, e) && (this.setCursor(this.cursors.dragEnd), this.dragCoordinate.isDragging() ? this.onFinish(this.selected[0], {
mode: this.mode,
action: "dragCoordinate"
}) : this.dragFeature.isDragging() ? this.onFinish(this.selected[0], {
mode: this.mode,
action: "dragFeature"
}) : this.dragCoordinateResizeFeature.isDragging() && this.onFinish(this.selected[0], {
mode: this.mode,
action: "dragCoordinateResize"
}), this.dragCoordinate.stopDragging(), this.dragFeature.stopDragging(), this.dragCoordinateResizeFeature.stopDragging(), this.rotateFeature.reset(), this.scaleFeature.reset(), t(!0));
}
onMouseMove(e) {
let t = this.selected[0];
if (!t) return void this.clearDragTargetAndCursor();
if (this.dragFeature.isDragging() || this.dragCoordinate.isDragging() || this.dragCoordinateResizeFeature.isDragging()) return;
let { featureFlags: n } = this.getSelectedFlags(t);
if (!n) return void this.clearDragTargetAndCursor();
let r, i = n.coordinates;
if (i != null && i.midpoints && (r = this.midPoints.getNearestMidPoint(e), r && (this.dragTarget = {
type: "midpoint",
featureId: t,
midPointId: r
}, this.setCursor(this.cursors.insertMidpoint))), i && i.draggable) {
let { index: n, dist: i } = this.dragCoordinate.getDraggable(e, t);
if (n > -1) {
if (r && this.pixelDistance.measure(e, this.readFeature.getGeometry(r).coordinates) < i) return;
this.dragTarget = {
type: "coordinate",
featureId: t,
coordinateIndex: n
}, this.setCursor(this.getPointerOverCoordinateCursor());
return;
}
}
if (i && i.resizable) {
let n = this.dragCoordinateResizeFeature.getDraggableIndex(e, t);
if (n > -1) return this.dragTarget = {
type: "resize",
featureId: t,
coordinateIndex: n
}, void this.setCursor(this.getPointerOverResizeHandleCursor());
}
if (n.draggable && this.dragFeature.canDrag(e, t)) {
if (r) return;
this.dragTarget = {
type: "feature",
featureId: t
}, this.setCursor(this.getPointerOverFeatureCursor());
return;
}
r || this.clearDragTargetAndCursor();
}
styleFeature(e) {
let n = t({}, {
polygonFillColor: "#3f97e0",
polygonOutlineColor: "#3f97e0",
polygonOutlineWidth: 4,
polygonOutlineOpacity: 1,
polygonFillOpacity: .3,
pointColor: "#3f97e0",
pointOpacity: 1,
pointOutlineColor: "#ffffff",
pointOutlineOpacity: 1,
pointOutlineWidth: 0,
pointWidth: 6,
lineStringColor: "#3f97e0",
lineStringWidth: 4,
lineStringOpacity: 1,
zIndex: 0,
markerUrl: void 0,
markerHeight: void 0,
markerWidth: void 0,
lineStringDash: void 0
});
if (e.properties.mode === this.mode && e.geometry.type === "Point") {
if (e.properties[c.SELECTION_POINT]) return n.pointColor = this.getHexColorStylingValue(this.styles.selectionPointColor, n.pointColor, e), n.pointOpacity = this.getNumericStylingValue(this.styles.selectionPointOpacity, 1, e), n.pointOutlineColor = this.getHexColorStylingValue(this.styles.selectionPointOutlineColor, n.pointOutlineColor, e), n.pointWidth = this.getNumericStylingValue(this.styles.selectionPointWidth, n.pointWidth, e), n.pointOutlineOpacity = this.getNumericStylingValue(this.styles.selectionPointOutlineOpacity, 1, e), n.pointOutlineWidth = this.getNumericStylingValue(this.styles.selectionPointOutlineWidth, 2, e), n.zIndex = 30, n;
if (e.properties[c.MID_POINT]) return n.pointColor = this.getHexColorStylingValue(this.styles.midPointColor, n.pointColor, e), n.pointOpacity = this.getNumericStylingValue(this.styles.midPointOpacity, 1, e), n.pointOutlineColor = this.getHexColorStylingValue(this.styles.midPointOutlineColor, n.pointOutlineColor, e), n.pointWidth = this.getNumericStylingValue(this.styles.midPointWidth, 4, e), n.pointOutlineOpacity = this.getNumericStylingValue(this.styles.midPointOutlineOpacity, 1, e), n.pointOutlineWidth = this.getNumericStylingValue(this.styles.midPointOutlineWidth, 2, e), n.zIndex = 50, n;
} else if (e.properties[c.SELECTED]) {
if (e.geometry.type === "Point" && e.properties[l.MARKER]) return n.markerUrl = this.getUrlStylingValue(this.styles.selectedMarkerUrl, s, e), n.markerHeight = this.getNumericStylingValue(this.styles.selectedMarkerHeight, 40, e), n.markerWidth = this.getNumericStylingValue(this.styles.selectedMarkerWidth, 32, e), n;
if (e.geometry.type === "Polygon") return n.polygonFillColor = this.getHexColorStylingValue(this.styles.selectedPolygonColor, n.polygonFillColor, e), n.polygonOutlineWidth = this.getNumericStylingValue(this.styles.selectedPolygonOutlineWidth, n.polygonOutlineWidth, e), n.polygonOutlineColor = this.getHexColorStylingValue(this.styles.selectedPolygonOutlineColor, n.polygonOutlineColor, e), n.polygonOutlineOpacity = this.getNumericStylingValue(this.styles.selectedPolygonOutlineOpacity, 1, e), n.polygonFillOpacity = this.getNumericStylingValue(this.styles.selectedPolygonFillOpacity, n.polygonFillOpacity, e), n.zIndex = u, n;
if (e.geometry.type === "LineString") return n.lineStringColor = this.getHexColorStylingValue(this.styles.selectedLineStringColor, n.lineStringColor, e), n.lineStringWidth = this.getNumericStylingValue(this.styles.selectedLineStringWidth, n.lineStringWidth, e), n.zIndex = u, n;
if (e.geometry.type === "Point") return n.pointWidth = this.getNumericStylingValue(this.styles.selectedPointWidth, n.pointWidth, e), n.pointColor = this.getHexColorStylingValue(this.styles.selectedPointColor, n.pointColor, e), n.pointOpacity = this.getNumericStylingValue(this.styles.selectedPointOpacity, 1, e), n.pointOutlineColor = this.getHexColorStylingValue(this.styles.selectedPointOutlineColor, n.pointOutlineColor, e), n.pointOutlineOpacity = this.getNumericStylingValue(this.styles.selectedPointOutlineOpacity, 1, e), n.pointOutlineWidth = this.getNumericStylingValue(this.styles.selectedPointOutlineWidth, n.pointOutlineWidth, e), n.zIndex = u, n;
}
return n;
}
afterFeatureUpdated(e) {
if (this.selected.length && e.id === this.selected[0]) {
var t, n;
let r = this.flags[e.properties.mode];
if (r == null || (t = r.feature) == null || !t.coordinates) return;
let i = e.geometry.type, a = e.id;
if (this.selectionPoints.delete(), this.midPoints.delete(), i !== "LineString" && i !== "Polygon") return;
let o = e.geometry.coordinates;
this.selectionPoints.create({
featureCoordinates: o,
featureId: a
}), r != null && (n = r.feature) != null && (n = n.coordinates) != null && n.midpoints && this.midPoints.create({
featureCoordinates: o,
featureId: a
});
}
}
}, jt = class extends _ {
constructor(...e) {
super(...e), this.type = h.Static, this.mode = "static";
}
start() {}
stop() {}
onKeyUp() {}
onKeyDown() {}
onClick() {}
onDragStart() {}
onDrag() {}
onDragEnd() {}
onMouseMove() {}
cleanUp() {}
styleFeature() {
return t({}, {
polygonFillColor: "#3f97e0",
polygonOutlineColor: "#3f97e0",
polygonOutlineWidth: 4,
polygonOutlineOpacity: 1,
polygonFillOpacity: .3,
pointColor: "#3f97e0",
pointOpacity: 1,
pointOutlineColor: "#ffffff",
pointOutlineOpacity: 1,
pointOutlineWidth: 0,
pointWidth: 6,
lineStringColor: "#3f97e0",
lineStringWidth: 4,
lineStringOpacity: 1,
zIndex: 0,
markerUrl: void 0,
markerHeight: void 0,
markerWidth: void 0,
lineStringDash: void 0
});
}
};
function Mt(e, t, n, r, i) {
for (; r > n;) {
if (r - n > 600) {
let a = r - n + 1, o = t - n + 1, s = Math.log(a), c = .5 * Math.exp(2 * s / 3), l = .5 * Math.sqrt(s * c * (a - c) / a) * (o - a / 2 < 0 ? -1 : 1);
Mt(e, t, Math.max(n, Math.floor(t - o * c / a + l)), Math.min(r, Math.floor(t + (a - o) * c / a + l)), i);
}
let a = e[t], o = n, s = r;
for (Nt(e, n, t), i(e[r], a) > 0 && Nt(e, n, r); o < s;) {
for (Nt(e, o, s), o++, s--; i(e[o], a) < 0;) o++;
for (; i(e[s], a) > 0;) s--;
}
i(e[n], a) === 0 ? Nt(e, n, s) : (s++, Nt(e, s, r)), s <= t && (n = s + 1), t <= s && (r = s - 1);
}
}
function Nt(e, t, n) {
let r = e[t];
e[t] = e[n], e[n] = r;
}
function V(e, t) {
Pt(e, 0, e.children.length, t, e);
}
function Pt(e, t, n, r, i) {
i ||= H([]), i.minX = Infinity, i.minY = Infinity, i.maxX = -Infinity, i.maxY = -Infinity;
for (let a = t; a < n; a++) {
let t = e.children[a];
Ft(i, e.leaf ? r(t) : t);
}
return i;
}
function Ft(e, t) {
return e.minX = Math.min(e.minX, t.minX), e.minY = Math.min(e.minY, t.minY), e.maxX = Math.max(e.maxX, t.maxX), e.maxY = Math.max(e.maxY, t.maxY), e;
}
function It(e, t) {
return e.minX - t.minX;
}
function Lt(e, t) {
return e.minY - t.minY;
}
function Rt(e) {
return (e.maxX - e.minX) * (e.maxY - e.minY);
}
function zt(e) {
return e.maxX - e.minX + (e.maxY - e.minY);
}
function Bt(e, t) {
let n = Math.max(e.minX, t.minX), r = Math.max(e.minY, t.minY), i = Math.min(e.maxX, t.maxX), a = Math.min(e.maxY, t.maxY);
return Math.max(0, i - n) * Math.max(0, a - r);
}
function Vt(e, t) {
return e.minX <= t.minX && e.minY <= t.minY && t.maxX <= e.maxX && t.maxY <= e.maxY;
}
function Ht(e, t) {
return t.minX <= e.maxX && t.minY <= e.maxY && t.maxX >= e.minX && t.maxY >= e.minY;
}
function H(e) {
return {
children: e,
height: 1,
leaf: !0,
minX: Infinity,
minY: Infinity,
maxX: -Infinity,
maxY: -Infinity
};
}
function Ut(e, t, n, r, i) {
let a = [t, n];
for (; a.length;) {
if ((n = a.pop()) - (t = a.pop()) <= r) continue;
let o = t + Math.ceil((n - t) / r / 2) * r;
Mt(e, o, t, n, i), a.push(t, o, o, n);
}
}
var Wt = class {
constructor(e) {
this._maxEntries = void 0, this._minEntries = void 0, this.data = void 0, this._maxEntries = Math.max(4, e), this._minEntries = Math.max(2, Math.ceil(.4 * this._maxEntries)), this.clear();
}
search(e) {
let t = this.data, n = [];
if (!Ht(e, t)) return n;
let r = this.toBBox, i = [];
for (; t;) {
for (let a = 0; a < t.children.length; a++) {
let o = t.children[a], s = t.leaf ? r(o) : o;
Ht(e, s) && (t.leaf ? n.push(o) : Vt(e, s) ? this._all(o, n) : i.push(o));
}
t = i.pop();
}
return n;
}
collides(e) {
let t = this.data;
if (Ht(e, t)) {
let n = [];
for (; t;) {
for (let r = 0; r < t.children.length; r++) {
let i = t.children[r], a = t.leaf ? this.toBBox(i) : i;
if (Ht(e, a)) {
if (t.leaf || Vt(e, a)) return !0;
n.push(i);
}
}
t = n.pop();
}
}
return !1;
}
load(e) {
if (e.length < this._minEntries) {
for (let t = 0; t < e.length; t++) this.insert(e[t]);
return;
}
let t = this._build(e.slice(), 0, e.length - 1, 0);
if (this.data.children.length) if (this.data.height === t.height) this._splitRoot(this.data, t);
else {
if (this.data.height < t.height) {
let e = this.data;
this.data = t, t = e;
}
this._insert(t, this.data.height - t.height - 1, !0);
}
else this.data = t;
}
insert(e) {
this._insert(e, this.data.height - 1);
}
clear() {
this.data = H([]);
}
remove(e) {
let t = this.data, n = this.toBBox(e), r = [], i = [], a, o, s = !1;
for (; t || r.length;) {
if (t || (t = r.pop(), o = r[r.length - 1], a = i.pop(), s = !0), t.leaf) {
let n = t.children.indexOf(e);
n !== -1 && (t.children.splice(n, 1), r.push(t), this._condense(r));
}
s || t.leaf || !Vt(t, n) ? o ? (a++, t = o.children[a], s = !1) : t = null : (r.push(t), i.push(a), a = 0, o = t, t = t.children[0]);
}
}
toBBox(e) {
return e;
}
compareMinX(e, t) {
return e.minX - t.minX;
}
compareMinY(e, t) {
return e.minY - t.minY;
}
_all(e, t) {
let n = [];
for (; e;) e.leaf ? t.push(...e.children) : n.push(...e.children), e = n.pop();
return t;
}
_build(e, t, n, r) {
let i = n - t + 1, a, o = this._maxEntries;
if (i <= o) return a = H(e.slice(t, n + 1)), V(a, this.toBBox), a;
r || (r = Math.ceil(Math.log(i) / Math.log(o)), o = Math.ceil(i / o ** (r - 1))), a = H([]), a.leaf = !1, a.height = r;
let s = Math.ceil(i / o), c = s * Math.ceil(Math.sqrt(o));
Ut(e, t, n, c, this.compareMinX);
for (let i = t; i <= n; i += c) {
let t = Math.min(i + c - 1, n);
Ut(e, i, t, s, this.compareMinY);
for (let n = i; n <= t; n += s) {
let i = Math.min(n + s - 1, t);
a.children.push(this._build(e, n, i, r - 1));
}
}
return V(a, this.toBBox), a;
}
_chooseSubtree(e, t, n, r) {
for (; r.push(t), !t.leaf && r.length - 1 !== n;) {
let n, r = Infinity, o = Infinity;
for (let s = 0; s < t.children.length; s++) {
let c = t.children[s], l = Rt(c), u = (i = e, a = c, (Math.max(a.maxX, i.maxX) - Math.min(a.minX, i.minX)) * (Math.max(a.maxY, i.maxY) - Math.min(a.minY, i.minY)) - l);
u < o ? (o = u, r = l < r ? l : r, n = c) : u === o && l < r && (r = l, n = c);
}
t = n || t.children[0];
}
var i, a;
return t;
}
_insert(e, t, n) {
let r = n ? e : this.toBBox(e), i = [], a = this._chooseSubtree(r, this.data, t, i);
for (a.children.push(e), Ft(a, r); t >= 0 && i[t].children.length > this._maxEntries;) this._split(i, t), t--;
this._adjustParentBBoxes(r, i, t);
}
_split(e, t) {
let n = e[t], r = n.children.length, i = this._minEntries;
this._chooseSplitAxis(n, i, r);
let a = this._chooseSplitIndex(n, i, r), o = H(n.children.splice(a, n.children.length - a));
o.height = n.height, o.leaf = n.leaf, V(n, this.toBBox), V(o, this.toBBox), t ? e[t - 1].children.push(o) : this._splitRoot(n, o);
}
_splitRoot(e, t) {
this.data = H([e, t]), this.data.height = e.height + 1, this.data.leaf = !1, V(this.data, this.toBBox);
}
_chooseSplitIndex(e, t, n) {
let r, i = Infinity, a = Infinity;
for (let o = t; o <= n - t; o++) {
let t = Pt(e, 0, o, this.toBBox), s = Pt(e, o, n, this.toBBox), c = Bt(t, s), l = Rt(t) + Rt(s);
c < i ? (i = c, r = o, a = l < a ? l : a) : c === i && l < a && (a = l, r = o);
}
return r || n - t;
}
_chooseSplitAxis(e, t, n) {
let r = e.leaf ? this.compareMinX : It, i = e.leaf ? this.compareMinY : Lt;
this._allDistMargin(e, t, n, r) < this._allDistMargin(e, t, n, i) && e.children.sort(r);
}
_allDistMargin(e, t, n, r) {
e.children.sort(r);
let i = this.toBBox, a = Pt(e, 0, t, i), o = Pt(e, n - t, n, i), s = zt(a) + zt(o);
for (let r = t; r < n - t; r++) {
let t = e.children[r];
Ft(a, e.leaf ? i(t) : t), s += zt(a);
}
for (let r = n - t - 1; r >= t; r--) {
let t = e.children[r];
Ft(o, e.leaf ? i(t) : t), s += zt(o);
}
return s;
}
_adjustParentBBoxes(e, t, n) {
for (let r = n; r >= 0; r--) Ft(t[r], e);
}
_condense(e) {
for (let t, n = e.length - 1; n >= 0; n--) e[n].children.length === 0 ? n > 0 ? (t = e[n - 1].children, t.splice(t.indexOf(e[n]), 1)) : this.clear() : V(e[n], this.toBBox);
}
}, Gt = class {
constructor(e) {
this.tree = void 0, this.idToNode = void 0, this.nodeToId = void 0, this.tree = new Wt(e && e.maxEntries ? e.maxEntries : 9), this.idToNode = /* @__PURE__ */ new Map(), this.nodeToId = /* @__PURE__ */ new Map();
}
setMaps(e, t) {
this.idToNode.set(e.id, t), this.nodeToId.set(t, e.id);
}
toBBox(e) {
let t = [], n = [], r;
if (e.geometry.type === "Polygon") r = e.geometry.coordinates[0];
else if (e.geometry.type === "LineString") r = e.geometry.coordinates;
else {
if (e.geometry.type !== "Point") throw Error("Not a valid feature to turn into a bounding box");
r = [e.geometry.coordinates];
}
for (let e = 0; e < r.length; e++) n.push(r[e][1]), t.push(r[e][0]);
let i = Math.min(...n), a = Math.max(...n);
return {
minX: Math.min(...t),
minY: i,
maxX: Math.max(...t),
maxY: a
};
}
insert(e) {
if (this.idToNode.get(String(e.id))) throw Error("Feature already exists");
let t = this.toBBox(e);
this.setMaps(e, t), this.tree.insert(t);
}
load(e) {
let t = [], n = /* @__PURE__ */ new Set();
e.forEach((e) => {
let r = this.toBBox(e);
if (this.setMaps(e, r), n.has(String(e.id))) throw Error(`Duplicate feature ID found ${e.id}`);
n.add(String(e.id)), t.push(r);
}), this.tree.load(t);
}
update(e) {
this.remove(e.id);
let t = this.toBBox(e);
this.setMaps(e, t), this.tree.insert(t);
}
remove(e) {
let t = this.idToNode.get(e);
if (!t) throw Error(`${e} not inserted into the spatial index`);
this.tree.remove(t);
}
clear() {
this.tree.clear();
}
search(e) {
return this.tree.search(this.toBBox(e)).map((e) => this.nodeToId.get(e));
}
collides(e) {
return this.tree.collides(this.toBBox(e));
}
}, Kt = {
getId: () => "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function(e) {
let t = 16 * Math.random() | 0;
return (e == "x" ? t : 3 & t | 8).toString(16);
}),
isValidId: (e) => typeof e == "string" && e.length === 36
}, qt = { target: "geometry" }, Jt = { target: "properties" }, Yt = class {
constructor(e) {
this.idStrategy = void 0, this.tracked = void 0, this.spatialIndex = void 0, this.store = void 0, this._onChange = () => {}, this.store = {}, this.spatialIndex = new Gt(), this.tracked = !e || !1 !== e.tracked, this.idStrategy = e && e.idStrategy ? e.idStrategy : Kt;
}
clone(e) {
return JSON.parse(JSON.stringify(e));
}
getId() {
return this.idStrategy.getId();
}
has(e) {
return !!this.store[e];
}
load(e, t, n, r) {
if (e.length === 0) return [];
let i = this.clone(e), a = [], o = [];
i = i.filter((e) => {
e.id ??= this.idStrategy.getId();
let n = e.id;
if (t) {
let r = t(e);
if (!r.valid) return a.push({
id: n,
valid: !1,
reason: r.reason
}), !1;
}
if (this.tracked) {
if (e.properties.createdAt) {
if (!p(e.properties.createdAt)) return a.push({
id: e.id,
valid: !1,
reason: "createdAt is not a valid numeric timestamp"
}), !1;
} else e.properties.createdAt = +/* @__PURE__ */ new Date();
if (e.properties.updatedAt) {
if (!p(e.properties.updatedAt)) return a.push({
id: e.id,
valid: !1,
reason: "updatedAt is not a valid numeric timestamp"
}), !1;
} else e.properties.updatedAt = +/* @__PURE__ */ new Date();
}
return this.has(n) ? (a.push({
id: n,
valid: !1,
reason: `Feature already exists with this id: ${n}`
}), !1) : (this.store[n] = e, o.push(e), a.push({
id: n,
valid: !0
}), !0);
}), this.spatialIndex.load(i);
let s = o.map(({ id: e }) => e);
return s.length > 0 && (this._onChange(s, "create", r), n && o.forEach((e) => {
n(e);
})), a;
}
search(e, t) {
let n = this.spatialIndex.search(e).map((e) => this.store[e]);
return this.clone(t ? n.filter(t) : n);
}
registerOnChange(e) {
this._onChange = (t, n, r) => {
e(t, n, r);
};
}
getGeometryCopy(e) {
let t = this.store[e];
if (!t) throw Error(`No feature with this id (${e}), can not get geometry copy`);
return this.clone(t.geometry);
}
getPropertiesCopy(e) {
let t = this.store[e];
if (!t) throw Error(`No feature with this id (${e}), can not get properties copy`);
return this.clone(t.properties);
}
updateProperty(e, n) {
let r = /* @__PURE__ */ new Set();
e.forEach(({ id: e, property: t, value: n }) => {
let i = this.store[e];
if (!i) throw Error(`No feature with this (${e}), can not update geometry`);
i.properties[t] !== n && (r.add(e), n === void 0 ? delete i.properties[t] : i.properties[t] = n, this.tracked && (i.properties.updatedAt = +/* @__PURE__ */ new Date()));
}), this._onChange && r.size > 0 && this._onChange(Array.from(r), "update", n ? t({}, n, Jt) : Jt);
}
updateGeometry(e, n) {
let r = /* @__PURE__ */ new Set();
e.forEach(({ id: e, geometry: t }) => {
r.add(e);
let n = this.store[e];
if (!n) throw Error(`No feature with this (${e}), can not update geometry`);
n.geometry = this.clone(t), this.spatialIndex.update(n), this.tracked && (n.properties.updatedAt = +/* @__PURE__ */ new Date());
}), this._onChange && r.size > 0 && this._onChange(Array.from(r), "update", n ? t({}, n, qt) : qt);
}
create(e, n) {
let r = [];
return e.forEach(({ geometry: e, properties: n }) => {
let i, a = t({}, n);
this.tracked && (i = +/* @__PURE__ */ new Date(), n ? (a.createdAt = typeof n.createdAt == "number" ? n.createdAt : i, a.updatedAt = typeof n.updatedAt == "number" ? n.updatedAt : i) : a = {
createdAt: i,
updatedAt: i
});
let o = this.getId(), s = {
id: o,
type: "Feature",
geometry: e,
properties: a
};
this.store[o] = s, this.spatialIndex.insert(s), r.push(o);
}), this._onChange && this._onChange([...r], "create", n), r;
}
delete(e, t) {
e.forEach((e) => {
if (!this.store[e]) throw Error(`No feature with id ${e}, can not delete`);
delete this.store[e], this.spatialIndex.remove(e);
}), this._onChange && this._onChange([...e], "delete", t);
}
copy(e) {
return this.clone(this.store[e]);
}
copyAll() {
return this.clone(Object.keys(this.store).map((e) => this.store[e]));
}
copyAllWhere(e) {
return this.clone(Object.keys(this.store).map((e) => this.store[e]).filter((t) => t.properties && e(t.properties)));
}
clear(e) {
let t = Object.keys(this.store);
this.store = {}, this.spatialIndex.clear(), this._onChange(t, "delete", e);
}
size() {
return Object.keys(this.store).length;
}
};
Math.PI / 180;
var Xt = "Feature is not a Polygon or LineString", Zt = "Feature intersects itself", Qt = (e) => e.geometry.type !== "Polygon" && e.geometry.type !== "LineString" ? {
valid: !1,
reason: Xt
} : ae(e) ? {
valid: !1,
reason: Zt
} : { valid: !0 };
function $t(e, t, n) {
let r = I(e, t), i = I(t, n) - r;
return i < 0 && (i += 360), 180 - Math.abs(i - 90 - 90);
}
var en = {
cancel: "Escape",
finish: "Enter"
}, tn = {
start: "crosshair",
close: "pointer"
}, nn = class extends _ {
constructor(e) {
super(e, !0), this.mode = "angled-rectangle", this.currentCoordinate = 0, this.currentId = void 0, this.keyEvents = en, this.cursors = tn, this.mouseMove = !1, this.mutateFeature = void 0, this.readFeature = void 0, this.updateOptions(e);
}
updateOptions(e) {
super.updateOptions(e), e != null && e.cursors && (this.cursors = t({}, this.cursors, e.cursors)), e?.keyEvents === null ? this.keyEvents = {
cancel: null,
finish: null
} : e != null && e.keyEvents && (this.keyEvents = t({}, this.keyEvents, e.keyEvents));
}
close() {
if (this.currentId === void 0 || !this.mutateFeature.updatePolygon({
featureId: this.currentId,
propertyMutations: { [l.CURRENTLY_DRAWING]: void 0 },
context: {
updateType: o.Finish,
action: n
}
})) return;
let e = this.currentId;
this.currentCoordinate = 0, this.currentId = void 0, this.state === "drawing" && this.setStarted(), this.onFinish(e, {
mode: this.mode,
action: n
});
}
start() {
this.setStarted(), this.setCursor(this.cursors.start);
}
stop() {
this.cleanUp(), this.setStopped(), this.setCursor("unset");
}
onMouseMove(e) {
if (this.mouseMove = !0, this.setCursor(this.cursors.start), this.currentId === void 0 || this.currentCoordinate === 0) return;
let t = [];
if (this.currentCoordinate === 1) t = this.getUpdateForSecondCoordinate(e);
else {
if (this.currentCoordinate !== 2) return;
t = this.getNewSecondAndThirdCoordinates(e);
}
this.mutateFeature.updatePolygon({
featureId: this.currentId,
coordinateMutations: t,
context: { updateType: o.Provisional }
});
}
getUpdateForSecondCoordinate(e) {
return [{
type: k,
index: 1,
coordinate: [e.lng, e.lat]
}, {
type: k,
index: 2,
coordinate: [e.lng, e.lat]
}];
}
getNewSecondAndThirdCoordinates(e) {
if (!this.currentId) throw Error("No current feature being drawn");
let t = this.readFeature.getCoordinate(this.currentId, 0), n = this.readFeature.getCoordinate(this.currentId, 1), r = dt(t, n, this.coordinatePrecision, this.project, this.unproject), i = T(t[0], t[1]), a = T(r[0], r[1]), o = T(n[0], n[1]), s = T(e.lng, e.lat), c = N(s, i) < N(s, o), l = $t(i, a, s), u = c ? 90 - l : $t(i, a, s) - 90, d = N(a, s), f = Math.cos(x(u)) * d, p = I(i, o) + (function(e, t, n) {
let r = (n.x - t.x) * (e.y - t.y) - (n.y - t.y) * (e.x - t.x);
return r > 1e-10 ? "left" : r < -1e-10 ? "right" : "left";
}(i, o, s) === "right" ? -90 : 90), m = ke(i, f, p), h = ke(o, f, p), g = E(m.x, m.y), _ = E(h.x, h.y);
return [{
type: k,
index: 2,
coordinate: [C(_.lng, this.coordinatePrecision), C(_.lat, this.coordinatePrecision)]
}, {
type: k,
index: 3,
coordinate: [C(g.lng, this.coordinatePrecision), C(g.lat, this.coordinatePrecision)]
}];
}
onClick(e) {
if (e.button === "right" && this.allowPointerEvent(this.pointerEvents.rightClick, e) || e.button === "left" && this.allowPointerEvent(this.pointerEvents.leftClick, e) || e.isContextMenu && this.allowPointerEvent(this.pointerEvents.contextMenu, e)) if (this.currentCoordinate > 0 && !this.mouseMove && this.onMouseMove(e), this.mouseMove = !1, this.currentCoordinate === 0) {
let { id: t } = this.mutateFeature.createPolygon({
coordinates: [
[e.lng, e.lat],
[e.lng, e.lat],
[e.lng, e.lat],
[e.lng, e.lat]
],
properties: {
mode: this.mode,
[l.CURRENTLY_DRAWING]: !0
}
});
this.currentId = t, this.currentCoordinate++, this.setDrawing();
} else if (this.currentCoordinate === 1 && this.currentId) {
let t = this.readFeature.getCoordinate(this.currentId, 0);
if (xe([e.lng, e.lat], t) || !this.mutateFeature.updatePolygon({
featureId: this.currentId,
coordinateMutations: [{
type: k,
index: 1,
coordinate: [e.lng, e.lat]
}, {
type: O,
index: 1,
coordinate: [e.lng, e.lat]
}],
context: { updateType: o.Commit }
})) return;
this.currentCoordinate++;
} else this.currentCoordinate === 2 && this.currentId && this.close();
}
onKeyUp(e) {
if (e.key === this.keyEvents.cancel) this.cleanUp();
else if (e.key === this.keyEvents.finish) {
if (this.currentCoordinate < 2) return void this.cleanUp();
this.close();
}
}
onKeyDown() {}
onDragStart() {}
onDrag() {}
onDragEnd() {}
cleanUp() {
let e = this.currentId;
this.currentId = void 0, this.currentCoordinate = 0, this.state === "drawing" && this.setStarted(), this.mutateFeature.deleteFeatureIfPresent(e);
}
styleFeature(e) {
let n = t({}, {
polygonFillColor: "#3f97e0",
polygonOutlineColor: "#3f97e0",
polygonOutlineWidth: 4,
polygonOutlineOpacity: 1,
polygonFillOpacity: .3,
pointColor: "#3f97e0",
pointOpacity: 1,
pointOutlineColor: "#ffffff",
pointOutlineOpacity: 1,
pointOutlineWidth: 0,
pointWidth: 6,
lineStringColor: "#3f97e0",
lineStringWidth: 4,
lineStringOpacity: 1,
zIndex: 0,
markerUrl: void 0,
markerHeight: void 0,
markerWidth: void 0,
lineStringDash: void 0
});
return e.properties.mode === this.mode && e.geometry.type === "Polygon" && (n.polygonFillColor = this.getHexColorStylingValue(this.styles.fillColor, n.polygonFillColor, e), n.polygonOutlineColor = this.getHexColorStylingValue(this.styles.outlineColor, n.polygonOutlineColor, e), n.polygonOutlineWidth = this.getNumericStylingValue(this.styles.outlineWidth, n.polygonOutlineWidth, e), n.polygonOutlineOpacity = this.getNumericStylingValue(this.styles.outlineOpacity, 1, e), n.polygonFillOpacity = this.getNumericStylingValue(this.styles.fillOpacity, n.polygonFillOpacity, e), n.zIndex = u), n;
}
validateFeature(e) {
return this.validateModeFeature(e, (e) => he(e, this.coordinatePrecision));
}
afterFeatureUpdated(e) {
this.currentId === e.id && (this.currentId = void 0, this.currentCoordinate = 0, this.state === "drawing" && this.setStarted());
}
registerBehaviors(e) {
this.readFeature = new P(e), this.mutateFeature = new M(e, { validate: this.validate });
}
};
function rn(e, t, n) {
return (t.x - e.x) * (n.y - e.y) - (t.y - e.y) * (n.x - e.x) <= 0;
}
var an = {
cancel: "Escape",
finish: "Enter"
}, on = {
start: "crosshair",
close: "pointer"
}, sn = class extends _ {
constructor(e) {
super(e, !0), this.mode = "sector", this.currentCoordinate = 0, this.currentId = void 0, this.keyEvents = an, this.direction = void 0, this.arcPoints = 64, this.cursors = on, this.mouseMove = !1, this.readFeature = void 0, this.mutateFeature = void 0, this.updateOptions(e);
}
updateOptions(e) {
super.updateOptions(e), e != null && e.cursors && (this.cursors = t({}, this.cursors, e.cursors)), e?.keyEvents === null ? this.keyEvents = {
cancel: null,
finish: null
} : e != null && e.keyEvents && (this.keyEvents = t({}, this.keyEvents, e.keyEvents)), e != null && e.arcPoints && (this.arcPoints = e.arcPoints);
}
close() {
if (this.currentId === void 0 || !this.mutateFeature.updatePolygon({
featureId: this.currentId,
propertyMutations: { [l.CURRENTLY_DRAWING]: void 0 },
coordinateMutations: {
coordinates: this.readFeature.getGeometry(this.currentId).coordinates,
type: j
},
context: {
updateType: o.Finish,
action: n
}
})) return;
let e = this.currentId;
this.currentCoordinate = 0, this.currentId = void 0, this.direction = void 0, this.state === "drawing" && this.setStarted(), this.onFinish(e, {
mode: this.mode,
action: n
});
}
getSectorCoordinates(e) {
let t = this.readFeature.getCoordinates(this.currentId), n = t[0], r = t[1], i = [e.lng, e.lat], a = T(n[0], n[1]), o = T(r[0], r[1]), s = T(i[0], i[1]);
if (this.direction === void 0) {
let e = rn(a, o, s);
this.direction = e ? "clockwise" : "anticlockwise";
}
let c = N(a, o), l = I(a, o), u = I(a, s), d = this.arcPoints, f = [n], p = L(l), m = L(u), h;
this.direction === "anticlockwise" ? (h = m - p, h < 0 && (h += 360)) : (h = p - m, h < 0 && (h += 360));
let g = (this.direction === "anticlockwise" ? 1 : -1) * h / d;
f.push(r);
for (let e = 0; e <= d; e++) {
let t = ke(a, c, p + e * g), { lng: n, lat: r } = E(t.x, t.y), i = [C(n, this.coordinatePrecision), C(r, this.coordinatePrecision)];
i[0] !== f[f.length - 1][0] && i[1] !== f[f.length - 1][1] && f.push(i);
}
return f.push(n), f;
}
start() {
this.setStarted(), this.setCursor(this.cursors.start);
}
stop() {
this.cleanUp(), this.setStopped(), this.setCursor("unset");
}
onMouseMove(e) {
if (this.mouseMove = !0, this.setCursor(this.cursors.start), this.currentId === void 0 || this.currentCoordinate === 0) return;
let t;
if (this.currentCoordinate === 1) t = [{
type: k,
index: 1,
coordinate: [e.lng, e.lat]
}, {
type: k,
index: 2,
coordinate: [e.lng, e.lat]
}];
else {
if (this.currentCoordinate !== 2) return;
{
let n = this.getSectorCoordinates(e);
if (!n) return;
t = {
type: j,
coordinates: [n]
};
}
}
this.mutateFeature.updatePolygon({
featureId: this.currentId,
coordinateMutations: t,
context: { updateType: o.Provisional }
});
}
onClick(e) {
if (e.button === "right" && this.allowPointerEvent(this.pointerEvents.rightClick, e) || e.button === "left" && this.allowPointerEvent(this.pointerEvents.leftClick, e) || e.isContextMenu && this.allowPointerEvent(this.pointerEvents.contextMenu, e)) if (this.currentCoordinate > 0 && !this.mouseMove && this.onMouseMove(e), this.mouseMove = !1, this.currentCoordinate === 0) {
let t = this.mutateFeature.createPolygon({
coordinates: [
[e.lng, e.lat],
[e.lng, e.lat],
[e.lng, e.lat],
[e.lng, e.lat]
],
properties: {
mode: this.mode,
[l.CURRENTLY_DRAWING]: !0
}
});
this.currentId = t?.id, this.currentCoordinate++, this.setDrawing();
} else if (this.currentCoordinate === 1 && this.currentId) {
if (this.readFeature.coordinateAtIndexIsIdentical({
featureId: this.currentId,
index: 0,
newCoordinate: [e.lng, e.lat]
}) || !this.mutateFeature.updatePolygon({
featureId: this.currentId,
coordinateMutations: [{
type: k,
index: 1,
coordinate: [e.lng, e.lat]
}, {
type: k,
index: 2,
coordinate: [e.lng, e.lat]
}],
context: { updateType: o.Provisional }
})) return;
this.currentCoordinate++;
} else this.currentCoordinate === 2 && this.currentId && this.close();
}
onKeyUp(e) {
e.key === this.keyEvents.cancel ? this.cleanUp() : e.key === this.keyEvents.finish && this.close();
}
onKeyDown() {}
onDragStart() {}
onDrag() {}
onDragEnd() {}
cleanUp() {
let e = this.currentId;
this.currentId = void 0, this.direction = void 0, this.currentCoordinate = 0, this.state === "drawing" && this.setStarted(), this.mutateFeature.deleteFeatureIfPresent(e);
}
styleFeature(e) {
let n = t({}, {
polygonFillColor: "#3f97e0",
polygonOutlineColor: "#3f97e0",
polygonOutlineWidth: 4,
polygonOutlineOpacity: 1,
polygonFillOpacity: .3,
pointColor: "#3f97e0",
pointOpacity: 1,
pointOutlineColor: "#ffffff",
pointOutlineOpacity: 1,
pointOutlineWidth: 0,
pointWidth: 6,
lineStringColor: "#3f97e0",
lineStringWidth: 4,
lineStringOpacity: 1,
zIndex: 0,
markerUrl: void 0,
markerHeight: void 0,
markerWidth: void 0,
lineStringDash: void 0
});
return e.properties.mode === this.mode && e.geometry.type === "Polygon" && (n.polygonFillColor = this.getHexColorStylingValue(this.styles.fillColor, n.polygonFillColor, e), n.polygonOutlineColor = this.getHexColorStylingValue(this.styles.outlineColor, n.polygonOutlineColor, e), n.polygonOutlineWidth = this.getNumericStylingValue(this.styles.outlineWidth, n.polygonOutlineWidth, e), n.polygonOutlineOpacity = this.getNumericStylingValue(this.styles.outlineOpacity, 1, e), n.polygonFillOpacity = this.getNumericStylingValue(this.styles.fillOpacity, n.polygonFillOpacity, e), n.zIndex = u), n;
}
validateFeature(e) {
return this.validateModeFeature(e, (e) => he(e, this.coordinatePrecision));
}
afterFeatureUpdated(e) {
this.currentId === e.id && (this.currentId = void 0, this.direction = void 0, this.currentCoordinate = 0, this.state === "drawing" && this.setStarted());
}
registerBehaviors(e) {
this.readFeature = new P(e), this.mutateFeature = new M(e, { validate: this.validate });
}
}, cn = {
cancel: "Escape",
finish: "Enter"
}, ln = {
start: "crosshair",
close: "pointer"
}, un = class extends _ {
constructor(e) {
super(e, !0), this.mode = "sensor", this.currentCoordinate = 0, this.currentId = void 0, this.currentInitialArcId = void 0, this.currentStartingPointId = void 0, this.keyEvents = cn, this.direction = void 0, this.arcPoints = 64, this.cursors = ln, this.mouseMove = !1, this.readFeature = void 0, this.mutateFeature = void 0, this.updateOptions(e);
}
updateOptions(e) {
super.updateOptions(e), e != null && e.cursors && (this.cursors = t({}, this.cursors, e.cursors)), e?.keyEvents === null ? this.keyEvents = {
cancel: null,
finish: null
} : e != null && e.keyEvents && (this.keyEvents = t({}, this.keyEvents, e.keyEvents)), e != null && e.arcPoints && (this.arcPoints = e.arcPoints);
}
start() {
this.setStarted(), this.setCursor(this.cursors.start);
}
stop() {
this.cleanUp(), this.setStopped(), this.setCursor("unset");
}
onMouseMove(e) {
if (this.mouseMove = !0, this.setCursor(this.cursors.start), this.currentInitialArcId !== void 0 && this.currentStartingPointId !== void 0 && this.currentCoordinate !== 0) {
if (this.currentCoordinate === 2) {
let t = this.getUpdatedLineStringCoordinates(e);
if (!t) return;
this.mutateFeature.updateLineString({
featureId: this.currentInitialArcId,
coordinateMutations: {
type: j,
coordinates: t
},
context: { updateType: o.Provisional }
});
} else if (this.currentCoordinate === 3) {
let t = this.getUpdatedPolygonCoordinates(e);
if (!t) return;
if (this.currentId) this.mutateFeature.updatePolygon({
featureId: this.currentId,
coordinateMutations: {
type: j,
coordinates: [t]
},
context: { updateType: o.Provisional }
});
else {
let e = this.mutateFeature.createPolygon({
coordinates: t,
properties: {
mode: this.mode,
[l.CURRENTLY_DRAWING]: !0
}
});
if (!e) return;
this.currentId = e.id;
}
}
}
}
onClick(e) {
if (e.button === "right" && this.allowPointerEvent(this.pointerEvents.rightClick, e) || e.button === "left" && this.allowPointerEvent(this.pointerEvents.leftClick, e) || e.isContextMenu && this.allowPointerEvent(this.pointerEvents.contextMenu, e)) if (this.currentCoordinate > 0 && !this.mouseMove && this.onMouseMove(e), this.mouseMove = !1, this.currentCoordinate === 0) {
let t = this.mutateFeature.createPoint({
coordinates: [e.lng, e.lat],
properties: { mode: this.mode }
});
if (!t) return;
this.currentStartingPointId = t.id, this.currentCoordinate++, this.setDrawing();
} else if (this.currentCoordinate === 1 && this.currentStartingPointId) {
let t = this.mutateFeature.createLineString({
coordinates: [[e.lng, e.lat], [e.lng, e.lat]],
properties: { mode: this.mode }
});
if (!t) return;
this.currentInitialArcId = t.id, this.currentCoordinate++;
} else this.currentCoordinate === 2 && this.currentStartingPointId ? this.currentCoordinate++ : this.currentCoordinate === 3 && this.currentStartingPointId && this.close();
}
onKeyUp(e) {
e.key === this.keyEvents.cancel ? this.cleanUp() : e.key === this.keyEvents.finish && this.close();
}
onKeyDown() {}
onDragStart() {}
onDrag() {}
onDragEnd() {}
cleanUp() {
this.mutateFeature.deleteFeatureIfPresent(this.currentStartingPointId), this.mutateFeature.deleteFeatureIfPresent(this.currentInitialArcId), this.mutateFeature.deleteFeatureIfPresent(this.currentId), this.currentStartingPointId = void 0, this.direction = void 0, this.currentId = void 0, this.currentCoordinate = 0, this.state === "drawing" && this.setStarted();
}
styleFeature(e) {
let n = t({}, {
polygonFillColor: "#3f97e0",
polygonOutlineColor: "#3f97e0",
polygonOutlineWidth: 4,
polygonOutlineOpacity: 1,
polygonFillOpacity: .3,
pointColor: "#3f97e0",
pointOpacity: 1,
pointOutlineColor: "#ffffff",
pointOutlineOpacity: 1,
pointOutlineWidth: 0,
pointWidth: 6,
lineStringColor: "#3f97e0",
lineStringWidth: 4,
lineStringOpacity: 1,
zIndex: 0,
markerUrl: void 0,
markerHeight: void 0,
markerWidth: void 0,
lineStringDash: void 0
});
return e.properties.mode === this.mode && (e.geometry.type === "Polygon" ? (n.polygonFillColor = this.getHexColorStylingValue(this.styles.fillColor, n.polygonFillColor, e), n.polygonOutlineColor = this.getHexColorStylingValue(this.styles.outlineColor, n.polygonOutlineColor, e), n.polygonOutlineWidth = this.getNumericStylingValue(this.styles.outlineWidth, n.polygonOutlineWidth, e), n.polygonOutlineOpacity = this.getNumericStylingValue(this.styles.outlineOpacity, 1, e), n.polygonFillOpacity = this.getNumericStylingValue(this.styles.fillOpacity, n.polygonFillOpacity, e), n.zIndex = u) : e.geometry.type === "LineString" ? (n.lineStringColor = this.getHexColorStylingValue(this.styles.outlineColor, n.polygonOutlineColor, e), n.lineStringWidth = this.getNumericStylingValue(this.styles.outlineWidth, n.polygonOutlineWidth, e), n.zIndex = u) : e.geometry.type === "Point" && (n.pointColor = this.getHexColorStylingValue(this.styles.centerPointColor, n.pointColor, e), n.pointOpacity = this.getNumericStylingValue(this.styles.centerPointOpacity, 1, e), n.pointWidth = this.getNumericStylingValue(this.styles.centerPointWidth, n.pointWidth, e), n.pointOutlineColor = this.getHexColorStylingValue(this.styles.centerPointOutlineColor, n.pointOutlineColor, e), n.pointOutlineOpacity = this.getNumericStylingValue(this.styles.centerPointOutlineOpacity, 1, e), n.pointOutlineWidth = this.getNumericStylingValue(this.styles.centerPointOutlineWidth, n.pointOutlineWidth, e), n.zIndex = 20)), n;
}
validateFeature(e) {
return this.validateModeFeature(e, (e) => he(e, this.coordinatePrecision));
}
afterFeatureUpdated(e) {
this.currentId === e.id && (this.mutateFeature.deleteFeatureIfPresent(this.currentStartingPointId), this.mutateFeature.deleteFeatureIfPresent(this.currentInitialArcId), this.currentStartingPointId = void 0, this.direction = void 0, this.currentId = void 0, this.currentCoordinate = 0, this.state === "drawing" && this.setStarted());
}
registerBehaviors(e) {
this.readFeature = new P(e), this.mutateFeature = new M(e, { validate: this.validate });
}
close() {
if (this.currentStartingPointId === void 0) return;
let e = this.currentStartingPointId, t = this.currentInitialArcId;
if (this.currentId && !this.mutateFeature.updatePolygon({
featureId: this.currentId,
propertyMutations: { [l.CURRENTLY_DRAWING]: void 0 },
coordinateMutations: {
coordinates: this.readFeature.getGeometry(this.currentId).coordinates,
type: j
},
context: {
updateType: o.Finish,
action: n
}
})) return;
let r = this.currentId;
this.mutateFeature.deleteFeatureIfPresent(e), this.mutateFeature.deleteFeatureIfPresent(t), this.currentCoordinate = 0, this.currentStartingPointId = void 0, this.currentInitialArcId = void 0, this.currentId = void 0, this.direction = void 0, this.state === "drawing" && this.setStarted(), r && this.onFinish(r, {
mode: this.mode,
action: n
});
}
getUpdatedPolygonCoordinates(e) {
if (this.currentInitialArcId === void 0 || this.currentStartingPointId === void 0 || this.currentCoordinate < 3) return;
let t = this.readFeature.getCoordinates(this.currentInitialArcId);
if (t.length < 2 || !this.direction) return;
let n = this.readFeature.getGeometry(this.currentStartingPointId).coordinates, r = t[0], i = t[t.length - 1], a = T(e.lng, e.lat), o = T(r[0], r[1]), s = T(i[0], i[1]), c = T(n[0], n[1]), l = N(c, o), u = N(c, a) < l ? o : a, d = I(c, a), f = I(c, o), p = I(c, s), m = L(f), h = L(p), g = L(d);
if (this.notInSector({
normalizedCursor: g,
normalizedStart: m,
normalizedEnd: h,
direction: this.direction
})) return;
let _ = this.getDeltaBearing(this.direction, m, h), v = this.arcPoints, y = (this.direction === "anticlockwise" ? 1 : -1) * _ / v, b = N(c, u), x = [];
for (let e = 0; e <= v; e++) {
let n = ke(c, b, m + e * y), { lng: r, lat: i } = E(n.x, n.y), a = [C(r, this.coordinatePrecision), C(i, this.coordinatePrecision)];
a[0] !== t[t.length - 1][0] && a[1] !== t[t.length - 1][1] && x.unshift(a);
}
return t.push(...x), t.push(t[0]), t;
}
getUpdatedLineStringCoordinates(e) {
if (this.currentInitialArcId === void 0 || this.currentStartingPointId === void 0 || this.currentCoordinate < 2) return;
let t = this.readFeature.getGeometry(this.currentInitialArcId).coordinates, n = this.readFeature.getGeometry(this.currentStartingPointId).coordinates, r = t[0], i = [e.lng, e.lat], a = T(r[0], r[1]), o = T(i[0], i[1]), s = T(n[0], n[1]), c = N(s, a);
if (this.direction === void 0) {
let e = rn(s, a, o);
this.direction = e ? "clockwise" : "anticlockwise";
}
let l = I(s, a), u = I(s, o), d = this.arcPoints, f = [r], p = L(l), m = L(u), h;
this.direction === "anticlockwise" ? (h = m - p, h < 0 && (h += 360)) : (h = p - m, h < 0 && (h += 360));
let g = (this.direction === "anticlockwise" ? 1 : -1) * h / d;
for (let e = 0; e <= d; e++) {
let t = ke(s, c, p + e * g), { lng: n, lat: r } = E(t.x, t.y), i = [C(n, this.coordinatePrecision), C(r, this.coordinatePrecision)];
i[0] !== f[f.length - 1][0] && i[1] !== f[f.length - 1][1] && f.push(i);
}
return f;
}
getDeltaBearing(e, t, n) {
let r;
return e === "anticlockwise" ? (r = n - t, r < 0 && (r += 360)) : (r = t - n, r < 0 && (r += 360)), r;
}
notInSector({ normalizedCursor: e, normalizedStart: t, normalizedEnd: n, direction: r }) {
return r === "clockwise" ? t <= n ? e >= t && e <= n : e >= t || e <= n : t >= n ? e <= t && e >= n : e <= t || e >= n;
}
}, U = class {
constructor({ name: e, callback: t, unregister: n, register: r }) {
this.name = void 0, this.callback = void 0, this.registered = !1, this.register = void 0, this.unregister = void 0, this.name = e, this.register = () => {
this.registered || (this.registered = !0, r(t));
}, this.unregister = () => {
this.register && (this.registered = !1, n(t));
}, this.callback = t;
}
}, dn = {
__proto__: null,
GeoJSONStore: Yt,
TerraDrawBaseDrawMode: _,
TerraDrawBaseSelectMode: v,
TerraDrawBaseAdapter: class {
constructor(e) {
this._nextKeyUpIsContextMenu = !1, this._lastPointerDownEventTarget = void 0, this._ignoreMismatchedPointerEvents = !1, this._minPixelDragDistance = void 0, this._minPixelDragDistanceDrawing = void 0, this._minPixelDragDistanceSelecting = void 0, this._lastDrawEvent = void 0, this._coordinatePrecision = void 0, this._heldKeys = /* @__PURE__ */ new Set(), this._listeners = [], this._dragState = "not-dragging", this._currentModeCallbacks = void 0, this._ignoreMismatchedPointerEvents = typeof e.ignoreMismatchedPointerEvents == "boolean" && e.ignoreMismatchedPointerEvents, this._minPixelDragDistance = typeof e.minPixelDragDistance == "number" ? e.minPixelDragDistance : 1, this._minPixelDragDistanceSelecting = typeof e.minPixelDragDistanceSelecting == "number" ? e.minPixelDragDistanceSelecting : 1, this._minPixelDragDistanceDrawing = typeof e.minPixelDragDistanceDrawing == "number" ? e.minPixelDragDistanceDrawing : 8, this._coordinatePrecision = typeof e.coordinatePrecision == "number" ? e.coordinatePrecision : 9;
}
getButton(e) {
return e.button === -1 ? "neither" : e.button === 0 ? "left" : e.button === 1 ? "middle" : e.button === 2 ? "right" : "neither";
}
getMapElementXYPosition(e) {
let { left: t, top: n } = this.getMapEventElement(e.type).getBoundingClientRect();
return {
containerX: e.clientX - t,
containerY: e.clientY - n
};
}
getDrawEventFromEvent(e, t = !1) {
let n = this.getLngLatFromEvent(e);
if (!n) return null;
let { lng: r, lat: i } = n, { containerX: a, containerY: o } = this.getMapElementXYPosition(e), s = this.getButton(e), c = Array.from(this._heldKeys);
return {
lng: C(r, this._coordinatePrecision),
lat: C(i, this._coordinatePrecision),
containerX: a,
containerY: o,
button: s,
heldKeys: c,
isContextMenu: t
};
}
register(e) {
this._currentModeCallbacks = e, this._listeners = this.getAdapterListeners(), this._listeners.forEach((e) => {
e.register();
});
}
getCoordinatePrecision() {
return this._coordinatePrecision;
}
getAdapterListeners() {
return [
new U({
name: "pointerdown",
callback: (e) => {
if (!this._currentModeCallbacks || !e.isPrimary) return;
let t = this.getDrawEventFromEvent(e);
t && (this._dragState = "pre-dragging", this._lastDrawEvent = t, this._lastPointerDownEventTarget = e.target ? e.target : void 0);
},
register: (e) => {
this.getMapEventElement("pointerdown").addEventListener("pointerdown", e);
},
unregister: (e) => {
this.getMapEventElement("pointerdown").removeEventListener("pointerdown", e);
}
}),
new U({
name: "pointermove",
callback: (e) => {
if (!this._currentModeCallbacks || !e.isPrimary) return;
e.preventDefault();
let t = this.getDrawEventFromEvent(e);
if (t) if (this._dragState === "not-dragging") this._currentModeCallbacks.onMouseMove(t), this._lastDrawEvent = t;
else if (this._dragState === "pre-dragging") {
if (!this._lastDrawEvent) return;
let e = {
x: this._lastDrawEvent.containerX,
y: this._lastDrawEvent.containerY
}, n = {
x: t.containerX,
y: t.containerY
}, r = this._currentModeCallbacks.getState(), i = N(e, n), a = !1;
if (a = r === "drawing" ? i < this._minPixelDragDistanceDrawing : r === "selecting" ? i < this._minPixelDragDistanceSelecting : i < this._minPixelDragDistance, a) return;
this._nextKeyUpIsContextMenu = !1, this._dragState = "dragging", this._currentModeCallbacks.onDragStart(t, (e) => {
this.setDraggability.bind(this)(e);
});
} else this._dragState === "dragging" && this._currentModeCallbacks.onDrag(t, (e) => {
this.setDraggability.bind(this)(e);
});
},
register: (e) => {
this.getMapEventElement("pointermove").addEventListener("pointermove", e);
},
unregister: (e) => {
this.getMapEventElement("pointermove").removeEventListener("pointermove", e);
}
}),
new U({
name: "contextmenu",
callback: (e) => {
this._currentModeCallbacks && (e.preventDefault(), this._nextKeyUpIsContextMenu = !0);
},
register: (e) => {
this.getMapEventElement("contextmenu").addEventListener("contextmenu", e);
},
unregister: (e) => {
this.getMapEventElement("contextmenu").removeEventListener("contextmenu", e);
}
}),
new U({
name: "pointerup",
callback: (e) => {
if (!this._currentModeCallbacks || e.target !== this.getMapEventElement("pointerup") || this._ignoreMismatchedPointerEvents && this._lastPointerDownEventTarget !== e.target || (this._lastPointerDownEventTarget = void 0, !e.isPrimary)) return;
let t = this.getDrawEventFromEvent(e);
t && (this._dragState === "dragging" ? this._currentModeCallbacks.onDragEnd(t, (e) => {
this.setDraggability.bind(this)(e);
}) : this._dragState !== "not-dragging" && this._dragState !== "pre-dragging" || (this._nextKeyUpIsContextMenu &&= (t.isContextMenu = !0, !1), this._currentModeCallbacks.onClick(t)), this._dragState = "not-dragging", this.setDraggability(!0));
},
register: (e) => {
this.getMapEventElement("pointerup").addEventListener("pointerup", e);
},
unregister: (e) => {
this.getMapEventElement("pointerup").removeEventListener("pointerup", e);
}
}),
new U({
name: "keyup",
callback: (e) => {
this._currentModeCallbacks && (this._heldKeys.delete(e.key), this._currentModeCallbacks.onKeyUp({
key: e.key,
heldKeys: Array.from(this._heldKeys),
preventDefault: () => e.preventDefault()
}));
},
register: (e) => {
this.getMapEventElement("keyup").addEventListener("keyup", e);
},
unregister: (e) => {
this.getMapEventElement("keyup").removeEventListener("keyup", e);
}
}),
new U({
name: "keydown",
callback: (e) => {
this._currentModeCallbacks && (this._heldKeys.add(e.key), this._currentModeCallbacks.onKeyDown({
key: e.key,
heldKeys: Array.from(this._heldKeys),
preventDefault: () => e.preventDefault()
}));
},
register: (e) => {
this.getMapEventElement("keydown").addEventListener("keydown", e);
},
unregister: (e) => {
this.getMapEventElement("keydown").removeEventListener("keydown", e);
}
})
];
}
unregister() {
this._listeners.forEach((e) => {
e.unregister();
}), this.clear(), this._currentModeCallbacks = void 0, this._lastDrawEvent = void 0, this._lastPointerDownEventTarget = void 0, this._nextKeyUpIsContextMenu = !1;
}
},
getDefaultStyling: () => ({
polygonFillColor: "#3f97e0",
polygonOutlineColor: "#3f97e0",
polygonOutlineWidth: 4,
polygonOutlineOpacity: 1,
polygonFillOpacity: .3,
pointColor: "#3f97e0",
pointOpacity: 1,
pointOutlineColor: "#ffffff",
pointOutlineOpacity: 1,
pointOutlineWidth: 0,
pointWidth: 6,
lineStringColor: "#3f97e0",
lineStringWidth: 4,
lineStringOpacity: 1,
zIndex: 0,
markerUrl: void 0,
markerHeight: void 0,
markerWidth: void 0,
lineStringDash: void 0
}),
SELECT_PROPERTIES: c
}, fn = {
cancel: "Escape",
finish: "Enter"
}, pn = {
start: "crosshair",
close: "pointer"
}, mn = class extends _ {
constructor(e) {
super(e, !0), this.mode = "freehand-linestring", this.canClose = !1, this.currentId = void 0, this.minDistance = 20, this.keyEvents = fn, this.cursors = pn, this.preventNewFeature = !1, this.mutateFeature = void 0, this.readFeature = void 0, this.pixelDistance = void 0, this.closingPoints = void 0, this.updateOptions(e);
}
updateOptions(e) {
super.updateOptions(e), e != null && e.minDistance && (this.minDistance = e.minDistance), e?.keyEvents === null ? this.keyEvents = {
cancel: null,
finish: null
} : e != null && e.keyEvents && (this.keyEvents = t({}, this.keyEvents, e.keyEvents)), e != null && e.cursors && (this.cursors = t({}, this.cursors, e.cursors));
}
close() {
if (this.currentId === void 0 || !this.mutateFeature.updateLineString({
featureId: this.currentId,
propertyMutations: { [l.CURRENTLY_DRAWING]: void 0 },
context: {
updateType: o.Finish,
action: n
}
})) return;
let e = this.currentId;
this.closingPoints.delete(), this.canClose = !1, this.currentId = void 0, this.state === "drawing" && this.setStarted(), this.onFinish(e, {
mode: this.mode,
action: n
});
}
start() {
this.setStarted(), this.setCursor(this.cursors.start);
}
stop() {
this.cleanUp(), this.setStopped(), this.setCursor("unset");
}
onMouseMove(e) {
if (this.currentId === void 0 || !1 === this.canClose) return void this.setCursor(this.cursors.start);
let [t, n] = this.readFeature.getCoordinate(this.currentId, -2), { x: r, y: i } = this.project(t, n), a = N({
x: r,
y: i
}, {
x: e.containerX,
y: e.containerY
}), [s, c] = this.readFeature.getCoordinate(this.currentId, -1), { x: l, y: u } = this.project(s, c), d = N({
x: l,
y: u
}, {
x: e.containerX,
y: e.containerY
});
if (this.setCursor(d < this.pointerDistance ? this.cursors.close : this.cursors.start), a < this.minDistance) return;
let f = this.mutateFeature.updateLineString({
featureId: this.currentId,
coordinateMutations: [{
type: O,
index: -1,
coordinate: [e.lng, e.lat]
}],
context: { updateType: o.Provisional }
});
f && this.closingPoints.update(f.geometry.coordinates);
}
onClick(e) {
if (e.button === "right" && this.allowPointerEvent(this.pointerEvents.rightClick, e) || e.button === "left" && this.allowPointerEvent(this.pointerEvents.leftClick, e) || e.isContextMenu && this.allowPointerEvent(this.pointerEvents.contextMenu, e)) {
if (this.preventNewFeature) return;
if (!1 === this.canClose) {
let { id: t, geometry: n } = this.mutateFeature.createLineString({
coordinates: [[e.lng, e.lat], [e.lng, e.lat]],
properties: {
mode: this.mode,
[l.CURRENTLY_DRAWING]: !0
}
});
this.closingPoints.create(n.coordinates), this.currentId = t, this.canClose = !0, this.state !== "drawing" && this.setDrawing();
return;
}
this.close();
}
}
onKeyDown() {}
onKeyUp(e) {
e.key === this.keyEvents.cancel ? this.cleanUp() : e.key === this.keyEvents.finish && !0 === this.canClose && this.close();
}
onDragStart() {}
onDrag() {}
onDragEnd() {}
cleanUp() {
let e = this.currentId;
this.currentId = void 0, this.canClose = !1, this.state === "drawing" && this.setStarted(), this.mutateFeature.deleteFeatureIfPresent(e), this.closingPoints.delete();
}
styleFeature(e) {
let n = t({}, {
polygonFillColor: "#3f97e0",
polygonOutlineColor: "#3f97e0",
polygonOutlineWidth: 4,
polygonOutlineOpacity: 1,
polygonFillOpacity: .3,
pointColor: "#3f97e0",
pointOpacity: 1,
pointOutlineColor: "#ffffff",
pointOutlineOpacity: 1,
pointOutlineWidth: 0,
pointWidth: 6,
lineStringColor: "#3f97e0",
lineStringWidth: 4,
lineStringOpacity: 1,
zIndex: 0,
markerUrl: void 0,
markerHeight: void 0,
markerWidth: void 0,
lineStringDash: void 0
});
return e.type === "Feature" && e.geometry.type === "LineString" && e.properties.mode === this.mode ? (n.lineStringDash = this.styles.lineStringDash, n.lineStringColor = this.getHexColorStylingValue(this.styles.lineStringColor, n.lineStringColor, e), n.lineStringOpacity = this.getNumericStylingValue(this.styles.lineStringOpacity, n.lineStringOpacity === void 0 ? 1 : n.lineStringOpacity, e), n.lineStringWidth = this.getNumericStylingValue(this.styles.lineStringWidth, n.lineStringWidth, e), n.zIndex = u, n) : e.type === "Feature" && e.geometry.type === "Point" && e.properties.mode === this.mode ? (n.pointWidth = this.getNumericStylingValue(this.styles.closingPointWidth, n.pointWidth, e), n.pointOpacity = this.getNumericStylingValue(this.styles.closingPointOpacity, 1, e), n.pointColor = this.getHexColorStylingValue(this.styles.closingPointColor, n.pointColor, e), n.pointOutlineColor = this.getHexColorStylingValue(this.styles.closingPointOutlineColor, n.pointOutlineColor, e), n.pointOutlineOpacity = this.getNumericStylingValue(this.styles.closingPointOutlineOpacity, 1, e), n.pointOutlineWidth = this.getNumericStylingValue(this.styles.closingPointOutlineWidth, 2, e), n.zIndex = 50, n) : n;
}
validateFeature(e) {
return this.validateModeFeature(e, (e) => Fe(e, this.coordinatePrecision));
}
afterFeatureUpdated(e) {
this.currentId === e.id && (this.closingPoints.delete(), this.canClose = !1, this.currentId = void 0);
}
registerBehaviors(e) {
this.readFeature = new P(e), this.mutateFeature = new M(e, { validate: this.validate }), this.pixelDistance = new F(e), this.closingPoints = new We(e, this.pixelDistance, this.mutateFeature, this.readFeature);
}
};
function hn(e) {
if (e === null || typeof e == "boolean" || typeof e == "string") return !0;
if (e === void 0) return !1;
if (typeof e == "number") return Number.isFinite(e);
if (typeof e == "bigint" || typeof e == "symbol" || typeof e == "function" || e instanceof RegExp || e instanceof Map || e instanceof Set || e instanceof Date) return !1;
if (typeof e == "object" && e && !Array.isArray(e)) {
let t = Object.getPrototypeOf(e);
if (t !== Object.prototype && t !== null) return !1;
}
if (ArrayBuffer.isView(e) && !(e instanceof DataView)) return !1;
if (Array.isArray(e)) {
for (let t of e) if (!hn(t)) return !1;
}
return typeof e == "object" && Object.keys(e).every((t) => typeof t == "string" && hn(e[t]));
}
var gn = {
create: "crosshair",
dragStart: "grabbing",
dragEnd: "crosshair"
}, _n = class extends _ {
constructor(e) {
super(e, !0), this.mode = "marker", this.cursors = gn, this.editable = !1, this.editedFeatureId = void 0, this.pixelDistance = void 0, this.clickBoundingBox = void 0, this.pointSearch = void 0, this.mutateFeature = void 0, this.updateOptions(e);
}
updateOptions(e) {
super.updateOptions(e), e != null && e.cursors && (this.cursors = t({}, this.cursors, e.cursors)), e != null && e.editable && (this.editable = e.editable);
}
start() {
this.setStarted(), this.setCursor(this.cursors.create);
}
stop() {
this.cleanUp(), this.setStopped(), this.setCursor("unset");
}
onClick(e) {
e.button === "right" && this.allowPointerEvent(this.pointerEvents.rightClick, e) || e.isContextMenu && this.allowPointerEvent(this.pointerEvents.contextMenu, e) ? this.onRightClick(e) : e.button === "left" && this.allowPointerEvent(this.pointerEvents.leftClick, e) && this.onLeftClick(e);
}
onMouseMove() {}
onKeyDown() {}
onKeyUp() {}
cleanUp() {
this.editedFeatureId = void 0;
}
onDragStart(e, t) {
if (this.allowPointerEvent(this.pointerEvents.onDragStart, e)) {
if (this.editable) {
let t = this.pointSearch.getNearestPointFeature(e);
this.editedFeatureId = t?.id;
}
this.editedFeatureId && (this.setCursor(this.cursors.dragStart), t(!1));
}
}
onDrag(e, t) {
this.allowPointerEvent(this.pointerEvents.onDrag, e) && this.editedFeatureId !== void 0 && this.mutateFeature.updatePoint({
featureId: this.editedFeatureId,
coordinateMutations: {
type: j,
coordinates: [e.lng, e.lat]
},
propertyMutations: { [l.EDITED]: !0 },
context: { updateType: o.Provisional }
});
}
onDragEnd(e, t) {
if (!this.allowPointerEvent(this.pointerEvents.onDragEnd, e) || this.editedFeatureId === void 0 || !this.mutateFeature.updatePoint({
featureId: this.editedFeatureId,
propertyMutations: {
mode: this.mode,
[l.EDITED]: !1
},
context: {
updateType: o.Finish,
action: "edit"
}
})) return;
let r = this.editedFeatureId;
this.setCursor(this.cursors.dragEnd), this.editedFeatureId = void 0, t(!0), this.onFinish(r, {
mode: this.mode,
action: n
});
}
registerBehaviors(e) {
this.pixelDistance = new F(e), this.clickBoundingBox = new Ee(e), this.pointSearch = new et(e, this.pixelDistance, this.clickBoundingBox), this.mutateFeature = new M(e, { validate: this.validate });
}
styleFeature(e) {
let n = t({}, {
polygonFillColor: "#3f97e0",
polygonOutlineColor: "#3f97e0",
polygonOutlineWidth: 4,
polygonOutlineOpacity: 1,
polygonFillOpacity: .3,
pointColor: "#3f97e0",
pointOpacity: 1,
pointOutlineColor: "#ffffff",
pointOutlineOpacity: 1,
pointOutlineWidth: 0,
pointWidth: 6,
lineStringColor: "#3f97e0",
lineStringWidth: 4,
lineStringOpacity: 1,
zIndex: 0,
markerUrl: void 0,
markerHeight: void 0,
markerWidth: void 0,
lineStringDash: void 0
});
return e.type === "Feature" && e.geometry.type === "Point" && e.properties.mode === this.mode && (n.zIndex = 30, n.markerHeight = this.getNumericStylingValue(this.styles?.markerHeight, 40, e), n.markerWidth = this.getNumericStylingValue(this.styles?.markerWidth, 32, e), n.markerUrl = this.getUrlStylingValue(this.styles?.markerUrl, s, e)), n;
}
validateFeature(e) {
return this.validateModeFeature(e, (e) => $e(e, this.coordinatePrecision));
}
onLeftClick(e) {
let t = this.mutateFeature.createPoint({
coordinates: [e.lng, e.lat],
properties: {
mode: this.mode,
[l.MARKER]: !0
},
context: {
updateType: o.Finish,
action: n
}
});
t && this.onFinish(t.id, {
mode: this.mode,
action: n
});
}
onRightClick(e) {
if (!this.editable) return;
let t = this.pointSearch.getNearestPointFeature(e);
t && this.mutateFeature.deleteFeatureIfPresent(t.id);
}
afterFeatureUpdated(e) {
this.editedFeatureId === e.id && (this.editedFeatureId = void 0, this.setCursor(this.cursors.create));
}
}, vn = [{
key: "z",
heldKeys: ["meta"]
}, {
key: "z",
heldKeys: ["control"]
}], yn = [
{
key: "z",
heldKeys: ["meta", "shift"]
},
{
key: "z",
heldKeys: ["control", "shift"]
},
{
key: "y",
heldKeys: ["control"]
}
], bn = (e, t) => {
let n = e.key.toLowerCase(), r = new Set(e.heldKeys.map((e) => e.toLowerCase()).filter((e) => e !== n));
if (t.key.toLowerCase() !== n) return !1;
let i = new Set(t.heldKeys.map((e) => e.toLowerCase()));
if (r.size !== i.size) return !1;
for (let e of i) if (!r.has(e)) return !1;
return !0;
}, xn = class {
constructor(e) {
this.undoKeyboardShortcuts = void 0, this.redoKeyboardShortcuts = void 0, this.undoKeyboardShortcuts = e?.undo ?? vn, this.redoKeyboardShortcuts = e?.redo ?? yn;
}
isUndoKeyboardShortcut(e) {
return this.undoKeyboardShortcuts.some((t) => bn(e, t));
}
isRedoKeyboardShortcut(e) {
return this.redoKeyboardShortcuts.some((t) => bn(e, t));
}
};
function Sn(e) {
return e !== void 0 && Number.isFinite(e) ? Math.max(0, Math.floor(e)) : Infinity;
}
var W = "undo", G = "redo", K = "push", q = "mode", Cn = "session", wn = class {
constructor(e) {
this.getModeState = void 0, this.getModeHistorySizes = void 0, this.undoMode = void 0, this.redoMode = void 0, this.clearModeHistory = void 0, this.onHistoryChange = void 0, this.maxStackSize = void 0, this.lastHistorySizes = {
undoSize: 0,
redoSize: 0
}, this.maxStackSize = Sn(e?.maxStackSize);
}
getMaxStackSize() {
return this.maxStackSize;
}
register(e) {
this.getModeState = e.getModeState, this.getModeHistorySizes = e.getModeHistorySizes, this.undoMode = e.undoMode, this.redoMode = e.redoMode, this.clearModeHistory = e.clearModeHistory, this.onHistoryChange = e.onHistoryChange;
}
inDrawingState() {
return !!this.getModeState && this.getModeState() === "drawing";
}
canUndo() {
if (!this.inDrawingState()) return !1;
let { undoSize: e } = this.getHistorySizes();
return e > 0;
}
canRedo() {
if (!this.inDrawingState()) return !1;
let { redoSize: e } = this.getHistorySizes();
return e > 0;
}
undo() {
return !(!this.canUndo() || !this.undoMode || (this.undoMode(), this.emitHistoryChange(W), 0));
}
redo() {
return !(!this.canRedo() || !this.redoMode || (this.redoMode(), this.emitHistoryChange(G), 0));
}
clearHistory() {
this.clearModeHistory && this.clearModeHistory(), this.lastHistorySizes = {
undoSize: 0,
redoSize: 0
};
}
getHistorySizes() {
return this.getModeHistorySizes ? this.getModeHistorySizes() : {
undoSize: 0,
redoSize: 0
};
}
undoSize() {
return this.getHistorySizes().undoSize;
}
redoSize() {
return this.getHistorySizes().redoSize;
}
emitPushIfHistoryChangedFromLastSnapshot() {
if (!this.inDrawingState()) return;
let e = this.getHistorySizes();
e.undoSize === this.lastHistorySizes.undoSize && e.redoSize === this.lastHistorySizes.redoSize || this.emitHistoryChange(K);
}
emitPushIfHistoryChanged(e) {
if (!this.inDrawingState()) return;
let t = this.getHistorySizes();
t.undoSize === e.undoSize && t.redoSize === e.redoSize || this.emitHistoryChange(K);
}
emitHistoryChange(e) {
if (!this.onHistoryChange) return;
let { undoSize: t, redoSize: n } = this.getHistorySizes();
this.lastHistorySizes = {
undoSize: t,
redoSize: n
}, this.onHistoryChange({
cause: e,
stack: q,
undoStackSize: t,
redoStackSize: n
});
}
}, Tn = class {
constructor(e) {
this.draw = void 0, this.onHistoryChange = void 0, this.maxStackSize = void 0, this.historyById = {}, this.undoStack = [], this.ignoreProgrammaticCreate = {}, this.ignoreProgrammaticDelete = {}, this.deletedFeatureIds = {}, this.redoStack = [], this.isReplayingHistory = !1, this.emitStackChange = (e) => {
this.onHistoryChange && this.onHistoryChange({
cause: e,
stack: Cn,
undoStackSize: this.undoStack.length,
redoStackSize: this.redoStack.length
});
}, this.handleChange = (e, t, n) => {
if (!this.draw || this.isDrawing() || this.maxStackSize === 0) return;
if (t === "update") {
if (n === void 0 || !("origin" in n) || n.origin !== "api" || this.isReplayingHistory) return;
let t = Array.isArray(e) ? e : [e], r = !1;
for (let e of t) {
if (e == null) continue;
let t = String(e), n = this.draw.getSnapshotFeature(e);
n && (this.historyById[t] || (this.historyById[t] = []), this.historyById[t].push(n), this.pushUndoStackEntry({
id: e,
toIndex: this.historyById[t].length - 1,
action: "single"
}), r = !0);
}
r && (this.redoStack.length = 0, this.emitStackChange(K));
return;
}
if (t !== "delete" && t !== "create") return;
if (t === "create") {
if (n === void 0 || !("origin" in n) || n.origin !== "api") return;
let t = !1, r = Array.isArray(e) ? e : [e], i = [];
for (let e of r) {
if (this.ignoreProgrammaticCreate[e]) {
delete this.ignoreProgrammaticCreate[e], delete this.deletedFeatureIds[e];
continue;
}
let n = String(e), r = this.draw.getSnapshotFeature(e);
r && (this.deletedFeatureIds[e] && (this.historyById[n] = [], delete this.deletedFeatureIds[e]), this.historyById[n] || (this.historyById[n] = []), this.historyById[n].push(r), i.push({
id: e,
toIndex: this.historyById[n].length - 1,
snapshot: r
}), t = !0);
}
if (i.length > 1) this.pushUndoStackEntry({
id: i[0].id,
toIndex: i[0].toIndex,
action: "batch-create",
metadata: { entries: i }
});
else if (i.length === 1) {
let e = i[0];
this.pushUndoStackEntry({
id: e.id,
toIndex: e.toIndex,
action: "single"
});
}
t && (this.redoStack.length = 0, this.emitStackChange(K));
return;
}
let r = !1, i = Array.isArray(e) ? e : [e], a = [];
for (let e of i) {
let t = String(e);
if (this.ignoreProgrammaticDelete[e]) {
delete this.ignoreProgrammaticDelete[e];
continue;
}
if (!this.historyById[t]) continue;
let n = this.historyById[t].length - 1;
if (n >= 0) {
let i = this.historyById[t][n];
if (!i) continue;
a.push({
id: e,
toIndex: n,
snapshot: i
}), this.deletedFeatureIds[e] = !0, r = !0;
}
}
if (a.length > 1) this.pushUndoStackEntry({
id: a[0].id,
toIndex: a[0].toIndex,
action: "batch-delete",
metadata: { entries: a }
});
else if (a.length === 1) {
let e = a[0];
this.pushUndoStackEntry({
id: e.id,
toIndex: e.toIndex,
action: "single"
});
}
r && (this.redoStack.length = 0, this.emitStackChange(K));
}, this.handleFinish = (e) => {
if (!this.draw || this.maxStackSize === 0 || this.isReplayingHistory) return;
let t = Array.isArray(e) ? e : [e], n = !1;
for (let e of t) {
if (e == null) continue;
let t = String(e), r = this.draw.getSnapshotFeature(e);
r && (this.historyById[t] || (this.historyById[t] = []), this.historyById[t].push(r), n ||= (this.redoStack.length = 0, !0), this.pushUndoStackEntry({
id: e,
toIndex: this.historyById[t].length - 1,
action: "single"
}), this.emitStackChange(K));
}
}, this.maxStackSize = Sn(e?.maxStackSize);
}
register(e) {
this.draw === e.draw ? this.onHistoryChange = e.onHistoryChange : (this.draw && (this.draw.off("change", this.handleChange), this.draw.off("finish", this.handleFinish)), this.draw = e.draw, this.draw.on("change", this.handleChange), this.draw.on("finish", this.handleFinish), this.onHistoryChange = e.onHistoryChange);
}
pushUndoStackEntry(e) {
this.maxStackSize !== 0 && (this.undoStack.push(e), this.undoStack.length > this.maxStackSize && this.undoStack.shift());
}
pushRedoStackEntry(e) {
this.maxStackSize !== 0 && (this.redoStack.push(e), this.redoStack.length > this.maxStackSize && this.redoStack.shift());
}
isDrawing() {
return !!this.draw && this.draw.getModeState() === "drawing";
}
applySnapshotDuringReplay(e, t) {
if (this.draw) {
this.isReplayingHistory = !0;
try {
this.draw.hasFeature(e) && (this.ignoreProgrammaticDelete[e] = !0, this.draw.removeFeatures([e])), this.ignoreProgrammaticCreate[e] = !0, delete this.deletedFeatureIds[e], this.draw.addFeatures([t]);
} finally {
this.isReplayingHistory = !1;
}
}
}
canUndo() {
return !(!this.draw || this.isDrawing()) && this.undoStack.length > 0;
}
canRedo() {
return !(!this.draw || this.isDrawing()) && this.redoStack.length > 0;
}
undo() {
if (!this.canUndo() || !this.draw) return !1;
let e = this.undoStack.pop();
if (!e) return this.emitStackChange(W), !1;
if (e.action === "batch-create") {
let t = e.metadata?.entries || [];
if (t.length === 0) return this.emitStackChange(W), !1;
let n = t.map((e) => e.id);
return n.forEach((e) => {
this.ignoreProgrammaticDelete[e] = !0, this.deletedFeatureIds[e] = !0;
}), this.draw.removeFeatures(n), this.pushRedoStackEntry({
id: t[0].id,
toIndex: t[0].toIndex,
action: "batch-create",
metadata: { entries: t }
}), this.emitStackChange(W), !0;
}
if (e.action === "batch-delete") {
let t = e.metadata?.entries || [];
if (t.length === 0) return this.emitStackChange(W), !1;
let n = t.map((e) => e.snapshot).filter((e) => e !== void 0);
return n.length > 0 && (t.forEach((e) => {
this.ignoreProgrammaticCreate[e.id] = !0, delete this.deletedFeatureIds[e.id];
}), this.draw.addFeatures(n)), this.pushRedoStackEntry({
id: t[0].id,
toIndex: t[0].toIndex,
action: "batch-delete",
metadata: { entries: t }
}), this.emitStackChange(W), !0;
}
let t = e.id, n = e.toIndex, r = String(t), i = this.historyById[r];
if (!i || i.length === 0) return this.emitStackChange(W), !1;
let a = Math.min(n, i.length - 1);
if (!this.draw.hasFeature(t)) {
let e = i[a];
return e ? (this.ignoreProgrammaticCreate[t] = !0, delete this.deletedFeatureIds[t], this.draw.addFeatures([e]), this.pushRedoStackEntry({
id: t,
toIndex: a,
action: "delete",
snapshot: e
}), this.emitStackChange(W), !0) : (this.emitStackChange(W), !1);
}
if (a <= 0) return this.pushRedoStackEntry({
id: t,
toIndex: 0,
action: "create"
}), this.ignoreProgrammaticDelete[t] = !0, this.deletedFeatureIds[t] = !0, this.draw.removeFeatures([t]), this.undoStack = this.undoStack.filter((e) => e.id !== t), this.emitStackChange(W), !0;
let o = i[a], s = i[a - 1];
return o && this.pushRedoStackEntry({
id: t,
toIndex: a,
snapshot: o,
action: "update"
}), this.applySnapshotDuringReplay(t, s), i.length = a, this.emitStackChange(W), !0;
}
redo() {
if (!this.canRedo() || !this.draw) return !1;
let { id: e, toIndex: t, snapshot: n, action: r, metadata: i } = this.redoStack.pop();
if (r === "batch-create") {
let e = i?.entries || [];
if (e.length === 0) return this.emitStackChange(G), !1;
let t = e.map((e) => e.snapshot).filter((e) => e !== void 0);
return t.length > 0 && (e.forEach((e) => {
this.ignoreProgrammaticCreate[e.id] = !0;
}), this.draw.addFeatures(t)), this.pushUndoStackEntry({
id: e[0].id,
toIndex: e[0].toIndex,
action: "batch-create",
metadata: { entries: e }
}), this.emitStackChange(G), !0;
}
if (r === "batch-delete") {
let e = i?.entries || [];
if (e.length === 0) return this.emitStackChange(G), !1;
let t = e.map((e) => e.id);
return t.forEach((e) => {
this.ignoreProgrammaticDelete[e] = !0, this.deletedFeatureIds[e] = !0;
}), this.draw.removeFeatures(t), this.pushUndoStackEntry({
id: e[0].id,
toIndex: e[0].toIndex,
action: "batch-delete",
metadata: { entries: e }
}), this.emitStackChange(G), !0;
}
let a = String(e), o = this.historyById[a] || (this.historyById[a] = []);
if (r === "delete") return this.ignoreProgrammaticDelete[e] = !0, this.deletedFeatureIds[e] = !0, this.draw.removeFeatures([e]), this.pushUndoStackEntry({
id: e,
toIndex: t,
action: "single"
}), this.emitStackChange(G), !0;
if (t <= 0) {
let t = o[0];
return !!t && (this.ignoreProgrammaticCreate[e] = !0, this.draw.addFeatures([t]), this.pushUndoStackEntry({
id: e,
toIndex: 0,
action: "single"
}), this.emitStackChange(G), !0);
}
let s = n || o[t];
return !!s && (o.length === t ? o.push(s) : (o[t] = s, o.length = t + 1), this.applySnapshotDuringReplay(e, s), this.pushUndoStackEntry({
id: e,
toIndex: t,
action: "single"
}), this.emitStackChange(G), !0);
}
clearHistory() {
let e = {};
if (this.draw && !this.isDrawing()) {
let t = this.draw.getSnapshot();
for (let n of t) e[String(n.id)] = [n];
}
this.historyById = e, this.undoStack = [], this.ignoreProgrammaticCreate = {}, this.ignoreProgrammaticDelete = {}, this.deletedFeatureIds = {}, this.redoStack = [];
}
undoSize() {
return this.undoStack.length;
}
redoSize() {
return this.redoStack.length;
}
}, En = class {
constructor(e) {
this.modeLevel = void 0, this.sessionLevel = void 0, this.shouldPreferMode = void 0, this.onHistoryChange = void 0, this.shouldEmitHistoryChange = void 0, this.modeLevel = e.modeLevel, this.sessionLevel = e.sessionLevel, this.shouldPreferMode = e.shouldPreferMode, this.onHistoryChange = e.onHistoryChange, this.shouldEmitHistoryChange = e.shouldEmitHistoryChange ?? (() => !0);
}
emitStackHistoryChange(e) {
this.shouldEmitHistoryChange() && this.onHistoryChange && this.onHistoryChange({
cause: e.cause,
stack: e.stack,
undoSize: e.undoStackSize,
redoSize: e.redoStackSize
});
}
hasSessionUndo() {
return !!(this.sessionLevel && this.sessionLevel.canUndo());
}
hasSessionRedo() {
return !!(this.sessionLevel && this.sessionLevel.canRedo());
}
activeStackForUndo() {
var e, t;
return this.shouldPreferMode() && (e = this.modeLevel) != null && e.canUndo() ? q : this.hasSessionUndo() ? Cn : (t = this.modeLevel) != null && t.canUndo() ? q : void 0;
}
activeStackForRedo() {
var e, t;
return this.shouldPreferMode() && (e = this.modeLevel) != null && e.canRedo() ? q : this.hasSessionRedo() ? Cn : (t = this.modeLevel) != null && t.canRedo() ? q : void 0;
}
canUndo() {
return this.activeStackForUndo() !== void 0;
}
canRedo() {
return this.activeStackForRedo() !== void 0;
}
undo() {
let e = this.activeStackForUndo();
return !!e && (e === q ? !!this.modeLevel && this.modeLevel.undo() : !(!this.sessionLevel || !this.sessionLevel.canUndo()) && this.sessionLevel.undo());
}
redo() {
let e = this.activeStackForRedo();
return !!e && (e === q ? !!this.modeLevel && this.modeLevel.redo() : !(!this.sessionLevel || !this.sessionLevel.canRedo()) && this.sessionLevel.redo());
}
clearHistory() {
this.modeLevel && this.modeLevel.clearHistory(), this.sessionLevel && this.sessionLevel.clearHistory();
}
emitHistoryPushForCompletedAction() {
this.sessionLevel ? this.emitStackHistoryChange({
cause: K,
undoStackSize: this.sessionLevel.undoSize(),
redoStackSize: this.sessionLevel.redoSize(),
stack: Cn
}) : this.modeLevel && this.emitStackHistoryChange({
cause: K,
undoStackSize: this.modeLevel.undoSize(),
redoStackSize: this.modeLevel.redoSize(),
stack: q
});
}
}, Dn = class {
constructor(e) {
var n, r, i, a;
this._modes = void 0, this._mode = void 0, this._adapter = void 0, this._enabled = !1, this._store = void 0, this._eventListeners = void 0, this._instanceSelectModes = void 0, this.sessionUndoRedoEnabled = !1, this.keyboardShortcutsMatcher = void 0, this.drawingUndoRedo = void 0, this.sessionUndoRedo = void 0, this.undoRedoCoordinator = void 0, this._adapter = e.adapter, this._instanceSelectModes = [];
let o = e == null || (n = e.undoRedo) == null ? void 0 : n.modeLevel;
o && (this.drawingUndoRedo = o);
let s = e == null || (r = e.undoRedo) == null ? void 0 : r.keyboardShortcuts;
s && (this.keyboardShortcutsMatcher = s), this.sessionUndoRedoEnabled = !!(!(e == null || (i = e.undoRedo) == null) && i.sessionLevel);
let c = e == null || (a = e.undoRedo) == null ? void 0 : a.sessionLevel;
this._mode = new jt();
let l = /* @__PURE__ */ new Set(), u = e.modes.reduce((e, t) => {
if (l.has(t.mode)) throw Error(`There is already a ${t.mode} mode provided`);
return l.add(t.mode), e[t.mode] = t, e;
}, {}), d = Object.keys(u);
if (d.length === 0) throw Error("No modes provided");
d.forEach((e) => {
u[e].type === h.Select && this._instanceSelectModes.push(e);
}), this._modes = t({}, u, { static: this._mode }), this._eventListeners = {
change: [],
select: [],
deselect: [],
finish: [],
ready: [],
history: []
}, this._store = new Yt({
tracked: !!e.tracked,
idStrategy: e.idStrategy ? e.idStrategy : void 0
});
let f = (e) => {
let t = [];
return {
changed: t,
unchanged: this._store.copyAll().filter((n) => !e.includes(n.id) || (t.push(n), !1))
};
}, p = (e, t) => {
var n;
this._enabled && (this._eventListeners.finish.forEach((n) => {
n(e, t);
}), (n = this.undoRedoCoordinator) == null || n.emitHistoryPushForCompletedAction());
}, m = (e, t, n) => {
if (!this._enabled) return;
this._eventListeners.change.forEach((r) => {
r(e, t, n);
}), this.emitDrawingPushIfHistoryChangedFromLastSnapshot();
let { changed: r, unchanged: i } = f(e);
t === "create" ? this._adapter.render({
created: r,
deletedIds: [],
unchanged: i,
updated: []
}, this.getModeStyles()) : t === "update" ? this._adapter.render({
created: [],
deletedIds: [],
unchanged: i,
updated: r
}, this.getModeStyles()) : t === "delete" ? this._adapter.render({
created: [],
deletedIds: e,
unchanged: i,
updated: []
}, this.getModeStyles()) : t === "styling" && this._adapter.render({
created: [],
deletedIds: [],
unchanged: i,
updated: []
}, this.getModeStyles());
}, g = (e) => {
if (!this._enabled) return;
this._eventListeners.select.forEach((t) => {
t(e);
});
let { changed: t, unchanged: n } = f([e]);
this._adapter.render({
created: [],
deletedIds: [],
unchanged: n,
updated: t
}, this.getModeStyles());
}, _ = (e) => {
if (!this._enabled) return;
this._eventListeners.deselect.forEach((t) => {
t(e);
});
let { changed: t, unchanged: n } = f([e]);
t && this._adapter.render({
created: [],
deletedIds: [],
unchanged: n,
updated: t
}, this.getModeStyles());
};
Object.keys(this._modes).forEach((e) => {
var t;
this._modes[e].register({
mode: e,
store: this._store,
setCursor: this._adapter.setCursor.bind(this._adapter),
project: this._adapter.project.bind(this._adapter),
unproject: this._adapter.unproject.bind(this._adapter),
setDoubleClickToZoom: this._adapter.setDoubleClickToZoom.bind(this._adapter),
onChange: m,
onSelect: g,
onDeselect: _,
onFinish: p,
coordinatePrecision: this._adapter.getCoordinatePrecision(),
undoRedoMaxStackSize: (t = this.drawingUndoRedo) == null || t.getMaxStackSize == null ? void 0 : t.getMaxStackSize()
});
}), this.sessionUndoRedoEnabled && c && (this.sessionUndoRedo = c, c.register({
draw: this,
onHistoryChange: (e) => {
var t;
(t = this.undoRedoCoordinator) == null || t.emitStackHistoryChange(e);
}
})), this.drawingUndoRedo && this.drawingUndoRedo.register({
getModeState: () => this.getModeState(),
getModeHistorySizes: () => this.getDrawingHistorySizes(),
undoMode: () => {
this._mode.undo && this._mode.undo();
},
redoMode: () => {
this._mode.redo && this._mode.redo();
},
clearModeHistory: () => {
let e = this._mode;
e.clearHistory && e.clearHistory();
},
onHistoryChange: (e) => {
var t;
(t = this.undoRedoCoordinator) == null || t.emitStackHistoryChange(e);
}
}), this.undoRedoCoordinator = new En({
modeLevel: this.drawingUndoRedo,
sessionLevel: this.sessionUndoRedo,
shouldPreferMode: () => this.getModeState() === "drawing",
onHistoryChange: (e) => {
this._eventListeners.history.forEach((t) => {
t(e);
});
},
shouldEmitHistoryChange: () => this._enabled
});
}
checkEnabled() {
if (!this._enabled) throw Error("Terra Draw is not enabled");
}
handleUndoRedoKeyboardShortcut(e) {
if (!this.drawingUndoRedo && !this.sessionUndoRedoEnabled || !this.keyboardShortcutsMatcher) return !1;
let t = this.keyboardShortcutsMatcher.isUndoKeyboardShortcut(e), n = this.keyboardShortcutsMatcher.isRedoKeyboardShortcut(e);
if (t) {
if (!this.canUndo()) return !1;
let t = this.undo();
return t && e.preventDefault(), t;
}
if (n) {
if (!this.canRedo()) return !1;
let t = this.redo();
return t && e.preventDefault(), t;
}
return !1;
}
getDrawingHistorySizes() {
return {
undoSize: this._mode.undoSize && typeof this._mode.undoSize == "function" ? this._mode.undoSize() : 0,
redoSize: this._mode.redoSize && typeof this._mode.redoSize == "function" ? this._mode.redoSize() : 0
};
}
emitDrawingPushIfHistoryChangedFromLastSnapshot() {
this.drawingUndoRedo && this.drawingUndoRedo.emitPushIfHistoryChangedFromLastSnapshot();
}
emitDrawingPushIfHistoryChanged(e) {
this.drawingUndoRedo && this.drawingUndoRedo.emitPushIfHistoryChanged(e);
}
getModeStyles() {
let e = {}, t = this._instanceSelectModes.includes(this._mode.mode) ? this._mode.mode : void 0;
return Object.keys(this._modes).forEach((n) => {
e[n] = (e) => t && e.properties[c.SELECTED] ? this._modes[t].styleFeature.bind(this._modes[t])(e) : this._modes[n].styleFeature.bind(this._modes[n])(e);
}), e;
}
featuresAtLocation({ lng: e, lat: t }, n) {
let r = n && n.pointerDistance !== void 0 ? n.pointerDistance : 30, i = !n || n.ignoreSelectFeatures === void 0 || n.ignoreSelectFeatures, a = !(!n || n.ignoreCoordinatePoints === void 0) && n.ignoreCoordinatePoints, o = !(!n || n.ignoreCurrentlyDrawing === void 0) && n.ignoreCurrentlyDrawing, s = !(!n || n.ignoreClosingPoints === void 0) && n.ignoreClosingPoints, u = !(!n || n.ignoreSnappingPoints === void 0) && n.ignoreSnappingPoints, d = this._adapter.unproject.bind(this._adapter), f = this._adapter.project.bind(this._adapter), p = f(e, t), m = Te({
unproject: d,
point: p,
pointerDistance: r
});
return this._store.search(m).filter((d) => {
if (i && (d.properties[c.MID_POINT] || d.properties[c.SELECTION_POINT]) || a && d.properties[l.COORDINATE_POINT] || s && d.properties[l.CLOSING_POINT] || o && d.properties[l.CURRENTLY_DRAWING] || u && d.properties[l.SNAPPING_POINT]) return !1;
if (d.geometry.type === "Point") {
let e = d.geometry.coordinates;
return N(p, f(e[0], e[1])) < r;
}
if (d.geometry.type === "LineString") {
let e = d.geometry.coordinates;
for (let t = 0; t < e.length - 1; t++) {
let n = e[t], i = e[t + 1];
if (_t(p, f(n[0], n[1]), f(i[0], i[1])) < r) return !0;
}
return !1;
}
if (gt([e, t], d.geometry.coordinates)) return !0;
if (n != null && n.includePolygonsWithinPointerDistance) {
let e = d.geometry.coordinates;
for (let t of e) for (let e = 0; e < t.length - 1; e++) {
let n = t[e], i = t[e + 1];
if (_t(p, f(n[0], n[1]), f(i[0], i[1])) < r) return !0;
}
}
return !1;
}).map((r) => {
if (n == null || !n.addClosestCoordinateInfoToProperties) return r;
let i;
if (r.geometry.type === "Polygon") i = r.geometry.coordinates[0].slice(0, -1);
else {
if (r.geometry.type !== "LineString") return r;
i = r.geometry.coordinates;
}
let a, o = -1, s = Infinity;
for (let e = 0; e < i.length; e++) {
let t = i[e], n = N(f(t[0], t[1]), p);
n < s && (o = e, s = n, a = t);
}
return r.properties.closestCoordinateIndexToEvent = o, r.properties.closestCoordinatePixelDistanceToEvent = s, r.properties.closestCoordinateDistanceKmToEvent = y(a, [e, t]), r;
});
}
getSelectModeOrThrow(e = void 0) {
let t = this.getSelectMode({
switchToSelectMode: !0,
selectMode: e
});
if (!t) throw Error("No select mode defined in instance");
return t;
}
getSelectMode({ switchToSelectMode: e, selectMode: t }) {
this.checkEnabled();
let n = this.getMode();
if (this._instanceSelectModes.length === 0) return null;
if (t !== void 0 && !this._instanceSelectModes.includes(t)) throw Error(`No select mode with this name present: ${t}`);
let r;
return r = t === void 0 ? this._instanceSelectModes.includes(n) ? n : this._instanceSelectModes[0] : t, e && n !== r && this.setMode(r), this._modes[r];
}
isGuidanceFeature(e) {
return !!(e.properties[c.MID_POINT] || e.properties[c.SELECTION_POINT] || e.properties[l.COORDINATE_POINT] || e.properties[l.SNAPPING_POINT]);
}
setModeStyles(e, t) {
if (this.checkEnabled(), !this._modes[e]) throw Error("No mode with this name present");
this._modes[e].styles = t;
}
updateModeOptions(e, t) {
if (this.checkEnabled(), !this._modes[e]) throw Error("No mode with this name present");
this._modes[e].updateOptions(t);
}
getSnapshot() {
return this._store.copyAll();
}
getSnapshotFeature(e) {
if (this._store.has(e)) return this._store.copy(e);
}
clear() {
this.checkEnabled(), this._adapter.clear();
}
get enabled() {
return this._enabled;
}
set enabled(e) {
throw Error("Enabled is read only");
}
getMode() {
return this._mode.mode;
}
getModeState() {
return this._mode.state;
}
setMode(e) {
if (this.checkEnabled(), !this._modes[e]) throw Error("No mode with this name present");
this._mode.stop(), this._mode = this._modes[e], this._mode.start();
}
removeFeatures(e) {
this.checkEnabled();
let t = [], n = [], r;
e.forEach((e) => {
if (!this._store.has(e)) throw Error(`No feature with id ${e}, can not delete`);
let i = this._store.getPropertiesCopy(e);
i[c.SELECTED] && this.deselectFeature(e), i[l.CURRENTLY_DRAWING] && this._modes[i.mode] ? r = i.mode : (i[l.COORDINATE_POINT_IDS] && t.push(...i[l.COORDINATE_POINT_IDS]), n.push(e));
}), this._store.delete([...n, ...t], { origin: "api" }), r && this._modes[r] && this._modes[r].cleanUp() && this._modes[r].cleanUp();
}
selectFeature(e, t) {
this.getSelectModeOrThrow(t).selectFeature(e);
}
deselectFeature(e) {
this.getSelectModeOrThrow().deselectFeature(e);
}
getFeatureId() {
return this._store.getId();
}
hasFeature(e) {
return this._store.has(e);
}
checkIsReservedProperty(e) {
return ![...Object.values(c), ...Object.values(l)].includes(e);
}
updateFeatureProperties(e, t) {
var n;
if (!this._store.has(e)) throw Error(`No feature with id ${e} present in store`);
let r = this._store.copy(e);
if (this.isGuidanceFeature(r)) throw Error("Guidance features are not allowed to be updated directly.");
let i = r.properties.mode;
if (!this._modes[i]) throw Error(`No mode with name ${i} present in instance`);
let a = Object.entries(t);
a.forEach(([e, t]) => {
if (!this.checkIsReservedProperty(e)) throw Error(`You are trying to update a reserved property name: ${e}. Please choose another name.`);
if (t !== void 0 && !hn(t)) throw Error(`Invalid JSON value provided for property ${e}`);
}), this._store.updateProperty(a.map(([e, t]) => ({
id: r.id,
property: e,
value: t
})), { origin: "api" }), (n = this.undoRedoCoordinator) == null || n.emitHistoryPushForCompletedAction();
}
updateFeatureGeometry(e, n) {
var r;
if (!this._store.has(e)) throw Error(`No feature with id ${e} present in store`);
let i = this._store.copy(e);
if (this.isGuidanceFeature(i)) throw Error("Guidance features are not allowed to be updated directly.");
if (!(i && n && n.type && n.coordinates)) throw Error("Invalid geometry provided");
if (n.type !== i.geometry.type) throw Error(`Geometry type mismatch: expected ${i.geometry.type}, got ${n.type}`);
let a = i.properties.mode, o = this._modes[a];
if (!o) throw Error(`No mode with name ${a} present in instance`);
let s = t({}, i, { geometry: n }), l = o.validateFeature(s);
if (!l.valid) throw Error(`Feature validation failed: ${l.reason || "Unknown reason"}`);
if (this._store.updateGeometry([{
id: i.id,
geometry: n
}], { origin: "api" }), o.afterFeatureUpdated) {
o.afterFeatureUpdated(s);
let e = s.properties[c.SELECTED], t = this.getSelectMode({ switchToSelectMode: !1 });
t && e && t.afterFeatureUpdated(s);
}
(r = this.undoRedoCoordinator) == null || r.emitHistoryPushForCompletedAction();
}
transformFeatureGeometry(e, t) {
var n;
if (!this._store.has(e)) throw Error(`No feature with id ${e} present in store`);
let r = this._store.copy(e);
if (this.isGuidanceFeature(r)) throw Error("Guidance features are not allowed to be updated directly.");
let i = r.properties.mode, a = this._modes[i];
if (!a) throw Error(`No mode with name ${i} present in instance`);
let o;
if (r.geometry.type === "Polygon") o = r.geometry.coordinates[0];
else {
if (r.geometry.type !== "LineString") throw Error(`Feature geometry type ${r.geometry.type} is not supported for transformation`);
o = r.geometry.coordinates;
}
if (t.projection != "web-mercator") throw Error(`Projection ${t.projection} is not currently supported for transformation`);
if (t.type === "scale") {
let { x: e, y: n } = T(t.origin[0], t.origin[1]);
Et({
coordinates: o,
originX: e,
originY: n,
xScale: t.options.xScale || 1,
yScale: t.options.yScale || 1
});
} else t.type === "rotate" && (r = St(r, t.options.angle || 0), o = r.geometry.type === "Polygon" ? r.geometry.coordinates[0] : r.geometry.coordinates);
if (o = o.map((e) => [C(e[0], this._adapter.getCoordinatePrecision()), C(e[1], this._adapter.getCoordinatePrecision())]), r.geometry.coordinates = r.geometry.type === "Polygon" ? [o] : o, this._store.updateGeometry([{
id: r.id,
geometry: r.geometry
}], { origin: "api" }), a.afterFeatureUpdated) {
a.afterFeatureUpdated(r);
let e = r.properties[c.SELECTED], t = this.getSelectMode({ switchToSelectMode: !1 });
t && e && t.afterFeatureUpdated(r);
}
(n = this.undoRedoCoordinator) == null || n.emitHistoryPushForCompletedAction();
}
undo() {
return this.checkEnabled(), !!this.undoRedoCoordinator && this.undoRedoCoordinator.undo();
}
canUndo() {
return this.checkEnabled(), !!this.undoRedoCoordinator && this.undoRedoCoordinator.canUndo();
}
canRedo() {
return this.checkEnabled(), !!this.undoRedoCoordinator && this.undoRedoCoordinator.canRedo();
}
redo() {
return this.checkEnabled(), !!this.undoRedoCoordinator && this.undoRedoCoordinator.redo();
}
clearUndoRedoHistory() {
this.checkEnabled(), this.undoRedoCoordinator && this.undoRedoCoordinator.clearHistory();
}
addFeatures(e) {
return this.checkEnabled(), e.length === 0 ? [] : this._store.load(e, (e) => {
if (f(e)) {
let t = e.properties.mode, n = this._modes[t];
if (!n) return {
id: e.id,
valid: !1,
reason: `${t} mode is not in the list of instantiated modes`
};
let r = n.validateFeature.bind(n)(e);
return {
id: e.id,
valid: r.valid,
reason: r.reason ? r.reason : r.valid ? void 0 : "Feature is invalid"
};
}
return {
id: e.id,
valid: !1,
reason: "Mode property does not exist"
};
}, (e) => {
if (f(e)) {
let t = this._modes[e.properties.mode];
t && t.afterFeatureAdded && t.afterFeatureAdded(e);
}
}, { origin: "api" });
}
start() {
this._enabled || (this._enabled = !0, this._adapter.register({
onReady: () => {
this._eventListeners.ready.forEach((e) => {
e();
});
},
getState: () => this._mode.state,
onClick: (e) => {
let t = this.drawingUndoRedo ? this.drawingUndoRedo.getHistorySizes() : {
undoSize: 0,
redoSize: 0
};
this._mode.onClick(e), this.emitDrawingPushIfHistoryChanged(t);
},
onMouseMove: (e) => {
this._mode.onMouseMove(e);
},
onKeyDown: (e) => {
this.handleUndoRedoKeyboardShortcut(e) || this._mode.onKeyDown(e);
},
onKeyUp: (e) => {
let t = this.drawingUndoRedo ? this.drawingUndoRedo.getHistorySizes() : {
undoSize: 0,
redoSize: 0
};
this._mode.onKeyUp(e), this.emitDrawingPushIfHistoryChanged(t);
},
onDragStart: (e, t) => {
this._mode.onDragStart(e, t);
},
onDrag: (e, t) => {
this._mode.onDrag(e, t);
},
onDragEnd: (e, t) => {
this._mode.onDragEnd(e, t);
},
onClear: () => {
this._mode.cleanUp(), this._store.clear({ origin: "api" });
}
}));
}
getFeaturesAtLngLat(e, t) {
let { lng: n, lat: r } = e;
return this.featuresAtLocation({
lng: n,
lat: r
}, t);
}
getFeaturesAtPointerEvent(e, t) {
let n = this._adapter.getLngLatFromEvent.bind(this._adapter)(e);
return n === null ? [] : this.featuresAtLocation(n, t);
}
stop() {
this._enabled && (this._enabled = !1, this._adapter.unregister());
}
on(e, t) {
let n = this._eventListeners[e];
n.includes(t) || n.push(t);
}
off(e, t) {
let n = this._eventListeners[e];
n.includes(t) && n.splice(n.indexOf(t), 1);
}
};
//#endregion
//#region node_modules/.pnpm/terra-draw-maplibre-gl-adapter@1.4.1_maplibre-gl@5.24.0_terra-draw@1.31.0/node_modules/terra-draw-maplibre-gl-adapter/dist/terra-draw-maplibre-gl-adapter.modern.js
function On() {
return On = Object.assign ? Object.assign.bind() : function(e) {
for (var t = 1; t < arguments.length; t++) {
var n = arguments[t];
for (var r in n) ({}).hasOwnProperty.call(n, r) && (e[r] = n[r]);
}
return e;
}, On.apply(null, arguments);
}
var kn = class extends dn.TerraDrawBaseAdapter {
constructor(e) {
super(e), this._renderBeforeLayerId = void 0, this._prefixId = void 0, this._initialDragPan = void 0, this._initialDragRotate = void 0, this._nextRender = void 0, this._map = void 0, this._container = void 0, this.changedIds = {
deletion: !1,
points: !1,
linestrings: !1,
polygons: !1,
styling: !1
}, this._map = e.map, this._container = this._map.getContainer(), this._initialDragRotate = this._map.dragRotate.isEnabled(), this._initialDragPan = this._map.dragPan.isEnabled(), this._renderBeforeLayerId = e.renderBelowLayerId, this._prefixId = e.prefixId || "td";
}
hashCode(e) {
let t = 0;
for (let n = 0; n < e.length; n++) t = (t << 5) - t + e.charCodeAt(n), t |= 0;
return Math.abs(t);
}
resizeImage(e, t, n, r) {
let i = new Image();
i.crossOrigin = "anonymous", i.onload = () => {
let e = document.createElement("canvas");
e.width = t, e.height = n;
let a = e.getContext("2d");
if (!a) throw Error("Could not get canvas context");
a.drawImage(i, 0, 0, t, n), r(e.toDataURL());
}, i.src = e;
}
toGlDashArrayFromPixels(e, t) {
if (!e) return null;
let [n, r] = e;
if (!Number.isFinite(n) || !Number.isFinite(r) || n < 0 || r < 0) return null;
let i = Math.max(1e-4, t);
return [n / i, r / i];
}
isMapLibreAtLeast(e) {
let t = this._map.version;
if (!t) return !1;
let n = (e) => {
let t = e.match(/(\d+)\.(\d+)\.(\d+)/);
return t ? [
parseInt(t[1], 10),
parseInt(t[2], 10),
parseInt(t[3], 10)
] : null;
}, r = n(t), i = n(e);
if (!r || !i) return !0;
let [a, o, s] = r, [c, l, u] = i;
return a === c ? o === l ? s >= u : o > l : a > c;
}
_addGeoJSONSource(e, t) {
this._map.addSource(e, {
type: "geojson",
data: {
type: "FeatureCollection",
features: t
},
tolerance: 0
});
}
_addFillLayer(e) {
return this._map.addLayer({
id: e,
source: e,
type: "fill",
layout: { "fill-sort-key": ["get", "zIndex"] },
paint: {
"fill-color": ["get", "polygonFillColor"],
"fill-opacity": ["get", "polygonFillOpacity"]
}
});
}
_addFillOutlineLayer(e) {
return this._map.addLayer({
id: e + "-outline",
source: e,
type: "line",
layout: { "line-sort-key": ["get", "zIndex"] },
paint: {
"line-width": ["get", "polygonOutlineWidth"],
"line-color": ["get", "polygonOutlineColor"],
"line-opacity": ["get", "polygonOutlineOpacity"]
}
});
}
_addLineLayer(e) {
let t = {};
return this.isMapLibreAtLeast("5.8.0") && (t["line-dasharray"] = [
"coalesce",
["get", "lineStringDash"],
["literal", [1, 0]]
]), this._map.addLayer({
id: e,
source: e,
type: "line",
layout: { "line-sort-key": ["get", "zIndex"] },
paint: On({}, t, {
"line-width": ["get", "lineStringWidth"],
"line-color": ["get", "lineStringColor"],
"line-opacity": ["get", "lineStringOpacity"]
})
});
}
_addPointLayer(e) {
return this._map.addLayer({
id: e,
source: e,
type: "circle",
layout: { "circle-sort-key": ["get", "zIndex"] },
paint: {
"circle-stroke-color": ["get", "pointOutlineColor"],
"circle-stroke-width": ["get", "pointOutlineWidth"],
"circle-stroke-opacity": ["get", "pointOutlineOpacity"],
"circle-radius": ["get", "pointWidth"],
"circle-color": ["get", "pointColor"],
"circle-opacity": ["get", "pointOpacity"]
}
});
}
_addMarkerLayer(e) {
return this._map.addLayer({
id: e + "-marker",
source: e,
type: "symbol",
filter: ["has", "markerId"],
layout: {
"icon-image": ["image", ["get", "markerId"]],
"icon-anchor": "bottom",
"icon-allow-overlap": !0
}
});
}
_addLayer(e, t) {
t === "Point" && (this._addPointLayer(e), this._addMarkerLayer(e)), t === "LineString" && this._addLineLayer(e), t === "Polygon" && (this._addFillLayer(e), this._addFillOutlineLayer(e));
}
_addGeoJSONLayer(e, t) {
let n = `${this._prefixId}-${e.toLowerCase()}`;
return this._addGeoJSONSource(n, t), this._addLayer(n, e), n;
}
_setGeoJSONLayerData(e, t) {
let n = `${this._prefixId}-${e.toLowerCase()}`;
return this._map.getSource(n).setData({
type: "FeatureCollection",
features: t
}), n;
}
updateChangedIds(e) {
[...e.updated, ...e.created].forEach((e) => {
e.geometry.type === "Point" ? this.changedIds.points = !0 : e.geometry.type === "LineString" ? this.changedIds.linestrings = !0 : e.geometry.type === "Polygon" && (this.changedIds.polygons = !0);
}), e.deletedIds.length > 0 && (this.changedIds.deletion = !0), e.created.length === 0 && e.updated.length === 0 && e.deletedIds.length === 0 && (this.changedIds.styling = !0);
}
getLngLatFromEvent(e) {
let { left: t, top: n } = this._container.getBoundingClientRect();
return this.unproject(e.clientX - t, e.clientY - n);
}
getMapEventElement() {
return this._map.getCanvas();
}
setDraggability(e) {
e ? (this._initialDragRotate && this._map.dragRotate.enable(), this._initialDragPan && this._map.dragPan.enable()) : (this._initialDragRotate && this._map.dragRotate.disable(), this._initialDragPan && this._map.dragPan.disable());
}
project(e, t) {
let { x: n, y: r } = this._map.project({
lng: e,
lat: t
});
return {
x: n,
y: r
};
}
unproject(e, t) {
let { lng: n, lat: r } = this._map.unproject({
x: e,
y: t
});
return {
lng: n,
lat: r
};
}
setCursor(e) {
let t = this._map.getCanvas();
e === "unset" ? t.style.removeProperty("cursor") : t.style.cursor = e;
}
setDoubleClickToZoom(e) {
e ? this._map.doubleClickZoom.enable() : this._map.doubleClickZoom.disable();
}
render(e, t) {
this.updateChangedIds(e), this._nextRender && cancelAnimationFrame(this._nextRender), this._nextRender = requestAnimationFrame(() => {
if (!this._currentModeCallbacks) return;
let n = [
...e.created,
...e.updated,
...e.unchanged
], r = [], i = [], a = [];
for (let e = 0; e < n.length; e++) {
let o = n[e], { properties: s } = o, c = t[s.mode](o);
if (s.zIndex = c.zIndex, s.zIndex = c.zIndex, o.geometry.type === "Point") {
s.pointColor = c.pointColor, s.pointOutlineColor = c.pointOutlineColor, s.pointOutlineWidth = c.pointOutlineWidth;
let e = c.pointOutlineOpacity;
s.pointOutlineOpacity = e === void 0 ? 1 : e, s.pointWidth = c.pointWidth;
let t = c.pointOpacity;
if (s.pointOpacity = t === void 0 ? 1 : t, c.markerUrl && c.markerWidth && c.markerHeight) {
let e = `marker-${this.hashCode(c.markerUrl)}`;
this._map.hasImage(e) || this.resizeImage(c.markerUrl, c.markerWidth, c.markerHeight, (t) => {
this._map.loadImage(t).then((t) => {
this._map.hasImage(e) || this._map.addImage(e, t.data);
});
}), s.markerId = e, s.pointWidth = 0;
}
r.push(o);
} else if (o.geometry.type === "LineString") {
s.lineStringDash = this.toGlDashArrayFromPixels(c.lineStringDash, c.lineStringWidth), s.lineStringColor = c.lineStringColor, s.lineStringWidth = c.lineStringWidth;
let e = c.lineStringOpacity;
s.lineStringOpacity = e === void 0 ? 1 : e, i.push(o);
} else if (o.geometry.type === "Polygon") {
let e = c.polygonOutlineOpacity;
s.polygonFillColor = c.polygonFillColor, s.polygonFillOpacity = c.polygonFillOpacity, s.polygonOutlineOpacity = e === void 0 ? 1 : e, s.polygonOutlineColor = c.polygonOutlineColor, s.polygonOutlineWidth = c.polygonOutlineWidth, a.push(o);
}
}
let o = this.changedIds.deletion || this.changedIds.styling, s = o || this.changedIds.linestrings, c = o || this.changedIds.polygons;
(o || this.changedIds.points) && this._setGeoJSONLayerData("Point", r), s && this._setGeoJSONLayerData("LineString", i), c && this._setGeoJSONLayerData("Polygon", a), this.changedIds = {
points: !1,
linestrings: !1,
polygons: !1,
deletion: !1,
styling: !1
};
});
}
clear() {
this._currentModeCallbacks && (this._currentModeCallbacks.onClear(), this._nextRender &&= (cancelAnimationFrame(this._nextRender), void 0), this._setGeoJSONLayerData("Point", []), this._setGeoJSONLayerData("LineString", []), this._setGeoJSONLayerData("Polygon", []));
}
getCoordinatePrecision() {
return super.getCoordinatePrecision();
}
unregister() {
super.unregister(), this.changedIds = {
points: !1,
linestrings: !1,
polygons: !1,
deletion: !1,
styling: !1
}, this._map.removeLayer(`${this._prefixId}-point`), this._map.removeLayer(`${this._prefixId}-point-marker`), this._map.removeSource(`${this._prefixId}-point`), this._map.removeLayer(`${this._prefixId}-linestring`), this._map.removeSource(`${this._prefixId}-linestring`), this._map.removeLayer(`${this._prefixId}-polygon`), this._map.removeLayer(`${this._prefixId}-polygon-outline`), this._map.removeSource(`${this._prefixId}-polygon`);
}
register(e) {
var t;
super.register(e);
let n = this._addGeoJSONLayer("Polygon", []), r = this._addGeoJSONLayer("LineString", []), i = this._addGeoJSONLayer("Point", []);
var a;
this._renderBeforeLayerId && (this._map.moveLayer(i, this._renderBeforeLayerId), this._map.moveLayer(r, i), this._map.moveLayer(`${n}-outline`, r), this._map.moveLayer(n, `${n}-outline`)), (t = this._currentModeCallbacks) != null && t.onReady && ((a = this._currentModeCallbacks) == null || a.onReady());
}
}, An = [
"render",
"point",
"marker",
"linestring",
"polygon",
"rectangle",
"circle",
"freehand",
"freehand-linestring",
"angled-rectangle",
"sensor",
"sector",
"select",
"delete-selection",
"delete",
"undo",
"redo",
"download"
], jn = [
"render",
"routing",
"time-isochrone",
"distance-isochrone",
"select",
"delete-selection",
"delete",
"download",
"settings"
], Mn = {
modes: [
"render",
"point",
"marker",
"linestring",
"polygon",
"rectangle",
"angled-rectangle",
"sensor",
"sector",
"circle",
"freehand",
"freehand-linestring",
"select",
"delete-selection",
"delete",
"undo",
"redo",
"download"
],
open: !1
}, J = {
kilometer: "km",
meter: "m",
centimeter: "cm",
mile: "mi",
foot: "ft",
inch: "in",
"square meters": "m²",
"square kilometers": "km²",
ares: "a",
hectares: "ha",
"square feet": "ft²",
"square yards": "yd²",
acres: "acres",
"square miles": "mi²"
}, Nn = "data:image/svg+xml,%3c?xml%20version='1.0'%20encoding='UTF-8'%20standalone='no'?%3e%3csvg%20xmlns:dc='http://purl.org/dc/elements/1.1/'%20xmlns:cc='http://creativecommons.org/ns%23'%20xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns%23'%20xmlns:svg='http://www.w3.org/2000/svg'%20xmlns='http://www.w3.org/2000/svg'%20xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd'%20xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape'%20inkscape:version='1.0%20(4035a4fb49,%202020-05-01)'%20sodipodi:docname='poi.svg'%20id='svg4460'%20height='100'%20width='100'%20version='1.1'%3e%3csodipodi:namedview%20inkscape:document-rotation='0'%20inkscape:current-layer='svg4460'%20inkscape:window-maximized='1'%20inkscape:window-y='-8'%20inkscape:window-x='-8'%20inkscape:cy='70.031285'%20inkscape:cx='-78.460726'%20inkscape:zoom='2.02'%20showgrid='false'%20id='namedview11'%20inkscape:window-height='1017'%20inkscape:window-width='1920'%20inkscape:pageshadow='2'%20inkscape:pageopacity='0'%20guidetolerance='10'%20gridtolerance='10'%20objecttolerance='10'%20borderopacity='1'%20bordercolor='%23666666'%20pagecolor='%23ffffff'%20/%3e%3cdefs%20id='defs4462'%20/%3e%3cmetadata%20id='metadata4465'%3e%3crdf:RDF%3e%3ccc:Work%20rdf:about=''%3e%3cdc:format%3eimage/svg+xml%3c/dc:format%3e%3cdc:type%20rdf:resource='http://purl.org/dc/dcmitype/StillImage'%20/%3e%3cdc:title%3e%3c/dc:title%3e%3c/cc:Work%3e%3c/rdf:RDF%3e%3c/metadata%3e%3cpath%20d='M%2050.001528,3.3861402e-7%20C%2030.763177,3.3861402e-7%2015,15.718144%2015,34.901534%20c%200,7.432782%202.373565,14.339962%206.391689,20.019029%20l%2024.338528,42.073163%20c%203.40849,4.452814%205.674917,3.607154%208.509014,-0.23458%20L%2081.083105,51.075788%20C%2081.625418,50.0948%2082.050328,49.050173%2082.421327,47.983517%2084.078241,43.936622%2085.000002,39.521943%2085,34.901534%2085,15.718144%2069.23988,3.3861402e-7%2050.001528,3.3861402e-7%20Z%20m%200,16.35400066138598%20c%2010.359296,0%2018.597616,8.21783%2018.597618,18.547533%200,10.329703%20-8.238322,18.544487%20-18.597618,18.544487%20-10.359299,0%20-18.600672,-8.214784%20-18.600672,-18.544487%200,-10.329703%208.241373,-18.547533%2018.600672,-18.547533%20z'%20style='fill:rgb(95,%2099,%20104);stroke-width:4.26019'%20id='path4135'%20/%3e%3c/svg%3e", Pn = {
url: "https://s3.amazonaws.com/elevation-tiles-prod/terrarium/{z}/{x}/{y}.png",
encoding: "terrarium",
tileSize: 256,
minzoom: 5,
maxzoom: 15,
tms: !1
}, Fn = {
url: "https://tiles.mapterhorn.com/{z}/{x}/{y}.webp",
encoding: "terrarium",
tileSize: 512,
minzoom: 0,
maxzoom: 12,
tms: !1
}, In = {
modes: [
"render",
"point",
"marker",
"linestring",
"polygon",
"rectangle",
"angled-rectangle",
"sensor",
"sector",
"circle",
"freehand",
"freehand-linestring",
"select",
"delete-selection",
"delete",
"undo",
"redo",
"download"
],
open: !1,
modeOptions: {
point: new nt({
editable: !0,
styles: {
pointColor: "#FFFFFF",
pointWidth: 5,
pointOutlineColor: "#666666",
pointOutlineWidth: 1
}
}),
marker: new _n({
editable: !0,
styles: {
markerUrl: Nn,
markerWidth: 27,
markerHeight: 27
}
}),
linestring: new Ye({
editable: !0,
styles: {
lineStringColor: "#666666",
lineStringWidth: 2,
closingPointColor: "#FFFFFF",
closingPointWidth: 3,
closingPointOutlineColor: "#666666",
closingPointOutlineWidth: 1
}
}),
polygon: new at({
editable: !0,
styles: {
fillColor: "#EDEFF0",
fillOpacity: .7,
outlineColor: "#666666",
outlineWidth: 2,
closingPointColor: "#FAFAFA",
closingPointWidth: 3,
closingPointOutlineColor: "#666666",
closingPointOutlineWidth: 1
}
}),
rectangle: new ct({ styles: {
fillColor: "#EDEFF0",
fillOpacity: .7,
outlineColor: "#666666",
outlineWidth: 2
} }),
"angled-rectangle": new nn({ styles: {
fillColor: "#EDEFF0",
fillOpacity: .7,
outlineColor: "#666666",
outlineWidth: 2
} }),
circle: new be({ styles: {
fillColor: "#EDEFF0",
fillOpacity: .7,
outlineColor: "#666666",
outlineWidth: 2
} }),
freehand: new we({ styles: {
fillColor: "#EDEFF0",
fillOpacity: .7,
outlineColor: "#666666",
outlineWidth: 2,
closingPointColor: "#FAFAFA",
closingPointWidth: 3,
closingPointOutlineColor: "#666666",
closingPointOutlineWidth: 1
} }),
"freehand-linestring": new mn({ styles: {
lineStringColor: "#666666",
lineStringWidth: 2,
closingPointColor: "#FFFFFF",
closingPointWidth: 3,
closingPointOutlineColor: "#666666",
closingPointOutlineWidth: 1
} }),
sensor: new un({ styles: {
fillColor: "#EDEFF0",
fillOpacity: .7,
outlineColor: "#666666",
outlineWidth: 2,
centerPointColor: "#FAFAFA",
centerPointWidth: 3,
centerPointOutlineColor: "#666666",
centerPointOutlineWidth: 1
} }),
sector: new sn({ styles: {
fillColor: "#EDEFF0",
fillOpacity: .7,
outlineColor: "#666666",
outlineWidth: 2
} }),
select: new At({ flags: {
point: { feature: { draggable: !1 } },
marker: { feature: { draggable: !1 } },
polygon: { feature: {
draggable: !0,
rotateable: !0,
scaleable: !0,
coordinates: {
midpoints: !0,
draggable: !0,
deletable: !0
}
} },
linestring: { feature: {
draggable: !0,
rotateable: !0,
scaleable: !0,
coordinates: {
midpoints: !0,
draggable: !0,
deletable: !0
}
} },
freehand: { feature: {
draggable: !0,
coordinates: {
midpoints: !0,
draggable: !0,
deletable: !0
}
} },
"freehand-linestring": { feature: {
draggable: !0,
rotateable: !0,
scaleable: !0,
coordinates: {
midpoints: !0,
draggable: !0,
deletable: !0
}
} },
circle: { feature: {
draggable: !0,
coordinates: {
resizable: "center",
deletable: !1,
midpoints: !1
}
} },
rectangle: { feature: {
draggable: !0,
rotateable: !0,
coordinates: {
resizable: "opposite",
deletable: !1,
midpoints: !1
}
} },
"angled-rectangle": { feature: {
draggable: !0,
rotateable: !0,
coordinates: {
resizable: "opposite",
deletable: !1,
midpoints: !1
}
} },
sensor: { feature: {
draggable: !0,
rotateable: !0,
scaleable: !0,
coordinates: {
midpoints: !0,
draggable: !0,
deletable: !0
}
} },
sector: { feature: {
draggable: !0,
rotateable: !0,
scaleable: !0,
coordinates: {
midpoints: !0,
draggable: !0,
deletable: !0
}
} }
} })
},
pointLayerLabelSpec: {
id: "{prefix}-point-label",
type: "symbol",
source: "{prefix}-point",
filter: [
"all",
[
"==",
"$type",
"Point"
],
[
"any",
[
"==",
"mode",
"point"
],
[
"==",
"mode",
"marker"
]
]
],
layout: {
"text-field": [
"case",
[
"all",
["has", "elevation"],
[
">",
["get", "elevation"],
0
]
],
[
"concat",
"Alt. ",
["to-string", ["floor", ["get", "elevation"]]],
" ",
["get", "elevationUnit"]
],
""
],
"symbol-placement": "point",
"text-size": [
"interpolate",
["linear"],
["zoom"],
5,
10,
10,
12,
13,
14,
14,
16,
18,
18
],
"text-overlap": "always",
"text-variable-anchor": [
"left",
"right",
"top",
"bottom"
],
"text-radial-offset": .5,
"text-justify": "center",
"text-letter-spacing": .05
},
paint: {
"text-halo-color": "#F7F7F7",
"text-halo-width": 2,
"text-color": "#232E3D"
}
},
lineLayerLabelSpec: {
id: "{prefix}-line-label",
type: "symbol",
source: "{prefix}-line-source",
filter: [
"==",
"$type",
"Point"
],
layout: {
"text-field": [
"concat",
["to-string", ["get", "distance"]],
" ",
["get", "unit"],
[
"case",
[
"==",
["get", "total"],
0
],
"",
[
"concat",
"\n(",
["to-string", ["get", "total"]],
" ",
["get", "totalUnit"],
")"
]
],
[
"case",
[
"all",
["has", "elevation"],
[
">",
["get", "elevation"],
0
]
],
[
"concat",
"\nAlt. ",
["to-string", ["floor", ["get", "elevation"]]],
" ",
["get", "elevationUnit"]
],
""
]
],
"symbol-placement": "point",
"text-size": [
"interpolate",
["linear"],
["zoom"],
5,
10,
10,
12,
13,
14,
14,
16,
18,
18
],
"text-overlap": "always",
"text-variable-anchor": [
"left",
"right",
"top",
"bottom"
],
"text-radial-offset": .5,
"text-justify": "center",
"text-letter-spacing": .05
},
paint: {
"text-halo-color": "#F7F7F7",
"text-halo-width": 2,
"text-color": "#232E3D"
}
},
routingLineLayerNodeSpec: {
id: "{prefix}-line-node",
type: "circle",
source: "{prefix}-line-source",
filter: [
"==",
"$type",
"Point"
],
layout: {},
paint: {
"circle-radius": 3,
"circle-color": "#FFFFFF",
"circle-stroke-color": "#000000",
"circle-stroke-width": 1
}
},
polygonLayerSpec: {
id: "{prefix}-polygon-label",
type: "symbol",
source: "{prefix}-polygon-source",
filter: [
"==",
"$type",
"Point"
],
layout: {
"text-field": [
"concat",
["to-string", ["get", "area"]],
" ",
["get", "unit"]
],
"symbol-placement": "point",
"text-size": [
"interpolate",
["linear"],
["zoom"],
5,
10,
10,
12,
13,
14,
14,
16,
18,
18
],
"text-overlap": "always",
"text-letter-spacing": .05
},
paint: {
"text-halo-color": "#F7F7F7",
"text-halo-width": 2,
"text-color": "#232E3D"
}
},
computeElevation: !1,
terrainSource: Fn,
measureUnitType: "metric",
distancePrecision: 2,
distanceUnit: void 0,
areaPrecision: 2,
areaUnit: void 0,
measureUnitSymbols: JSON.parse(JSON.stringify(J)),
elevationCacheConfig: {
enabled: !0,
maxSize: 1e3,
ttl: 3600 * 1e3,
precision: 9
},
adapterOptions: { prefixId: "td-measure" }
}, Y = {
modes: [
"render",
"routing",
"time-isochrone",
"distance-isochrone",
"select",
"delete-selection",
"delete",
"download",
"settings"
],
open: !1,
modeOptions: {
"time-isochrone": new nt({
modeName: "time-isochrone",
editable: !1,
styles: {
pointColor: "#FFFFFF",
pointWidth: 5,
pointOutlineColor: "#666666",
pointOutlineWidth: 1
}
}),
"distance-isochrone": new nt({
modeName: "distance-isochrone",
editable: !1,
styles: {
pointColor: "#FFFFFF",
pointWidth: 5,
pointOutlineColor: "#666666",
pointOutlineWidth: 1
}
}),
routing: new Ye({
modeName: "routing",
editable: !1,
styles: {
lineStringColor: "#FF0000",
lineStringWidth: 2,
closingPointColor: "#FF0000",
closingPointWidth: 3,
closingPointOutlineColor: "#666666",
closingPointOutlineWidth: 1
}
}),
select: new At({ flags: {
"time-isochrone": { feature: { draggable: !1 } },
"distance-isochrone": { feature: { draggable: !1 } },
routing: { feature: {
draggable: !1,
rotateable: !1,
scaleable: !1,
coordinates: {
midpoints: !1,
draggable: !1,
deletable: !1
}
} }
} }),
settings: new B({
modeName: "settings",
styles: {}
})
},
valhallaOptions: {
url: "",
routingOptions: {
costingModel: "auto",
distanceUnit: "kilometers"
},
isochroneOptions: {
timeCostingModel: "auto",
distanceCostingModel: "auto",
contours: [
{
time: 3,
distance: 1,
color: "#ff0000"
},
{
time: 5,
distance: 2,
color: "#ffff00"
},
{
time: 10,
distance: 3,
color: "#0000ff"
},
{
time: 15,
distance: 4,
color: "#ff00ff"
}
]
}
},
adapterOptions: { prefixId: "td-valhalla" },
routingLineLayerNodeLabelSpec: {
id: "{prefix}-routing-node-label",
type: "symbol",
source: "{prefix}-routing-source",
filter: [
"==",
"$type",
"Point"
],
layout: {
"text-field": [
"case",
[
"all",
["has", "distance"],
["has", "distance_unit"],
["has", "time"]
],
[
"concat",
["to-string", ["get", "text"]],
"\n",
["to-string", [
"/",
["round", [
"*",
["get", "distance"],
10
]],
10
]],
["to-string", ["get", "distance_unit"]],
"\n",
["to-string", ["get", "time"]],
"min"
],
["all", ["has", "costingModel"]],
[
"concat",
["to-string", ["get", "text"]],
"\n(",
["to-string", ["get", "costingModel"]],
")"
],
["concat", ["to-string", ["get", "text"]]]
],
"symbol-placement": "point",
"text-size": [
"interpolate",
["linear"],
["zoom"],
5,
10,
10,
12,
13,
14,
14,
16,
18,
18
],
"text-overlap": "always",
"text-variable-anchor": [
"left",
"right",
"top",
"bottom"
],
"text-radial-offset": .5,
"text-justify": "left",
"text-letter-spacing": .05
},
paint: {
"text-halo-color": "#F7F7F7",
"text-halo-width": 2,
"text-color": "#232E3D"
}
},
routingLineLayerNodeSpec: {
id: "{prefix}-routing-node",
type: "circle",
source: "{prefix}-routing-source",
filter: [
"==",
"$type",
"Point"
],
layout: {},
paint: {
"circle-radius": 3,
"circle-color": [
"case",
[
"==",
["get", "text"],
"Start"
],
"#0000FF",
[
"==",
["get", "text"],
"Goal"
],
"#FFFF00",
"#FFFFFF"
],
"circle-stroke-color": "#000000",
"circle-stroke-width": 1
}
},
timeIsochronePolygonLayerSpec: {
id: "{prefix}-time-isochrone-polygon",
type: "fill",
source: "{prefix}-time-isochrone-source",
layout: {},
paint: {
"fill-color": ["get", "fillColor"],
"fill-opacity": ["get", "fillOpacity"]
}
},
timeIsochroneLineLayerSpec: {
id: "{prefix}-time-isochrone-line",
type: "line",
source: "{prefix}-time-isochrone-source",
layout: {
"line-join": "round",
"line-cap": "round"
},
paint: {
"line-color": ["get", "fillColor"],
"line-width": 3
}
},
timeIsochroneLabelLayerSpec: {
id: "{prefix}-time-isochrone-label",
type: "symbol",
source: "{prefix}-time-isochrone-source",
layout: {
"symbol-placement": "line",
"text-pitch-alignment": "viewport",
"text-field": [
"concat",
["get", "contour"],
" ",
"min"
],
"text-size": 12,
"symbol-spacing": 100,
"text-max-angle": 45
},
paint: {
"text-color": "rgb(0, 0, 0)",
"text-halo-width": 1,
"text-halo-color": "rgb(255, 255, 255)"
}
},
distanceIsochronePolygonLayerSpec: {
id: "{prefix}-distance-isochrone-polygon",
type: "fill",
source: "{prefix}-distance-isochrone-source",
layout: {},
paint: {
"fill-color": ["get", "fillColor"],
"fill-opacity": ["get", "fillOpacity"]
}
},
distanceIsochroneLineLayerSpec: {
id: "{prefix}-distance-isochrone-line",
type: "line",
source: "{prefix}-distance-isochrone-source",
layout: {
"line-join": "round",
"line-cap": "round"
},
paint: {
"line-color": ["get", "fillColor"],
"line-width": 3
}
},
distanceIsochroneLabelLayerSpec: {
id: "{prefix}-distance-isochrone-label",
type: "symbol",
source: "{prefix}-distance-isochrone-source",
layout: {
"symbol-placement": "line",
"text-pitch-alignment": "viewport",
"text-field": [
"concat",
["get", "contour"],
" ",
"km"
],
"text-size": 12,
"symbol-spacing": 100,
"text-max-angle": 45
},
paint: {
"text-color": "rgb(0, 0, 0)",
"text-halo-width": 1,
"text-halo-color": "rgb(255, 255, 255)"
}
}
}, Ln = "data:image/svg+xml,%3c?xml%20version='1.0'%20encoding='UTF-8'%20standalone='no'?%3e%3csvg%20xmlns:dc='http://purl.org/dc/elements/1.1/'%20xmlns:cc='http://creativecommons.org/ns%23'%20xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns%23'%20xmlns:svg='http://www.w3.org/2000/svg'%20xmlns='http://www.w3.org/2000/svg'%20xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd'%20xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape'%20inkscape:version='1.0%20(4035a4fb49,%202020-05-01)'%20sodipodi:docname='poi.svg'%20id='svg4460'%20height='100'%20width='100'%20version='1.1'%3e%3csodipodi:namedview%20inkscape:document-rotation='0'%20inkscape:current-layer='svg4460'%20inkscape:window-maximized='1'%20inkscape:window-y='-8'%20inkscape:window-x='-8'%20inkscape:cy='70.031285'%20inkscape:cx='-78.460726'%20inkscape:zoom='2.02'%20showgrid='false'%20id='namedview11'%20inkscape:window-height='1017'%20inkscape:window-width='1920'%20inkscape:pageshadow='2'%20inkscape:pageopacity='0'%20guidetolerance='10'%20gridtolerance='10'%20objecttolerance='10'%20borderopacity='1'%20bordercolor='%23666666'%20pagecolor='%23ffffff'%20/%3e%3cdefs%20id='defs4462'%20/%3e%3cmetadata%20id='metadata4465'%3e%3crdf:RDF%3e%3ccc:Work%20rdf:about=''%3e%3cdc:format%3eimage/svg+xml%3c/dc:format%3e%3cdc:type%20rdf:resource='http://purl.org/dc/dcmitype/StillImage'%20/%3e%3cdc:title%3e%3c/dc:title%3e%3c/cc:Work%3e%3c/rdf:RDF%3e%3c/metadata%3e%3cpath%20d='M%2050.001528,3.3861402e-7%20C%2030.763177,3.3861402e-7%2015,15.718144%2015,34.901534%20c%200,7.432782%202.373565,14.339962%206.391689,20.019029%20l%2024.338528,42.073163%20c%203.40849,4.452814%205.674917,3.607154%208.509014,-0.23458%20L%2081.083105,51.075788%20C%2081.625418,50.0948%2082.050328,49.050173%2082.421327,47.983517%2084.078241,43.936622%2085.000002,39.521943%2085,34.901534%2085,15.718144%2069.23988,3.3861402e-7%2050.001528,3.3861402e-7%20Z%20m%200,16.35400066138598%20c%2010.359296,0%2018.597616,8.21783%2018.597618,18.547533%200,10.329703%20-8.238322,18.544487%20-18.597618,18.544487%20-10.359299,0%20-18.600672,-8.214784%20-18.600672,-18.544487%200,-10.329703%208.241373,-18.547533%2018.600672,-18.547533%20z'%20style='fill:%233FB1CE;stroke-width:4.26019'%20id='path4135'%20/%3e%3c/svg%3e", Rn = (e, t) => {
let n = t.updateType;
return n === "finish" || n === "commit" ? Qt(e) : { valid: !0 };
}, zn = () => ({
render: new B({
modeName: "render",
styles: {}
}),
point: new nt({ editable: !0 }),
marker: new _n({
editable: !0,
styles: {
markerUrl: Ln,
markerWidth: 27,
markerHeight: 27
}
}),
linestring: new Ye({ editable: !0 }),
polygon: new at({
editable: !0,
validation: Rn
}),
rectangle: new ct(),
"angled-rectangle": new nn(),
circle: new be(),
freehand: new we(),
"freehand-linestring": new mn(),
sensor: new un(),
sector: new sn(),
select: new At({ flags: {
point: { feature: { draggable: !0 } },
marker: { feature: { draggable: !0 } },
polygon: { feature: {
draggable: !0,
rotateable: !0,
scaleable: !0,
coordinates: {
midpoints: !0,
draggable: !0,
deletable: !0
}
} },
linestring: { feature: {
draggable: !0,
rotateable: !0,
scaleable: !0,
coordinates: {
midpoints: !0,
draggable: !0,
deletable: !0
}
} },
freehand: { feature: {
draggable: !0,
coordinates: {
midpoints: !0,
draggable: !0,
deletable: !0
}
} },
"freehand-linestring": { feature: {
draggable: !0,
rotateable: !0,
scaleable: !0,
coordinates: {
midpoints: !0,
draggable: !0,
deletable: !0
}
} },
circle: { feature: {
draggable: !0,
coordinates: {
resizable: "center",
deletable: !1,
midpoints: !1
}
} },
rectangle: { feature: {
draggable: !0,
rotateable: !0,
coordinates: {
resizable: "opposite",
deletable: !1,
midpoints: !1
}
} },
"angled-rectangle": { feature: {
draggable: !0,
rotateable: !0,
coordinates: {
resizable: "opposite",
deletable: !1,
midpoints: !1
}
} },
sensor: { feature: {
draggable: !0,
rotateable: !0,
scaleable: !0,
coordinates: {
midpoints: !0,
draggable: !0,
deletable: !0
}
} },
sector: { feature: {
draggable: !0,
rotateable: !0,
scaleable: !0,
coordinates: {
midpoints: !0,
draggable: !0,
deletable: !0
}
} }
} }),
delete: new B({
modeName: "delete",
styles: {}
}),
"delete-selection": new B({
modeName: "delete-selection",
styles: {}
}),
download: new B({
modeName: "download",
styles: {}
}),
undo: new B({
modeName: "undo",
styles: {}
}),
redo: new B({
modeName: "redo",
styles: {}
})
}), X = 6371008.8, Bn = {
centimeters: X * 100,
centimetres: X * 100,
degrees: 360 / (2 * Math.PI),
feet: X * 3.28084,
inches: X * 39.37,
kilometers: X / 1e3,
kilometres: X / 1e3,
meters: X,
metres: X,
miles: X / 1609.344,
millimeters: X * 1e3,
millimetres: X * 1e3,
nauticalmiles: X / 1852,
radians: 1,
yards: X * 1.0936
};
function Vn(e, t, n = {}) {
let r = { type: "Feature" };
return (n.id === 0 || n.id) && (r.id = n.id), n.bbox && (r.bbox = n.bbox), r.properties = t || {}, r.geometry = e, r;
}
function Hn(e, t, n = {}) {
if (!e) throw Error("coordinates is required");
if (!Array.isArray(e)) throw Error("coordinates must be an Array");
if (e.length < 2) throw Error("coordinates must be at least 2 numbers long");
if (!Gn(e[0]) || !Gn(e[1])) throw Error("coordinates must contain numbers");
return Vn({
type: "Point",
coordinates: e
}, t, n);
}
function Un(e, t = "kilometers") {
let n = Bn[t];
if (!n) throw Error(t + " units is invalid");
return e * n;
}
function Wn(e) {
return e % 360 * Math.PI / 180;
}
function Gn(e) {
return !isNaN(e) && e !== null && !Array.isArray(e);
}
//#endregion
//#region node_modules/.pnpm/@turf+meta@7.3.5/node_modules/@turf/meta/dist/esm/index.js
function Kn(e, t, n) {
if (e !== null) for (var r, i, a, o, s, c, l, u = 0, d = 0, f, p = e.type, m = p === "FeatureCollection", h = p === "Feature", g = m ? e.features.length : 1, _ = 0; _ < g; _++) {
l = m ? e.features[_].geometry : h ? e.geometry : e, f = l ? l.type === "GeometryCollection" : !1, s = f ? l.geometries.length : 1;
for (var v = 0; v < s; v++) {
var y = 0, b = 0;
if (o = f ? l.geometries[v] : l, o !== null) {
c = o.coordinates;
var x = o.type;
switch (u = n && (x === "Polygon" || x === "MultiPolygon") ? 1 : 0, x) {
case null: break;
case "Point":
if (t(c, d, _, y, b) === !1) return !1;
d++, y++;
break;
case "LineString":
case "MultiPoint":
for (r = 0; r < c.length; r++) {
if (t(c[r], d, _, y, b) === !1) return !1;
d++, x === "MultiPoint" && y++;
}
x === "LineString" && y++;
break;
case "Polygon":
case "MultiLineString":
for (r = 0; r < c.length; r++) {
for (i = 0; i < c[r].length - u; i++) {
if (t(c[r][i], d, _, y, b) === !1) return !1;
d++;
}
x === "MultiLineString" && y++, x === "Polygon" && b++;
}
x === "Polygon" && y++;
break;
case "MultiPolygon":
for (r = 0; r < c.length; r++) {
for (b = 0, i = 0; i < c[r].length; i++) {
for (a = 0; a < c[r][i].length - u; a++) {
if (t(c[r][i][a], d, _, y, b) === !1) return !1;
d++;
}
b++;
}
y++;
}
break;
case "GeometryCollection":
for (r = 0; r < o.geometries.length; r++) if (Kn(o.geometries[r], t, n) === !1) return !1;
break;
default: throw Error("Unknown Geometry Type");
}
}
}
}
}
function qn(e, t) {
var n, r, i, a, o, s, c, l, u, d, f = 0, p = e.type === "FeatureCollection", m = e.type === "Feature", h = p ? e.features.length : 1;
for (n = 0; n < h; n++) {
for (s = p ? e.features[n].geometry : m ? e.geometry : e, l = p ? e.features[n].properties : m ? e.properties : {}, u = p ? e.features[n].bbox : m ? e.bbox : void 0, d = p ? e.features[n].id : m ? e.id : void 0, c = s ? s.type === "GeometryCollection" : !1, o = c ? s.geometries.length : 1, i = 0; i < o; i++) {
if (a = c ? s.geometries[i] : s, a === null) {
if (t(null, f, l, u, d) === !1) return !1;
continue;
}
switch (a.type) {
case "Point":
case "LineString":
case "MultiPoint":
case "Polygon":
case "MultiLineString":
case "MultiPolygon":
if (t(a, f, l, u, d) === !1) return !1;
break;
case "GeometryCollection":
for (r = 0; r < a.geometries.length; r++) if (t(a.geometries[r], f, l, u, d) === !1) return !1;
break;
default: throw Error("Unknown Geometry Type");
}
}
f++;
}
}
function Jn(e, t, n) {
var r = n;
return qn(e, function(e, i, a, o, s) {
r = i === 0 && n === void 0 ? e : t(r, e, i, a, o, s);
}), r;
}
//#endregion
//#region node_modules/.pnpm/@turf+area@7.3.5/node_modules/@turf/area/dist/esm/index.js
function Yn(e) {
return Jn(e, (e, t) => e + Xn(t), 0);
}
function Xn(e) {
let t = 0, n;
switch (e.type) {
case "Polygon": return Zn(e.coordinates);
case "MultiPolygon":
for (n = 0; n < e.coordinates.length; n++) t += Zn(e.coordinates[n]);
return t;
case "Point":
case "MultiPoint":
case "LineString":
case "MultiLineString": return 0;
}
return 0;
}
function Zn(e) {
let t = 0;
if (e && e.length > 0) {
t += Math.abs(er(e[0]));
for (let n = 1; n < e.length; n++) t -= Math.abs(er(e[n]));
}
return t;
}
var Qn = X * X / 2, $n = Math.PI / 180;
function er(e) {
let t = e.length - 1;
if (t <= 2) return 0;
let n = 0, r = 0;
for (; r < t;) {
let i = e[r], a = e[r + 1 === t ? 0 : r + 1], o = e[r + 2 >= t ? (r + 2) % t : r + 2], s = i[0] * $n, c = a[1] * $n, l = o[0] * $n;
n += (l - s) * Math.sin(c), r++;
}
return n * Qn;
}
var tr = Yn, nr = (e, t, n = void 0, r = J) => {
let i = [
"square meters",
"square kilometers",
"ares",
"hectares"
], a = [
"square feet",
"square yards",
"acres",
"square miles"
];
if (n && typeof n != "function") {
let t = i.includes(n), o = a.includes(n);
if (t) return ir(e, n, r);
if (o) return ar(e, n, r);
}
return n && typeof n == "function" ? n(e) : rr(e, t, r);
}, rr = (e, t, n) => t === "metric" ? e >= 1e6 ? ir(e, "square kilometers", n) : e >= 1e4 ? ir(e, "hectares", n) : e >= 100 ? ir(e, "ares", n) : ir(e, "square meters", n) : e >= 2589988.11 ? ar(e, "square miles", n) : e >= 4046.856 ? ar(e, "acres", n) : e >= .83612736 ? ar(e, "square yards", n) : ar(e, "square feet", n), ir = (e, t, n) => {
let r = e, i = n["square meters"];
switch (t) {
case "square meters":
r = e, i = n["square meters"];
break;
case "ares":
r = e / 100, i = n.ares;
break;
case "hectares":
r = e / 1e4, i = n.hectares;
break;
case "square kilometers":
r = e / 1e6, i = n["square kilometers"];
break;
}
return {
area: r,
unit: i
};
}, ar = (e, t, n) => {
let r = e / 2589988.11, i = n["square meters"];
switch (t) {
case "square feet":
r = e / .09290304, i = n["square feet"];
break;
case "square yards":
r = e / .83612736, i = n["square yards"];
break;
case "acres":
r = e / 4046.856, i = n.acres;
break;
case "square miles":
r = e / 2589988.11, i = n["square miles"];
break;
}
return {
area: r,
unit: i
};
}, or = (e, t, n, r, i) => {
if (e.geometry.type !== "Polygon") return e;
let a = nr(tr(e.geometry), t, r, i);
return a.area = parseFloat(a.area.toFixed(n)), e.properties.area = a.area, e.properties.unit = a.unit, e;
};
//#endregion
//#region node_modules/.pnpm/@turf+invariant@7.3.5/node_modules/@turf/invariant/dist/esm/index.js
function sr(e) {
if (!e) throw Error("coord is required");
if (!Array.isArray(e)) {
if (e.type === "Feature" && e.geometry !== null && e.geometry.type === "Point") return [...e.geometry.coordinates];
if (e.type === "Point") return [...e.coordinates];
}
if (Array.isArray(e) && e.length >= 2 && !Array.isArray(e[0]) && !Array.isArray(e[1])) return [...e];
throw Error("coord must be GeoJSON Point or an Array of numbers");
}
//#endregion
//#region node_modules/.pnpm/@turf+distance@7.3.5/node_modules/@turf/distance/dist/esm/index.js
function cr(e, t, n = {}) {
var r = sr(e), i = sr(t), a = Wn(i[1] - r[1]), o = Wn(i[0] - r[0]), s = Wn(r[1]), c = Wn(i[1]), l = Math.sin(a / 2) ** 2 + Math.sin(o / 2) ** 2 * Math.cos(s) * Math.cos(c);
return Un(2 * Math.atan2(Math.sqrt(l), Math.sqrt(1 - l)), n.units);
}
var lr = cr, ur = (e, t = "metric", n = void 0, r = J) => {
let i = [
"centimeter",
"meter",
"kilometer"
], a = [
"inch",
"foot",
"mile"
], o = {
distance: e,
unit: r.meter
};
if (n && typeof n != "function") {
let t = i.includes(n), s = a.includes(n);
t ? o = fr(e, n, r) : s && (o = pr(e, n, r));
} else o = n && typeof n == "function" ? n(e) : dr(e, t, r);
return o;
}, dr = (e, t, n) => {
let r = {
distance: e,
unit: n.meter
};
if (t === "metric") r = e >= 1e3 ? fr(e, "kilometer", n) : e >= 1 ? fr(e, "meter", n) : fr(e, "centimeter", n);
else if (t === "imperial") {
let t = Math.round(e * 3.28084 * 10) / 10;
r = t >= 5280 ? pr(e, "mile", n) : t >= 1 ? pr(e, "foot", n) : pr(e, "inch", n);
}
return r;
}, fr = (e, t, n) => {
let r = {
distance: e,
unit: n.meter
};
switch (t) {
case "meter":
r.distance = e, r.unit = n[t];
break;
case "centimeter":
r.distance = e * 100, r.unit = n[t];
break;
case "kilometer":
r.distance = e / 1e3, r.unit = n[t];
break;
default:
r.distance = e, r.unit = n.meter;
break;
}
return r;
}, pr = (e, t, n) => {
let r = Math.round(e * 3.28084 * 10) / 10, i = {
distance: r / 5280,
unit: n.mile
};
switch (t) {
case "foot":
i.distance = r, i.unit = n[t];
break;
case "inch":
i.distance = r * 12, i.unit = n[t];
break;
default:
i.distance = r / 5280, i.unit = n.mile;
break;
}
return i;
}, mr = (e, t, n, r, i, a, o, s) => {
if (e.geometry.type !== "LineString") return e;
let c = e.geometry.coordinates, l = 0, u = [];
for (let t = 0; t < c.length - 1; t++) {
let n = c[t], r = c[t + 1], i = lr(n, r, { units: "meters" });
l += i;
let d = JSON.parse(JSON.stringify(e));
if (d.id = `${d.id}-${t}`, d.geometry.coordinates = [n, r], d.properties.originalId = e.id, d.properties.distance = i, d.properties.total = l, o === !0 && s === void 0) {
let e = a?.queryTerrainElevation(n);
e && (d.properties.elevation_start = e);
let t = a?.queryTerrainElevation(r);
t && (d.properties.elevation_end = t);
}
u.push(d);
}
e.properties.distance = u[u.length - 1].properties.total, e.properties.segments = u;
let d = ur(e.properties.distance, t, r, i);
return e.properties.distance = d.distance, e.properties.unit = d.unit, e.properties.segments.forEach((e) => {
let n = ur(e.properties.distance, t, r, i);
e.properties.distance = n.distance, e.properties.unit = n.unit;
let a = ur(e.properties.total, t, r, i);
e.properties.total = a.distance, e.properties.totalUnit = a.unit;
}), e.properties.distance = parseFloat(e.properties.distance.toFixed(n)), e.properties.segments.forEach((e) => {
e.properties.distance = parseFloat(e.properties.distance.toFixed(n)), e.properties.total = parseFloat(e.properties.total.toFixed(n));
}), e;
}, Z = (e, t = "metric", n = J) => t === "imperial" ? {
elevation: e * 3.28084,
unit: n.foot
} : {
elevation: e,
unit: n.meter
}, hr = (e) => e.charAt(0).toUpperCase() + e.slice(1), Q = [
"{prefix}-point",
"{prefix}-point-lower",
"{prefix}-linestring",
"{prefix}-polygon",
"{prefix}-polygon-outline"
], gr = [
...Q,
In.polygonLayerSpec?.source,
In.lineLayerLabelSpec?.source
], _r = [
...Q,
Y.routingLineLayerNodeLabelSpec?.source,
Y.routingLineLayerNodeSpec?.source,
Y.timeIsochronePolygonLayerSpec?.source,
Y.timeIsochroneLineLayerSpec?.source,
Y.timeIsochroneLabelLayerSpec?.source,
Y.distanceIsochronePolygonLayerSpec?.source,
Y.distanceIsochroneLineLayerSpec?.source,
Y.distanceIsochroneLabelLayerSpec?.source
], vr = (e, t, n = Q, r = "td") => {
n = n.map((e) => e.replace("{prefix}", r));
let i = JSON.parse(JSON.stringify(e));
return t && (t.onlyTerraDrawLayers === !0 ? (i.layers = i.layers.filter((e) => "source" in e && n.includes(e.source)), Object.keys(i.sources).forEach((e) => {
n.includes(e) || delete i.sources[e];
})) : t.excludeTerraDrawLayers === !0 && (i.layers = i.layers.filter((e) => "source" in e && !n.includes(e.source) || e.type === "background"), Object.keys(i.sources).forEach((e) => {
n.includes(e) && delete i.sources[e];
}))), i;
}, yr = (e, t = 250) => {
let n;
return (...r) => {
clearTimeout(n), n = setTimeout(() => e(...r), t);
};
}, br = class {
cache = /* @__PURE__ */ new Map();
maxSize;
ttl;
constructor(e = 1e3, t) {
this.maxSize = e, this.ttl = t;
}
get(e) {
let t = this.cache.get(e);
if (t) {
if (t.expiry && Date.now() > t.expiry) {
this.cache.delete(e);
return;
}
return t.value;
}
}
set(e, t) {
if (this.maxSize === 0) return;
if (this.cache.size >= this.maxSize) {
let e = this.cache.keys().next().value;
e && this.cache.delete(e);
}
let n = this.ttl ? Date.now() + this.ttl : void 0;
this.cache.set(e, {
value: t,
expiry: n
});
}
has(e) {
return this.get(e) !== void 0;
}
delete(e) {
return this.cache.delete(e);
}
clear() {
this.cache.clear();
}
get size() {
return this.cache.size;
}
cleanupExpired() {
if (!this.ttl) return;
let e = Date.now();
for (let [t, n] of this.cache.entries()) n.expiry && e > n.expiry && this.cache.delete(t);
}
getStats() {
return {
size: this.size,
maxSize: this.maxSize,
ttl: this.ttl
};
}
}, xr = class {
className;
dialog;
title;
constructor(e, t) {
this.className = e, this.title = t;
}
create(e, t) {
let n = document.getElementsByClassName(this.className);
n.length > 0 && Array.from(n).forEach((e) => {
e.remove();
}), this.dialog = document.createElement("dialog"), this.dialog.classList.add(this.className);
let r = document.createElement("div");
r.classList.add("dialog-header");
let i = document.createElement("h3");
i.textContent = this.title, i.classList.add("dialog-title"), r.appendChild(i);
let a = document.createElement("button");
a.type = "button", a.classList.add("close-button"), a.innerHTML = "×", a.setAttribute("aria-label", "Close dialog"), a.addEventListener("click", () => {
this.close();
}), r.appendChild(a), this.dialog.appendChild(r);
let o = document.createElement("div");
o.classList.add("content"), this.dialog.appendChild(t(o)), this.dialog.addEventListener("click", (e) => {
let t = e.target?.getBoundingClientRect();
t && (t.left > e.clientX || t.right < e.clientX || t.top > e.clientY || t.bottom < e.clientY) && this.close();
}), e.appendChild(this.dialog);
}
open() {
this.dialog?.showModal();
}
close() {
this.dialog?.close();
}
createSegmentButtons(e, t, n = () => {}) {
let r = document.createElement("div");
return r.classList.add("segment-buttons"), e.forEach((e) => {
let i = document.createElement("button");
i.type = "button", i.classList.add("segment-button"), i.value = e.value, i.textContent = e.label, e.value === t && i.classList.add("active"), i.addEventListener("click", () => {
r.querySelectorAll(".segment-button").forEach((e) => e.classList.remove("active")), i.classList.add("active"), n(i.value);
}), r.appendChild(i);
}), r;
}
}, Sr = (e, t, n, r, i = "metric", a = J) => {
if (e.geometry.type !== "Point") return e;
let o = e.geometry.coordinates;
if (n === !0) {
if (r === void 0) {
let n = t?.queryTerrainElevation(o);
if (n) {
let { elevation: t, unit: r } = Z(n, i, a);
e.properties.elevation = t, e.properties.elevationUnit = r;
}
} else if (e.properties.elevation !== void 0 && typeof e.properties.elevation == "number") {
let t = e.properties.elevation, n = e.properties.elevationUnit;
(n === "ft" || n === "foot") && (t /= 3.28084);
let { elevation: r, unit: o } = Z(t, i, a);
e.properties.elevation = r, e.properties.elevationUnit = o;
}
}
return e;
}, Cr = Object.defineProperty, wr = (e, t, n) => t in e ? Cr(e, t, {
enumerable: !0,
configurable: !0,
writable: !0,
value: n
}) : e[t] = n, $ = (e, t, n) => wr(e, typeof t == "symbol" ? t : t + "", n), Tr = 2 * Math.PI * 6378137 / 2;
function Er(e) {
return e ||= 256, 2 * Math.PI * 6378137 / e;
}
function Dr(e, t, n = {
enable: !0,
decimal: 1
}) {
e = Ir(e);
var r = e[0], i = e[1], a = r * Tr / 180, o = Math.log(Math.tan((90 + i) * Math.PI / 360)) / (Math.PI / 180);
return o = o * Tr / 180, n.enable && (a = Number(a.toFixed(n.decimal)), o = Number(o.toFixed(n.decimal))), [a, o];
}
function Or(e, t, n) {
var r = e[0], i = e[1], a = Lr(t, n);
return [
(r + Tr) / a,
(i + Tr) / a,
t
];
}
function kr(e, t, n) {
return e = Ir(e), jr(Or(Dr(e), t));
}
function Ar(e, t, n) {
return e = Ir(e), t === 0 ? [
0,
0,
0
] : Mr(kr(e, t));
}
function jr(e, t, n) {
t ||= 256;
var r = e[0], i = e[1], a = e[2];
if (a === 0) return [
0,
0,
0
];
Fr(a);
var o = Math.ceil(r / t) - 1, s = Math.ceil(i / t) - 1;
return o < 0 && (o = 0), s < 0 && (s = 0), [
o,
s,
a
];
}
function Mr(e, t) {
Nr(e);
var n = e[0], r = e[1], i = e[2];
return i === 0 ? [
0,
0,
0
] : [
n,
2 ** i - 1 - r,
i
];
}
function Nr(e, t) {
var n = e[0], r = e[1], i = e[2];
if (i == null) throw Error("<zoom> is required");
if (n == null) throw Error("<x> is required");
if (r == null) throw Error("<y> is required");
return i = Fr(i), e = Pr(e), e;
}
function Pr(e) {
var t = e[0], n = e[1], r = e[2], i = 2 ** r;
return t %= i, t < 0 && (t += i), [
t,
n,
r
];
}
function Fr(e) {
if (e === !1) return e;
if (e == null) throw Error("<zoom> is required");
if (e < 0) throw Error("<zoom> cannot be less than 0");
if (e > 32) throw Error("<zoom> cannot be greater than 32");
return e;
}
function Ir(e, t) {
var n = zr(e[0]), r = Rr(e[1]);
return r > 85 && (r = 85), r < -85 && (r = -85), [n, r];
}
function Lr(e, t) {
return Er(t) / 2 ** e;
}
function Rr(e) {
if (e == null) throw Error("lat is required");
return (e > 90 || e < -90) && (e %= 180, e > 90 && (e = -180 + e), e < -90 && (e = 180 + e), e === 0 && (e = 0)), e;
}
function zr(e) {
if (e == null) throw Error("lng is required");
return (e > 180 || e < -180) && (e %= 360, e > 180 && (e = -360 + e), e < -180 && (e = 360 + e), e === 0 && (e = 0)), e;
}
var Br = class {
constructor(e, t, n, r, i) {
$(this, "url"), $(this, "tileSize"), $(this, "tms"), $(this, "minzoom"), $(this, "maxzoom"), this.url = e, this.tileSize = t, this.tms = i, this.minzoom = n, this.maxzoom = r, this.tms = i;
}
getValue(e, t) {
return new Promise((n, r) => {
let i = e[0], a = e[1], o = t;
t > this.maxzoom ? o = this.maxzoom : t < this.minzoom && (o = this.minzoom);
let s = this.tms ? kr([i, a], o) : Ar([i, a], o), c = this.url.replace(/{x}/g, s[0].toString()).replace(/{y}/g, s[1].toString()).replace(/{z}/g, s[2].toString()), l = this.getUrlExtension(c);
switch (l ||= "png", l) {
case "png":
case "webp":
this.getValueFromRaster(c, s, i, a).then((e) => {
n(e);
});
break;
default:
r(/* @__PURE__ */ Error(`Invalid file extension: ${l}`));
break;
}
});
}
async getValueFromRaster(e, t, n, r) {
let i = await fetch(e);
if (!i.ok) {
if (i.status === 404) return;
throw Error(`Failed to fetch tile: ${i.statusText}`);
}
let a = await i.blob();
return new Promise((e, i) => {
let o = new Image();
o.onload = () => {
let a = document.createElement("canvas");
a.width = o.width, a.height = o.height;
let s = a.getContext("2d");
if (!s) return i(/* @__PURE__ */ Error("Failed to create canvas context"));
s.drawImage(o, 0, 0);
let c = s.getImageData(0, 0, o.width, o.height).data, l = this.pixels2rgba(new Uint8Array(c), t, n, r);
e(this.calc(l[0], l[1], l[2], l[3]));
}, o.onerror = () => e(void 0), o.src = URL.createObjectURL(a);
});
}
pixels2rgba(e, t, n, r) {
let i = [];
for (let t = 0; t < e.length; t += 4) {
let n = [
e[t],
e[t + 1],
e[t + 2],
e[t + 3]
];
i.push(n);
}
let a = this.tileToBBOX(t), o = this.getPixelPosition(n, r, a);
return i[o[0] + o[1] * this.tileSize];
}
getPixelPosition(e, t, n) {
let r = this.tileSize, i = this.tileSize, a = n[2] - n[0], o = n[3] - n[1], s = (e - n[0]) / a, c = (t - n[1]) / o;
return [Math.floor(r * s), Math.floor(i * (1 - c))];
}
getUrlExtension(e) {
let t = e.split(/[#?]/)[0].split(".").pop();
return t &&= t.trim(), t;
}
tileToBBOX(e) {
let t = this.tile2lon(e[0] + 1, e[2]);
return [
this.tile2lon(e[0], e[2]),
this.tile2lat(e[1] + 1, e[2]),
t,
this.tile2lat(e[1], e[2])
];
}
tile2lon(e, t) {
return e / 2 ** t * 360 - 180;
}
tile2lat(e, t) {
let n = 180 / Math.PI, r = Math.PI - 2 * Math.PI * e / 2 ** t;
return n * Math.atan(.5 * (Math.exp(r) - Math.exp(-r)));
}
}, Vr = class extends Br {
constructor(e, t, n = 5, r = 15, i = !1) {
super(e, t, n, r, i);
}
async getElevation(e, t) {
return await this.getValue(e, t);
}
calc(e, t, n) {
return -1e4 + (e * 256 * 256 + t * 256 + n) * .1;
}
}, Hr = class extends Br {
constructor(e, t, n = 5, r = 15, i = !1) {
super(e, t, n, r, i);
}
async getElevation(e, t) {
return await this.getValue(e, t);
}
calc(e, t, n) {
let r = e * 256 + t + n / 256 - 32768;
return parseInt(r.toFixed(0));
}
}, Ur = (e, t = 8) => {
let [n, r] = e, i = 10 ** t;
return `${Math.round(n * i) / i},${Math.round(r * i) / i}`;
}, Wr = async (e, t, n, r, i = "metric", a = J) => {
let o = [], s = {
enabled: !0,
maxSize: 1e3,
ttl: 3600 * 1e3,
precision: 6,
...n
}, c;
s.enabled && (c = r || new br(s.maxSize, s.ttl));
let l, u = 15;
if (t) {
let e = t.url, n = t.encoding ?? "mapbox", r = t.tileSize ?? 512, i = t.minzoom ?? 5;
u = t.maxzoom ?? 15;
let a = t.tms ?? !1;
l = n === "mapbox" ? new Vr(e, r, i, u, a) : new Hr(e, r, i, u, a);
}
for (let t of e) o.push(new Promise((e) => {
t.geometry.type !== "Point" && e(t);
let n = t.geometry.coordinates, r = Ur(n, s.precision);
if (c) {
let n = c.get(r);
if (n !== void 0) {
if (!isNaN(n)) {
let { elevation: e, unit: r } = Z(n, i, a);
t.properties.elevation = e, t.properties.elevationUnit = r;
}
e(t);
return;
}
}
l ? l.getElevation(t.geometry.coordinates, u).then((n) => {
if (n != null && typeof n == "number") {
c && c.set(r, n);
let { elevation: e, unit: o } = Z(n, i, a);
t.properties.elevation = e, t.properties.elevationUnit = o;
}
e(t);
}).catch(() => {
c && c.has(r) && c.delete(r), e(t);
}) : e(t);
}));
return await Promise.all(o);
}, Gr = (e, t = 9) => {
function n(e) {
return [Number(e[0].toFixed(t)), Number(e[1].toFixed(t))];
}
function r(e) {
let t = e.type, r = e.coordinates;
switch (t) {
case "Point":
r = n(r);
break;
case "LineString":
case "MultiPoint":
r = r.map(n);
break;
case "Polygon":
case "MultiLineString":
r = r.map((e) => e.map(n));
break;
case "MultiPolygon":
r = r.map((e) => e.map((e) => e.map(n)));
break;
default: break;
}
return {
...e,
coordinates: r
};
}
return e.map((e) => ({
...e,
geometry: r(e.geometry)
}));
}, Kr = [{
value: "time",
label: "Time"
}, {
value: "distance",
label: "Distance"
}], qr = class {
url;
constructor(e) {
this.url = e;
}
async calcIsochrone(e, t, n, r, i) {
let a = JSON.parse(JSON.stringify(i));
a.forEach((e) => {
n === "time" ? delete e.distance : delete e.time;
});
let o = {
locations: [{
lat: t,
lon: e
}],
costing: r,
contours: a.map((e) => (e.color = e.color.replace("#", ""), e)),
polygons: !0
}, s = `${this.url}/isochrone?json=${JSON.stringify(o)}`;
return await (await fetch(s)).json();
}
}, Jr = [
{
value: "pedestrian",
label: "Pedestrian"
},
{
value: "bicycle",
label: "Bicycle"
},
{
value: "auto",
label: "Car"
}
], Yr = [{
value: "kilometers",
label: "km"
}, {
value: "miles",
label: "mile"
}], Xr = class {
tripData = [];
getTripData() {
return this.tripData;
}
url;
tripSummary;
getTripSummary() {
return this.tripSummary;
}
constructor(e) {
this.url = e;
}
clearFeatures() {
this.tripData = [], this.tripSummary = void 0;
}
async calcRoute(e, t, n) {
if (this.tripData = e, !this.tripData || this.tripData && this.tripData.length < 2) {
this.tripSummary = void 0;
return;
}
let r = `${this.url}/route`, i = {
locations: this.tripData.map((e) => ({
lon: e.lng,
lat: e.lat
})),
costing: t,
costing_options: { auto: { country_crossing_penalty: 2e3 } },
units: n,
id: "my_work_route"
}, a = `${r}?json=${JSON.stringify(i)}`, o = await (await fetch(a)).json();
if ("error" in o) throw this.tripData.pop(), Error(`${o.status} (${o.status_code}): ${o.error} (${o.error_code})`);
let s = o.trip.legs.map((e) => this.decodeShape(e.shape)), c = [];
s.forEach((e) => {
c = [...c, ...e];
}), this.tripSummary = o.trip.summary, this.tripSummary.length = Number(this.tripSummary.length.toFixed(2)), this.tripSummary.time = Number((this.tripSummary.time / 60).toFixed());
let l = [], u = 0, d = 0, f = [], p = this.geoPoint(this.tripData.map((e) => [e.lng, e.lat]));
o.trip.legs.forEach((e, t) => {
let r = this.decodeShape(e.shape);
l.push(...r), u += Number(e.summary.length.toFixed(2)), d += Number((e.summary.time / 60).toFixed()), f.push(...e.maneuvers);
let i = p.features[t + 1];
i.properties = {
...i.properties,
distance: u,
distance_unit: n === "kilometers" ? "km" : "mi",
time: d,
maneuvers: e.maneuvers
};
});
let m = Jr.find((e) => e.value === t)?.label, h = this.geoLineString(l, {
costingModel: m,
distance: u,
distance_unit: n === "kilometers" ? "km" : "mi",
time: d,
maneuvers: f
}), g = p.features[0];
return g.properties = {
...g.properties,
costingModel: m
}, {
feature: h,
pointFeatures: p
};
}
geoLineString(e = [], t = {}) {
return {
type: "Feature",
properties: t,
geometry: {
type: "LineString",
coordinates: e
}
};
}
geoPoint(e = []) {
return {
type: "FeatureCollection",
features: e.map((t, n) => {
let r = (n + 1).toString();
return r = n === 0 ? "Start" : n === e.length - 1 ? "Goal" : `No.${r}`, {
type: "Feature",
id: `node-${n}`,
properties: {
sequence: n,
text: r
},
geometry: {
type: "Point",
coordinates: t
}
};
})
};
}
decodeShape(e, t = 6) {
let n = 0, r = 0, i = 0, a = [], o, s, c = 10 ** (t || 6);
for (; n < e.length;) {
let t, l = 0, u = 0;
do
t = e.charCodeAt(n++) - 63, u |= (t & 31) << l, l += 5;
while (t >= 32);
o = u & 1 ? ~(u >> 1) : u >> 1, l = u = 0;
do
t = e.charCodeAt(n++) - 63, u |= (t & 31) << l, l += 5;
while (t >= 32);
s = u & 1 ? ~(u >> 1) : u >> 1, r += o, i += s, a.push([i / c, r / c]);
}
return a;
}
}, Zr = class {
controlContainer;
map;
modeButtons = {};
_isExpanded = !1;
_cssPrefix = "";
get isExpanded() {
return this._isExpanded;
}
get cssPrefix() {
return this._cssPrefix;
}
set isExpanded(e) {
this._isExpanded = e;
let t = document.getElementsByClassName(`maplibregl-terradraw-${this.cssPrefix}add-control`);
for (let e = 0; e < t.length; e++) {
let n = t.item(e);
n && (this.isExpanded ? n.classList.remove("hidden") : n.classList.add("hidden"));
}
let n = document.getElementsByClassName(`maplibregl-terradraw-${this.cssPrefix}render-button`);
n && n.length > 0 && (this.isExpanded ? n.item(0)?.classList.add("enabled") : (n.item(0)?.classList.remove("enabled"), this.resetActiveMode())), this.toggleDeleteSelectionButton(), this.toggleButtonsWhenNoFeature(), this.isExpanded ? this.dispatchEvent("expanded") : this.dispatchEvent("collapsed");
}
get showDeleteConfirmation() {
return this.options.showDeleteConfirmation === !0;
}
set showDeleteConfirmation(e) {
this.options.showDeleteConfirmation = e;
}
terradraw;
options;
events = {};
defaultMode = "render";
constructor(e) {
this.modeButtons = {}, this.options = {
...Mn,
modes: [...Mn.modes ?? []],
...e
};
let t = this.options.adapterOptions?.prefixId ?? "td";
this.options.adapterOptions || (this.options.adapterOptions = {}), this.options.adapterOptions?.prefixId || (this.options.adapterOptions.prefixId = t), this.options.undoRedo || (this.options.undoRedo = {
modeLevel: new wn({ maxStackSize: 100 }),
sessionLevel: new Tn({ maxStackSize: 100 }),
keyboardShortcuts: new xn()
});
}
getDefaultPosition() {
return "top-right";
}
onAdd(e) {
if (this.options && this.options.modes && this.options.modes.length === 0) throw Error("At least a mode must be enabled.");
this.map = e;
let t = zn(), n = [];
return this.options?.modes?.forEach((e) => {
if (this.options.modeOptions && this.options.modeOptions[e]) {
let r = this.options.modeOptions[e];
if (e === "select") {
let n = t[e];
if (n) {
let e = n.flags;
Object.keys(e).forEach((t) => {
r.flags[t] || (r.flags[t] = e[t]);
});
}
}
n.push(r);
} else t[e] && n.push(t[e]);
}), n.forEach((e) => {
e.state !== "unregistered" && (e._state = "unregistered");
}), this.options?.modes?.includes("render") || (n.push(new B({
modeName: "default",
styles: {}
})), this.defaultMode = "default"), this.isExpanded = this.options.open === !0, this.terradraw = new Dn({
adapter: new kn({
map: e,
...this.options.adapterOptions
}),
modes: n,
undoRedo: this.options.undoRedo
}), this.map?.loaded() ? this.terradraw.start() : this.map?.once("load", () => {
this.terradraw?.start();
}), this.controlContainer = document.createElement("div"), this.controlContainer.classList.add("maplibregl-ctrl"), this.controlContainer.classList.add("maplibregl-ctrl-group"), n.forEach((e) => {
e.mode !== "default" && this.addTerradrawButton(e.mode);
}), Object.values(this.modeButtons).forEach((e) => {
this.controlContainer?.appendChild(e);
}), this.toggleButtonsWhenNoFeature(), this.terradraw?.on("finish", this.toggleButtonsWhenNoFeature.bind(this)), this.terradraw?.on("history", this.handleHistoryChange.bind(this)), this.map.once("idle", () => {
this.toggleButtonsWhenNoFeature();
}), this.controlContainer;
}
onRemove() {
!this.controlContainer || !this.controlContainer.parentNode || !this.map || (this.deactivate(), this.modeButtons = {}, this.terradraw = void 0, this.map = void 0, this.controlContainer.parentNode.removeChild(this.controlContainer));
}
on(e, t) {
this.events[e] ? this.events[e].push(t) : this.events[e] = [t];
}
off(e, t) {
if (!this.events[e]) return;
let n = this.events[e].findIndex((e) => e === t);
n !== -1 && this.events[e].splice(n, 1);
}
dispatchEvent(e, t) {
this.events[e] && this.events[e].forEach((e) => {
let n = (this.terradraw?.getSnapshot())?.filter((e) => e.properties.selected === !0);
e({
feature: n,
mode: this.terradraw?.getMode(),
...t
});
});
}
activate() {
this.terradraw && (this.terradraw.enabled || this.terradraw.start());
}
deactivate() {
this.terradraw && this.terradraw.enabled && (this.resetActiveMode(), this.dispatchEvent("mode-changed"), this.terradraw.stop());
}
handleModeChange(e, t) {
let n = t.setMode(e);
return this.syncButtonStates(e), e !== this.defaultMode && this.activate(), this.dispatchEvent("mode-changed"), n;
}
syncButtonStates(e) {
if (!this.controlContainer) return;
let t = this.controlContainer.getElementsByClassName(`maplibregl-terradraw-${this.cssPrefix}add-control`);
for (let e = 0; e < t.length; e++) {
let n = t.item(e);
n && n.classList.remove("active");
}
if (e !== this.defaultMode && e !== "render") {
let t = this.controlContainer.getElementsByClassName(`maplibregl-terradraw-${this.cssPrefix}add-${e}-button`);
t && t.length > 0 && t[0].classList.add("active");
}
this.toggleDeleteSelectionButton(), this.toggleButtonsWhenNoFeature();
}
getTerraDrawInstance() {
return this.terradraw ? new Proxy(this.terradraw, { get: (e, t, n) => t === "setMode" ? (t) => this.handleModeChange(t, e) : t === "clearUndoRedoHistory" ? () => {
e.clearUndoRedoHistory(), this.handleHistoryChange({
undoSize: 0,
redoSize: 0
});
} : Reflect.get(e, t, n) }) : this.terradraw;
}
handleHistoryChange(e) {
if (!this.controlContainer) return;
let t = this.controlContainer.getElementsByClassName(`maplibregl-terradraw-${this.cssPrefix}undo-button`);
for (let n = 0; n < t.length; n++) {
let r = t.item(n);
r && (r.disabled = e.undoSize === 0);
}
let n = this.controlContainer.getElementsByClassName(`maplibregl-terradraw-${this.cssPrefix}redo-button`);
for (let t = 0; t < n.length; t++) {
let r = n.item(t);
r && (r.disabled = e.redoSize === 0);
}
}
toggleEditor() {
this.terradraw && (this.isExpanded = !this.isExpanded);
}
resetActiveMode() {
this.terradraw && (this.terradraw.enabled || this.terradraw.start(), this.terradraw?.setMode(this.defaultMode), this.syncButtonStates(this.defaultMode));
}
addTerradrawButton(e) {
let t = document.createElement("button");
t.type = "button", this.modeButtons[e] = t, e === "render" ? (t.classList.add(`maplibregl-terradraw-${this.cssPrefix}${e}-button`), this.isExpanded && t.classList.add("enabled"), t.type = "button", t.title = hr("expand or collapse drawing tool"), t.addEventListener("click", this.toggleEditor.bind(this))) : (t.classList.add(`maplibregl-terradraw-${this.cssPrefix}add-control`), this.isExpanded || t.classList.add("hidden"), t.title = hr(e.replace(/-/g, " ")), e === "delete" ? (t.classList.add(`maplibregl-terradraw-${this.cssPrefix}${e}-button`), t.addEventListener("click", this.handleDeleteAllFeatures.bind(this))) : e === "delete-selection" ? (t.classList.add(`maplibregl-terradraw-${this.cssPrefix}${e}-button`), t.classList.add("hidden-delete-selection"), t.addEventListener("click", this.handleDeleteSelectedFeatures.bind(this))) : e === "download" ? (t.classList.add(`maplibregl-terradraw-${this.cssPrefix}${e}-button`), t.addEventListener("click", this.handleDownload.bind(this))) : ["undo", "redo"].includes(e) ? (t.classList.add(`maplibregl-terradraw-${this.cssPrefix}${e}-button`), t.disabled = !0, t.addEventListener("click", () => {
this.terradraw && (e === "undo" ? this.terradraw.undo() : this.terradraw.redo());
})) : (t.classList.add(`maplibregl-terradraw-${this.cssPrefix}add-${e}-button`), t.addEventListener("click", () => {
if (!this.terradraw) return;
let n = t.classList.contains("active");
this.activate(), this.resetActiveMode(), n || (this.terradraw.setMode(e), this.syncButtonStates(e)), this.dispatchEvent("mode-changed");
})));
}
getFeatures(e = !1) {
if (!this.terradraw) return;
let t = {
type: "FeatureCollection",
features: (this.terradraw?.getSnapshot()).filter((e) => e.properties.mode !== "select")
};
return e === !0 && (t.features = t.features.filter((e) => e.properties.selected === !0)), t;
}
cleanStyle(e, t) {
return vr(e, t, Q, this.options.adapterOptions?.prefixId);
}
showDeleteConfirmationDialog(e) {
let t = new xr("maplibre-terradraw-delete-confirmation-dialog", "Delete All Features");
t.create(document.body, (n) => {
let r = document.createElement("p");
r.textContent = "Are you sure you want to delete all features?", n.appendChild(r);
let i = document.createElement("div");
i.classList.add("dialog-buttons");
let a = document.createElement("button");
a.type = "button", a.textContent = "Cancel", a.classList.add("dialog-button-cancel"), a.addEventListener("click", () => {
t.close();
});
let o = document.createElement("button");
return o.type = "button", o.textContent = "Delete", o.classList.add("dialog-button-delete"), o.addEventListener("click", () => {
e(), t.close();
}), i.appendChild(a), i.appendChild(o), n.appendChild(i), n;
}), t.open();
}
handleDeleteAllFeatures() {
if (!this.terradraw || !this.terradraw.enabled) return;
let e = () => {
this.terradraw?.clear(), this.resetActiveMode(), this.toggleDeleteSelectionButton(), this.toggleButtonsWhenNoFeature(), this.dispatchEvent("feature-deleted");
};
this.options.showDeleteConfirmation === !0 ? this.showDeleteConfirmationDialog(e) : e();
}
handleDeleteSelectedFeatures() {
if (!this.terradraw || !this.terradraw.enabled) return;
let e = (this.terradraw?.getSnapshot()).filter((e) => e.properties.selected === !0);
if (e.length > 0) {
let t = e.map((e) => e.id);
this.terradraw.removeFeatures(t);
for (let e of t) this.terradraw.deselectFeature(e);
this.dispatchEvent("feature-deleted", { deletedIds: t });
}
this.toggleDeleteSelectionButton(), this.toggleButtonsWhenNoFeature();
}
handleDownload() {
let e = this.getFeatures(!1), t = "data:application/json;charset=utf-8," + encodeURIComponent(JSON.stringify(e)), n = document.createElement("a");
n.setAttribute("href", t), n.setAttribute("download", "data.geojson"), document.body.appendChild(n), n.click(), n.remove();
}
toggleButtonsWhenNoFeature() {
if (!this.controlContainer) return;
let e = (this.terradraw?.getSnapshot())?.filter((e) => e.properties.mode !== "select"), t = !!(e && e.length > 0), n = [
`maplibregl-terradraw-${this.cssPrefix}add-select-button`,
`maplibregl-terradraw-${this.cssPrefix}download-button`,
`maplibregl-terradraw-${this.cssPrefix}delete-button`
];
for (let e of n) {
let n = this.controlContainer.getElementsByClassName(e);
for (let e = 0; e < n.length; e++) {
let r = n.item(e);
r && (r.disabled = !t);
}
}
}
toggleDeleteSelectionButton() {
let e = this.terradraw?.enabled || !1, t = this.terradraw?.getMode(), n = this.getFeatures(!1), r = n && n.features.length > 0, i = r && e && t === "select", a = document.getElementsByClassName(`maplibregl-terradraw-${this.cssPrefix}delete-selection-button`);
for (let e = 0; e < a.length; e++) {
let t = a.item(e);
t && (i ? t.classList.remove("hidden-delete-selection") : t.classList.add("hidden-delete-selection"));
}
if (!r) {
let e = document.getElementsByClassName(`maplibregl-terradraw-${this.cssPrefix}add-select-button`);
for (let t = 0; t < e.length; t++) {
let n = e.item(t);
n && n.classList.remove("active");
}
}
}
clearExtendedFeatures(e, t = void 0) {
if (this.map) for (let n of e) {
let e = this.map.getStyle().sources[n];
e && typeof e.data != "string" && e.data.type === "FeatureCollection" && (t === void 0 ? e.data.features = [] : e.data.features = e.data.features.filter((e) => e.properties?.originalId ? !t.includes(e.properties.originalId) : !t.includes(e.id)), this.map.getSource(n)?.setData(e.data));
}
}
};
//#endregion
//#region node_modules/.pnpm/@turf+centroid@7.3.5/node_modules/@turf/centroid/dist/esm/index.js
function Qr(e, t = {}) {
let n = 0, r = 0, i = 0;
return Kn(e, function(e) {
n += e[0], r += e[1], i++;
}, !0), Hn([n / i, r / i], t.properties);
}
//#endregion
//#region src/lib/controls/MaplibreMeasureControl.ts
var $r = class extends Zr {
measureOptions;
elevationCache;
get measureUnitType() {
return this.measureOptions.measureUnitType ?? "metric";
}
set measureUnitType(e) {
let t = this.measureOptions.measureUnitType === e;
this.measureOptions.measureUnitType = e, t || (this.computeElevation && this.recalculateElevationUnits(), this.recalc());
}
get distancePrecision() {
return this.measureOptions.distancePrecision ?? 2;
}
set distancePrecision(e) {
let t = this.measureOptions.distancePrecision === e;
this.measureOptions.distancePrecision = e, t || this.recalc();
}
get distanceUnit() {
return this.measureOptions.distanceUnit;
}
set distanceUnit(e) {
let t = this.measureOptions.distanceUnit === e;
this.measureOptions.distanceUnit = e, t || this.recalc();
}
get areaPrecision() {
return this.measureOptions.areaPrecision ?? 2;
}
set areaPrecision(e) {
let t = this.measureOptions.areaPrecision === e;
this.measureOptions.areaPrecision = e, t || this.recalc();
}
get areaUnit() {
return this.measureOptions.areaUnit;
}
set areaUnit(e) {
let t = this.measureOptions.areaUnit === e;
this.measureOptions.areaUnit = e, t || this.recalc();
}
get measureUnitSymbols() {
return this.measureOptions.measureUnitSymbols ?? JSON.parse(JSON.stringify(J));
}
set measureUnitSymbols(e) {
let t = JSON.stringify(this.measureOptions.measureUnitSymbols) === JSON.stringify(e);
this.measureOptions.measureUnitSymbols = e, t || this.recalc();
}
get computeElevation() {
return this.measureOptions.computeElevation ?? !1;
}
set computeElevation(e) {
let t = this.measureOptions.computeElevation === e;
this.measureOptions.computeElevation = e, t || this.recalc();
}
get fontGlyphs() {
let e = [
this.measureOptions.pointLayerLabelSpec,
this.measureOptions.lineLayerLabelSpec,
this.measureOptions.polygonLayerSpec
][0];
return e && e.layout && e.layout["text-font"];
}
set fontGlyphs(e) {
let t = [
this.measureOptions.pointLayerLabelSpec,
this.measureOptions.lineLayerLabelSpec,
this.measureOptions.polygonLayerSpec
];
for (let n of t) n && n.layout && (n.layout["text-font"] = e), this.map && n && this.map.getLayer(n.id) && this.map.setLayoutProperty(n.id, "text-font", e);
}
constructor(e) {
let { modeOptions: t, ...n } = In, r = {
...JSON.parse(JSON.stringify(n)),
modeOptions: { ...t }
};
e && (r = Object.assign(r, e));
let i = r.adapterOptions?.prefixId ?? "td-measure";
r.adapterOptions && !r.adapterOptions?.prefixId && (r.adapterOptions.prefixId = i), r.pointLayerLabelSpec.id = r.pointLayerLabelSpec?.id.replace("{prefix}", i), r.pointLayerLabelSpec.source = r.pointLayerLabelSpec?.source.replace("{prefix}", i), r.routingLineLayerNodeSpec.id = r.routingLineLayerNodeSpec?.id.replace("{prefix}", i), r.routingLineLayerNodeSpec.source = r.routingLineLayerNodeSpec?.source.replace("{prefix}", i), r.lineLayerLabelSpec.id = r.lineLayerLabelSpec?.id.replace("{prefix}", i), r.lineLayerLabelSpec.source = r.lineLayerLabelSpec?.source.replace("{prefix}", i), r.polygonLayerSpec.id = r.polygonLayerSpec?.id.replace("{prefix}", i), r.polygonLayerSpec.source = r.polygonLayerSpec?.source.replace("{prefix}", i), super({
modes: r.modes,
open: r.open,
modeOptions: r.modeOptions,
adapterOptions: r.adapterOptions,
undoRedo: r.undoRedo
}), this._cssPrefix = "measure-", this.measureOptions = r, this.measureOptions.elevationCacheConfig && this.measureOptions.elevationCacheConfig?.enabled && (this.elevationCache = new br(this.measureOptions.elevationCacheConfig.maxSize, this.measureOptions.elevationCacheConfig.ttl));
}
onAdd(e) {
return this.controlContainer = super.onAdd(e), this.controlContainer;
}
onRemove() {
this.unregisterMesureControl(), super.onRemove();
}
activate() {
super.activate(), this.registerMesureControl();
}
recalc() {
let e = this.getTerraDrawInstance();
if (e) {
this.registerMesureControl();
let t = e.getSnapshot();
for (let e of t) {
let t = e.id, n = e.geometry.type, r = e.properties.mode;
["linestring", "freehand-linestring"].includes(r) && n === "LineString" ? this.measureLine(t, !1) : ["point", "marker"].includes(r) && n === "Point" ? this.measurePoint(t, !1) : ![
"point",
"marker",
"linestring",
"freehand-linestring",
"select",
"render"
].includes(r) && n === "Polygon" && this.measurePolygon(t, !1);
}
}
}
cleanStyle(e, t) {
let n = Q, r = this.measureOptions.polygonLayerSpec?.source;
r && n.push(r);
let i = this.measureOptions.lineLayerLabelSpec?.source;
return i && n.push(i), vr(e, t, n, this.measureOptions.adapterOptions?.prefixId);
}
registerMesureControl() {
if (!this.map) return;
let e = this.options.modes?.filter((e) => ["linestring", "freehand-linestring"].includes(e));
this.options.modes?.find((e) => ["point", "marker"].includes(e)) && (this.map.getLayer(this.measureOptions.pointLayerLabelSpec.id) || this.map.addLayer(this.measureOptions.pointLayerLabelSpec)), e && e.length > 0 && (this.map.getSource(this.measureOptions.lineLayerLabelSpec.source) || this.map.addSource(this.measureOptions.lineLayerLabelSpec.source, {
type: "geojson",
data: {
type: "FeatureCollection",
features: []
}
}), this.map.getLayer(this.measureOptions.routingLineLayerNodeSpec.id) || this.map.addLayer(this.measureOptions.routingLineLayerNodeSpec), this.map.getLayer(this.measureOptions.lineLayerLabelSpec.id) || this.map.addLayer(this.measureOptions.lineLayerLabelSpec));
let t = this.options.modes?.filter((e) => [
"polygon",
"rectangle",
"angled-rectangle",
"circle",
"sector",
"sensor",
"freehand"
].includes(e));
if (t && t.length > 0 && (this.map.getSource(this.measureOptions.polygonLayerSpec.source) || this.map.addSource(this.measureOptions.polygonLayerSpec.source, {
type: "geojson",
data: {
type: "FeatureCollection",
features: []
}
}), this.map.getLayer(this.measureOptions.polygonLayerSpec.id) || this.map.addLayer(this.measureOptions.polygonLayerSpec)), e && e.length > 0 || t && t.length > 0) {
let e = this.getTerraDrawInstance();
e && (e.on("change", this.handleTerradrawFeatureChanged.bind(this)), e.on("finish", this.handleTerradrawFeatureReady.bind(this)), e.on("deselect", this.handleTerradrawDeselect.bind(this)), this.on("feature-deleted", this.onFeatureDeleted.bind(this)));
}
}
handleTerradrawDeselect = () => {
if (this.map && this.computeElevation === !0 && this.measureOptions.terrainSource !== void 0) {
let e = this.getTerraDrawInstance();
if (!e) return;
let t = e.getSnapshot(), n = t.filter((e) => e.properties.mode && ["linestring", "freehand-linestring"].includes(e.properties.mode) && e.geometry.type === "LineString");
if (n.length > 0) for (let e of n) this.computeElevationByLineFeatureID(e.id);
let r = t.filter((e) => ["point", "marker"].includes(e.properties.mode) && e.geometry.type === "Point");
if (r.length > 0) for (let e of r) this.measurePoint(e.id);
}
};
handleTerradrawFeatureReady = yr((e) => {
if (!this.map || !this.terradraw) return;
let t = this.terradraw.getSnapshotFeature(e);
if (!t) return;
let n = t.geometry.type, r = t.properties.mode;
["linestring", "freehand-linestring"].includes(r) && n === "LineString" ? this.measureLine(e, !1) : ["point", "marker"].includes(r) && n === "Point" ? this.measurePoint(e, !1) : ![
"point",
"marker",
"linestring",
"freehand-linestring",
"select",
"render"
].includes(r) && n === "Polygon" && this.measurePolygon(e, !1);
}, 300);
handleTerradrawFeatureChanged(e, t) {
if (!this.map || t === "styling") return;
let n = [
this.measureOptions.lineLayerLabelSpec,
this.measureOptions.routingLineLayerNodeSpec,
this.measureOptions.polygonLayerSpec
].map((e) => e.source);
if (t === "delete") {
this.clearExtendedFeatures(n, e);
return;
}
let r = this.getTerraDrawInstance();
if (r) for (let t of e) {
let e = r.getSnapshotFeature(t);
if (e) {
let n = e.geometry.type, r = e.properties.mode;
["linestring", "freehand-linestring"].includes(r) && n === "LineString" ? this.measureLine(t, !0) : ["point", "marker"].includes(r) && n === "Point" ? this.measurePoint(t, !0) : ![
"point",
"marker",
"linestring",
"freehand-linestring",
"select",
"render"
].includes(r) && n === "Polygon" && this.measurePolygon(t, !0);
} else this.clearExtendedFeatures(n, [t]);
}
}
unregisterMesureControl() {
this.off("feature-deleted", this.onFeatureDeleted.bind(this)), this.map && (this.map.getLayer(this.measureOptions.pointLayerLabelSpec.id) && this.map.removeLayer(this.measureOptions.pointLayerLabelSpec.id), this.map.getLayer(this.measureOptions.lineLayerLabelSpec.id) && this.map.removeLayer(this.measureOptions.lineLayerLabelSpec.id), this.map.getLayer(this.measureOptions.routingLineLayerNodeSpec.id) && this.map.removeLayer(this.measureOptions.routingLineLayerNodeSpec.id), this.map.getLayer(this.measureOptions.polygonLayerSpec.id) && this.map.removeLayer(this.measureOptions.polygonLayerSpec.id), this.map.getSource(this.measureOptions.lineLayerLabelSpec.source) && this.map.removeSource(this.measureOptions.lineLayerLabelSpec.source), this.map.getSource(this.measureOptions.polygonLayerSpec.source) && this.map.removeSource(this.measureOptions.polygonLayerSpec.source));
}
replaceGeoJSONSource(e, t, n) {
if (!this.map) return;
let r = this.map.getStyle().sources[t];
if (r && typeof r.data != "string" && r.data.type === "FeatureCollection") {
let i = [];
for (let t of e) (this.terradraw?.getSnapshotFeature(t.id) || this.terradraw?.getSnapshotFeature(t.properties.originalId)) && i.push(t);
let a = i.map((e) => e.id);
if (typeof r.data != "string" && r.data.type === "FeatureCollection") {
n === "linestring" ? r.data.features = [...r.data.features = r.data.features.filter((e) => !(a.includes(e.properties?.originalId) && e.geometry.type === "Point")), ...i] : n === "point" && (r.data.features = [...r.data.features = r.data.features.filter((e) => !(a.includes(e.id) && e.geometry.type === "Point")), ...i]);
let e = {};
r.data.features.forEach((t) => {
let n = t.id;
e[n] ? !e[n].properties.elevation && t.properties?.elevation && (e[n] = t) : e[n] = t;
}), r.data.features = Array.from(Object.values(e)), this.map.getSource(t)?.setData(r.data);
}
}
}
computeElevationByLineFeatureID = async (e) => {
if (this.map && this.computeElevation === !0) {
let t = this.map.getStyle().sources[this.measureOptions.lineLayerLabelSpec.source];
if (t && typeof t.data != "string" && t.data.type === "FeatureCollection") {
let n = t.data.features.filter((t) => t.properties?.originalId === e && t.geometry.type === "Point");
if (n && n.length > 0) {
let e = await Wr(n, this.measureOptions.terrainSource, this.measureOptions.elevationCacheConfig, this.elevationCache, this.measureUnitType, this.measureUnitSymbols);
this.replaceGeoJSONSource(e, this.measureOptions.lineLayerLabelSpec.source, "linestring");
}
}
}
};
recalculateElevationUnits() {
if (!this.map) return;
let e = this.measureOptions.pointLayerLabelSpec.source;
this.updateElevationUnitsInSource(e);
let t = this.measureOptions.lineLayerLabelSpec.source;
this.updateElevationUnitsInSource(t);
}
updateElevationUnitsInSource(e) {
if (!this.map) return;
let t = this.map.getStyle().sources[e];
if (t && typeof t.data != "string" && t.data.type === "FeatureCollection") {
let n = !1;
for (let e of t.data.features) if (e.properties?.elevation !== void 0) {
let t = e.properties.elevationUnit, r = e.properties.elevation;
(t === "ft" || t === "foot") && (r /= 3.28084);
let { elevation: i, unit: a } = Z(r, this.measureUnitType, this.measureUnitSymbols);
e.properties.elevation = i, e.properties.elevationUnit = a, n = !0;
}
n && this.map.getSource(e).setData(t.data);
}
}
async measurePolygon(e, t = !1) {
if (!this.map) return;
let n = this.getTerraDrawInstance();
if (!n) return;
let r = n.getSnapshot()?.find((t) => t.id === e && t.geometry.type === "Polygon");
if (r) {
let n = this.map.getStyle().sources[this.measureOptions.polygonLayerSpec.source];
if (n) {
typeof n.data != "string" && n.data.type === "FeatureCollection" && (n.data.features = n.data.features.filter((t) => t.properties?.originalId !== e));
let i = JSON.parse(JSON.stringify(r));
i.id += "-area-label", i.geometry = Qr(r.geometry).geometry, i.properties.originalId = r.id, r = or(r, this.measureUnitType, this.areaPrecision, this.areaUnit, this.measureUnitSymbols), i.properties.area = r.properties.area, i.properties.unit = r.properties.unit, t || this.terradraw?.updateFeatureProperties(e, {
area: i.properties.area,
unit: i.properties.unit
}), typeof n.data != "string" && n.data.type === "FeatureCollection" && n.data.features.push(i), this.map.getSource(this.measureOptions.polygonLayerSpec.source)?.setData(n.data), this.map.moveLayer(this.measureOptions.polygonLayerSpec.id, this.options.adapterOptions?.renderBelowLayerId), this.map.getLayer(this.measureOptions.lineLayerLabelSpec.id) && this.map.moveLayer(this.measureOptions.lineLayerLabelSpec.id), this.map.getLayer(this.measureOptions.routingLineLayerNodeSpec.id) && this.map.moveLayer(this.measureOptions.routingLineLayerNodeSpec.id, this.options.adapterOptions?.renderBelowLayerId), this.map.getLayer(this.measureOptions.pointLayerLabelSpec.id) && this.map.moveLayer(this.measureOptions.pointLayerLabelSpec.id, this.options.adapterOptions?.renderBelowLayerId);
}
}
}
measureLine(e, t = !1) {
if (!this.map) return;
let n = this.getTerraDrawInstance();
if (!n) return;
let r = n.getSnapshotFeature(e);
if (r) {
let n = this.map.getStyle().sources[this.measureOptions.lineLayerLabelSpec.source];
if (n) {
typeof n.data != "string" && n.data.type === "FeatureCollection" && (n.data.features = n.data.features.filter((t) => t.properties?.originalId !== e)), r = mr(r, this.measureUnitType, this.distancePrecision, this.distanceUnit, this.measureUnitSymbols, this.map, this.computeElevation, this.measureOptions.terrainSource);
let i = r.properties.segments;
for (let e = 0; e < i.length; e++) {
let t = i[e], r = t.geometry.coordinates, a = r[0], o = r[1];
if (e === 0) {
let r = JSON.parse(JSON.stringify(t));
r.id = `${t.id}-node-${e}`, r.geometry = {
type: "Point",
coordinates: a
}, r.properties.distance = 0, r.properties.total = 0, t.properties.elevation_start && (r.properties.elevation = t.properties.elevation_start), typeof n.data != "string" && n.data.type === "FeatureCollection" && n.data.features.push(r);
}
let s = JSON.parse(JSON.stringify(t));
s.id = `${t.id}-node-${e + 1}`, s.geometry = {
type: "Point",
coordinates: o
}, t.properties.elevation_end && (s.properties.elevation = t.properties.elevation_end), typeof n.data != "string" && n.data.type === "FeatureCollection" && n.data.features.push(s);
}
if (!t) {
this.computeElevation === !0 && this.measureOptions.terrainSource !== void 0 && this.computeElevationByLineFeatureID(e);
let t = i[i.length - 1].properties.totalUnit;
this.terradraw?.updateFeatureProperties(e, {
distance: r.properties.distance,
distanceUnit: t,
segments: r.properties.segments
});
}
this.map.getSource(this.measureOptions.lineLayerLabelSpec.source)?.setData(n.data), this.map.getLayer(this.measureOptions.polygonLayerSpec.id) && this.map.moveLayer(this.measureOptions.polygonLayerSpec.id, this.options.adapterOptions?.renderBelowLayerId), this.map.moveLayer(this.measureOptions.lineLayerLabelSpec.id, this.options.adapterOptions?.renderBelowLayerId), this.map.moveLayer(this.measureOptions.routingLineLayerNodeSpec.id, this.options.adapterOptions?.renderBelowLayerId), this.map.getLayer(this.measureOptions.pointLayerLabelSpec.id) && this.map.moveLayer(this.measureOptions.pointLayerLabelSpec.id, this.options.adapterOptions?.renderBelowLayerId);
}
}
}
async measurePoint(e, t = !1) {
if (!this.map) return;
let n = this.getTerraDrawInstance();
if (!n) return;
let r = n.getSnapshotFeature(e);
if (r) {
let n = {
elevation: void 0,
elevationUnit: void 0
};
this.computeElevation && (r = this.measureOptions.terrainSource === void 0 ? Sr(r, this.map, this.computeElevation, this.measureOptions.terrainSource, this.measureUnitType, this.measureUnitSymbols) : (await Wr([r], this.measureOptions.terrainSource, this.measureOptions.elevationCacheConfig, this.elevationCache, this.measureUnitType, this.measureUnitSymbols))[0], n = {
elevation: r.properties.elevation,
elevationUnit: r.properties.elevationUnit
}), t || this.terradraw?.updateFeatureProperties(e, n);
}
}
onFeatureDeleted(e) {
if (this.map && this.getTerraDrawInstance()) {
let t = [];
typeof e == "object" && e && "deletedIds" in e && (t = e.deletedIds);
let n = [
this.measureOptions.lineLayerLabelSpec,
this.measureOptions.routingLineLayerNodeSpec,
this.measureOptions.polygonLayerSpec
].map((e) => e.source);
t && t.length > 0 ? this.clearExtendedFeatures(n, t) : this.clearExtendedFeatures(n, void 0);
}
}
}, ei = class extends Zr {
controlOptions;
valhallaOptions;
_modalDialog;
get valhallaUrl() {
return this.valhallaOptions.url;
}
set valhallaUrl(e) {
this.valhallaOptions.url = e;
}
get routingCostingModel() {
return this.valhallaOptions.routingOptions?.costingModel;
}
set routingCostingModel(e) {
this.valhallaOptions.routingOptions || (this.valhallaOptions.routingOptions = {}), this.valhallaOptions.routingOptions.costingModel = e, this.createSettingsDialog();
}
get routingDistanceUnit() {
return this.valhallaOptions.routingOptions?.distanceUnit;
}
set routingDistanceUnit(e) {
this.valhallaOptions.routingOptions || (this.valhallaOptions.routingOptions = {}), this.valhallaOptions.routingOptions.distanceUnit = e, this.createSettingsDialog();
}
get timeIsochroneCostingModel() {
return this.valhallaOptions.isochroneOptions?.timeCostingModel;
}
set timeIsochroneCostingModel(e) {
this.valhallaOptions.isochroneOptions || (this.valhallaOptions.isochroneOptions = {}), this.valhallaOptions.isochroneOptions.timeCostingModel = e, this.createSettingsDialog();
}
get distanceIsochroneCostingModel() {
return this.valhallaOptions.isochroneOptions?.distanceCostingModel;
}
set distanceIsochroneCostingModel(e) {
this.valhallaOptions.isochroneOptions || (this.valhallaOptions.isochroneOptions = {}), this.valhallaOptions.isochroneOptions.distanceCostingModel = e, this.createSettingsDialog();
}
get isochroneContours() {
return this.valhallaOptions.isochroneOptions?.contours;
}
set isochroneContours(e) {
this.valhallaOptions.isochroneOptions || (this.valhallaOptions.isochroneOptions = {}), this.valhallaOptions.isochroneOptions.contours = e, this.createSettingsDialog();
}
get fontGlyphs() {
let e = [this.controlOptions.routingLineLayerNodeLabelSpec][0];
return e && e.layout && e.layout["text-font"];
}
set fontGlyphs(e) {
let t = [this.controlOptions.routingLineLayerNodeLabelSpec];
for (let n of t) n && n.layout && (n.layout["text-font"] = e), this.map && n && this.map.getLayer(n.id) && this.map.setLayoutProperty(n.id, "text-font", e);
}
get settingDialog() {
return this._modalDialog;
}
set settingDialog(e) {
this._modalDialog = e;
}
constructor(e) {
let t = {
...JSON.parse(JSON.stringify(Y)),
modeOptions: { ...Y.modeOptions }
};
e && (t = Object.assign(t, e), t.valhallaOptions = Object.assign(JSON.parse(JSON.stringify(Y.valhallaOptions)), t.valhallaOptions)), t.adapterOptions ||= {}, t.adapterOptions.prefixId = t.adapterOptions?.prefixId ?? "td-valhalla";
let n = t.adapterOptions?.prefixId ?? "td-valhalla";
if (t.routingLineLayerNodeLabelSpec.id = t.routingLineLayerNodeLabelSpec?.id.replace("{prefix}", n), t.routingLineLayerNodeLabelSpec.source = t.routingLineLayerNodeLabelSpec?.source.replace("{prefix}", n), t.routingLineLayerNodeSpec.id = t.routingLineLayerNodeSpec?.id.replace("{prefix}", n), t.routingLineLayerNodeSpec.source = t.routingLineLayerNodeSpec?.source.replace("{prefix}", n), t.timeIsochronePolygonLayerSpec.id = t.timeIsochronePolygonLayerSpec?.id.replace("{prefix}", n), t.timeIsochronePolygonLayerSpec.source = t.timeIsochronePolygonLayerSpec?.source.replace("{prefix}", n), t.timeIsochroneLineLayerSpec.id = t.timeIsochroneLineLayerSpec?.id.replace("{prefix}", n), t.timeIsochroneLineLayerSpec.source = t.timeIsochroneLineLayerSpec?.source.replace("{prefix}", n), t.timeIsochroneLabelLayerSpec.id = t.timeIsochroneLabelLayerSpec?.id.replace("{prefix}", n), t.timeIsochroneLabelLayerSpec.source = t.timeIsochroneLabelLayerSpec?.source.replace("{prefix}", n), t.distanceIsochronePolygonLayerSpec.id = t.distanceIsochronePolygonLayerSpec?.id.replace("{prefix}", n), t.distanceIsochronePolygonLayerSpec.source = t.distanceIsochronePolygonLayerSpec?.source.replace("{prefix}", n), t.distanceIsochroneLineLayerSpec.id = t.distanceIsochroneLineLayerSpec?.id.replace("{prefix}", n), t.distanceIsochroneLineLayerSpec.source = t.distanceIsochroneLineLayerSpec?.source.replace("{prefix}", n), t.distanceIsochroneLabelLayerSpec.id = t.distanceIsochroneLabelLayerSpec?.id.replace("{prefix}", n), t.distanceIsochroneLabelLayerSpec.source = t.distanceIsochroneLabelLayerSpec?.source.replace("{prefix}", n), super({
modes: t.modes,
open: t.open,
modeOptions: t.modeOptions,
adapterOptions: t.adapterOptions
}), this.valhallaOptions = t.valhallaOptions, !this.valhallaOptions.url) throw Error("Valhalla URL is required for this control. Please set valhallaOptions.url in options.");
this._cssPrefix = "valhalla-", this.controlOptions = t;
}
onAdd(e) {
return this.controlContainer = super.onAdd(e), this.createSettingsDialog(), this.controlContainer;
}
onRemove() {
this.unregisterValhallaControl(), super.onRemove();
}
activate() {
super.activate(), this.registerValhallaControl();
}
cleanStyle(e, t) {
let n = Q, r = this.controlOptions.routingLineLayerNodeSpec?.source;
r && n.push(r);
let i = this.controlOptions.timeIsochronePolygonLayerSpec?.source;
i && n.push(i);
let a = this.controlOptions.distanceIsochronePolygonLayerSpec?.source;
return a && n.push(a), vr(e, t, n, this.options.adapterOptions?.prefixId);
}
createSettingsDialog() {
this.settingDialog = new xr(`maplibregl-terradraw-${this.cssPrefix}settings-dialog`, "Settings"), this.settingDialog.create(this.map?.getContainer().parentElement, (e) => {
let t = document.createElement("div");
t.classList.add("tab-container");
let n = document.createElement("div");
n.classList.add("tab-buttons");
let r = document.createElement("button");
r.type = "button", r.classList.add("tab-button", "active"), r.textContent = "Routing", r.addEventListener("click", (e) => {
e.stopPropagation(), this.switchTab("routing", n, a);
}), n.appendChild(r);
let i = document.createElement("button");
i.type = "button", i.classList.add("tab-button"), i.textContent = "Isochrone", i.addEventListener("click", (e) => {
e.stopPropagation(), this.switchTab("isochrone", n, a);
}), n.appendChild(i), t.appendChild(n);
let a = document.createElement("div");
a.classList.add("tab-contents");
let o = this.createRoutingContent();
o.classList.add("tab-content", "active"), o.setAttribute("data-tab", "routing"), a.appendChild(o);
let s = this.createIsochroneContent();
return s.classList.add("tab-content"), s.setAttribute("data-tab", "isochrone"), a.appendChild(s), t.appendChild(a), e.appendChild(t), e;
});
}
switchTab(e, t, n) {
t.querySelectorAll(".tab-button").forEach((e) => e.classList.remove("active")), t.querySelector(`[data-tab="${e}"], :nth-child(${e === "routing" ? "1" : "2"})`)?.classList.add("active"), n.querySelectorAll(".tab-content").forEach((e) => e.classList.remove("active")), n.querySelector(`[data-tab="${e}"]`)?.classList.add("active");
}
createRoutingContent() {
let e = document.createElement("div"), t = document.createElement("div");
t.classList.add("setting-section");
let n = document.createElement("label");
n.textContent = "Means of Transport", n.classList.add("setting-label"), t.appendChild(n), t.appendChild(this.settingDialog.createSegmentButtons(Jr, this.routingCostingModel, (e) => {
this.valhallaOptions.routingOptions || (this.valhallaOptions.routingOptions = {}), this.valhallaOptions.routingOptions.costingModel = e, this.dispatchEvent("setting-changed");
})), e.appendChild(t);
let r = document.createElement("div");
r.classList.add("setting-section");
let i = document.createElement("label");
return i.textContent = "Distance Unit", i.classList.add("setting-label"), r.appendChild(i), r.appendChild(this.settingDialog.createSegmentButtons(Yr, this.routingDistanceUnit, (e) => {
this.valhallaOptions.routingOptions || (this.valhallaOptions.routingOptions = {}), this.valhallaOptions.routingOptions.distanceUnit = e, this.dispatchEvent("setting-changed");
})), e.appendChild(r), e;
}
createIsochroneContent() {
let e = document.createElement("div"), t = document.createElement("div");
t.classList.add("setting-section");
let n = document.createElement("label");
n.textContent = "Means of Transport (Time)", n.classList.add("setting-label"), t.appendChild(n), t.appendChild(this.settingDialog.createSegmentButtons(Jr, this.controlOptions.valhallaOptions?.isochroneOptions?.timeCostingModel || "auto", (e) => {
this.valhallaOptions.isochroneOptions || (this.valhallaOptions.isochroneOptions = {}), this.valhallaOptions.isochroneOptions.timeCostingModel = e, this.dispatchEvent("setting-changed");
})), e.appendChild(t);
let r = document.createElement("div");
r.classList.add("setting-section");
let i = document.createElement("label");
i.textContent = "Means of Transport (Distance)", i.classList.add("setting-label"), r.appendChild(i), r.appendChild(this.settingDialog.createSegmentButtons(Jr, this.controlOptions.valhallaOptions?.isochroneOptions?.distanceCostingModel || "auto", (e) => {
this.valhallaOptions.isochroneOptions || (this.valhallaOptions.isochroneOptions = {}), this.valhallaOptions.isochroneOptions.distanceCostingModel = e, this.dispatchEvent("setting-changed");
})), e.appendChild(r);
let a = document.createElement("div");
a.classList.add("setting-section");
let o = document.createElement("label");
o.textContent = "Contours", o.classList.add("setting-label"), a.appendChild(o);
let s = this.createContoursTable();
return a.appendChild(s), e.appendChild(a), e;
}
createContoursTable() {
let e = document.createElement("div");
e.classList.add("contours-table");
let t = document.createElement("table");
t.classList.add("contours-table-element");
let n = document.createElement("thead"), r = document.createElement("tr"), i = document.createElement("th");
i.textContent = "Color", r.appendChild(i);
let a = document.createElement("th");
a.textContent = "Time (min)", r.appendChild(a);
let o = document.createElement("th");
o.textContent = "Distance (km)", r.appendChild(o);
let s = document.createElement("th");
r.appendChild(s), n.appendChild(r), t.appendChild(n);
let c = document.createElement("tbody"), l = this.controlOptions.valhallaOptions?.isochroneOptions?.contours;
l.forEach((e, t) => {
let n = this.createContourRow(e, t);
c.appendChild(n);
}), t.appendChild(c), e.appendChild(t);
let u = document.createElement("button");
return u.type = "button", u.classList.add("add-row-button"), u.textContent = "Add Contour", u.hidden = l.length >= 4, u.addEventListener("click", (e) => {
e.stopPropagation();
let t = this.valhallaOptions.isochroneOptions?.contours, n = JSON.parse(JSON.stringify(t[t.length - 1])), r = c.children.length, i = this.createContourRow(n, r);
c.appendChild(i), t.push(n), this.updateAddRowButtonState(), this.dispatchEvent("setting-changed");
}), e.appendChild(u), e;
}
createContourRow(e, t) {
let n = document.createElement("tr");
n.setAttribute("data-index", t.toString());
let r = document.createElement("td"), i = document.createElement("input");
i.type = "color", i.value = e.color, i.classList.add("color-picker"), i.addEventListener("change", (e) => {
e.stopPropagation(), this.valhallaOptions.isochroneOptions?.contours && (this.valhallaOptions.isochroneOptions.contours[t].color = e.target.value, this.dispatchEvent("setting-changed"));
}), r.appendChild(i), n.appendChild(r);
let a = document.createElement("td"), o = document.createElement("input");
o.type = "number", o.value = e.time.toString(), o.min = "1", o.classList.add("number-input"), o.addEventListener("change", (e) => {
e.stopPropagation(), this.valhallaOptions.isochroneOptions?.contours && (this.valhallaOptions.isochroneOptions.contours[t].time = parseFloat(e.target.value), this.dispatchEvent("setting-changed"));
}), a.appendChild(o), n.appendChild(a);
let s = document.createElement("td"), c = document.createElement("input");
c.type = "number", c.value = e.distance.toString(), c.min = "0.1", c.step = "0.1", c.classList.add("number-input"), c.addEventListener("change", (e) => {
e.stopPropagation(), this.valhallaOptions.isochroneOptions?.contours && (this.valhallaOptions.isochroneOptions.contours[t].distance = parseFloat(e.target.value), this.dispatchEvent("setting-changed"));
}), s.appendChild(c), n.appendChild(s);
let l = document.createElement("td");
if (t > 0) {
let e = document.createElement("button");
e.type = "button", e.textContent = "×", e.classList.add("delete-button"), e.addEventListener("click", (e) => {
e.stopPropagation();
let t = parseInt(n.getAttribute("data-index") || "0");
n.remove(), this.valhallaOptions.isochroneOptions?.contours && this.valhallaOptions.isochroneOptions.contours.splice(t, 1);
let r = n.parentElement;
r && Array.from(r.children).forEach((e, t) => {
e.setAttribute("data-index", t.toString());
}), this.updateAddRowButtonState(), this.dispatchEvent("setting-changed");
}), l.appendChild(e);
}
return n.appendChild(l), n;
}
updateAddRowButtonState = () => {
let e = document.getElementsByClassName("add-row-button");
if (e && e.length > 0) {
let t = e.item(0);
t && (t.hidden = (this.controlOptions.valhallaOptions?.isochroneOptions?.contours).length >= 4);
}
};
addTerradrawButton(e) {
let t = document.createElement("button");
t.type = "button", this.modeButtons[e] = t, e === "settings" ? (t.classList.add(`maplibregl-terradraw-${this.cssPrefix}add-control`), t.classList.add(`maplibregl-terradraw-${this.cssPrefix}${e}-button`), t.addEventListener("click", this.handleSettingDialog.bind(this))) : super.addTerradrawButton(e);
}
handleSettingDialog() {
this.settingDialog?.open();
}
registerValhallaControl() {
if (!this.map) return;
let e = this.options.modes?.filter((e) => ["routing"].includes(e));
e && e.length > 0 && (this.map.getSource(this.controlOptions.routingLineLayerNodeSpec.source) || this.map.addSource(this.controlOptions.routingLineLayerNodeSpec.source, {
type: "geojson",
data: {
type: "FeatureCollection",
features: []
}
}), this.map.getLayer(this.controlOptions.routingLineLayerNodeSpec.id) || this.map.addLayer(this.controlOptions.routingLineLayerNodeSpec), this.map.getLayer(this.controlOptions.routingLineLayerNodeLabelSpec.id) || this.map.addLayer(this.controlOptions.routingLineLayerNodeLabelSpec));
let t = this.options.modes?.filter((e) => ["time-isochrone", "distance-isochrone"].includes(e));
if (t && t.length > 0 && (this.map.getSource(this.controlOptions.timeIsochronePolygonLayerSpec.source) || this.map.addSource(this.controlOptions.timeIsochronePolygonLayerSpec.source, {
type: "geojson",
data: {
type: "FeatureCollection",
features: []
}
}), this.map.getLayer(this.controlOptions.timeIsochronePolygonLayerSpec.id) || this.map.addLayer(this.controlOptions.timeIsochronePolygonLayerSpec), this.map.getLayer(this.controlOptions.timeIsochroneLineLayerSpec.id) || this.map.addLayer(this.controlOptions.timeIsochroneLineLayerSpec), this.map.getLayer(this.controlOptions.timeIsochroneLabelLayerSpec.id) || this.map.addLayer(this.controlOptions.timeIsochroneLabelLayerSpec), this.map.getSource(this.controlOptions.distanceIsochronePolygonLayerSpec.source) || this.map.addSource(this.controlOptions.distanceIsochronePolygonLayerSpec.source, {
type: "geojson",
data: {
type: "FeatureCollection",
features: []
}
}), this.map.getLayer(this.controlOptions.distanceIsochronePolygonLayerSpec.id) || this.map.addLayer(this.controlOptions.distanceIsochronePolygonLayerSpec), this.map.getLayer(this.controlOptions.distanceIsochroneLineLayerSpec.id) || this.map.addLayer(this.controlOptions.distanceIsochroneLineLayerSpec), this.map.getLayer(this.controlOptions.distanceIsochroneLabelLayerSpec.id) || this.map.addLayer(this.controlOptions.distanceIsochroneLabelLayerSpec)), (e && e.length > 0 || t && t.length > 0) && this.map) {
let e = this.getTerraDrawInstance();
e && (e.on("finish", this.handleTerradrawFeatureReady.bind(this)), this.on("feature-deleted", this.onFeatureDeleted.bind(this)));
}
}
unregisterValhallaControl() {
if (this.off("feature-deleted", this.onFeatureDeleted.bind(this)), !this.map) return;
this.map.getLayer(this.controlOptions.routingLineLayerNodeSpec.id) && this.map.removeLayer(this.controlOptions.routingLineLayerNodeSpec.id), this.map.getLayer(this.controlOptions.routingLineLayerNodeLabelSpec.id) && this.map.removeLayer(this.controlOptions.routingLineLayerNodeLabelSpec.id), this.map.getSource(this.controlOptions.routingLineLayerNodeSpec.source) && this.map.removeSource(this.controlOptions.routingLineLayerNodeSpec.source), this.map.getLayer(this.controlOptions.timeIsochronePolygonLayerSpec.id) && this.map.removeLayer(this.controlOptions.timeIsochronePolygonLayerSpec.id), this.map.getLayer(this.controlOptions.timeIsochroneLineLayerSpec.id) && this.map.removeLayer(this.controlOptions.timeIsochroneLineLayerSpec.id), this.map.getLayer(this.controlOptions.timeIsochroneLabelLayerSpec.id) && this.map.removeLayer(this.controlOptions.timeIsochroneLabelLayerSpec.id), this.map.getSource(this.controlOptions.timeIsochronePolygonLayerSpec.source) && this.map.removeSource(this.controlOptions.timeIsochronePolygonLayerSpec.source), this.map.getLayer(this.controlOptions.distanceIsochronePolygonLayerSpec.id) && this.map.removeLayer(this.controlOptions.distanceIsochronePolygonLayerSpec.id), this.map.getLayer(this.controlOptions.distanceIsochroneLineLayerSpec.id) && this.map.removeLayer(this.controlOptions.distanceIsochroneLineLayerSpec.id), this.map.getLayer(this.controlOptions.distanceIsochroneLabelLayerSpec.id) && this.map.removeLayer(this.controlOptions.distanceIsochroneLabelLayerSpec.id), this.map.getSource(this.controlOptions.distanceIsochronePolygonLayerSpec.source) && this.map.removeSource(this.controlOptions.distanceIsochronePolygonLayerSpec.source);
let e = this.getTerraDrawInstance();
e && e.off("finish", this.handleTerradrawFeatureReady.bind(this));
}
handleTerradrawFeatureReady = yr((e) => {
this.map && (this.computeRouteByLineFeatureID(e), this.computeIsochroneByPointFeatureID(e));
}, 300);
computeIsochroneByPointFeatureID = async (e) => {
if (!this.map || !this.valhallaOptions.url) return;
let t = this.terradraw?.getSnapshotFeature(e);
if (!t || t && t.geometry.type !== "Point") return;
let n = t.geometry.coordinates, r = t.properties.mode === "time-isochrone" ? "time" : "distance", i = r === "time" ? this.valhallaOptions.isochroneOptions?.timeCostingModel || "auto" : this.valhallaOptions.isochroneOptions?.distanceCostingModel || "auto", a = (await new qr(this.valhallaUrl).calcIsochrone(n[0], n[1], r, i, this.isochroneContours)).features.map((n) => (n.id = `${e}-${n.properties.contour}`, n.properties.originalId = e, n.properties.mode = t.properties.mode, n)), o = {
contourType: r,
costingModel: i,
result: a
};
if (t.properties = {
...t.properties,
...o
}, this.terradraw?.updateFeatureProperties(e, o), r === "time") {
let t = this.map.getStyle().sources[this.controlOptions.timeIsochronePolygonLayerSpec.source];
t && (typeof t.data != "string" && t.data.type === "FeatureCollection" && (t.data.features = t.data.features.filter((t) => t.properties?.originalId !== e)), typeof t.data != "string" && t.data.type === "FeatureCollection" && t.data.features.push(...a), this.map.getSource(this.controlOptions.timeIsochronePolygonLayerSpec.source)?.setData(t.data));
} else {
let t = this.map.getStyle().sources[this.controlOptions.distanceIsochronePolygonLayerSpec.source];
t && (typeof t.data != "string" && t.data.type === "FeatureCollection" && (t.data.features = t.data.features.filter((t) => t.properties?.originalId !== e)), typeof t.data != "string" && t.data.type === "FeatureCollection" && t.data.features.push(...a), this.map.getSource(this.controlOptions.distanceIsochronePolygonLayerSpec.source)?.setData(t.data)), this.map.moveLayer(this.controlOptions.timeIsochronePolygonLayerSpec.id, this.options.adapterOptions?.renderBelowLayerId), this.map.moveLayer(this.controlOptions.distanceIsochronePolygonLayerSpec.id, this.options.adapterOptions?.renderBelowLayerId), this.map.moveLayer(this.controlOptions.timeIsochroneLineLayerSpec.id, this.options.adapterOptions?.renderBelowLayerId), this.map.moveLayer(this.controlOptions.distanceIsochroneLineLayerSpec.id, this.options.adapterOptions?.renderBelowLayerId), this.map.moveLayer(this.controlOptions.timeIsochroneLabelLayerSpec.id, this.options.adapterOptions?.renderBelowLayerId), this.map.moveLayer(this.controlOptions.distanceIsochroneLabelLayerSpec.id, this.options.adapterOptions?.renderBelowLayerId);
}
};
computeRouteByLineFeatureID = async (t) => {
if (!this.map || !this.valhallaOptions.url) return;
let n = this.terradraw?.getSnapshotFeature(t);
if (!n || n && n.geometry.type !== "LineString") return;
let r = new Xr(this.valhallaUrl), i = n.geometry.coordinates.map((t) => {
let n = t;
return new e(n[0], n[1]);
});
if (!i || i && i.length < 2) return;
let a = await r.calcRoute(i, this.routingCostingModel, this.routingDistanceUnit);
if (!a || !a.feature) return;
let o = a?.feature.geometry;
this.terradraw?.updateFeatureGeometry(t, o), n.geometry = o, n.properties = {
...n.properties,
...a?.feature.properties
}, this.terradraw?.updateFeatureProperties(t, a?.feature.properties);
let s = (a?.pointFeatures).features.map((e) => (e.id = `${t}-${e.id}`, e.properties.originalId = t, e)), c = this.map.getStyle().sources[this.controlOptions.routingLineLayerNodeSpec.source];
c && (typeof c.data != "string" && c.data.type === "FeatureCollection" && (c.data.features = c.data.features.filter((e) => e.properties?.originalId !== t)), typeof c.data != "string" && c.data.type === "FeatureCollection" && c.data.features.push(...s), this.map.getSource(this.controlOptions.routingLineLayerNodeSpec.source)?.setData(c.data), this.map.moveLayer(this.controlOptions.routingLineLayerNodeSpec.id, this.options.adapterOptions?.renderBelowLayerId), this.map.moveLayer(this.controlOptions.routingLineLayerNodeLabelSpec.id, this.options.adapterOptions?.renderBelowLayerId));
};
onFeatureDeleted(e) {
if (this.map && this.getTerraDrawInstance()) {
let t = [];
typeof e == "object" && e && "deletedIds" in e && (t = e.deletedIds);
let n = [
this.controlOptions.routingLineLayerNodeSpec,
this.controlOptions.timeIsochronePolygonLayerSpec,
this.controlOptions.distanceIsochronePolygonLayerSpec
].map((e) => e.source);
t && t.length > 0 ? this.clearExtendedFeatures(n, t) : this.clearExtendedFeatures(n, void 0);
}
}
getFeatures(e = !1) {
let t = super.getFeatures(e);
if (!t || !this.terradraw || !this.map) return t;
let n = this.map.getStyle();
if (!n || !n.sources) return t;
let r = this.controlOptions.timeIsochronePolygonLayerSpec.source;
if (!r || !n.sources[r]) return t;
let i = this.controlOptions.distanceIsochronePolygonLayerSpec.source;
if (!i || !n.sources[i]) return t;
let a = n.sources[r], o = n.sources[i], s = [];
for (let e = 0; e < t.features.length; e++) {
let n = t.features[e];
if (n.geometry.type === "Point") {
let e = n.id;
if (a && typeof a.data != "string" && a.data.type === "FeatureCollection") {
let t = a.data.features.filter((t) => t.properties?.originalId === e);
s.push(n), t.length > 0 && s.push(...t);
}
if (o && typeof o.data != "string" && o.data.type === "FeatureCollection") {
let t = o.data.features.filter((t) => t.properties?.originalId === e);
s.push(n), t.length > 0 && s.push(...t);
}
} else s.push(n);
}
return {
type: "FeatureCollection",
features: s
};
}
};
//#endregion
export { Pn as AWS_ELEVATION_TILES, An as AvailableModes, jn as AvailableValhallaModes, Fn as MAPTERHORN_TILES, $r as MaplibreMeasureControl, Zr as MaplibreTerradrawControl, ei as MaplibreValhallaControl, br as MemoryCache, xr as ModalDialog, gr as TERRADRAW_MEASURE_SOURCE_IDS, Q as TERRADRAW_SOURCE_IDS, _r as TERRADRAW_VALHALLA_SOURCE_IDS, qr as ValhallaIsochrone, Xr as ValhallaRouting, or as calcArea, mr as calcDistance, hr as capitalize, vr as cleanMaplibreStyle, Kr as contourTypeOptions, nr as convertArea, ur as convertDistance, Z as convertElevation, Jr as costingModelOptions, yr as debounce, Mn as defaultControlOptions, In as defaultMeasureControlOptions, J as defaultMeasureUnitSymbols, Y as defaultValhallaControlOptions, zn as getDefaultModeOptions, Rn as polygonValidation, Sr as queryElevationByPoint, Wr as queryElevationFromRasterDEM, Gr as roundFeatureCoordinates, Yr as routingDistanceUnitOptions };
//# sourceMappingURL=maplibre-gl-terradraw.es.js.map