UNPKG

kepler.gl

Version:

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

137 lines (129 loc) 17.9 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.coordHasLength4 = coordHasLength4; exports.getAnimationDomainFromTimestamps = getAnimationDomainFromTimestamps; exports.isTripGeoJsonField = isTripGeoJsonField; exports.parseTripGeoJsonTimestamp = parseTripGeoJsonTimestamp; var _geojsonUtils = require("../geojson-layer/geojson-utils"); var _utils = require("@kepler.gl/utils"); var _commonUtils = require("@kepler.gl/common-utils"); // SPDX-License-Identifier: MIT // Copyright contributors to the kepler.gl project /** * Parse geojson from string * @param {array} samples feature object values * @returns whether the geometry coordinates has length of 4 */ function coordHasLength4(samples) { var hasLength4 = true; for (var i = 0; i < samples.length; i += 1) { var _samples$i; hasLength4 = Array.isArray((_samples$i = samples[i]) === null || _samples$i === void 0 || (_samples$i = _samples$i.geometry) === null || _samples$i === void 0 ? void 0 : _samples$i.coordinates) && !samples[i].geometry.coordinates.find(function (c) { return c.length < 4; }); if (!hasLength4) { break; } } return hasLength4; } /** * Check if geojson features are trip layer animatable by meeting 3 conditions * @param dataContainer geojson feature objects container * @param {object} field array of geojson feature objects * @returns whether it is trip layer animatable */ function isTripGeoJsonField(dataContainer, field) { if (dataContainer.numRows() < 1) { return false; } var maxCount = 10000; var sampleRawFeatures = dataContainer.numRows() > maxCount ? (0, _utils.getSampleContainerData)(dataContainer, maxCount) : dataContainer; var features = sampleRawFeatures.mapIndex(field.valueAccessor).map(_geojsonUtils.parseGeoJsonRawFeature).filter(_commonUtils.notNullorUndefined); var featureTypes = (0, _geojsonUtils.getGeojsonFeatureTypes)(features); // condition 1: contain line string if (!featureTypes.line) { return false; } // condition 2:sample line strings contain 4 coordinates if (!coordHasLength4(features)) { return false; } // condition 3:the 4th coordinate of the first feature line strings is valid time // @ts-expect-error var tsHolder = features[0].geometry.coordinates.map(function (coord) { return coord[3]; }); return Boolean((0, _commonUtils.containValidTime)(tsHolder)); } /** * Get unix timestamp from animatable geojson for deck.gl trip layer * @param dataToFeature array of geojson feature objects, can be null * @returns */ function parseTripGeoJsonTimestamp(dataToFeature) { // Analyze type based on coordinates of the 1st lineString // select a sample trip to analyze time format var empty = { dataToTimeStamp: [], animationDomain: null }; var sampleTrip = dataToFeature.find(function (f) { var _f$geometry; return (f === null || f === void 0 || (_f$geometry = f.geometry) === null || _f$geometry === void 0 || (_f$geometry = _f$geometry.coordinates) === null || _f$geometry === void 0 || (_f$geometry = _f$geometry[0]) === null || _f$geometry === void 0 ? void 0 : _f$geometry.length) > 3; }); // if no valid geometry if (!sampleTrip) { return empty; } var analyzedType = (0, _commonUtils.containValidTime)(sampleTrip.geometry.coordinates.map(function (coord) { return coord[3]; })); if (!analyzedType) { return empty; } var format = analyzedType.format; var getTimeValue = function getTimeValue(coord) { return coord && (0, _commonUtils.notNullorUndefined)(coord[3]) ? (0, _utils.timeToUnixMilli)(coord[3], format) : null; }; var dataToTimeStamp = dataToFeature.map(function (f) { return f && f.geometry && Array.isArray(f.geometry.coordinates) ? f.geometry.coordinates.map(getTimeValue) : null; }); var animationDomain = getAnimationDomainFromTimestamps(dataToTimeStamp); return { dataToTimeStamp: dataToTimeStamp, animationDomain: animationDomain }; } function findMinFromSorted(list) { // check if list is null since the default value [] will only be applied when the param is undefined return (list === null || list === void 0 ? void 0 : list.find(function (d) { return (0, _commonUtils.notNullorUndefined)(d) && Number.isFinite(d); })) || null; } function findMaxFromSorted() { var list = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; var i = list.length - 1; while (i > 0) { if ((0, _commonUtils.notNullorUndefined)(list[i]) && Number.isFinite(list[i])) { return list[i]; } i--; } return null; } function getAnimationDomainFromTimestamps() { var dataToTimeStamp = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; return dataToTimeStamp.reduce(function (accu, tss) { var tsMin = findMinFromSorted(tss); var tsMax = findMaxFromSorted(tss); if ((0, _commonUtils.notNullorUndefined)(tsMin) && (0, _commonUtils.notNullorUndefined)(tsMax) && Number.isFinite(tsMin) && Number.isFinite(tsMax)) { accu[0] = Math.min(accu[0], tsMin); accu[1] = Math.max(accu[1], tsMax); } return accu; }, [Infinity, -Infinity]); } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfZ2VvanNvblV0aWxzIiwicmVxdWlyZSIsIl91dGlscyIsIl9jb21tb25VdGlscyIsImNvb3JkSGFzTGVuZ3RoNCIsInNhbXBsZXMiLCJoYXNMZW5ndGg0IiwiaSIsImxlbmd0aCIsIl9zYW1wbGVzJGkiLCJBcnJheSIsImlzQXJyYXkiLCJnZW9tZXRyeSIsImNvb3JkaW5hdGVzIiwiZmluZCIsImMiLCJpc1RyaXBHZW9Kc29uRmllbGQiLCJkYXRhQ29udGFpbmVyIiwiZmllbGQiLCJudW1Sb3dzIiwibWF4Q291bnQiLCJzYW1wbGVSYXdGZWF0dXJlcyIsImdldFNhbXBsZUNvbnRhaW5lckRhdGEiLCJmZWF0dXJlcyIsIm1hcEluZGV4IiwidmFsdWVBY2Nlc3NvciIsIm1hcCIsInBhcnNlR2VvSnNvblJhd0ZlYXR1cmUiLCJmaWx0ZXIiLCJub3ROdWxsb3JVbmRlZmluZWQiLCJmZWF0dXJlVHlwZXMiLCJnZXRHZW9qc29uRmVhdHVyZVR5cGVzIiwibGluZSIsInRzSG9sZGVyIiwiY29vcmQiLCJCb29sZWFuIiwiY29udGFpblZhbGlkVGltZSIsInBhcnNlVHJpcEdlb0pzb25UaW1lc3RhbXAiLCJkYXRhVG9GZWF0dXJlIiwiZW1wdHkiLCJkYXRhVG9UaW1lU3RhbXAiLCJhbmltYXRpb25Eb21haW4iLCJzYW1wbGVUcmlwIiwiZiIsIl9mJGdlb21ldHJ5IiwiYW5hbHl6ZWRUeXBlIiwiZm9ybWF0IiwiZ2V0VGltZVZhbHVlIiwidGltZVRvVW5peE1pbGxpIiwiZ2V0QW5pbWF0aW9uRG9tYWluRnJvbVRpbWVzdGFtcHMiLCJmaW5kTWluRnJvbVNvcnRlZCIsImxpc3QiLCJkIiwiTnVtYmVyIiwiaXNGaW5pdGUiLCJmaW5kTWF4RnJvbVNvcnRlZCIsImFyZ3VtZW50cyIsInVuZGVmaW5lZCIsInJlZHVjZSIsImFjY3UiLCJ0c3MiLCJ0c01pbiIsInRzTWF4IiwiTWF0aCIsIm1pbiIsIm1heCIsIkluZmluaXR5Il0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3RyaXAtbGF5ZXIvdHJpcC11dGlscy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUXG4vLyBDb3B5cmlnaHQgY29udHJpYnV0b3JzIHRvIHRoZSBrZXBsZXIuZ2wgcHJvamVjdFxuXG5pbXBvcnQge3BhcnNlR2VvSnNvblJhd0ZlYXR1cmUsIGdldEdlb2pzb25GZWF0dXJlVHlwZXN9IGZyb20gJy4uL2dlb2pzb24tbGF5ZXIvZ2VvanNvbi11dGlscyc7XG5pbXBvcnQge0RhdGFDb250YWluZXJJbnRlcmZhY2UsIGdldFNhbXBsZUNvbnRhaW5lckRhdGEsIHRpbWVUb1VuaXhNaWxsaX0gZnJvbSAnQGtlcGxlci5nbC91dGlscyc7XG5pbXBvcnQge2NvbnRhaW5WYWxpZFRpbWUsIG5vdE51bGxvclVuZGVmaW5lZH0gZnJvbSAnQGtlcGxlci5nbC9jb21tb24tdXRpbHMnO1xuaW1wb3J0IHtGZWF0dXJlfSBmcm9tICdAdHVyZi9oZWxwZXJzJztcbmltcG9ydCB7R2VvSnNvblByb3BlcnRpZXMsIEdlb21ldHJ5fSBmcm9tICdnZW9qc29uJztcblxuLyoqXG4gKiBQYXJzZSBnZW9qc29uIGZyb20gc3RyaW5nXG4gKiBAcGFyYW0ge2FycmF5fSBzYW1wbGVzIGZlYXR1cmUgb2JqZWN0IHZhbHVlc1xuICogQHJldHVybnMgd2hldGhlciB0aGUgZ2VvbWV0cnkgY29vcmRpbmF0ZXMgaGFzIGxlbmd0aCBvZiA0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb29yZEhhc0xlbmd0aDQoc2FtcGxlcyk6IGJvb2xlYW4ge1xuICBsZXQgaGFzTGVuZ3RoNCA9IHRydWU7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc2FtcGxlcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgIGhhc0xlbmd0aDQgPVxuICAgICAgQXJyYXkuaXNBcnJheShzYW1wbGVzW2ldPy5nZW9tZXRyeT8uY29vcmRpbmF0ZXMpICYmXG4gICAgICAhc2FtcGxlc1tpXS5nZW9tZXRyeS5jb29yZGluYXRlcy5maW5kKGMgPT4gYy5sZW5ndGggPCA0KTtcblxuICAgIGlmICghaGFzTGVuZ3RoNCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHJldHVybiBoYXNMZW5ndGg0O1xufVxuXG4vKipcbiAqIENoZWNrIGlmIGdlb2pzb24gZmVhdHVyZXMgYXJlIHRyaXAgbGF5ZXIgYW5pbWF0YWJsZSBieSBtZWV0aW5nIDMgY29uZGl0aW9uc1xuICogQHBhcmFtIGRhdGFDb250YWluZXIgZ2VvanNvbiBmZWF0dXJlIG9iamVjdHMgY29udGFpbmVyXG4gKiBAcGFyYW0ge29iamVjdH0gZmllbGQgYXJyYXkgb2YgZ2VvanNvbiBmZWF0dXJlIG9iamVjdHNcbiAqIEByZXR1cm5zIHdoZXRoZXIgaXQgaXMgdHJpcCBsYXllciBhbmltYXRhYmxlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1RyaXBHZW9Kc29uRmllbGQoZGF0YUNvbnRhaW5lcjogRGF0YUNvbnRhaW5lckludGVyZmFjZSwgZmllbGQpOiBib29sZWFuIHtcbiAgaWYgKGRhdGFDb250YWluZXIubnVtUm93cygpIDwgMSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IG1heENvdW50ID0gMTAwMDA7XG4gIGNvbnN0IHNhbXBsZVJhd0ZlYXR1cmVzID1cbiAgICBkYXRhQ29udGFpbmVyLm51bVJvd3MoKSA+IG1heENvdW50XG4gICAgICA/IGdldFNhbXBsZUNvbnRhaW5lckRhdGEoZGF0YUNvbnRhaW5lciwgbWF4Q291bnQpXG4gICAgICA6IGRhdGFDb250YWluZXI7XG5cbiAgY29uc3QgZmVhdHVyZXM6IEZlYXR1cmU8R2VvbWV0cnksIEdlb0pzb25Qcm9wZXJ0aWVzPltdID0gc2FtcGxlUmF3RmVhdHVyZXNcbiAgICAubWFwSW5kZXgoZmllbGQudmFsdWVBY2Nlc3NvcilcbiAgICAubWFwKHBhcnNlR2VvSnNvblJhd0ZlYXR1cmUpXG4gICAgLmZpbHRlcihub3ROdWxsb3JVbmRlZmluZWQpO1xuICBjb25zdCBmZWF0dXJlVHlwZXMgPSBnZXRHZW9qc29uRmVhdHVyZVR5cGVzKGZlYXR1cmVzKTtcblxuICAvLyBjb25kaXRpb24gMTogY29udGFpbiBsaW5lIHN0cmluZ1xuICBpZiAoIWZlYXR1cmVUeXBlcy5saW5lKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gY29uZGl0aW9uIDI6c2FtcGxlIGxpbmUgc3RyaW5ncyBjb250YWluIDQgY29vcmRpbmF0ZXNcbiAgaWYgKCFjb29yZEhhc0xlbmd0aDQoZmVhdHVyZXMpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gY29uZGl0aW9uIDM6dGhlIDR0aCBjb29yZGluYXRlIG9mIHRoZSBmaXJzdCBmZWF0dXJlIGxpbmUgc3RyaW5ncyBpcyB2YWxpZCB0aW1lXG4gIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgY29uc3QgdHNIb2xkZXIgPSBmZWF0dXJlc1swXS5nZW9tZXRyeS5jb29yZGluYXRlcy5tYXAoY29vcmQgPT4gY29vcmRbM10pO1xuXG4gIHJldHVybiBCb29sZWFuKGNvbnRhaW5WYWxpZFRpbWUodHNIb2xkZXIpKTtcbn1cblxuLyoqXG4gKiBHZXQgdW5peCB0aW1lc3RhbXAgZnJvbSBhbmltYXRhYmxlIGdlb2pzb24gZm9yIGRlY2suZ2wgdHJpcCBsYXllclxuICogQHBhcmFtIGRhdGFUb0ZlYXR1cmUgYXJyYXkgb2YgZ2VvanNvbiBmZWF0dXJlIG9iamVjdHMsIGNhbiBiZSBudWxsXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VUcmlwR2VvSnNvblRpbWVzdGFtcChkYXRhVG9GZWF0dXJlOiBhbnlbXSkge1xuICAvLyBBbmFseXplIHR5cGUgYmFzZWQgb24gY29vcmRpbmF0ZXMgb2YgdGhlIDFzdCBsaW5lU3RyaW5nXG4gIC8vIHNlbGVjdCBhIHNhbXBsZSB0cmlwIHRvIGFuYWx5emUgdGltZSBmb3JtYXRcbiAgY29uc3QgZW1wdHkgPSB7ZGF0YVRvVGltZVN0YW1wOiBbXSwgYW5pbWF0aW9uRG9tYWluOiBudWxsfTtcbiAgY29uc3Qgc2FtcGxlVHJpcCA9IGRhdGFUb0ZlYXR1cmUuZmluZChmID0+IGY/Lmdlb21ldHJ5Py5jb29yZGluYXRlcz8uWzBdPy5sZW5ndGggPiAzKTtcblxuICAvLyBpZiBubyB2YWxpZCBnZW9tZXRyeVxuICBpZiAoIXNhbXBsZVRyaXApIHtcbiAgICByZXR1cm4gZW1wdHk7XG4gIH1cblxuICBjb25zdCBhbmFseXplZFR5cGUgPSBjb250YWluVmFsaWRUaW1lKHNhbXBsZVRyaXAuZ2VvbWV0cnkuY29vcmRpbmF0ZXMubWFwKGNvb3JkID0+IGNvb3JkWzNdKSk7XG5cbiAgaWYgKCFhbmFseXplZFR5cGUpIHtcbiAgICByZXR1cm4gZW1wdHk7XG4gIH1cblxuICBjb25zdCB7Zm9ybWF0fSA9IGFuYWx5emVkVHlwZTtcbiAgY29uc3QgZ2V0VGltZVZhbHVlID0gY29vcmQgPT5cbiAgICBjb29yZCAmJiBub3ROdWxsb3JVbmRlZmluZWQoY29vcmRbM10pID8gdGltZVRvVW5peE1pbGxpKGNvb3JkWzNdLCBmb3JtYXQpIDogbnVsbDtcblxuICBjb25zdCBkYXRhVG9UaW1lU3RhbXA6IG51bWJlcltdW10gPSBkYXRhVG9GZWF0dXJlLm1hcChmID0+XG4gICAgZiAmJiBmLmdlb21ldHJ5ICYmIEFycmF5LmlzQXJyYXkoZi5nZW9tZXRyeS5jb29yZGluYXRlcylcbiAgICAgID8gZi5nZW9tZXRyeS5jb29yZGluYXRlcy5tYXAoZ2V0VGltZVZhbHVlKVxuICAgICAgOiBudWxsXG4gICk7XG5cbiAgY29uc3QgYW5pbWF0aW9uRG9tYWluID0gZ2V0QW5pbWF0aW9uRG9tYWluRnJvbVRpbWVzdGFtcHMoZGF0YVRvVGltZVN0YW1wKTtcblxuICByZXR1cm4ge2RhdGFUb1RpbWVTdGFtcCwgYW5pbWF0aW9uRG9tYWlufTtcbn1cblxuZnVuY3Rpb24gZmluZE1pbkZyb21Tb3J0ZWQobGlzdDogbnVtYmVyW10pIHtcbiAgLy8gY2hlY2sgaWYgbGlzdCBpcyBudWxsIHNpbmNlIHRoZSBkZWZhdWx0IHZhbHVlIFtdIHdpbGwgb25seSBiZSBhcHBsaWVkIHdoZW4gdGhlIHBhcmFtIGlzIHVuZGVmaW5lZFxuICByZXR1cm4gbGlzdD8uZmluZChkID0+IG5vdE51bGxvclVuZGVmaW5lZChkKSAmJiBOdW1iZXIuaXNGaW5pdGUoZCkpIHx8IG51bGw7XG59XG5cbmZ1bmN0aW9uIGZpbmRNYXhGcm9tU29ydGVkKGxpc3Q6IG51bWJlcltdID0gW10pIHtcbiAgbGV0IGkgPSBsaXN0Lmxlbmd0aCAtIDE7XG4gIHdoaWxlIChpID4gMCkge1xuICAgIGlmIChub3ROdWxsb3JVbmRlZmluZWQobGlzdFtpXSkgJiYgTnVtYmVyLmlzRmluaXRlKGxpc3RbaV0pKSB7XG4gICAgICByZXR1cm4gbGlzdFtpXTtcbiAgICB9XG4gICAgaS0tO1xuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0QW5pbWF0aW9uRG9tYWluRnJvbVRpbWVzdGFtcHMoZGF0YVRvVGltZVN0YW1wOiBudW1iZXJbXVtdID0gW10pIHtcbiAgcmV0dXJuIGRhdGFUb1RpbWVTdGFtcC5yZWR1Y2UoXG4gICAgKGFjY3U6IFtudW1iZXIsIG51bWJlcl0sIHRzcykgPT4ge1xuICAgICAgY29uc3QgdHNNaW4gPSBmaW5kTWluRnJvbVNvcnRlZCh0c3MpO1xuICAgICAgY29uc3QgdHNNYXggPSBmaW5kTWF4RnJvbVNvcnRlZCh0c3MpO1xuICAgICAgaWYgKFxuICAgICAgICBub3ROdWxsb3JVbmRlZmluZWQodHNNaW4pICYmXG4gICAgICAgIG5vdE51bGxvclVuZGVmaW5lZCh0c01heCkgJiZcbiAgICAgICAgTnVtYmVyLmlzRmluaXRlKHRzTWluKSAmJlxuICAgICAgICBOdW1iZXIuaXNGaW5pdGUodHNNYXgpXG4gICAgICApIHtcbiAgICAgICAgYWNjdVswXSA9IE1hdGgubWluKGFjY3VbMF0sIHRzTWluKTtcbiAgICAgICAgYWNjdVsxXSA9IE1hdGgubWF4KGFjY3VbMV0sIHRzTWF4KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhY2N1O1xuICAg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