deeptwins-engine-3d 0.1.72 → 0.1.75

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.
@@ -0,0 +1,29 @@
1
+ /*
2
+ object-assign
3
+ (c) Sindre Sorhus
4
+ @license MIT
5
+ */
6
+
7
+ /*! *****************************************************************************
8
+ Copyright (c) Microsoft Corporation. All rights reserved.
9
+ Licensed under the Apache License, Version 2.0 (the "License"); you may not use
10
+ this file except in compliance with the License. You may obtain a copy of the
11
+ License at http://www.apache.org/licenses/LICENSE-2.0
12
+
13
+ THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14
+ KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
15
+ WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
16
+ MERCHANTABLITY OR NON-INFRINGEMENT.
17
+
18
+ See the Apache Version 2.0 License for specific language governing permissions
19
+ and limitations under the License.
20
+ ***************************************************************************** */
21
+
22
+ /**
23
+ * splaytree v3.1.2
24
+ * Fast Splay tree for Node and browser
25
+ *
26
+ * @author Alexander Milevski <info@w8r.name>
27
+ * @license MIT
28
+ * @preserve
29
+ */
@@ -572,7 +572,8 @@ export var DEFAULT_BASE_LAYER = {
572
572
  maximumLevel: 18,
573
573
  credit: 'gd_img'
574
574
  }, {
575
- url: 'https://webst02.is.autonavi.com/appmaptile?x={x}&y={y}&z={z}&lang=zh_cn&size=1&scale=1&style=8',
575
+ url: 'https://webst0{s}.is.autonavi.com/appmaptile?x={x}&y={y}&z={z}&lang=zh_cn&size=1&scale=1&style=8',
576
+ subdomains: ['1', '2', '3', '4'],
576
577
  minimumLevel: 1,
577
578
  maximumLevel: 18,
578
579
  credit: 'gd_img_zj'
@@ -593,7 +594,8 @@ export var DEFAULT_BASE_LAYER = {
593
594
  name: '高德电子+注记',
594
595
  type: 'raster',
595
596
  layers: [{
596
- url: 'https://wprd02.is.autonavi.com/appmaptile?x={x}&y={y}&z={z}&lang=zh_cn&size=1&scl=1&style=7',
597
+ url: 'http://webrd0{s}.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=8&x={x}&y={y}&z={z}',
598
+ subdomains: ['1', '2', '3', '4'],
597
599
  minimumLevel: 1,
598
600
  maximumLevel: 18,
599
601
  credit: 'gd_vec_zj'
package/dist/esm/index.js CHANGED
@@ -73,11 +73,11 @@ DEEP_TWINS_BASE_URL && (window.CESIUM_BASE_URL = DEEP_TWINS_BASE_URL);
73
73
  // 全局加载css
74
74
  loadCss(Cesium.buildModuleUrl('Widgets/widgets.css'));
75
75
  // 打印版本信息
76
- console.log('DeepTwinsEngine3D Version:', "0.1.72");
76
+ console.log('DeepTwinsEngine3D Version:', "0.1.75");
77
77
  export var DeepTwinsEngine3D = /*#__PURE__*/_createClass(function DeepTwinsEngine3D() {
78
78
  _classCallCheck(this, DeepTwinsEngine3D);
79
79
  });
80
- _defineProperty(DeepTwinsEngine3D, "Version", "0.1.72");
80
+ _defineProperty(DeepTwinsEngine3D, "Version", "0.1.75");
81
81
  _defineProperty(DeepTwinsEngine3D, "Map", Map);
82
82
  _defineProperty(DeepTwinsEngine3D, "GroundSkyBox", GroundSkyBox);
83
83
  _defineProperty(DeepTwinsEngine3D, "RasterLayer", RasterLayer);
@@ -0,0 +1,41 @@
1
+ export type CustomRasterClipBounds = [number, number, number, number];
2
+ export type CustomRasterClipFeature = {
3
+ feature: any;
4
+ bbox: CustomRasterClipBounds;
5
+ };
6
+ export type CustomRasterClipResult = {
7
+ status: 'kept';
8
+ reason: 'within-clip';
9
+ } | {
10
+ status: 'discarded';
11
+ reason: 'outside-clip';
12
+ } | {
13
+ status: 'clipped';
14
+ reason: 'intersects-clip';
15
+ paths: number[][][];
16
+ };
17
+ export type CustomRasterClipTaskOptions = {
18
+ tileBbox: CustomRasterClipBounds;
19
+ candidateIndexes: number[];
20
+ width: number;
21
+ height: number;
22
+ };
23
+ interface CustomRasterClipWorkerClientOptions {
24
+ workerUrl?: string;
25
+ features: CustomRasterClipFeature[];
26
+ }
27
+ declare class CustomRasterClipWorkerClient {
28
+ private _worker;
29
+ private _requestId;
30
+ private _pendingTasks;
31
+ constructor(options: CustomRasterClipWorkerClientOptions);
32
+ clip(options: CustomRasterClipTaskOptions): Promise<CustomRasterClipResult>;
33
+ destroy(): void;
34
+ private _init;
35
+ private _handleMessage;
36
+ private _handleError;
37
+ private _shutdown;
38
+ private _failAllPending;
39
+ private _toError;
40
+ }
41
+ export default CustomRasterClipWorkerClient;
@@ -0,0 +1,147 @@
1
+ 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); }
2
+ 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; }
3
+ 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; }
4
+ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
5
+ 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); } }
6
+ function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
7
+ 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; }
8
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
9
+ 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); }
10
+ import { getDeepTwinsFile } from "../tool/utils";
11
+ var DEFAULT_CUSTOM_RASTER_CLIP_WORKER_FILE = 'Workers/CustomRasterClip.worker.js';
12
+ var DEFAULT_CUSTOM_RASTER_CLIP_WORKER_NAME = 'CustomRasterClip.worker';
13
+ // 创建栅格裁剪 Worker。
14
+ function createClipWorker(options) {
15
+ var workerUrl = options.workerUrl || getDeepTwinsFile(DEFAULT_CUSTOM_RASTER_CLIP_WORKER_FILE);
16
+ return new Worker(workerUrl, {
17
+ type: 'module',
18
+ name: DEFAULT_CUSTOM_RASTER_CLIP_WORKER_NAME
19
+ });
20
+ }
21
+ var CustomRasterClipWorkerClient = /*#__PURE__*/function () {
22
+ function CustomRasterClipWorkerClient(options) {
23
+ var _this = this;
24
+ _classCallCheck(this, CustomRasterClipWorkerClient);
25
+ _defineProperty(this, "_worker", void 0);
26
+ _defineProperty(this, "_requestId", void 0);
27
+ _defineProperty(this, "_pendingTasks", void 0);
28
+ _defineProperty(this, "_handleMessage", function (event) {
29
+ var response = event.data;
30
+ var task = _this._pendingTasks.get(response.id);
31
+ if (!task) {
32
+ return;
33
+ }
34
+ _this._pendingTasks.delete(response.id);
35
+ if ('error' in response) {
36
+ task.reject(new Error(response.error));
37
+ return;
38
+ }
39
+ task.resolve(response.result);
40
+ });
41
+ _defineProperty(this, "_handleError", function (event) {
42
+ var _event$error;
43
+ _this._shutdown(_this._toError((_event$error = event.error) !== null && _event$error !== void 0 ? _event$error : event.message, '栅格裁剪 Worker 运行失败'));
44
+ });
45
+ if (typeof Worker !== 'function') {
46
+ throw new Error('当前环境不支持 Worker');
47
+ }
48
+ this._worker = createClipWorker(options);
49
+ this._requestId = 0;
50
+ this._pendingTasks = new Map();
51
+ this._worker.addEventListener('message', this._handleMessage);
52
+ this._worker.addEventListener('error', this._handleError);
53
+ this._init(options.features);
54
+ }
55
+
56
+ // 发送单个裁剪任务,Worker 只返回几何关系和画布路径。
57
+ _createClass(CustomRasterClipWorkerClient, [{
58
+ key: "clip",
59
+ value: function clip(options) {
60
+ var _this2 = this;
61
+ var worker = this._worker;
62
+ if (!worker) {
63
+ return Promise.reject(new Error('栅格裁剪 Worker 已销毁'));
64
+ }
65
+ var id = ++this._requestId;
66
+ return new Promise(function (resolve, reject) {
67
+ _this2._pendingTasks.set(id, {
68
+ resolve: resolve,
69
+ reject: reject
70
+ });
71
+ try {
72
+ worker.postMessage(_objectSpread({
73
+ type: 'clip',
74
+ id: id
75
+ }, options));
76
+ } catch (error) {
77
+ _this2._pendingTasks.delete(id);
78
+ reject(_this2._toError(error, '发送栅格裁剪任务失败'));
79
+ }
80
+ });
81
+ }
82
+
83
+ // 销毁 Worker,并让所有挂起任务立即失败。
84
+ }, {
85
+ key: "destroy",
86
+ value: function destroy() {
87
+ this._shutdown(new Error('栅格裁剪 Worker 已销毁'));
88
+ }
89
+ }, {
90
+ key: "_init",
91
+ value: function _init(features) {
92
+ var worker = this._worker;
93
+ if (!worker) {
94
+ return;
95
+ }
96
+ try {
97
+ worker.postMessage({
98
+ type: 'init',
99
+ features: features
100
+ });
101
+ } catch (error) {
102
+ var normalizedError = this._toError(error, '初始化栅格裁剪 Worker 失败');
103
+ this._shutdown(normalizedError);
104
+ throw normalizedError;
105
+ }
106
+ }
107
+ }, {
108
+ key: "_shutdown",
109
+ value: function _shutdown(reason) {
110
+ if (!this._worker) {
111
+ this._failAllPending(reason);
112
+ return;
113
+ }
114
+ this._worker.removeEventListener('message', this._handleMessage);
115
+ this._worker.removeEventListener('error', this._handleError);
116
+ this._worker.terminate();
117
+ this._worker = null;
118
+ this._failAllPending(reason);
119
+ }
120
+ }, {
121
+ key: "_failAllPending",
122
+ value: function _failAllPending(reason) {
123
+ var pendingTasks = [];
124
+ this._pendingTasks.forEach(function (task) {
125
+ pendingTasks.push(task);
126
+ });
127
+ this._pendingTasks.clear();
128
+ for (var _i = 0, _pendingTasks = pendingTasks; _i < _pendingTasks.length; _i++) {
129
+ var task = _pendingTasks[_i];
130
+ task.reject(reason);
131
+ }
132
+ }
133
+ }, {
134
+ key: "_toError",
135
+ value: function _toError(error, fallbackMessage) {
136
+ if (error instanceof Error) {
137
+ return error;
138
+ }
139
+ if (typeof error === 'string' && error.length > 0) {
140
+ return new Error(error);
141
+ }
142
+ return new Error(fallbackMessage);
143
+ }
144
+ }]);
145
+ return CustomRasterClipWorkerClient;
146
+ }();
147
+ export default CustomRasterClipWorkerClient;
@@ -50,14 +50,18 @@ import ImageryLayer from './ImageryLayer';
50
50
  * - `clipFeatureCrs`:可选,clipFeature 的原始坐标系,默认跟随 dataCrs。
51
51
  * - `renderCrs`:可选,bounds、clipFeature 和瓦片范围转换后的目标坐标系,默认 `EPSG:4326`。
52
52
  * - `projectionDefs`:可选,自定义 proj4 坐标系定义。
53
- * - `clipFeature`:可选,GeoJSON Polygon/MultiPolygon/Feature/FeatureCollection
53
+ * - `clipFeature`:可选,GeoJSON Polygon/MultiPolygon/Feature/FeatureCollection,`null` 等同未传。
54
54
  * - `autoFitBounds`:可选,创建后自动将相机定位到最终范围,需同时传入 `map`。
55
- * - `debug`:可选,`true` 使用 console.debug,函数则接收结构化调试事件。
55
+ * - `clipWithWorker`:可选,裁剪几何计算优先使用 Worker,默认 `true`。
56
+ * - `clipWorkerUrl`:可选,自定义裁剪 Worker 地址。
57
+ * - `debug`:可选,`true` 使用 console.log 输出调试信息,函数则接收结构化调试事件。
56
58
  */
57
59
  /** 通用范围格式:[minX, minY, maxX, maxY]。 */
58
60
  export type CustomRasterBounds = [number, number, number, number];
59
61
  /** 调试事件类型,覆盖范围初始化、瓦片加载和裁剪决策。 */
60
62
  export type CustomRasterLayerDebugEventType = 'range' | 'tile-loaded' | 'tile-kept' | 'tile-clipped' | 'tile-discarded' | 'tile-error';
63
+ /** 瓦片 debug 状态。 */
64
+ export type CustomRasterLayerDebugStatus = 'loaded' | 'kept' | 'clipped' | 'filtered' | 'error';
61
65
  /** debug 回调收到的结构化事件。 */
62
66
  export type CustomRasterLayerDebugEvent = {
63
67
  /** 事件类型。 */
@@ -70,6 +74,16 @@ export type CustomRasterLayerDebugEvent = {
70
74
  y?: number;
71
75
  /** 瓦片层级。 */
72
76
  level?: number;
77
+ /** 瓦片标识,格式为 z/x/y。 */
78
+ tileKey?: string;
79
+ /** 瓦片是否已进入加载流程。 */
80
+ loaded?: boolean;
81
+ /** 瓦片是否被裁剪。 */
82
+ clipped?: boolean;
83
+ /** 瓦片是否被过滤为空透明瓦片。 */
84
+ filtered?: boolean;
85
+ /** 瓦片处理状态。 */
86
+ status?: CustomRasterLayerDebugStatus;
73
87
  /** 当前瓦片范围,格式为 [west, south, east, north]。 */
74
88
  bbox?: CustomRasterBounds;
75
89
  /** 用户传入的原始瓦片范围。 */
@@ -80,6 +94,8 @@ export type CustomRasterLayerDebugEvent = {
80
94
  clipBounds?: CustomRasterBounds;
81
95
  /** 最终用于瓦片调度的渲染范围。 */
82
96
  renderBounds?: CustomRasterBounds;
97
+ /** 转换到 renderCrs 后的裁剪 GeoJSON。 */
98
+ clipFeature?: any;
83
99
  /** bounds 原始坐标系。 */
84
100
  dataCrs?: string;
85
101
  /** clipFeature 原始坐标系。 */
@@ -96,7 +112,7 @@ export type CustomRasterLayerDebugEvent = {
96
112
  height: number;
97
113
  };
98
114
  };
99
- /** debug 配置:关闭、console.debug 输出,或自定义事件处理函数。 */
115
+ /** debug 配置:关闭、console.log 输出,或自定义事件处理函数。 */
100
116
  export type CustomRasterLayerDebug = boolean | ((event: CustomRasterLayerDebugEvent) => void);
101
117
  /** 内置切片方案名称,或 Cesium 原生 TilingScheme 实例。 */
102
118
  export type CustomRasterTilingSchemeOption = 'webMercator' | 'geographic' | Cesium.TilingScheme;
@@ -125,7 +141,7 @@ export type CustomRasterLayerOptions = {
125
141
  renderCrs?: string;
126
142
  /** 自定义 proj4 坐标系定义,key 可为 EPSG:xxxx 或其他 proj4 名称。 */
127
143
  projectionDefs?: Record<string, string>;
128
- /** 用于裁剪瓦片的 GeoJSON 面要素。 */
144
+ /** 用于裁剪瓦片的 GeoJSON 面要素,null 等同未传。 */
129
145
  clipFeature?: any;
130
146
  /** 地图实例,autoFitBounds 或手动 fitToBounds 时用于控制相机。 */
131
147
  map?: any;
@@ -133,6 +149,10 @@ export type CustomRasterLayerOptions = {
133
149
  autoFitBounds?: boolean;
134
150
  /** 自动定位到范围时透传给相机 flyTo 的配置,默认 { duration: 0 }。 */
135
151
  fitBoundsOptions?: any;
152
+ /** 是否优先使用 Worker 计算裁剪几何,默认 true,失败时自动回退主线程。 */
153
+ clipWithWorker?: boolean;
154
+ /** 自定义裁剪 Worker 地址,优先于默认 DeepTwins 静态资源地址。 */
155
+ clipWorkerUrl?: string;
136
156
  /** 调试开关或自定义调试事件处理函数。 */
137
157
  debug?: CustomRasterLayerDebug;
138
158
  };
@@ -159,13 +179,20 @@ export default class CustomRasterLayer extends ImageryLayer {
159
179
  readonly source: Cesium.UrlTemplateImageryProvider;
160
180
  private readonly _debug?;
161
181
  private readonly _clipFeatures;
182
+ private readonly _clipFeatureEntries;
162
183
  private readonly _fitBounds?;
184
+ private readonly _clipWorkerUrl;
185
+ private _clipWithWorker;
186
+ private _clipWorkerClient;
163
187
  private _mapContext;
188
+ private _destroyed;
164
189
  /** 创建通用栅格图层。 */
165
190
  constructor(options: CustomRasterLayerOptions);
166
191
  getMap(): any;
167
192
  /** 将相机定位到当前图层最终渲染范围。 */
168
193
  fitToBounds(map?: any, options?: any): this;
194
+ /** 销毁图层并释放裁剪 Worker。 */
195
+ destroy(): void;
169
196
  /**
170
197
  * Cesium 内部纹理创建钩子。
171
198
  *
@@ -177,7 +204,16 @@ export default class CustomRasterLayer extends ImageryLayer {
177
204
  _createTexture(context: any, imagery: RasterImagery): any;
178
205
  /** 调用 Cesium 原始纹理创建逻辑。 */
179
206
  private createTexture;
180
- /** 获取当前瓦片与所有裁剪面的交集,用交集路径裁剪当前瓦片。 */
207
+ /** 根据裁剪面 bbox 粗过滤当前瓦片可能相交的面。 */
208
+ private getCandidateClipFeatureIndexes;
209
+ private getClipFeatures;
210
+ private getClipWorkerClient;
211
+ private destroyClipWorkerClient;
212
+ private createClippedTexture;
213
+ /** 主线程裁剪回退逻辑,保持与 Worker 返回结构一致。 */
214
+ private clipTileOnMainThread;
215
+ private applyClipResult;
216
+ /** 获取当前瓦片与候选裁剪面的交集,用交集路径裁剪当前瓦片。 */
181
217
  private getClipIntersections;
182
218
  /** 创建与当前瓦片同尺寸的透明 canvas。 */
183
219
  private createTileCanvas;
@@ -187,6 +223,10 @@ export default class CustomRasterLayer extends ImageryLayer {
187
223
  private geometryToPathArray;
188
224
  /** 按 path 坐标裁剪当前瓦片画布。 */
189
225
  private clip;
226
+ private getTileKey;
227
+ private getDebugStatus;
228
+ private normalizeDebugEvent;
229
+ private logBuiltInDebug;
190
230
  /** 输出结构化 debug 事件。 */
191
231
  private logDebug;
192
232
  }