UNPKG

@deck.gl/geo-layers

Version:

deck.gl layers supporting geospatial use cases and GIS formats

668 lines (561 loc) 18.8 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = exports.STRATEGY_DEFAULT = exports.STRATEGY_REPLACE = exports.STRATEGY_NEVER = void 0; var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _tile2dHeader = _interopRequireDefault(require("./tile-2d-header")); var _utils = require("./utils"); var _loaderUtils = require("@loaders.gl/loader-utils"); var _core = require("@math.gl/core"); var _STRATEGIES; function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } var TILE_STATE_VISITED = 1; var TILE_STATE_VISIBLE = 2; var STRATEGY_NEVER = 'never'; exports.STRATEGY_NEVER = STRATEGY_NEVER; var STRATEGY_REPLACE = 'no-overlap'; exports.STRATEGY_REPLACE = STRATEGY_REPLACE; var STRATEGY_DEFAULT = 'best-available'; exports.STRATEGY_DEFAULT = STRATEGY_DEFAULT; var DEFAULT_CACHE_SCALE = 5; var STRATEGIES = (_STRATEGIES = {}, (0, _defineProperty2.default)(_STRATEGIES, STRATEGY_DEFAULT, updateTileStateDefault), (0, _defineProperty2.default)(_STRATEGIES, STRATEGY_REPLACE, updateTileStateReplace), (0, _defineProperty2.default)(_STRATEGIES, STRATEGY_NEVER, function () {}), _STRATEGIES); var Tileset2D = function () { function Tileset2D(opts) { var _this = this; (0, _classCallCheck2.default)(this, Tileset2D); this.opts = opts; this.onTileLoad = function (tile) { _this.opts.onTileLoad(tile); if (_this.opts.maxCacheByteSize) { _this._cacheByteSize += tile.byteLength; _this._resizeCache(); } }; this._requestScheduler = new _loaderUtils.RequestScheduler({ maxRequests: opts.maxRequests, throttleRequests: opts.maxRequests > 0 }); this._cache = new Map(); this._tiles = []; this._dirty = false; this._cacheByteSize = 0; this._viewport = null; this._selectedTiles = null; this._frameNumber = 0; this._modelMatrix = new _core.Matrix4(); this._modelMatrixInverse = new _core.Matrix4(); this.setOptions(opts); } (0, _createClass2.default)(Tileset2D, [{ key: "tiles", get: function get() { return this._tiles; } }, { key: "selectedTiles", get: function get() { return this._selectedTiles; } }, { key: "isLoaded", get: function get() { return this._selectedTiles.every(function (tile) { return tile.isLoaded; }); } }, { key: "needsReload", get: function get() { return this._selectedTiles.some(function (tile) { return tile.needsReload; }); } }, { key: "setOptions", value: function setOptions(opts) { Object.assign(this.opts, opts); if (Number.isFinite(opts.maxZoom)) { this._maxZoom = Math.floor(opts.maxZoom); } if (Number.isFinite(opts.minZoom)) { this._minZoom = Math.ceil(opts.minZoom); } } }, { key: "finalize", value: function finalize() { var _iterator = _createForOfIteratorHelper(this._cache.values()), _step; try { for (_iterator.s(); !(_step = _iterator.n()).done;) { var tile = _step.value; if (tile.isLoading) { tile.abort(); } } } catch (err) { _iterator.e(err); } finally { _iterator.f(); } this._cache.clear(); this._tiles = []; this._selectedTiles = null; } }, { key: "reloadAll", value: function reloadAll() { var _iterator2 = _createForOfIteratorHelper(this._cache.keys()), _step2; try { for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) { var tileId = _step2.value; var tile = this._cache.get(tileId); if (!this._selectedTiles.includes(tile)) { this._cache.delete(tileId); } else { tile.setNeedsReload(); } } } catch (err) { _iterator2.e(err); } finally { _iterator2.f(); } } }, { key: "update", value: function update(viewport) { var _this2 = this; var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, zRange = _ref.zRange, modelMatrix = _ref.modelMatrix; var modelMatrixAsMatrix4 = new _core.Matrix4(modelMatrix); var isModelMatrixNew = !modelMatrixAsMatrix4.equals(this._modelMatrix); if (!viewport.equals(this._viewport) || isModelMatrixNew) { if (isModelMatrixNew) { this._modelMatrixInverse = modelMatrixAsMatrix4.clone().invert(); this._modelMatrix = modelMatrixAsMatrix4; } this._viewport = viewport; var tileIndices = this.getTileIndices({ viewport: viewport, maxZoom: this._maxZoom, minZoom: this._minZoom, zRange: zRange, modelMatrix: this._modelMatrix, modelMatrixInverse: this._modelMatrixInverse }); this._selectedTiles = tileIndices.map(function (index) { return _this2._getTile(index, true); }); if (this._dirty) { this._rebuildTree(); } } else if (this.needsReload) { this._selectedTiles = this._selectedTiles.map(function (tile) { return _this2._getTile({ x: tile.x, y: tile.y, z: tile.z }); }); } var changed = this.updateTileStates(); this._pruneRequests(); if (this._dirty) { this._resizeCache(); } if (changed) { this._frameNumber++; } return this._frameNumber; } }, { key: "getTileIndices", value: function getTileIndices(_ref2) { var viewport = _ref2.viewport, maxZoom = _ref2.maxZoom, minZoom = _ref2.minZoom, zRange = _ref2.zRange, modelMatrix = _ref2.modelMatrix, modelMatrixInverse = _ref2.modelMatrixInverse; var _this$opts = this.opts, tileSize = _this$opts.tileSize, extent = _this$opts.extent, zoomOffset = _this$opts.zoomOffset; return (0, _utils.getTileIndices)({ viewport: viewport, maxZoom: maxZoom, minZoom: minZoom, zRange: zRange, tileSize: tileSize, extent: extent, modelMatrix: modelMatrix, modelMatrixInverse: modelMatrixInverse, zoomOffset: zoomOffset }); } }, { key: "getTileMetadata", value: function getTileMetadata(_ref3) { var x = _ref3.x, y = _ref3.y, z = _ref3.z; var tileSize = this.opts.tileSize; return { bbox: (0, _utils.tileToBoundingBox)(this._viewport, x, y, z, tileSize) }; } }, { key: "getParentIndex", value: function getParentIndex(tileIndex) { tileIndex.x = Math.floor(tileIndex.x / 2); tileIndex.y = Math.floor(tileIndex.y / 2); tileIndex.z -= 1; return tileIndex; } }, { key: "updateTileStates", value: function updateTileStates() { var refinementStrategy = this.opts.refinementStrategy || STRATEGY_DEFAULT; var visibilities = new Array(this._cache.size); var i = 0; var _iterator3 = _createForOfIteratorHelper(this._cache.values()), _step3; try { for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) { var tile = _step3.value; visibilities[i++] = tile.isVisible; tile.isSelected = false; tile.isVisible = false; } } catch (err) { _iterator3.e(err); } finally { _iterator3.f(); } var _iterator4 = _createForOfIteratorHelper(this._selectedTiles), _step4; try { for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) { var _tile = _step4.value; _tile.isSelected = true; _tile.isVisible = true; } } catch (err) { _iterator4.e(err); } finally { _iterator4.f(); } (typeof refinementStrategy === 'function' ? refinementStrategy : STRATEGIES[refinementStrategy])(Array.from(this._cache.values())); i = 0; var _iterator5 = _createForOfIteratorHelper(this._cache.values()), _step5; try { for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) { var _tile2 = _step5.value; if (visibilities[i++] !== _tile2.isVisible) { return true; } } } catch (err) { _iterator5.e(err); } finally { _iterator5.f(); } return false; } }, { key: "_pruneRequests", value: function _pruneRequests() { var maxRequests = this.opts.maxRequests; var abortCandidates = []; var ongoingRequestCount = 0; var _iterator6 = _createForOfIteratorHelper(this._cache.values()), _step6; try { for (_iterator6.s(); !(_step6 = _iterator6.n()).done;) { var _tile3 = _step6.value; if (_tile3.isLoading) { ongoingRequestCount++; if (!_tile3.isSelected && !_tile3.isVisible) { abortCandidates.push(_tile3); } } } } catch (err) { _iterator6.e(err); } finally { _iterator6.f(); } while (maxRequests > 0 && ongoingRequestCount > maxRequests && abortCandidates.length > 0) { var tile = abortCandidates.shift(); tile.abort(); ongoingRequestCount--; } } }, { key: "_rebuildTree", value: function _rebuildTree() { var _cache = this._cache; var _iterator7 = _createForOfIteratorHelper(_cache.values()), _step7; try { for (_iterator7.s(); !(_step7 = _iterator7.n()).done;) { var tile = _step7.value; tile.parent = null; tile.children.length = 0; } } catch (err) { _iterator7.e(err); } finally { _iterator7.f(); } var _iterator8 = _createForOfIteratorHelper(_cache.values()), _step8; try { for (_iterator8.s(); !(_step8 = _iterator8.n()).done;) { var _tile4 = _step8.value; var parent = this._getNearestAncestor(_tile4.x, _tile4.y, _tile4.z); _tile4.parent = parent; if (parent) { parent.children.push(_tile4); } } } catch (err) { _iterator8.e(err); } finally { _iterator8.f(); } } }, { key: "_resizeCache", value: function _resizeCache() { var _cache = this._cache, opts = this.opts; var maxCacheSize = opts.maxCacheSize || (opts.maxCacheByteSize ? Infinity : DEFAULT_CACHE_SCALE * this.selectedTiles.length); var maxCacheByteSize = opts.maxCacheByteSize || Infinity; var overflown = _cache.size > maxCacheSize || this._cacheByteSize > maxCacheByteSize; if (overflown) { var _iterator9 = _createForOfIteratorHelper(_cache), _step9; try { for (_iterator9.s(); !(_step9 = _iterator9.n()).done;) { var _step9$value = (0, _slicedToArray2.default)(_step9.value, 2), tileId = _step9$value[0], tile = _step9$value[1]; if (!tile.isVisible) { this._cacheByteSize -= opts.maxCacheByteSize ? tile.byteLength : 0; _cache.delete(tileId); this.opts.onTileUnload(tile); } if (_cache.size <= maxCacheSize && this._cacheByteSize <= maxCacheByteSize) { break; } } } catch (err) { _iterator9.e(err); } finally { _iterator9.f(); } this._rebuildTree(); this._dirty = true; } if (this._dirty) { this._tiles = Array.from(this._cache.values()).sort(function (t1, t2) { return t1.z - t2.z; }); this._dirty = false; } } }, { key: "_getTile", value: function _getTile(_ref4, create) { var x = _ref4.x, y = _ref4.y, z = _ref4.z; var tileId = "".concat(x, ",").concat(y, ",").concat(z); var tile = this._cache.get(tileId); var needsReload = false; if (!tile && create) { tile = new _tile2dHeader.default({ x: x, y: y, z: z }); Object.assign(tile, this.getTileMetadata(tile)); needsReload = true; this._cache.set(tileId, tile); this._dirty = true; } else if (tile && tile.needsReload) { needsReload = true; } if (needsReload) { tile.loadData({ getData: this.opts.getTileData, requestScheduler: this._requestScheduler, onLoad: this.onTileLoad, onError: this.opts.onTileError }); } return tile; } }, { key: "_getNearestAncestor", value: function _getNearestAncestor(x, y, z) { var _this$_minZoom = this._minZoom, _minZoom = _this$_minZoom === void 0 ? 0 : _this$_minZoom; var index = { x: x, y: y, z: z }; while (index.z > _minZoom) { index = this.getParentIndex(index); var parent = this._getTile(index); if (parent) { return parent; } } return null; } }]); return Tileset2D; }(); exports.default = Tileset2D; function updateTileStateDefault(allTiles) { var _iterator10 = _createForOfIteratorHelper(allTiles), _step10; try { for (_iterator10.s(); !(_step10 = _iterator10.n()).done;) { var tile = _step10.value; tile.state = 0; } } catch (err) { _iterator10.e(err); } finally { _iterator10.f(); } var _iterator11 = _createForOfIteratorHelper(allTiles), _step11; try { for (_iterator11.s(); !(_step11 = _iterator11.n()).done;) { var _tile5 = _step11.value; if (_tile5.isSelected && !getPlaceholderInAncestors(_tile5)) { getPlaceholderInChildren(_tile5); } } } catch (err) { _iterator11.e(err); } finally { _iterator11.f(); } var _iterator12 = _createForOfIteratorHelper(allTiles), _step12; try { for (_iterator12.s(); !(_step12 = _iterator12.n()).done;) { var _tile6 = _step12.value; _tile6.isVisible = Boolean(_tile6.state & TILE_STATE_VISIBLE); } } catch (err) { _iterator12.e(err); } finally { _iterator12.f(); } } function updateTileStateReplace(allTiles) { var _iterator13 = _createForOfIteratorHelper(allTiles), _step13; try { for (_iterator13.s(); !(_step13 = _iterator13.n()).done;) { var tile = _step13.value; tile.state = 0; } } catch (err) { _iterator13.e(err); } finally { _iterator13.f(); } var _iterator14 = _createForOfIteratorHelper(allTiles), _step14; try { for (_iterator14.s(); !(_step14 = _iterator14.n()).done;) { var _tile7 = _step14.value; if (_tile7.isSelected) { getPlaceholderInAncestors(_tile7); } } } catch (err) { _iterator14.e(err); } finally { _iterator14.f(); } var sortedTiles = Array.from(allTiles).sort(function (t1, t2) { return t1.z - t2.z; }); var _iterator15 = _createForOfIteratorHelper(sortedTiles), _step15; try { for (_iterator15.s(); !(_step15 = _iterator15.n()).done;) { var _tile8 = _step15.value; _tile8.isVisible = Boolean(_tile8.state & TILE_STATE_VISIBLE); if (_tile8.isVisible || _tile8.state & TILE_STATE_VISITED) { var _iterator16 = _createForOfIteratorHelper(_tile8.children), _step16; try { for (_iterator16.s(); !(_step16 = _iterator16.n()).done;) { var child = _step16.value; child.state = TILE_STATE_VISITED; } } catch (err) { _iterator16.e(err); } finally { _iterator16.f(); } } else if (_tile8.isSelected) { getPlaceholderInChildren(_tile8); } } } catch (err) { _iterator15.e(err); } finally { _iterator15.f(); } } function getPlaceholderInAncestors(tile) { while (tile) { if (tile.isLoaded || tile.content) { tile.state |= TILE_STATE_VISIBLE; return true; } tile = tile.parent; } return false; } function getPlaceholderInChildren(tile) { var _iterator17 = _createForOfIteratorHelper(tile.children), _step17; try { for (_iterator17.s(); !(_step17 = _iterator17.n()).done;) { var child = _step17.value; if (child.isLoaded || child.content) { child.state |= TILE_STATE_VISIBLE; } else { getPlaceholderInChildren(child); } } } catch (err) { _iterator17.e(err); } finally { _iterator17.f(); } } //# sourceMappingURL=tileset-2d.js.map