itowns
Version:
A JS/WebGL framework for 3D geospatial data visualization
186 lines (151 loc) • 6.64 kB
JavaScript
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
var _Utf8Decoder = _interopRequireDefault(require("../Utils/Utf8Decoder"));
var _dTilesProvider = require("../Provider/3dTilesProvider");
/** @classdesc
* Class representing a 3D Tiles batch table
*/
var BatchTable =
/*#__PURE__*/
function () {
/**
* @param {Object} json - batch table json part
* @param {ArrayBuffer} binary - buffer representing the batch table
* @param {number} batchLength the length of the batch.
* binary part (not supported yet)
*/
function BatchTable(json, binary, batchLength) {
(0, _classCallCheck2["default"])(this, BatchTable);
if (binary !== undefined) {
console.warn('Binary batch table content not supported yet.');
} // Store batch table content
this.content = json; // Compute the length of the batch (i.e. the number of features)
// Note: The batchLength could also be retrieved from the feature table
// which is currently not supported
if (batchLength != undefined) {
this.batchLength = batchLength;
} else if (Object.keys(this.content).length === 0) {
console.warn('Batch table is empty.');
this.batchLength = 0;
} else {
this.batchLength = this.content[Object.keys(this.content)[0]].length;
} // Array storing extensions of the batch table. Key is
// extension name (registered in $3dTilesExtensions global object).
// Value is the object returned by the parser associated with the
// extensions (mapping is done in $3dTilesExtensions global object)
this.extensions = {};
}
/**
* Creates and returns a javascript object holding the displayable
* information from the batch table and from extensions of the batch table
* for a given feature
* @param {integer} featureId - id of the feature
* @returns {Object} - displayable information relative to the batch table
* and its extensions for the feature with id=featureId. Object is
* formatted as follow: {BatchTable: {BatchTableFeatureProperties},
* ExtensionName: {ExtensionDisplayableInfo}}
*/
(0, _createClass2["default"])(BatchTable, [{
key: "getPickingInfo",
value: function getPickingInfo(featureId) {
var _this = this;
var featureDisplayableInfo = {};
if (this.batchLength === 0) {
return;
}
if (featureId < 0) {
throw new Error("Batch Id (".concat(featureId, ") must be positive to access\n feature properties from the batch table."));
}
if (featureId < this.batchLength) {
// Get properties from batch table content
Object.keys(this.content).forEach(function (property) {
featureDisplayableInfo[property] = _this.content[property][featureId];
});
} else {
throw new Error("Batch Id (".concat(featureId, ") must be inferior to batch length \n (").concat(this.batchLength, ") to access feature properties in batch \n table."));
}
var BTDisplayableInfo = {
BatchTable: featureDisplayableInfo
}; // loop through extensions and append their displayable
// information to featureDisplayableInfo
if (this.extensions) {
Object.keys(this.extensions).forEach(function (extName) {
var extDisplayableInfo = (0, _defineProperty2["default"])({}, extName, _this.extensions[extName].getPickingInfo(featureId));
Object.assign(BTDisplayableInfo, extDisplayableInfo);
});
}
return BTDisplayableInfo;
}
/**
* Remove an extension from this.content. Must be called when an extension
* has been parsed and added to this.extensions
* @param {string} extensionName - the name of the extension to remove
*/
}, {
key: "removeExtensionFromContent",
value: function removeExtensionFromContent(extensionName) {
// Delete extension from content
if (this.content.extensions[extensionName]) {
delete this.content.extensions[extensionName];
} // Delete extensions from content if empty
if (Object.keys(this.content.extensions).length === 0) {
delete this.content.extensions;
}
}
}]);
return BatchTable;
}();
/**
* @module BatchTableParser
*/
var _default = {
/** Parse a batch table buffer and returns a promise that resolves with a
* BatchTable object.
* @param {ArrayBuffer} buffer - the batch table buffer.
* @param {integer} BTBinaryLength - length of the binary part of the
* batch table
* @param {number} BATCH_LENGTH the length of the batch.
* @return {Promise} - a promise that resolves with a BatchTable object.
*
*/
parse: function parse(buffer, BTBinaryLength, BATCH_LENGTH) {
// Batch table has a json part and can have a binary part (not
// supported yet)
var binary;
var jsonBuffer = buffer;
if (BTBinaryLength > 0) {
binary = buffer.slice(buffer.byteLength - BTBinaryLength);
jsonBuffer = buffer.slice(0, buffer.byteLength - BTBinaryLength);
}
var content = _Utf8Decoder["default"].decode(new Uint8Array(jsonBuffer));
var json = JSON.parse(content);
var batchTable = new BatchTable(json, binary, BATCH_LENGTH);
var promises = []; // When an extension is found, we call its parser and append the
// returned object to batchTable.extensions
// Extensions must be registered in $3dTilesExtensions global object
// where an extension name is mapped to a parser.
if (json.extensions) {
Object.keys(json.extensions).forEach(function (extName) {
if (_dTilesProvider.$3dTilesExtensions.isExtensionRegistered(extName)) {
var extensionParser = _dTilesProvider.$3dTilesExtensions.getParser(extName);
promises.push(extensionParser(json.extensions[extName]).then(function (extObject) {
batchTable.extensions[extName] = extObject;
batchTable.removeExtensionFromContent(extName);
}));
}
});
} // values[0] is the results of the first promise pushed in promises,
// i.e. batchTable
return Promise.all(promises).then(function () {
return batchTable;
});
}
};
exports["default"] = _default;
;