UNPKG

kepler.gl.geoiq

Version:

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

918 lines (810 loc) 106 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.pointVisConfigs = exports.pointPosResolver = exports.pointPosAccessor = exports.pointLabelResolver = exports.pointLabelAccessor = exports.pointHeightPosResolver = exports.pointHeightPosAccessor = exports.geojsonVisConfigs = exports["default"] = exports.boundaryRequiredColumns = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _get2 = _interopRequireDefault(require("@babel/runtime/helpers/get")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn")); var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf")); var _baseLayer = _interopRequireDefault(require("../base-layer")); var _deck = require("deck.gl"); var _lodash = _interopRequireDefault(require("lodash.memoize")); var _aggregateUtils = require("../../utils/aggregate-utils"); var _colorUtils = require("../../utils/color-utils"); var _dynamicBoundaryLayerIcon = _interopRequireDefault(require("./dynamic-boundary-layer-icon")); var _axios = _interopRequireDefault(require("axios")); var _helpers = require("@turf/helpers"); var _d3Array = require("d3-array"); var _defaultSettings = require("../../constants/default-settings"); var _dataUtils = require("../../utils/data-utils"); function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2["default"])(this, result); }; } function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } function saveText(text, filename) { var a = document.createElement('a'); a.setAttribute('href', "data:text/plain;charset=utf-u,".concat(encodeURIComponent(text))); a.setAttribute('download', filename); a.click(); } var pointPosAccessor = exports.pointPosAccessor = function pointPosAccessor(_ref) { var columns = _ref.columns, colorField = _ref.colorField; return function (d) { var lat = columns.lat, lng = columns.lng, altitude = columns.altitude; var data; if (colorField) { data = d.data[colorField.tableFieldIndex - 1]; } else { data = 1; } if (d.data[lng.fieldIdx] && d.data[lat.fieldIdx] // && // !is.NaN(d.data[lat.fieldIdx]) && // !is.NaN(d.data[lat.fieldIdx]) ) { return [(0, _helpers.point)([d.data[lng.fieldIdx], d.data[lat.fieldIdx]], { aggregationData: data })]; } }; }; var pointPosResolver = exports.pointPosResolver = function pointPosResolver(_ref2) { var columns = _ref2.columns, colorField = _ref2.colorField; return "".concat(columns.lat.fieldIdx, "-").concat(columns.lng.fieldIdx, "-").concat(columns.altitude ? columns.altitude.fieldIdx : 'z', "-").concat(colorField ? colorField.tableFieldIndex : null); }; var pointHeightPosAccessor = exports.pointHeightPosAccessor = function pointHeightPosAccessor(_ref3) { var columns = _ref3.columns, heightField = _ref3.heightField; return function (d) { var lat = columns.lat, lng = columns.lng, altitude = columns.altitude; var data; if (heightField) { data = d.data[heightField.tableFieldIndex - 1]; } else { data = 1; } if (d.data[lng.fieldIdx] && d.data[lat.fieldIdx] // && // !is.NaN(d.data[lat.fieldIdx]) && // !is.NaN(d.data[lat.fieldIdx]) ) { return [(0, _helpers.point)([d.data[lng.fieldIdx], d.data[lat.fieldIdx]], { heightAggregationData: data })]; } }; }; var pointHeightPosResolver = exports.pointHeightPosResolver = function pointHeightPosResolver(_ref4) { var columns = _ref4.columns, heightField = _ref4.heightField; return "".concat(columns.lat.fieldIdx, "-").concat(columns.lng.fieldIdx, "-").concat(columns.altitude ? columns.altitude.fieldIdx : 'z', "-").concat(heightField ? heightField.tableFieldIndex : null); }; var getLayerColorRange = function getLayerColorRange(colorRange) { return colorRange.colors.map(_colorUtils.hexToRgb); }; var pointLabelAccessor = exports.pointLabelAccessor = function pointLabelAccessor(textLabel) { return function (d) { return String(d.data[textLabel.field.tableFieldIndex - 1]); }; }; var pointLabelResolver = exports.pointLabelResolver = function pointLabelResolver(textLabel) { return textLabel.field && textLabel.field.tableFieldIndex; }; var boundaryRequiredColumns = exports.boundaryRequiredColumns = ['lat', 'lng']; // export const pointOptionalColumns = ['altitude']; var pointVisConfigs = exports.pointVisConfigs = { radius: 'radius', fixedRadius: 'fixedRadius', opacity: 'opacity', outline: 'outline', thickness: 'thickness', colorRange: 'colorRange', radiusRange: 'radiusRange', 'hi-precision': 'hi-precision' }; var geojsonVisConfigs = exports.geojsonVisConfigs = { opacity: 'opacity', thickness: { type: 'number', defaultValue: 1, label: 'Stroke Width', isRanged: false, range: [0, 100], step: 0.1, group: 'stroke', property: 'thickness' }, colorRange: 'colorRange', radius: 'radius', colorAggregation: 'aggregation', heightAggregation: 'heightAggregation', sizeRange: 'strokeWidthRange', radiusRange: 'radiusRange', heightRange: 'elevationRange', elevationScale: 'elevationScale', 'hi-precision': 'hi-precision', stroked: 'stroked', filled: 'filled', enable3d: 'enable3d', wireframe: 'wireframe' }; var BoundaryLayer = exports["default"] = /*#__PURE__*/function (_Layer) { (0, _inherits2["default"])(BoundaryLayer, _Layer); var _super = _createSuper(BoundaryLayer); function BoundaryLayer(props) { var _this; (0, _classCallCheck2["default"])(this, BoundaryLayer); _this = _super.call(this, props); _this.registerVisConfig(geojsonVisConfigs); _this.getPosition = (0, _lodash["default"])(pointPosAccessor, pointPosResolver); _this.getHeightPosition = (0, _lodash["default"])(pointHeightPosAccessor, pointHeightPosResolver); _this.getText = (0, _lodash["default"])(pointLabelAccessor, pointLabelResolver); // this.getColorValue = memoize(getValueAggr, aggrResolver); _this.getColorRange = (0, _lodash["default"])(getLayerColorRange); return _this; } (0, _createClass2["default"])(BoundaryLayer, [{ key: "type", get: function get() { return 'dynamic'; } }, { key: "isAggregated", get: function get() { return true; } }, { key: "showLoader", get: function get() { return true; } }, { key: "layerIcon", get: function get() { return _dynamicBoundaryLayerIcon["default"]; } }, { key: "requiredLayerColumns", get: function get() { return boundaryRequiredColumns; } }, { key: "columnPairs", get: function get() { return this.defaultPointColumnPairs; } }, { key: "noneLayerDataAffectingProps", get: function get() { return [].concat((0, _toConsumableArray2["default"])((0, _get2["default"])((0, _getPrototypeOf2["default"])(BoundaryLayer.prototype), "noneLayerDataAffectingProps", this)), ['radius']); } }, { key: "visualChannels", get: function get() { var _objectSpread2; return _objectSpread(_objectSpread({}, (0, _get2["default"])((0, _getPrototypeOf2["default"])(BoundaryLayer.prototype), "visualChannels", this)), {}, { color: _objectSpread(_objectSpread({}, (0, _get2["default"])((0, _getPrototypeOf2["default"])(BoundaryLayer.prototype), "visualChannels", this).color), {}, { aggregation: 'colorAggregation', channelScaleType: _defaultSettings.CHANNEL_SCALES.colorAggr, defaultMeasure: 'Point Count', domain: 'colorDomain', field: 'colorField', key: 'color', property: 'color', range: 'colorRange', scale: 'colorScale' }), size: _objectSpread(_objectSpread({}, (0, _get2["default"])((0, _getPrototypeOf2["default"])(BoundaryLayer.prototype), "visualChannels", this).size), {}, (_objectSpread2 = { property: 'stroke', aggregation: 'sizeAggregation', channelScaleType: _defaultSettings.CHANNEL_SCALES.sizeAggr, condition: function condition(config) { return config.visConfig.enable3d; }, defaultMeasure: 'Point Count', domain: 'sizeDomain', field: 'sizeField', key: 'size' }, (0, _defineProperty2["default"])(_objectSpread2, "property", 'stroke'), (0, _defineProperty2["default"])(_objectSpread2, "range", 'sizeRange'), (0, _defineProperty2["default"])(_objectSpread2, "scale", 'sizeScale'), _objectSpread2)) // , // radius: { // property: 'radius', // field: 'radiusField', // scale: 'radiusScale', // domain: 'radiusDomain', // range: 'radiusRange', // key: 'radius', // channelScaleType: 'radius' // } }); } }, { key: "shouldRenderColumnConfig", value: function shouldRenderColumnConfig() { return false; } /** * Get the description of a visualChannel config * @param key * @returns {{label: string, measure: (string|string)}} */ }, { key: "getVisualChannelDescription", value: function getVisualChannelDescription(key) { // e.g. label: Color, measure: Average of ETA var _this$visualChannels$ = this.visualChannels[key], range = _this$visualChannels$.range, field = _this$visualChannels$.field, defaultMeasure = _this$visualChannels$.defaultMeasure, aggregation = _this$visualChannels$.aggregation; return { label: this.visConfigSettings[range].label, measure: this.config[field] ? "".concat(this.config.visConfig[aggregation], " of ").concat(this.config[field].name) : defaultMeasure }; } }, { key: "getHoverData", value: function getHoverData(object) { return object; } }, { key: "getDefaultLayerConfig", value: function getDefaultLayerConfig() { var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; return _objectSpread(_objectSpread({}, (0, _get2["default"])((0, _getPrototypeOf2["default"])(BoundaryLayer.prototype), "getDefaultLayerConfig", this).call(this, props)), {}, { apiCallRequest: true, // add height visual channel heightField: null, heightDomain: [0, 1], heightScale: 'linear' }); } /** * Aggregation layer handles visual channel aggregation inside deck.gl layer */ }, { key: "updateLayerVisualChannel", value: function updateLayerVisualChannel(_ref5, channel) { var data = _ref5.data, allData = _ref5.allData; this.validateVisualChannel(channel); } // /** // * Validate aggregation type on top of basic layer visual channel validation // * @param channel // */ }, { key: "validateVisualChannel", value: function validateVisualChannel(channel) { // field type decides aggregation type decides scale type this.validateFieldType(channel); this.validateAggregationType(channel); this.validateScale(channel); } /** * Validate aggregation type based on selected field */ }, { key: "validateAggregationType", value: function validateAggregationType(channel) { var visualChannel = this.visualChannels[channel]; var field = visualChannel.field, aggregation = visualChannel.aggregation; var aggregationOptions = this.getAggregationOptions(channel); if (!aggregation) { return; } if (!aggregationOptions.length) { // if field cannot be aggregated, set field to null this.updateLayerConfig((0, _defineProperty2["default"])({}, field, null)); } else if (!aggregationOptions.includes(this.config.visConfig[aggregation])) { // current aggregation type is not supported by this field // set aggregation to the first supported option this.updateLayerVisConfig((0, _defineProperty2["default"])({}, aggregation, aggregationOptions[0])); } } }, { key: "getAggregationOptions", value: function getAggregationOptions(channel) { var visualChannel = this.visualChannels[channel]; var field = visualChannel.field, channelScaleType = visualChannel.channelScaleType; return Object.keys(this.config[field] ? _defaultSettings.FIELD_OPTS[this.config[field].type].scale[channelScaleType] : _defaultSettings.DEFAULT_AGGREGATION[channelScaleType]); } /** * Get scale options based on current field and aggregation type * @param {string} channel * @returns {string[]} */ }, { key: "getScaleOptions", value: function getScaleOptions(channel) { var visualChannel = this.visualChannels[channel]; var field = visualChannel.field, aggregation = visualChannel.aggregation, channelScaleType = visualChannel.channelScaleType, scale = visualChannel.scale; var aggregationType = this.config.visConfig[aggregation]; return this.config[field] ? // scale options based on aggregation _defaultSettings.FIELD_OPTS[this.config[field].type].scale[channelScaleType][aggregationType] : // default scale options for point count _defaultSettings.DEFAULT_AGGREGATION[channelScaleType][aggregationType]; } }, { key: "axiosApiCall", value: function axiosApiCall(datasets, viewport, zoom, filters, auth, project) { var _this$config = this.config, dataId = _this$config.dataId, colorField = _this$config.colorField, visConfig = _this$config.visConfig; var colorAggregation = visConfig.colorAggregation; var indexName = datasets[dataId].indexName; var isEdit = project.isEdit; var uid = auth.uid; filters = filters.filter(function (f) { return f.dataId.includes(dataId); }); var config = { headers: { 'Content-Type': 'application/json' } }; var data = { colorField: colorField ? colorField.name : null, colorAggregation: colorField ? colorAggregation : 'count', colorFieldType: colorField ? colorField.type : null, filters: JSON.stringify(filters), indexName: indexName, userId: uid, viewport: JSON.stringify(viewport), zoom: zoom, permissionType: isEdit }; var response = _axios["default"].post("".concat(_defaultSettings.ON_PREMESIS_URL, "/geoiqlayers/dynamiclayer/v1.0/fetch"), data, config).then(function (response) { return response.data.data; })["catch"](); return response; } /** * helper function to update one layer domain when state.data changed * if state.data change is due ot update filter, newFiler will be passed * called by updateAllLayerDomainData * @param {Object} dataset * @param {Object} newFilter * @returns {object} layer * @returns {object} widget */ }, { key: "updateLayerDomain", value: function updateLayerDomain(dataset, layerData, newFilter) { var _this2 = this; Object.values(this.visualChannels).forEach(function (channel) { var scale = channel.scale; var scaleType = _this2.config[scale]; // ordinal domain is based on allData, if only filter changed // no need to update ordinal domain if (!newFilter || scaleType !== _defaultSettings.SCALE_TYPES.ordinal) { var domain = channel.domain; var updatedDomain = _this2.calculateLayerDomain(dataset, layerData, channel); _this2.updateLayerConfig((0, _defineProperty2["default"])({}, domain, updatedDomain)); } }); return this; } }, { key: "calculateLayerDomain", value: function calculateLayerDomain(dataset, layerData, visualChannel) { var allData = dataset.allData, filteredIndexForDomain = dataset.filteredIndexForDomain; var colorField = this.config.colorField; // const defaultDomain = [0, 1]; var defaultDomain; var values; if (layerData && colorField && layerData.collected) { if (this.meta.featureTypes.polygon) { values = layerData.collected.map(function (c) { return c.properties.aggregatedData; }); } else { values = layerData.collected.map(function (c) { return c.properties[colorField.name]; }); } return (0, _dataUtils.unique)(values).filter(_dataUtils.notNullorUndefined).sort(); } else if (layerData && layerData.collected) { values = layerData.collected.map(function (c) { return c.properties.totalCount; }); return (0, _dataUtils.unique)(values).filter(_dataUtils.notNullorUndefined).sort(); } defaultDomain = [0, 1]; var scale = visualChannel.scale; var scaleType = this.config[scale]; var field = this.config[visualChannel.field]; if (!field) { // if colorField or sizeField were set back to null return defaultDomain; } if (!_defaultSettings.SCALE_TYPES[scaleType]) { Console.error("scale type ".concat(scaleType, " not supported")); return defaultDomain; } // TODO: refactor to add valueAccessor to field var fieldIdx = field.tableFieldIndex - 1; var isTime = field.type === _defaultSettings.ALL_FIELD_TYPES.timestamp; var valueAccessor = _dataUtils.maybeToDate.bind(null, isTime, fieldIdx, field.format); var indexValueAccessor = function indexValueAccessor(i) { return valueAccessor(allData[i]); }; var sortFunction = (0, _dataUtils.getSortingFunction)(field.type); if (!values) { return defaultDomain; } switch (scaleType) { case _defaultSettings.SCALE_TYPES.ordinal: case _defaultSettings.SCALE_TYPES.point: // do not recalculate ordinal domain based on filtered data // don't need to update ordinal domain every time return defaultDomain; case _defaultSettings.SCALE_TYPES.quantile: return values.filter(_dataUtils.notNullorUndefined).sort(sortFunction); case _defaultSettings.SCALE_TYPES.quantize: case _defaultSettings.SCALE_TYPES.linear: case _defaultSettings.SCALE_TYPES.sqrt: default: return (0, _d3Array.extent)(values).map(function (d, i) { return d === undefined ? i : d; }); } } }, { key: "getEncodedChannelValue", value: function getEncodedChannelValue(scale, data, field) { var defaultValue = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : _defaultSettings.NO_VALUE_COLOR; var type = field.type; var value = data; var attributeValue; if (type === _defaultSettings.ALL_FIELD_TYPES.timestamp) { // shouldn't need to convert here // scale Function should take care of it attributeValue = scale(new Date(value)); } else { attributeValue = scale(value); } if (!attributeValue) { attributeValue = defaultValue; } return attributeValue; } }, { key: "calculateHeightDomain", value: function calculateHeightDomain(value, minMax) { if (!minMax.length) { return [value, value]; } var min = (0, _aggregateUtils.aggregate)([value, minMax[0]], 'minimum'); var max = (0, _aggregateUtils.aggregate)([value, minMax[1]], 'maximum'); return [min, max]; } }, { key: "calculateBoundaryAggregatedData", value: function calculateBoundaryAggregatedData(collected, colorField, colorAggregation) { var colorDomain = []; if (this.meta.featureTypes.polygon) { if (colorField && collected) { collected.map(function (c) { return colorDomain.push(c.properties.aggregatedData); }); } else if (collected) { collected.map(function (c) { return colorDomain.push(c.properties.totalCount); }); } } else if (colorField && collected) { collected.map(function (c) { return colorDomain.push(c.properties[colorField.name]); }); } return { collected: collected, colorDomain: colorDomain }; } // TODO: fix complexity /* eslint-disable complexity */ }, { key: "formatLayerData", value: function formatLayerData(_, allData, filteredIndex, oldLayerData, response, opt) { var _this3 = this; var _this$config2 = this.config, colorScale = _this$config2.colorScale, colorField = _this$config2.colorField, sizeScale = _this$config2.sizeScale, sizeDomain = _this$config2.sizeDomain, sizeField = _this$config2.sizeField, heightField = _this$config2.heightField, heightScale = _this$config2.heightScale, visConfig = _this$config2.visConfig, columns = _this$config2.columns, color = _this$config2.color; var _this$config3 = this.config, heightDomain = _this$config3.heightDomain, colorDomain = _this$config3.colorDomain; var enable3d = visConfig.enable3d, stroked = visConfig.stroked, colorRange = visConfig.colorRange, heightRange = visConfig.heightRange, sizeRange = visConfig.sizeRange, colorAggregation = visConfig.colorAggregation, heightAggregation = visConfig.heightAggregation; var getPosition = this.getPosition({ columns: columns, colorField: colorField }); var getHeightPosition = this.getHeightPosition({ columns: columns, heightField: heightField }); if (!oldLayerData || oldLayerData.getPosition !== getPosition) { this.updateLayerMeta(allData, getPosition); } if (oldLayerData && oldLayerData.collected) { var collected = oldLayerData.collected; } var data; var heightData; if (oldLayerData && oldLayerData.data && opt.sameData && oldLayerData.getPosition === getPosition && oldLayerData.getHeightPosition === getHeightPosition) { data = oldLayerData.data; heightData = oldLayerData.heightData; } else { data = filteredIndex.reduce(function (accu, index) { var pos = getPosition({ data: allData[index] }); if (pos) { accu.push.apply(accu, (0, _toConsumableArray2["default"])(pos)); } return accu; }, []); heightData = filteredIndex.reduce(function (accu, index) { var pos = getHeightPosition({ data: allData[index] }); if (pos) { accu.push.apply(accu, (0, _toConsumableArray2["default"])(pos)); } return accu; }, []); } var pointFC = (0, _helpers.featureCollection)(data); var heightPointFC = (0, _helpers.featureCollection)(heightData); colorDomain = []; // this.isLayerAggregated(); // let featureTypes = {point: true}; // this.updateMeta({featureTypes}); // this.isLayerAggregated(); if (response) { collected = response.features; // if (collected) { // // saveText(JSON.stringify(featureCollection(collected)), 'filename.json'); // } if (collected.length && collected[0].geometry && collected[0].geometry.type === 'Point') { var featureTypes = { point: true }; this.updateMeta({ featureTypes: featureTypes }); } else if (collected.length && collected[0].geometry) { var _featureTypes = { polygon: true }; this.updateMeta({ featureTypes: _featureTypes }); } } var _this$calculateBounda = this.calculateBoundaryAggregatedData(collected, colorField, colorAggregation), collected = _this$calculateBounda.collected, colorDomain = _this$calculateBounda.colorDomain; Object.values(this.visualChannels).forEach(function (channel) { var scale = channel.scale, domain = channel.domain; if (collected) { var updatedDomain = _this3.calculateLayerDomain({}, { collected: collected }, channel); _this3.updateLayerConfig((0, _defineProperty2["default"])({}, domain, updatedDomain)); } }); var cScale = this.getVisChannelScale(colorScale, colorDomain, colorRange.colors.map(_colorUtils.hexToRgb)); // calculate stroke scale - if stroked = true var sScale = sizeField && stroked && this.getVisChannelScale(sizeScale, sizeDomain, sizeRange); // calculate elevation scale - if extruded = true var eScale = this.getVisChannelScale(heightScale, heightDomain, heightRange); return { collected: collected, data: data, heightData: heightData, getPosition: getPosition, getHeightPosition: getHeightPosition, getFillColor: function getFillColor(d) { // console.log( // colorField // ? this.meta.featureTypes.polygon // ? this.getEncodedChannelValue( // cScale, // d.properties.aggregatedData, // colorField // ) // : this.getEncodedChannelValue( // cScale, // d.properties[colorField.name], // colorField // ) // : this.meta.featureTypes.polygon // ? this.getEncodedChannelValue(cScale, d.properties.totalCount, { // type: 'real' // }) // : d.properties.fillColor || color // ); return colorField ? _this3.getEncodedChannelValue(cScale, _this3.meta.featureTypes.polygon ? d.properties.aggregatedData : d.properties[colorField.name], colorField) : _this3.meta.featureTypes.polygon ? _this3.getEncodedChannelValue(cScale, d.properties.totalCount, { type: 'real' }) : d.properties.fillColor || color; }, getLineColor: function getLineColor(d) { // console.log( // colorField // ? this.meta.featureTypes.polygon // ? this.getEncodedChannelValue( // cScale, // d.properties.aggregatedData, // colorField // ) // : this.getEncodedChannelValue( // cScale, // d.properties[colorField.name], // colorField // ) // : this.meta.featureTypes.polygon // ? this.getEncodedChannelValue(cScale, d.properties.totalCount, { // type: 'real' // }) // : d.properties.fillColor || color // ); return colorField ? _this3.getEncodedChannelValue(cScale, _this3.meta.featureTypes.polygon ? d.properties.aggregatedData : d.properties[colorField.name], colorField) : _this3.meta.featureTypes.polygon ? _this3.getEncodedChannelValue(cScale, d.properties.totalCount, { type: 'real' }) : d.properties.fillColor || color; }, // this.getEncodedChannelValue(cScale, d.properties.totalCount, { // type: 'real' // }), getLineWidth: function getLineWidth(d) { return sScale ? _this3.getEncodedChannelValue(sScale, allData[d.properties.index], sizeField, 0) : d.properties.lineWidth || 1; }, getElevation: function getElevation(d) { return heightField ? _this3.getEncodedChannelValue(eScale, d.properties.heightAggregatedData, heightField, 0) : _this3.getEncodedChannelValue(eScale, d.properties.count, { type: 'real' }, 0); } }; } /* eslint-enable complexity */ }, { key: "updateLayerMeta", value: function updateLayerMeta(allData, getPosition) { var bounds = this.getPointsBounds(allData, function (d) { return getPosition({ data: d }); }); // get bounds from features // const bounds = getGeojsonBounds(allFeatures); // get lightSettings from points // const lightSettings = this.getLightSettingsFromBounds(bounds); // if any of the feature has properties.hi-precision set to be true var fp64 = false; var fixedRadius = false; // keep a record of what type of geometry the collection has var featureTypes = {}; this.updateMeta({ bounds: bounds, fp64: fp64, fixedRadius: fixedRadius, featureTypes: featureTypes }); } }, { key: "renderLayer", value: function renderLayer(_ref6) { var data = _ref6.data, idx = _ref6.idx, objectHovered = _ref6.objectHovered, mapState = _ref6.mapState, interactionConfig = _ref6.interactionConfig; var _this$meta = this.meta, fp64 = _this$meta.fp64, lightSettings = _this$meta.lightSettings, fixedRadius = _this$meta.fixedRadius; var radiusScale = this.getRadiusScaleByZoom(mapState, fixedRadius); var zoomFactor = this.getZoomFactor(mapState); var visConfig = this.config.visConfig; var layerProps = { // multiplier applied just so it being consistent with previously saved maps lineWidthScale: visConfig.thickness * zoomFactor * 8, lineWidthMinPixels: 1, elevationScale: visConfig.elevationScale, pointRadiusScale: radiusScale, fp64: fp64 || visConfig['hi-precision'], lineMiterLimit: 4 }; var updateTriggers = { getElevation: { heightField: this.config.heightField, heightScale: this.config.heightScale, aggregationType: visConfig.heightAggregation, heightDomain: this.config.heightDomain, heightRange: visConfig.heightRange }, getFillColor: { color: this.config.color, colorField: this.config.colorField, colorRange: visConfig.colorRange, colorScale: this.config.colorScale, aggregationType: visConfig.colorAggregation, colorDomain: this.config.colorDomain, apiCall: this.config.apiCallRequest, boundary: this.config.boundaryAggregation }, getLineColor: { color: this.config.color, colorField: this.config.colorField, colorRange: visConfig.colorRange, colorScale: this.config.colorScale, aggregationType: visConfig.colorAggregation, colorDomain: this.config.colorDomain, apiCallComplete: this.config.apiCallComplete, apiCall: this.config.apiCallRequest, boundary: this.config.boundaryAggregation }, getLineWidth: { sizeField: this.config.sizeField, sizeRange: visConfig.sizeRange } }; // this.config.apiCallComplete = false; // this.config.apiCallRequest = false; return [new _deck.GeoJsonLayer(_objectSpread(_objectSpread({}, layerProps), {}, { id: this.id, idx: idx, data: data.collected, getFillColor: data.getFillColor, getLineColor: data.getLineColor, getLineWidth: data.getLineWidth, getElevation: data.getElevation, // highlight pickable: true, // highlightColor: this.config.highlightColor, autoHighlight: visConfig.enable3d, // parameters parameters: { depthTest: Boolean(visConfig.enable3d || mapState.dragRotate) }, opacity: visConfig.opacity, stroked: visConfig.stroked, filled: visConfig.filled, extruded: visConfig.enable3d, wireframe: visConfig.wireframe, lightSettings: lightSettings, updateTriggers: updateTriggers }))].concat((0, _toConsumableArray2["default"])(this.isLayerHovered(objectHovered) && !visConfig.enable3d ? [new _deck.GeoJsonLayer(_objectSpread(_objectSpread({}, layerProps), {}, { id: "".concat(this.id, "-hovered"), data: [objectHovered.object], getLineWidth: data.getLineWidth, getElevation: data.getElevation, getLineColor: this.config.highlightColor, getFillColor: this.config.highlightColor, updateTriggers: updateTriggers, stroked: true, pickable: false, filled: false }))] : [])); } }]); return BoundaryLayer; }(_baseLayer["default"]); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9sYXllcnMvZHluYW1pYy1ib3VuZGFyeS1sYXllci9keW5hbWljLWJvdW5kYXJ5LWxheWVyLmpzIl0sIm5hbWVzIjpbInNhdmVUZXh0IiwidGV4dCIsImZpbGVuYW1lIiwiYSIsImRvY3VtZW50IiwiY3JlYXRlRWxlbWVudCIsInNldEF0dHJpYnV0ZSIsImVuY29kZVVSSUNvbXBvbmVudCIsImNsaWNrIiwicG9pbnRQb3NBY2Nlc3NvciIsImNvbHVtbnMiLCJjb2xvckZpZWxkIiwiZCIsImxhdCIsImxuZyIsImFsdGl0dWRlIiwiZGF0YSIsInRhYmxlRmllbGRJbmRleCIsImZpZWxkSWR4IiwiYWdncmVnYXRpb25EYXRhIiwicG9pbnRQb3NSZXNvbHZlciIsInBvaW50SGVpZ2h0UG9zQWNjZXNzb3IiLCJoZWlnaHRGaWVsZCIsImhlaWdodEFnZ3JlZ2F0aW9uRGF0YSIsInBvaW50SGVpZ2h0UG9zUmVzb2x2ZXIiLCJnZXRMYXllckNvbG9yUmFuZ2UiLCJjb2xvclJhbmdlIiwiY29sb3JzIiwibWFwIiwiaGV4VG9SZ2IiLCJwb2ludExhYmVsQWNjZXNzb3IiLCJ0ZXh0TGFiZWwiLCJTdHJpbmciLCJmaWVsZCIsInBvaW50TGFiZWxSZXNvbHZlciIsImJvdW5kYXJ5UmVxdWlyZWRDb2x1bW5zIiwicG9pbnRWaXNDb25maWdzIiwicmFkaXVzIiwiZml4ZWRSYWRpdXMiLCJvcGFjaXR5Iiwib3V0bGluZSIsInRoaWNrbmVzcyIsInJhZGl1c1JhbmdlIiwiZ2VvanNvblZpc0NvbmZpZ3MiLCJ0eXBlIiwiZGVmYXVsdFZhbHVlIiwibGFiZWwiLCJpc1JhbmdlZCIsInJhbmdlIiwic3RlcCIsImdyb3VwIiwicHJvcGVydHkiLCJjb2xvckFnZ3JlZ2F0aW9uIiwiaGVpZ2h0QWdncmVnYXRpb24iLCJzaXplUmFuZ2UiLCJoZWlnaHRSYW5nZSIsImVsZXZhdGlvblNjYWxlIiwic3Ryb2tlZCIsImZpbGxlZCIsImVuYWJsZTNkIiwid2lyZWZyYW1lIiwiQm91bmRhcnlMYXllciIsInByb3BzIiwicmVnaXN0ZXJWaXNDb25maWciLCJnZXRQb3NpdGlvbiIsImdldEhlaWdodFBvc2l0aW9uIiwiZ2V0VGV4dCIsImdldENvbG9yUmFuZ2UiLCJCb3VuZGFyeUxheWVySWNvbiIsImRlZmF1bHRQb2ludENvbHVtblBhaXJzIiwiY29sb3IiLCJhZ2dyZWdhdGlvbiIsImNoYW5uZWxTY2FsZVR5cGUiLCJDSEFOTkVMX1NDQUxFUyIsImNvbG9yQWdnciIsImRlZmF1bHRNZWFzdXJlIiwiZG9tYWluIiwia2V5Iiwic2NhbGUiLCJzaXplIiwic2l6ZUFnZ3IiLCJjb25kaXRpb24iLCJjb25maWciLCJ2aXNDb25maWciLCJ2aXN1YWxDaGFubmVscyIsInZpc0NvbmZpZ1NldHRpbmdzIiwibWVhc3VyZSIsIm5hbWUiLCJvYmplY3QiLCJhcGlDYWxsUmVxdWVzdCIsImhlaWdodERvbWFpbiIsImhlaWdodFNjYWxlIiwiY2hhbm5lbCIsImFsbERhdGEiLCJ2YWxpZGF0ZVZpc3VhbENoYW5uZWwiLCJ2YWxpZGF0ZUZpZWxkVHlwZSIsInZhbGlkYXRlQWdncmVnYXRpb25UeXBlIiwidmFsaWRhdGVTY2FsZSIsInZpc3VhbENoYW5uZWwiLCJhZ2dyZWdhdGlvbk9wdGlvbnMiLCJnZXRBZ2dyZWdhdGlvbk9wdGlvbnMiLCJsZW5ndGgiLCJ1cGRhdGVMYXllckNvbmZpZyIsImluY2x1ZGVzIiwidXBkYXRlTGF5ZXJWaXNDb25maWciLCJPYmplY3QiLCJrZXlzIiwiRklFTERfT1BUUyIsIkRFRkFVTFRfQUdHUkVHQVRJT04iLCJhZ2dyZWdhdGlvblR5cGUiLCJkYXRhc2V0cyIsInZpZXdwb3J0Iiwiem9vbSIsImZpbHRlcnMiLCJhdXRoIiwicHJvamVjdCIsImRhdGFJZCIsImluZGV4TmFtZSIsImlzRWRpdCIsInVpZCIsImZpbHRlciIsImYiLCJoZWFkZXJzIiwiY29sb3JGaWVsZFR5cGUiLCJKU09OIiwic3RyaW5naWZ5IiwidXNlcklkIiwicGVybWlzc2lvblR5cGUiLCJyZXNwb25zZSIsImF4aW9zIiwicG9zdCIsIk9OX1BSRU1FU0lTX1VSTCIsInRoZW4iLCJkYXRhc2V0IiwibGF5ZXJEYXRhIiwibmV3RmlsdGVyIiwidmFsdWVzIiwiZm9yRWFjaCIsInNjYWxlVHlwZSIsIlNDQUxFX1RZUEVTIiwib3JkaW5hbCIsInVwZGF0ZWREb21haW4iLCJjYWxjdWxhdGVMYXllckRvbWFpbiIsImZpbHRlcmVkSW5kZXhGb3JEb21haW4iLCJkZWZhdWx0RG9tYWluIiwiY29sbGVjdGVkIiwibWV0YSIsImZlYXR1cmVUeXBlcyIsInBvbHlnb24iLCJjIiwicHJvcGVydGllcyIsImFnZ3JlZ2F0ZWREYXRhIiwibm90TnVsbG9yVW5kZWZpbmVkIiwic29ydCIsInRvdGFsQ291bnQiLCJDb25zb2xlIiwiZXJyb3IiLCJpc1RpbWUiLCJBTExfRklFTERfVFlQRVMiLCJ0aW1lc3RhbXAiLCJ2YWx1ZUFjY2Vzc29yIiwibWF5YmVUb0RhdGUiLCJiaW5kIiwiZm9ybWF0IiwiaW5kZXhWYWx1ZUFjY2Vzc29yIiwiaSIsInNvcnRGdW5jdGlvbiIsInBvaW50IiwicXVhbnRpbGUiLCJxdWFudGl6ZSIsImxpbmVhciIsInNxcnQiLCJ1bmRlZmluZWQiLCJOT19WQUxVRV9DT0xPUiIsInZhbHVlIiwiYXR0cmlidXRlVmFsdWUiLCJEYXRlIiwibWluTWF4IiwibWluIiwibWF4IiwiY29sb3JEb21haW4iLCJwdXNoIiwiXyIsImZpbHRlcmVkSW5kZXgiLCJvbGRMYXllckRhdGEiLCJvcHQiLCJjb2xvclNjYWxlIiwic2l6ZVNjYWxlIiwic2l6ZURvbWFpbiIsInNpemVGaWVsZCIsInVwZGF0ZUxheWVyTWV0YSIsImhlaWdodERhdGEiLCJzYW1lRGF0YSIsInJlZHVjZSIsImFjY3UiLCJpbmRleCIsInBvcyIsInBvaW50RkMiLCJoZWlnaHRQb2ludEZDIiwiZmVhdHVyZXMiLCJnZW9tZXRyeSIsInVwZGF0ZU1ldGEiLCJjYWxjdWxhdGVCb3VuZGFyeUFnZ3JlZ2F0ZWREYXRhIiwiY1NjYWxlIiwiZ2V0VmlzQ2hhbm5lbFNjYWxlIiwic1NjYWxlIiwiZVNjYWxlIiwiZ2V0RmlsbENvbG9yIiwiZ2V0RW5jb2RlZENoYW5uZWxWYWx1ZSIsImZpbGxDb2xvciIsImdldExpbmVDb2xvciIsImdldExpbmVXaWR0aCIsImxpbmVXaWR0aCIsImdldEVsZXZhdGlvbiIsImhlaWdodEFnZ3JlZ2F0ZWREYXRhIiwiY291bnQiLCJib3VuZHMiLCJnZXRQb2ludHNCb3VuZHMiLCJmcDY0IiwiaWR4Iiwib2JqZWN0SG92ZXJlZCIsIm1hcFN0YXRlIiwiaW50ZXJhY3Rpb25Db25maWciLCJsaWdodFNldHRpbmdzIiwicmFkaXVzU2NhbGUiLCJnZXRSYWRpdXNTY2FsZUJ5Wm9vbSIsInpvb21GYWN0b3IiLCJnZXRab29tRmFjdG9yIiwibGF5ZXJQcm9wcyIsImxpbmVXaWR0aFNjYWxlIiwibGluZVdpZHRoTWluUGl4ZWxzIiwicG9pbnRSYWRpdXNTY2FsZSIsImxpbmVNaXRlckxpbWl0IiwidXBkYXRlVHJpZ2dlcnMiLCJhcGlDYWxsIiwiYm91bmRhcnkiLCJib3VuZGFyeUFnZ3JlZ2F0aW9uIiwiYXBpQ2FsbENvbXBsZXRlIiwiR2VvSnNvbkxheWVyIiwiaWQiLCJwaWNrYWJsZSIsImF1dG9IaWdobGlnaHQiLCJwYXJhbWV0ZXJzIiwiZGVwdGhUZXN0IiwiQm9vbGVhbiIsImRyYWdSb3RhdGUiLCJleHRydWRlZCIsImlzTGF5ZXJIb3ZlcmVkIiwiaGlnaGxpZ2h0Q29sb3IiLCJMYXllciJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW9CQTs7QUFDQTs7QUFDQTs7QUFHQTs7QUFFQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQTs7QUFTQTs7Ozs7Ozs7OztBQVNBLFNBQVNBLFFBQVQsQ0FBa0JDLElBQWxCLEVBQXdCQyxRQUF4QixFQUFrQztBQUNoQyxNQUFJQyxDQUFDLEdBQUdDLFFBQVEsQ0FBQ0MsYUFBVCxDQUF1QixHQUF2QixDQUFSO0FBQ0FGLEVBQUFBLENBQUMsQ0FBQ0csWUFB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