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
JavaScript
"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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