UNPKG

kepler.gl

Version:

kepler.gl is a webgl based application to visualize large scale location data in the browser

133 lines (131 loc) 17.7 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.MVTLayer = void 0; var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator")); var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn")); var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _extensions = require("@deck.gl/extensions"); var _geoLayers = require("@deck.gl/geo-layers"); var _loadingCounter = require("./loading-counter"); function _callSuper(t, o, e) { return o = (0, _getPrototypeOf2["default"])(o), (0, _possibleConstructorReturn2["default"])(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], (0, _getPrototypeOf2["default"])(t).constructor) : o.apply(t, e)); } function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } // SPDX-License-Identifier: MIT // Copyright contributors to the kepler.gl project /* Custom MVT layer that works with MVTSource and PMTileSource. Changes: - getTileData: handles props.getTileData. - renderSubLayers: removed coordinates logic present in original MVTLayer:renderSubLayers. - renderSubLayers: set clipBounds. - loaders.gl & older deck.gl: geojson-table: data = data.features */ // @ts-expect-error need to patch private methods because of newer loaders.gl var MVTLayer = exports.MVTLayer = /*#__PURE__*/function (_MVTLayer2) { function MVTLayer() { (0, _classCallCheck2["default"])(this, MVTLayer); return _callSuper(this, MVTLayer, arguments); } (0, _inherits2["default"])(MVTLayer, _MVTLayer2); return (0, _createClass2["default"])(MVTLayer, [{ key: "getTileData", value: function () { var _getTileData = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee(tile) { var getTileData, data; return _regenerator["default"].wrap(function _callee$(_context) { while (1) switch (_context.prev = _context.next) { case 0: getTileData = this.props.getTileData; data = this.state.data; tile.url = typeof data === 'string' || Array.isArray(data) ? (0, _geoLayers._getURLFromTemplate)(data, tile) : null; if (!getTileData) { _context.next = 12; break; } (0, _loadingCounter.incrementVectorTileLoading)(); _context.prev = 5; _context.next = 8; return getTileData(tile); case 8: return _context.abrupt("return", _context.sent); case 9: _context.prev = 9; (0, _loadingCounter.decrementVectorTileLoading)(); return _context.finish(9); case 12: return _context.abrupt("return", null); case 13: case "end": return _context.stop(); } }, _callee, this, [[5,, 9, 12]]); })); function getTileData(_x) { return _getTileData.apply(this, arguments); } return getTileData; }() }, { key: "renderSubLayers", value: function renderSubLayers(props) { var boundingBox = props.tile.boundingBox; props.autoHighlight = true; if (boundingBox) { props.clipBounds = [].concat((0, _toConsumableArray2["default"])(boundingBox[0]), (0, _toConsumableArray2["default"])(boundingBox[1])); props.extensions = [].concat((0, _toConsumableArray2["default"])(props.extensions || []), [new _extensions.ClipExtension()]); } return this.props.renderSubLayers(props); } }, { key: "getHighlightedObjectIndex", value: function getHighlightedObjectIndex(tile) { var _data; var _this$state = this.state, hoveredFeatureId = _this$state.hoveredFeatureId, hoveredFeatureLayerName = _this$state.hoveredFeatureLayerName; var _this$props = this.props, uniqueIdProperty = _this$props.uniqueIdProperty, highlightedFeatureId = _this$props.highlightedFeatureId; var data = tile.content; data = ((_data = data) === null || _data === void 0 ? void 0 : _data.shape) === 'geojson-table' ? data.features : data; var isHighlighted = isFeatureIdDefined(highlightedFeatureId); var isFeatureIdPresent = isFeatureIdDefined(hoveredFeatureId) || isHighlighted; if (!isFeatureIdPresent) { return -1; } var featureIdToHighlight = isHighlighted ? highlightedFeatureId : hoveredFeatureId; // Iterable data if (Array.isArray(data)) { return data.findIndex(function (feature) { var isMatchingId = getFeatureUniqueId(feature, uniqueIdProperty) === featureIdToHighlight; var isMatchingLayer = isHighlighted || getFeatureLayerName(feature) === hoveredFeatureLayerName; return isMatchingId && isMatchingLayer; }); } return -1; } }]); }(_geoLayers.MVTLayer); function getFeatureUniqueId(feature, uniqueIdProperty) { if (feature.properties && uniqueIdProperty) { return feature.properties[uniqueIdProperty]; } if ('id' in feature) { return feature.id; } return undefined; } function getFeatureLayerName(feature) { var _feature$properties; return ((_feature$properties = feature.properties) === null || _feature$properties === void 0 ? void 0 : _feature$properties.layerName) || null; } function isFeatureIdDefined(value) { return value !== undefined && value !== null && value !== ''; } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfZXh0ZW5zaW9ucyIsInJlcXVpcmUiLCJfZ2VvTGF5ZXJzIiwiX2xvYWRpbmdDb3VudGVyIiwiX2NhbGxTdXBlciIsInQiLCJvIiwiZSIsIl9nZXRQcm90b3R5cGVPZjIiLCJfcG9zc2libGVDb25zdHJ1Y3RvclJldHVybjIiLCJfaXNOYXRpdmVSZWZsZWN0Q29uc3RydWN0IiwiUmVmbGVjdCIsImNvbnN0cnVjdCIsImNvbnN0cnVjdG9yIiwiYXBwbHkiLCJCb29sZWFuIiwicHJvdG90eXBlIiwidmFsdWVPZiIsImNhbGwiLCJNVlRMYXllciIsImV4cG9ydHMiLCJfTVZUTGF5ZXIyIiwiX2NsYXNzQ2FsbENoZWNrMiIsImFyZ3VtZW50cyIsIl9pbmhlcml0czIiLCJfY3JlYXRlQ2xhc3MyIiwia2V5IiwidmFsdWUiLCJfZ2V0VGlsZURhdGEiLCJfYXN5bmNUb0dlbmVyYXRvcjIiLCJfcmVnZW5lcmF0b3IiLCJtYXJrIiwiX2NhbGxlZSIsInRpbGUiLCJnZXRUaWxlRGF0YSIsImRhdGEiLCJ3cmFwIiwiX2NhbGxlZSQiLCJfY29udGV4dCIsInByZXYiLCJuZXh0IiwicHJvcHMiLCJzdGF0ZSIsInVybCIsIkFycmF5IiwiaXNBcnJheSIsIl9nZXRVUkxGcm9tVGVtcGxhdGUiLCJpbmNyZW1lbnRWZWN0b3JUaWxlTG9hZGluZyIsImFicnVwdCIsInNlbnQiLCJkZWNyZW1lbnRWZWN0b3JUaWxlTG9hZGluZyIsImZpbmlzaCIsInN0b3AiLCJfeCIsInJlbmRlclN1YkxheWVycyIsImJvdW5kaW5nQm94IiwiYXV0b0hpZ2hsaWdodCIsImNsaXBCb3VuZHMiLCJjb25jYXQiLCJfdG9Db25zdW1hYmxlQXJyYXkyIiwiZXh0ZW5zaW9ucyIsIkNsaXBFeHRlbnNpb24iLCJnZXRIaWdobGlnaHRlZE9iamVjdEluZGV4IiwiX2RhdGEiLCJfdGhpcyRzdGF0ZSIsImhvdmVyZWRGZWF0dXJlSWQiLCJob3ZlcmVkRmVhdHVyZUxheWVyTmFtZSIsIl90aGlzJHByb3BzIiwidW5pcXVlSWRQcm9wZXJ0eSIsImhpZ2hsaWdodGVkRmVhdHVyZUlkIiwiY29udGVudCIsInNoYXBlIiwiZmVhdHVyZXMiLCJpc0hpZ2hsaWdodGVkIiwiaXNGZWF0dXJlSWREZWZpbmVkIiwiaXNGZWF0dXJlSWRQcmVzZW50IiwiZmVhdHVyZUlkVG9IaWdobGlnaHQiLCJmaW5kSW5kZXgiLCJmZWF0dXJlIiwiaXNNYXRjaGluZ0lkIiwiZ2V0RmVhdHVyZVVuaXF1ZUlkIiwiaXNNYXRjaGluZ0xheWVyIiwiZ2V0RmVhdHVyZUxheWVyTmFtZSIsIl9NVlRMYXllciIsInByb3BlcnRpZXMiLCJpZCIsInVuZGVmaW5lZCIsIl9mZWF0dXJlJHByb3BlcnRpZXMiLCJsYXllck5hbWUiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvdmVjdG9yLXRpbGUvbXZ0LWxheWVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbmltcG9ydCB7TGF5ZXIsIExheWVyc0xpc3R9IGZyb20gJ0BkZWNrLmdsL2NvcmUnO1xuaW1wb3J0IHtDbGlwRXh0ZW5zaW9ufSBmcm9tICdAZGVjay5nbC9leHRlbnNpb25zJztcbmltcG9ydCB7XG4gIE1WVExheWVyIGFzIF9NVlRMYXllcixcbiAgVGlsZUxheWVyLFxuICAvLyBAdHMtZXhwZWN0LWVycm9yIGRlY2suZ2wgOSBpbnRlcm5hbFxuICBfZ2V0VVJMRnJvbVRlbXBsYXRlLFxuICAvLyBAdHMtZXhwZWN0LWVycm9yIGRlY2suZ2wgOSBpbnRlcm5hbFxuICBfVGlsZUxvYWRQcm9wcyxcbiAgX1RpbGUyREhlYWRlclxufSBmcm9tICdAZGVjay5nbC9nZW8tbGF5ZXJzJztcbmltcG9ydCB7aW5jcmVtZW50VmVjdG9yVGlsZUxvYWRpbmcsIGRlY3JlbWVudFZlY3RvclRpbGVMb2FkaW5nfSBmcm9tICcuL2xvYWRpbmctY291bnRlcic7XG5cbi8qXG4gIEN1c3RvbSBNVlQgbGF5ZXIgdGhhdCB3b3JrcyB3aXRoIE1WVFNvdXJjZSBhbmQgUE1UaWxlU291cmNlLlxuICBDaGFuZ2VzOlxuICAgIC0gZ2V0VGlsZURhdGE6IGhhbmRsZXMgcHJvcHMuZ2V0VGlsZURhdGEuXG4gICAgLSByZW5kZXJTdWJMYXllcnM6IHJlbW92ZWQgY29vcmRpbmF0ZXMgbG9naWMgcHJlc2VudCBpbiBvcmlnaW5hbCBNVlRMYXllcjpyZW5kZXJTdWJMYXllcnMuXG4gICAgLSByZW5kZXJTdWJMYXllcnM6IHNldCBjbGlwQm91bmRzLlxuICAgIC0gbG9hZGVycy5nbCAmIG9sZGVyIGRlY2suZ2w6IGdlb2pzb24tdGFibGU6IGRhdGEgPSBkYXRhLmZlYXR1cmVzXG4qL1xuXG4vLyBAdHMtZXhwZWN0LWVycm9yIG5lZWQgdG8gcGF0Y2ggcHJpdmF0ZSBtZXRob2RzIGJlY2F1c2Ugb2YgbmV3ZXIgbG9hZGVycy5nbFxuZXhwb3J0IGNsYXNzIE1WVExheWVyPEV4dHJhUHJvcHM+IGV4dGVuZHMgX01WVExheWVyPEV4dHJhUHJvcHM+IHtcbiAgYXN5bmMgZ2V0VGlsZURhdGEodGlsZTogX1RpbGVMb2FkUHJvcHMpOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IHtnZXRUaWxlRGF0YX0gPSB0aGlzLnByb3BzO1xuICAgIGNvbnN0IHtkYXRhfSA9IHRoaXMuc3RhdGU7XG5cbiAgICB0aWxlLnVybCA9XG4gICAgICB0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycgfHwgQXJyYXkuaXNBcnJheShkYXRhKSA/IF9nZXRVUkxGcm9tVGVtcGxhdGUoZGF0YSwgdGlsZSkgOiBudWxsO1xuICAgIGlmIChnZXRUaWxlRGF0YSkge1xuICAgICAgaW5jcmVtZW50VmVjdG9yVGlsZUxvYWRpbmcoKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCBnZXRUaWxlRGF0YSh0aWxlKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGRlY3JlbWVudFZlY3RvclRpbGVMb2FkaW5nKCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmVuZGVyU3ViTGF5ZXJzKFxuICAgIHByb3BzOiBUaWxlTGF5ZXJbJ3Byb3BzJ10gJiB7XG4gICAgICBpZDogc3RyaW5nO1xuICAgICAgZGF0YTogYW55O1xuICAgICAgX29mZnNldDogbnVtYmVyO1xuICAgICAgdGlsZTogYW55O1xuICAgICAgY2xpcEJvdW5kcz86IG51bWJlcltdO1xuICAgIH1cbiAgKTogTGF5ZXIgfCBudWxsIHwgTGF5ZXJzTGlzdCB7XG4gICAgY29uc3Qge2JvdW5kaW5nQm94fSA9IHByb3BzLnRpbGU7XG5cbiAgICBwcm9wcy5hdXRvSGlnaGxpZ2h0ID0gdHJ1ZTtcblxuICAgIGlmIChib3VuZGluZ0JveCkge1xuICAgICAgcHJvcHMuY2xpcEJvdW5kcyA9IFsuLi5ib3VuZGluZ0JveFswXSwgLi4uYm91bmRpbmdCb3hbMV1dO1xuICAgICAgcHJvcHMuZXh0ZW5zaW9ucyA9IFsuLi4ocHJvcHMuZXh0ZW5zaW9ucyB8fCBbXSksIG5ldyBDbGlwRXh0ZW5zaW9uKCldO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnByb3BzLnJlbmRlclN1YkxheWVycyhwcm9wcyk7XG4gIH1cblxuICBnZXRIaWdobGlnaHRlZE9iamVjdEluZGV4KHRpbGU6IF9UaWxlMkRIZWFkZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IHtob3ZlcmVkRmVhdHVyZUlkLCBob3ZlcmVkRmVhdHVyZUxheWVyTmFtZX0gPSB0aGlzLnN0YXRlO1xuICAgIGNvbnN0IHt1bmlxdWVJZFByb3BlcnR5LCBoaWdobGlnaHRlZEZlYXR1cmVJZH0gPSB0aGlzLnByb3BzO1xuICAgIGxldCBkYXRhID0gdGlsZS5jb250ZW50O1xuICAgIGRhdGEgPSBkYXRhPy5zaGFwZSA9PT0gJ2dlb2pzb24tdGFibGUnID8gZGF0YS5mZWF0dXJlcyA6IGRhdGE7XG5cbiAgICBjb25zdCBpc0hpZ2hsaWdodGVkID0gaXNGZWF0dXJlSWREZWZpbmVkKGhpZ2hsaWdodGVkRmVhdHVyZUlkKTtcbiAgICBjb25zdCBpc0ZlYXR1cmVJZFByZXNlbnQgPSBpc0ZlYXR1cmVJZERlZmluZWQoaG92ZXJlZEZlYXR1cmVJZCkgfHwgaXNIaWdobGlnaHRlZDtcblxuICAgIGlmICghaXNGZWF0dXJlSWRQcmVzZW50KSB7XG4gICAgICByZXR1cm4gLTE7XG4gICAgfVxuXG4gICAgY29uc3QgZmVhdHVyZUlkVG9IaWdobGlnaHQgPSBpc0hpZ2hsaWdodGVkID8gaGlnaGxpZ2h0ZWRGZWF0dXJlSWQgOiBob3ZlcmVkRmVhdHVyZUlkO1xuXG4gICAgLy8gSXRlcmFibGUgZGF0YVxuICAgIGlmIChBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgICByZXR1cm4gZGF0YS5maW5kSW5kZXgoZmVhdHVyZSA9PiB7XG4gICAgICAgIGNvbnN0IGlzTWF0Y2hpbmdJZCA9IGdldEZlYXR1cmVVbmlxdWVJZChmZWF0dXJlLCB1bmlxdWVJZFByb3BlcnR5KSA9PT0gZmVhdHVyZUlkVG9IaWdobGlnaHQ7XG4gICAgICAgIGNvbnN0IGlzTWF0Y2hpbmdMYXllciA9XG4gICAgICAgICAgaXNIaWdobGlnaHRlZCB8fCBnZXRGZWF0dXJlTGF5ZXJOYW1lKGZlYXR1cmUpID09PSBob3ZlcmVkRmVhdHVyZUxheWVyTmFtZTtcbiAgICAgICAgcmV0dXJuIGlzTWF0Y2hpbmdJZCAmJiBpc01hdGNoaW5nTGF5ZXI7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gLTE7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0RmVhdHVyZVVuaXF1ZUlkKGZlYXR1cmUsIHVuaXF1ZUlkUHJvcGVydHk6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICBpZiAoZmVhdHVyZS5wcm9wZXJ0aWVzICYmIHVuaXF1ZUlkUHJvcGVydHkpIHtcbiAgICByZXR1cm4gZmVhdHVyZS5wcm9wZXJ0aWVzW3VuaXF1ZUlkUHJvcGVydHldO1xuICB9XG5cbiAgaWYgKCdpZCcgaW4gZmVhdHVyZSkge1xuICAgIHJldHVybiBmZWF0dXJlLmlkO1xuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gZ2V0RmVhdHVyZUxheWVyTmFtZShmZWF0dXJlKTogc3RyaW5nIHwgbnVsbCB7XG4gIHJldHVybiBmZWF0dXJlLnByb3BlcnRpZXM/LmxheWVyTmFtZSB8fCBudWxsO1xufVxuXG5mdW5jdGlvbiBpc0ZlYXR1cmVJZERlZmluZWQodmFsdWU6IHVua25vd24pOiBib29sZWFuIHtcbiAgcmV0dXJuIHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09ICcnO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7QUFJQSxJQUFBQSxXQUFBLEdBQUFDLE9BQUE7QUFDQSxJQUFBQyxVQUFBLEdBQUFELE9BQUE7QUFTQSxJQUFBRSxlQUFBLEdBQUFGLE9BQUE7QUFBeUYsU0FBQUcsV0FBQUMsQ0FBQSxFQUFBQyxDQUFBLEVBQUFDLENBQUEsV0FBQUQsQ0FBQSxPQUFBRSxnQkFBQSxhQUFBRixDQUFBLE9BQUFHLDJCQUFBLGFBQUFKLENBQUEsRUFBQUsseUJBQUEsS0FBQUMsT0FBQSxDQUFBQyxTQUFBLENBQUFOLENBQUEsRUFBQUMsQ0FBQSxZQUFBQyxnQkFBQSxhQUFBSCxDQUFBLEVBQUFRLFdBQUEsSUFBQVAsQ0FBQSxDQUFBUSxLQUFBLENBQUFULENBQUEsRUFBQUUsQ0FBQTtBQUFBLFNBQUFHLDBCQUFBLGNBQUFMLENBQUEsSUFBQVUsT0FBQSxDQUFBQyxTQUFBLENBQUFDLE9BQUEsQ0FBQUMsSUFBQSxDQUFBUCxPQUFBLENBQUFDLFNBQUEsQ0FBQUcsT0FBQSxpQ0FBQVYsQ0FBQSxhQUFBSyx5QkFBQSxZQUFBQSwwQkFBQSxhQUFBTCxDQUFBLFVBZHpGO0FBQ0E7QUFlQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFBQSxJQUNhYyxRQUFRLEdBQUFDLE9BQUEsQ0FBQUQsUUFBQSwwQkFBQUUsVUFBQTtFQUFBLFNBQUFGLFNBQUE7SUFBQSxJ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