UNPKG

kepler.gl.geoiq

Version:

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

125 lines (104 loc) 16.4 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.getBinColorDomain = getBinColorDomain; exports.getColorScaleFunction = getColorScaleFunction; exports.getColorValueDomain = getColorValueDomain; exports.getElevationScaleFunction = getElevationScaleFunction; exports.getRadiusScaleFunction = getRadiusScaleFunction; exports.getScaleFunctor = getScaleFunctor; exports.needReCalculateScaleFunction = needReCalculateScaleFunction; exports.needsRecalculateColorDomain = needsRecalculateColorDomain; exports.needsRecalculateRadiusRange = needsRecalculateRadiusRange; var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); var _dataUtils = require("../../utils/data-utils"); var _defaultSettings = require("../../constants/default-settings"); // Copyright (c) 2023 Uber Technologies, Inc. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // Enable render color by customized color Scale function getBinColorDomain(scaleType, bins, _ref) { var _ref2 = (0, _slicedToArray2["default"])(_ref, 2), lowerIdx = _ref2[0], upperIdx = _ref2[1]; switch (scaleType) { case _defaultSettings.SCALE_TYPES.quantize: return [bins[lowerIdx].value, bins[upperIdx].value]; case _defaultSettings.SCALE_TYPES.quantile: return bins.slice(lowerIdx, upperIdx + 1).map(function (d) { return d.value; }); case _defaultSettings.SCALE_TYPES.ordinal: return (0, _dataUtils.unique)(bins.map(function (b) { return b.value; })).sort(); default: return [bins[lowerIdx].value, bins[upperIdx].value]; } } function getScaleFunctor(scaleType) { return _defaultSettings.SCALE_FUNC[scaleType] || _defaultSettings.SCALE_FUNC.quantile; } function getColorValueDomain(layer) { var _layer$props = layer.props, lowerPercentile = _layer$props.lowerPercentile, upperPercentile = _layer$props.upperPercentile, colorScale = _layer$props.colorScale; var sortedBins = layer.state.sortedColorBins.sortedBins; var len = sortedBins.length; if (!len) { // err... what do we do layer.state.colorValueDomain = null; } else { var lowerIdx = Math.ceil(lowerPercentile / 100 * (len - 1)); var upperIdx = Math.floor(upperPercentile / 100 * (len - 1)); // calculate valueDomain based on layer.state.colorValueDomain = getBinColorDomain(colorScale, sortedBins, [lowerIdx, upperIdx]); layer.getColorScale(); } layer.props.onSetColorDomain(layer.state.colorValueDomain); } function getColorScaleFunction(layer) { var _layer$props2 = layer.props, colorScale = _layer$props2.colorScale, colorDomain = _layer$props2.colorDomain; layer.state.colorScaleFunc = getScaleFunctor(colorScale)().domain(colorDomain || layer.state.colorDomain || layer.state.colorValueDomain).range(layer.props.colorRange); } function getElevationScaleFunction(layer) { var elevationRange = layer.props.elevationRange; var elevationDomain = layer.props.elevationDomain || layer.state.elevationValueDomain; layer.state.elevationScaleFunc = getScaleFunctor(layer.props.sizeScale)().domain(elevationDomain).range(elevationRange); } function getRadiusScaleFunction(layer) { var viewport = layer.context.viewport; layer.state.radiusScaleFunc = _defaultSettings.SCALE_FUNC.sqrt().domain(layer.state.radiusDomain).range(layer.props.radiusRange.map(function (d) { return d * viewport.distanceScales.metersPerPixel[0]; })); } function needsRecalculateColorDomain(oldProps, props) { return oldProps.lowerPercentile !== props.lowerPercentile || oldProps.upperPercentile !== props.upperPercentile || oldProps.colorScale !== props.colorScale; } function needReCalculateScaleFunction(oldProps, props) { return oldProps.colorRange !== props.colorRange; } function needsRecalculateRadiusRange(oldProps, props) { return oldProps.radiusRange !== props.radiusRange && (oldProps.radiusRange[0] !== props.radiusRange[0] || oldProps.radiusRange[1] !== props.radiusRange[1]); } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9kZWNrZ2wtbGF5ZXJzL2xheWVyLXV0aWxzL3V0aWxzLmpzIl0sIm5hbWVzIjpbImdldEJpbkNvbG9yRG9tYWluIiwic2NhbGVUeXBlIiwiYmlucyIsImxvd2VySWR4IiwidXBwZXJJZHgiLCJTQ0FMRV9UWVBFUyIsInF1YW50aXplIiwidmFsdWUiLCJxdWFudGlsZSIsInNsaWNlIiwibWFwIiwiZCIsIm9yZGluYWwiLCJiIiwic29ydCIsImdldFNjYWxlRnVuY3RvciIsIlNDQUxFX0ZVTkMiLCJnZXRDb2xvclZhbHVlRG9tYWluIiwibGF5ZXIiLCJwcm9wcyIsImxvd2VyUGVyY2VudGlsZSIsInVwcGVyUGVyY2VudGlsZSIsImNvbG9yU2NhbGUiLCJzb3J0ZWRCaW5zIiwic3RhdGUiLCJzb3J0ZWRDb2xvckJpbnMiLCJsZW4iLCJsZW5ndGgiLCJjb2xvclZhbHVlRG9tYWluIiwiTWF0aCIsImNlaWwiLCJmbG9vciIsImdldENvbG9yU2NhbGUiLCJvblNldENvbG9yRG9tYWluIiwiZ2V0Q29sb3JTY2FsZUZ1bmN0aW9uIiwiY29sb3JEb21haW4iLCJjb2xvclNjYWxlRnVuYyIsImRvbWFpbiIsInJhbmdlIiwiY29sb3JSYW5nZSIsImdldEVsZXZhdGlvblNjYWxlRnVuY3Rpb24iLCJlbGV2YXRpb25SYW5nZSIsImVsZXZhdGlvbkRvbWFpbiIsImVsZXZhdGlvblZhbHVlRG9tYWluIiwiZWxldmF0aW9uU2NhbGVGdW5jIiwic2l6ZVNjYWxlIiwiZ2V0UmFkaXVzU2NhbGVGdW5jdGlvbiIsInZpZXdwb3J0IiwiY29udGV4dCIsInJhZGl1c1NjYWxlRnVuYyIsInNxcnQiLCJyYWRpdXNEb21haW4iLCJyYWRpdXNSYW5nZSIsImRpc3RhbmNlU2NhbGVzIiwibWV0ZXJzUGVyUGl4ZWwiLCJuZWVkc1JlY2FsY3VsYXRlQ29sb3JEb21haW4iLCJvbGRQcm9wcyIsIm5lZWRSZUNhbGN1bGF0ZVNjYWxlRnVuY3Rpb24iLCJuZWVkc1JlY2FsY3Vs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eEIsQ0FBdUMsQ0FBdkMsQ0FBUjtBQUFBLEdBREgsQ0FIMEIsQ0FBOUI7QUFPRDs7QUFFTSxTQUFTQywyQkFBVCxDQUFxQ0MsUUFBckMsRUFBK0NyQyxLQUEvQyxFQUFzRDtBQUMzRCxTQUNFcUMsUUFBUSxDQUFDcEMsZUFBVCxLQUE2QkQsS0FBSyxDQUFDQyxlQUFuQyxJQUNBb0MsUUFBUSxDQUFDbkMsZUFBVCxLQUE2QkYsS0FBSyxDQUFDRSxlQURuQyxJQUVBbUMsUUFBUSxDQUFDbEMsVUFBVCxLQUF3QkgsS0FBSyxDQUFDRyxVQUhoQztBQUtEOztBQUVNLFNBQVNtQyw0QkFBVCxDQUFzQ0QsUUFBdEMsRUFBZ0RyQyxLQUFoRCxFQUF1RDtBQUM1RCxTQUFPcUMsUUFBUSxDQUFDakIsVUFBVCxLQUF3QnBCLEtBQUssQ0FBQ29CLFVBQXJDO0FBQ0Q7O0FBRU0sU0FBU21CLDJCQUFULENBQXFDRixRQUFyQyxFQUErQ3JDLEtBQS9DLEVBQXNEO0FBQzNELFNBQ0VxQyxRQUFRLENBQUNKLFdBQVQsS0FBeUJqQyxLQUFLLENBQUNpQyxXQUEvQixLQUNDSSxRQUFRLENBQUNKLFdBQVQsQ0FBcUIsQ0FBckIsTUFBNEJqQyxLQUFLLENBQUNpQyxXQUFOLENBQWtCLENBQWxCLENBQTVCLElBQ0NJLFFBQVEsQ0FBQ0osV0FBVCxDQUFxQixDQUFyQixNQUE0QmpDLEtBQUssQ0FBQ2lDLFdBQU4sQ0FBa0IsQ0FBbEIsQ0FGOUIsQ0FERjtBQUtEIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSAyMDIzIFViZXIgVGVjaG5vbG9naWVzLCBJbmMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuLy8gaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuLy8gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuLy8gY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vIFRIRSBTT0ZUV0FSRS5cblxuaW1wb3J0IHt1bmlxdWV9IGZyb20gJ3V0aWxzL2RhdGEtdXRpbHMnO1xuXG5pbXBvcnQge1NDQUxFX1RZUEVTLCBTQ0FMRV9GVU5DfSBmcm9tICdjb25zdGFudHMvZGVmYXVsdC1zZXR0aW5ncyc7XG5cbi8vIEVuYWJsZSByZW5kZXIgY29sb3IgYnkgY3VzdG9taXplZCBjb2xvciBTY2FsZVxuZXhwb3J0IGZ1bmN0aW9uIGdldEJpbkNvbG9yRG9tYWluKHNjYWxlVHlwZSwgYmlucywgW2xvd2VySWR4LCB1cHBlcklkeF0pIHtcbiAgc3dpdGNoIChzY2FsZVR5cGUpIHtcbiAgICBjYXNlIFNDQUxFX1RZUEVTLnF1YW50aXplOlxuICAgICAgcmV0dXJuIFtiaW5zW2xvd2VySWR4XS52YWx1ZSwgYmluc1t1cHBlcklkeF0udmFsdWVdO1xuXG4gICAgY2FzZSBTQ0FMRV9UWVBFUy5xdWFudGlsZTpcbiAgICAgIHJldHVybiBiaW5zLnNsaWNlKGxvd2VySWR4LCB1cHBlcklkeCArIDEpLm1hcChkID0+IGQudmFsdWUpO1xuICAgIGNhc2UgU0NBTEVfVFlQRVMub3JkaW5hbDpcbiAgICAgIHJldHVybiB1bmlxdWUoYmlucy5tYXAoYiA9PiBiLnZhbHVlKSkuc29ydCgpO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gW2JpbnNbbG93ZXJJZHhdLnZhbHVlLCBiaW5zW3VwcGVySWR4XS52YWx1ZV07XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNjYWxlRnVuY3RvcihzY2FsZVR5cGUpIHtcbiAgcmV0dXJuIFNDQUxFX0ZVTkNbc2NhbGVUeXBlXSB8fCBTQ0FMRV9GVU5DLnF1YW50aWxlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29sb3JWYWx1ZURvbWFpbihsYXllcikge1xuICBjb25zdCB7bG93ZXJQZXJjZW50aWxlLCB1cHBlclBlcmNlbnRpbGUsIGNvbG9yU2NhbGV9ID0gbGF5ZXIucHJvcHM7XG4gIGNvbnN0IHtzb3J0ZWRCaW5zfSA9IGxheWVyLnN0YXRlLnNvcnRlZENvbG9yQmlucztcbiAgY29uc3QgbGVuID0gc29ydGVkQmlucy5sZW5ndGg7XG5cbiAgaWYgKCFsZW4pIHtcbiAgICAvLyBlcnIuLi4gd2hhdCBkbyB3ZSBkb1xuICAgIGxheWVyLnN0YXRlLmNvbG9yVmFsdWVEb21haW4gPSBudWxsO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IGxvd2VySWR4ID0gTWF0aC5jZWlsKGxvd2VyUGVyY2VudGlsZSAvIDEwMCAqIChsZW4gLSAxKSk7XG4gICAgY29uc3QgdXBwZXJJZHggPSBNYXRoLmZsb29yKHVwcGVyUGVyY2VudGlsZSAvIDEwMCAqIChsZW4gLSAxKSk7XG5cbiAgICAvLyBjYWxjdWxhdGUgdmFsdWVEb21haW4gYmFzZWQgb25cbiAgICBsYXllci5zdGF0ZS5jb2xvclZhbHVlRG9tYWluID0gZ2V0QmluQ29sb3JEb21haW4oY29sb3JTY2FsZSwgc29ydGVkQmlucywgW1xuICAgICAgbG93ZXJJZHgsXG4gICAgICB1cHBlcklkeFxuICAgIF0pO1xuICAgIGxheWVyLmdldENvbG9yU2NhbGUoKTtcbiAgfVxuXG4gIGxheWVyLnByb3BzLm9uU2V0Q29sb3JEb21haW4obGF5ZXIuc3RhdGUuY29sb3JWYWx1ZURvbWFpbik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb2xvclNjYWxlRnVuY3Rpb24obGF5ZXIpIHtcbiAgY29uc3Qge2NvbG9yU2NhbGUsIGNvbG9yRG9tYWlufSA9IGxheWVyLnByb3BzO1xuICBsYXllci5zdGF0ZS5jb2xvclNjYWxlRnVuYyA9IGdldFNjYWxlRnVuY3Rvcihjb2xvclNjYWxlKSgpXG4gICAgLmRvbWFpbihcbiAgICAgIGNvbG9yRG9tYWluIHx8IGxheWVyLnN0YXRlLmNvbG9yRG9tYWluIHx8IGxheWVyLnN0YXRlLmNvbG9yVmFsdWVEb21haW5cbiAgICApXG4gICAgLnJhbmdlKGxheWVyLnByb3BzLmNvbG9yUmFuZ2UpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RWxldmF0aW9uU2NhbGVGdW5jdGlvbihsYXllcikge1xuICBjb25zdCBlbGV2YXRpb25SYW5nZSA9IGxheWVyLnByb3BzLmVsZXZhdGlvblJhbmdlO1xuICBjb25zdCBlbGV2YXRpb25Eb21haW4gPSBsYXllci5wcm9wcy5lbGV2YXRpb25Eb21haW4gfHwgbGF5ZXIuc3RhdGUuZWxldmF0aW9uVmFsdWVEb21haW47XG5cbiAgbGF5ZXIuc3RhdGUuZWxldmF0aW9uU2NhbGVGdW5jID0gZ2V0U2NhbGVGdW5jdG9yKGxheWVyLnByb3BzLnNpemVTY2FsZSkoKVxuICAgIC5kb21haW4oZWxldmF0aW9uRG9tYWluKVxuICAgIC5yYW5nZShlbGV2YXRpb25SYW5nZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRSYWRpdXNTY2FsZUZ1bmN0aW9uKGxheWVyKSB7XG4gIGNvbnN0IHt2aWV3cG9ydH0gPSBsYXllci5jb250ZXh0O1xuICBsYXllci5zdGF0ZS5yYWRpdXNTY2FsZUZ1bmMgPSBTQ0FMRV9GVU5DLnNxcnQoKVxuICAgIC5kb21haW4obGF5ZXIuc3RhdGUucmFkaXVzRG9tYWluKVxuICAgIC5yYW5nZShcbiAgICAgIGxheWVyLnByb3BzLnJhZGl1c1JhbmdlLm1hcChcbiAgICAgICAgZCA9PiBkICogdmlld3BvcnQuZGlzdGFuY2VTY2FsZXMubWV0ZXJzUGVyUGl4ZWxbMF1cbiAgICAgIClcbiAgICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbmVlZHNSZWNhbGN1bGF0ZUNvbG9yRG9tYWluKG9sZFByb3BzLCBwcm9wcykge1xuICByZXR1cm4gKFxuICAgIG9sZFByb3BzLmxvd2VyUGVyY2VudGlsZSAhPT0gcHJvcHMubG93ZXJQZXJjZW50aWxlIHx8XG4gICAgb2xkUHJvcHMudXBwZXJQZXJjZW50aWxlICE9PSBwcm9wcy51cHBlclBlcmNlbnRpbGUgfHxcbiAgICBvbGRQcm9wcy5jb2xvclNjYWxlICE9PSBwcm9wcy5jb2xvclNjYWxlXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBuZWVkUmVDYWxjdWxhdGVTY2FsZUZ1bmN0aW9uKG9sZFByb3BzLCBwcm9wcykge1xuICByZXR1cm4gb2xkUHJvcHMuY29sb3JSYW5nZSAhPT0gcHJvcHMuY29sb3JSYW5nZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5lZWRzUmVjYWxjdWxhdGVSYWRpdXNSYW5nZShvbGRQcm9wcywgcHJvcHMpIHtcbiAgcmV0dXJuIChcbiAgICBvbGRQcm9wcy5yYWRpdXNSYW5nZSAhPT0gcHJvcHMucmFkaXVzUmFuZ2UgJiZcbiAgICAob2xkUHJvcHMucmFkaXVzUmFuZ2VbMF0gIT09IHByb3BzLnJhZGl1c1JhbmdlWzBdIHx8XG4gICAgICBvbGRQcm9wcy5yYWRpdXNSYW5nZVsxXSAhPT0gcHJvcHMucmFkaXVzUmFuZ2VbMV0pXG4gICk7XG59XG4iXX0=