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
JavaScript
;
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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