kepler.gl.geoiq
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
130 lines (106 loc) • 13 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.determineJsonProcess = determineJsonProcess;
exports.getFileHandler = getFileHandler;
exports.getFileType = getFileType;
exports.isKeplerGlMap = isKeplerGlMap;
exports.loadCsv = loadCsv;
exports.loadGeoJSON = loadGeoJSON;
exports.loadJSON = loadJSON;
var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
var _window = require("global/window");
var _dataProcessor = require("./data-processor");
// Copyright (c) 2023 Uber Technologies, Inc.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
var FILE_HANDLERS = {
csv: loadCsv,
json: loadJSON,
geojson: loadGeoJSON
};
function getFileHandler(fileBlob) {
// console.log('fileBlob name inside getFileHandler', fileBlob.name);
var type = 'json'; // const type = getFileType(fileBlob.name);
return fileBlob.fileType === 'geojson' ? FILE_HANDLERS[fileBlob.fileType] : FILE_HANDLERS[type];
}
function getFileType(filename) {
if (filename.endsWith('csv')) {
return 'csv';
} else if (filename.endsWith('json') || filename.endsWith('geojson')) {
// Read GeoJson from browser
return 'json';
} // Wait to add other file type handler
return 'other';
}
function readCSVFile(fileBlob) {
return new Promise(function (resolve, reject) {
var fileReader = new _window.FileReader();
fileReader.onload = function (_ref) {
var result = _ref.target.result;
resolve(result);
};
fileReader.readAsText(fileBlob);
});
}
function loadCsv(fileBlob) {
var processor = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _dataProcessor.processCsvData;
return readCSVFile(fileBlob).then(function (rawData) {
return rawData ? processor(rawData) : null;
});
}
function readJSONFile(fileBlob) {
return new Promise(function (resolve, reject) {
var fileReader = new _window.FileReader();
fileReader.onload = function (_ref2) {
var result = _ref2.target.result;
try {
var json = JSON.parse(result);
resolve(json);
} catch (err) {
resolve(null);
}
};
fileReader.readAsText(fileBlob);
});
}
function isKeplerGlMap(json) {
return (0, _typeof2["default"])(json) === 'object' && json.datasets && json.config && json.info && json.info.app === 'kepler.gl';
}
function determineJsonProcess(jsonData, defaultProcessor) {
if (isKeplerGlMap(jsonData)) {
return _dataProcessor.processKeplerglJSON;
}
return defaultProcessor;
}
function loadJSON(fileBlob) {
var processor = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _dataProcessor.processGeojson;
return readJSONFile(fileBlob).then(function (rawData) {
return rawData ? determineJsonProcess(rawData, processor)(rawData) : null;
});
}
function loadGeoJSON(fileBlob) {
var processor = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _dataProcessor.processGeojson;
return readJSONFile(fileBlob).then(function (rawData) {
return rawData ? processor(rawData, true) : null;
});
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wcm9jZXNzb3JzL2ZpbGUtaGFuZGxlci5qcyJdLCJuYW1lcyI6WyJGSUxFX0hBTkRMRVJTIiwiY3N2IiwibG9hZENzdiIsImpzb24iLCJsb2FkSlNPTiIsImdlb2pzb24iLCJsb2FkR2VvSlNPTiIsImdldEZpbGVIYW5kbGVyIiwiZmlsZUJsb2IiLCJ0eXBlIiwiZmlsZVR5cGUiLCJnZXRGaWxlVHlwZSIsImZpbGVuYW1lIiwiZW5kc1dpdGgiLCJyZWFkQ1NWRmlsZSIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0IiwiZmlsZVJlYWRlciIsIkZpbGVSZWFkZXIiLCJvbmxvYWQiLCJyZXN1bHQiLCJ0YXJnZXQiLCJyZWFkQXNUZXh0IiwicHJvY2Vzc29yIiwicHJvY2Vzc0NzdkRhdGEiLCJ0aGVuIiwicmF3RGF0YSIsInJlYWRKU09ORmlsZSIsIkpTT04iLCJwYXJzZSIsImVyciIsImlzS2VwbGVyR2xNYXAiLCJkYXRhc2V0cyIsImNvbmZpZyIsImluZm8iLCJhcHAiLCJkZXRlcm1pbmVKc29uUHJvY2VzcyIsImpzb25EYXRhIiwiZGVmYXVsdFByb2Nlc3NvciIsInByb2Nlc3NLZXBsZXJnbEpTT04iLCJwcm9jZXNzR2VvanNvbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFvQkE7O0FBQ0E7O0FBckJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBU0EsSUFBTUEsYUFBYSxHQUFHO0FBQ3BCQyxFQUFBQSxHQUFHLEVBQUVDLE9BRGU7QUFFcEJDLEVBQUFBLElBQUksRUFBRUMsUUFGYztBQUdwQkMsRUFBQUEsT0FBTyxFQUFFQztBQUhXLENBQXRCOztBQU1PLFNBQVNDLGNBQVQsQ0FBd0JDLFFBQXhCLEVBQWtDO0FBQ3ZDO0FBQ0EsTUFBTUMsSUFBSSxHQUFHLE1BQWIsQ0FGdUMsQ0FHdkM7O0FBQ0Es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QixDQUE0QixVQUFBQyxPQUFPO0FBQUEsV0FDeENBLE9BQU8sR0FBR1Usb0JBQW9CLENBQUNWLE9BQUQsRUFBVUgsU0FBVixDQUFwQixDQUF5Q0csT0FBekMsQ0FBSCxHQUF1RCxJQUR0QjtBQUFBLEdBQW5DLENBQVA7QUFHRDs7QUFFTSxTQUFTckIsV0FBVCxDQUFxQkUsUUFBckIsRUFBMkQ7QUFBQSxNQUE1QmdCLFNBQTRCLHVFQUFoQmlCLDZCQUFnQjtBQUNoRSxTQUFPYixZQUFZLENBQUNwQixRQUFELENBQVosQ0FBdUJrQixJQUF2QixDQUE0QixVQUFBQyxPQUFPO0FBQUEsV0FDeENBLE9BQU8sR0FBR0gsU0FBUyxDQUFDRyxPQUFELEVBQVUsSUFBVixDQUFaLEdBQThCLElBREc7QUFBQSxHQUFuQyxDQUFQO0FBR0QiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgKGMpIDIwMjMgVWJlciBUZWNobm9sb2dpZXMsIEluYy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4vLyBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4vLyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4vLyBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4vLyBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4vLyBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuLy8gT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuLy8gVEhFIFNPRlRXQVJFLlxuXG5pbXBvcnQge0ZpbGVSZWFkZXJ9IGZyb20gJ2dsb2JhbC93aW5kb3cnO1xuaW1wb3J0IHtcbiAgcHJvY2Vzc0NzdkRhdGEsXG4gIHByb2Nlc3NHZW9qc29uLFxuICBwcm9jZXNzS2VwbGVyZ2xKU09OXG59IGZyb20gJy4vZGF0YS1wcm9jZXNzb3InO1xuXG5jb25zdCBGSUxFX0hBTkRMRVJTID0ge1xuICBjc3Y6IGxvYWRDc3YsXG4gIGpzb246IGxvYWRKU09OLFxuICBnZW9qc29uOiBsb2FkR2VvSlNPTlxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldEZpbGVIYW5kbGVyKGZpbGVCbG9iKSB7XG4gIC8vIGNvbnNvbGUubG9nKCdmaWxlQmxvYiBuYW1lIGluc2lkZSBnZXRGaWxlSGFuZGxlcicsIGZpbGVCbG9iLm5hbWUpO1xuICBjb25zdCB0eXBlID0gJ2pzb24nO1xuICAvLyBjb25zdCB0eXBlID0gZ2V0RmlsZVR5cGUoZmlsZUJsb2IubmFtZSk7XG4gIHJldHVybiBmaWxlQmxvYi5maWxlVHlwZSA9PT0gJ2dlb2pzb24nXG4gICAgPyBGSUxFX0hBTkRMRVJTW2ZpbGVCbG9iLmZpbGVUeXBlXVxuICAgIDogRklMRV9IQU5ETEVSU1t0eXBlXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEZpbGVUeXBlKGZpbGVuYW1lKSB7XG4gIGlmIChmaWxlbmFtZS5lbmRzV2l0aCgnY3N2JykpIHtcbiAgICByZXR1cm4gJ2Nzdic7XG4gIH0gZWxzZSBpZiAoZmlsZW5hbWUuZW5kc1dpdGgoJ2pzb24nKSB8fCBmaWxlbmFtZS5lbmRzV2l0aCgnZ2VvanNvbicpKSB7XG4gICAgLy8gUmVhZCBHZW9Kc29uIGZyb20gYnJvd3NlclxuICAgIHJldHVybiAnanNvbic7XG4gIH1cblxuICAvLyBXYWl0IHRvIGFkZCBvdGhlciBmaWxlIHR5cGUgaGFuZGxlclxuICByZXR1cm4gJ290aGVyJztcbn1cblxuZnVuY3Rpb24gcmVhZENTVkZpbGUoZmlsZUJsb2IpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCBmaWxlUmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICBmaWxlUmVhZGVyLm9ubG9hZCA9ICh7dGFyZ2V0OiB7cmVzdWx0fX0pID0+IHtcbiAgICAgIHJlc29sdmUocmVzdWx0KTtcbiAgICB9O1xuXG4gICAgZmlsZVJlYWRlci5yZWFkQXNUZXh0KGZpbGVCbG9iKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBsb2FkQ3N2KGZpbGVCbG9iLCBwcm9jZXNzb3IgPSBwcm9jZXNzQ3N2RGF0YSkge1xuICByZXR1cm4gcmVhZENTVkZpbGUoZmlsZUJsb2IpLnRoZW4ocmF3RGF0YSA9PlxuICAgIHJhd0RhdGEgPyBwcm9jZXNzb3IocmF3RGF0YSkgOiBudWxsXG4gICk7XG59XG5cbmZ1bmN0aW9uIHJlYWRKU09ORmlsZShmaWxlQmxvYikge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IGZpbGVSZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgIGZpbGVSZWFkZXIub25sb2FkID0gKHt0YXJnZXQ6IHtyZXN1bHR9fSkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QganNvbiA9IEpTT04ucGFyc2UocmVzdWx0KTtcbiAgICAgICAgcmVzb2x2ZShqc29uKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICByZXNvbHZlKG51bGwpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBmaWxlUmVhZGVyLnJlYWRBc1RleHQoZmlsZUJsb2IpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzS2VwbGVyR2xNYXAoanNvbikge1xuICByZXR1cm4gKFxuICAgIHR5cGVvZiBqc29uID09PSAnb2JqZWN0JyAmJlxuICAgIGpzb24uZGF0YXNldHMgJiZcbiAgICBqc29uLmNvbmZpZyAmJlxuICAgIGpzb24uaW5mbyAmJlxuICAgIGpzb24uaW5mby5hcHAgPT09ICdrZXBsZXIuZ2wnXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZXRlcm1pbmVKc29uUHJvY2Vzcyhqc29uRGF0YSwgZGVmYXVsdFByb2Nlc3Nvcikge1xuICBpZiAoaXNLZXBsZXJHbE1hcChqc29uRGF0YSkpIHtcbiAgICByZXR1cm4gcHJvY2Vzc0tlcGxlcmdsSlNPTjtcbiAgfVxuXG4gIHJldHVybiBkZWZhdWx0UHJvY2Vzc29yO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbG9hZEpTT04oZmlsZUJsb2IsIHByb2Nlc3NvciA9IHByb2Nlc3NHZW9qc29uKSB7XG4gIHJldHVybiByZWFkSlNPTkZpbGUoZmlsZUJsb2IpLnRoZW4ocmF3RGF0YSA9PlxuICAgIHJhd0RhdGEgPyBkZXRlcm1pbmVKc29uUHJvY2VzcyhyYXdEYXRhLCBwcm9jZXNzb3IpKHJhd0RhdGEpIDogbnVsbFxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbG9hZEdlb0pTT04oZmlsZUJsb2IsIHByb2Nlc3NvciA9IHByb2Nlc3NHZW9qc29uKSB7XG4gIHJldHVybiByZWFkSlNPTkZpbGUoZmlsZUJsb2IpLnRoZW4ocmF3RGF0YSA9PlxuICAgIHJhd0RhdGEgPyBwcm9jZXNzb3IocmF3RGF0YSwgdHJ1ZSkgOiBudWxsXG4gICk7XG59XG4iXX0=