UNPKG

kepler.gl.geoiq

Version:

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

982 lines (858 loc) 113 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = exports.geojsonVisConfigs = exports.pointVisConfigs = exports.pincodeRequiredColumns = exports.pointLabelResolver = exports.pointLabelAccessor = exports.pincodeHeightPosResolver = exports.pincodeHeightPosAccessor = exports.pincodePosResolver = exports.pincodePosAccessor = void 0; var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); 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 _get2 = _interopRequireDefault(require("@babel/runtime/helpers/get")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _baseLayer = _interopRequireDefault(require("../base-layer")); var _deck = require("deck.gl"); var _lodash = _interopRequireDefault(require("lodash.memoize")); var _solidPolygonLayer = _interopRequireDefault(require("../../deckgl-layers/geojson-layer/solid-polygon-layer")); var _aggregateUtils = require("../../utils/aggregate-utils"); var _colorUtils = require("../../utils/color-utils"); var _pincodeLayerIcon = _interopRequireDefault(require("./pincode-layer-icon")); var _axios = _interopRequireDefault(require("axios")); var _d3Array = require("d3-array"); var _defaultSettings = require("../../constants/default-settings"); var _dataUtils = require("../../utils/data-utils"); 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; } function onlyUnique(value, index, self) { return self.indexOf(value) === index; } function filterNull(arr) { return arr > 0 || isNaN(arr) === true; } 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 pincodePosAccessor = function pincodePosAccessor(_ref) { var columns = _ref.columns, colorField = _ref.colorField; return function (d) { var pincode = columns.pincode; var data; if (colorField) { data = d.data[colorField.tableFieldIndex - 1]; } else { data = 1; } if (d.data[pincode.fieldIdx]) { return [{ pincode: d.data[pincode.fieldIdx], aggregationData: data }]; } }; }; exports.pincodePosAccessor = pincodePosAccessor; var pincodePosResolver = function pincodePosResolver(_ref2) { var columns = _ref2.columns, colorField = _ref2.colorField; return "".concat(columns.pincode.fieldIdx, "-").concat(colorField ? colorField.tableFieldIndex : null); }; exports.pincodePosResolver = pincodePosResolver; var pincodeHeightPosAccessor = function pincodeHeightPosAccessor(_ref3) { var columns = _ref3.columns, heightField = _ref3.heightField; return function (d) { var pincode = columns.pincode; var data; if (heightField) { data = d.data[heightField.tableFieldIndex - 1]; } else { data = 1; } if (d.data[pincode.fieldIdx]) { return [{ pincode: d.data[pincode.fieldIdx], aggregationData: data }]; } }; }; exports.pincodeHeightPosAccessor = pincodeHeightPosAccessor; var pincodeHeightPosResolver = function pincodeHeightPosResolver(_ref4) { var columns = _ref4.columns, heightField = _ref4.heightField; return "".concat(columns.pincode.fieldIdx, "-").concat(heightField ? heightField.tableFieldIndex : null); }; exports.pincodeHeightPosResolver = pincodeHeightPosResolver; var getLayerColorRange = function getLayerColorRange(colorRange) { return colorRange.colors.map(_colorUtils.hexToRgb); }; var pointLabelAccessor = function pointLabelAccessor(textLabel) { return function (d) { return String(d.data[textLabel.field.tableFieldIndex - 1]); }; }; exports.pointLabelAccessor = pointLabelAccessor; var pointLabelResolver = function pointLabelResolver(textLabel) { return textLabel.field && textLabel.field.tableFieldIndex; }; exports.pointLabelResolver = pointLabelResolver; var pincodeRequiredColumns = ['pincode']; // export const pointOptionalColumns = ['altitude']; exports.pincodeRequiredColumns = pincodeRequiredColumns; var pointVisConfigs = { radius: 'radius', fixedRadius: 'fixedRadius', opacity: 'opacity', outline: 'outline', thickness: 'thickness', colorRange: 'colorRange', radiusRange: 'radiusRange', 'hi-precision': 'hi-precision' }; exports.pointVisConfigs = pointVisConfigs; var 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' }; exports.geojsonVisConfigs = geojsonVisConfigs; var PincodeLayer = /*#__PURE__*/ function (_Layer) { (0, _inherits2["default"])(PincodeLayer, _Layer); function PincodeLayer(props) { var _this; (0, _classCallCheck2["default"])(this, PincodeLayer); _this = (0, _possibleConstructorReturn2["default"])(this, (0, _getPrototypeOf2["default"])(PincodeLayer).call(this, props)); _this.registerVisConfig(geojsonVisConfigs); _this.getPosition = (0, _lodash["default"])(pincodePosAccessor, pincodePosResolver); _this.getHeightPosition = (0, _lodash["default"])(pincodeHeightPosAccessor, pincodeHeightPosResolver); _this.getText = (0, _lodash["default"])(pointLabelAccessor, pointLabelResolver); // this.getColorValue = memoize(getValueAggr, aggrResolver); _this.getColorRange = (0, _lodash["default"])(getLayerColorRange); return _this; } (0, _createClass2["default"])(PincodeLayer, [{ key: "getVisualChannelDescription", /** * Get the description of a visualChannel config * @param key * @returns {{label: string, measure: (string|string)}} */ 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, allData) { // 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({}, (0, _get2["default"])((0, _getPrototypeOf2["default"])(PincodeLayer.prototype), "getDefaultLayerConfig", this).call(this, props), { // 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]; if (channel === 'height') { return this.getDefaultLayerConfig()[scale]; } 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) { var _this$config = this.config, dataId = _this$config.dataId, columns = _this$config.columns; var allData = datasets[dataId].allData; var pincodeIdx = columns.pincode.fieldIdx; allData = allData.map(function (d) { if (!d[pincodeIdx]) { return null; } var pincode = d[pincodeIdx]; return pincode; }); var uniqueAllData = allData.filter(onlyUnique); var uniqueAllData = uniqueAllData.filter(filterNull); var boundaryAggregation = this.config.boundaryAggregation; if (boundaryAggregation) { var config = { headers: { 'Content-Type': 'application/json', Authorization: 'Bearer ' + localStorage.getItem('accessToken') } }; var data = { type: boundaryAggregation, values: uniqueAllData }; var url = 'https://app.geoiq.io/boundary/v1.0/boundary_query'; var response = _axios["default"].post(url, data, config).then(function (response) { return response.data.result; })["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) { values = layerData.collected.map(function (c) { return c.properties.aggregatedData; }); return (0, _dataUtils.unique)(values).filter(_dataUtils.notNullorUndefined).sort(); } else if (layerData && layerData.f) { values = layerData.collected.map(function (c) { return c.properties.count; }); 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: "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, heightAggregation, colorField, heightField, data, heightData) { var _this3 = this; var colorDomain = []; var heightDomain = []; if (collected && colorAggregation) { var minMax = []; //converting collected data into feature collection // collected = featureCollection(collected); // var heightCollected = collect( // collected, // pointFC, // 'aggregationData', // 'values' // ).features; // collected = collect(collected, pointFC, 'aggregationData', 'values') // .features; // collected.map((c, i) => { // var aggregatedData = 0; // var values = c.properties.values; // if (values.length) { // aggregatedData = aggregate(values, colorAggregation); // } else { // aggregatedData = 0; // } // if (!heightField) { // minMax = this.calculateHeightDomain(values.length, minMax); // } // c.properties.count = values.length; // c.properties.aggregatedData = aggregatedData; // colorDomain[i] = colorField ? aggregatedData : values.length; // heightDomain = [minMax[0], minMax[1]]; // }); data = data.reduce(function (acc, d) { acc[d.pincode] ? acc[d.pincode].push(d.aggregationData) : acc[d.pincode] = [d.aggregationData]; return acc; }, {}); collected.map(function (c) { var aggregatedData = data[c.properties.Pincode] ? (0, _aggregateUtils.aggregate)(data[c.properties.Pincode], colorAggregation) : 0; c.properties.aggregatedData = aggregatedData; c.properties.count = data[c.properties.Pincode] ? data[c.properties.Pincode].length : 0; colorDomain.push(colorField ? aggregatedData : data[c.properties.Pincode] ? data[c.properties.Pincode].length : 0); }); } // collected = collected.reduce((accu, c, idx) => { // const filteredData = data.filter( // d => c.properties.Pincode === d.pincode.toString() // ); // // filteredData.map(fd => fd.aggregationData); // const aggregatedData = aggregate( // filteredData.map(fd => fd.aggregationData), // colorAggregation // ); // accu[idx].properties.aggregatedData = aggregatedData; // colorDomain.push(aggregatedData); // return accu; // }, collected); // } // var heightCollected; if (collected && heightAggregation) { var _minMax = []; heightData = heightData.reduce(function (acc, d) { acc[d.pincode] ? acc[d.pincode].push(d.aggregationData) : acc[d.pincode] = [d.aggregationData]; return acc; }, {}); collected.map(function (c) { var heightAggregatedData = heightData[c.properties.Pincode] ? (0, _aggregateUtils.aggregate)(heightData[c.properties.Pincode], heightAggregation) : 0; c.properties.heightAggregatedData = heightAggregatedData; _minMax = heightField ? _this3.calculateHeightDomain(heightAggregatedData, _minMax) : _this3.calculateHeightDomain(heightData[c.properties.Pincode] ? heightData[c.properties.Pincode].length : 0, _minMax); heightDomain = [_minMax[0], _minMax[1]]; }); // heightCollected.map((c, i) => { // var heightAggregatedData = 0; // var values = c.properties.values; // if (values.length) { // heightAggregatedData = aggregate(values, heightAggregation); // } else { // heightAggregatedData = 0; // } // minMax = heightField // ? this.calculateHeightDomain(heightAggregatedData, minMax) // : this.calculateHeightDomain(values.length, minMax); // collected[i].properties.heightAggregatedData = heightAggregatedData; // heightDomain = [minMax[0], minMax[1]]; // }); } return { collected: collected, colorDomain: colorDomain, heightDomain: heightDomain }; } // TODO: fix complexity /* eslint-disable complexity */ }, { key: "formatLayerData", value: function formatLayerData(_, allData, filteredIndex, oldLayerData, response, opt) { var _this4 = this; var _this$config2 = this.config, colorScale = _this$config2.colorScale, colorField = _this$config2.colorField, color = _this$config2.color, sizeScale = _this$config2.sizeScale, sizeDomain = _this$config2.sizeDomain, sizeField = _this$config2.sizeField, textLabel = _this$config2.textLabel, heightField = _this$config2.heightField, heightScale = _this$config2.heightScale, radiusField = _this$config2.radiusField, radiusDomain = _this$config2.radiusDomain, radiusScale = _this$config2.radiusScale, visConfig = _this$config2.visConfig, columns = _this$config2.columns; var _this$config3 = this.config, heightDomain = _this$config3.heightDomain, colorDomain = _this$config3.colorDomain; // const { // colorScale, // colorDomain, // colorField, // color, // columns, // sizeField, // sizeScale, // sizeDomain, // textLabel, // visConfig: {radiusRange, fixedRadius, colorRange} // } = this.config; var enable3d = visConfig.enable3d, stroked = visConfig.stroked, colorRange = visConfig.colorRange, heightRange = visConfig.heightRange, sizeRange = visConfig.sizeRange, radiusRange = visConfig.radiusRange, colorAggregation = visConfig.colorAggregation, heightAggregation = visConfig.heightAggregation; // this.getPosition.cache.delete(); var getPosition = this.getPosition({ columns: columns, colorField: colorField }); var getHeightPosition = this.getHeightPosition({ columns: columns, heightField: heightField }); // if (!oldLayerData || oldLayerData.getHeightPosition !== getHeightPosition) { // this.updateLayerMeta(allData, getHeightPositon); // } if (!oldLayerData || oldLayerData.getPosition !== getPosition) { this.updateLayerMeta(allData, getPosition); } if (oldLayerData && oldLayerData.collected) { var collected = oldLayerData.collected; } var data, 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 doesn't have point lat or lng, do not add the point // deck.gl can't handle position = null // if (!pos.every(Number.isFinite)) { // return accu; // } 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 doesn't have point lat or lng, do not add the point // deck.gl can't handle position = null // if (!pos.every(Number.isFinite)) { // return accu; // } if (pos) { accu.push.apply(accu, (0, _toConsumableArray2["default"])(pos)); } return accu; }, []); } colorDomain = []; if (response) { collected = response.features; collected = collected.reduce(function (accu, c, idx) { var filteredData = data.filter(function (d) { return c.properties.Pincode === d.pincode.toString(); }); // filteredData.map(fd => fd.aggregationData); accu[idx].properties.count = filteredData.length; colorDomain.push(filteredData.length); return accu; }, collected); } var _this$calculateBounda = this.calculateBoundaryAggregatedData(collected, colorAggregation, heightAggregation, colorField, heightField, data, heightData), collected = _this$calculateBounda.collected, colorDomain = _this$calculateBounda.colorDomain, heightDomain = _this$calculateBounda.heightDomain; 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 = _this4.calculateLayerDomain({}, { collected: collected }, channel); _this4.updateLayerConfig((0, _defineProperty2["default"])({}, domain, updatedDomain)); } }); //used for saving geoJson // if (collected) { // saveText(JSON.stringify(featureCollection(collected)), 'filename.json'); // } // } 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) { return colorField ? _this4.getEncodedChannelValue(cScale, d.properties.aggregatedData, colorField) : _this4.getEncodedChannelValue(cScale, d.properties.count, { type: 'real' }); }, getLineColor: function getLineColor(d) { return colorField ? _this4.getEncodedChannelValue(cScale, d.properties.aggregatedData, colorField) : _this4.getEncodedChannelValue(cScale, d.properties.count, { type: 'real' }); }, getLineWidth: function getLineWidth(d) { return sScale ? _this4.getEncodedChannelValue(sScale, allData[d.properties.index], sizeField, 0) : d.properties.lineWidth || 1; }, getElevation: function getElevation(d) { return heightField ? _this4.getEncodedChannelValue(eScale, d.properties.heightAggregatedData, heightField, 0) : _this4.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 var 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 = { polygon: true }; this.updateMeta({ bounds: bounds, lightSettings: lightSettings, 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; // console.log(this.config.apiCallRequest); 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({}, 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, subLayers: _objectSpread({}, _deck.GeoJsonLayer.defaultProps.subLayers, { PolygonLayer: _solidPolygonLayer["default"] }) }))].concat((0, _toConsumableArray2["default"])(this.isLayerHovered(objectHovered) && !visConfig.enable3d ? [new _deck.GeoJsonLayer(_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 }))] : [])); } }, { key: "type", get: function get() { return 'pincode'; } }, { key: "isAggregated", get: function get() { return true; } }, { key: "layerIcon", get: function get() { return _pincodeLayerIcon["default"]; } }, { key: "requiredLayerColumns", get: function get() { return pincodeRequiredColumns; } }, { key: "columnPairs", get: function get() { return; } }, { key: "noneLayerDataAffectingProps", get: function get() { return [].concat((0, _toConsumableArray2["default"])((0, _get2["default"])((0, _getPrototypeOf2["default"])(PincodeLayer.prototype), "noneLayerDataAffectingProps", this)), ['radius', 'boundaryAggregation']); } }, { key: "visualChannels", get: function get() { var _objectSpread2; return _objectSpread({}, (0, _get2["default"])((0, _getPrototypeOf2["default"])(PincodeLayer.prototype), "visualChannels", this), { color: _objectSpread({}, (0, _get2["default"])((0, _getPrototypeOf2["default"])(PincodeLayer.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({}, (0, _get2["default"])((0, _getPrototypeOf2["default"])(PincodeLayer.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)), height: { aggregation: 'heightAggregation', defaultMeasure: 'Point Count', property: 'height', field: 'heightField', scale: 'heightScale', domain: 'heightDomain', range: 'heightRange', key: 'height', channelScaleType: 'sizeAggr', condition: function condition(config) { return config.visConfig.enable3d; } } }); } }]); return PincodeLayer; }(_baseLayer["default"]); exports["default"] = PincodeLayer; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9sYXllcnMvcGluY29kZS1sYXllci9waW5jb2RlLWxheWVyLmpzIl0sIm5hbWVzIjpbIm9ubHlVbmlxdWUiLCJ2YWx1ZSIsImluZGV4Iiwic2VsZiIsImluZGV4T2YiLCJmaWx0ZXJOdWxsIiwiYXJyIiwiaXNOYU4iLCJzYXZlVGV4dCIsInRleHQiLCJmaWxlbmFtZSIsImEiLCJkb2N1bWVudCIsImNyZWF0ZUVsZW1lbnQiLCJzZXRBdHRyaWJ1dGUiLCJlbmNvZGVVUklDb21wb25lbnQiLCJjbGljayIsInBpbmNvZGVQb3NBY2Nlc3NvciIsImNvbHVtbnMiLCJjb2xvckZpZWxkIiwiZCIsInBpbmNvZGUiLCJkYXRhIiwidGFibGVGaWVsZEluZGV4IiwiZmllbGRJZHgiLCJhZ2dyZWdhdGlvbkRhdGEiLCJwaW5jb2RlUG9zUmVzb2x2ZXIiLCJwaW5jb2RlSGVpZ2h0UG9zQWNjZXNzb3IiLCJoZWlnaHRGaWVsZCIsInBpbmNvZGVIZWlnaHRQb3NSZXNvbHZlciIsImdldExheWVyQ29sb3JSYW5nZSIsImNvbG9yUmFuZ2UiLCJjb2xvcnMiLCJtYXAiLCJoZXhUb1JnYiIsInBvaW50TGFiZWxBY2Nlc3NvciIsInRleHRMYWJlbCIsIlN0cmluZyIsImZpZWxkIiwicG9pbnRMYWJlbFJlc29sdmVyIiwicGluY29kZVJlcXVpcmVkQ29sdW1ucyIsInBvaW50VmlzQ29uZmlncyIsInJhZGl1cyIsImZpeGVkUmFkaXVzIiwib3BhY2l0eSIsIm91dGxpbmUiLCJ0aGlja25lc3MiLCJyYWRpdXNSYW5nZSIsImdlb2pzb25WaXNDb25maWdzIiwidHlwZSIsImRlZmF1bHRWYWx1ZSIsImxhYmVsIiwiaXNSYW5nZWQiLCJyYW5nZSIsInN0ZXAiLCJncm91cCIsInByb3BlcnR5IiwiY29sb3JBZ2dyZWdhdGlvbiIsImhlaWdodEFnZ3JlZ2F0aW9uIiwic2l6ZVJhbmdlIiwiaGVpZ2h0UmFuZ2UiLCJlbGV2YXRpb25TY2FsZSIsInN0cm9rZWQiLCJmaWxsZWQiLCJlbmFibGUzZCIsIndpcmVmcmFtZSIsIlBpbmNvZGVMYXllciIsInByb3BzIiwicmVnaXN0ZXJWaXNDb25maWciLCJnZXRQb3NpdGlvbiIsImdldEhlaWdodFBvc2l0aW9uIiwiZ2V0VGV4dCIsImdldENvbG9yUmFuZ2UiLCJrZXkiLCJ2aXN1YWxDaGFubmVscyIsImRlZmF1bHRNZWFzdXJlIiwiYWdncmVnYXRpb24iLCJ2aXNDb25maWdTZXR0aW5ncyIsIm1lYXN1cmUiLCJjb25maWciLCJ2aXNDb25maWciLCJuYW1lIiwib2JqZWN0IiwiYWxsRGF0YSIsImhlaWdodERvbWFpbiIsImhlaWdodFNjYWxlIiwiY2hhbm5lbCIsInZhbGlkYXRlVmlzdWFsQ2hhbm5lbCIsInZhbGlkYXRlRmllbGRUeXBlIiwidmFsaWRhdGVBZ2dyZWdhdGlvblR5cGUiLCJ2YWxpZGF0ZVNjYWxlIiwidmlzdWFsQ2hhbm5lbCIsImFnZ3JlZ2F0aW9uT3B0aW9ucyIsImdldEFnZ3JlZ2F0aW9uT3B0aW9ucyIsImxlbmd0aCIsInVwZGF0ZUxheWVyQ29uZmlnIiwiaW5jbHVkZXMiLCJ1cGRhdGVMYXllclZpc0NvbmZpZyIsImNoYW5uZWxTY2FsZVR5cGUiLCJPYmplY3QiLCJrZXlzIiwiRklFTERfT1BUUyIsInNjYWxlIiwiREVGQVVMVF9BR0dSRUdBVElPTiIsImFnZ3JlZ2F0aW9uVHlwZSIsImdldERlZmF1bHRMYXllckNvbmZpZyIsImRhdGFzZXRzIiwiZGF0YUlkIiwicGluY29kZUlkeCIsInVuaXF1ZUFsbERhdGEiLCJmaWx0ZXIiLCJib3VuZGFyeUFnZ3JlZ2F0aW9uIiwiaGVhZGVycyIsIkF1dGhvcml6YXRpb24iLCJsb2NhbFN0b3JhZ2UiLCJnZXRJdGVtIiwidmFsdWVzIiwidXJsIiwicmVzcG9uc2UiLCJheGlvcyIsInBvc3QiLCJ0aGVuIiwicmVzdWx0IiwiZGF0YXNldCIsImxheWVyRGF0YSIsIm5ld0ZpbHRlciIsImZvckVhY2giLCJzY2FsZVR5cGUiLCJTQ0FMRV9UWVBFUyIsIm9yZGluYWwiLCJkb21haW4iLCJ1cGRhdGVkRG9tYWluIiwiY2FsY3VsYXRlTGF5ZXJEb21haW4iLCJmaWx0ZXJlZEluZGV4Rm9yRG9tYWluIiwiZGVmYXVsdERvbWFpbiIsImNvbGxlY3RlZCIsImMiLCJwcm9wZXJ0aWVzIiwiYWdncmVnYXRlZERhdGEiLCJub3ROdWxsb3JVbmRlZmluZWQiLCJzb3J0IiwiZiIsImNvdW50IiwiQ29uc29sZSIsImVycm9yIiwiaXNUaW1lIiwiQUxMX0ZJRUxEX1RZUEVTIiwidGltZXN0YW1wIiwidmFsdWVBY2Nlc3NvciIsIm1heWJlVG9EYXRlIiwiYmluZCIsImZvcm1hdCIsImluZGV4VmFsdWVBY2Nlc3NvciIsImkiLCJzb3J0RnVuY3Rpb24iLCJwb2ludCIsInF1YW50aWxlIiwicXVhbnRpemUiLCJsaW5lYXIiLCJzcXJ0IiwidW5kZWZpbmVkIiwiTk9fVkFMVUVfQ09MT1IiLCJhdHRyaWJ1dGVWYWx1ZSIsIkRhdGUiLCJtaW5NYXgiLCJtaW4iLCJtYXgiLCJoZWlnaHREYXRhIiwiY29sb3JEb21haW4iLCJyZWR1Y2UiLCJhY2MiLCJwdXNoIiwiUGluY29kZSIsImhlaWdodEFnZ3JlZ2F0ZWREYXRhIiwiY2FsY3VsYXRlSGVpZ2h0RG9tYWluIiwiXyIsImZpbHRlcmVkSW5kZXgiLCJvbGRMYXllckRhdGEiLCJvcHQiLCJjb2xvclNjYWxlIiwiY29sb3IiLCJzaXplU2NhbGUiLCJzaXplRG9tYWluIiwic2l6ZUZpZWxkIiwicmFkaXVzRmllbGQiLCJyYWRpdXNEb21haW4iLCJyYWRpdXNTY2FsZSIsInVwZGF0ZUxheWVyTWV0YSIsInNhbWVEYXRhIiwiYWNjdSIsInBvcyIsImZlYXR1cmVzIiwiaWR4IiwiZmlsdGVyZWREYXRhIiwidG9TdHJpbmciLCJjYWxjdWxhdGVCb3VuZGFyeUFnZ3JlZ2F0ZWREYXRhIiwiY1NjYWxlIiwiZ2V0VmlzQ2hhbm5lbFNjYWxlIiwic1NjYWxlIiwiZVNjYWxlIiwiZ2V0RmlsbENvbG9yIiwiZ2V0RW5jb2RlZENoYW5uZWxWYWx1ZSIsImdldExpbmVDb2xvciIsImdldExpbmVXaWR0aCIsImxpbmVXaWR0aCIsImdldEVsZXZhdGlvbiIsImJvdW5kcyIsImdldFBvaW50c0JvdW5kcyIsImxpZ2h0U2V0dGluZ3MiLCJnZXRMaWdodFNldHRpbmdzRnJvbUJvdW5kcyIsImZwNjQiLCJmZWF0dXJlVHlwZXMiLCJwb2x5Z29uIiwidXBkYXRlTWV0YSIsIm9iamVjdEhvdmVyZWQiLCJtYXBTdGF0ZSIsImludGVyYWN0aW9uQ29uZmlnIiwibWV0YSIsImdldFJhZGl1c1NjYWxlQnlab29tIiwiem9vbUZhY3RvciIsImdldFpvb21GYWN0b3IiLCJsYXllclByb3BzIiwibGluZVdpZHRoU2NhbGUiLCJsaW5lV2lkdGhNaW5QaXhlbHMiLCJwb2ludFJhZGl1c1NjYWxlIiwibGluZU1pdGVyTGltaXQiLCJ1cGRhdGVUcmlnZ2VycyIsImFwaUNhbGwiLCJhcGlDYWxsUmVxdWVzdCIsImJvdW5kYXJ5IiwiYXBpQ2FsbENvbXBsZXRlIiwiR2VvSnNvbkxheWVyIiwiaWQiLCJwaWNrYWJsZSIsImF1dG9IaWdobGlnaHQiLCJwYXJhbWV0ZXJzIiwiZGVwdGhUZXN0IiwiQm9vbGVhbiIsImRyYWdSb3RhdGUiLCJleHRydWRlZCIsInN1YkxheWVycyIsImRlZmF1bHRQcm9wcyIsIlBvbHlnb25MYXllciIsIkhpZ2hsaWdodFBvbHlnb25MYXllciIsImlzTGF5ZXJIb3ZlcmVkIiwiaGlnaGxpZ2h0Q29sb3IiLCJQaW5jb2RlTGF5ZXJJY29uIiwiQ0hBTk5FTF9TQ0FMRVMiLCJjb2xvckFnZ3IiLCJzaXplIiwic2l6ZUFnZ3IiLCJjb25kaXRpb24iLCJoZWlnaHQiLCJMYXllciJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW9CQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQTs7QUFTQTs7Ozs7O0FBT0EsU0FBU0EsVUFBVCxDQUFvQkMsS0FBcEIsRUFBMkJDLEtBQTNCLEVBQWtDQyxJQUFsQyxFQUF3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