deeptwins-engine-3d 0.1.63 → 0.1.64
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/assets/Build/DeepTwins/Workers/MvtVector.worker.js +1 -0
- package/dist/esm/drawer/index.d.ts +1 -1
- package/dist/esm/graphicLayer/BaseSource.d.ts +1 -1
- package/dist/esm/index.d.ts +1 -0
- package/dist/esm/index.js +5 -3
- package/dist/esm/plot/utils/Coordinate.d.ts +1 -1
- package/dist/esm/tileLayer/MvtVectorLoad.d.ts +241 -0
- package/dist/esm/tileLayer/MvtVectorLoad.js +1353 -0
- package/dist/esm/tileLayer/MvtVectorWorkerClient.d.ts +25 -0
- package/dist/esm/tileLayer/MvtVectorWorkerClient.js +126 -0
- package/dist/umd/deeptwins-engine-3d.min.js +1 -1
- package/package.json +2 -1
- package/dist/assets/Build/DeepTwins/Image/compass/pointer-white.png +0 -0
|
@@ -0,0 +1,1353 @@
|
|
|
1
|
+
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
2
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
3
|
+
function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
|
|
4
|
+
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
5
|
+
function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
|
|
6
|
+
function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
|
|
7
|
+
function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return e; }; var t, e = {}, r = Object.prototype, n = r.hasOwnProperty, o = Object.defineProperty || function (t, e, r) { t[e] = r.value; }, i = "function" == typeof Symbol ? Symbol : {}, a = i.iterator || "@@iterator", c = i.asyncIterator || "@@asyncIterator", u = i.toStringTag || "@@toStringTag"; function define(t, e, r) { return Object.defineProperty(t, e, { value: r, enumerable: !0, configurable: !0, writable: !0 }), t[e]; } try { define({}, ""); } catch (t) { define = function define(t, e, r) { return t[e] = r; }; } function wrap(t, e, r, n) { var i = e && e.prototype instanceof Generator ? e : Generator, a = Object.create(i.prototype), c = new Context(n || []); return o(a, "_invoke", { value: makeInvokeMethod(t, r, c) }), a; } function tryCatch(t, e, r) { try { return { type: "normal", arg: t.call(e, r) }; } catch (t) { return { type: "throw", arg: t }; } } e.wrap = wrap; var h = "suspendedStart", l = "suspendedYield", f = "executing", s = "completed", y = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var p = {}; define(p, a, function () { return this; }); var d = Object.getPrototypeOf, v = d && d(d(values([]))); v && v !== r && n.call(v, a) && (p = v); var g = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(p); function defineIteratorMethods(t) { ["next", "throw", "return"].forEach(function (e) { define(t, e, function (t) { return this._invoke(e, t); }); }); } function AsyncIterator(t, e) { function invoke(r, o, i, a) { var c = tryCatch(t[r], t, o); if ("throw" !== c.type) { var u = c.arg, h = u.value; return h && "object" == _typeof(h) && n.call(h, "__await") ? e.resolve(h.__await).then(function (t) { invoke("next", t, i, a); }, function (t) { invoke("throw", t, i, a); }) : e.resolve(h).then(function (t) { u.value = t, i(u); }, function (t) { return invoke("throw", t, i, a); }); } a(c.arg); } var r; o(this, "_invoke", { value: function value(t, n) { function callInvokeWithMethodAndArg() { return new e(function (e, r) { invoke(t, n, e, r); }); } return r = r ? r.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(e, r, n) { var o = h; return function (i, a) { if (o === f) throw new Error("Generator is already running"); if (o === s) { if ("throw" === i) throw a; return { value: t, done: !0 }; } for (n.method = i, n.arg = a;;) { var c = n.delegate; if (c) { var u = maybeInvokeDelegate(c, n); if (u) { if (u === y) continue; return u; } } if ("next" === n.method) n.sent = n._sent = n.arg;else if ("throw" === n.method) { if (o === h) throw o = s, n.arg; n.dispatchException(n.arg); } else "return" === n.method && n.abrupt("return", n.arg); o = f; var p = tryCatch(e, r, n); if ("normal" === p.type) { if (o = n.done ? s : l, p.arg === y) continue; return { value: p.arg, done: n.done }; } "throw" === p.type && (o = s, n.method = "throw", n.arg = p.arg); } }; } function maybeInvokeDelegate(e, r) { var n = r.method, o = e.iterator[n]; if (o === t) return r.delegate = null, "throw" === n && e.iterator.return && (r.method = "return", r.arg = t, maybeInvokeDelegate(e, r), "throw" === r.method) || "return" !== n && (r.method = "throw", r.arg = new TypeError("The iterator does not provide a '" + n + "' method")), y; var i = tryCatch(o, e.iterator, r.arg); if ("throw" === i.type) return r.method = "throw", r.arg = i.arg, r.delegate = null, y; var a = i.arg; return a ? a.done ? (r[e.resultName] = a.value, r.next = e.nextLoc, "return" !== r.method && (r.method = "next", r.arg = t), r.delegate = null, y) : a : (r.method = "throw", r.arg = new TypeError("iterator result is not an object"), r.delegate = null, y); } function pushTryEntry(t) { var e = { tryLoc: t[0] }; 1 in t && (e.catchLoc = t[1]), 2 in t && (e.finallyLoc = t[2], e.afterLoc = t[3]), this.tryEntries.push(e); } function resetTryEntry(t) { var e = t.completion || {}; e.type = "normal", delete e.arg, t.completion = e; } function Context(t) { this.tryEntries = [{ tryLoc: "root" }], t.forEach(pushTryEntry, this), this.reset(!0); } function values(e) { if (e || "" === e) { var r = e[a]; if (r) return r.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) { var o = -1, i = function next() { for (; ++o < e.length;) if (n.call(e, o)) return next.value = e[o], next.done = !1, next; return next.value = t, next.done = !0, next; }; return i.next = i; } } throw new TypeError(_typeof(e) + " is not iterable"); } return GeneratorFunction.prototype = GeneratorFunctionPrototype, o(g, "constructor", { value: GeneratorFunctionPrototype, configurable: !0 }), o(GeneratorFunctionPrototype, "constructor", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, u, "GeneratorFunction"), e.isGeneratorFunction = function (t) { var e = "function" == typeof t && t.constructor; return !!e && (e === GeneratorFunction || "GeneratorFunction" === (e.displayName || e.name)); }, e.mark = function (t) { return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, define(t, u, "GeneratorFunction")), t.prototype = Object.create(g), t; }, e.awrap = function (t) { return { __await: t }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, c, function () { return this; }), e.AsyncIterator = AsyncIterator, e.async = function (t, r, n, o, i) { void 0 === i && (i = Promise); var a = new AsyncIterator(wrap(t, r, n, o), i); return e.isGeneratorFunction(r) ? a : a.next().then(function (t) { return t.done ? t.value : a.next(); }); }, defineIteratorMethods(g), define(g, u, "Generator"), define(g, a, function () { return this; }), define(g, "toString", function () { return "[object Generator]"; }), e.keys = function (t) { var e = Object(t), r = []; for (var n in e) r.push(n); return r.reverse(), function next() { for (; r.length;) { var t = r.pop(); if (t in e) return next.value = t, next.done = !1, next; } return next.done = !0, next; }; }, e.values = values, Context.prototype = { constructor: Context, reset: function reset(e) { if (this.prev = 0, this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = "next", this.arg = t, this.tryEntries.forEach(resetTryEntry), !e) for (var r in this) "t" === r.charAt(0) && n.call(this, r) && !isNaN(+r.slice(1)) && (this[r] = t); }, stop: function stop() { this.done = !0; var t = this.tryEntries[0].completion; if ("throw" === t.type) throw t.arg; return this.rval; }, dispatchException: function dispatchException(e) { if (this.done) throw e; var r = this; function handle(n, o) { return a.type = "throw", a.arg = e, r.next = n, o && (r.method = "next", r.arg = t), !!o; } for (var o = this.tryEntries.length - 1; o >= 0; --o) { var i = this.tryEntries[o], a = i.completion; if ("root" === i.tryLoc) return handle("end"); if (i.tryLoc <= this.prev) { var c = n.call(i, "catchLoc"), u = n.call(i, "finallyLoc"); if (c && u) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } else if (c) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); } else { if (!u) throw new Error("try statement without catch or finally"); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } } } }, abrupt: function abrupt(t, e) { for (var r = this.tryEntries.length - 1; r >= 0; --r) { var o = this.tryEntries[r]; if (o.tryLoc <= this.prev && n.call(o, "finallyLoc") && this.prev < o.finallyLoc) { var i = o; break; } } i && ("break" === t || "continue" === t) && i.tryLoc <= e && e <= i.finallyLoc && (i = null); var a = i ? i.completion : {}; return a.type = t, a.arg = e, i ? (this.method = "next", this.next = i.finallyLoc, y) : this.complete(a); }, complete: function complete(t, e) { if ("throw" === t.type) throw t.arg; return "break" === t.type || "continue" === t.type ? this.next = t.arg : "return" === t.type ? (this.rval = this.arg = t.arg, this.method = "return", this.next = "end") : "normal" === t.type && e && (this.next = e), y; }, finish: function finish(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.finallyLoc === t) return this.complete(r.completion, r.afterLoc), resetTryEntry(r), y; } }, catch: function _catch(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.tryLoc === t) { var n = r.completion; if ("throw" === n.type) { var o = n.arg; resetTryEntry(r); } return o; } } throw new Error("illegal catch attempt"); }, delegateYield: function delegateYield(e, r, n) { return this.delegate = { iterator: values(e), resultName: r, nextLoc: n }, "next" === this.method && (this.arg = t), y; } }, e; }
|
|
8
|
+
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
|
|
9
|
+
function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
|
|
10
|
+
function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
|
|
11
|
+
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
|
|
12
|
+
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
13
|
+
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
14
|
+
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
|
|
15
|
+
function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
|
|
16
|
+
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
|
17
|
+
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
|
|
18
|
+
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
19
|
+
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } }
|
|
20
|
+
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
|
|
21
|
+
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
22
|
+
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
|
|
23
|
+
function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
24
|
+
// @ts-ignore
|
|
25
|
+
import { decodeTile } from '@deepinnet/geojson-to-mvt';
|
|
26
|
+
import * as Cesium from 'deeptwins-cesium';
|
|
27
|
+
import MvtVectorWorkerClient from "./MvtVectorWorkerClient";
|
|
28
|
+
var MVT_VECTOR_LOAD_EVENT_TYPES = ['ready', 'error', 'tileLoad', 'tileDisplay', 'tileEvict'];
|
|
29
|
+
// deeptwins-cesium 运行时暴露了 TileBoundingRegion,但声明文件里没有导出,这里补一层最小类型。
|
|
30
|
+
var CesiumRuntime = Cesium;
|
|
31
|
+
var CesiumMath = Cesium.Math;
|
|
32
|
+
function addCesiumEventListener(event, listener) {
|
|
33
|
+
return event.addEventListener(listener);
|
|
34
|
+
}
|
|
35
|
+
function removeAllEventListeners(event) {
|
|
36
|
+
var _removeAll, _ref;
|
|
37
|
+
(_removeAll = (_ref = event).removeAll) === null || _removeAll === void 0 || _removeAll.call(_ref);
|
|
38
|
+
}
|
|
39
|
+
function createListenerRegistry() {
|
|
40
|
+
return {
|
|
41
|
+
ready: [],
|
|
42
|
+
error: [],
|
|
43
|
+
tileLoad: [],
|
|
44
|
+
tileDisplay: [],
|
|
45
|
+
tileEvict: []
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// 矢量瓦片加载器
|
|
50
|
+
var MvtVectorLoad = /*#__PURE__*/function () {
|
|
51
|
+
function MvtVectorLoad(map) {
|
|
52
|
+
var _options$url,
|
|
53
|
+
_options$minzoom,
|
|
54
|
+
_options$maxzoom,
|
|
55
|
+
_options$maxCacheSize,
|
|
56
|
+
_options$autoDisplayL,
|
|
57
|
+
_options$decodeWithWo,
|
|
58
|
+
_options$workerUrl,
|
|
59
|
+
_this = this;
|
|
60
|
+
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
61
|
+
_classCallCheck(this, MvtVectorLoad);
|
|
62
|
+
_defineProperty(this, "_mapContext", void 0);
|
|
63
|
+
// 矢量瓦片服务 URL 模板。
|
|
64
|
+
_defineProperty(this, "url", void 0);
|
|
65
|
+
// 允许加载的最小瓦片层级。
|
|
66
|
+
// 低于该层级时不会显示,也不会发起请求。
|
|
67
|
+
_defineProperty(this, "minzoom", void 0);
|
|
68
|
+
// 允许加载的最大瓦片层级。
|
|
69
|
+
_defineProperty(this, "maximumLevel", void 0);
|
|
70
|
+
// 已加载瓦片缓存上限,默认 300。
|
|
71
|
+
_defineProperty(this, "maxCacheSize", void 0);
|
|
72
|
+
// 是否已完成初始化。
|
|
73
|
+
_defineProperty(this, "ready", void 0);
|
|
74
|
+
// 当前视角计算出的工作层级。
|
|
75
|
+
_defineProperty(this, "zoom", void 0);
|
|
76
|
+
// 当前加载器使用的 Cesium 切片方案。
|
|
77
|
+
_defineProperty(this, "tilingScheme", void 0);
|
|
78
|
+
// 初始化完成时触发的事件。
|
|
79
|
+
_defineProperty(this, "readyEvent", void 0);
|
|
80
|
+
// 请求或解析失败时触发的事件。
|
|
81
|
+
_defineProperty(this, "errorEvent", void 0);
|
|
82
|
+
// 单个瓦片加载完成时触发的事件。
|
|
83
|
+
_defineProperty(this, "tileLoadEvent", void 0);
|
|
84
|
+
// 瓦片显示状态变化时触发的事件。
|
|
85
|
+
_defineProperty(this, "tileDisplayEvent", void 0);
|
|
86
|
+
// 单个瓦片被 LRU 缓存淘汰时触发的事件。
|
|
87
|
+
_defineProperty(this, "tileEvictEvent", void 0);
|
|
88
|
+
// 当前实例是否已销毁。
|
|
89
|
+
_defineProperty(this, "_destroyed", void 0);
|
|
90
|
+
// 初始化 Promise 缓存,保证初始化过程只执行一次。
|
|
91
|
+
_defineProperty(this, "_initPromise", void 0);
|
|
92
|
+
// 第 0 层根瓦片节点。
|
|
93
|
+
_defineProperty(this, "_rootTiles", void 0);
|
|
94
|
+
// 当前帧需要更新的瓦片节点。
|
|
95
|
+
_defineProperty(this, "_tilesToUpdate", void 0);
|
|
96
|
+
// 已加载完成的瓦片缓存。
|
|
97
|
+
_defineProperty(this, "_loadedTiles", void 0);
|
|
98
|
+
// 正在请求中的瓦片 Promise,避免重复请求。
|
|
99
|
+
_defineProperty(this, "_pendingTiles", void 0);
|
|
100
|
+
// LRU 缓存访问顺序,越靠后表示越新。
|
|
101
|
+
_defineProperty(this, "_cacheOrder", void 0);
|
|
102
|
+
// 请求版本号,用于在清缓存后废弃旧请求结果。
|
|
103
|
+
_defineProperty(this, "_requestToken", void 0);
|
|
104
|
+
// 第 0 层瓦片的几何误差缓存。
|
|
105
|
+
_defineProperty(this, "_levelZeroMaximumGeometricError", void 0);
|
|
106
|
+
// 是否优先使用 Worker 解析 MVT 二进制。
|
|
107
|
+
_defineProperty(this, "_decodeWithWorker", void 0);
|
|
108
|
+
// 是否自动根据瓦片显示状态切换托管图层显隐。
|
|
109
|
+
_defineProperty(this, "_autoDisplayLayers", void 0);
|
|
110
|
+
// 自定义 Worker 地址,优先于默认 DeepTwins 静态资源地址。
|
|
111
|
+
_defineProperty(this, "_workerUrl", void 0);
|
|
112
|
+
// 延迟创建的解码 Worker 客户端。
|
|
113
|
+
_defineProperty(this, "_decodeWorkerClient", void 0);
|
|
114
|
+
// 统一事件监听注册表,供 on/off 管理解绑。
|
|
115
|
+
_defineProperty(this, "_listenerRegistry", void 0);
|
|
116
|
+
// 当前真正处于显示状态的瓦片集合。
|
|
117
|
+
_defineProperty(this, "_displayedTiles", void 0);
|
|
118
|
+
// tileLoad 返回的图层实例,按瓦片 key 自动显隐和移除。
|
|
119
|
+
_defineProperty(this, "_managedTileLayers", void 0);
|
|
120
|
+
// 是否已自动挂载到 map.scene.primitives。
|
|
121
|
+
_defineProperty(this, "_addedToMap", void 0);
|
|
122
|
+
this._mapContext = map;
|
|
123
|
+
this.url = (_options$url = options.url) !== null && _options$url !== void 0 ? _options$url : '';
|
|
124
|
+
this.minzoom = (_options$minzoom = options.minzoom) !== null && _options$minzoom !== void 0 ? _options$minzoom : 0;
|
|
125
|
+
this.maximumLevel = (_options$maxzoom = options.maxzoom) !== null && _options$maxzoom !== void 0 ? _options$maxzoom : 24;
|
|
126
|
+
this.maxCacheSize = (_options$maxCacheSize = options.maxCacheSize) !== null && _options$maxCacheSize !== void 0 ? _options$maxCacheSize : 300;
|
|
127
|
+
this._autoDisplayLayers = (_options$autoDisplayL = options.autoDisplayLayers) !== null && _options$autoDisplayL !== void 0 ? _options$autoDisplayL : true;
|
|
128
|
+
this._decodeWithWorker = (_options$decodeWithWo = options.decodeWithWorker) !== null && _options$decodeWithWo !== void 0 ? _options$decodeWithWo : true;
|
|
129
|
+
this._workerUrl = (_options$workerUrl = options.workerUrl) !== null && _options$workerUrl !== void 0 ? _options$workerUrl : '';
|
|
130
|
+
this.ready = false;
|
|
131
|
+
this.zoom = this.maximumLevel;
|
|
132
|
+
this.tilingScheme = new Cesium.WebMercatorTilingScheme();
|
|
133
|
+
this.readyEvent = new Cesium.Event();
|
|
134
|
+
this.errorEvent = new Cesium.Event();
|
|
135
|
+
this.tileLoadEvent = new Cesium.Event();
|
|
136
|
+
this.tileDisplayEvent = new Cesium.Event();
|
|
137
|
+
this.tileEvictEvent = new Cesium.Event();
|
|
138
|
+
this._destroyed = false;
|
|
139
|
+
this._initPromise = null;
|
|
140
|
+
this._rootTiles = [];
|
|
141
|
+
this._tilesToUpdate = [];
|
|
142
|
+
this._loadedTiles = {};
|
|
143
|
+
this._pendingTiles = new Map();
|
|
144
|
+
this._cacheOrder = new Map();
|
|
145
|
+
this._requestToken = 0;
|
|
146
|
+
this._levelZeroMaximumGeometricError = null;
|
|
147
|
+
this._decodeWorkerClient = null;
|
|
148
|
+
this._listenerRegistry = createListenerRegistry();
|
|
149
|
+
this._displayedTiles = new Map();
|
|
150
|
+
this._managedTileLayers = new Map();
|
|
151
|
+
this._addedToMap = false;
|
|
152
|
+
this._addToMap();
|
|
153
|
+
var autoInit = function autoInit() {
|
|
154
|
+
_this.init().catch(function () {
|
|
155
|
+
return undefined;
|
|
156
|
+
});
|
|
157
|
+
};
|
|
158
|
+
if (typeof requestAnimationFrame === 'function') {
|
|
159
|
+
requestAnimationFrame(autoInit);
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
Promise.resolve().then(autoInit);
|
|
163
|
+
}
|
|
164
|
+
_createClass(MvtVectorLoad, [{
|
|
165
|
+
key: "getMap",
|
|
166
|
+
value: function getMap() {
|
|
167
|
+
return this._mapContext.getMap();
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
// 构造后自动把当前 primitive 加到场景里。
|
|
171
|
+
}, {
|
|
172
|
+
key: "_addToMap",
|
|
173
|
+
value: function _addToMap() {
|
|
174
|
+
var map = this.getMap();
|
|
175
|
+
if (!map || this._addedToMap) {
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
178
|
+
if (typeof map.isDestroyed === 'function' && map.isDestroyed()) {
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
map.scene.primitives.add(this);
|
|
182
|
+
this._addedToMap = true;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
// 销毁时自动从场景里移除,兼容外部仍然显式调用 remove 的场景。
|
|
186
|
+
}, {
|
|
187
|
+
key: "_removeFromMap",
|
|
188
|
+
value: function _removeFromMap() {
|
|
189
|
+
var map = this.getMap();
|
|
190
|
+
var addedToMap = this._addedToMap;
|
|
191
|
+
this._addedToMap = false;
|
|
192
|
+
if (!map || !addedToMap) {
|
|
193
|
+
return;
|
|
194
|
+
}
|
|
195
|
+
if (typeof map.isDestroyed === 'function' && map.isDestroyed()) {
|
|
196
|
+
return;
|
|
197
|
+
}
|
|
198
|
+
map.scene.primitives.remove(this);
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
// 初始化加载器,返回同一个初始化 Promise。
|
|
202
|
+
}, {
|
|
203
|
+
key: "init",
|
|
204
|
+
value: function init() {
|
|
205
|
+
if (!this._initPromise) {
|
|
206
|
+
this._initPromise = this._doInit();
|
|
207
|
+
}
|
|
208
|
+
return this._initPromise;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
// 统一监听入口,返回订阅对象。
|
|
212
|
+
}, {
|
|
213
|
+
key: "on",
|
|
214
|
+
value: function on(type, handler) {
|
|
215
|
+
var _this2 = this;
|
|
216
|
+
var event = this._getEventByType(type);
|
|
217
|
+
var wrapped = this._wrapEventHandler(type, handler);
|
|
218
|
+
var listener = {
|
|
219
|
+
original: handler,
|
|
220
|
+
wrapped: wrapped,
|
|
221
|
+
remove: function remove() {
|
|
222
|
+
return undefined;
|
|
223
|
+
},
|
|
224
|
+
removed: false
|
|
225
|
+
};
|
|
226
|
+
listener.remove = addCesiumEventListener(event, listener.wrapped);
|
|
227
|
+
this._listenerRegistry[type].push(listener);
|
|
228
|
+
return {
|
|
229
|
+
off: function off() {
|
|
230
|
+
_this2._removeRegisteredListener(type, listener);
|
|
231
|
+
}
|
|
232
|
+
};
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
// tileLoad 支持返回图层实例,由加载器自动托管显隐和销毁。
|
|
236
|
+
}, {
|
|
237
|
+
key: "_wrapEventHandler",
|
|
238
|
+
value: function _wrapEventHandler(type, handler) {
|
|
239
|
+
var _this3 = this;
|
|
240
|
+
if (type !== 'tileLoad') {
|
|
241
|
+
return handler;
|
|
242
|
+
}
|
|
243
|
+
var tileLoadHandler = handler;
|
|
244
|
+
return function (tile) {
|
|
245
|
+
var result = tileLoadHandler(tile);
|
|
246
|
+
if (result && _typeof(result) === 'object' && 'then' in result) {
|
|
247
|
+
return Promise.resolve(result).then(function (resolvedResult) {
|
|
248
|
+
_this3._registerManagedTileLayers(tile, resolvedResult);
|
|
249
|
+
_this3._syncTileDisplayState(_this3._tilesToUpdate);
|
|
250
|
+
return resolvedResult;
|
|
251
|
+
}).catch(function (error) {
|
|
252
|
+
throw _this3._emitError(_this3._toError(error, 'tileLoad 监听回调执行失败'));
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
_this3._registerManagedTileLayers(tile, result);
|
|
256
|
+
_this3._syncTileDisplayState(_this3._tilesToUpdate);
|
|
257
|
+
return result;
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
// 统一解绑入口,按注册顺序移除首个匹配监听。
|
|
262
|
+
}, {
|
|
263
|
+
key: "off",
|
|
264
|
+
value: function off(type, handler) {
|
|
265
|
+
var listeners = this._listenerRegistry[type];
|
|
266
|
+
var index = listeners.findIndex(function (listener) {
|
|
267
|
+
return listener.original === handler && !listener.removed;
|
|
268
|
+
});
|
|
269
|
+
if (index === -1) {
|
|
270
|
+
return;
|
|
271
|
+
}
|
|
272
|
+
var _listeners$splice = listeners.splice(index, 1),
|
|
273
|
+
_listeners$splice2 = _slicedToArray(_listeners$splice, 1),
|
|
274
|
+
listener = _listeners$splice2[0];
|
|
275
|
+
if (!listener) {
|
|
276
|
+
return;
|
|
277
|
+
}
|
|
278
|
+
listener.removed = true;
|
|
279
|
+
listener.remove();
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
// 根据事件类型返回底层 Cesium.Event。
|
|
283
|
+
}, {
|
|
284
|
+
key: "_getEventByType",
|
|
285
|
+
value: function _getEventByType(type) {
|
|
286
|
+
switch (type) {
|
|
287
|
+
case 'ready':
|
|
288
|
+
return this.readyEvent;
|
|
289
|
+
case 'error':
|
|
290
|
+
return this.errorEvent;
|
|
291
|
+
case 'tileLoad':
|
|
292
|
+
return this.tileLoadEvent;
|
|
293
|
+
case 'tileDisplay':
|
|
294
|
+
return this.tileDisplayEvent;
|
|
295
|
+
case 'tileEvict':
|
|
296
|
+
return this.tileEvictEvent;
|
|
297
|
+
default:
|
|
298
|
+
throw this._createInvalidEventTypeError(String(type));
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
// 非法事件类型统一走错误事件并抛出异常。
|
|
303
|
+
}, {
|
|
304
|
+
key: "_createInvalidEventTypeError",
|
|
305
|
+
value: function _createInvalidEventTypeError(type) {
|
|
306
|
+
return this._emitError(new Error("\u4E0D\u652F\u6301\u7684\u4E8B\u4EF6\u7C7B\u578B \"".concat(type, "\"\uFF0C\u53EF\u9009\u503C\uFF1A").concat(MVT_VECTOR_LOAD_EVENT_TYPES.join('、'))));
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
// 移除指定注册监听,并同步更新注册表。
|
|
310
|
+
}, {
|
|
311
|
+
key: "_removeRegisteredListener",
|
|
312
|
+
value: function _removeRegisteredListener(type, listener) {
|
|
313
|
+
if (listener.removed) {
|
|
314
|
+
return;
|
|
315
|
+
}
|
|
316
|
+
listener.removed = true;
|
|
317
|
+
var listeners = this._listenerRegistry[type];
|
|
318
|
+
var index = listeners.indexOf(listener);
|
|
319
|
+
if (index !== -1) {
|
|
320
|
+
listeners.splice(index, 1);
|
|
321
|
+
}
|
|
322
|
+
listener.remove();
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
// 清空统一监听注册表,避免 destroy 后仍持有外部回调引用。
|
|
326
|
+
}, {
|
|
327
|
+
key: "_clearListenerRegistry",
|
|
328
|
+
value: function _clearListenerRegistry() {
|
|
329
|
+
for (var _i = 0, _MVT_VECTOR_LOAD_EVEN = MVT_VECTOR_LOAD_EVENT_TYPES; _i < _MVT_VECTOR_LOAD_EVEN.length; _i++) {
|
|
330
|
+
var type = _MVT_VECTOR_LOAD_EVEN[_i];
|
|
331
|
+
var listeners = this._listenerRegistry[type];
|
|
332
|
+
var _iterator = _createForOfIteratorHelper(listeners),
|
|
333
|
+
_step;
|
|
334
|
+
try {
|
|
335
|
+
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
336
|
+
var listener = _step.value;
|
|
337
|
+
listener.removed = true;
|
|
338
|
+
}
|
|
339
|
+
} catch (err) {
|
|
340
|
+
_iterator.e(err);
|
|
341
|
+
} finally {
|
|
342
|
+
_iterator.f();
|
|
343
|
+
}
|
|
344
|
+
listeners.length = 0;
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
// 执行实际初始化流程。
|
|
349
|
+
}, {
|
|
350
|
+
key: "_doInit",
|
|
351
|
+
value: function () {
|
|
352
|
+
var _doInit2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee() {
|
|
353
|
+
return _regeneratorRuntime().wrap(function _callee$(_context) {
|
|
354
|
+
while (1) switch (_context.prev = _context.next) {
|
|
355
|
+
case 0:
|
|
356
|
+
this._validateOptions();
|
|
357
|
+
this._createRootTiles();
|
|
358
|
+
this.ready = true;
|
|
359
|
+
this.readyEvent.raiseEvent(this);
|
|
360
|
+
return _context.abrupt("return", this);
|
|
361
|
+
case 5:
|
|
362
|
+
case "end":
|
|
363
|
+
return _context.stop();
|
|
364
|
+
}
|
|
365
|
+
}, _callee, this);
|
|
366
|
+
}));
|
|
367
|
+
function _doInit() {
|
|
368
|
+
return _doInit2.apply(this, arguments);
|
|
369
|
+
}
|
|
370
|
+
return _doInit;
|
|
371
|
+
}() // 校验外部传入的配置是否合法。
|
|
372
|
+
}, {
|
|
373
|
+
key: "_validateOptions",
|
|
374
|
+
value: function _validateOptions() {
|
|
375
|
+
if (!this.url) {
|
|
376
|
+
throw this._emitError(new Error('请传入 url 参数'));
|
|
377
|
+
}
|
|
378
|
+
if (!this.url.includes('{z}') || !this.url.includes('{x}') || !this.url.includes('{y}')) {
|
|
379
|
+
throw this._emitError(new Error('url 必须包含 {z}、{x}、{y} 占位符'));
|
|
380
|
+
}
|
|
381
|
+
if (this.minzoom < 0 || this.maximumLevel < this.minzoom) {
|
|
382
|
+
throw this._emitError(new Error('minzoom/maxzoom 配置无效'));
|
|
383
|
+
}
|
|
384
|
+
if (!Number.isSafeInteger(this.maxCacheSize) || this.maxCacheSize <= 0) {
|
|
385
|
+
throw this._emitError(new Error('maxCacheSize 必须是大于 0 的整数'));
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
// 统一抛出错误并派发错误事件。
|
|
390
|
+
}, {
|
|
391
|
+
key: "_emitError",
|
|
392
|
+
value: function _emitError(error) {
|
|
393
|
+
this.errorEvent.raiseEvent(error);
|
|
394
|
+
return error;
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
// 创建第 0 层根瓦片,作为后续遍历入口。
|
|
398
|
+
}, {
|
|
399
|
+
key: "_createRootTiles",
|
|
400
|
+
value: function _createRootTiles() {
|
|
401
|
+
if (this._rootTiles.length > 0) {
|
|
402
|
+
return;
|
|
403
|
+
}
|
|
404
|
+
var numX = this.tilingScheme.getNumberOfXTilesAtLevel(0);
|
|
405
|
+
var numY = this.tilingScheme.getNumberOfYTilesAtLevel(0);
|
|
406
|
+
for (var y = 0; y < numY; y += 1) {
|
|
407
|
+
for (var x = 0; x < numX; x += 1) {
|
|
408
|
+
var _tile = new VectorLoadTile({
|
|
409
|
+
x: x,
|
|
410
|
+
y: y,
|
|
411
|
+
z: 0,
|
|
412
|
+
tilingScheme: this.tilingScheme,
|
|
413
|
+
parent: this
|
|
414
|
+
});
|
|
415
|
+
this._rootTiles.push(_tile);
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
// 生成瓦片缓存键。
|
|
421
|
+
}, {
|
|
422
|
+
key: "_getTileKey",
|
|
423
|
+
value: function _getTileKey(x, y, z) {
|
|
424
|
+
return "".concat(x, ",").concat(y, ",").concat(z);
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
// 更新瓦片缓存访问顺序,使当前 key 成为最近使用项。
|
|
428
|
+
}, {
|
|
429
|
+
key: "_touchTileCache",
|
|
430
|
+
value: function _touchTileCache(key) {
|
|
431
|
+
this._cacheOrder.delete(key);
|
|
432
|
+
this._cacheOrder.set(key, true);
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
// 当缓存超过上限时,按 LRU 顺序淘汰最久未使用的瓦片。
|
|
436
|
+
}, {
|
|
437
|
+
key: "_pruneLoadedTiles",
|
|
438
|
+
value: function _pruneLoadedTiles() {
|
|
439
|
+
var evictedTiles = [];
|
|
440
|
+
var protectedTileKeys = new Set([].concat(_toConsumableArray(this._displayedTiles.keys()), _toConsumableArray(this._tilesToUpdate.map(function (tile) {
|
|
441
|
+
return tile.key;
|
|
442
|
+
}))));
|
|
443
|
+
while (this._cacheOrder.size > this.maxCacheSize) {
|
|
444
|
+
var oldestKey = void 0;
|
|
445
|
+
var _iterator2 = _createForOfIteratorHelper(this._cacheOrder.keys()),
|
|
446
|
+
_step2;
|
|
447
|
+
try {
|
|
448
|
+
for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
|
|
449
|
+
var key = _step2.value;
|
|
450
|
+
if (!protectedTileKeys.has(key)) {
|
|
451
|
+
oldestKey = key;
|
|
452
|
+
break;
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
} catch (err) {
|
|
456
|
+
_iterator2.e(err);
|
|
457
|
+
} finally {
|
|
458
|
+
_iterator2.f();
|
|
459
|
+
}
|
|
460
|
+
if (typeof oldestKey !== 'string') {
|
|
461
|
+
break;
|
|
462
|
+
}
|
|
463
|
+
this._cacheOrder.delete(oldestKey);
|
|
464
|
+
var loadedTile = this._loadedTiles[oldestKey];
|
|
465
|
+
if (!loadedTile) {
|
|
466
|
+
continue;
|
|
467
|
+
}
|
|
468
|
+
delete this._loadedTiles[oldestKey];
|
|
469
|
+
this._displayedTiles.delete(oldestKey);
|
|
470
|
+
evictedTiles.push({
|
|
471
|
+
key: oldestKey,
|
|
472
|
+
x: loadedTile.x,
|
|
473
|
+
y: loadedTile.y,
|
|
474
|
+
z: loadedTile.z
|
|
475
|
+
});
|
|
476
|
+
}
|
|
477
|
+
this._resetTileStatesByKeys(evictedTiles.map(function (tile) {
|
|
478
|
+
return tile.key;
|
|
479
|
+
}));
|
|
480
|
+
for (var _i2 = 0, _evictedTiles = evictedTiles; _i2 < _evictedTiles.length; _i2++) {
|
|
481
|
+
var _tile2 = _evictedTiles[_i2];
|
|
482
|
+
this.tileEvictEvent.raiseEvent(_tile2);
|
|
483
|
+
this._removeManagedTileLayers(_tile2.key);
|
|
484
|
+
}
|
|
485
|
+
}
|
|
486
|
+
|
|
487
|
+
// 根据当前视锥和 SSE 结果,筛出这一帧需要继续加载的瓦片。
|
|
488
|
+
}, {
|
|
489
|
+
key: "_getTilesToUpdate",
|
|
490
|
+
value: function _getTilesToUpdate(frameState) {
|
|
491
|
+
var _this4 = this;
|
|
492
|
+
var queue = _toConsumableArray(this._rootTiles);
|
|
493
|
+
var tilesToUpdate = this._tilesToUpdate;
|
|
494
|
+
var zoom = this.maximumLevel;
|
|
495
|
+
var nearDist = Number.POSITIVE_INFINITY;
|
|
496
|
+
var getScreenSpaceError = function getScreenSpaceError(currentFrameState, tile) {
|
|
497
|
+
return _this4._getScreenSpaceError(currentFrameState, tile);
|
|
498
|
+
};
|
|
499
|
+
var visitor = {
|
|
500
|
+
visitChildren: function visitChildren(tile) {
|
|
501
|
+
if (tile.z >= _this4.maximumLevel) {
|
|
502
|
+
if (tile.distanceToCamera < nearDist) {
|
|
503
|
+
nearDist = tile.distanceToCamera;
|
|
504
|
+
zoom = tile.z;
|
|
505
|
+
}
|
|
506
|
+
tilesToUpdate.push(tile);
|
|
507
|
+
return;
|
|
508
|
+
}
|
|
509
|
+
if (tile.children.length === 0) {
|
|
510
|
+
tile.createChildren();
|
|
511
|
+
}
|
|
512
|
+
var _iterator3 = _createForOfIteratorHelper(tile.children),
|
|
513
|
+
_step3;
|
|
514
|
+
try {
|
|
515
|
+
for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
|
|
516
|
+
var child = _step3.value;
|
|
517
|
+
queue.push(child);
|
|
518
|
+
}
|
|
519
|
+
} catch (err) {
|
|
520
|
+
_iterator3.e(err);
|
|
521
|
+
} finally {
|
|
522
|
+
_iterator3.f();
|
|
523
|
+
}
|
|
524
|
+
},
|
|
525
|
+
accept: function accept(tile) {
|
|
526
|
+
if (tile.distanceToCamera < nearDist) {
|
|
527
|
+
nearDist = tile.distanceToCamera;
|
|
528
|
+
zoom = tile.z;
|
|
529
|
+
}
|
|
530
|
+
tilesToUpdate.push(tile);
|
|
531
|
+
}
|
|
532
|
+
};
|
|
533
|
+
tilesToUpdate.length = 0;
|
|
534
|
+
for (var index = 0; index < queue.length; index += 1) {
|
|
535
|
+
var _tile3 = queue[index];
|
|
536
|
+
_tile3.visit(frameState, visitor, getScreenSpaceError);
|
|
537
|
+
}
|
|
538
|
+
this.zoom = zoom;
|
|
539
|
+
return tilesToUpdate;
|
|
540
|
+
}
|
|
541
|
+
|
|
542
|
+
// 把运行时瓦片对象转换为显示状态事件所需的最小数据。
|
|
543
|
+
}, {
|
|
544
|
+
key: "_toDisplayedTileState",
|
|
545
|
+
value: function _toDisplayedTileState(tile) {
|
|
546
|
+
return {
|
|
547
|
+
key: tile.key,
|
|
548
|
+
x: tile.x,
|
|
549
|
+
y: tile.y,
|
|
550
|
+
z: tile.z
|
|
551
|
+
};
|
|
552
|
+
}
|
|
553
|
+
|
|
554
|
+
// 判断缓存中是否已持有指定瓦片的数据内容。
|
|
555
|
+
}, {
|
|
556
|
+
key: "_isTileLoaded",
|
|
557
|
+
value: function _isTileLoaded(key) {
|
|
558
|
+
return Boolean(this._loadedTiles[key]);
|
|
559
|
+
}
|
|
560
|
+
|
|
561
|
+
// 判断 ancestor 是否为 descendant 的同一瓦片或祖先瓦片。
|
|
562
|
+
}, {
|
|
563
|
+
key: "_isSameOrAncestorTile",
|
|
564
|
+
value: function _isSameOrAncestorTile(ancestor, descendant) {
|
|
565
|
+
if (ancestor.z > descendant.z) {
|
|
566
|
+
return false;
|
|
567
|
+
}
|
|
568
|
+
var levelDelta = descendant.z - ancestor.z;
|
|
569
|
+
return descendant.x >> levelDelta === ancestor.x && descendant.y >> levelDelta === ancestor.y;
|
|
570
|
+
}
|
|
571
|
+
|
|
572
|
+
// 四叉树瓦片的重叠关系只会出现在祖先/子孙之间。
|
|
573
|
+
}, {
|
|
574
|
+
key: "_tilesOverlap",
|
|
575
|
+
value: function _tilesOverlap(a, b) {
|
|
576
|
+
return this._isSameOrAncestorTile(a, b) || this._isSameOrAncestorTile(b, a);
|
|
577
|
+
}
|
|
578
|
+
|
|
579
|
+
// 目标瓦片尚未 ready 时,保留重叠的旧瓦片作为视觉兜底。
|
|
580
|
+
}, {
|
|
581
|
+
key: "_shouldKeepDisplayedTile",
|
|
582
|
+
value: function _shouldKeepDisplayedTile(tile, pendingTargetTiles) {
|
|
583
|
+
var _this5 = this;
|
|
584
|
+
return pendingTargetTiles.some(function (pendingTile) {
|
|
585
|
+
return _this5._tilesOverlap(tile, pendingTile);
|
|
586
|
+
});
|
|
587
|
+
}
|
|
588
|
+
|
|
589
|
+
// 旧瓦片仍在兜底时,延迟显示与其重叠的新瓦片,保证整组原子切换。
|
|
590
|
+
}, {
|
|
591
|
+
key: "_shouldDelayTargetTileDisplay",
|
|
592
|
+
value: function _shouldDelayTargetTileDisplay(tile, keptDisplayedTiles) {
|
|
593
|
+
var _this6 = this;
|
|
594
|
+
return keptDisplayedTiles.some(function (displayedTile) {
|
|
595
|
+
return displayedTile.key !== tile.key && _this6._tilesOverlap(displayedTile, tile);
|
|
596
|
+
});
|
|
597
|
+
}
|
|
598
|
+
|
|
599
|
+
// 统一派发瓦片显示状态变化事件。
|
|
600
|
+
}, {
|
|
601
|
+
key: "_raiseTileDisplayChange",
|
|
602
|
+
value: function _raiseTileDisplayChange(tile, display) {
|
|
603
|
+
this._setManagedTileLayersDisplay(tile.key, display === 'show');
|
|
604
|
+
this.tileDisplayEvent.raiseEvent(_objectSpread(_objectSpread({}, tile), {}, {
|
|
605
|
+
display: display
|
|
606
|
+
}));
|
|
607
|
+
}
|
|
608
|
+
|
|
609
|
+
// 对比目标工作集和当前显示集,只在瓦片 ready 后提交显隐切换。
|
|
610
|
+
}, {
|
|
611
|
+
key: "_syncTileDisplayState",
|
|
612
|
+
value: function _syncTileDisplayState(tilesToUpdate) {
|
|
613
|
+
var _this7 = this;
|
|
614
|
+
var nextDisplayedTiles = new Map();
|
|
615
|
+
var readyTargetTiles = [];
|
|
616
|
+
var pendingTargetTiles = [];
|
|
617
|
+
var keptDisplayedTiles = [];
|
|
618
|
+
var _iterator4 = _createForOfIteratorHelper(tilesToUpdate),
|
|
619
|
+
_step4;
|
|
620
|
+
try {
|
|
621
|
+
for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
|
|
622
|
+
var _tile5 = _step4.value;
|
|
623
|
+
var tileState = this._toDisplayedTileState(_tile5);
|
|
624
|
+
if (this._isTileLoaded(_tile5.key)) {
|
|
625
|
+
readyTargetTiles.push(tileState);
|
|
626
|
+
continue;
|
|
627
|
+
}
|
|
628
|
+
pendingTargetTiles.push(tileState);
|
|
629
|
+
}
|
|
630
|
+
} catch (err) {
|
|
631
|
+
_iterator4.e(err);
|
|
632
|
+
} finally {
|
|
633
|
+
_iterator4.f();
|
|
634
|
+
}
|
|
635
|
+
this._displayedTiles.forEach(function (tile, key) {
|
|
636
|
+
if (_this7._shouldKeepDisplayedTile(tile, pendingTargetTiles)) {
|
|
637
|
+
keptDisplayedTiles.push(tile);
|
|
638
|
+
nextDisplayedTiles.set(key, tile);
|
|
639
|
+
}
|
|
640
|
+
});
|
|
641
|
+
for (var _i3 = 0, _readyTargetTiles = readyTargetTiles; _i3 < _readyTargetTiles.length; _i3++) {
|
|
642
|
+
var _tile4 = _readyTargetTiles[_i3];
|
|
643
|
+
if (this._shouldDelayTargetTileDisplay(_tile4, keptDisplayedTiles)) {
|
|
644
|
+
continue;
|
|
645
|
+
}
|
|
646
|
+
nextDisplayedTiles.set(_tile4.key, _tile4);
|
|
647
|
+
}
|
|
648
|
+
this._displayedTiles.forEach(function (tile, key) {
|
|
649
|
+
if (!nextDisplayedTiles.has(key)) {
|
|
650
|
+
_this7._raiseTileDisplayChange(tile, 'hide');
|
|
651
|
+
}
|
|
652
|
+
});
|
|
653
|
+
nextDisplayedTiles.forEach(function (tile, key) {
|
|
654
|
+
if (!_this7._displayedTiles.has(key)) {
|
|
655
|
+
_this7._raiseTileDisplayChange(tile, 'show');
|
|
656
|
+
}
|
|
657
|
+
});
|
|
658
|
+
this._displayedTiles = nextDisplayedTiles;
|
|
659
|
+
}
|
|
660
|
+
|
|
661
|
+
// 在清缓存或销毁前,把当前显示中的瓦片统一通知为隐藏。
|
|
662
|
+
}, {
|
|
663
|
+
key: "_hideAllDisplayedTiles",
|
|
664
|
+
value: function _hideAllDisplayedTiles() {
|
|
665
|
+
var _this8 = this;
|
|
666
|
+
this._displayedTiles.forEach(function (tile) {
|
|
667
|
+
_this8._raiseTileDisplayChange(tile, 'hide');
|
|
668
|
+
});
|
|
669
|
+
this._displayedTiles.clear();
|
|
670
|
+
}
|
|
671
|
+
|
|
672
|
+
// 判断 tileLoad 返回值是否满足自动托管所需的最小图层接口。
|
|
673
|
+
}, {
|
|
674
|
+
key: "_isManagedTileLayer",
|
|
675
|
+
value: function _isManagedTileLayer(layer) {
|
|
676
|
+
if (!layer || _typeof(layer) !== 'object') {
|
|
677
|
+
return false;
|
|
678
|
+
}
|
|
679
|
+
var candidate = layer;
|
|
680
|
+
return typeof candidate.show === 'function' && typeof candidate.remove === 'function';
|
|
681
|
+
}
|
|
682
|
+
|
|
683
|
+
// 统一整理 tileLoad 返回的单个图层或图层数组。
|
|
684
|
+
}, {
|
|
685
|
+
key: "_normalizeManagedTileLayers",
|
|
686
|
+
value: function _normalizeManagedTileLayers(result) {
|
|
687
|
+
var _this9 = this;
|
|
688
|
+
if (!result) {
|
|
689
|
+
return [];
|
|
690
|
+
}
|
|
691
|
+
var layers = Array.isArray(result) ? result : [result];
|
|
692
|
+
return layers.filter(function (layer) {
|
|
693
|
+
return _this9._isManagedTileLayer(layer);
|
|
694
|
+
});
|
|
695
|
+
}
|
|
696
|
+
|
|
697
|
+
// 注册 tileLoad 返回的图层,显隐切换统一交给显示调度处理。
|
|
698
|
+
}, {
|
|
699
|
+
key: "_registerManagedTileLayers",
|
|
700
|
+
value: function _registerManagedTileLayers(tile, result) {
|
|
701
|
+
var _this$_managedTileLay;
|
|
702
|
+
var layers = this._normalizeManagedTileLayers(result);
|
|
703
|
+
if (layers.length === 0) {
|
|
704
|
+
return;
|
|
705
|
+
}
|
|
706
|
+
var key = this._getTileKey(tile.x, tile.y, tile.z);
|
|
707
|
+
var registeredLayers = (_this$_managedTileLay = this._managedTileLayers.get(key)) !== null && _this$_managedTileLay !== void 0 ? _this$_managedTileLay : [];
|
|
708
|
+
var nextLayers = layers.filter(function (layer) {
|
|
709
|
+
return !registeredLayers.includes(layer);
|
|
710
|
+
});
|
|
711
|
+
if (nextLayers.length === 0) {
|
|
712
|
+
return;
|
|
713
|
+
}
|
|
714
|
+
this._managedTileLayers.set(key, [].concat(_toConsumableArray(registeredLayers), _toConsumableArray(nextLayers)));
|
|
715
|
+
if (this._autoDisplayLayers) {
|
|
716
|
+
this._setManagedTileLayersDisplay(key, this._displayedTiles.has(key));
|
|
717
|
+
return;
|
|
718
|
+
}
|
|
719
|
+
this._applyManagedTileLayersDisplay(key, true);
|
|
720
|
+
}
|
|
721
|
+
|
|
722
|
+
// 判断图层是否已销毁,兼容属性和方法两种常见实现。
|
|
723
|
+
}, {
|
|
724
|
+
key: "_isManagedTileLayerDestroyed",
|
|
725
|
+
value: function _isManagedTileLayerDestroyed(layer) {
|
|
726
|
+
var destroyed = layer.isDestroyed;
|
|
727
|
+
return typeof destroyed === 'function' ? destroyed() : destroyed === true;
|
|
728
|
+
}
|
|
729
|
+
|
|
730
|
+
// 对指定瓦片关联的所有托管图层执行显隐。
|
|
731
|
+
}, {
|
|
732
|
+
key: "_applyManagedTileLayersDisplay",
|
|
733
|
+
value: function _applyManagedTileLayersDisplay(key, isShow) {
|
|
734
|
+
var layers = this._managedTileLayers.get(key);
|
|
735
|
+
if (!layers) {
|
|
736
|
+
return;
|
|
737
|
+
}
|
|
738
|
+
var _iterator5 = _createForOfIteratorHelper(layers),
|
|
739
|
+
_step5;
|
|
740
|
+
try {
|
|
741
|
+
for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {
|
|
742
|
+
var layer = _step5.value;
|
|
743
|
+
if (!this._isManagedTileLayerDestroyed(layer)) {
|
|
744
|
+
layer.show(isShow);
|
|
745
|
+
}
|
|
746
|
+
}
|
|
747
|
+
} catch (err) {
|
|
748
|
+
_iterator5.e(err);
|
|
749
|
+
} finally {
|
|
750
|
+
_iterator5.f();
|
|
751
|
+
}
|
|
752
|
+
}
|
|
753
|
+
|
|
754
|
+
// 自动显示或隐藏指定瓦片关联的所有托管图层。
|
|
755
|
+
}, {
|
|
756
|
+
key: "_setManagedTileLayersDisplay",
|
|
757
|
+
value: function _setManagedTileLayersDisplay(key, isShow) {
|
|
758
|
+
if (!this._autoDisplayLayers) {
|
|
759
|
+
return;
|
|
760
|
+
}
|
|
761
|
+
this._applyManagedTileLayersDisplay(key, isShow);
|
|
762
|
+
}
|
|
763
|
+
|
|
764
|
+
// 自动移除指定瓦片关联的所有托管图层。
|
|
765
|
+
}, {
|
|
766
|
+
key: "_removeManagedTileLayers",
|
|
767
|
+
value: function _removeManagedTileLayers(key) {
|
|
768
|
+
var layers = this._managedTileLayers.get(key);
|
|
769
|
+
if (!layers) {
|
|
770
|
+
return;
|
|
771
|
+
}
|
|
772
|
+
this._managedTileLayers.delete(key);
|
|
773
|
+
var _iterator6 = _createForOfIteratorHelper(layers),
|
|
774
|
+
_step6;
|
|
775
|
+
try {
|
|
776
|
+
for (_iterator6.s(); !(_step6 = _iterator6.n()).done;) {
|
|
777
|
+
var layer = _step6.value;
|
|
778
|
+
if (!this._isManagedTileLayerDestroyed(layer)) {
|
|
779
|
+
layer.remove();
|
|
780
|
+
}
|
|
781
|
+
}
|
|
782
|
+
} catch (err) {
|
|
783
|
+
_iterator6.e(err);
|
|
784
|
+
} finally {
|
|
785
|
+
_iterator6.f();
|
|
786
|
+
}
|
|
787
|
+
}
|
|
788
|
+
|
|
789
|
+
// 移除所有托管图层,用于清缓存和销毁兜底。
|
|
790
|
+
}, {
|
|
791
|
+
key: "_removeAllManagedTileLayers",
|
|
792
|
+
value: function _removeAllManagedTileLayers() {
|
|
793
|
+
var keys = _toConsumableArray(this._managedTileLayers.keys());
|
|
794
|
+
var _iterator7 = _createForOfIteratorHelper(keys),
|
|
795
|
+
_step7;
|
|
796
|
+
try {
|
|
797
|
+
for (_iterator7.s(); !(_step7 = _iterator7.n()).done;) {
|
|
798
|
+
var key = _step7.value;
|
|
799
|
+
this._removeManagedTileLayers(key);
|
|
800
|
+
}
|
|
801
|
+
} catch (err) {
|
|
802
|
+
_iterator7.e(err);
|
|
803
|
+
} finally {
|
|
804
|
+
_iterator7.f();
|
|
805
|
+
}
|
|
806
|
+
}
|
|
807
|
+
|
|
808
|
+
// 计算指定层级的最大几何误差,并缓存第 0 层误差基准值。
|
|
809
|
+
}, {
|
|
810
|
+
key: "_getLevelMaximumGeometricError",
|
|
811
|
+
value: function _getLevelMaximumGeometricError(z) {
|
|
812
|
+
if (this._levelZeroMaximumGeometricError === null) {
|
|
813
|
+
this._levelZeroMaximumGeometricError = Cesium.TerrainProvider.getEstimatedLevelZeroGeometricErrorForAHeightmap(this.tilingScheme.ellipsoid, 128, this.tilingScheme.getNumberOfXTilesAtLevel(0));
|
|
814
|
+
}
|
|
815
|
+
return this._levelZeroMaximumGeometricError / (1 << z);
|
|
816
|
+
}
|
|
817
|
+
|
|
818
|
+
// 把被淘汰缓存对应的瓦片状态恢复为未加载,便于后续重新请求。
|
|
819
|
+
}, {
|
|
820
|
+
key: "_resetTileStatesByKeys",
|
|
821
|
+
value: function _resetTileStatesByKeys(keys) {
|
|
822
|
+
if (keys.length === 0) {
|
|
823
|
+
return;
|
|
824
|
+
}
|
|
825
|
+
var keySet = new Set(keys);
|
|
826
|
+
var queue = _toConsumableArray(this._rootTiles);
|
|
827
|
+
for (var index = 0; index < queue.length; index += 1) {
|
|
828
|
+
var _tile6 = queue[index];
|
|
829
|
+
if (keySet.has(_tile6.key)) {
|
|
830
|
+
_tile6.state = 'none';
|
|
831
|
+
}
|
|
832
|
+
var _iterator8 = _createForOfIteratorHelper(_tile6.children),
|
|
833
|
+
_step8;
|
|
834
|
+
try {
|
|
835
|
+
for (_iterator8.s(); !(_step8 = _iterator8.n()).done;) {
|
|
836
|
+
var child = _step8.value;
|
|
837
|
+
queue.push(child);
|
|
838
|
+
}
|
|
839
|
+
} catch (err) {
|
|
840
|
+
_iterator8.e(err);
|
|
841
|
+
} finally {
|
|
842
|
+
_iterator8.f();
|
|
843
|
+
}
|
|
844
|
+
}
|
|
845
|
+
}
|
|
846
|
+
|
|
847
|
+
// 使用 Cesium 的屏幕空间误差规则,判断当前瓦片是否需要继续细分。
|
|
848
|
+
}, {
|
|
849
|
+
key: "_getScreenSpaceError",
|
|
850
|
+
value: function _getScreenSpaceError(frameState, tile) {
|
|
851
|
+
var maxGeometricError = this._getLevelMaximumGeometricError(tile.z);
|
|
852
|
+
var distance = tile.distanceToCamera;
|
|
853
|
+
var height = frameState.context.drawingBufferHeight;
|
|
854
|
+
var sseDenominator = frameState.camera.frustum.sseDenominator;
|
|
855
|
+
var error = maxGeometricError * height / (distance * sseDenominator);
|
|
856
|
+
if (frameState.fog.enabled) {
|
|
857
|
+
error -= CesiumMath.fog(distance, frameState.fog.density) * frameState.fog.sse;
|
|
858
|
+
}
|
|
859
|
+
return error / frameState.pixelRatio;
|
|
860
|
+
}
|
|
861
|
+
|
|
862
|
+
// 根据瓦片坐标拼接最终请求 URL。
|
|
863
|
+
}, {
|
|
864
|
+
key: "_buildTileUrl",
|
|
865
|
+
value: function _buildTileUrl(x, y, z) {
|
|
866
|
+
return this.url.replace('{x}', String(x)).replace('{y}', String(y)).replace('{z}', String(z));
|
|
867
|
+
}
|
|
868
|
+
|
|
869
|
+
// 把未知错误统一包装成 Error,便于后续事件分发和日志处理。
|
|
870
|
+
}, {
|
|
871
|
+
key: "_toError",
|
|
872
|
+
value: function _toError(error, fallbackMessage) {
|
|
873
|
+
if (error instanceof Error) {
|
|
874
|
+
return error;
|
|
875
|
+
}
|
|
876
|
+
if (typeof error === 'string' && error.length > 0) {
|
|
877
|
+
return new Error(error);
|
|
878
|
+
}
|
|
879
|
+
return new Error(fallbackMessage);
|
|
880
|
+
}
|
|
881
|
+
|
|
882
|
+
// 按需创建 MVT 解码 Worker;初始化失败时自动回退主线程解码。
|
|
883
|
+
}, {
|
|
884
|
+
key: "_getDecodeWorkerClient",
|
|
885
|
+
value: function _getDecodeWorkerClient() {
|
|
886
|
+
if (!this._decodeWithWorker || this._destroyed) {
|
|
887
|
+
return null;
|
|
888
|
+
}
|
|
889
|
+
if (this._decodeWorkerClient) {
|
|
890
|
+
return this._decodeWorkerClient;
|
|
891
|
+
}
|
|
892
|
+
try {
|
|
893
|
+
this._decodeWorkerClient = new MvtVectorWorkerClient({
|
|
894
|
+
workerUrl: this._workerUrl || undefined
|
|
895
|
+
});
|
|
896
|
+
return this._decodeWorkerClient;
|
|
897
|
+
} catch (error) {
|
|
898
|
+
this._decodeWithWorker = false;
|
|
899
|
+
console.warn('MVT 解码 Worker 初始化失败,已回退主线程解码', error);
|
|
900
|
+
return null;
|
|
901
|
+
}
|
|
902
|
+
}
|
|
903
|
+
|
|
904
|
+
// 销毁当前解码 Worker,避免销毁后仍有挂起任务占用资源。
|
|
905
|
+
}, {
|
|
906
|
+
key: "_destroyDecodeWorkerClient",
|
|
907
|
+
value: function _destroyDecodeWorkerClient() {
|
|
908
|
+
var _this$_decodeWorkerCl;
|
|
909
|
+
(_this$_decodeWorkerCl = this._decodeWorkerClient) === null || _this$_decodeWorkerCl === void 0 || _this$_decodeWorkerCl.destroy();
|
|
910
|
+
this._decodeWorkerClient = null;
|
|
911
|
+
}
|
|
912
|
+
|
|
913
|
+
// 优先在 Worker 中解码瓦片;异常时关闭 Worker 并回退后续请求。
|
|
914
|
+
}, {
|
|
915
|
+
key: "_decodeTile",
|
|
916
|
+
value: function () {
|
|
917
|
+
var _decodeTile2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2(buffer) {
|
|
918
|
+
var decodeWorkerClient;
|
|
919
|
+
return _regeneratorRuntime().wrap(function _callee2$(_context2) {
|
|
920
|
+
while (1) switch (_context2.prev = _context2.next) {
|
|
921
|
+
case 0:
|
|
922
|
+
decodeWorkerClient = this._getDecodeWorkerClient();
|
|
923
|
+
if (decodeWorkerClient) {
|
|
924
|
+
_context2.next = 3;
|
|
925
|
+
break;
|
|
926
|
+
}
|
|
927
|
+
return _context2.abrupt("return", decodeTile(buffer));
|
|
928
|
+
case 3:
|
|
929
|
+
_context2.prev = 3;
|
|
930
|
+
_context2.next = 6;
|
|
931
|
+
return decodeWorkerClient.decode(buffer);
|
|
932
|
+
case 6:
|
|
933
|
+
return _context2.abrupt("return", _context2.sent);
|
|
934
|
+
case 9:
|
|
935
|
+
_context2.prev = 9;
|
|
936
|
+
_context2.t0 = _context2["catch"](3);
|
|
937
|
+
this._destroyDecodeWorkerClient();
|
|
938
|
+
this._decodeWithWorker = false;
|
|
939
|
+
console.warn('MVT 解码 Worker 运行失败,后续已回退主线程解码', _context2.t0);
|
|
940
|
+
throw this._toError(_context2.t0, 'Worker 解码 MVT 瓦片失败');
|
|
941
|
+
case 15:
|
|
942
|
+
case "end":
|
|
943
|
+
return _context2.stop();
|
|
944
|
+
}
|
|
945
|
+
}, _callee2, this, [[3, 9]]);
|
|
946
|
+
}));
|
|
947
|
+
function _decodeTile(_x) {
|
|
948
|
+
return _decodeTile2.apply(this, arguments);
|
|
949
|
+
}
|
|
950
|
+
return _decodeTile;
|
|
951
|
+
}() // 请求单个瓦片并解析为自定义 protobuf tile 对象。
|
|
952
|
+
}, {
|
|
953
|
+
key: "_requestTile",
|
|
954
|
+
value: function () {
|
|
955
|
+
var _requestTile2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee3(x, y, z) {
|
|
956
|
+
var url, response, buffer;
|
|
957
|
+
return _regeneratorRuntime().wrap(function _callee3$(_context3) {
|
|
958
|
+
while (1) switch (_context3.prev = _context3.next) {
|
|
959
|
+
case 0:
|
|
960
|
+
url = this._buildTileUrl(x, y, z);
|
|
961
|
+
_context3.next = 3;
|
|
962
|
+
return fetch(url);
|
|
963
|
+
case 3:
|
|
964
|
+
response = _context3.sent;
|
|
965
|
+
if (response.ok) {
|
|
966
|
+
_context3.next = 6;
|
|
967
|
+
break;
|
|
968
|
+
}
|
|
969
|
+
throw new Error("\u8BF7\u6C42\u74E6\u7247\u5931\u8D25: ".concat(response.status, " ").concat(response.statusText));
|
|
970
|
+
case 6:
|
|
971
|
+
_context3.next = 8;
|
|
972
|
+
return response.arrayBuffer();
|
|
973
|
+
case 8:
|
|
974
|
+
buffer = _context3.sent;
|
|
975
|
+
_context3.t0 = x;
|
|
976
|
+
_context3.t1 = y;
|
|
977
|
+
_context3.t2 = z;
|
|
978
|
+
_context3.next = 14;
|
|
979
|
+
return this._decodeTile(buffer);
|
|
980
|
+
case 14:
|
|
981
|
+
_context3.t3 = _context3.sent;
|
|
982
|
+
return _context3.abrupt("return", {
|
|
983
|
+
x: _context3.t0,
|
|
984
|
+
y: _context3.t1,
|
|
985
|
+
z: _context3.t2,
|
|
986
|
+
raw: _context3.t3
|
|
987
|
+
});
|
|
988
|
+
case 16:
|
|
989
|
+
case "end":
|
|
990
|
+
return _context3.stop();
|
|
991
|
+
}
|
|
992
|
+
}, _callee3, this);
|
|
993
|
+
}));
|
|
994
|
+
function _requestTile(_x2, _x3, _x4) {
|
|
995
|
+
return _requestTile2.apply(this, arguments);
|
|
996
|
+
}
|
|
997
|
+
return _requestTile;
|
|
998
|
+
}() // 加载单个瓦片,包含初始化、层级校验、缓存命中和请求去重。
|
|
999
|
+
}, {
|
|
1000
|
+
key: "_loadTile",
|
|
1001
|
+
value: function () {
|
|
1002
|
+
var _loadTile2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee4(x, y, z) {
|
|
1003
|
+
var _this10 = this;
|
|
1004
|
+
var key, cached, pending, requestToken, request;
|
|
1005
|
+
return _regeneratorRuntime().wrap(function _callee4$(_context4) {
|
|
1006
|
+
while (1) switch (_context4.prev = _context4.next) {
|
|
1007
|
+
case 0:
|
|
1008
|
+
_context4.next = 2;
|
|
1009
|
+
return this.init();
|
|
1010
|
+
case 2:
|
|
1011
|
+
this._validateOptions();
|
|
1012
|
+
if (!(z < this.minzoom || z > this.maximumLevel)) {
|
|
1013
|
+
_context4.next = 5;
|
|
1014
|
+
break;
|
|
1015
|
+
}
|
|
1016
|
+
throw this._emitError(new Error("\u74E6\u7247\u5C42\u7EA7 ".concat(z, " \u8D85\u51FA\u8303\u56F4 [").concat(this.minzoom, ", ").concat(this.maximumLevel, "]")));
|
|
1017
|
+
case 5:
|
|
1018
|
+
key = this._getTileKey(x, y, z);
|
|
1019
|
+
cached = this._loadedTiles[key];
|
|
1020
|
+
if (!cached) {
|
|
1021
|
+
_context4.next = 10;
|
|
1022
|
+
break;
|
|
1023
|
+
}
|
|
1024
|
+
this._touchTileCache(key);
|
|
1025
|
+
return _context4.abrupt("return", cached);
|
|
1026
|
+
case 10:
|
|
1027
|
+
pending = this._pendingTiles.get(key);
|
|
1028
|
+
if (!pending) {
|
|
1029
|
+
_context4.next = 13;
|
|
1030
|
+
break;
|
|
1031
|
+
}
|
|
1032
|
+
return _context4.abrupt("return", pending);
|
|
1033
|
+
case 13:
|
|
1034
|
+
// requestToken 用于在 clearCache 后废弃旧请求,避免过期结果再次写回缓存。
|
|
1035
|
+
requestToken = this._requestToken;
|
|
1036
|
+
request = this._requestTile(x, y, z).then(function (tile) {
|
|
1037
|
+
if (requestToken !== _this10._requestToken || _this10._destroyed) {
|
|
1038
|
+
return tile;
|
|
1039
|
+
}
|
|
1040
|
+
_this10._loadedTiles[key] = tile;
|
|
1041
|
+
_this10._touchTileCache(key);
|
|
1042
|
+
_this10._pruneLoadedTiles();
|
|
1043
|
+
_this10.tileLoadEvent.raiseEvent(tile);
|
|
1044
|
+
_this10._syncTileDisplayState(_this10._tilesToUpdate);
|
|
1045
|
+
return tile;
|
|
1046
|
+
}).catch(function (error) {
|
|
1047
|
+
throw _this10._emitError(error);
|
|
1048
|
+
}).finally(function () {
|
|
1049
|
+
_this10._pendingTiles.delete(key);
|
|
1050
|
+
});
|
|
1051
|
+
this._pendingTiles.set(key, request);
|
|
1052
|
+
return _context4.abrupt("return", request);
|
|
1053
|
+
case 17:
|
|
1054
|
+
case "end":
|
|
1055
|
+
return _context4.stop();
|
|
1056
|
+
}
|
|
1057
|
+
}, _callee4, this);
|
|
1058
|
+
}));
|
|
1059
|
+
function _loadTile(_x5, _x6, _x7) {
|
|
1060
|
+
return _loadTile2.apply(this, arguments);
|
|
1061
|
+
}
|
|
1062
|
+
return _loadTile;
|
|
1063
|
+
}() // 把自定义 protobuf 瓦片转换成 FeatureCollection。
|
|
1064
|
+
}, {
|
|
1065
|
+
key: "tileToGeoJSON",
|
|
1066
|
+
value: function tileToGeoJSON(tile) {
|
|
1067
|
+
if (!Array.isArray(tile.raw.features)) {
|
|
1068
|
+
throw this._emitError(new Error('无效的 tile 数据,无法转换 GeoJSON'));
|
|
1069
|
+
}
|
|
1070
|
+
return {
|
|
1071
|
+
x: tile.x,
|
|
1072
|
+
y: tile.y,
|
|
1073
|
+
z: tile.z,
|
|
1074
|
+
geoJson: {
|
|
1075
|
+
type: 'FeatureCollection',
|
|
1076
|
+
features: tile.raw.features
|
|
1077
|
+
}
|
|
1078
|
+
};
|
|
1079
|
+
}
|
|
1080
|
+
|
|
1081
|
+
// 供 Cesium 每帧调用,计算并更新当前视角下需要加载的瓦片。
|
|
1082
|
+
}, {
|
|
1083
|
+
key: "update",
|
|
1084
|
+
value: function update(frameState) {
|
|
1085
|
+
if (!this.ready || this._destroyed) {
|
|
1086
|
+
return;
|
|
1087
|
+
}
|
|
1088
|
+
var tilesToUpdate = this._getTilesToUpdate(frameState);
|
|
1089
|
+
this._syncTileDisplayState(tilesToUpdate);
|
|
1090
|
+
this._updateTiles(tilesToUpdate);
|
|
1091
|
+
}
|
|
1092
|
+
|
|
1093
|
+
// 遍历本帧候选瓦片,并触发尚未加载的可见瓦片请求。
|
|
1094
|
+
}, {
|
|
1095
|
+
key: "_updateTiles",
|
|
1096
|
+
value: function _updateTiles(tilesToUpdate) {
|
|
1097
|
+
var _iterator9 = _createForOfIteratorHelper(tilesToUpdate),
|
|
1098
|
+
_step9;
|
|
1099
|
+
try {
|
|
1100
|
+
for (_iterator9.s(); !(_step9 = _iterator9.n()).done;) {
|
|
1101
|
+
var _tile7 = _step9.value;
|
|
1102
|
+
if (_tile7.state !== 'none') {
|
|
1103
|
+
continue;
|
|
1104
|
+
}
|
|
1105
|
+
void this._loadVisibleTile(_tile7);
|
|
1106
|
+
}
|
|
1107
|
+
} catch (err) {
|
|
1108
|
+
_iterator9.e(err);
|
|
1109
|
+
} finally {
|
|
1110
|
+
_iterator9.f();
|
|
1111
|
+
}
|
|
1112
|
+
}
|
|
1113
|
+
|
|
1114
|
+
// 加载当前可见瓦片,并同步维护瓦片状态。
|
|
1115
|
+
}, {
|
|
1116
|
+
key: "_loadVisibleTile",
|
|
1117
|
+
value: function () {
|
|
1118
|
+
var _loadVisibleTile2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee5(tile) {
|
|
1119
|
+
return _regeneratorRuntime().wrap(function _callee5$(_context5) {
|
|
1120
|
+
while (1) switch (_context5.prev = _context5.next) {
|
|
1121
|
+
case 0:
|
|
1122
|
+
tile.state = 'loading';
|
|
1123
|
+
_context5.prev = 1;
|
|
1124
|
+
_context5.next = 4;
|
|
1125
|
+
return this._loadTile(tile.x, tile.y, tile.z);
|
|
1126
|
+
case 4:
|
|
1127
|
+
tile.state = 'loaded';
|
|
1128
|
+
_context5.next = 11;
|
|
1129
|
+
break;
|
|
1130
|
+
case 7:
|
|
1131
|
+
_context5.prev = 7;
|
|
1132
|
+
_context5.t0 = _context5["catch"](1);
|
|
1133
|
+
tile.state = 'error';
|
|
1134
|
+
console.error("\u52A0\u8F7D\u5931\u8D25 [".concat(tile.x, ", ").concat(tile.y, ", ").concat(tile.z, "]"), _context5.t0);
|
|
1135
|
+
case 11:
|
|
1136
|
+
case "end":
|
|
1137
|
+
return _context5.stop();
|
|
1138
|
+
}
|
|
1139
|
+
}, _callee5, this, [[1, 7]]);
|
|
1140
|
+
}));
|
|
1141
|
+
function _loadVisibleTile(_x8) {
|
|
1142
|
+
return _loadVisibleTile2.apply(this, arguments);
|
|
1143
|
+
}
|
|
1144
|
+
return _loadVisibleTile;
|
|
1145
|
+
}() // 返回当前缓存中的全部已加载瓦片。
|
|
1146
|
+
}, {
|
|
1147
|
+
key: "getLoadedTiles",
|
|
1148
|
+
value: function getLoadedTiles() {
|
|
1149
|
+
return Object.values(this._loadedTiles);
|
|
1150
|
+
}
|
|
1151
|
+
|
|
1152
|
+
// 根据 x、y、z 从缓存中获取单个瓦片。
|
|
1153
|
+
}, {
|
|
1154
|
+
key: "getTile",
|
|
1155
|
+
value: function getTile(x, y, z) {
|
|
1156
|
+
return this._loadedTiles[this._getTileKey(x, y, z)];
|
|
1157
|
+
}
|
|
1158
|
+
|
|
1159
|
+
// 清空缓存并重置所有瓦片状态。
|
|
1160
|
+
}, {
|
|
1161
|
+
key: "clearCache",
|
|
1162
|
+
value: function clearCache() {
|
|
1163
|
+
this._requestToken += 1;
|
|
1164
|
+
var cachedTiles = Object.values(this._loadedTiles);
|
|
1165
|
+
this._hideAllDisplayedTiles();
|
|
1166
|
+
for (var _i4 = 0, _cachedTiles = cachedTiles; _i4 < _cachedTiles.length; _i4++) {
|
|
1167
|
+
var _tile8 = _cachedTiles[_i4];
|
|
1168
|
+
var key = this._getTileKey(_tile8.x, _tile8.y, _tile8.z);
|
|
1169
|
+
this.tileEvictEvent.raiseEvent({
|
|
1170
|
+
key: key,
|
|
1171
|
+
x: _tile8.x,
|
|
1172
|
+
y: _tile8.y,
|
|
1173
|
+
z: _tile8.z
|
|
1174
|
+
});
|
|
1175
|
+
this._removeManagedTileLayers(key);
|
|
1176
|
+
}
|
|
1177
|
+
this._loadedTiles = {};
|
|
1178
|
+
this._pendingTiles.clear();
|
|
1179
|
+
this._cacheOrder.clear();
|
|
1180
|
+
this._removeAllManagedTileLayers();
|
|
1181
|
+
this._resetTileStates();
|
|
1182
|
+
}
|
|
1183
|
+
|
|
1184
|
+
// 把整棵瓦片树的状态恢复为未加载。
|
|
1185
|
+
}, {
|
|
1186
|
+
key: "_resetTileStates",
|
|
1187
|
+
value: function _resetTileStates() {
|
|
1188
|
+
var queue = _toConsumableArray(this._rootTiles);
|
|
1189
|
+
while (queue.length > 0) {
|
|
1190
|
+
var _tile9 = queue.shift();
|
|
1191
|
+
if (!_tile9) {
|
|
1192
|
+
continue;
|
|
1193
|
+
}
|
|
1194
|
+
_tile9.state = 'none';
|
|
1195
|
+
var _iterator10 = _createForOfIteratorHelper(_tile9.children),
|
|
1196
|
+
_step10;
|
|
1197
|
+
try {
|
|
1198
|
+
for (_iterator10.s(); !(_step10 = _iterator10.n()).done;) {
|
|
1199
|
+
var child = _step10.value;
|
|
1200
|
+
queue.push(child);
|
|
1201
|
+
}
|
|
1202
|
+
} catch (err) {
|
|
1203
|
+
_iterator10.e(err);
|
|
1204
|
+
} finally {
|
|
1205
|
+
_iterator10.f();
|
|
1206
|
+
}
|
|
1207
|
+
}
|
|
1208
|
+
}
|
|
1209
|
+
|
|
1210
|
+
// 销毁加载器并清理缓存与事件监听。
|
|
1211
|
+
}, {
|
|
1212
|
+
key: "destroy",
|
|
1213
|
+
value: function destroy() {
|
|
1214
|
+
if (this._destroyed) {
|
|
1215
|
+
return;
|
|
1216
|
+
}
|
|
1217
|
+
this._destroyed = true;
|
|
1218
|
+
this.clearCache();
|
|
1219
|
+
this._destroyDecodeWorkerClient();
|
|
1220
|
+
this._clearListenerRegistry();
|
|
1221
|
+
removeAllEventListeners(this.readyEvent);
|
|
1222
|
+
removeAllEventListeners(this.errorEvent);
|
|
1223
|
+
removeAllEventListeners(this.tileLoadEvent);
|
|
1224
|
+
removeAllEventListeners(this.tileDisplayEvent);
|
|
1225
|
+
removeAllEventListeners(this.tileEvictEvent);
|
|
1226
|
+
this._removeFromMap();
|
|
1227
|
+
}
|
|
1228
|
+
|
|
1229
|
+
// 判断当前实例是否已经销毁。
|
|
1230
|
+
}, {
|
|
1231
|
+
key: "isDestroyed",
|
|
1232
|
+
value: function isDestroyed() {
|
|
1233
|
+
return this._destroyed;
|
|
1234
|
+
}
|
|
1235
|
+
}]);
|
|
1236
|
+
return MvtVectorLoad;
|
|
1237
|
+
}();
|
|
1238
|
+
var VectorLoadTile = /*#__PURE__*/function () {
|
|
1239
|
+
// 创建单个四叉树瓦片节点。
|
|
1240
|
+
function VectorLoadTile(options) {
|
|
1241
|
+
_classCallCheck(this, VectorLoadTile);
|
|
1242
|
+
// 当前瓦片的 X 坐标。
|
|
1243
|
+
_defineProperty(this, "x", void 0);
|
|
1244
|
+
// 当前瓦片的 Y 坐标。
|
|
1245
|
+
_defineProperty(this, "y", void 0);
|
|
1246
|
+
// 当前瓦片所在层级。
|
|
1247
|
+
_defineProperty(this, "z", void 0);
|
|
1248
|
+
// 当前瓦片的唯一缓存键。
|
|
1249
|
+
_defineProperty(this, "key", void 0);
|
|
1250
|
+
// 所属的 VectorLoad 实例。
|
|
1251
|
+
_defineProperty(this, "parent", void 0);
|
|
1252
|
+
// 当前瓦片使用的切片方案。
|
|
1253
|
+
_defineProperty(this, "tilingScheme", void 0);
|
|
1254
|
+
// 当前瓦片对应的地理范围。
|
|
1255
|
+
_defineProperty(this, "rectangle", void 0);
|
|
1256
|
+
// 用于可见性与距离计算的包围区域。
|
|
1257
|
+
_defineProperty(this, "tileBoundingRegion", void 0);
|
|
1258
|
+
// 当前瓦片的子节点列表。
|
|
1259
|
+
_defineProperty(this, "children", void 0);
|
|
1260
|
+
// 当前瓦片到相机的距离。
|
|
1261
|
+
_defineProperty(this, "distanceToCamera", void 0);
|
|
1262
|
+
// 当前瓦片相对于视锥的可见性状态。
|
|
1263
|
+
_defineProperty(this, "visibility", void 0);
|
|
1264
|
+
// 当前瓦片的加载状态。
|
|
1265
|
+
_defineProperty(this, "state", void 0);
|
|
1266
|
+
this.x = options.x;
|
|
1267
|
+
this.y = options.y;
|
|
1268
|
+
this.z = options.z;
|
|
1269
|
+
this.key = "".concat(this.x, ",").concat(this.y, ",").concat(this.z);
|
|
1270
|
+
this.parent = options.parent;
|
|
1271
|
+
this.children = [];
|
|
1272
|
+
this.tilingScheme = options.tilingScheme;
|
|
1273
|
+
this.rectangle = this.tilingScheme.tileXYToRectangle(this.x, this.y, this.z);
|
|
1274
|
+
this.tileBoundingRegion = new CesiumRuntime.TileBoundingRegion({
|
|
1275
|
+
rectangle: this.rectangle,
|
|
1276
|
+
minimumHeight: 0,
|
|
1277
|
+
maximumHeight: 0,
|
|
1278
|
+
ellipsoid: this.tilingScheme.ellipsoid,
|
|
1279
|
+
computeBoundingVolumes: true
|
|
1280
|
+
});
|
|
1281
|
+
this.distanceToCamera = 0;
|
|
1282
|
+
this.visibility = Cesium.Intersect.INSIDE;
|
|
1283
|
+
this.state = 'none';
|
|
1284
|
+
}
|
|
1285
|
+
|
|
1286
|
+
// 创建四个子瓦片;如果已经创建过则直接返回。
|
|
1287
|
+
_createClass(VectorLoadTile, [{
|
|
1288
|
+
key: "createChildren",
|
|
1289
|
+
value: function createChildren() {
|
|
1290
|
+
if (this.children.length > 0) {
|
|
1291
|
+
return;
|
|
1292
|
+
}
|
|
1293
|
+
var tiles = [{
|
|
1294
|
+
x: this.x * 2,
|
|
1295
|
+
y: this.y * 2 + 1,
|
|
1296
|
+
z: this.z + 1
|
|
1297
|
+
}, {
|
|
1298
|
+
x: this.x * 2 + 1,
|
|
1299
|
+
y: this.y * 2 + 1,
|
|
1300
|
+
z: this.z + 1
|
|
1301
|
+
}, {
|
|
1302
|
+
x: this.x * 2,
|
|
1303
|
+
y: this.y * 2,
|
|
1304
|
+
z: this.z + 1
|
|
1305
|
+
}, {
|
|
1306
|
+
x: this.x * 2 + 1,
|
|
1307
|
+
y: this.y * 2,
|
|
1308
|
+
z: this.z + 1
|
|
1309
|
+
}];
|
|
1310
|
+
for (var _i5 = 0, _tiles = tiles; _i5 < _tiles.length; _i5++) {
|
|
1311
|
+
var _tiles$_i = _tiles[_i5],
|
|
1312
|
+
x = _tiles$_i.x,
|
|
1313
|
+
y = _tiles$_i.y,
|
|
1314
|
+
z = _tiles$_i.z;
|
|
1315
|
+
this.children.push(new VectorLoadTile({
|
|
1316
|
+
x: x,
|
|
1317
|
+
y: y,
|
|
1318
|
+
z: z,
|
|
1319
|
+
tilingScheme: this.tilingScheme,
|
|
1320
|
+
parent: this.parent
|
|
1321
|
+
}));
|
|
1322
|
+
}
|
|
1323
|
+
}
|
|
1324
|
+
|
|
1325
|
+
// 根据可见性和屏幕空间误差判断接受当前瓦片还是继续访问子节点。
|
|
1326
|
+
}, {
|
|
1327
|
+
key: "visit",
|
|
1328
|
+
value: function visit(frameState, visitor, getScreenSpaceError) {
|
|
1329
|
+
this.distanceToCamera = this.tileBoundingRegion.distanceToCamera(frameState);
|
|
1330
|
+
this.visibility = frameState.cullingVolume.computeVisibility(this.tileBoundingRegion);
|
|
1331
|
+
if (this.visibility === Cesium.Intersect.OUTSIDE) {
|
|
1332
|
+
return;
|
|
1333
|
+
}
|
|
1334
|
+
var maxSSE = frameState.maximumScreenSpaceError;
|
|
1335
|
+
var sse = getScreenSpaceError(frameState, this);
|
|
1336
|
+
|
|
1337
|
+
// minzoom 只作为显示和请求下限,不强制把瓦片树预展开到指定层级。
|
|
1338
|
+
if (this.z < this.parent.minzoom) {
|
|
1339
|
+
if (sse >= maxSSE) {
|
|
1340
|
+
visitor.visitChildren(this);
|
|
1341
|
+
}
|
|
1342
|
+
return;
|
|
1343
|
+
}
|
|
1344
|
+
if (sse >= maxSSE) {
|
|
1345
|
+
visitor.visitChildren(this);
|
|
1346
|
+
return;
|
|
1347
|
+
}
|
|
1348
|
+
visitor.accept(this);
|
|
1349
|
+
}
|
|
1350
|
+
}]);
|
|
1351
|
+
return VectorLoadTile;
|
|
1352
|
+
}();
|
|
1353
|
+
export default MvtVectorLoad;
|