UNPKG

@web-map-service/map2d-app

Version:

基于openlayer的2D地图应用

975 lines (974 loc) 21.4 kB
import { getElementData as W, createMeasureInteractive as q, createDrawInteractive as J, createSelectInteractive as K, createMoveInteractive as Q, createModifyInteractive as ee, createMap as te, events as ne } from "@web-map-service/map2d"; let $ = 0; function A() { return { type: "element", install(r) { const t = r, n = [], o = r.emitter, i = { create(a) { $++; const { type: c, ...l } = a, s = i.getLayerByType(c); if (!s) return; const u = l.id !== void 0 ? l.id : $, m = s.create({ ...l, id: u }); return m ? (i.add(m), m.getSElement().setProps({ appLayerType: c, appElementId: m.id }), o.emit("element:created", m), m) : void 0; }, add(a) { if (!a) return; const c = Array.isArray(a) ? a : [a]; for (const l of c) { const s = i.getLayerByType(l.type); if (!s) return; s.add(l); } o.emit("element:added", c); }, remove(a) { if (!a) return; const c = Array.isArray(a) ? a : [a]; for (const l of c) { const s = i.getLayerByType(l.type); if (!s) return; s.remove(l); } o.emit("element:removed", c); }, getLayers() { return n; }, getLayerById(a) { return n.find((l) => l.id === a); }, getLayerByType(a) { return n.find((l) => l.type === a); }, addLayer(a) { n.push(a); }, removeLayer(a) { const c = n.findIndex((l) => l.id === a.id); c !== -1 && n.splice(c, 1); } }; return t.element = i, t; } }; } var g = /* @__PURE__ */ ((e) => (e.create = "element:created", e.add = "element:added", e.update = "element:update", e.remove = "element:removed", e))(g || {}); let L = 0, D = 0; function B(e, r) { L++; const { container: { layerManager: t } } = e.map, n = t.create({}), o = []; return { id: L, name: r.name, type: r.type, sElementType: r.sElementType, create(a) { return r.createElement(e, n, a); }, add(a) { o.findIndex((l) => l.id === a.id) === -1 && (n.add(a.getSElement()), o.push(a)); }, remove(a) { const c = o.findIndex((l) => l.id === a.id); c !== -1 && (n.remove(a.getSElement()), o.splice(c, 1)); }, getElements() { return o; }, getElementById(a) { return o.find((l) => l.id === a); } }; } function O(e, r, t) { D++; const n = r.create({ type: t.sElementType, data: t.data, rotate: t.rotate, style: t.style }, !1); return { id: t.id ?? D, type: t.type, name: t.name, get props() { return n.props; }, setProps(i) { return n.setProps(i); }, setName(i) { n.setName(i); }, get rotate() { return n.rotate; }, setRotate(i) { return n.setRotate(i); }, getSElement() { return n; }, get style() { return n.style; }, setStyle(i) { n.setStyle(i); }, get data() { return n.data; }, setData(i) { n.setData(i); } }; } function w(e, r) { const t = r.props.appLayerType, n = r.props.appElementId, o = e.element.getLayerByType(t); if (!o) return; const i = o.getElementById(n); if (i) return i; } function k(e, r) { const t = [], n = []; for (const o of r) { const a = o.getOlFeature().getGeometry(); if (!a) continue; const c = W(a), l = w(e, o); l && c && (t.push(l), n.push({ element: l, data: { data: c } })); } return M(n, e.emitter), t; } function re(e) { const r = e.element, t = e.data; t.data && r.setData(t.data), t.name && r.setName(t.name), t.rotate && r.setRotate(t.rotate), t.style && r.setStyle(t.style); } function M(e, r, t = !0) { if (r.emit(g.update, e), !!t) for (const n of e) re(n); } const oe = "#f0fae6", x = "ap"; function le(e, r, t) { return O(e, r, { ...t, ...{ type: x, sElementType: "circle", style: { fill: { color: oe } } } }); } function R() { let e; return { type: x, install(t) { e = t; const n = B(e, { type: x, createElement: le, sElementType: ["circle"] }); return e.element.addLayer(n), e; } }; } const ae = "#f0fae6", T = "area"; function ie(e, r, t) { return O(e, r, { ...t, ...{ type: T, style: { fill: { color: ae } } } }); } function X() { let e; return { type: T, install(t) { e = t; const n = B(e, { type: T, createElement: ie, sElementType: ["rect", "polygon", "circle"] }); return e.element.addLayer(n), e; } }; } const Oe = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ __proto__: null, ElementEmitter: g, createApPlugin: R, createAreaPlugin: X, createElementPlugin: A, getElementBySElement: w, setElementsData: M, syncElementsDataEmit: k }, Symbol.toStringTag, { value: "Module" })); function ce(e) { for (const r of Object.values(e.tools)) r.close(); } function j() { let e; return { type: "tool", install(t) { return e = t, e.tools = {}, e; } }; } function se(e) { const { interactiveManager: r, emitter: t } = e.map; function n(a) { e.emitter.emit("measure", a); } const o = q(r), i = { enabled: !1, enable() { i.enabled || (i.enabled = !0, t.on("measure", n), o.enable()); }, use(a) { o.use(a); }, close() { i.enabled && (i.enabled = !1, t.remove("measure", n), o.close()); } }; return i; } function Y() { let e; return { type: "measure", install(t) { return e = t, e.tools.measure = se(e), e; } }; } function ue(e) { var s; const { interactiveManager: r, emitter: t } = e.map, n = J(r); let i = ((s = e.element.getLayers()) == null ? void 0 : s[0]).type, a; function c(u) { const m = e.element.create({ type: i, data: u.data, sElementType: a }); e.emitter.emit("draw", m); } const l = { enabled: !1, enable() { l.enabled || (l.enabled = !0, t.on("draw", c), l.use(i), n.enable()); }, use(u, m) { i = u; const f = e.element.getLayerByType(i); f && (a = m ?? f.sElementType[0], !(!a || !f.sElementType.includes(a)) && n.use(a)); }, close() { l.enabled && (l.enabled = !1, t.remove("draw", c), n.close()); } }; return l; } function _() { let e; return { type: "draw", install(t) { return e = t, e.tools.draw = ue(e), e; } }; } function me(e) { const { interactiveManager: r, emitter: t } = e.map, n = K(r); let o = []; function i(c) { const l = Array.isArray(c) ? c : []; o = []; for (const s of l) { const u = w(e, s); u && o.push(u); } e.emitter.emit("element:select", o); } const a = { enabled: !1, enable() { a.enabled || (a.enabled = !0, n.enable(), t.on("element:select", i)); }, add(c) { n.add(c.getSElement()); }, remove(c) { n.remove(c.getSElement()); }, getSelected() { return o; }, clean() { n.clean(); }, close() { a.enabled && (a.enabled = !1, n.clean(), t.remove("element:select", i), n.close()); } }; return a; } function C() { let e; return { type: "select", install(t) { return e = t, e.tools.select = me(e), e; } }; } function fe(e) { const { interactiveManager: r, emitter: t } = e.map, n = Q(r, !1), { select: o } = e.tools; function i(l) { if (!l || l.length === 0) return; const s = k(e, l); e.emitter.emit("element:move", s); } e.emitter.on("element:select", (l) => { c.clean(); for (const s of l) c.add(s); }); let a = []; const c = { enabled: !1, add(l) { !l || a.findIndex((u) => u.id === l.id) !== -1 || (n.add(l.getSElement()), a.push(l)); }, remove(l) { if (!l) return; const s = a.findIndex((u) => u.id === l.id); s !== -1 && (n.remove(l.getSElement()), a.splice(s, 1)); }, clean() { n.clean(), a = []; }, enable() { c.enabled || (c.enabled = !0, t.on("element:move", i), n.enable(), o.enable()); }, close() { c.enabled && (c.enabled = !1, t.remove("element:move", i), n.close(), o.close()); } }; return c; } function N() { let e; return { type: "move", install(t) { return e = t, e.tools.move = fe(e), e; } }; } function de(e) { const { interactiveManager: r, emitter: t } = e.map, n = ee(r, !1), { select: o } = e.tools; function i(l) { if (!l || l.length === 0) return; const s = k(e, l); e.emitter.emit("element:modify", s); } e.emitter.on("element:select", (l) => { c.clean(); for (const s of l) c.add(s); }); let a = []; const c = { enabled: !1, add(l) { a.findIndex((u) => u.id === l.id) === -1 && (n.add(l.getSElement()), a.push(l)); }, remove(l) { n.remove(l.getSElement()); const s = a.findIndex((u) => u.id === l.id); s !== -1 && a.splice(s, 1); }, clean() { n.clean(), a = []; }, enable() { c.enabled || (c.enabled = !0, t.on("element:modify", i), n.enable(), o.enable()); }, close() { c.enabled && (c.enabled = !1, t.remove("element:modify", i), n.close(), o.close()); } }; return c; } function z() { let e; return { type: "modify", install(t) { return e = t, e.tools.modify = de(e), e; } }; } function ge(e) { const r = e.tools.move, t = e.tools.modify; function n(i) { e.emitter.emit("element:edit", i); } const o = { enabled: !1, enable() { o.enabled || (o.enabled = !0, r.enable(), t.enable(), e.emitter.on("element:move", n), e.emitter.on("element:modify", n)); }, close() { o.enabled && (o.enabled = !1, r.clean(), t.clean(), r.close(), t.close(), e.emitter.remove("element:move", n), e.emitter.remove("element:modify", n)); } }; return o; } function F() { let e; return { type: "edit", depend: ["select", "move", "modify"], install(t) { return e = t, e.tools.edit = ge(e), e; } }; } function E(e, r = /* @__PURE__ */ new WeakMap()) { if (e === null || typeof e != "object") return e; if (e instanceof Date) return new Date(e); if (e instanceof RegExp) return new RegExp(e); if (r.has(e)) return r.get(e); const t = new e.constructor(); return r.set(e, t), Array.isArray(e) ? e.forEach((n, o) => { t[o] = E(n, r); }) : Object.keys(e).forEach((n) => { t[n] = E(e[n], r); }), t; } function S(e) { return e == null; } function ye(e, r) { const t = r.data.map((n) => n.element); e.element.add(t); } function pe(e, r) { const t = r.data.map((n) => n.element); e.element.remove(t); } function I(e, r, t = !1) { var o, i, a, c; const n = []; for (const l of r.data) { if ((o = l.data) != null && o.data) { const s = l.rawData.data, u = l.data.data; l.element.setData(t ? s : u); } if ((i = l.data) != null && i.style) { const s = l.rawData.style, u = l.data.style; l.element.setStyle(t ? s : u); } if ((a = l.data) != null && a.name) { const s = l.rawData.name, u = l.data.name; l.element.setName(t ? s : u); } if ((c = l.data) != null && c.rotate) { const s = l.rawData.rotate, u = l.data.rotate; l.element.setRotate(t ? s : u); } n.push(l.element); } return n; } function be(e) { let r = [], n = -1, o = !1; function i(m) { if (r.length >= 50) { r.shift(), r.push(m); return; } r = r.slice(0, n + 1), r.push(m), n++; } function a(m) { o = !0; const f = r[n]; m === "next" && f.type === "add" || m === "back" && f.type === "remove" ? ye(e, f) : m === "next" && f.type === "remove" || m === "back" && f.type === "add" ? pe(e, f) : f.type === "update" && (m === "next" ? I(e, f, !1) : I(e, f, !0)), e.emitter.emit("history", { max: 50, pointer: n, data: f.data, type: f.type }), o = !1; } function c(m) { if (o) return; const f = []; for (const d of m) f.push({ element: d }); i({ type: "add", data: f }); } function l(m) { if (o) return; const f = []; for (const d of m) f.push({ element: d.element, rawData: { data: E(d.element.data), style: E(d.element.style), name: E(d.element.name), rotate: E(d.element.rotate) }, data: d.data }); i({ type: "update", data: f }); } function s(m) { if (o) return; const f = []; for (const d of m) f.push({ element: d }); i({ type: "remove", data: f }); } const u = { enabled: !1, enable() { u.enabled || (e.emitter.on(g.add, c), e.emitter.on(g.remove, s), e.emitter.on(g.update, l), u.enabled = !0); }, close() { u.enabled && (e.emitter.remove(g.add, c), e.emitter.remove(g.remove, s), e.emitter.remove(g.update, l), u.enabled = !1); }, next() { n !== r.length - 1 && (n++, a("next")); }, back() { n !== -1 && (a("back"), n--); }, clean() { r = []; } }; return u; } function Z() { let e; return { type: "history", install(t) { return e = t, e.tools.history = be(e), e; } }; } function ve(e) { const { emitter: r } = e.map; function t(i) { e.emitter.emit("click", i); } function n(i) { e.emitter.emit("move", i); } const o = { enabled: !1, enable() { o.enabled || (o.enabled = !0, r.on("click", t), r.on("move", n)); }, close() { o.enabled && (o.enabled = !1, r.remove("click", t), r.remove("move", n)); } }; return o; } function G() { let e; return { type: "event", install(t) { return e = t, e.tools.event = ve(e), e; } }; } function Ee(e) { const [r, t] = e; if (r <= 0) return [0, 1]; const n = Math.log2(r), o = n + t; let i; return 2 ** o > 1 ? i = 3 : 2 ** o === 1 ? i = 2 : i = 1, [n, i]; } let P = [0.25, 8], b = 1; function he(e) { const { view: r, baseMap: t } = e, n = t.getExtent(), o = { enabled: !1, enable() { o.enabled || (o.enabled = !0); }, setView(i) { if (!o.enabled) return; P = Ee(i); const [a, c] = P, l = r.getZoom(); r.setMaxZoom(l + c), r.setMinZoom(l + a), e.emitter.emit("scale", { scale: b, range: P }); }, fit(i) { if (!o.enabled) return; b = i; const a = n[3] - n[0], c = (a - a / b) / 2, l = c, s = c, u = c + a / b, m = c + a / b; r.fit([l, s, u, m]), e.emitter.emit("scale", { scale: b, range: P }); }, close() { o.enabled && (o.enabled = !1); } }; return o; } function H() { let e; return { type: "scale", install(t) { return e = t, e.tools.scale = he(e), e; } }; } function v(e, r) { const t = r.getSElement(); let n; if (t.type === "circle") { const o = t.data.radius; e === "left" && (n = t.data.center[0] - o), e === "right" && (n = t.data.center[0] + o), e === "top" && (n = t.data.center[1] + o), e === "bottom" && (n = t.data.center[1] - o); } else for (const o of t.data) { if (e === "left" || e === "right") { if (S(n)) { n = o[0]; continue; } if (e === "left") { n = n < o[0] ? n : o[0]; continue; } if (e === "right") { n = n > o[0] ? n : o[0]; continue; } } if (e === "top" || e === "bottom") { if (S(n)) { n = o[1]; continue; } if (e === "top") { n = n > o[1] ? n : o[1]; continue; } if (e === "bottom") { n = n < o[1] ? n : o[1]; continue; } } } return n; } function p(e, r) { let t; for (const n of r) { let o = !1; const i = v(e, n); if (S(t)) { t = i; continue; } e === "left" && (o = t > i), e === "right" && (o = t < i), e === "top" && (o = t < i), e === "bottom" && (o = t > i), o && (t = i); } return t; } function h(e, r, t, n) { const o = []; for (const i of n) { const a = i.getSElement(), c = v(e, i), l = t - c; let s = []; if (a.type === "circle") { let u, m; (e === "left" || e === "right") && (u = a.data.center[0] + l, m = a.data.center[1]), (e === "top" || e === "bottom") && (u = a.data.center[0], m = a.data.center[1] + l), e === "centerX" && (u = t, m = a.data.center[1]), e === "centerY" && (u = a.data.center[0], m = t), s = { radius: a.data.radius, center: [u, m] }; } else { if (s = [], e === "left" || e === "right") for (const u of a.data) s.push([u[0] + l, u[1]]); if (e === "top" || e === "bottom") for (const u of a.data) s.push([u[0], u[1] + l]); if (e === "centerX") { const u = v("left", i), f = (v("right", i) + u) / 2 - t; for (const y of a.data) s.push([y[0] - f, y[1]]); } if (e === "centerY") { const u = v("top", i), m = v("bottom", i), f = (u + m) / 2 - t; for (const y of a.data) s.push([y[0], y[1] - f]); } } o.push({ element: i, data: { data: s } }); } M(o, r.emitter), r.emitter.emit("rank", { elements: n, type: e, extreme: t }); } function Pe(e, r) { const t = p("left", r); h("left", e, t, r); } function xe(e, r) { const t = p("right", r); h("right", e, t, r); } function Te(e, r) { const t = p("top", r); h("top", e, t, r); } function Se(e, r) { const t = p("bottom", r); h("bottom", e, t, r); } function we(e, r) { const t = p("left", r), n = p("right", r), o = (t + n) / 2; h("centerX", e, o, r); } function ke(e, r) { const t = p("top", r), n = p("bottom", r), o = (t + n) / 2; h("centerY", e, o, r); } function Me(e) { const r = e.tools.select, t = { enabled: !1, enable() { t.enabled || (t.enabled = !0); }, use(n) { if (!t.enabled) return; const o = r.getSelected(); if (!(o.length < 2)) { if (n === "left") { Pe(e, o); return; } if (n === "right") { xe(e, o); return; } if (n === "centerX") { we(e, o); return; } if (n === "centerY") { ke(e, o); return; } if (n === "top") { Te(e, o); return; } if (n === "bottom") { Se(e, o); return; } } }, close() { t.enabled && (t.enabled = !1); } }; return t; } function U() { let e; return { type: "rank", depend: ["select"], install(t) { return e = t, e.tools.rank = Me(e), e; } }; } const Re = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ __proto__: null, closeTools: ce, createDrawPlugin: _, createEditPlugin: F, createEventPlugin: G, createHistoryPlugin: Z, createMeasurePlugin: Y, createModifyPlugin: z, createMovePlugin: N, createRankPlugin: U, createScalePlugin: H, createSelectPlugin: C, createToolPlugin: j }, Symbol.toStringTag, { value: "Module" })), V = { ap: R(), area: X(), measure: Y(), draw: _(), select: C(), move: N(), modify: z(), edit: F(), history: Z(), event: G(), scale: H(), rank: U() }, $e = [ { type: "ap" }, { type: "area" } ], Le = [ { type: "measure" }, { type: "draw" }, { type: "select" }, { type: "move" }, { type: "modify" }, { type: "edit" }, { type: "history" }, { type: "event" }, { type: "scale" }, { type: "rank" } ]; function De(e, r) { for (const t of r) if (!e.getPluginByType(t)) return !1; return !0; } function Ie(e, r, t) { if (r.depend && r.depend.length > 0) { for (const o of r.depend) { const i = V[o]; i && e.use(i, t); } return De(e, r.depend); } return !0; } function Ae(e, r) { const t = r ?? $e.concat(Le); e.use(A()), e.use(j()); for (const n of t) { const o = V[n.type]; e.use(o, r); } } function Xe(e) { const r = te({ el: e.el, baseMap: e.baseMap, view: e.view }), { container: { baseMap: t }, view: n } = r, o = [], i = ne.emitter.createEmitter(), a = { baseMap: t, view: n, emitter: i, get plugins() { return o; }, get map() { return r; }, getPluginByType(c) { return o.find((l) => l.type === c); }, use(c, l) { return a.getPluginByType(c.type) || !Ie(a, c, l) || (c.install(a, l), o.push(c)), a; } }; return Ae(a, e.plugins), a; } export { Xe as createApp, Oe as elements, Re as tools };