@loaders.gl/i3s 4.0.0-alpha.4 → 4.0.0-alpha.6

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 (186) hide show
  1. package/dist/arcgis-webscene-loader.d.ts +7 -0
  2. package/dist/arcgis-webscene-loader.d.ts.map +1 -0
  3. package/dist/arcgis-webscene-loader.js +28 -0
  4. package/dist/bundle.d.ts +2 -0
  5. package/dist/bundle.d.ts.map +1 -0
  6. package/dist/bundle.js +2 -2
  7. package/dist/dist.min.js +10631 -0
  8. package/dist/es5/arcgis-webscene-loader.js +40 -0
  9. package/dist/es5/arcgis-webscene-loader.js.map +1 -0
  10. package/dist/es5/bundle.js +6 -0
  11. package/dist/es5/bundle.js.map +1 -0
  12. package/dist/es5/i3s-attribute-loader.js +195 -0
  13. package/dist/es5/i3s-attribute-loader.js.map +1 -0
  14. package/dist/es5/i3s-building-scene-layer-loader.js +46 -0
  15. package/dist/es5/i3s-building-scene-layer-loader.js.map +1 -0
  16. package/dist/es5/i3s-content-loader.js +57 -0
  17. package/dist/es5/i3s-content-loader.js.map +1 -0
  18. package/dist/es5/i3s-loader.js +193 -0
  19. package/dist/es5/i3s-loader.js.map +1 -0
  20. package/dist/es5/i3s-node-page-loader.js +39 -0
  21. package/dist/es5/i3s-node-page-loader.js.map +1 -0
  22. package/dist/es5/index.js +61 -0
  23. package/dist/es5/index.js.map +1 -0
  24. package/dist/es5/lib/helpers/i3s-nodepages-tiles.js +312 -0
  25. package/dist/es5/lib/helpers/i3s-nodepages-tiles.js.map +1 -0
  26. package/dist/es5/lib/parsers/constants.js +72 -0
  27. package/dist/es5/lib/parsers/constants.js.map +1 -0
  28. package/dist/es5/lib/parsers/parse-arcgis-webscene.js +158 -0
  29. package/dist/es5/lib/parsers/parse-arcgis-webscene.js.map +1 -0
  30. package/dist/es5/lib/parsers/parse-i3s-attribute.js +76 -0
  31. package/dist/es5/lib/parsers/parse-i3s-attribute.js.map +1 -0
  32. package/dist/es5/lib/parsers/parse-i3s-building-scene-layer.js +65 -0
  33. package/dist/es5/lib/parsers/parse-i3s-building-scene-layer.js.map +1 -0
  34. package/dist/es5/lib/parsers/parse-i3s-tile-content.js +510 -0
  35. package/dist/es5/lib/parsers/parse-i3s-tile-content.js.map +1 -0
  36. package/dist/es5/lib/parsers/parse-i3s.js +116 -0
  37. package/dist/es5/lib/parsers/parse-i3s.js.map +1 -0
  38. package/dist/es5/lib/utils/convert-i3s-obb-to-mbs.js +17 -0
  39. package/dist/es5/lib/utils/convert-i3s-obb-to-mbs.js.map +1 -0
  40. package/dist/es5/lib/utils/customizeColors.js +159 -0
  41. package/dist/es5/lib/utils/customizeColors.js.map +1 -0
  42. package/dist/es5/lib/utils/url-utils.js +33 -0
  43. package/dist/es5/lib/utils/url-utils.js.map +1 -0
  44. package/dist/es5/types.js +26 -0
  45. package/dist/es5/types.js.map +1 -0
  46. package/dist/es5/workers/i3s-content-nodejs-worker.js +7 -0
  47. package/dist/es5/workers/i3s-content-nodejs-worker.js.map +1 -0
  48. package/dist/es5/workers/i3s-content-worker.js +6 -0
  49. package/dist/es5/workers/i3s-content-worker.js.map +1 -0
  50. package/dist/esm/arcgis-webscene-loader.js +16 -0
  51. package/dist/esm/arcgis-webscene-loader.js.map +1 -0
  52. package/dist/esm/bundle.js +4 -0
  53. package/dist/esm/bundle.js.map +1 -0
  54. package/dist/esm/i3s-attribute-loader.js +119 -0
  55. package/dist/esm/i3s-attribute-loader.js.map +1 -0
  56. package/dist/esm/i3s-building-scene-layer-loader.js +19 -0
  57. package/dist/esm/i3s-building-scene-layer-loader.js.map +1 -0
  58. package/dist/esm/i3s-content-loader.js +31 -0
  59. package/dist/esm/i3s-content-loader.js.map +1 -0
  60. package/dist/esm/i3s-loader.js +87 -0
  61. package/dist/esm/i3s-loader.js.map +1 -0
  62. package/dist/esm/i3s-node-page-loader.js +15 -0
  63. package/dist/esm/i3s-node-page-loader.js.map +1 -0
  64. package/dist/esm/index.js +8 -0
  65. package/dist/esm/index.js.map +1 -0
  66. package/dist/esm/lib/helpers/i3s-nodepages-tiles.js +198 -0
  67. package/dist/esm/lib/helpers/i3s-nodepages-tiles.js.map +1 -0
  68. package/dist/esm/lib/parsers/constants.js +57 -0
  69. package/dist/esm/lib/parsers/constants.js.map +1 -0
  70. package/dist/esm/lib/parsers/parse-arcgis-webscene.js +70 -0
  71. package/dist/esm/lib/parsers/parse-arcgis-webscene.js.map +1 -0
  72. package/dist/esm/lib/parsers/parse-i3s-attribute.js +60 -0
  73. package/dist/esm/lib/parsers/parse-i3s-attribute.js.map +1 -0
  74. package/dist/esm/lib/parsers/parse-i3s-building-scene-layer.js +39 -0
  75. package/dist/esm/lib/parsers/parse-i3s-building-scene-layer.js.map +1 -0
  76. package/dist/esm/lib/parsers/parse-i3s-tile-content.js +435 -0
  77. package/dist/esm/lib/parsers/parse-i3s-tile-content.js.map +1 -0
  78. package/dist/esm/lib/parsers/parse-i3s.js +83 -0
  79. package/dist/esm/lib/parsers/parse-i3s.js.map +1 -0
  80. package/dist/esm/lib/utils/convert-i3s-obb-to-mbs.js +9 -0
  81. package/dist/esm/lib/utils/convert-i3s-obb-to-mbs.js.map +1 -0
  82. package/dist/esm/lib/utils/customizeColors.js +92 -0
  83. package/dist/esm/lib/utils/customizeColors.js.map +1 -0
  84. package/dist/esm/lib/utils/url-utils.js +28 -0
  85. package/dist/esm/lib/utils/url-utils.js.map +1 -0
  86. package/dist/esm/types.js +18 -0
  87. package/dist/esm/types.js.map +1 -0
  88. package/dist/esm/workers/i3s-content-nodejs-worker.js +5 -0
  89. package/dist/esm/workers/i3s-content-nodejs-worker.js.map +1 -0
  90. package/dist/esm/workers/i3s-content-worker.js +4 -0
  91. package/dist/esm/workers/i3s-content-worker.js.map +1 -0
  92. package/dist/i3s-attribute-loader.d.ts +21 -0
  93. package/dist/i3s-attribute-loader.d.ts.map +1 -0
  94. package/dist/i3s-attribute-loader.js +155 -132
  95. package/dist/i3s-building-scene-layer-loader.d.ts +6 -0
  96. package/dist/i3s-building-scene-layer-loader.d.ts.map +1 -0
  97. package/dist/i3s-building-scene-layer-loader.js +23 -18
  98. package/dist/i3s-content-loader.d.ts +6 -0
  99. package/dist/i3s-content-loader.d.ts.map +1 -0
  100. package/dist/i3s-content-loader.js +30 -22
  101. package/dist/i3s-content-nodejs-worker.js +198 -0
  102. package/dist/i3s-content-nodejs-worker.js.map +7 -0
  103. package/dist/i3s-content-worker.js +1523 -1383
  104. package/dist/i3s-loader.d.ts +11 -0
  105. package/dist/i3s-loader.d.ts.map +1 -0
  106. package/dist/i3s-loader.js +88 -83
  107. package/dist/i3s-node-page-loader.d.ts +7 -0
  108. package/dist/i3s-node-page-loader.d.ts.map +1 -0
  109. package/dist/i3s-node-page-loader.js +20 -20
  110. package/dist/index.d.ts +9 -0
  111. package/dist/index.d.ts.map +1 -0
  112. package/dist/index.js +19 -6
  113. package/dist/lib/helpers/i3s-nodepages-tiles.d.ts +74 -0
  114. package/dist/lib/helpers/i3s-nodepages-tiles.d.ts.map +1 -0
  115. package/dist/lib/helpers/i3s-nodepages-tiles.js +232 -219
  116. package/dist/lib/parsers/constants.d.ts +40 -0
  117. package/dist/lib/parsers/constants.d.ts.map +1 -0
  118. package/dist/lib/parsers/constants.js +87 -49
  119. package/dist/lib/parsers/parse-arcgis-webscene.d.ts +7 -0
  120. package/dist/lib/parsers/parse-arcgis-webscene.d.ts.map +1 -0
  121. package/dist/lib/parsers/parse-arcgis-webscene.js +88 -0
  122. package/dist/lib/parsers/parse-i3s-attribute.d.ts +12 -0
  123. package/dist/lib/parsers/parse-i3s-attribute.d.ts.map +1 -0
  124. package/dist/lib/parsers/parse-i3s-attribute.js +87 -62
  125. package/dist/lib/parsers/parse-i3s-building-scene-layer.d.ts +9 -0
  126. package/dist/lib/parsers/parse-i3s-building-scene-layer.d.ts.map +1 -0
  127. package/dist/lib/parsers/parse-i3s-building-scene-layer.js +41 -38
  128. package/dist/lib/parsers/parse-i3s-tile-content.d.ts +4 -0
  129. package/dist/lib/parsers/parse-i3s-tile-content.d.ts.map +1 -0
  130. package/dist/lib/parsers/parse-i3s-tile-content.js +458 -461
  131. package/dist/lib/parsers/parse-i3s.d.ts +6 -0
  132. package/dist/lib/parsers/parse-i3s.d.ts.map +1 -0
  133. package/dist/lib/parsers/parse-i3s.js +92 -73
  134. package/dist/lib/utils/convert-i3s-obb-to-mbs.d.ts +2 -0
  135. package/dist/lib/utils/convert-i3s-obb-to-mbs.d.ts.map +1 -0
  136. package/dist/lib/utils/convert-i3s-obb-to-mbs.js +19 -8
  137. package/dist/lib/utils/customizeColors.d.ts +14 -0
  138. package/dist/lib/utils/customizeColors.d.ts.map +1 -0
  139. package/dist/lib/utils/customizeColors.js +94 -0
  140. package/dist/lib/utils/url-utils.d.ts +22 -0
  141. package/dist/lib/utils/url-utils.d.ts.map +1 -0
  142. package/dist/lib/utils/url-utils.js +41 -29
  143. package/dist/types.d.ts +1064 -0
  144. package/dist/types.d.ts.map +1 -0
  145. package/dist/types.js +20 -2
  146. package/dist/workers/i3s-content-nodejs-worker.d.ts +2 -0
  147. package/dist/workers/i3s-content-nodejs-worker.d.ts.map +1 -0
  148. package/dist/workers/i3s-content-nodejs-worker.js +6 -0
  149. package/dist/workers/i3s-content-worker.d.ts +2 -0
  150. package/dist/workers/i3s-content-worker.d.ts.map +1 -0
  151. package/dist/workers/i3s-content-worker.js +5 -4
  152. package/package.json +17 -17
  153. package/src/arcgis-webscene-loader.ts +31 -0
  154. package/src/i3s-attribute-loader.ts +9 -9
  155. package/src/i3s-content-loader.ts +19 -6
  156. package/src/i3s-loader.ts +22 -13
  157. package/src/i3s-node-page-loader.ts +6 -10
  158. package/src/index.ts +24 -7
  159. package/src/lib/helpers/i3s-nodepages-tiles.ts +84 -57
  160. package/src/lib/parsers/constants.ts +68 -55
  161. package/src/lib/parsers/parse-arcgis-webscene.ts +102 -0
  162. package/src/lib/parsers/parse-i3s-attribute.ts +21 -14
  163. package/src/lib/parsers/parse-i3s-building-scene-layer.ts +2 -1
  164. package/src/lib/parsers/parse-i3s-tile-content.ts +227 -200
  165. package/src/lib/parsers/parse-i3s.ts +55 -39
  166. package/src/lib/utils/customizeColors.ts +134 -0
  167. package/src/lib/utils/url-utils.ts +7 -7
  168. package/src/types.ts +874 -86
  169. package/src/workers/i3s-content-nodejs-worker.ts +5 -0
  170. package/dist/bundle.js.map +0 -1
  171. package/dist/i3s-attribute-loader.js.map +0 -1
  172. package/dist/i3s-building-scene-layer-loader.js.map +0 -1
  173. package/dist/i3s-content-loader.js.map +0 -1
  174. package/dist/i3s-loader.js.map +0 -1
  175. package/dist/i3s-node-page-loader.js.map +0 -1
  176. package/dist/index.js.map +0 -1
  177. package/dist/lib/helpers/i3s-nodepages-tiles.js.map +0 -1
  178. package/dist/lib/parsers/constants.js.map +0 -1
  179. package/dist/lib/parsers/parse-i3s-attribute.js.map +0 -1
  180. package/dist/lib/parsers/parse-i3s-building-scene-layer.js.map +0 -1
  181. package/dist/lib/parsers/parse-i3s-tile-content.js.map +0 -1
  182. package/dist/lib/parsers/parse-i3s.js.map +0 -1
  183. package/dist/lib/utils/convert-i3s-obb-to-mbs.js.map +0 -1
  184. package/dist/lib/utils/url-utils.js.map +0 -1
  185. package/dist/types.js.map +0 -1
  186. package/dist/workers/i3s-content-worker.js.map +0 -1
@@ -4,79 +4,95 @@ import {load} from '@loaders.gl/core';
4
4
  import {TILE_TYPE, TILE_REFINEMENT, TILESET_TYPE} from '@loaders.gl/tiles';
5
5
  import I3SNodePagesTiles from '../helpers/i3s-nodepages-tiles';
6
6
  import {generateTileAttributeUrls, getUrlWithToken} from '../utils/url-utils';
7
+ import {
8
+ I3STilesetHeader,
9
+ I3STileHeader,
10
+ Mbs,
11
+ I3SMinimalNodeData,
12
+ Node3DIndexDocument
13
+ } from '../../types';
14
+ import type {LoaderOptions, LoaderContext} from '@loaders.gl/loader-utils';
7
15
 
8
- export function normalizeTileData(tile, options, context) {
9
- tile.url = context.url;
10
-
11
- if (tile.featureData) {
12
- tile.featureUrl = `${tile.url}/${tile.featureData[0].href}`;
13
- }
14
-
16
+ export function normalizeTileData(tile : Node3DIndexDocument, context: LoaderContext): I3STileHeader {
17
+ const url: string = context.url || '';
18
+ let contentUrl: string | undefined;
15
19
  if (tile.geometryData) {
16
- tile.contentUrl = `${tile.url}/${tile.geometryData[0].href}`;
20
+ contentUrl = `${url}/${tile.geometryData[0].href}`;
17
21
  }
18
22
 
23
+ let textureUrl: string | undefined;
19
24
  if (tile.textureData) {
20
- tile.textureUrl = `${tile.url}/${tile.textureData[0].href}`;
25
+ textureUrl = `${url}/${tile.textureData[0].href}`;
21
26
  }
22
27
 
28
+ let attributeUrls: string[] | undefined;
23
29
  if (tile.attributeData) {
24
- tile.attributeUrls = generateTileAttributeUrls(tile);
30
+ attributeUrls = generateTileAttributeUrls(url, tile);
25
31
  }
26
32
 
27
- return normalizeTileNonUrlData(tile);
33
+ return normalizeTileNonUrlData({
34
+ ...tile,
35
+ url,
36
+ contentUrl,
37
+ textureUrl,
38
+ attributeUrls,
39
+ isDracoGeometry: false
40
+ });
28
41
  }
29
42
 
30
- export function normalizeTileNonUrlData(tile) {
31
- const box = tile.obb
32
- ? [
33
- ...Ellipsoid.WGS84.cartographicToCartesian(tile.obb.center), // cartesian center of box
34
- ...tile.obb.halfSize, // halfSize
35
- ...tile.obb.quaternion // quaternion
36
- ]
37
- : undefined;
38
- let sphere;
43
+ export function normalizeTileNonUrlData(tile : I3SMinimalNodeData): I3STileHeader {
44
+ const boundingVolume: {box?: number[]; sphere?: number[]} = {};
45
+ let mbs: Mbs = [0, 0, 0, 1];
39
46
  if (tile.mbs) {
40
- sphere = [
47
+ mbs = tile.mbs;
48
+ boundingVolume.sphere = [
41
49
  ...Ellipsoid.WGS84.cartographicToCartesian(tile.mbs.slice(0, 3)), // cartesian center of sphere
42
50
  tile.mbs[3] // radius of sphere
51
+ ] as Mbs;
52
+ } else if (tile.obb) {
53
+ boundingVolume.box = [
54
+ ...Ellipsoid.WGS84.cartographicToCartesian(tile.obb.center), // cartesian center of box
55
+ ...tile.obb.halfSize, // halfSize
56
+ ...tile.obb.quaternion // quaternion
43
57
  ];
44
- } else if (box) {
45
58
  const obb = new OrientedBoundingBox().fromCenterHalfSizeQuaternion(
46
- box.slice(0, 3),
59
+ boundingVolume.box.slice(0, 3),
47
60
  tile.obb.halfSize,
48
61
  tile.obb.quaternion
49
62
  );
50
63
  const boundingSphere = obb.getBoundingSphere();
51
- sphere = [...boundingSphere.center, boundingSphere.radius];
52
- tile.mbs = [...tile.obb.center, boundingSphere.radius];
64
+ boundingVolume.sphere = [...boundingSphere.center , boundingSphere.radius] as Mbs;
65
+ mbs = [...tile.obb.center, boundingSphere.radius] as Mbs;
53
66
  }
54
67
 
55
- tile.boundingVolume = {
56
- sphere,
57
- box
58
- };
59
- tile.lodMetricType = tile.lodSelection[0].metricType;
60
- tile.lodMetricValue = tile.lodSelection[0].maxError;
61
- tile.transformMatrix = tile.transform;
62
- tile.type = TILE_TYPE.MESH;
63
- // TODO only support replacement for now
64
- tile.refine = TILE_REFINEMENT.REPLACE;
68
+ const lodMetricType = tile.lodSelection?.[0].metricType;
69
+ const lodMetricValue = tile.lodSelection?.[0].maxError;
70
+ const transformMatrix = tile.transform;
71
+ const type = TILE_TYPE.MESH;
72
+ /**
73
+ * I3S specification supports only REPLACE
74
+ */
75
+ const refine = TILE_REFINEMENT.REPLACE;
65
76
 
66
- return tile;
77
+ return {...tile, mbs, boundingVolume, lodMetricType, lodMetricValue, transformMatrix, type, refine};
67
78
  }
68
79
 
69
- export async function normalizeTilesetData(tileset, options, context) {
80
+ export async function normalizeTilesetData(tileset : I3STilesetHeader, options : LoaderOptions, context: LoaderContext) {
70
81
  tileset.url = context.url;
71
82
 
72
83
  if (tileset.nodePages) {
73
84
  tileset.nodePagesTile = new I3SNodePagesTiles(tileset, options);
74
- tileset.root = await tileset.nodePagesTile.formTileFromNodePages(0);
85
+ tileset.root = tileset.nodePagesTile.formTileFromNodePages(0);
75
86
  } else {
87
+ // @ts-expect-error options is not properly typed
76
88
  const rootNodeUrl = getUrlWithToken(`${tileset.url}/nodes/root`, options.i3s?.token);
77
89
  // eslint-disable-next-line no-use-before-define
78
90
  tileset.root = await load(rootNodeUrl, tileset.loader, {
79
- i3s: {loadContent: false, isTileHeader: true, isTileset: false}
91
+ ...options,
92
+ i3s: {
93
+ // @ts-expect-error options is not properly typed
94
+ ...options.i3s,
95
+ loadContent: false, isTileHeader: true, isTileset: false}
80
96
  });
81
97
  }
82
98
 
@@ -0,0 +1,134 @@
1
+ import type {MeshAttribute} from '@loaders.gl/schema';
2
+ import type {COLOR, I3STileOptions, I3STilesetOptions} from '../../types';
3
+
4
+ import {load} from '@loaders.gl/core';
5
+ import {getAttributeValueType, I3SAttributeLoader} from '../../i3s-attribute-loader';
6
+ import {I3SLoaderOptions} from '../../i3s-loader';
7
+ import {getUrlWithToken} from '../utils/url-utils';
8
+
9
+ /**
10
+ * Modify vertex colors array to visualize 3D objects in a attribute driven way
11
+ * @param colors - vertex colors attribute
12
+ * @param featureIds - feature Ids attribute
13
+ * @param tileOptions - tile - related options
14
+ * @param tilesetOptions - tileset-related options
15
+ * @param options - loader options
16
+ * @returns midified colors attribute
17
+ */
18
+ export async function customizeColors(
19
+ colors: MeshAttribute,
20
+ featureIds: MeshAttribute,
21
+ tileOptions: I3STileOptions,
22
+ tilesetOptions: I3STilesetOptions,
23
+ options?: I3SLoaderOptions
24
+ ): Promise<MeshAttribute> {
25
+ if (!options?.i3s?.colorsByAttribute) {
26
+ return colors;
27
+ }
28
+
29
+ const colorizeAttributeField = tilesetOptions.fields.find(
30
+ ({name}) => name === options?.i3s?.colorsByAttribute?.attributeName
31
+ );
32
+ if (
33
+ !colorizeAttributeField ||
34
+ !['esriFieldTypeDouble', 'esriFieldTypeInteger', 'esriFieldTypeSmallInteger'].includes(
35
+ colorizeAttributeField.type
36
+ )
37
+ ) {
38
+ return colors;
39
+ }
40
+
41
+ const colorizeAttributeData = await loadFeatureAttributeData(
42
+ colorizeAttributeField.name,
43
+ tileOptions,
44
+ tilesetOptions,
45
+ options
46
+ );
47
+ if (!colorizeAttributeData) {
48
+ return colors;
49
+ }
50
+
51
+ const objectIdField = tilesetOptions.fields.find(({type}) => type === 'esriFieldTypeOID');
52
+ if (!objectIdField) {
53
+ return colors;
54
+ }
55
+
56
+ const objectIdAttributeData = await loadFeatureAttributeData(
57
+ objectIdField.name,
58
+ tileOptions,
59
+ tilesetOptions,
60
+ options
61
+ );
62
+ if (!objectIdAttributeData) {
63
+ return colors;
64
+ }
65
+
66
+ const attributeValuesMap: {[key: number]: COLOR} = {};
67
+ // @ts-expect-error
68
+ for (let i = 0; i < objectIdAttributeData[objectIdField.name].length; i++) {
69
+ // @ts-expect-error
70
+ attributeValuesMap[objectIdAttributeData[objectIdField.name][i]] = calculateColorForAttribute(
71
+ // @ts-expect-error
72
+ colorizeAttributeData[colorizeAttributeField.name][i] as number,
73
+ options
74
+ );
75
+ }
76
+
77
+ for (let i = 0; i < featureIds.value.length; i++) {
78
+ const color = attributeValuesMap[featureIds.value[i]];
79
+ if (!color) {
80
+ continue; // eslint-disable-line no-continue
81
+ }
82
+ colors.value.set(color, i * 4);
83
+ }
84
+
85
+ return colors;
86
+ }
87
+
88
+ /**
89
+ * Calculate rgba color from the attribute value
90
+ * @param attributeValue - value of the attribute
91
+ * @param options - loader options
92
+ * @returns - color array for a specific attribute value
93
+ */
94
+ function calculateColorForAttribute(attributeValue: number, options?: I3SLoaderOptions): COLOR {
95
+ if (!options?.i3s?.colorsByAttribute) {
96
+ return [255, 255, 255, 255];
97
+ }
98
+ const {minValue, maxValue, minColor, maxColor} = options.i3s.colorsByAttribute;
99
+ const rate = (attributeValue - minValue) / (maxValue - minValue);
100
+ const color: COLOR = [255, 255, 255, 255];
101
+ for (let i = 0; i < minColor.length; i++) {
102
+ color[i] = Math.round((maxColor[i] - minColor[i]) * rate + minColor[i]);
103
+ }
104
+ return color;
105
+ }
106
+
107
+ /**
108
+ * Load feature attribute data from the ArcGIS rest service
109
+ * @param attributeName - attribute name
110
+ * @param tileOptions - tile-related options
111
+ * @param tilesetOptions - tileset-related options
112
+ * @param options - loader options
113
+ * @returns - Array-like list of the attribute values
114
+ */
115
+ async function loadFeatureAttributeData(
116
+ attributeName: string,
117
+ {attributeUrls}: I3STileOptions,
118
+ {attributeStorageInfo}: I3STilesetOptions,
119
+ options?: I3SLoaderOptions
120
+ ): Promise<{[key: string]: string[] | Uint32Array | Uint16Array | Float64Array | null} | null> {
121
+ const attributeIndex = attributeStorageInfo.findIndex(({name}) => attributeName === name);
122
+ if (attributeIndex === -1) {
123
+ return null;
124
+ }
125
+ const objectIdAttributeUrl = getUrlWithToken(attributeUrls[attributeIndex], options?.i3s?.token);
126
+ const attributeType = getAttributeValueType(attributeStorageInfo[attributeIndex]);
127
+ const objectIdAttributeData = await load(objectIdAttributeUrl, I3SAttributeLoader, {
128
+ attributeName,
129
+ attributeType
130
+ });
131
+
132
+ // @ts-expect-error TODO action engine
133
+ return objectIdAttributeData;
134
+ }
@@ -1,12 +1,12 @@
1
- import {Tile} from '../../types';
1
+ import {Node3DIndexDocument} from '../../types';
2
2
 
3
3
  /**
4
4
  * Generates url with token if it is exists.
5
- * @param {String} url
6
- * @param {any} token
7
- * @returns {string}
5
+ * @param url
6
+ * @param token
7
+ * @returns
8
8
  */
9
- export function getUrlWithToken(url, token = null) {
9
+ export function getUrlWithToken(url: string, token: string | null = null): string {
10
10
  return token ? `${url}?token=${token}` : url;
11
11
  }
12
12
 
@@ -15,8 +15,8 @@ export function getUrlWithToken(url, token = null) {
15
15
  * @param tile
16
16
  * @returns list of attribute urls
17
17
  */
18
- export function generateTileAttributeUrls(tile: Tile): string[] {
19
- const {url, attributeData} = tile;
18
+ export function generateTileAttributeUrls(url: string, tile: Node3DIndexDocument): string[] {
19
+ const {attributeData = []} = tile;
20
20
  const attributeUrls: string[] = [];
21
21
 
22
22
  for (let index = 0; index < attributeData.length; index++) {