kepler.gl.geoiq
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
127 lines (107 loc) • 13.5 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 _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
var _arcLayer = _interopRequireDefault(require("../arc-layer/arc-layer"));
var _lineLayer = _interopRequireDefault(require("../../deckgl-layers/line-layer/line-layer"));
var _lineLayerIcon = _interopRequireDefault(require("./line-layer-icon"));
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
var LineLayer =
/*#__PURE__*/
function (_ArcLayer) {
(0, _inherits2["default"])(LineLayer, _ArcLayer);
function LineLayer() {
(0, _classCallCheck2["default"])(this, LineLayer);
return (0, _possibleConstructorReturn2["default"])(this, (0, _getPrototypeOf2["default"])(LineLayer).apply(this, arguments));
}
(0, _createClass2["default"])(LineLayer, [{
key: "renderLayer",
value: function renderLayer(_ref) {
var data = _ref.data,
idx = _ref.idx,
layerInteraction = _ref.layerInteraction,
objectHovered = _ref.objectHovered,
mapState = _ref.mapState,
interactionConfig = _ref.interactionConfig;
var brush = interactionConfig.brush;
var colorUpdateTriggers = {
color: this.config.color,
colorField: this.config.colorField,
colorRange: this.config.visConfig.colorRange,
colorScale: this.config.colorScale,
targetColor: this.config.visConfig.targetColor
};
var interaction = {
// auto highlighting
pickable: true,
autoHighlight: !brush.enabled,
highlightColor: this.config.highlightColor,
// brushing
brushRadius: brush.config.size * 1000,
brushSource: true,
brushTarget: true,
enableBrushing: brush.enabled
};
return [// base layer
new _lineLayer["default"](_objectSpread({}, layerInteraction, {}, data, {}, interaction, {
getColor: data.getSourceColor,
id: this.id,
idx: idx,
fp64: this.config.visConfig['hi-precision'],
opacity: this.config.visConfig.opacity,
strokeScale: this.config.visConfig.thickness,
// parameters
parameters: {
depthTest: mapState.dragRotate
},
updateTriggers: {
getStrokeWidth: {
sizeField: this.config.sizeField,
sizeRange: this.config.visConfig.sizeRange
},
getColor: colorUpdateTriggers,
getTargetColor: colorUpdateTriggers
}
}))];
}
}, {
key: "type",
get: function get() {
return 'line';
}
}, {
key: "layerIcon",
get: function get() {
return _lineLayerIcon["default"];
}
}], [{
key: "findDefaultLayerProps",
value: function findDefaultLayerProps(_ref2) {
var fieldPairs = _ref2.fieldPairs;
if (fieldPairs.length < 2) {
return [];
}
var props = {}; // connect the first two point layer with arc
props.columns = {
lat0: fieldPairs[0].pair.lat,
lng0: fieldPairs[0].pair.lng,
lat1: fieldPairs[1].pair.lat,
lng1: fieldPairs[1].pair.lng
};
props.label = "".concat(fieldPairs[0].defaultName, " -> ").concat(fieldPairs[1].defaultName, " line");
return props;
}
}]);
return LineLayer;
}(_arcLayer["default"]);
exports["default"] = LineLayer;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9sYXllcnMvbGluZS1sYXllci9saW5lLWxheWVyLmpzIl0sIm5hbWVzIjpbIkxpbmVMYXllciIsImRhdGEiLCJpZHgiLCJsYXllckludGVyYWN0aW9uIiwib2JqZWN0SG92ZXJlZCIsIm1hcFN0YXRlIiwiaW50ZXJhY3Rpb25Db25maWciLCJicnVzaCIsImNvbG9yVXBkYXRlVHJpZ2dlcnMiLCJjb2xvciIsImNvbmZpZyIsImNvbG9yRmllbGQiLCJjb2xvclJhbmdlIiwidmlzQ29uZmlnIiwiY29sb3JTY2FsZSIsInRhcmdldENvbG9yIiwiaW50ZXJhY3Rpb24iLCJwaWNrYWJsZSIsImF1dG9IaWdobGlnaHQiLCJlbmFibGVkIiwiaGlnaGxpZ2h0Q29sb3IiLCJicnVzaFJhZGl1cyIsInNpemUiLCJicnVzaFNvdXJjZSIsImJydXNoVGFyZ2V0IiwiZW5hYmxlQnJ1c2hpbmciLCJEZWNrR0xMaW5lTGF5ZXIiLCJnZXRDb2xvciIsImdldFNvdXJjZUNvbG9yIiwiaWQiLCJmcDY0Iiwib3BhY2l0eSIsInN0cm9rZVNjYWxlIiwidGhpY2tuZXNzIiwicGFyYW1ldGVycyIsImRlcHRoVGVzdCIsImRyYWdSb3RhdGUiLCJ1cGRhdGVUcmlnZ2VycyIsImdldFN0cm9rZVdpZHRoIiwic2l6ZUZpZWxkIiwic2l6ZVJhbmdlIiwiZ2V0VGFyZ2V0Q29sb3IiLCJMaW5lTGF5ZXJJY29uIiwiZmllbGRQYWlycyIsImxlbmd0aCIsInByb3BzIiwiY29sdW1ucyIsImxhdDAiLCJwYWlyIiwibGF0IiwibG5nMCIsImxuZyIsImxhdDEiLCJsbmcxIiwibGFiZWwiLCJkZWZhdWx0TmFtZSIsIkFyY0xheWVyIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFvQkE7O0FBQ0E7O0FBQ0E7Ozs7OztJQUVxQkEsUzs7Ozs7Ozs7Ozs7O3NDQW9DaEI7QUFBQSxVQU5EQyxJQU1DLFFBTkRBLElBTUM7QUFBQSxVQUxEQyxHQUtDLFFBTERBLEdBS0M7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VUFBVSxDQUFDLENBQUQsQ0FBVixDQUFjSyxJQUFkLENBQW1CQyxHQUhYO0FBSWRJLFFBQUFBLElBQUksRUFBRVYsVUFBVSxDQUFDLENBQUQsQ0FBVixDQUFjSyxJQUFkLENBQW1CRztBQUpYLE9BQWhCO0FBTUFOLE1BQUFBLEtBQUssQ0FBQ1MsS0FBTixhQUFpQlgsVUFBVSxDQUFDLENBQUQsQ0FBVixDQUFjWSxXQUEvQixpQkFDRVosVUFBVSxDQUFDLENBQUQsQ0FBVixDQUFjWSxXQURoQjtBQUlBLGFBQU9WLEtBQVA7QUFDRDs7O0VBM0JvQ1csb0IiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgKGMpIDIwMTkgVWJlciBUZWNobm9sb2dpZXMsIEluYy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4vLyBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4vLyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4vLyBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4vLyBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4vLyBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuLy8gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuLy8gVEhFIFNPRlRXQVJFLlxuXG5pbXBvcnQgQXJjTGF5ZXIgZnJvbSAnLi4vYXJjLWxheWVyL2FyYy1sYXllcic7XG5pbXBvcnQgRGVja0dMTGluZUxheWVyIGZyb20gJ2RlY2tnbC1sYXllcnMvbGluZS1sYXllci9saW5lLWxheWVyJztcbmltcG9ydCBMaW5lTGF5ZXJJY29uIGZyb20gJy4vbGluZS1sYXllci1pY29uJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTGluZUxheWVyIGV4dGVuZHMgQXJjTGF5ZXIge1xuICBnZXQgdHlwZSgpIHtcbiAgICByZXR1cm4gJ2xpbmUnO1xuICB9XG5cbiAgZ2V0IGxheWVySWNvbigpIHtcbiAgICByZXR1cm4gTGluZUxheWVySWNvbjtcbiAgfVxuXG4gIHN0YXRpYyBmaW5kRGVmYXVsdExheWVyUHJvcHMoe2ZpZWxkUGFpcnN9KSB7XG4gICAgaWYgKGZpZWxkUGFpcnMubGVuZ3RoIDwgMikge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICBjb25zdCBwcm9wcyA9IHt9O1xuXG4gICAgLy8gY29ubmVjdCB0aGUgZmlyc3QgdHdvIHBvaW50IGxheWVyIHdpdGggYXJjXG4gICAgcHJvcHMuY29sdW1ucyA9IHtcbiAgICAgIGxhdDA6IGZpZWxkUGFpcnNbMF0ucGFpci5sYXQsXG4gICAgICBsbmcwOiBmaWVsZFBhaXJzWzBdLnBhaXIubG5nLFxuICAgICAgbGF0MTogZmllbGRQYWlyc1sxXS5wYWlyLmxhdCxcbiAgICAgIGxuZzE6IGZpZWxkUGFpcnNbMV0ucGFpci5sbmdcbiAgICB9O1xuICAgIHByb3BzLmxhYmVsID0gYCR7ZmllbGRQYWlyc1swXS5kZWZhdWx0TmFtZX0gLT4gJHtcbiAgICAgIGZpZWxkUGFpcnNbMV0uZGVmYXVsdE5hbWVcbiAgICAgIH0gbGluZWA7XG5cbiAgICByZXR1cm4gcHJvcHM7XG4gIH1cblxuICByZW5kZXJMYXllcih7XG4gICAgZGF0YSxcbiAgICBpZHgsXG4gICAgbGF5ZXJJbnRlcmFjdGlvbixcbiAgICBvYmplY3RIb3ZlcmVkLFxuICAgIG1hcFN0YXRlLFxuICAgIGludGVyYWN0aW9uQ29uZmlnXG4gIH0pIHtcbiAgICBjb25zdCB7YnJ1c2h9ID0gaW50ZXJhY3Rpb25Db25maWc7XG5cbiAgICBjb25zdCBjb2xvclVwZGF0ZVRyaWdnZXJzID0ge1xuICAgICAgY29sb3I6IHRoaXMuY29uZmlnLmNvbG9yLFxuICAgICAgY29sb3JGaWVsZDogdGhpcy5jb25maWcuY29sb3JGaWVsZCxcbiAgICAgIGNvbG9yUmFuZ2U6IHRoaXMuY29uZmlnLnZpc0NvbmZpZy5jb2xvclJhbmdlLFxuICAgICAgY29sb3JTY2FsZTogdGhpcy5jb25maWcuY29sb3JTY2FsZSxcbiAgICAgIHRhcmdldENvbG9yOiB0aGlzLmNvbmZpZy52aXNDb25maWcudGFyZ2V0Q29sb3JcbiAgICB9O1xuXG4gICAgY29uc3QgaW50ZXJhY3Rpb24gPSB7XG4gICAgICAvLyBhdXRvIGhpZ2hsaWdodGluZ1xuICAgICAgcGlja2FibGU6IHRydWUsXG4gICAgICBhdXRvSGlnaGxpZ2h0OiAhYnJ1c2guZW5hYmxlZCxcbiAgICAgIGhpZ2hsaWdodENvbG9yOiB0aGlzLmNvbmZpZy5oaWdobGlnaHRDb2xvcixcblxuICAgICAgLy8gYnJ1c2hpbmdcbiAgICAgIGJydXNoUmFkaXVzOiBicnVzaC5jb25maWcuc2l6ZSAqIDEwMDAsXG4gICAgICBicnVzaFNvdXJjZTogdHJ1ZSxcbiAgICAgIGJydXNoVGFyZ2V0OiB0cnVlLFxuICAgICAgZW5hYmxlQnJ1c2hpbmc6IGJydXNoLmVuYWJsZWRcbiAgICB9O1xuXG4gICAgcmV0dXJuIFtcbiAgICAgIC8vIGJhc2UgbGF5ZXJcbiAgICAgIG5ldyBEZWNrR0xMaW5lTGF5ZXIoe1xuICAgICAgICAuLi5sYXllckludGVyYWN0aW9uLFxuICAgICAgICAuLi5kYXRhLFxuICAgICAgICAuLi5pbnRlcmFjdGlvbixcbiAgICAgICAgZ2V0Q29sb3I6IGRhdGEuZ2V0U291cmNlQ29sb3IsXG4gICAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgICBpZHgsXG4gICAgICAgIGZwNjQ6IHRoaXMuY29uZmlnLnZpc0NvbmZpZ1snaGktcHJlY2lzaW9uJ10sXG4gICAgICAgIG9wYWNpdHk6IHRoaXMuY29uZmlnLnZpc0NvbmZpZy5vcGFjaXR5LFxuICAgICAgICBzdHJva2VTY2FsZTogdGhpcy5jb25maWcudmlzQ29uZmlnLnRoaWNrbmVzcyxcbiAgICAgICAgLy8gcGFyYW1ldGVyc1xuICAgICAgICBwYXJhbWV0ZXJzOiB7ZGVwdGhUZXN0OiBtYXBTdGF0ZS5kcmFnUm90YXRlfSxcbiAgICAgICAgdXBkYXRlVHJpZ2dlcnM6IHtcbiAgICAgICAgICBnZXRTdHJva2VXaWR0aDoge1xuICAgICAgICAgICAgc2l6ZUZpZWxkOiB0aGlzLmNvbmZpZy5zaXplRmllbGQsXG4gICAgICAgICAgICBzaXplUmFuZ2U6IHRoaXMuY29uZmlnLnZpc0NvbmZpZy5zaXplUmFuZ2VcbiAgICAgICAgICB9LFxuICAgICAgICAgIGdldENvbG9yOiBjb2xvclVwZGF0ZVRyaWdnZXJzLFxuICAgICAgICAgIGdldFRhcmdldENvbG9yOiBjb2xvclVwZGF0ZVRyaWdnZXJzXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgXTtcbiAgfVxufVxuIl19