kepler.gl
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
102 lines (85 loc) • 12.8 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral"));
var _react = _interopRequireWildcard(require("react"));
var _d3Scale = require("d3-scale");
var _d3Array = require("d3-array");
var _styledComponents = _interopRequireDefault(require("styled-components"));
var _classnames = _interopRequireDefault(require("classnames"));
var _templateObject;
var histogramStyle = {
highlightW: 0.7,
unHighlightedW: 0.4
};
var HistogramWrapper = _styledComponents["default"].svg(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["\n overflow: visible;\n .histogram-bars {\n rect {\n fill: ", ";\n }\n rect.in-range {\n fill: ", ";\n }\n }\n"])), function (props) {
return props.theme.histogramFillOutRange;
}, function (props) {
return props.theme.histogramFillInRange;
});
function HistogramPlotFactory() {
var HistogramPlot = function HistogramPlot(_ref) {
var width = _ref.width,
height = _ref.height,
margin = _ref.margin,
isRanged = _ref.isRanged,
histogram = _ref.histogram,
value = _ref.value,
brushComponent = _ref.brushComponent;
var domain = (0, _react.useMemo)(function () {
return [histogram[0].x0, histogram[histogram.length - 1].x1];
}, [histogram]);
var dataId = Object.keys(histogram[0]).filter(function (k) {
return k !== 'x0' && k !== 'x1';
})[0]; // use 1st for now
var getValue = (0, _react.useMemo)(function () {
return function (d) {
return d[dataId];
};
}, [dataId]);
var x = (0, _react.useMemo)(function () {
return (0, _d3Scale.scaleLinear)().domain(domain).range([0, width]);
}, [domain, width]);
var y = (0, _react.useMemo)(function () {
return (0, _d3Scale.scaleLinear)().domain([0, Number((0, _d3Array.max)(histogram, getValue))]).range([0, height]);
}, [histogram, height, getValue]);
var barWidth = width / histogram.length;
return /*#__PURE__*/_react["default"].createElement(HistogramWrapper, {
width: width,
height: height,
style: {
marginTop: "".concat(margin.top, "px")
}
}, /*#__PURE__*/_react["default"].createElement("g", {
className: "histogram-bars"
}, histogram.map(function (bar) {
var inRange = bar.x1 <= value[1] && bar.x0 >= value[0];
var wRatio = inRange ? histogramStyle.highlightW : histogramStyle.unHighlightedW;
return /*#__PURE__*/_react["default"].createElement("rect", {
className: (0, _classnames["default"])({
'in-range': inRange
}),
key: bar.x0,
height: y(getValue(bar)),
width: barWidth * wRatio,
x: x(bar.x0) + barWidth * (1 - wRatio) / 2,
rx: 1,
ry: 1,
y: height - y(getValue(bar))
});
})), /*#__PURE__*/_react["default"].createElement("g", {
transform: "translate(".concat(isRanged ? 0 : barWidth / 2, ", 0)")
}, brushComponent));
};
var EmpptyOrPlot = function EmpptyOrPlot(props) {
return !props.histogram || !props.histogram.length ? null : /*#__PURE__*/_react["default"].createElement(HistogramPlot, props);
};
return EmpptyOrPlot;
}
var _default = HistogramPlotFactory;
exports["default"] = _default;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL2NvbW1vbi9oaXN0b2dyYW0tcGxvdC5qcyJdLCJuYW1lcyI6WyJoaXN0b2dyYW1TdHlsZSIsImhpZ2hsaWdodFciLCJ1bkhpZ2hsaWdodGVkVyIsIkhpc3RvZ3JhbVdyYXBwZXIiLCJzdHlsZWQiLCJzdmciLCJwcm9wcyIsInRoZW1lIiwiaGlzdG9ncmFtRmlsbE91dFJhbmdlIiwiaGlzdG9ncmFtRmlsbEluUmFuZ2UiLCJIaXN0b2dyYW1QbG90RmFjdG9yeSIsIkhpc3RvZ3JhbVBsb3QiLCJ3aWR0aCIsImhlaWdodCIsIm1hcmdpbiIsImlzUmFuZ2VkIiwiaGlzdG9ncmFtIiwidmFsdWUiLCJicnVzaENvbXBvbmVudCIsImRvbWFpbiIsIngwIiwibGVuZ3RoIiwieDEiLCJkYXRhSWQiLCJPYmplY3QiLCJrZXlzIiwiZmlsdGVyIiwiayIsImdldFZhbHVlIiwiZCIsIngiLCJyYW5nZSIsInkiLCJOdW1iZXIiLCJiYXJXaWR0aCIsIm1hcmdpblRvcCIsInRvcCIsIm1hcCIsImJhciIsImluUmFuZ2UiLCJ3UmF0aW8iLCJFbXBwdHlPclBsb3QiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7QUFvQkE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7Ozs7QUFFQSxJQUFNQSxjQUFjLEdBQUc7QUFDckJDLEVBQUFBLFVBQVUsRUFBRSxHQURTO0FBRXJCQyxFQUFBQSxjQUFjLEVBQUU7QUFGSyxDQUF2Qjs7QUFLQSxJQUFNQyxnQkFBZ0IsR0FBR0MsNkJBQU9DLEdBQVYsOE5BSVIsVUFBQUMsS0FBSztBQUFBLFNBQUlBLEtBQUssQ0FBQ0MsS0FBTixDQUFZQyxxQkFBaEI7QUFBQSxDQUpHLEVBT1IsVUFBQUYsS0FBSztBQUFBLFNBQUlBLEtBQUssQ0FBQ0MsS0FBTixDQUFZRSxvQkFBaEI7QUFBQSxDQVBHLENBQXRCOztBQVlBLFNBQVNDLG9CQUFULEdBQWdDO0FBQzlCLE1BQU1DLGFBQWEsR0FBRyxTQUFoQkEsYUFBZ0Is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QyxDQUFDUSxHQUFHLENBQUNsQixFQUFMLENBQUQsR0FBYWMsUUFBUSxJQUFJLElBQUlNLE1BQVIsQ0FBVCxHQUE0QixDQUw3QztBQU1FLFFBQUEsRUFBRSxFQUFFLENBTk47QUFPRSxRQUFBLEVBQUUsRUFBRSxDQVBOO0FBUUUsUUFBQSxDQUFDLEVBQUUzQixNQUFNLEdBQUdtQixDQUFDLENBQUNKLFFBQVEsQ0FBQ1UsR0FBRCxDQUFUO0FBUmYsUUFERjtBQVlELEtBZkEsQ0FESCxDQURGLGVBbUJFO0FBQUcsTUFBQSxTQUFTLHNCQUFldkIsUUFBUSxHQUFHLENBQUgsR0FBT21CLFFBQVEsR0FBRyxDQUF6QztBQUFaLE9BQStEaEIsY0FBL0QsQ0FuQkYsQ0FERjtBQXVCRCxHQWxERDs7QUFvREEsTUFBTXVCLFlBQVksR0FBRyxTQUFmQSxZQUFlLENBQUFuQyxLQUFLO0FBQUEsV0FDeEIsQ0FBQ0EsS0FBSyxDQUFDVSxTQUFQLElBQW9CLENBQUNWLEtBQUssQ0FBQ1UsU0FBTixDQUFnQkssTUFBckMsR0FBOEMsSUFBOUMsZ0JBQXFELGdDQUFDLGFBQUQsRUFBbUJmLEtBQW5CLENBRDdCO0FBQUEsR0FBMUI7O0FBR0EsU0FBT21DLFlBQVA7QUFDRDs7ZUFDYy9CLG9CIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSAyMDIxIFViZXIgVGVjaG5vbG9naWVzLCBJbmMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuLy8gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuLy8gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuLy8gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vIFRIRSBTT0ZUV0FSRS5cblxuaW1wb3J0IFJlYWN0LCB7dXNlTWVtb30gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHtzY2FsZUxpbmVhcn0gZnJvbSAnZDMtc2NhbGUnO1xuaW1wb3J0IHttYXh9IGZyb20gJ2QzLWFycmF5JztcbmltcG9ydCBzdHlsZWQgZnJvbSAnc3R5bGVkLWNvbXBvbmVudHMnO1xuaW1wb3J0IGNsYXNzbmFtZXMgZnJvbSAnY2xhc3NuYW1lcyc7XG5cbmNvbnN0IGhpc3RvZ3JhbVN0eWxlID0ge1xuICBoaWdobGlnaHRXOiAwLjcsXG4gIHVuSGlnaGxpZ2h0ZWRXOiAwLjRcbn07XG5cbmNvbnN0IEhpc3RvZ3JhbVdyYXBwZXIgPSBzdHlsZWQuc3ZnYFxuICBvdmVyZmxvdzogdmlzaWJsZTtcbiAgLmhpc3RvZ3JhbS1iYXJzIHtcbiAgICByZWN0IHtcbiAgICAgIGZpbGw6ICR7cHJvcHMgPT4gcHJvcHMudGhlbWUuaGlzdG9ncmFtRmlsbE91dFJhbmdlfTtcbiAgICB9XG4gICAgcmVjdC5pbi1yYW5nZSB7XG4gICAgICBmaWxsOiAke3Byb3BzID0+IHByb3BzLnRoZW1lLmhpc3RvZ3JhbUZpbGxJblJhbmdlfTtcbiAgICB9XG4gIH1cbmA7XG5cbmZ1bmN0aW9uIEhpc3RvZ3JhbVBsb3RGYWN0b3J5KCkge1xuICBjb25zdCBIaXN0b2dyYW1QbG90ID0gKHt3aWR0aCwgaGVpZ2h0LCBtYXJnaW4sIGlzUmFuZ2VkLCBoaXN0b2dyYW0sIHZhbHVlLCBicnVzaENvbXBvbmVudH0pID0+IHtcbiAgICBjb25zdCBkb21haW4gPSB1c2VNZW1vKCgpID0+IFtoaXN0b2dyYW1bMF0ueDAsIGhpc3RvZ3JhbVtoaXN0b2dyYW0ubGVuZ3RoIC0gMV0ueDFdLCBbXG4gICAgICBoaXN0b2dyYW1cbiAgICBdKTtcbiAgICBjb25zdCBkYXRhSWQgPSBPYmplY3Qua2V5cyhoaXN0b2dyYW1bMF0pLmZpbHRlcihrID0+IGsgIT09ICd4MCcgJiYgayAhPT0gJ3gxJylbMF07XG5cbiAgICAvLyB1c2UgMXN0IGZvciBub3dcbiAgICBjb25zdCBnZXRWYWx1ZSA9IHVzZU1lbW8oKCkgPT4gZCA9PiBkW2RhdGFJZF0sIFtkYXRhSWRdKTtcblxuICAgIGNvbnN0IHggPSB1c2VNZW1vKFxuICAgICAgKCkgPT5cbiAgICAgICAgc2NhbGVMaW5lYXIoKVxuICAgICAgICAgIC5kb21haW4oZG9tYWluKVxuICAgICAgICAgIC5yYW5nZShbMCwgd2lkdGhdKSxcbiAgICAgIFtkb21haW4sIHdpZHRoXVxuICAgICk7XG5cbiAgICBjb25zdCB5ID0gdXNlTWVtbyhcbiAgICAgICgpID0+XG4gICAgICAgIHNjYWxlTGluZWFyKClcbiAgICAgICAgICAuZG9tYWluKFswLCBOdW1iZXIobWF4KGhpc3RvZ3JhbSwgZ2V0VmFsdWUpKV0pXG4gICAgICAgICAgLnJhbmdlKFswLCBoZWlnaHRdKSxcbiAgICAgIFtoaXN0b2dyYW0sIGhlaWdodCwgZ2V0VmFsdWVdXG4gICAgKTtcblxuICAgIGNvbnN0IGJhcldpZHRoID0gd2lkdGggLyBoaXN0b2dyYW0ubGVuZ3RoO1xuXG4gICAgcmV0dXJuIChcbiAgICAgIDxIaXN0b2dyYW1XcmFwcGVyIHdpZHRoPXt3aWR0aH0gaGVpZ2h0PXtoZWlnaHR9IHN0eWxlPXt7bWFyZ2luVG9wOiBgJHttYXJnaW4udG9wfXB4YH19PlxuICAgICAgICA8ZyBjbGFzc05hbWU9XCJoaXN0b2dyYW0tYmFyc1wiPlxuICAgICAgICAgIHtoaXN0b2dyYW0ubWFwKGJhciA9PiB7XG4gICAgICAgICAgICBjb25zdCBpblJhbmdlID0gYmFyLngxIDw9IHZhbHVlWzFdICYmIGJhci54MCA+PSB2YWx1ZVswXTtcbiAgICAgICAgICAgIGNvbnN0IHdSYXRpbyA9IGluUmFuZ2UgPyBoaXN0b2dyYW1TdHlsZS5oaWdobGlnaHRXIDogaGlzdG9ncmFtU3R5bGUudW5IaWdobGlnaHRlZFc7XG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICA8cmVjdFxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17Y2xhc3NuYW1lcyh7J2luLXJhbmdlJzogaW5SYW5nZX0pfVxuICAgICAgICAgICAgICAgIGtleT17YmFyLngwfVxuICAgICAgICAgICAgICAgIGhlaWdodD17eShnZXRWYWx1ZShiYXIpKX1cbiAgICAgICAgICAgICAgICB3aWR0aD17YmFyV2lkdGggKiB3UmF0aW99XG4gICAgICAgICAgICAgICAgeD17eChiYXIueDApICsgKGJhcldpZHRoICogKDEgLSB3UmF0aW8pKSAvIDJ9XG4gICAgICAgICAgICAgICAgcng9ezF9XG4gICAgICAgICAgICAgICAgcnk9ezF9XG4gICAgICAgICAgICAgICAgeT17aGVpZ2h0IC0geShnZXRWYWx1ZShiYXIpKX1cbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSl9XG4gICAgICAgIDwvZz5cbiAgICAgICAgPGcgdHJhbnNmb3JtPXtgdHJhbnNsYXRlKCR7aXNSYW5nZWQgPyAwIDogYmFyV2lkdGggLyAyfSwgMClgfT57YnJ1c2hDb21wb25lbnR9PC9nPlxuICAgICAgPC9IaXN0b2dyYW1XcmFwcGVyPlxuICAgICk7XG4gIH07XG5cbiAgY29uc3QgRW1wcHR5T3JQbG90ID0gcHJvcHMgPT5cbiAgICAhcHJvcHMuaGlzdG9ncmFtIHx8ICFwcm9wcy5oaXN0b2dyYW0ubGVuZ3RoID8gbnVsbCA6IDxIaXN0b2dyYW1QbG90IHsuLi5wcm9wc30gLz47XG5cbiAgcmV0dXJuIEVtcHB0eU9yUGxvdDtcbn1cbmV4cG9ydCBkZWZhdWx0IEhpc3RvZ3JhbVBsb3RGYWN0b3J5O1xuIl19