@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.
- package/dist/dist.min.js +1219 -1480
- package/dist/es5/arcgis-webscene-loader.js +2 -8
- package/dist/es5/arcgis-webscene-loader.js.map +1 -1
- package/dist/es5/bundle.js +0 -1
- package/dist/es5/bundle.js.map +1 -1
- package/dist/es5/i3s-attribute-loader.js +19 -59
- package/dist/es5/i3s-attribute-loader.js.map +1 -1
- package/dist/es5/i3s-building-scene-layer-loader.js +1 -10
- package/dist/es5/i3s-building-scene-layer-loader.js.map +1 -1
- package/dist/es5/i3s-content-loader.js +18 -18
- package/dist/es5/i3s-content-loader.js.map +1 -1
- package/dist/es5/i3s-loader.js +48 -80
- package/dist/es5/i3s-loader.js.map +1 -1
- package/dist/es5/i3s-node-page-loader.js +1 -12
- package/dist/es5/i3s-node-page-loader.js.map +1 -1
- package/dist/es5/index.js +12 -18
- package/dist/es5/index.js.map +1 -1
- package/dist/es5/lib/helpers/i3s-nodepages-tiles.js +18 -78
- package/dist/es5/lib/helpers/i3s-nodepages-tiles.js.map +1 -1
- package/dist/es5/lib/parsers/constants.js +3 -19
- package/dist/es5/lib/parsers/constants.js.map +1 -1
- package/dist/es5/lib/parsers/parse-arcgis-webscene.js +128 -30
- package/dist/es5/lib/parsers/parse-arcgis-webscene.js.map +1 -1
- package/dist/es5/lib/parsers/parse-i3s-attribute.js +1 -23
- package/dist/es5/lib/parsers/parse-i3s-attribute.js.map +1 -1
- package/dist/es5/lib/parsers/parse-i3s-building-scene-layer.js +8 -25
- package/dist/es5/lib/parsers/parse-i3s-building-scene-layer.js.map +1 -1
- package/dist/es5/lib/parsers/parse-i3s-tile-content.js +90 -199
- package/dist/es5/lib/parsers/parse-i3s-tile-content.js.map +1 -1
- package/dist/es5/lib/parsers/parse-i3s.js +6 -37
- package/dist/es5/lib/parsers/parse-i3s.js.map +1 -1
- package/dist/es5/lib/utils/convert-i3s-obb-to-mbs.js +0 -7
- package/dist/es5/lib/utils/convert-i3s-obb-to-mbs.js.map +1 -1
- package/dist/es5/lib/utils/customizeColors.js +164 -0
- package/dist/es5/lib/utils/customizeColors.js.map +1 -0
- package/dist/es5/lib/utils/url-utils.js +3 -8
- package/dist/es5/lib/utils/url-utils.js.map +1 -1
- package/dist/es5/types.js +0 -3
- package/dist/es5/types.js.map +1 -1
- package/dist/es5/workers/i3s-content-nodejs-worker.js +7 -0
- package/dist/es5/workers/i3s-content-nodejs-worker.js.map +1 -0
- package/dist/es5/workers/i3s-content-worker.js +0 -2
- package/dist/es5/workers/i3s-content-worker.js.map +1 -1
- package/dist/esm/arcgis-webscene-loader.js +3 -1
- package/dist/esm/arcgis-webscene-loader.js.map +1 -1
- package/dist/esm/bundle.js +1 -1
- package/dist/esm/bundle.js.map +1 -1
- package/dist/esm/i3s-attribute-loader.js +9 -26
- package/dist/esm/i3s-attribute-loader.js.map +1 -1
- package/dist/esm/i3s-building-scene-layer-loader.js +2 -3
- package/dist/esm/i3s-building-scene-layer-loader.js.map +1 -1
- package/dist/esm/i3s-content-loader.js +13 -6
- package/dist/esm/i3s-content-loader.js.map +1 -1
- package/dist/esm/i3s-loader.js +16 -24
- package/dist/esm/i3s-loader.js.map +1 -1
- package/dist/esm/i3s-node-page-loader.js +1 -2
- package/dist/esm/i3s-node-page-loader.js.map +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/lib/helpers/i3s-nodepages-tiles.js +2 -45
- package/dist/esm/lib/helpers/i3s-nodepages-tiles.js.map +1 -1
- package/dist/esm/lib/parsers/constants.js +2 -11
- package/dist/esm/lib/parsers/constants.js.map +1 -1
- package/dist/esm/lib/parsers/parse-arcgis-webscene.js +50 -11
- package/dist/esm/lib/parsers/parse-arcgis-webscene.js.map +1 -1
- package/dist/esm/lib/parsers/parse-i3s-attribute.js +1 -8
- package/dist/esm/lib/parsers/parse-i3s-attribute.js.map +1 -1
- package/dist/esm/lib/parsers/parse-i3s-building-scene-layer.js +1 -4
- package/dist/esm/lib/parsers/parse-i3s-building-scene-layer.js.map +1 -1
- package/dist/esm/lib/parsers/parse-i3s-tile-content.js +60 -104
- package/dist/esm/lib/parsers/parse-i3s-tile-content.js.map +1 -1
- package/dist/esm/lib/parsers/parse-i3s.js +16 -18
- package/dist/esm/lib/parsers/parse-i3s.js.map +1 -1
- package/dist/esm/lib/utils/convert-i3s-obb-to-mbs.js.map +1 -1
- package/dist/esm/lib/utils/customizeColors.js +96 -0
- package/dist/esm/lib/utils/customizeColors.js.map +1 -0
- package/dist/esm/lib/utils/url-utils.js +5 -5
- package/dist/esm/lib/utils/url-utils.js.map +1 -1
- package/dist/esm/types.js +0 -3
- package/dist/esm/types.js.map +1 -1
- package/dist/esm/workers/i3s-content-nodejs-worker.js +5 -0
- package/dist/esm/workers/i3s-content-nodejs-worker.js.map +1 -0
- package/dist/esm/workers/i3s-content-worker.js.map +1 -1
- package/dist/i3s-attribute-loader.d.ts +6 -0
- package/dist/i3s-attribute-loader.d.ts.map +1 -1
- package/dist/i3s-attribute-loader.js +2 -1
- package/dist/i3s-content-loader.d.ts.map +1 -1
- package/dist/i3s-content-loader.js +9 -4
- package/dist/i3s-content-nodejs-worker.js +201 -0
- package/dist/i3s-content-nodejs-worker.js.map +7 -0
- package/dist/i3s-content-worker.js +675 -1046
- package/dist/i3s-loader.d.ts +5 -0
- package/dist/i3s-loader.d.ts.map +1 -1
- package/dist/i3s-loader.js +12 -10
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/lib/parsers/constants.js +1 -1
- package/dist/lib/parsers/parse-arcgis-webscene.d.ts.map +1 -1
- package/dist/lib/parsers/parse-arcgis-webscene.js +49 -7
- package/dist/lib/parsers/parse-i3s-tile-content.d.ts +2 -2
- package/dist/lib/parsers/parse-i3s-tile-content.d.ts.map +1 -1
- package/dist/lib/parsers/parse-i3s-tile-content.js +38 -33
- package/dist/lib/parsers/parse-i3s.d.ts +1 -1
- package/dist/lib/parsers/parse-i3s.d.ts.map +1 -1
- package/dist/lib/parsers/parse-i3s.js +1 -1
- package/dist/lib/utils/customizeColors.d.ts +14 -0
- package/dist/lib/utils/customizeColors.d.ts.map +1 -0
- package/dist/lib/utils/customizeColors.js +89 -0
- package/dist/types.d.ts +265 -85
- package/dist/types.d.ts.map +1 -1
- package/dist/workers/i3s-content-nodejs-worker.d.ts +2 -0
- package/dist/workers/i3s-content-nodejs-worker.d.ts.map +1 -0
- package/dist/workers/i3s-content-nodejs-worker.js +6 -0
- package/package.json +12 -12
- package/src/i3s-attribute-loader.ts +1 -1
- package/src/i3s-content-loader.ts +19 -6
- package/src/i3s-loader.ts +22 -13
- package/src/index.ts +8 -1
- package/src/lib/parsers/constants.ts +1 -1
- package/src/lib/parsers/parse-arcgis-webscene.ts +57 -7
- package/src/lib/parsers/parse-i3s-tile-content.ts +56 -43
- package/src/lib/parsers/parse-i3s.ts +1 -1
- package/src/lib/utils/customizeColors.ts +129 -0
- package/src/types.ts +198 -3
- package/src/workers/i3s-content-nodejs-worker.ts +5 -0
package/dist/i3s-loader.d.ts
CHANGED
|
@@ -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
|
*/
|
package/dist/i3s-loader.d.ts.map
CHANGED
|
@@ -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;
|
|
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"}
|
package/dist/i3s-loader.js
CHANGED
|
@@ -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,
|
|
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,
|
|
90
|
+
async function parseTile(data, context) {
|
|
89
91
|
data = JSON.parse(new TextDecoder().decode(data));
|
|
90
|
-
return (0, parse_i3s_1.normalizeTileData)(data,
|
|
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
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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,
|
|
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.
|
|
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":"
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 {
|
|
3
|
-
export declare function parseI3STileContent(arrayBuffer: ArrayBuffer,
|
|
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,
|
|
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,
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
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 = { ...
|
|
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
|
-
|
|
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
|
-
|
|
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,
|
|
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
|
-
|
|
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
|
-
|
|
75
|
+
content.texture = arrayBuffer;
|
|
68
76
|
}
|
|
69
77
|
}
|
|
70
|
-
|
|
71
|
-
if (
|
|
72
|
-
|
|
78
|
+
content.material = makePbrMaterial(tileOptions.materialDefinition, content.texture);
|
|
79
|
+
if (content.material) {
|
|
80
|
+
content.texture = null;
|
|
73
81
|
}
|
|
74
|
-
return await parseI3SNodeGeometry(arrayBuffer,
|
|
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,
|
|
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 (
|
|
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 } =
|
|
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(
|
|
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,
|
|
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
|
-
|
|
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
|
|
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(
|
|
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
|
|
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,
|
|
296
|
-
const 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,
|
|
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,
|
|
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,
|
|
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
|
+
}
|