UNPKG

kepler.gl.geoiq

Version:

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

174 lines (139 loc) 17.3 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.featureToDeckGlGeoType = void 0; exports.getGeojsonBounds = getGeojsonBounds; exports.getGeojsonDataMaps = getGeojsonDataMaps; exports.getGeojsonFeatureTypes = getGeojsonFeatureTypes; exports.parseGeoJsonRawFeature = parseGeoJsonRawFeature; exports.parseGeometryFromString = parseGeometryFromString; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof")); var _wellknown = _interopRequireDefault(require("wellknown")); var _geojsonNormalize = _interopRequireDefault(require("@mapbox/geojson-normalize")); var _bbox = _interopRequireDefault(require("@turf/bbox")); var _dataUtils = require("../../utils/data-utils"); function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } function parseGeoJsonRawFeature(rawFeature) { if ((0, _typeof2["default"])(rawFeature) === 'object') { // Support GeoJson feature as object // probably need to normalize it as well var normalized = (0, _geojsonNormalize["default"])(rawFeature); if (!normalized || !Array.isArray(normalized.features)) { // fail to normalize GeoJson return null; } return normalized.features[0]; } else if (typeof rawFeature === 'string') { return parseGeometryFromString(rawFeature); } else if (Array.isArray(rawFeature)) { // Support GeoJson LineString as an array of points return { type: 'Feature', geometry: { // why do we need to flip it... coordinates: rawFeature.map(function (pts) { return [pts[1], pts[0]]; }), type: 'LineString' } }; } return null; } /** * Parse raw data to GeoJson feature * @param allData * @param getFeature * @returns {{}} */ function getGeojsonDataMaps(allData, getFeature) { var acceptableTypes = ['Point', 'MultiPoint', 'LineString', 'MultiLineString', 'Polygon', 'MultiPolygon', 'GeometryCollection']; var dataToFeature = []; for (var index = 0; index < allData.length; index++) { var feature = parseGeoJsonRawFeature(getFeature(allData[index])); if (feature && feature.geometry && acceptableTypes.includes(feature.geometry.type)) { // store index of the data in feature properties feature.properties = _objectSpread(_objectSpread({}, feature.properties || {}), {}, { index: index }); dataToFeature[index] = feature; } } return dataToFeature; } /** * Parse geojson from string * @param {String} geoString * @returns {null | Object} geojson object or null if failed */ function parseGeometryFromString(geoString) { var parsedGeo; // try parse as geojson string // {"type":"Polygon","coordinates":[[[-74.158491,40.83594]]]} try { parsedGeo = JSON.parse(geoString); } catch (e) {} // keep trying to parse // try parse as wkt if (!parsedGeo) { try { parsedGeo = (0, _wellknown["default"])(geoString); } catch (e) { return null; } } if (!parsedGeo) { return null; } var normalized = (0, _geojsonNormalize["default"])(parsedGeo); if (!normalized || !Array.isArray(normalized.features)) { // fail to normalize geojson return null; } return normalized.features[0]; } function getGeojsonBounds() { var features = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; // 70 ms for 10,000 polygons // here we only pick couple var maxCount = 10000; var samples = features.length > maxCount ? (0, _dataUtils.getSampleData)(features, maxCount) : features; var nonEmpty = samples.filter(function (d) { return d && d.geometry && d.geometry.coordinates && d.geometry.coordinates.length; }); try { return (0, _bbox["default"])({ type: 'FeatureCollection', features: nonEmpty }); } catch (e) { return null; } } var featureToDeckGlGeoType = exports.featureToDeckGlGeoType = { Point: 'point', MultiPoint: 'point', LineString: 'line', MultiLineString: 'line', Polygon: 'polygon', MultiPolygon: 'polygon' }; /** * Parse geojson from string * @param {Array<Object>} allFeatures * @returns {Object} mapping of feature type existence */ function getGeojsonFeatureTypes(allFeatures) { var featureTypes = {}; for (var f = 0; f < allFeatures.length; f++) { var feature = allFeatures[f]; var geoType = featureToDeckGlGeoType[feature && feature.geometry && feature.geometry.type]; if (geoType) { featureTypes[geoType] = true; } } return featureTypes; } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9sYXllcnMvZ2VvanNvbi1sYXllci9nZW9qc29uLXV0aWxzLmpzIl0sIm5hbWVzIjpbInBhcnNlR2VvSnNvblJhd0ZlYXR1cmUiLCJyYXdGZWF0dXJlIiwibm9ybWFsaXplZCIsIkFycmF5IiwiaXNBcnJheSIsImZlYXR1cmVzIiwicGFyc2VHZW9tZXRyeUZyb21TdHJpbmciLCJ0eXBlIiwiZ2VvbWV0cnkiLCJjb29yZGluYXRlcyIsIm1hcCIsInB0cyIsImdldEdlb2pzb25EYXRhTWFwcyIsImFsbERhdGEiLCJnZXRGZWF0dXJlIiwiYWNjZXB0YWJsZVR5cGVzIiwiZGF0YVRvRmVhdHVyZSIsImluZGV4IiwibGVuZ3RoIiwiZmVhdHVyZSIsImluY2x1ZGVzIiwicHJvcGVydGllcyIsImdlb1N0cmluZyIsInBhcnNlZEdlbyIsIkpTT04iLCJwYXJzZSIsImUiLCJnZXRHZW9qc29uQm91bmRzIiwibWF4Q291bnQiLCJzYW1wbGVzIiwibm9uRW1wdHkiLCJmaWx0ZXIiLCJkIiwiZmVhdHVyZVRvRGVja0dsR2VvVHlwZSIsIlBvaW50IiwiTXVsdGlQb2ludCIsIkxpbmVTdHJpbmciLCJNdWx0aUxpbmVTdHJpbmciLCJQb2x5Z29uIiwiTXVsdGlQb2x5Z29uIiwiZ2V0R2VvanNvbkZlYXR1cmVUeXBlcyIsImFsbEZlYXR1cmVzIiwiZmVhdHVyZVR5cGVzIiwiZiIsImdlb1R5cGUiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW9CQTs7QUFDQTs7QUFDQTs7QUFFQTs7Ozs7O0FBRU8sU0FBU0Esc0JBQVQsQ0FBZ0NDLFVBQWhDLEVBQTRDO0FBQ2pELE1BQUkseUJBQU9BLFVBQVAsTUFBc0IsUUFBMUIsRUFBb0M7QUFDbEM7QUFDQTtBQUNBLFFBQU1DLFVBQVUsR0FBRyxrQ0FBVUQsVUFBVixDQUFuQjs7QUFDQSxRQUFJLENBQUNDLFVBQUQsSUFBZSxDQUFDQyxLQUFLLENBQUNDLE9BQU4sQ0FBY0YsVUFBVSxDQUFDRyxRQUF6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M0I7QUFDQSxRQUFNQyxPQUFPLEdBQ1hYLHNCQUFzQixDQUNwQmQsT0FBTyxJQUFJQSxPQUFPLENBQUNYLFFBQW5CLElBQStCVyxPQUFPLENBQUNYLFFBQVIsQ0FBaUJELElBRDVCLENBRHhCOztBQUlBLFFBQUlxQyxPQUFKLEVBQWE7QUFDWEYsTUFBQUEsWUFBWSxDQUFDRSxPQUFELENBQVosR0FBd0IsSUFBeEI7QUFDRDtBQUNGOztBQUVELFNBQU9GLFlBQVA7QUFDRCIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAoYykgMjAyMyBVYmVyIFRlY2hub2xvZ2llcywgSW5jLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbi8vIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbi8vIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbi8vIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbi8vIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuLy8gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuLy8gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4vLyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbi8vIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbi8vIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4vLyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG4vLyBUSEUgU09GVFdBUkUuXG5cbmltcG9ydCB3a3RQYXJzZXIgZnJvbSAnd2VsbGtub3duJztcbmltcG9ydCBub3JtYWxpemUgZnJvbSAnQG1hcGJveC9nZW9qc29uLW5vcm1hbGl6ZSc7XG5pbXBvcnQgYmJveCBmcm9tICdAdHVyZi9iYm94JztcblxuaW1wb3J0IHtnZXRTYW1wbGVEYXRhfSBmcm9tICd1dGlscy9kYXRhLXV0aWxzJztcblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlR2VvSnNvblJhd0ZlYXR1cmUocmF3RmVhdHVyZSkge1xuICBpZiAodHlwZW9mIHJhd0ZlYXR1cmUgPT09ICdvYmplY3QnKSB7XG4gICAgLy8gU3VwcG9ydCBHZW9Kc29uIGZlYXR1cmUgYXMgb2JqZWN0XG4gICAgLy8gcHJvYmFibHkgbmVlZCB0byBub3JtYWxpemUgaXQgYXMgd2VsbFxuICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBub3JtYWxpemUocmF3RmVhdHVyZSk7XG4gICAgaWYgKCFub3JtYWxpemVkIHx8ICFBcnJheS5pc0FycmF5KG5vcm1hbGl6ZWQuZmVhdHVyZXMpKSB7XG4gICAgICAvLyBmYWlsIHRvIG5vcm1hbGl6ZSBHZW9Kc29uXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gbm9ybWFsaXplZC5mZWF0dXJlc1swXTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgcmF3RmVhdHVyZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gcGFyc2VHZW9tZXRyeUZyb21TdHJpbmcocmF3RmVhdHVyZSk7XG4gIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShyYXdGZWF0dXJlKSkge1xuICAgIC8vIFN1cHBvcnQgR2VvSnNvbiAgTGluZVN0cmluZyBhcyBhbiBhcnJheSBvZiBwb2ludHNcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogJ0ZlYXR1cmUnLFxuICAgICAgZ2VvbWV0cnk6IHtcbiAgICAgICAgLy8gd2h5IGRvIHdlIG5lZWQgdG8gZmxpcCBpdC4uLlxuICAgICAgICBjb29yZGluYXRlczogcmF3RmVhdHVyZS5tYXAocHRzID0+IFtwdHNbMV0sIHB0c1swXV0pLFxuICAgICAgICB0eXBlOiAnTGluZVN0cmluZydcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG4vKipcbiAqIFBhcnNlIHJhdyBkYXRhIHRvIEdlb0pzb24gZmVhdHVyZVxuICogQHBhcmFtIGFsbERhdGFcbiAqIEBwYXJhbSBnZXRGZWF0dXJlXG4gKiBAcmV0dXJucyB7e319XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRHZW9qc29uRGF0YU1hcHMoYWxsRGF0YSwgZ2V0RmVhdHVyZSkge1xuICBjb25zdCBhY2NlcHRhYmxlVHlwZXMgPSBbXG4gICAgJ1BvaW50JyxcbiAgICAnTXVsdGlQb2ludCcsXG4gICAgJ0xpbmVTdHJpbmcnLFxuICAgICdNdWx0aUxpbmVTdHJpbmcnLFxuICAgICdQb2x5Z29uJyxcbiAgICAnTXVsdGlQb2x5Z29uJyxcbiAgICAnR2VvbWV0cnlDb2xsZWN0aW9uJ1xuICBdO1xuXG4gIGNvbnN0IGRhdGFUb0ZlYXR1cmUgPSBbXTtcblxuICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgYWxsRGF0YS5sZW5ndGg7IGluZGV4KyspIHtcbiAgICBjb25zdCBmZWF0dXJlID0gcGFyc2VHZW9Kc29uUmF3RmVhdHVyZShnZXRGZWF0dXJlKGFsbERhdGFbaW5kZXhdKSk7XG5cbiAgICBpZiAoXG4gICAgICBmZWF0dXJlICYmXG4gICAgICBmZWF0dXJlLmdlb21ldHJ5ICYmXG4gICAgICBhY2NlcHRhYmxlVHlwZXMuaW5jbHVkZXMoZmVhdHVyZS5nZW9tZXRyeS50eXBlKVxuICAgICkge1xuICAgICAgLy8gc3RvcmUgaW5kZXggb2YgdGhlIGRhdGEgaW4gZmVhdHVyZSBwcm9wZXJ0aWVzXG4gICAgICBmZWF0dXJlLnByb3BlcnRpZXMgPSB7XG4gICAgICAgIC4uLihmZWF0dXJlLnByb3BlcnRpZXMgfHwge30pLFxuICAgICAgICBpbmRleFxuICAgICAgfTtcblxuICAgICAgZGF0YVRvRmVhdHVyZVtpbmRleF0gPSBmZWF0dXJlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBkYXRhVG9GZWF0dXJlO1xufVxuXG4vKipcbiAqIFBhcnNlIGdlb2pzb24gZnJvbSBzdHJpbmdcbiAqIEBwYXJhbSB7U3RyaW5nfSBnZW9TdHJpbmdcbiAqIEByZXR1cm5zIHtudWxsIHwgT2JqZWN0fSBnZW9qc29uIG9iamVjdCBvciBudWxsIGlmIGZhaWxlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VHZW9tZXRyeUZyb21TdHJpbmcoZ2VvU3RyaW5nKSB7XG4gIGxldCBwYXJzZWRHZW87XG5cbiAgLy8gdHJ5IHBhcnNlIGFzIGdlb2pzb24gc3RyaW5nXG4gIC8vIHtcInR5cGVcIjpcIlBvbHlnb25cIixcImNvb3JkaW5hdGVzXCI6W1tbLTc0LjE1ODQ5MSw0MC44MzU5NF1dXX1cbiAgdHJ5IHtcbiAgICBwYXJzZWRHZW8gPSBKU09OLnBhcnNlKGdlb1N0cmluZyk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBrZWVwIHRyeWluZyB0byBwYXJzZVxuICB9XG5cbiAgLy8gdHJ5IHBhcnNlIGFzIHdrdFxuICBpZiAoIXBhcnNlZEdlbykge1xuICAgIHRyeSB7XG4gICAgICBwYXJzZWRHZW8gPSB3a3RQYXJzZXIoZ2VvU3RyaW5nKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICBpZiAoIXBhcnNlZEdlbykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3Qgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZShwYXJzZWRHZW8pO1xuXG4gIGlmICghbm9ybWFsaXplZCB8fCAhQXJyYXkuaXNBcnJheShub3JtYWxpemVkLmZlYXR1cmVzKSkge1xuICAgIC8vIGZhaWwgdG8gbm9ybWFsaXplIGdlb2pzb25cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiBub3JtYWxpemVkLmZlYXR1cmVzWzBdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0R2VvanNvbkJvdW5kcyhmZWF0dXJlcyA9IFtdKSB7XG4gIC8vIDcwIG1zIGZvciAxMCwwMDAgcG9seWdvbnNcbiAgLy8gaGVyZSB3ZSBvbmx5IHBpY2sgY291cGxlXG4gIGNvbnN0IG1heENvdW50ID0gMTAwMDA7XG4gIGNvbnN0IHNhbXBsZXMgPVxuICAgIGZlYXR1cmVzLmxlbmd0aCA+IG1heENvdW50ID8gZ2V0U2FtcGxlRGF0YShmZWF0dXJlcywgbWF4Q291bnQpIDogZmVhdHVyZXM7XG5cbiAgY29uc3Qgbm9uRW1wdHkgPSBzYW1wbGVzLmZpbHRlcihcbiAgICBkID0+XG4gICAgICBkICYmIGQuZ2VvbWV0cnkgJiYgZC5nZW9tZXRyeS5jb29yZGluYXRlcyAmJiBkLmdlb21ldHJ5LmNvb3JkaW5hdGVzLmxlbmd0aFxuICApO1xuXG4gIHRyeSB7XG4gICAgcmV0dXJuIGJib3goe1xuICAgICAgdHlwZTogJ0ZlYXR1cmVDb2xsZWN0aW9uJyxcbiAgICAgIGZlYXR1cmVzOiBub25FbXB0eVxuICAgIH0pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGZlYXR1cmVUb0RlY2tHbEdlb1R5cGUgPSB7XG4gIFBvaW50OiAncG9pbnQnLFxuICBNdWx0aVBvaW50OiAncG9pbnQnLFxuICBMaW5lU3RyaW5nOiAnbGluZScsXG4gIE11bHRpTGluZVN0cmluZzogJ2xpbmUnLFxuICBQb2x5Z29uOiAncG9seWdvbicsXG4gIE11bHRpUG9seWdvbjogJ3BvbHlnb24nXG59O1xuXG4vKipcbiAqIFBhcnNlIGdlb2pzb24gZnJvbSBzdHJpbmdcbiAqIEBwYXJhbSB7QXJyYXk8T2JqZWN0Pn0gYWxsRmVhdHVyZXNcbiAqIEByZXR1cm5zIHtPYmplY3R9IG1hcHBpbmcgb2YgZmVhdHVyZSB0eXBlIGV4aXN0ZW5jZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0R2VvanNvbkZlYXR1cmVUeXBlcyhhbGxGZWF0dXJlcykge1xuICBjb25zdCBmZWF0dXJlVHlwZXMgPSB7fTtcbiAgZm9yIChsZXQgZiA9IDA7IGYgPCBhbGxGZWF0dXJlcy5sZW5ndGg7IGYrKykge1xuICAgIGNvbnN0IGZlYXR1cmUgPSBhbGxGZWF0dXJlc1tmXTtcbiAgICBjb25zdCBnZW9UeXBlID1cbiAgICAgIGZlYXR1cmVUb0RlY2tHbEdlb1R5cGVbXG4gICAgICAgIGZlYXR1cmUgJiYgZmVhdHVyZS5nZW9tZXRyeSAmJiBmZWF0dXJlLmdlb21ldHJ5LnR5cGVcbiAgICAgIF07XG4gICAgaWYgKGdlb1R5cGUpIHtcbiAgICAgIGZlYXR1cmVUeXBlc1tnZW9UeXBlXSA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZlYXR1cmVUeXBlcztcbn1cbiJdfQ==