@web-map-service/map2d-app
Version:
基于openlayer的2D地图应用
975 lines (974 loc) • 21.4 kB
JavaScript
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
};