s3m-maplibre 0.2.10 → 0.2.12

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.
Files changed (50) hide show
  1. package/README.md +9 -8
  2. package/dist/index.d.ts +4 -1
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +3 -0
  5. package/dist/index.js.map +1 -1
  6. package/dist/render/CoordinateHelper.d.ts +90 -0
  7. package/dist/render/CoordinateHelper.d.ts.map +1 -0
  8. package/dist/render/CoordinateHelper.js +85 -0
  9. package/dist/render/CoordinateHelper.js.map +1 -0
  10. package/dist/render/DatasetManager.d.ts +109 -0
  11. package/dist/render/DatasetManager.d.ts.map +1 -0
  12. package/dist/render/DatasetManager.js +229 -0
  13. package/dist/render/DatasetManager.js.map +1 -0
  14. package/dist/render/FeatureStyleManager.d.ts +159 -0
  15. package/dist/render/FeatureStyleManager.d.ts.map +1 -0
  16. package/dist/render/FeatureStyleManager.js +629 -0
  17. package/dist/render/FeatureStyleManager.js.map +1 -0
  18. package/dist/render/GeometryBuilder.d.ts.map +1 -1
  19. package/dist/render/GeometryBuilder.js +17 -7
  20. package/dist/render/GeometryBuilder.js.map +1 -1
  21. package/dist/render/GroundManager.d.ts +61 -0
  22. package/dist/render/GroundManager.d.ts.map +1 -0
  23. package/dist/render/GroundManager.js +221 -0
  24. package/dist/render/GroundManager.js.map +1 -0
  25. package/dist/render/S3MLayer.d.ts +60 -282
  26. package/dist/render/S3MLayer.d.ts.map +1 -1
  27. package/dist/render/S3MLayer.js +397 -890
  28. package/dist/render/S3MLayer.js.map +1 -1
  29. package/dist/render/StyleMaterial.js +2 -2
  30. package/dist/render/StyleMaterial.js.map +1 -1
  31. package/dist/tileset/S3MTileset.d.ts +12 -1
  32. package/dist/tileset/S3MTileset.d.ts.map +1 -1
  33. package/dist/tileset/S3MTileset.js +122 -14
  34. package/dist/tileset/S3MTileset.js.map +1 -1
  35. package/docs/API.md +1 -1
  36. package/docs/index.html +182 -11
  37. package/package.json +1 -1
  38. package/src/index.ts +6 -0
  39. package/src/render/CoordinateHelper.ts +143 -0
  40. package/src/render/DatasetManager.ts +301 -0
  41. package/src/render/FeatureStyleManager.ts +773 -0
  42. package/src/render/GeometryBuilder.ts +22 -7
  43. package/src/render/GroundManager.ts +245 -0
  44. package/src/render/S3MLayer.ts +490 -1096
  45. package/src/render/StyleMaterial.ts +2 -2
  46. package/src/tileset/S3MTileset.ts +136 -12
  47. package/tools/build-docs.mjs +182 -11
  48. package/tools/test-instanced.mjs +12 -1
  49. package/tools/test-new-features.mjs +164 -0
  50. package/tools/test-regressions.mjs +62 -0
package/README.md CHANGED
@@ -3,6 +3,7 @@
3
3
  **在 MapLibre GL JS 里原生渲染 SuperMap S3M 三维模型** —— 浏览器直接解析 `.s3mb` 瓦片,不需要预先转成 3D Tiles,也不需要 SuperMap 的 WebGL 客户端。
4
4
 
5
5
  [![npm](https://img.shields.io/npm/v/s3m-maplibre?color=blue&label=npm)](https://www.npmjs.com/package/s3m-maplibre)
6
+ [![docs](https://img.shields.io/badge/docs-online-38bdf8)](https://joo1es.github.io/s3m-maplibre/docs/index.html)
6
7
  [![demo](https://img.shields.io/badge/demo-online-2ea44f)](https://joo1es.github.io/s3m-maplibre/demo/index.html)
7
8
  [![license](https://img.shields.io/badge/license-Apache--2.0-green)](./LICENSE)
8
9
  [![types](https://img.shields.io/badge/types-included-blue)](./src/index.ts)
@@ -70,7 +71,7 @@ iServer / 本地目录 → .scp 配置 + .s3mb 瓦片
70
71
  npm install s3m-maplibre three
71
72
  ```
72
73
 
73
- 包在 npm 上是 [s3m-maplibre](https://www.npmjs.com/package/s3m-maplibre),当前 `0.2.8`。
74
+ 包在 npm 上是 [s3m-maplibre](https://www.npmjs.com/package/s3m-maplibre)。
74
75
 
75
76
  `three` 是 peer 依赖(`>=0.168.0`)。`maplibre-gl` 不是依赖——图层只是一个符合 `CustomLayerInterface` 的普通对象,MapLibre / Mapbox 都能挂;不用地图时也能只用解析和瓦片层(见「纯 three.js 使用」)。
76
77
 
@@ -137,18 +138,18 @@ map.on('click', (e) => {
137
138
  });
138
139
  ```
139
140
 
140
- 完整接口见 **[docs/API.md](./docs/API.md)**。
141
+ 完整接口见 **[开发指南与 API 文档(在线网页)](https://joo1es.github.io/s3m-maplibre/docs/index.html)** 或本地 **[docs/API.md](./docs/API.md)**。
141
142
 
142
143
  ---
143
144
 
144
- ## 演示
145
+ ## 演示与在线文档
145
146
 
146
- 在线跑(GitHub Pages,数据随仓库一起发布):
147
+ 在线体验与文档(GitHub Pages,数据随仓库一起发布):
147
148
 
148
- - **MapLibre 版** — <https://joo1es.github.io/s3m-maplibre/demo/index.html>
149
- - **纯 three.js 版** — <https://joo1es.github.io/s3m-maplibre/demo/three.html>
150
-
151
- (<https://joo1es.github.io/s3m-maplibre/> 是入口页,两个示例都能进)
149
+ - **📚 完整开发指南 & API 文档** — <https://joo1es.github.io/s3m-maplibre/docs/index.html>
150
+ - **🗺️ MapLibre 版演示** — <https://joo1es.github.io/s3m-maplibre/demo/index.html>
151
+ - **🧊 纯 three.js 版演示** — <https://joo1es.github.io/s3m-maplibre/demo/three.html>
152
+ - **🏠 Pages 导航入口** — <https://joo1es.github.io/s3m-maplibre/>
152
153
 
153
154
  本地跑:
154
155
 
package/dist/index.d.ts CHANGED
@@ -18,7 +18,10 @@ export type { Vec3, BoundingBox, AttrDType, VertexAttribute, IndexPackage, Verte
18
18
  export { S3MTileset } from './tileset/S3MTileset.js';
19
19
  export type { TileNode, BuildTileFn, S3MTilesetOptions } from './tileset/S3MTileset.js';
20
20
  export { S3MLayer, DEFAULT_STYLE, STYLE, STYLE_LABELS, SELECT_MODE, SELECT_MODE_LABELS } from './render/S3MLayer.js';
21
- export type { S3MLayerOptions, S3MStyle, SelectMode, FeatureStyle, S3MFilter, S3MDatasetOptions, S3MDatasetEntry, PickResult, MapLike, MapMouseEventLike, ColorByFieldOptions, ThematicLegendEntry, BatchConflict, BatchAudit, ThematicResult, FieldFilterOptions, FieldFilterResult, FieldElevationOptions, FieldElevationResult, } from './render/S3MLayer.js';
21
+ export { GroundManager } from './render/GroundManager.js';
22
+ export { DatasetManager } from './render/DatasetManager.js';
23
+ export { FeatureStyleManager } from './render/FeatureStyleManager.js';
24
+ export type { S3MLayerOptions, S3MStyle, SelectMode, FeatureStyle, S3MFilter, DatasetAlignment, S3MDatasetOptions, S3MDatasetEntry, GroundMode, GroundOptions, PickResult, MapLike, MapMouseEventLike, ColorByFieldOptions, ThematicLegendEntry, BatchConflict, BatchAudit, ThematicResult, FieldFilterOptions, FieldFilterResult, FieldElevationOptions, FieldElevationResult, } from './render/S3MLayer.js';
22
25
  export { buildTileObjects } from './render/GeometryBuilder.js';
23
26
  export type { BuildTileOptions, BuildTileResult, TileBuildStats } from './render/GeometryBuilder.js';
24
27
  export { createTexture, PixelFormat, setMaxAnisotropy } from './render/TextureFactory.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACtF,YAAY,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC/G,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,YAAY,EACV,qBAAqB,EACrB,cAAc,EACd,YAAY,GACb,MAAM,0BAA0B,CAAC;AAGlC,YAAY,EACV,IAAI,EACJ,WAAW,EACX,SAAS,EACT,eAAe,EACf,YAAY,EACZ,aAAa,EACb,WAAW,EACX,SAAS,EACT,eAAe,EACf,KAAK,EACL,OAAO,EACP,SAAS,EACT,UAAU,EACV,UAAU,EACV,MAAM,EACN,KAAK,EACL,iBAAiB,EACjB,UAAU,EACV,aAAa,GACd,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,YAAY,EAAE,QAAQ,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAGxF,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AACrH,YAAY,EACV,eAAe,EACf,QAAQ,EACR,UAAU,EACV,YAAY,EACZ,SAAS,EACT,iBAAiB,EACjB,eAAe,EACf,UAAU,EACV,OAAO,EACP,iBAAiB,EACjB,mBAAmB,EACnB,mBAAmB,EACnB,aAAa,EACb,UAAU,EACV,cAAc,EACd,kBAAkB,EAClB,iBAAiB,EACjB,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC/D,YAAY,EAAE,gBAAgB,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAErG,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAC1F,YAAY,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAEjE,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAChG,YAAY,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAE3D,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAC9G,YAAY,EAAE,SAAS,EAAE,cAAc,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAEnH,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,YAAY,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAElD,OAAO,EACL,aAAa,EACb,uBAAuB,EACvB,cAAc,EACd,iBAAiB,GAClB,MAAM,6BAA6B,CAAC;AACrC,YAAY,EAAE,cAAc,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAErG,OAAO,EACL,uBAAuB,EACvB,wBAAwB,EACxB,sBAAsB,EACtB,wBAAwB,GACzB,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAEpG,OAAO,EAAE,QAAQ,IAAI,OAAO,EAAE,MAAM,sBAAsB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -17,6 +17,9 @@ export { AttributeQuery } from './core/AttributeQuery.js';
17
17
  export { S3MTileset } from './tileset/S3MTileset.js';
18
18
  // —— 渲染层
19
19
  export { S3MLayer, DEFAULT_STYLE, STYLE, STYLE_LABELS, SELECT_MODE, SELECT_MODE_LABELS } from './render/S3MLayer.js';
20
+ export { GroundManager } from './render/GroundManager.js';
21
+ export { DatasetManager } from './render/DatasetManager.js';
22
+ export { FeatureStyleManager } from './render/FeatureStyleManager.js';
20
23
  export { buildTileObjects } from './render/GeometryBuilder.js';
21
24
  export { createTexture, PixelFormat, setMaxAnisotropy } from './render/TextureFactory.js';
22
25
  export { resolveTextureKind, dxtPixelFormatOf, TextureCompress } from './core/TextureFormat.js';
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,oCAAoC;AACpC,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAEtF,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC/G,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AA8B1D,SAAS;AACT,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAGrD,SAAS;AACT,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAuBrH,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAG/D,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAG1F,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAGhG,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAG9G,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAG5C,OAAO,EACL,aAAa,EACb,uBAAuB,EACvB,cAAc,EACd,iBAAiB,GAClB,MAAM,6BAA6B,CAAC;AAGrC,OAAO,EACL,uBAAuB,EACvB,wBAAwB,EACxB,sBAAsB,EACtB,wBAAwB,GACzB,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EAAE,QAAQ,IAAI,OAAO,EAAE,MAAM,sBAAsB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,oCAAoC;AACpC,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAEtF,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAC/G,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AA8B1D,SAAS;AACT,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAGrD,SAAS;AACT,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AACrH,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AA0BtE,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAG/D,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAG1F,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAGhG,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAG9G,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAG5C,OAAO,EACL,aAAa,EACb,uBAAuB,EACvB,cAAc,EACd,iBAAiB,GAClB,MAAM,6BAA6B,CAAC;AAGrC,OAAO,EACL,uBAAuB,EACvB,wBAAwB,EACxB,sBAAsB,EACtB,wBAAwB,GACzB,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EAAE,QAAQ,IAAI,OAAO,EAAE,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1,90 @@
1
+ /**
2
+ * 坐标系与宿主地图适配工具
3
+ *
4
+ * 负责:
5
+ * 1. 经纬度 <-> Web 墨卡托归一化坐标转换
6
+ * 2. 宿主地图(MapLibre / Mapbox)的 WorldCoordinateHelper 适配(支持自定义投影、平面直角坐标系等)
7
+ * 3. 宿主事件与能力抽象接口
8
+ */
9
+ export declare const EARTH_RADIUS = 6378137;
10
+ export declare const DEFAULT_FOV = 0.6435011087932844;
11
+ export interface WorldCoordinateHelperLike {
12
+ name?: string;
13
+ worldFromLngLat(lng: number, lat: number, altitude?: number): {
14
+ x: number;
15
+ y: number;
16
+ z?: number;
17
+ };
18
+ lngLatFromWorld(x: number, y: number): {
19
+ lng: number;
20
+ lat: number;
21
+ } | [number, number];
22
+ metersPerWorldUnit?(x: number, y: number): number;
23
+ }
24
+ /** 宿主地图上我们真正用到的能力,MapLibre / Mapbox 的交集 */
25
+ export interface MapLike {
26
+ getCanvas(): HTMLCanvasElement;
27
+ triggerRepaint(): void;
28
+ on(type: string, listener: (e: MapMouseEventLike) => void): unknown;
29
+ off(type: string, listener: (e: MapMouseEventLike) => void): unknown;
30
+ getBearing?(): number;
31
+ getFreeCameraOptions?(): {
32
+ position?: {
33
+ x: number;
34
+ y: number;
35
+ z: number;
36
+ } | null;
37
+ } | null;
38
+ /** 注意 fov 在 MapLibre v5 起是「度」,v4 / Mapbox 是「弧度」;弧度用 fovInRadians */
39
+ transform?: {
40
+ fov?: number;
41
+ fovInRadians?: number;
42
+ cameraToCenterDistance?: number;
43
+ worldCoordinateHelper?: unknown;
44
+ projection?: {
45
+ worldCoordinateHelper?: unknown;
46
+ };
47
+ };
48
+ getProjection?(): unknown;
49
+ }
50
+ export interface MapMouseEventLike {
51
+ originalEvent?: {
52
+ clientX: number;
53
+ clientY: number;
54
+ };
55
+ point?: {
56
+ x: number;
57
+ y: number;
58
+ };
59
+ }
60
+ /**
61
+ * 从宿主地图中提取 WorldCoordinateHelper(自动适配 MapLibre v5+ CRS 体系与自定义投影)
62
+ */
63
+ export declare function extractWorldCoordinateHelper(map: unknown): WorldCoordinateHelperLike | null;
64
+ /** 经纬度 → 墨卡托归一化坐标(世界为 1×1)—— 默认墨卡托兜底 */
65
+ export declare function mercatorFromLngLat(lon: number, lat: number, altitude?: number): {
66
+ x: number;
67
+ y: number;
68
+ z: number;
69
+ meterInMercator: number;
70
+ altitude: number;
71
+ };
72
+ /** 墨卡托归一化坐标 → 经纬度 —— 默认墨卡托兜底 */
73
+ export declare function lngLatFromMercator(x: number, y: number): [number, number];
74
+ /**
75
+ * 经纬度 + 高程 → 归一化世界坐标与尺度换算。
76
+ * 优先使用宿主 map 的 WorldCoordinateHelper(自动适配 MapLibre v5+ 任意 CRS),
77
+ * 若宿主未就绪或为老版本则平滑回退至标准 Web 墨卡托。
78
+ */
79
+ export declare function worldFromLngLat(map: MapLike | null, lon: number, lat: number, altitude?: number): {
80
+ x: number;
81
+ y: number;
82
+ z: number;
83
+ meterInMercator: number;
84
+ altitude: number;
85
+ };
86
+ /**
87
+ * 归一化世界坐标 → 经纬度 [lng, lat]
88
+ */
89
+ export declare function lngLatFromWorld(map: MapLike | null, x: number, y: number): [number, number];
90
+ //# sourceMappingURL=CoordinateHelper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CoordinateHelper.d.ts","sourceRoot":"","sources":["../../src/render/CoordinateHelper.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,85 @@
1
+ /**
2
+ * 坐标系与宿主地图适配工具
3
+ *
4
+ * 负责:
5
+ * 1. 经纬度 <-> Web 墨卡托归一化坐标转换
6
+ * 2. 宿主地图(MapLibre / Mapbox)的 WorldCoordinateHelper 适配(支持自定义投影、平面直角坐标系等)
7
+ * 3. 宿主事件与能力抽象接口
8
+ */
9
+ export const EARTH_RADIUS = 6378137;
10
+ export const DEFAULT_FOV = 0.6435011087932844; // MapLibre 默认垂直视场角
11
+ /**
12
+ * 从宿主地图中提取 WorldCoordinateHelper(自动适配 MapLibre v5+ CRS 体系与自定义投影)
13
+ */
14
+ export function extractWorldCoordinateHelper(map) {
15
+ const m = map;
16
+ const helper = (m?.transform?.worldCoordinateHelper ??
17
+ m?.transform?.projection?.worldCoordinateHelper ??
18
+ m?.painter?.transform?.worldCoordinateHelper ??
19
+ (typeof m?.getProjection === 'function' ? m.getProjection()?.worldCoordinateHelper : null) ??
20
+ null);
21
+ if (helper && typeof helper.worldFromLngLat === 'function' && typeof helper.lngLatFromWorld === 'function') {
22
+ return helper;
23
+ }
24
+ return null;
25
+ }
26
+ /** 经纬度 → 墨卡托归一化坐标(世界为 1×1)—— 默认墨卡托兜底 */
27
+ export function mercatorFromLngLat(lon, lat, altitude = 0) {
28
+ const sinLat = Math.sin((lat * Math.PI) / 180);
29
+ const x = (180 + lon) / 360;
30
+ const y = 0.5 - (0.25 * Math.log((1 + sinLat) / (1 - sinLat))) / Math.PI;
31
+ const meterInMercator = 1 / (2 * Math.PI * EARTH_RADIUS) / Math.cos((lat * Math.PI) / 180);
32
+ return { x, y, z: altitude * meterInMercator, meterInMercator, altitude };
33
+ }
34
+ /** 墨卡托归一化坐标 → 经纬度 —— 默认墨卡托兜底 */
35
+ export function lngLatFromMercator(x, y) {
36
+ const lon = x * 360 - 180;
37
+ const lat = (Math.atan(Math.sinh(Math.PI * (1 - 2 * y))) * 180) / Math.PI;
38
+ return [lon, lat];
39
+ }
40
+ /**
41
+ * 经纬度 + 高程 → 归一化世界坐标与尺度换算。
42
+ * 优先使用宿主 map 的 WorldCoordinateHelper(自动适配 MapLibre v5+ 任意 CRS),
43
+ * 若宿主未就绪或为老版本则平滑回退至标准 Web 墨卡托。
44
+ */
45
+ export function worldFromLngLat(map, lon, lat, altitude = 0) {
46
+ const helper = extractWorldCoordinateHelper(map);
47
+ if (helper) {
48
+ const coord = helper.worldFromLngLat(lon, lat, altitude);
49
+ let s = 0;
50
+ if (typeof helper.metersPerWorldUnit === 'function') {
51
+ const mpw = helper.metersPerWorldUnit(coord.x, coord.y);
52
+ if (Number.isFinite(mpw) && mpw > 0)
53
+ s = 1 / mpw;
54
+ }
55
+ if (s === 0) {
56
+ const c1 = helper.worldFromLngLat(lon, lat, altitude + 1);
57
+ const dz = Math.abs((c1.z ?? 0) - (coord.z ?? 0));
58
+ s = dz > 0 ? dz : mercatorFromLngLat(lon, lat, altitude).meterInMercator;
59
+ }
60
+ return {
61
+ x: coord.x,
62
+ y: coord.y,
63
+ z: coord.z ?? altitude * s,
64
+ meterInMercator: s,
65
+ altitude,
66
+ };
67
+ }
68
+ return mercatorFromLngLat(lon, lat, altitude);
69
+ }
70
+ /**
71
+ * 归一化世界坐标 → 经纬度 [lng, lat]
72
+ */
73
+ export function lngLatFromWorld(map, x, y) {
74
+ const helper = extractWorldCoordinateHelper(map);
75
+ if (helper) {
76
+ const res = helper.lngLatFromWorld(x, y);
77
+ if (Array.isArray(res))
78
+ return [res[0], res[1]];
79
+ if (res && typeof res.lng === 'number' && typeof res.lat === 'number') {
80
+ return [res.lng, res.lat];
81
+ }
82
+ }
83
+ return lngLatFromMercator(x, y);
84
+ }
85
+ //# sourceMappingURL=CoordinateHelper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CoordinateHelper.js","sourceRoot":"","sources":["../../src/render/CoordinateHelper.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,109 @@
1
+ /**
2
+ * 数据集管理器
3
+ *
4
+ * 负责:
5
+ * 1. 多 S3M 数据集的注册、加载、卸载与生命周期维护
6
+ * 2. 数据集锚点对齐、场景主锚点维护与 RTC 局部坐标偏移
7
+ * 3. 语义高程对齐(align: 'top' | 'bottom' | 'center')与垂直高程偏移计算
8
+ * 4. 多数据集全局经纬度包围盒计算(getBounds)
9
+ */
10
+ import * as THREE from 'three';
11
+ import { S3MTileset } from '../tileset/S3MTileset.js';
12
+ import type { Anchor } from '../core/types.js';
13
+ import { type MapLike } from './CoordinateHelper.js';
14
+ export type DatasetAlignment = 'origin' | 'bottom' | 'top' | 'center';
15
+ export interface S3MDatasetOptions {
16
+ id: string;
17
+ name?: string;
18
+ configUrl: string;
19
+ visible?: boolean;
20
+ maxTiles?: number;
21
+ lodRangeScale?: number;
22
+ /**
23
+ * 垂直对齐基准(默认 'origin'):
24
+ * - 'origin': 忠实使用数据源原生 position.z 原点
25
+ * - 'top': 将模型顶部对齐地表 Z=0(整体沉入地下,适合地下工程、地铁站、地下管线)
26
+ * - 'bottom': 将模型底部对齐地表 Z=0(消除模型深埋或浮空,适合地上建筑)
27
+ * - 'center': 将几何中心对齐地表 Z=0
28
+ */
29
+ align?: DatasetAlignment;
30
+ /** 垂直高度偏移(米),在 align 对齐基准上的额外偏移,正数抬升,负数下降,默认 0 */
31
+ heightOffset?: number;
32
+ }
33
+ export interface S3MDatasetEntry {
34
+ id: string;
35
+ name: string;
36
+ options: S3MDatasetOptions;
37
+ root: THREE.Group;
38
+ tileset: S3MTileset | null;
39
+ anchor: Anchor | null;
40
+ /** 语义对齐方式计算出的基础偏移(米) */
41
+ baseAlignOffset: number;
42
+ /** 最终垂直高度偏移(米,含 baseAlignOffset 与附加 heightOffset) */
43
+ heightOffset: number;
44
+ /** 相对场景锚点的偏移(米) */
45
+ offset: [number, number, number];
46
+ visible: boolean;
47
+ error: unknown;
48
+ }
49
+ export interface DatasetManagerCallbacks {
50
+ onTile: (node: any, entry: S3MDatasetEntry) => void;
51
+ onTileRemoved: (node: any, entry: S3MDatasetEntry) => void;
52
+ onStats: () => void;
53
+ onError: (err: unknown) => void;
54
+ onReady: (entry: S3MDatasetEntry) => void;
55
+ triggerRepaint: () => void;
56
+ }
57
+ export declare class DatasetManager {
58
+ readonly datasets: Map<string, S3MDatasetEntry>;
59
+ sceneAnchor: {
60
+ x: number;
61
+ y: number;
62
+ z: number;
63
+ meterInMercator: number;
64
+ altitude?: number;
65
+ } | null;
66
+ /** 根据语义对齐方式('top' | 'bottom' | 'center')和数据源高度范围计算基准高度偏移 */
67
+ computeAlignOffset(tileset: S3MTileset | null, align?: DatasetAlignment): number;
68
+ /**
69
+ * 注册并加载数据集
70
+ */
71
+ addDataset(ds: S3MDatasetOptions, scene: THREE.Scene, map: MapLike | null, uniforms: any, defaultLodRangeScale: number, buildTile: any, maxTiles: number, maxConcurrent: number, callbacks: DatasetManagerCallbacks): Promise<S3MDatasetEntry>;
72
+ /**
73
+ * 移除指定数据集
74
+ */
75
+ removeDataset(id: string, scene: THREE.Scene, map: MapLike | null, cleanTileMeshes: (entry: S3MDatasetEntry) => void): boolean;
76
+ /**
77
+ * 清空所有数据集
78
+ */
79
+ clearDatasets(scene: THREE.Scene, cleanTileMeshes: (entry: S3MDatasetEntry) => void): void;
80
+ /**
81
+ * 布局数据集局部 ENU 与场景锚点对齐
82
+ */
83
+ layoutDataset(entry: S3MDatasetEntry, map: MapLike | null): void;
84
+ /**
85
+ * 当地图投影或主锚点变化时,重新对齐所有数据集
86
+ */
87
+ recomputeAnchors(map: MapLike | null): void;
88
+ /**
89
+ * 获取指定数据集的垂直高程偏移(米)
90
+ */
91
+ getDatasetHeight(id?: string): number;
92
+ /**
93
+ * 设置垂直高程偏移(米)
94
+ */
95
+ setDatasetHeight(id: string, height: number, map: MapLike | null): void;
96
+ /**
97
+ * 动态设置指定数据集的垂直对齐基准('origin' | 'bottom' | 'top' | 'center')
98
+ */
99
+ setDatasetAlign(id: string, align: DatasetAlignment, map: MapLike | null): void;
100
+ /**
101
+ * 设置可见性
102
+ */
103
+ setDatasetVisible(id: string, visible: boolean): void;
104
+ /**
105
+ * 获取所有可见数据集的经纬度边界包围盒 [[minLon, minLat], [maxLon, maxLat]]
106
+ */
107
+ getBounds(): [[number, number], [number, number]] | null;
108
+ }
109
+ //# sourceMappingURL=DatasetManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DatasetManager.d.ts","sourceRoot":"","sources":["../../src/render/DatasetManager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,229 @@
1
+ /**
2
+ * 数据集管理器
3
+ *
4
+ * 负责:
5
+ * 1. 多 S3M 数据集的注册、加载、卸载与生命周期维护
6
+ * 2. 数据集锚点对齐、场景主锚点维护与 RTC 局部坐标偏移
7
+ * 3. 语义高程对齐(align: 'top' | 'bottom' | 'center')与垂直高程偏移计算
8
+ * 4. 多数据集全局经纬度包围盒计算(getBounds)
9
+ */
10
+ import * as THREE from 'three';
11
+ import { S3MTileset } from '../tileset/S3MTileset.js';
12
+ import { worldFromLngLat } from './CoordinateHelper.js';
13
+ export class DatasetManager {
14
+ datasets = new Map();
15
+ sceneAnchor = null;
16
+ /** 根据语义对齐方式('top' | 'bottom' | 'center')和数据源高度范围计算基准高度偏移 */
17
+ computeAlignOffset(tileset, align) {
18
+ if (!align || align === 'origin' || !tileset)
19
+ return 0;
20
+ const hr = tileset.heightRange;
21
+ if (!hr)
22
+ return 0;
23
+ switch (align) {
24
+ case 'top':
25
+ return -hr.max;
26
+ case 'bottom':
27
+ return -hr.min;
28
+ case 'center':
29
+ return -(hr.min + hr.max) / 2;
30
+ default:
31
+ return 0;
32
+ }
33
+ }
34
+ /**
35
+ * 注册并加载数据集
36
+ */
37
+ async addDataset(ds, scene, map, uniforms, defaultLodRangeScale, buildTile, maxTiles, maxConcurrent, callbacks) {
38
+ const existing = this.datasets.get(ds.id);
39
+ if (existing)
40
+ return existing;
41
+ const root = new THREE.Group();
42
+ root.name = `s3m-dataset:${ds.id}`;
43
+ root.visible = ds.visible !== false;
44
+ scene.add(root);
45
+ const entry = {
46
+ id: ds.id,
47
+ name: ds.name ?? ds.id,
48
+ options: ds,
49
+ root,
50
+ tileset: null,
51
+ anchor: null,
52
+ baseAlignOffset: 0,
53
+ heightOffset: ds.heightOffset ?? 0,
54
+ offset: [0, 0, 0],
55
+ visible: ds.visible !== false,
56
+ error: null,
57
+ };
58
+ this.datasets.set(ds.id, entry);
59
+ const tileset = new S3MTileset({
60
+ configUrl: ds.configUrl,
61
+ maxTiles: ds.maxTiles ?? maxTiles,
62
+ maxConcurrent: maxConcurrent,
63
+ lodRangeScale: ds.lodRangeScale ?? defaultLodRangeScale,
64
+ buildTile: buildTile ?? null,
65
+ uniforms: uniforms,
66
+ onTile: (node) => {
67
+ callbacks.onTile(node, entry);
68
+ },
69
+ onTileRemoved: (node) => {
70
+ callbacks.onTileRemoved(node, entry);
71
+ },
72
+ onProgress: () => {
73
+ callbacks.onStats();
74
+ callbacks.triggerRepaint();
75
+ },
76
+ onError: (e) => {
77
+ entry.error = e;
78
+ callbacks.onError(e);
79
+ callbacks.onStats();
80
+ },
81
+ });
82
+ entry.tileset = tileset;
83
+ try {
84
+ await tileset.init();
85
+ }
86
+ catch (e) {
87
+ entry.error = e;
88
+ callbacks.onError(e);
89
+ return entry;
90
+ }
91
+ entry.anchor = tileset.anchor;
92
+ entry.baseAlignOffset = this.computeAlignOffset(tileset, ds.align);
93
+ entry.heightOffset = entry.baseAlignOffset + (ds.heightOffset ?? 0);
94
+ this.layoutDataset(entry, map);
95
+ callbacks.onReady(entry);
96
+ callbacks.triggerRepaint();
97
+ return entry;
98
+ }
99
+ /**
100
+ * 移除指定数据集
101
+ */
102
+ removeDataset(id, scene, map, cleanTileMeshes) {
103
+ const entry = this.datasets.get(id);
104
+ if (!entry)
105
+ return false;
106
+ cleanTileMeshes(entry);
107
+ entry.tileset?.dispose();
108
+ scene.remove(entry.root);
109
+ this.datasets.delete(id);
110
+ if (this.datasets.size > 0) {
111
+ this.recomputeAnchors(map);
112
+ }
113
+ else {
114
+ this.sceneAnchor = null;
115
+ }
116
+ return true;
117
+ }
118
+ /**
119
+ * 清空所有数据集
120
+ */
121
+ clearDatasets(scene, cleanTileMeshes) {
122
+ for (const entry of this.datasets.values()) {
123
+ cleanTileMeshes(entry);
124
+ entry.tileset?.dispose();
125
+ scene.remove(entry.root);
126
+ }
127
+ this.datasets.clear();
128
+ this.sceneAnchor = null;
129
+ }
130
+ /**
131
+ * 布局数据集局部 ENU 与场景锚点对齐
132
+ */
133
+ layoutDataset(entry, map) {
134
+ if (!entry.anchor)
135
+ return;
136
+ if (!this.sceneAnchor) {
137
+ this.sceneAnchor = worldFromLngLat(map, entry.anchor.lon, entry.anchor.lat, entry.anchor.height ?? 0);
138
+ }
139
+ const s = this.sceneAnchor.meterInMercator;
140
+ const a = worldFromLngLat(map, entry.anchor.lon, entry.anchor.lat, entry.anchor.height ?? 0);
141
+ entry.offset = [
142
+ (a.x - this.sceneAnchor.x) / s,
143
+ -(a.y - this.sceneAnchor.y) / s,
144
+ (a.z - this.sceneAnchor.z) / s + (entry.heightOffset ?? 0),
145
+ ];
146
+ entry.root.position.set(entry.offset[0], entry.offset[1], entry.offset[2]);
147
+ entry.root.updateMatrixWorld(true);
148
+ }
149
+ /**
150
+ * 当地图投影或主锚点变化时,重新对齐所有数据集
151
+ */
152
+ recomputeAnchors(map) {
153
+ if (this.datasets.size === 0)
154
+ return;
155
+ this.sceneAnchor = null;
156
+ for (const entry of this.datasets.values()) {
157
+ this.layoutDataset(entry, map);
158
+ }
159
+ }
160
+ /**
161
+ * 获取指定数据集的垂直高程偏移(米)
162
+ */
163
+ getDatasetHeight(id) {
164
+ const targetId = id ?? this.datasets.keys().next().value;
165
+ return targetId ? this.datasets.get(targetId)?.heightOffset ?? 0 : 0;
166
+ }
167
+ /**
168
+ * 设置垂直高程偏移(米)
169
+ */
170
+ setDatasetHeight(id, height, map) {
171
+ const entry = this.datasets.get(id);
172
+ if (!entry)
173
+ return;
174
+ entry.heightOffset = height;
175
+ this.layoutDataset(entry, map);
176
+ }
177
+ /**
178
+ * 动态设置指定数据集的垂直对齐基准('origin' | 'bottom' | 'top' | 'center')
179
+ */
180
+ setDatasetAlign(id, align, map) {
181
+ const entry = this.datasets.get(id);
182
+ if (!entry)
183
+ return;
184
+ const manualOffset = entry.heightOffset - entry.baseAlignOffset;
185
+ entry.baseAlignOffset = this.computeAlignOffset(entry.tileset, align);
186
+ entry.heightOffset = entry.baseAlignOffset + manualOffset;
187
+ entry.options.align = align;
188
+ this.layoutDataset(entry, map);
189
+ }
190
+ /**
191
+ * 设置可见性
192
+ */
193
+ setDatasetVisible(id, visible) {
194
+ const entry = this.datasets.get(id);
195
+ if (!entry)
196
+ return;
197
+ entry.visible = visible;
198
+ entry.root.visible = visible;
199
+ }
200
+ /**
201
+ * 获取所有可见数据集的经纬度边界包围盒 [[minLon, minLat], [maxLon, maxLat]]
202
+ */
203
+ getBounds() {
204
+ let minLon = Infinity;
205
+ let minLat = Infinity;
206
+ let maxLon = -Infinity;
207
+ let maxLat = -Infinity;
208
+ let found = false;
209
+ for (const entry of this.datasets.values()) {
210
+ if (!entry.visible || !entry.tileset?.config)
211
+ continue;
212
+ const b = entry.tileset.config.geoBounds;
213
+ if (b && Number.isFinite(b.left)) {
214
+ minLon = Math.min(minLon, b.left);
215
+ minLat = Math.min(minLat, b.bottom);
216
+ maxLon = Math.max(maxLon, b.right);
217
+ maxLat = Math.max(maxLat, b.top);
218
+ found = true;
219
+ }
220
+ }
221
+ return found
222
+ ? [
223
+ [minLon, minLat],
224
+ [maxLon, maxLat],
225
+ ]
226
+ : null;
227
+ }
228
+ }
229
+ //# sourceMappingURL=DatasetManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DatasetManager.js","sourceRoot":"","sources":["../../src/render/DatasetManager.ts"],"names":[],"mappings":"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"}