@loaders.gl/i3s 3.3.0-alpha.1 → 3.3.0-alpha.11

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 (124) hide show
  1. package/dist/dist.min.js +1219 -1480
  2. package/dist/es5/arcgis-webscene-loader.js +2 -8
  3. package/dist/es5/arcgis-webscene-loader.js.map +1 -1
  4. package/dist/es5/bundle.js +0 -1
  5. package/dist/es5/bundle.js.map +1 -1
  6. package/dist/es5/i3s-attribute-loader.js +19 -59
  7. package/dist/es5/i3s-attribute-loader.js.map +1 -1
  8. package/dist/es5/i3s-building-scene-layer-loader.js +1 -10
  9. package/dist/es5/i3s-building-scene-layer-loader.js.map +1 -1
  10. package/dist/es5/i3s-content-loader.js +18 -18
  11. package/dist/es5/i3s-content-loader.js.map +1 -1
  12. package/dist/es5/i3s-loader.js +48 -80
  13. package/dist/es5/i3s-loader.js.map +1 -1
  14. package/dist/es5/i3s-node-page-loader.js +1 -12
  15. package/dist/es5/i3s-node-page-loader.js.map +1 -1
  16. package/dist/es5/index.js +12 -18
  17. package/dist/es5/index.js.map +1 -1
  18. package/dist/es5/lib/helpers/i3s-nodepages-tiles.js +18 -78
  19. package/dist/es5/lib/helpers/i3s-nodepages-tiles.js.map +1 -1
  20. package/dist/es5/lib/parsers/constants.js +3 -19
  21. package/dist/es5/lib/parsers/constants.js.map +1 -1
  22. package/dist/es5/lib/parsers/parse-arcgis-webscene.js +128 -30
  23. package/dist/es5/lib/parsers/parse-arcgis-webscene.js.map +1 -1
  24. package/dist/es5/lib/parsers/parse-i3s-attribute.js +1 -23
  25. package/dist/es5/lib/parsers/parse-i3s-attribute.js.map +1 -1
  26. package/dist/es5/lib/parsers/parse-i3s-building-scene-layer.js +8 -25
  27. package/dist/es5/lib/parsers/parse-i3s-building-scene-layer.js.map +1 -1
  28. package/dist/es5/lib/parsers/parse-i3s-tile-content.js +90 -199
  29. package/dist/es5/lib/parsers/parse-i3s-tile-content.js.map +1 -1
  30. package/dist/es5/lib/parsers/parse-i3s.js +6 -37
  31. package/dist/es5/lib/parsers/parse-i3s.js.map +1 -1
  32. package/dist/es5/lib/utils/convert-i3s-obb-to-mbs.js +0 -7
  33. package/dist/es5/lib/utils/convert-i3s-obb-to-mbs.js.map +1 -1
  34. package/dist/es5/lib/utils/customizeColors.js +164 -0
  35. package/dist/es5/lib/utils/customizeColors.js.map +1 -0
  36. package/dist/es5/lib/utils/url-utils.js +3 -8
  37. package/dist/es5/lib/utils/url-utils.js.map +1 -1
  38. package/dist/es5/types.js +0 -3
  39. package/dist/es5/types.js.map +1 -1
  40. package/dist/es5/workers/i3s-content-nodejs-worker.js +7 -0
  41. package/dist/es5/workers/i3s-content-nodejs-worker.js.map +1 -0
  42. package/dist/es5/workers/i3s-content-worker.js +0 -2
  43. package/dist/es5/workers/i3s-content-worker.js.map +1 -1
  44. package/dist/esm/arcgis-webscene-loader.js +3 -1
  45. package/dist/esm/arcgis-webscene-loader.js.map +1 -1
  46. package/dist/esm/bundle.js +1 -1
  47. package/dist/esm/bundle.js.map +1 -1
  48. package/dist/esm/i3s-attribute-loader.js +9 -26
  49. package/dist/esm/i3s-attribute-loader.js.map +1 -1
  50. package/dist/esm/i3s-building-scene-layer-loader.js +2 -3
  51. package/dist/esm/i3s-building-scene-layer-loader.js.map +1 -1
  52. package/dist/esm/i3s-content-loader.js +13 -6
  53. package/dist/esm/i3s-content-loader.js.map +1 -1
  54. package/dist/esm/i3s-loader.js +16 -24
  55. package/dist/esm/i3s-loader.js.map +1 -1
  56. package/dist/esm/i3s-node-page-loader.js +1 -2
  57. package/dist/esm/i3s-node-page-loader.js.map +1 -1
  58. package/dist/esm/index.js.map +1 -1
  59. package/dist/esm/lib/helpers/i3s-nodepages-tiles.js +2 -45
  60. package/dist/esm/lib/helpers/i3s-nodepages-tiles.js.map +1 -1
  61. package/dist/esm/lib/parsers/constants.js +2 -11
  62. package/dist/esm/lib/parsers/constants.js.map +1 -1
  63. package/dist/esm/lib/parsers/parse-arcgis-webscene.js +50 -11
  64. package/dist/esm/lib/parsers/parse-arcgis-webscene.js.map +1 -1
  65. package/dist/esm/lib/parsers/parse-i3s-attribute.js +1 -8
  66. package/dist/esm/lib/parsers/parse-i3s-attribute.js.map +1 -1
  67. package/dist/esm/lib/parsers/parse-i3s-building-scene-layer.js +1 -4
  68. package/dist/esm/lib/parsers/parse-i3s-building-scene-layer.js.map +1 -1
  69. package/dist/esm/lib/parsers/parse-i3s-tile-content.js +60 -104
  70. package/dist/esm/lib/parsers/parse-i3s-tile-content.js.map +1 -1
  71. package/dist/esm/lib/parsers/parse-i3s.js +16 -18
  72. package/dist/esm/lib/parsers/parse-i3s.js.map +1 -1
  73. package/dist/esm/lib/utils/convert-i3s-obb-to-mbs.js.map +1 -1
  74. package/dist/esm/lib/utils/customizeColors.js +96 -0
  75. package/dist/esm/lib/utils/customizeColors.js.map +1 -0
  76. package/dist/esm/lib/utils/url-utils.js +5 -5
  77. package/dist/esm/lib/utils/url-utils.js.map +1 -1
  78. package/dist/esm/types.js +0 -3
  79. package/dist/esm/types.js.map +1 -1
  80. package/dist/esm/workers/i3s-content-nodejs-worker.js +5 -0
  81. package/dist/esm/workers/i3s-content-nodejs-worker.js.map +1 -0
  82. package/dist/esm/workers/i3s-content-worker.js.map +1 -1
  83. package/dist/i3s-attribute-loader.d.ts +6 -0
  84. package/dist/i3s-attribute-loader.d.ts.map +1 -1
  85. package/dist/i3s-attribute-loader.js +2 -1
  86. package/dist/i3s-content-loader.d.ts.map +1 -1
  87. package/dist/i3s-content-loader.js +9 -4
  88. package/dist/i3s-content-nodejs-worker.js +201 -0
  89. package/dist/i3s-content-nodejs-worker.js.map +7 -0
  90. package/dist/i3s-content-worker.js +675 -1046
  91. package/dist/i3s-loader.d.ts +5 -0
  92. package/dist/i3s-loader.d.ts.map +1 -1
  93. package/dist/i3s-loader.js +12 -10
  94. package/dist/index.d.ts +1 -1
  95. package/dist/index.d.ts.map +1 -1
  96. package/dist/lib/parsers/constants.js +1 -1
  97. package/dist/lib/parsers/parse-arcgis-webscene.d.ts.map +1 -1
  98. package/dist/lib/parsers/parse-arcgis-webscene.js +49 -7
  99. package/dist/lib/parsers/parse-i3s-tile-content.d.ts +2 -2
  100. package/dist/lib/parsers/parse-i3s-tile-content.d.ts.map +1 -1
  101. package/dist/lib/parsers/parse-i3s-tile-content.js +38 -33
  102. package/dist/lib/parsers/parse-i3s.d.ts +1 -1
  103. package/dist/lib/parsers/parse-i3s.d.ts.map +1 -1
  104. package/dist/lib/parsers/parse-i3s.js +1 -1
  105. package/dist/lib/utils/customizeColors.d.ts +14 -0
  106. package/dist/lib/utils/customizeColors.d.ts.map +1 -0
  107. package/dist/lib/utils/customizeColors.js +89 -0
  108. package/dist/types.d.ts +265 -85
  109. package/dist/types.d.ts.map +1 -1
  110. package/dist/workers/i3s-content-nodejs-worker.d.ts +2 -0
  111. package/dist/workers/i3s-content-nodejs-worker.d.ts.map +1 -0
  112. package/dist/workers/i3s-content-nodejs-worker.js +6 -0
  113. package/package.json +12 -12
  114. package/src/i3s-attribute-loader.ts +1 -1
  115. package/src/i3s-content-loader.ts +19 -6
  116. package/src/i3s-loader.ts +22 -13
  117. package/src/index.ts +8 -1
  118. package/src/lib/parsers/constants.ts +1 -1
  119. package/src/lib/parsers/parse-arcgis-webscene.ts +57 -7
  120. package/src/lib/parsers/parse-i3s-tile-content.ts +56 -43
  121. package/src/lib/parsers/parse-i3s.ts +1 -1
  122. package/src/lib/utils/customizeColors.ts +129 -0
  123. package/src/types.ts +198 -3
  124. package/src/workers/i3s-content-nodejs-worker.ts +5 -0
@@ -1,4 +1,9 @@
1
1
  import type { LoaderWithParser } from '@loaders.gl/loader-utils';
2
+ import { I3SParseOptions } from './types';
3
+ import { LoaderOptions } from './../../loader-utils/src/types';
4
+ export type I3SLoaderOptions = LoaderOptions & {
5
+ i3s?: I3SParseOptions;
6
+ };
2
7
  /**
3
8
  * Loader for I3S - Indexed 3D Scene Layer
4
9
  */
@@ -1 +1 @@
1
- {"version":3,"file":"i3s-loader.d.ts","sourceRoot":"","sources":["../src/i3s-loader.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,gBAAgB,EAAC,MAAM,0BAA0B,CAAC;AAc/D;;GAEG;AACH,eAAO,MAAM,SAAS,EAAE,gBAsBvB,CAAC"}
1
+ {"version":3,"file":"i3s-loader.d.ts","sourceRoot":"","sources":["../src/i3s-loader.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,gBAAgB,EAAC,MAAM,0BAA0B,CAAC;AAK/D,OAAO,EAAC,eAAe,EAAC,MAAM,SAAS,CAAC;AACxC,OAAO,EAAC,aAAa,EAAC,MAAM,gCAAgC,CAAC;AAW7D,MAAM,MAAM,gBAAgB,GAAG,aAAa,GAAG;IAC7C,GAAG,CAAC,EAAE,eAAe,CAAC;CACvB,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,SAAS,EAAE,gBAwBvB,CAAC"}
@@ -11,6 +11,7 @@ const VERSION = typeof __VERSION__ !== 'undefined' ? __VERSION__ : 'latest';
11
11
  const TILESET_REGEX = /layers\/[0-9]+$/;
12
12
  const TILE_HEADER_REGEX = /nodes\/([0-9-]+|root)$/;
13
13
  const SLPK_HEX = '504b0304';
14
+ const POINT_CLOUD = 'PointCloud';
14
15
  /**
15
16
  * Loader for I3S - Indexed 3D Scene Layer
16
17
  */
@@ -24,20 +25,22 @@ exports.I3SLoader = {
24
25
  extensions: ['bin'],
25
26
  options: {
26
27
  i3s: {
27
- loadContent: true,
28
28
  token: null,
29
29
  isTileset: 'auto',
30
30
  isTileHeader: 'auto',
31
31
  tile: null,
32
32
  tileset: null,
33
+ _tileOptions: null,
34
+ _tilesetOptions: null,
33
35
  useDracoGeometry: true,
34
36
  useCompressedTextures: true,
35
37
  decodeTextures: true,
36
- coordinateSystem: constants_1.COORDINATE_SYSTEM.METER_OFFSETS
38
+ coordinateSystem: constants_1.COORDINATE_SYSTEM.METER_OFFSETS,
39
+ colorsByAttribute: null
37
40
  }
38
41
  }
39
42
  };
40
- async function parseI3S(data, options, context) {
43
+ async function parseI3S(data, options = {}, context) {
41
44
  const url = context.url;
42
45
  options.i3s = options.i3s || {};
43
46
  const magicNumber = getMagicNumber(data);
@@ -64,11 +67,7 @@ async function parseI3S(data, options, context) {
64
67
  data = await parseTileset(data, options, context);
65
68
  }
66
69
  else if (isTileHeader) {
67
- data = await parseTile(data, options, context);
68
- if (options.i3s.loadContent) {
69
- options.i3s.tile = data;
70
- await (0, core_1.load)(data.contentUrl, exports.I3SLoader, options);
71
- }
70
+ data = await parseTile(data, context);
72
71
  }
73
72
  else {
74
73
  data = await parseTileContent(data, options);
@@ -80,14 +79,17 @@ async function parseTileContent(arrayBuffer, options) {
80
79
  }
81
80
  async function parseTileset(data, options, context) {
82
81
  const tilesetJson = JSON.parse(new TextDecoder().decode(data));
82
+ if (tilesetJson?.layerType === POINT_CLOUD) {
83
+ throw new Error('Point Cloud layers currently are not supported by I3SLoader');
84
+ }
83
85
  // eslint-disable-next-line no-use-before-define
84
86
  tilesetJson.loader = exports.I3SLoader;
85
87
  await (0, parse_i3s_1.normalizeTilesetData)(tilesetJson, options, context);
86
88
  return tilesetJson;
87
89
  }
88
- async function parseTile(data, options, context) {
90
+ async function parseTile(data, context) {
89
91
  data = JSON.parse(new TextDecoder().decode(data));
90
- return (0, parse_i3s_1.normalizeTileData)(data, options, context);
92
+ return (0, parse_i3s_1.normalizeTileData)(data, context);
91
93
  }
92
94
  function getMagicNumber(data) {
93
95
  if (data instanceof ArrayBuffer) {
package/dist/index.d.ts CHANGED
@@ -3,6 +3,6 @@ export { I3SContentLoader } from './i3s-content-loader';
3
3
  export { I3SAttributeLoader, loadFeatureAttributes } from './i3s-attribute-loader';
4
4
  export { I3SBuildingSceneLayerLoader } from './i3s-building-scene-layer-loader';
5
5
  export { ArcGisWebSceneLoader } from './arcgis-webscene-loader';
6
- export type { BoundingVolumes, Mbs, Obb, SceneLayer3D, AttributeStorageInfo, Field, ESRIField, PopupInfo, Node3DIndexDocument, LodSelection, NodeReference, Resource, MaxScreenThresholdSQ, NodeInPage, SharedResources, Attribute, Extent, FeatureAttribute, FieldInfo, I3SMaterialDefinition, TextureDefinitionInfo, MaterialDefinitionInfo, FullExtent } from './types';
6
+ export type { BoundingVolumes, Mbs, Obb, SceneLayer3D, AttributeStorageInfo, Field, ESRIField, PopupInfo, Node3DIndexDocument, LodSelection, NodeReference, Resource, MaxScreenThresholdSQ, NodeInPage, SharedResources, Attribute, Extent, FeatureAttribute, FieldInfo, I3SMaterialDefinition, TextureDefinitionInfo, MaterialDefinitionInfo, FullExtent, StatisticsInfo, StatsInfo, Histogram, ValueCount, BuildingSceneSublayer, DATA_TYPE, OperationalLayer } from './types';
7
7
  export { COORDINATE_SYSTEM } from './lib/parsers/constants';
8
8
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AACvC,OAAO,EAAC,gBAAgB,EAAC,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAC,kBAAkB,EAAE,qBAAqB,EAAC,MAAM,wBAAwB,CAAC;AACjF,OAAO,EAAC,2BAA2B,EAAC,MAAM,mCAAmC,CAAC;AAC9E,OAAO,EAAC,oBAAoB,EAAC,MAAM,0BAA0B,CAAC;AAC9D,YAAY,EACV,eAAe,EACf,GAAG,EACH,GAAG,EACH,YAAY,EACZ,oBAAoB,EACpB,KAAK,EACL,SAAS,EACT,SAAS,EACT,mBAAmB,EACnB,YAAY,EACZ,aAAa,EACb,QAAQ,EACR,oBAAoB,EACpB,UAAU,EACV,eAAe,EACf,SAAS,EACT,MAAM,EACN,gBAAgB,EAChB,SAAS,EACT,qBAAqB,EACrB,qBAAqB,EACrB,sBAAsB,EACtB,UAAU,EACX,MAAM,SAAS,CAAC;AACjB,OAAO,EAAC,iBAAiB,EAAC,MAAM,yBAAyB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AACvC,OAAO,EAAC,gBAAgB,EAAC,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAC,kBAAkB,EAAE,qBAAqB,EAAC,MAAM,wBAAwB,CAAC;AACjF,OAAO,EAAC,2BAA2B,EAAC,MAAM,mCAAmC,CAAC;AAC9E,OAAO,EAAC,oBAAoB,EAAC,MAAM,0BAA0B,CAAC;AAC9D,YAAY,EACV,eAAe,EACf,GAAG,EACH,GAAG,EACH,YAAY,EACZ,oBAAoB,EACpB,KAAK,EACL,SAAS,EACT,SAAS,EACT,mBAAmB,EACnB,YAAY,EACZ,aAAa,EACb,QAAQ,EACR,oBAAoB,EACpB,UAAU,EACV,eAAe,EACf,SAAS,EACT,MAAM,EACN,gBAAgB,EAChB,SAAS,EACT,qBAAqB,EACrB,qBAAqB,EACrB,sBAAsB,EACtB,UAAU,EACV,cAAc,EACd,SAAS,EACT,SAAS,EACT,UAAU,EACV,qBAAqB,EACrB,SAAS,EACT,gBAAgB,EACjB,MAAM,SAAS,CAAC;AACjB,OAAO,EAAC,iBAAiB,EAAC,MAAM,yBAAyB,CAAC"}
@@ -25,7 +25,7 @@ function getConstructorForDataFormat(dataType) {
25
25
  exports.getConstructorForDataFormat = getConstructorForDataFormat;
26
26
  exports.GL_TYPE_MAP = {
27
27
  UInt8: constants_1.default.UNSIGNED_BYTE,
28
- UInt16: constants_1.default.UNSIGNED_INT,
28
+ UInt16: constants_1.default.UNSIGNED_SHORT,
29
29
  Float32: constants_1.default.FLOAT,
30
30
  UInt32: constants_1.default.UNSIGNED_INT,
31
31
  UInt64: constants_1.default.DOUBLE
@@ -1 +1 @@
1
- {"version":3,"file":"parse-arcgis-webscene.d.ts","sourceRoot":"","sources":["../../../src/lib/parsers/parse-arcgis-webscene.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,kBAAkB,EAAmB,MAAM,aAAa,CAAC;AAgBtE;;;GAGG;AACH,wBAAsB,aAAa,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAQlF"}
1
+ {"version":3,"file":"parse-arcgis-webscene.d.ts","sourceRoot":"","sources":["../../../src/lib/parsers/parse-arcgis-webscene.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,kBAAkB,EAAmB,MAAM,aAAa,CAAC;AA2BtE;;;GAGG;AACH,wBAAsB,aAAa,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAclF"}
@@ -1,9 +1,16 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.parseWebscene = void 0;
4
+ const core_1 = require("@loaders.gl/core");
5
+ /**
6
+ * WKID, or Well-Known ID, of the CRS. Specify either WKID or WKT of the CRS.
7
+ * Spec - https://github.com/Esri/i3s-spec/blob/master/docs/1.8/spatialReference.cmn.md
8
+ */
9
+ const SUPPORTED_WKID = 4326;
4
10
  const ARCGIS_SCENE_SERVER_LAYER_TYPE = 'ArcGISSceneServiceLayer';
5
11
  const BUILDING_SCENE_LAYER = 'BuildingSceneLayer';
6
12
  const INTEGRATED_MESH_LAYER = 'IntegratedMeshLayer';
13
+ const GROUP_LAYER = 'GroupLayer';
7
14
  /**
8
15
  * Supported layers list
9
16
  * Possible operational layers in WebScene: https://developers.arcgis.com/web-scene-specification/objects/operationalLayers/
@@ -11,8 +18,11 @@ const INTEGRATED_MESH_LAYER = 'IntegratedMeshLayer';
11
18
  const SUPPORTED_LAYERS_TYPES = [
12
19
  ARCGIS_SCENE_SERVER_LAYER_TYPE,
13
20
  INTEGRATED_MESH_LAYER,
14
- BUILDING_SCENE_LAYER
21
+ BUILDING_SCENE_LAYER,
22
+ GROUP_LAYER
15
23
  ];
24
+ const NO_AVAILABLE_SUPPORTED_LAYERS_ERROR = 'NO_AVAILABLE_SUPPORTED_LAYERS_ERROR';
25
+ const NOT_SUPPORTED_CRS_ERROR = 'NOT_SUPPORTED_CRS_ERROR';
16
26
  /**
17
27
  * Parses ArcGIS WebScene
18
28
  * @param data
@@ -20,9 +30,14 @@ const SUPPORTED_LAYERS_TYPES = [
20
30
  async function parseWebscene(data) {
21
31
  const layer0 = JSON.parse(new TextDecoder().decode(data));
22
32
  const { operationalLayers } = layer0;
33
+ const { layers, unsupportedLayers } = await parseOperationalLayers(operationalLayers, true);
34
+ if (!layers.length) {
35
+ throw new Error(NO_AVAILABLE_SUPPORTED_LAYERS_ERROR);
36
+ }
23
37
  return {
24
38
  header: layer0,
25
- layers: parseOperationalLayers(operationalLayers)
39
+ layers,
40
+ unsupportedLayers
26
41
  };
27
42
  }
28
43
  exports.parseWebscene = parseWebscene;
@@ -30,16 +45,43 @@ exports.parseWebscene = parseWebscene;
30
45
  * Recursively parses WebScene operational layers.
31
46
  * @param layersList
32
47
  */
33
- function parseOperationalLayers(layersList) {
34
- let layers = [];
48
+ async function parseOperationalLayers(layersList, needToCheckCRS) {
49
+ const layers = [];
50
+ let unsupportedLayers = [];
35
51
  for (let index = 0; index < layersList.length; index++) {
36
52
  const layer = layersList[index];
37
- if (SUPPORTED_LAYERS_TYPES.includes(layer.layerType)) {
53
+ const isLayerSupported = SUPPORTED_LAYERS_TYPES.includes(layer.layerType);
54
+ if (isLayerSupported) {
55
+ if (needToCheckCRS && layer.layerType !== GROUP_LAYER) {
56
+ await checkSupportedIndexCRS(layer);
57
+ needToCheckCRS = false;
58
+ }
38
59
  layers.push(layer);
39
60
  }
61
+ else {
62
+ unsupportedLayers.push(layer);
63
+ }
40
64
  if (layer.layers?.length) {
41
- layers = [...layers, ...parseOperationalLayers(layer.layers)];
65
+ const { layers: childLayers, unsupportedLayers: childUnsupportedLayers } = await parseOperationalLayers(layer.layers, needToCheckCRS);
66
+ layer.layers = childLayers;
67
+ unsupportedLayers = [...unsupportedLayers, ...childUnsupportedLayers];
68
+ }
69
+ }
70
+ return { layers, unsupportedLayers };
71
+ }
72
+ /**
73
+ * Check if layer has supported CRS
74
+ * @param layer
75
+ */
76
+ async function checkSupportedIndexCRS(layer) {
77
+ try {
78
+ const layerJson = await (0, core_1.load)(layer.url, core_1.JSONLoader);
79
+ const wkid = layerJson?.spatialReference?.wkid;
80
+ if (wkid !== SUPPORTED_WKID) {
81
+ throw new Error(NOT_SUPPORTED_CRS_ERROR);
42
82
  }
43
83
  }
44
- return layers;
84
+ catch (error) {
85
+ throw error;
86
+ }
45
87
  }
@@ -1,4 +1,4 @@
1
1
  import type { LoaderOptions, LoaderContext } from '@loaders.gl/loader-utils';
2
- import { I3STilesetHeader, I3STileHeader } from '../../types';
3
- export declare function parseI3STileContent(arrayBuffer: ArrayBuffer, tile: I3STileHeader, tileset: I3STilesetHeader, options?: LoaderOptions, context?: LoaderContext): Promise<I3STileHeader>;
2
+ import { I3STileContent, I3STileOptions, I3STilesetOptions } from '../../types';
3
+ export declare function parseI3STileContent(arrayBuffer: ArrayBuffer, tileOptions: I3STileOptions, tilesetOptions: I3STilesetOptions, options?: LoaderOptions, context?: LoaderContext): Promise<I3STileContent>;
4
4
  //# sourceMappingURL=parse-i3s-tile-content.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"parse-i3s-tile-content.d.ts","sourceRoot":"","sources":["../../../src/lib/parsers/parse-i3s-tile-content.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAC,aAAa,EAAE,aAAa,EAAC,MAAM,0BAA0B,CAAC;AAK3E,OAAO,EACL,gBAAgB,EAChB,aAAa,EAQd,MAAM,aAAa,CAAC;AAuBrB,wBAAsB,mBAAmB,CACvC,WAAW,EAAE,WAAW,EACxB,IAAI,EAAE,aAAa,EACnB,OAAO,EAAE,gBAAgB,EACzB,OAAO,CAAC,EAAE,aAAa,EACvB,OAAO,CAAC,EAAE,aAAa,0BAkDxB"}
1
+ {"version":3,"file":"parse-i3s-tile-content.d.ts","sourceRoot":"","sources":["../../../src/lib/parsers/parse-i3s-tile-content.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAC,aAAa,EAAE,aAAa,EAAC,MAAM,0BAA0B,CAAC;AAK3E,OAAO,EAQL,cAAc,EACd,cAAc,EACd,iBAAiB,EAClB,MAAM,aAAa,CAAC;AAyBrB,wBAAsB,mBAAmB,CACvC,WAAW,EAAE,WAAW,EACxB,WAAW,EAAE,cAAc,EAC3B,cAAc,EAAE,iBAAiB,EACjC,OAAO,CAAC,EAAE,aAAa,EACvB,OAAO,CAAC,EAAE,aAAa,GACtB,OAAO,CAAC,cAAc,CAAC,CAuDzB"}
@@ -10,6 +10,7 @@ const textures_1 = require("@loaders.gl/textures");
10
10
  const types_1 = require("../../types");
11
11
  const url_utils_1 = require("../utils/url-utils");
12
12
  const constants_1 = require("./constants");
13
+ const customizeColors_1 = require("../utils/customizeColors");
13
14
  const scratchVector = new core_2.Vector3([0, 0, 0]);
14
15
  function getLoaderForTextureFormat(textureFormat) {
15
16
  switch (textureFormat) {
@@ -25,36 +26,43 @@ function getLoaderForTextureFormat(textureFormat) {
25
26
  }
26
27
  }
27
28
  const I3S_ATTRIBUTE_TYPE = 'i3s-attribute-type';
28
- async function parseI3STileContent(arrayBuffer, tile, tileset, options, context) {
29
- tile.content = tile.content || {};
30
- tile.content.featureIds = tile.content.featureIds || null;
31
- tile.content.attributes = {};
32
- if (tile.textureUrl) {
33
- const url = (0, url_utils_1.getUrlWithToken)(tile.textureUrl, options?.i3s?.token);
34
- const loader = getLoaderForTextureFormat(tile.textureFormat);
29
+ async function parseI3STileContent(arrayBuffer, tileOptions, tilesetOptions, options, context) {
30
+ const content = {
31
+ attributes: {},
32
+ indices: null,
33
+ featureIds: [],
34
+ vertexCount: 0,
35
+ modelMatrix: new core_2.Matrix4(),
36
+ coordinateSystem: 0,
37
+ byteLength: 0,
38
+ texture: null
39
+ };
40
+ if (tileOptions.textureUrl) {
41
+ const url = (0, url_utils_1.getUrlWithToken)(tileOptions.textureUrl, options?.i3s?.token);
42
+ const loader = getLoaderForTextureFormat(tileOptions.textureFormat);
35
43
  const response = await fetch(url, options?.fetch);
36
44
  const arrayBuffer = await response.arrayBuffer();
37
45
  if (options?.i3s.decodeTextures) {
38
46
  if (loader === images_1.ImageLoader) {
39
- const options = { ...tile.textureLoaderOptions, image: { type: 'data' } };
47
+ const options = { ...tileOptions.textureLoaderOptions, image: { type: 'data' } };
40
48
  try {
41
49
  // @ts-ignore context must be defined
42
50
  // Image constructor is not supported in worker thread.
43
51
  // Do parsing image data on the main thread by using context to avoid worker issues.
44
- tile.content.texture = await context.parse(arrayBuffer, options);
52
+ content.texture = await context.parse(arrayBuffer, options);
45
53
  }
46
54
  catch (e) {
47
55
  // context object is different between worker and node.js conversion script.
48
56
  // To prevent error we parse data in ordinary way if it is not parsed by using context.
49
- tile.content.texture = await (0, core_1.parse)(arrayBuffer, loader, options);
57
+ content.texture = await (0, core_1.parse)(arrayBuffer, loader, options);
50
58
  }
51
59
  }
52
60
  else if (loader === textures_1.CompressedTextureLoader || loader === textures_1.BasisLoader) {
53
- let texture = await (0, core_1.load)(arrayBuffer, loader, tile.textureLoaderOptions);
61
+ let texture = await (0, core_1.load)(arrayBuffer, loader, tileOptions.textureLoaderOptions);
54
62
  if (loader === textures_1.BasisLoader) {
55
63
  texture = texture[0];
56
64
  }
57
- tile.content.texture = {
65
+ content.texture = {
58
66
  compressed: true,
59
67
  mipmaps: false,
60
68
  width: texture[0].width,
@@ -64,29 +72,25 @@ async function parseI3STileContent(arrayBuffer, tile, tileset, options, context)
64
72
  }
65
73
  }
66
74
  else {
67
- tile.content.texture = arrayBuffer;
75
+ content.texture = arrayBuffer;
68
76
  }
69
77
  }
70
- tile.content.material = makePbrMaterial(tile.materialDefinition, tile.content.texture);
71
- if (tile.content.material) {
72
- tile.content.texture = null;
78
+ content.material = makePbrMaterial(tileOptions.materialDefinition, content.texture);
79
+ if (content.material) {
80
+ content.texture = null;
73
81
  }
74
- return await parseI3SNodeGeometry(arrayBuffer, tile, tileset, options);
82
+ return await parseI3SNodeGeometry(arrayBuffer, content, tileOptions, tilesetOptions, options);
75
83
  }
76
84
  exports.parseI3STileContent = parseI3STileContent;
77
85
  /* eslint-disable max-statements */
78
- async function parseI3SNodeGeometry(arrayBuffer, tile, tileset, options) {
79
- if (!tile.content) {
80
- return tile;
81
- }
82
- const content = tile.content;
86
+ async function parseI3SNodeGeometry(arrayBuffer, content, tileOptions, tilesetOptions, options) {
83
87
  const contentByteLength = arrayBuffer.byteLength;
84
88
  let attributes;
85
89
  let vertexCount;
86
90
  let byteOffset = 0;
87
91
  let featureCount = 0;
88
92
  let indices;
89
- if (tile.isDracoGeometry) {
93
+ if (tileOptions.isDracoGeometry) {
90
94
  const decompressedGeometry = await (0, core_1.parse)(arrayBuffer, draco_1.DracoLoader, {
91
95
  draco: {
92
96
  attributeNameEntry: I3S_ATTRIBUTE_TYPE
@@ -111,9 +115,9 @@ async function parseI3SNodeGeometry(arrayBuffer, tile, tileset, options) {
111
115
  }
112
116
  }
113
117
  else {
114
- const { vertexAttributes, ordering: attributesOrder, featureAttributes, featureAttributeOrder } = tileset.store.defaultGeometrySchema;
118
+ const { vertexAttributes, ordering: attributesOrder, featureAttributes, featureAttributeOrder } = tilesetOptions.store.defaultGeometrySchema;
115
119
  // First 8 bytes reserved for header (vertexCount and featureCount)
116
- const headers = parseHeaders(tileset, arrayBuffer);
120
+ const headers = parseHeaders(arrayBuffer, tilesetOptions);
117
121
  byteOffset = headers.byteOffset;
118
122
  vertexCount = headers.vertexCount;
119
123
  featureCount = headers.featureCount;
@@ -126,7 +130,7 @@ async function parseI3SNodeGeometry(arrayBuffer, tile, tileset, options) {
126
130
  }
127
131
  if (!options?.i3s?.coordinateSystem ||
128
132
  options.i3s.coordinateSystem === constants_1.COORDINATE_SYSTEM.METER_OFFSETS) {
129
- const enuMatrix = parsePositions(attributes.position, tile);
133
+ const enuMatrix = parsePositions(attributes.position, tileOptions);
130
134
  content.modelMatrix = enuMatrix.invert();
131
135
  content.coordinateSystem = constants_1.COORDINATE_SYSTEM.METER_OFFSETS;
132
136
  }
@@ -134,16 +138,17 @@ async function parseI3SNodeGeometry(arrayBuffer, tile, tileset, options) {
134
138
  content.modelMatrix = getModelMatrix(attributes.position);
135
139
  content.coordinateSystem = constants_1.COORDINATE_SYSTEM.LNGLAT_OFFSETS;
136
140
  }
141
+ attributes.color = await (0, customizeColors_1.customizeColors)(attributes.color, attributes.id, tileOptions, tilesetOptions, options);
137
142
  content.attributes = {
138
143
  positions: attributes.position,
139
144
  normals: attributes.normal,
140
145
  colors: normalizeAttribute(attributes.color),
141
146
  texCoords: attributes.uv0,
142
- uvRegions: normalizeAttribute(attributes.uvRegion) // Normalize from UInt16
147
+ uvRegions: normalizeAttribute(attributes.uvRegion || attributes.region) // Normalize from UInt16
143
148
  };
144
149
  content.indices = indices || null;
145
150
  if (attributes.id && attributes.id.value) {
146
- tile.content.featureIds = attributes.id.value;
151
+ content.featureIds = attributes.id.value;
147
152
  }
148
153
  // Remove undefined attributes
149
154
  for (const attributeIndex in content.attributes) {
@@ -153,7 +158,7 @@ async function parseI3SNodeGeometry(arrayBuffer, tile, tileset, options) {
153
158
  }
154
159
  content.vertexCount = vertexCount;
155
160
  content.byteLength = contentByteLength;
156
- return tile;
161
+ return content;
157
162
  }
158
163
  /**
159
164
  * Update attributes with metadata from decompressed geometry.
@@ -197,12 +202,12 @@ function normalizeAttribute(attribute) {
197
202
  attribute.normalized = true;
198
203
  return attribute;
199
204
  }
200
- function parseHeaders(tileset, arrayBuffer) {
205
+ function parseHeaders(arrayBuffer, options) {
201
206
  let byteOffset = 0;
202
207
  // First 8 bytes reserved for header (vertexCount and featurecount)
203
208
  let vertexCount = 0;
204
209
  let featureCount = 0;
205
- for (const { property, type } of tileset.store.defaultGeometrySchema.header) {
210
+ for (const { property, type } of options.store.defaultGeometrySchema.header) {
206
211
  const TypedArrayTypeHeader = (0, constants_1.getConstructorForDataFormat)(type);
207
212
  switch (property) {
208
213
  case types_1.HeaderAttributeProperty.vertexCount:
@@ -292,8 +297,8 @@ function parseUint64Values(buffer, elementsCount, attributeSize) {
292
297
  }
293
298
  return new Uint32Array(values);
294
299
  }
295
- function parsePositions(attribute, tile) {
296
- const mbs = tile.mbs;
300
+ function parsePositions(attribute, options) {
301
+ const mbs = options.mbs;
297
302
  const value = attribute.value;
298
303
  const metadata = attribute.metadata;
299
304
  const enuMatrix = new core_2.Matrix4();
@@ -1,6 +1,6 @@
1
1
  import { I3STilesetHeader, I3STileHeader, I3SMinimalNodeData, Node3DIndexDocument } from '../../types';
2
2
  import type { LoaderOptions, LoaderContext } from '@loaders.gl/loader-utils';
3
- export declare function normalizeTileData(tile: Node3DIndexDocument, options: LoaderOptions, context: LoaderContext): I3STileHeader;
3
+ export declare function normalizeTileData(tile: Node3DIndexDocument, context: LoaderContext): I3STileHeader;
4
4
  export declare function normalizeTileNonUrlData(tile: I3SMinimalNodeData): I3STileHeader;
5
5
  export declare function normalizeTilesetData(tileset: I3STilesetHeader, options: LoaderOptions, context: LoaderContext): Promise<void>;
6
6
  //# sourceMappingURL=parse-i3s.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"parse-i3s.d.ts","sourceRoot":"","sources":["../../../src/lib/parsers/parse-i3s.ts"],"names":[],"mappings":"AAMA,OAAO,EACL,gBAAgB,EAChB,aAAa,EAEb,kBAAkB,EAClB,mBAAmB,EACpB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAC,aAAa,EAAE,aAAa,EAAC,MAAM,0BAA0B,CAAC;AAE3E,wBAAgB,iBAAiB,CAAC,IAAI,EAAG,mBAAmB,EAAE,OAAO,EAAG,aAAa,EAAE,OAAO,EAAE,aAAa,GAAG,aAAa,CAyB5H;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAG,kBAAkB,GAAG,aAAa,CAmChF;AAED,wBAAsB,oBAAoB,CAAC,OAAO,EAAG,gBAAgB,EAAE,OAAO,EAAG,aAAa,EAAE,OAAO,EAAE,aAAa,iBAwBrH"}
1
+ {"version":3,"file":"parse-i3s.d.ts","sourceRoot":"","sources":["../../../src/lib/parsers/parse-i3s.ts"],"names":[],"mappings":"AAMA,OAAO,EACL,gBAAgB,EAChB,aAAa,EAEb,kBAAkB,EAClB,mBAAmB,EACpB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAC,aAAa,EAAE,aAAa,EAAC,MAAM,0BAA0B,CAAC;AAE3E,wBAAgB,iBAAiB,CAAC,IAAI,EAAG,mBAAmB,EAAE,OAAO,EAAE,aAAa,GAAG,aAAa,CAyBnG;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAG,kBAAkB,GAAG,aAAa,CAmChF;AAED,wBAAsB,oBAAoB,CAAC,OAAO,EAAG,gBAAgB,EAAE,OAAO,EAAG,aAAa,EAAE,OAAO,EAAE,aAAa,iBAwBrH"}
@@ -10,7 +10,7 @@ const core_1 = require("@loaders.gl/core");
10
10
  const tiles_1 = require("@loaders.gl/tiles");
11
11
  const i3s_nodepages_tiles_1 = __importDefault(require("../helpers/i3s-nodepages-tiles"));
12
12
  const url_utils_1 = require("../utils/url-utils");
13
- function normalizeTileData(tile, options, context) {
13
+ function normalizeTileData(tile, context) {
14
14
  const url = context.url || '';
15
15
  let contentUrl;
16
16
  if (tile.geometryData) {
@@ -0,0 +1,14 @@
1
+ import type { MeshAttribute } from '@loaders.gl/schema';
2
+ import type { I3STileOptions, I3STilesetOptions } from '../../types';
3
+ import { I3SLoaderOptions } from '../../i3s-loader';
4
+ /**
5
+ * Modify vertex colors array to visualize 3D objects in a attribute driven way
6
+ * @param colors - vertex colors attribute
7
+ * @param featureIds - feature Ids attribute
8
+ * @param tileOptions - tile - related options
9
+ * @param tilesetOptions - tileset-related options
10
+ * @param options - loader options
11
+ * @returns midified colors attribute
12
+ */
13
+ export declare function customizeColors(colors: MeshAttribute, featureIds: MeshAttribute, tileOptions: I3STileOptions, tilesetOptions: I3STilesetOptions, options?: I3SLoaderOptions): Promise<MeshAttribute>;
14
+ //# sourceMappingURL=customizeColors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"customizeColors.d.ts","sourceRoot":"","sources":["../../../src/lib/utils/customizeColors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAQ,cAAc,EAAE,iBAAiB,EAAC,MAAM,aAAa,CAAC;AAI1E,OAAO,EAAC,gBAAgB,EAAC,MAAM,kBAAkB,CAAC;AAGlD;;;;;;;;GAQG;AACH,wBAAsB,eAAe,CACnC,MAAM,EAAE,aAAa,EACrB,UAAU,EAAE,aAAa,EACzB,WAAW,EAAE,cAAc,EAC3B,cAAc,EAAE,iBAAiB,EACjC,OAAO,CAAC,EAAE,gBAAgB,GACzB,OAAO,CAAC,aAAa,CAAC,CA2DxB"}
@@ -0,0 +1,89 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.customizeColors = void 0;
4
+ const core_1 = require("@loaders.gl/core");
5
+ const i3s_attribute_loader_1 = require("../../i3s-attribute-loader");
6
+ const url_utils_1 = require("../utils/url-utils");
7
+ /**
8
+ * Modify vertex colors array to visualize 3D objects in a attribute driven way
9
+ * @param colors - vertex colors attribute
10
+ * @param featureIds - feature Ids attribute
11
+ * @param tileOptions - tile - related options
12
+ * @param tilesetOptions - tileset-related options
13
+ * @param options - loader options
14
+ * @returns midified colors attribute
15
+ */
16
+ async function customizeColors(colors, featureIds, tileOptions, tilesetOptions, options) {
17
+ if (!options?.i3s?.colorsByAttribute) {
18
+ return colors;
19
+ }
20
+ const colorizeAttributeField = tilesetOptions.fields.find(({ name }) => name === options?.i3s?.colorsByAttribute?.attributeName);
21
+ if (!colorizeAttributeField ||
22
+ !['esriFieldTypeDouble', 'esriFieldTypeInteger', 'esriFieldTypeSmallInteger'].includes(colorizeAttributeField.type)) {
23
+ return colors;
24
+ }
25
+ const colorizeAttributeData = await loadFeatureAttributeData(colorizeAttributeField.name, tileOptions, tilesetOptions, options);
26
+ if (!colorizeAttributeData) {
27
+ return colors;
28
+ }
29
+ const objectIdField = tilesetOptions.fields.find(({ type }) => type === 'esriFieldTypeOID');
30
+ if (!objectIdField) {
31
+ return colors;
32
+ }
33
+ const objectIdAttributeData = await loadFeatureAttributeData(objectIdField.name, tileOptions, tilesetOptions, options);
34
+ if (!objectIdAttributeData) {
35
+ return colors;
36
+ }
37
+ const attributeValuesMap = {};
38
+ for (let i = 0; i < objectIdAttributeData[objectIdField.name].length; i++) {
39
+ attributeValuesMap[objectIdAttributeData[objectIdField.name][i]] = calculateColorForAttribute(colorizeAttributeData[colorizeAttributeField.name][i], options);
40
+ }
41
+ for (let i = 0; i < featureIds.value.length; i++) {
42
+ const color = attributeValuesMap[featureIds.value[i]];
43
+ if (!color) {
44
+ continue; // eslint-disable-line no-continue
45
+ }
46
+ colors.value.set(color, i * 4);
47
+ }
48
+ return colors;
49
+ }
50
+ exports.customizeColors = customizeColors;
51
+ /**
52
+ * Calculate rgba color from the attribute value
53
+ * @param attributeValue - value of the attribute
54
+ * @param options - loader options
55
+ * @returns - color array for a specific attribute value
56
+ */
57
+ function calculateColorForAttribute(attributeValue, options) {
58
+ if (!options?.i3s?.colorsByAttribute) {
59
+ return [255, 255, 255, 255];
60
+ }
61
+ const { minValue, maxValue, minColor, maxColor } = options.i3s.colorsByAttribute;
62
+ const rate = (attributeValue - minValue) / (maxValue - minValue);
63
+ const color = [255, 255, 255, 255];
64
+ for (let i = 0; i < minColor.length; i++) {
65
+ color[i] = Math.round((maxColor[i] - minColor[i]) * rate + minColor[i]);
66
+ }
67
+ return color;
68
+ }
69
+ /**
70
+ * Load feature attribute data from the ArcGIS rest service
71
+ * @param attributeName - attribute name
72
+ * @param tileOptions - tile-related options
73
+ * @param tilesetOptions - tileset-related options
74
+ * @param options - loader options
75
+ * @returns - Array-like list of the attribute values
76
+ */
77
+ async function loadFeatureAttributeData(attributeName, { attributeUrls }, { attributeStorageInfo }, options) {
78
+ const attributeIndex = attributeStorageInfo.findIndex(({ name }) => attributeName === name);
79
+ if (attributeIndex === -1) {
80
+ return null;
81
+ }
82
+ const objectIdAttributeUrl = (0, url_utils_1.getUrlWithToken)(attributeUrls[attributeIndex], options?.i3s?.token);
83
+ const attributeType = (0, i3s_attribute_loader_1.getAttributeValueType)(attributeStorageInfo[attributeIndex]);
84
+ const objectIdAttributeData = await (0, core_1.load)(objectIdAttributeUrl, i3s_attribute_loader_1.I3SAttributeLoader, {
85
+ attributeName,
86
+ attributeType
87
+ });
88
+ return objectIdAttributeData;
89
+ }