UNPKG

kepler.gl.geoiq

Version:

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

886 lines (776 loc) 101 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.pointVisConfigs = exports.pointPosResolver = exports.pointPosAccessor = 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 _pointLayerIcon = _interopRequireDefault(require("./point-layer-icon")); var _axios = _interopRequireDefault(require("axios")); var _collect = _interopRequireDefault(require("@turf/collect")); 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,' + 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; 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 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: 0.5, 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 PointLayer = exports["default"] = /*#__PURE__*/function (_Layer) { (0, _inherits2["default"])(PointLayer, _Layer); var _super = _createSuper(PointLayer); function PointLayer(props) { var _this; (0, _classCallCheck2["default"])(this, PointLayer); _this = _super.call(this, props); _this.registerVisConfig(geojsonVisConfigs); _this.getHeightPosition = (0, _lodash["default"])(pointHeightPosAccessor, pointHeightPosResolver); _this.getColorRange = (0, _lodash["default"])(getLayerColorRange); return _this; } (0, _createClass2["default"])(PointLayer, [{ key: "type", get: function get() { return 'backendPoint'; } }, { key: "name", get: function get() { return 'Point'; } }, { key: "showLoader", get: function get() { return true; } }, { key: "layerIcon", get: function get() { return _pointLayerIcon["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"])(PointLayer.prototype), "noneLayerDataAffectingProps", this)), ['radius']); } }, { key: "visualChannels", get: function get() { var _objectSpread2; return _objectSpread(_objectSpread({}, (0, _get2["default"])((0, _getPrototypeOf2["default"])(PointLayer.prototype), "visualChannels", this)), {}, { size: _objectSpread(_objectSpread({}, (0, _get2["default"])((0, _getPrototypeOf2["default"])(PointLayer.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' } }); } // /** // * Get the description of a visualChannel config // * @param key // * @returns {{label: string, measure: (string|string)}} // */ // getVisualChannelDescription(key) { // // e.g. label: Color, measure: Average of ETA // const {range, field, defaultMeasure, aggregation} = this.visualChannels[ // key // ]; // return { // label: this.visConfigSettings[range].label, // measure: this.config[field] // ? `${this.config.visConfig[aggregation]} of ${this.config[field].name}` // : defaultMeasure // }; // } }, { key: "shouldRenderColumnConfig", value: function shouldRenderColumnConfig() { return false; } }, { key: "getHoverData", value: function getHoverData(object, auth, datasets, fieldsToShow) { // index of allData is saved to feature.properties 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"])(PointLayer.prototype), "getDefaultLayerConfig", this).call(this, props)), {}, { apiCallRequest: true, // add height visual channel heightField: null, heightDomain: [0, 1], heightScale: 'linear' }); } }, { key: "updateLayerConfig", value: function updateLayerConfig(newConfig) { if (Object.keys(newConfig).includes('colorField') || Object.keys(newConfig).includes('colorUI')) { newConfig = _objectSpread(_objectSpread({}, newConfig), { legendApiCallRequest: true }); } this.config = _objectSpread(_objectSpread({}, this.config), newConfig); return this; } /** * 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.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])); } } // getAggregationOptions(channel) { // const visualChannel = this.visualChannels[channel]; // const {field, channelScaleType} = visualChannel; // console.log( // 'DEFAULT_AGGREGATION inside getAggregationOptions', // DEFAULT_AGGREGATION, // channelScaleType // ); // console.log('condition inside getAggregationOptions', this.config[field]); // console.log('default aggregation', DEFAULT_AGGREGATION[channelScaleType]); // return Object.keys( // this.config[field] // ? FIELD_OPTS[this.config[field].type].scale[channelScaleType] // : DEFAULT_AGGREGATION[channelScaleType] // ); // } /** * Get scale options based on current field and aggregation type * @param {string} channel * @returns {string[]} */ // getScaleOptions(channel) { // const visualChannel = this.visualChannels[channel]; // const {field, aggregation, channelScaleType, scale} = visualChannel; // const aggregationType = this.config.visConfig[aggregation]; // if (channel === 'height') { // return this.getDefaultLayerConfig()[scale]; // } // return this.config[field] // ? // scale options based on aggregation // FIELD_OPTS[this.config[field].type].scale[channelScaleType][ // aggregationType // ] // : // default scale options for point count // 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, colorAggregation = _this$config.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' // Authorization: 'Bearer ' + localStorage.getItem('accessToken') } }; var data = { colorField: colorField ? colorField.name : null, colorAggregation: colorField ? colorAggregation : 'count', filters: JSON.stringify(filters), indexName: indexName, userId: uid, viewport: JSON.stringify(viewport), zoom: zoom, permissionType: isEdit }; var response = _axios["default"].post(_defaultSettings.ON_PREMESIS_URL + '/geoiqlayers/pointlayer/v1.0/fetch', data, config).then(function (response) { return response.data.data; })["catch"](); return response; } }, { key: "axiosLegendAPICall", value: function axiosLegendAPICall(datasets, filters, auth, project) { var _this$config2 = this.config, dataId = _this$config2.dataId, colorField = _this$config2.colorField, colorScale = _this$config2.colorScale, visConfig = _this$config2.visConfig; var colorRange = visConfig.colorRange; var indexName = datasets[dataId].indexName; var uid = auth.uid; var isEdit = project.isEdit; var noOfBreaks = colorRange.colors.length; filters = filters.filter(function (f) { return f.dataId.includes(dataId); }); // const colorScale = 'quantile'; var legendAPIData = { colorField: colorField.name, userId: uid, colorFieldType: colorField.type, colorScale: colorScale, permissionType: isEdit, noOfBreaks: noOfBreaks, indexName: indexName, filters: filters }; var legendConfig = { headers: { 'Content-type': 'application/json' } }; var response = _axios["default"].post("".concat(_defaultSettings.ON_PREMESIS_URL, "/geoiqutilities/legend/v1.0/fetch"), legendAPIData, legendConfig).then(function (result) { var breakPoints = result.data.data.Breakpoints; breakPoints = breakPoints.reduce(function (accu, breakpoint, index) { if (accu.length < noOfBreaks) { accu.push({ x1: breakpoint, x2: breakPoints[index + 1] }); } return accu; }, []); return breakPoints; // this.updateLayerConfig({ // legend: breakPoints, // apiCallRequest: true, // legendApiCallRequest: false // }); }); return response; // this.updateLayerConfig({ // apiCallRequest: true, // legendApiCallRequest: false // }); } /** * 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) { values = layerData.collected.map(function (c) { return c.properties[colorField.name]; }); return (0, _dataUtils.unique)(values).filter(_dataUtils.notNullorUndefined).sort(); } else { 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: "getPointEncodedChannelValue", value: function getPointEncodedChannelValue(legend, colorRange, colorField, data) { var defaultValue = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : _defaultSettings.NO_VALUE_COLOR; var type = colorField.type; var value = data; var attributeValue; if (type === _defaultSettings.ALL_FIELD_TYPES.string) { attributeValue = defaultValue; } else { attributeValue = colorRange[legend.reduce(function (acc, breakpoint, index) { if (value > breakpoint.x1 && value < breakpoint.x2) { acc = index; } return acc; }, null)]; } 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, colorAggregation, colorField) { var colorDomain = []; var heightDomain = []; if (collected && colorField) { collected.map(function (c) { colorDomain.push(c.properties.latitude); }); } return { collected: collected, colorDomain: colorDomain, heightDomain: heightDomain }; } // TODO: fix complexity /* eslint-disable complexity */ }, { key: "formatLayerData", value: function formatLayerData(_, allData, filteredIndex, oldLayerData, response, opt) { var _this3 = this; var _this$config3 = this.config, colorScale = _this$config3.colorScale, colorField = _this$config3.colorField, color = _this$config3.color, sizeScale = _this$config3.sizeScale, sizeDomain = _this$config3.sizeDomain, sizeField = _this$config3.sizeField, heightField = _this$config3.heightField, heightScale = _this$config3.heightScale, radiusField = _this$config3.radiusField, radiusDomain = _this$config3.radiusDomain, radiusScale = _this$config3.radiusScale, visConfig = _this$config3.visConfig, strokeColorField = _this$config3.strokeColorField, strokeColorScale = _this$config3.strokeColorScale, strokeColorDomain = _this$config3.strokeColorDomain, legend = _this$config3.legend; var _this$config4 = this.config, heightDomain = _this$config4.heightDomain, colorDomain = _this$config4.colorDomain; var enable3d = visConfig.enable3d, stroked = visConfig.stroked, colorRange = visConfig.colorRange, heightRange = visConfig.heightRange, sizeRange = visConfig.sizeRange, strokeColor = visConfig.strokeColor, radiusRange = visConfig.radiusRange, colorAggregation = visConfig.colorAggregation; if (!oldLayerData) { this.updateLayerMeta(); } if (oldLayerData && oldLayerData.collected) { var collected = oldLayerData.collected; } // var pointFC = featureCollection(data); // var heightPointFC = featureCollection(heightData); colorDomain = []; if (response.points) { collected = response.points; } var _this$calculateBounda = this.calculateBoundaryAggregatedData(collected, colorAggregation, colorField), collected = _this$calculateBounda.collected, colorDomain = _this$calculateBounda.colorDomain; Object.values(this.visualChannels).forEach(function (channel) { var scale = channel.scale, domain = channel.domain; // ordinal domain is based on allData, if only filter changed // no need to update ordinal domain if (collected) { var updatedDomain = _this3.calculateLayerDomain({}, { collected: collected }, channel); _this3.updateLayerConfig((0, _defineProperty2["default"])({}, domain, updatedDomain)); } }); //used for saving geoJson // if (collected) { // saveText(JSON.stringify(featureCollection(collected)), 'filename.json'); // } // } var cScale = colorField && this.getVisChannelScale(colorScale, colorDomain, colorRange.colors.map(_colorUtils.hexToRgb)); // stroke color var scScale = strokeColorField && this.getVisChannelScale(strokeColorScale, strokeColorDomain, strokeColorRange.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); // point radius var rScale = radiusField && this.getVisChannelScale(radiusScale, radiusDomain, radiusRange); return { collected: collected, getFillColor: function getFillColor(d) { return cScale && legend ? _this3.getPointEncodedChannelValue(legend, colorRange.colors.map(_colorUtils.hexToRgb), colorField, d.properties[colorField.name]) : d.properties.fillColor || color; }, getLineColor: function getLineColor(d) { return scScale ? _this3.getEncodedChannelValue(scScale, d.properties.aggregatedData, strokeColorField) : d.properties.lineColor || strokeColor; }, 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); }, getRadius: function getRadius(d) { return rScale ? _this3.getEncodedChannelValue(rScale, allData[d.properties.index], radiusField, 0) : d.properties.radius || 1; } }; } /* eslint-enable complexity */ }, { key: "updateLayerMeta", value: function updateLayerMeta() { // const bounds = this.getPointsBounds(allData, d => 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 = { point: true }; this.updateMeta({ 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, legend: this.config.legend }, 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 }, getRadius: { radiusField: this.config.radiusField, radiusRange: visConfig.radiusRange } }; // 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, getRadius: data.getRadius, 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 PointLayer; }(_baseLayer["default"]); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9sYXllcnMvYmFja2VuZC1wb2ludC1sYXllci9wb2ludC1sYXllci5qcyJdLCJuYW1lcyI6WyJzYXZlVGV4dCIsInRleHQiLCJmaWxlbmFtZSIsImEiLCJkb2N1bWVudCIsImNyZWF0ZUVsZW1lbnQiLCJzZXRBdHRyaWJ1dGUiLCJlbmNvZGVVUklDb21wb25lbnQiLCJjbGljayIsInBvaW50UG9zQWNjZXNzb3IiLCJjb2x1bW5zIiwiY29sb3JGaWVsZCIsImQiLCJsYXQiLCJsbmciLCJhbHRpdHVkZSIsImRhdGEiLCJ0YWJsZUZpZWxkSW5kZXgiLCJmaWVsZElkeCIsImFnZ3JlZ2F0aW9uRGF0YSIsInBvaW50UG9zUmVzb2x2ZXIiLCJwb2ludEhlaWdodFBvc0FjY2Vzc29yIiwiaGVpZ2h0RmllbGQiLCJoZWlnaHRBZ2dyZWdhdGlvbkRhdGEiLCJwb2ludEhlaWdodFBvc1Jlc29sdmVyIiwiZ2V0TGF5ZXJDb2xvclJhbmdlIiwiY29sb3JSYW5nZSIsImNvbG9ycyIsIm1hcCIsImhleFRvUmdiIiwiYm91bmRhcnlSZXF1aXJlZENvbHVtbnMiLCJwb2ludFZpc0NvbmZpZ3MiLCJyYWRpdXMiLCJmaXhlZFJhZGl1cyIsIm9wYWNpdHkiLCJvdXRsaW5lIiwidGhpY2tuZXNzIiwicmFkaXVzUmFuZ2UiLCJnZW9qc29uVmlzQ29uZmlncyIsInR5cGUiLCJkZWZhdWx0VmFsdWUiLCJsYWJlbCIsImlzUmFuZ2VkIiwicmFuZ2UiLCJzdGVwIiwiZ3JvdXAiLCJwcm9wZXJ0eSIsImNvbG9yQWdncmVnYXRpb24iLCJoZWlnaHRBZ2dyZWdhdGlvbiIsInNpemVSYW5nZSIsImhlaWdodFJhbmdlIiwiZWxldmF0aW9uU2NhbGUiLCJzdHJva2VkIiwiZmlsbGVkIiwiZW5hYmxlM2QiLCJ3aXJlZnJhbWUiLCJQb2ludExheWVyIiwicHJvcHMiLCJyZWdpc3RlclZpc0NvbmZpZyIsImdldEhlaWdodFBvc2l0aW9uIiwiZ2V0Q29sb3JSYW5nZSIsIlBvaW50TGF5ZXJJY29uIiwiZGVmYXVsdFBvaW50Q29sdW1uUGFpcnMiLCJzaXplIiwiYWdncmVnYXRpb24iLCJjaGFubmVsU2NhbGVUeXBlIiwiQ0hBTk5FTF9TQ0FMRVMiLCJzaXplQWdnciIsImNvbmRpdGlvbiIsImNvbmZpZyIsInZpc0NvbmZpZyIsImRlZmF1bHRNZWFzdXJlIiwiZG9tYWluIiwiZmllbGQiLCJrZXkiLCJzY2FsZSIsIm9iamVjdCIsImF1dGgiLCJkYXRhc2V0cyIsImZpZWxkc1RvU2hvdyIsImFwaUNhbGxSZXF1ZXN0IiwiaGVpZ2h0RG9tYWluIiwiaGVpZ2h0U2NhbGUiLCJuZXdDb25maWciLCJPYmplY3QiLCJrZXlzIiwiaW5jbHVkZXMiLCJsZWdlbmRBcGlDYWxsUmVxdWVzdCIsImNoYW5uZWwiLCJhbGxEYXRhIiwidmFsaWRhdGVWaXN1YWxDaGFubmVsIiwidmFsaWRhdGVGaWVsZFR5cGUiLCJ2YWxpZGF0ZVNjYWxlIiwidmlzdWFsQ2hhbm5lbCIsInZpc3VhbENoYW5uZWxzIiwiYWdncmVnYXRpb25PcHRpb25zIiwiZ2V0QWdncmVnYXRpb25PcHRpb25zIiwibGVuZ3RoIiwidXBkYXRlTGF5ZXJDb25maWciLCJ1cGRhdGVMYXllclZpc0NvbmZpZyIsInZpZXdwb3J0Iiwiem9vbSIsImZpbHRlcnMiLCJwcm9qZWN0IiwiZGF0YUlkIiwiaW5kZXhOYW1lIiwiaXNFZGl0IiwidWlkIiwiZmlsdGVyIiwiZiIsImhlYWRlcnMiLCJuYW1lIiwiSlNPTiIsInN0cmluZ2lmeSIsInVzZXJJZCIsInBlcm1pc3Npb25UeXBlIiwicmVzcG9uc2UiLCJheGlvcyIsInBvc3QiLCJPTl9QUkVNRVNJU19VUkwiLCJ0aGVuIiwiY29sb3JTY2FsZSIsIm5vT2ZCcmVha3MiLCJsZWdlbmRBUElEYXRhIiwiY29sb3JGaWVsZFR5cGUiLCJsZWdlbmRDb25maWciLCJyZXN1bHQiLCJicmVha1BvaW50cyIsIkJyZWFrcG9pbnRzIiwicmVkdWNlIiwiYWNjdSIsImJyZWFrcG9pbnQiLCJpbmRleCIsInB1c2giLCJ4MSIsIngyIiwiZGF0YXNldCIsImxheWVyRGF0YSIsIm5ld0ZpbHRlciIsInZhbHVlcyIsImZvckVhY2giLCJzY2FsZVR5cGUiLCJTQ0FMRV9UWVBFUyIsIm9yZGluYWwiLCJ1cGRhdGVkRG9tYWluIiwiY2FsY3VsYXRlTGF5ZXJEb21haW4iLCJmaWx0ZXJlZEluZGV4Rm9yRG9tYWluIiwiZGVmYXVsdERvbWFpbiIsImNvbGxlY3RlZCIsImMiLCJwcm9wZXJ0aWVzIiwibm90TnVsbG9yVW5kZWZpbmVkIiwic29ydCIsIkNvbnNvbGUiLCJlcnJvciIsImlzVGltZSIsIkFMTF9GSUVMRF9UWVBFUyIsInRpbWVzdGFtcCIsInZhbHVlQWNjZXNzb3IiLCJtYXliZVRvRGF0ZSIsImJpbmQiLCJmb3JtYXQiLCJpbmRleFZhbHVlQWNjZXNzb3IiLCJpIiwic29ydEZ1bmN0aW9uIiwicG9pbnQiLCJxdWFudGlsZSIsInF1YW50aXplIiwibGluZWFyIiwic3FydCIsInVuZGVmaW5lZCIsIk5PX1ZBTFVFX0NPTE9SIiwidmFsdWUiLCJhdHRyaWJ1dGVWYWx1ZSIsIkRhdGUiLCJsZWdlbmQiLCJzdHJpbmciLCJhY2MiLCJtaW5NYXgiLCJtaW4iLCJtYXgiLCJjb2xvckRvbWFpbiIsImxhdGl0dWRlIiwiXyIsImZpbHRlcmVkSW5kZXgiLCJvbGRMYXllckRhdGEiLCJvcHQiLCJjb2xvciIsInNpemVTY2FsZSIsInNpemVEb21haW4iLCJzaXplRmllbGQiLCJyYWRpdXNGaWVsZCIsInJhZGl1c0RvbWFpbiIsInJhZGl1c1NjYWxlIiwic3Ryb2tlQ29sb3JGaWVsZCIsInN0cm9rZUNvbG9yU2NhbGUiLCJzdHJva2VDb2xvckRvbWFpbiIsInN0cm9rZUNvbG9yIiwidXBkYXRlTGF5ZXJNZXRhIiwicG9pbnRzIiwiY2FsY3VsYXRlQm91bmRhcnlBZ2dyZWdhdGVkRGF0YSIsImNTY2FsZSIsImdldFZpc0NoYW5uZWxTY2FsZSIsInNjU2NhbGUiLCJzdHJva2VDb2xvclJhbmdlIiwic1NjYWxlIiwiZVNjYWxlIiwiclNjYWxlIiwiZ2V0RmlsbENvbG9yIiwiZ2V0UG9pbnRFbmNvZGVkQ2hhbm5lbFZhbHVlIiwiZmlsbENvbG9yIiwiZ2V0TGluZUNvbG9yIiwiZ2V0RW5jb2RlZENoYW5uZWxWYWx1ZSIsImFnZ3JlZ2F0ZWREYXRhIiwibGluZUNvbG9yIiwiZ2V0TGluZVdpZHRoIiwibGluZVdpZHRoIiwiZ2V0RWxldmF0aW9uIiwiaGVpZ2h0QWdncmVnYXRlZERhdGEiLCJjb3VudCIsImdldFJhZGl1cyIsImZwNjQiLCJmZWF0dXJlVHlwZXMiLCJ1cGRhdGVNZXRhIiwiaWR4Iiwib2JqZWN0SG92ZXJlZCIsIm1hcFN0YXRlIiwiaW50ZXJhY3Rpb25Db25maWciLCJtZXRhIiwibGlnaHRTZXR0aW5ncyIsImdldFJhZGl1c1NjYWxlQnlab29tIiwiem9vbUZhY3RvciIsImdldFpvb21GYWN0b3IiLCJsYXllclByb3BzIiwibGluZVdpZHRoU2NhbGUiLCJsaW5lV2lkdGhNaW5QaXhlbHMiLCJwb2ludFJhZGl1c1NjYWxlIiwibGluZU1pdGVyTGltaXQiLCJ1cGRhdGVUcmlnZ2VycyIsImFnZ3JlZ2F0aW9uVHlwZSIsImFwaUNhbGwiLCJib3VuZGFyeSIsImJvdW5kYXJ5QWdncmVnYXRpb24iLCJhcGlDYWxsQ29tcGxldGUiLCJHZW9Kc29uTGF5ZXIiLCJpZCIsInBpY2thYmxlIiwiYXV0b0hpZ2hsaWdodCIsInBhcmFtZXRlcnMiLCJkZXB0aFRlc3QiLCJCb29sZWFuIiwiZHJhZ1JvdGF0ZSIsImV4dHJ1ZGVkIiwiaXNMYXllckhvdmVyZWQiLCJoaWdobGlnaHRDb2xvciIsIkxheWVyIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBb0JBOztBQUNBOztBQUNBOztBQUdBOztBQUVBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUVBOztBQU9BOzs7Ozs7Ozs7O0FBU0EsU0FBU0EsUUFBVCxDQUFrQkMsSUFBbEIsRUFBd0JDLFFBQXhCLEVBQWtDO0FBQ2hDLE1BQUlDLENBQUMsR0FBR0Ms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