diff --git a/src/components/src/side-panel/layer-panel/layer-configurator.tsx b/src/components/src/side-panel/layer-panel/layer-configurator.tsx index a2c6ab5392..0e87ae6c09 100644 --- a/src/components/src/side-panel/layer-panel/layer-configurator.tsx +++ b/src/components/src/side-panel/layer-panel/layer-configurator.tsx @@ -891,10 +891,6 @@ export default function LayerConfiguratorFactory( ); } - _renderGeoarrowLayerConfig(props) { - return this._renderGeojsonLayerConfig(props); - } - _render3DLayerConfig({layer, visConfiguratorProps}) { return ( diff --git a/src/layers/src/arrow-layer/arrow-layer.ts b/src/layers/src/arrow-layer/arrow-layer.ts deleted file mode 100644 index 3a28568b04..0000000000 --- a/src/layers/src/arrow-layer/arrow-layer.ts +++ /dev/null @@ -1,312 +0,0 @@ -// 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. - -import {BinaryFeatures} from '@loaders.gl/schema'; -import {getBinaryGeometriesFromArrow, parseGeometryFromArrow} from '@loaders.gl/arrow'; -import {GeoJsonLayer as DeckGLGeoJsonLayer} from '@deck.gl/layers'; -import {HIGHLIGH_COLOR_3D} from '@kepler.gl/constants'; -import {KeplerTable} from '@kepler.gl/table'; -import {DataContainerInterface} from '@kepler.gl/utils'; -// import {FilterArrowExtension} from '@kepler.gl/deckgl-layers'; -import GeoJsonLayer, {SUPPORTED_ANALYZER_TYPES} from '../geojson-layer/geojson-layer'; - -export default class ArrowLayer extends GeoJsonLayer { - binaryFeatures: BinaryFeatures[]; // TODO: reuse dataToFeature? - dataContainer: DataContainerInterface | null; - filteredIndex: Uint8ClampedArray | null; - filteredIndexTrigger: number[]; - - // constructor - constructor(props) { - super(props); - - this.dataContainer = null; - this.binaryFeatures = []; - this.filteredIndex = null; - this.filteredIndexTrigger = []; - } - - static findDefaultLayerProps({label, fields = []}: KeplerTable) { - const geoarrowColumns = fields - .filter(f => f.type === 'geoarrow' && SUPPORTED_ANALYZER_TYPES[f.analyzerType]) - .map(f => f.name); - - const defaultColumns = { - geojson: geoarrowColumns - }; - - const foundColumns = this.findDefaultColumnField(defaultColumns, fields); - if (!foundColumns || !foundColumns.length) { - return {props: []}; - } - - return { - props: foundColumns.map(columns => ({ - label: (typeof label === 'string' && label.replace(/\.[^/.]+$/, '')) || this.type, - columns, - isVisible: true - })) - }; - } - - get type() { - return ArrowLayer.type; - } - static get type() { - return 'geoarrow'; - } - - get name() { - return 'GeoArrow'; - } - - get requiredLayerColumns() { - return ['geojson']; - } - - calculateDataAttribute({dataContainer, filteredIndex}, getPosition) { - // TODO: filter arrow table using predicate - // filteredIndex.map(i => this.dataToFeature[i]).filter(d => d); - // filter arrow table by values and make a partial copy of the raw table could be expensive - // so we will use filteredIndex to create an attribute e.g. filtered (bool) for deck.gl layer - if (!this.filteredIndex) { - this.filteredIndex = new Uint8ClampedArray(dataContainer.numRows()); - } - this.filteredIndex.fill(0); - for (let i = 0; i < filteredIndex.length; ++i) { - this.filteredIndex[filteredIndex[i]] = 1; - } - - // this.filteredIndexTrigger = filteredIndex; - this.dataContainer = dataContainer; - return this.binaryFeatures; - } - - formatLayerData(datasets, oldLayerData) { - if (this.config.dataId === null) { - return {}; - } - const {gpuFilter, dataContainer} = datasets[this.config.dataId]; - - // get data from calculateDataAttribute - const {data} = this.updateData(datasets, oldLayerData); - - // deck.gl geojson-layer will use binaryToFeatureForAccesor(data, index) - // to get feature from binary data, and the properties of the feature - // e.g. properties: {index: i} can be used for gpu filter - const customFilterValueAccessor = (dc, d, fieldIndex) => { - return dc.valueAt(d.properties.index, fieldIndex); - }; - const indexAccessor = f => { - return f.properties.index; - }; - - const dataAccessor = dc => d => { - return {index: d.properties.index}; - }; - - const isFilteredAccessor = d => { - return this.filteredIndex ? this.filteredIndex[d.properties.index] : 1; - }; - - const accessors = this.getAttributeAccessors({dataAccessor, dataContainer}); - - // return layerData - return { - data, - getFilterValue: gpuFilter.filterValueAccessor(dataContainer)( - indexAccessor, - customFilterValueAccessor - ), - getFiltered: isFilteredAccessor, - ...accessors - }; - } - - updateLayerMeta(dataContainer: DataContainerInterface) { - this.dataContainer = dataContainer; - const {geojson} = this.config.columns; - - const geoColumn = dataContainer.getColumn?.(geojson.fieldIdx); - const arrowField = dataContainer.getField?.(geojson.fieldIdx); - - const encoding = arrowField?.metadata?.get('ARROW:extension:name'); - // create binary data from arrow data for GeoJsonLayer - const {binaryGeometries, bounds, featureTypes} = getBinaryGeometriesFromArrow( - geoColumn, - encoding - ); - - // append new data from binaryGeometries to this.binaryFeatures - for (let i = this.binaryFeatures.length; i < binaryGeometries.length; ++i) { - this.binaryFeatures.push(binaryGeometries[i]); - } - - console.log(bounds); - // since there is no feature.properties.radius, we set fixedRadius to false - const fixedRadius = false; - this.updateMeta({bounds, fixedRadius, featureTypes}); - } - - isLayerHovered(objectInfo): boolean { - // there could be multiple deck.gl layers created from multiple chunks in arrow table - // the objectInfo.layer id should be `${this.id}-${i}` - if (objectInfo?.picked) { - const deckLayerId = objectInfo?.layer?.props?.id; - return deckLayerId.startsWith(this.id); - } - return false; - } - - hasHoveredObject(objectInfo) { - // hover object returns the index of the object in the data array - // NOTE: this could be done in Deck.gl getPickingInfo(params) and binaryToGeojson() - if (this.isLayerHovered(objectInfo) && objectInfo.index >= 0 && this.dataContainer) { - const {geojson} = this.config.columns; - - const col = this.dataContainer.getColumn?.(geojson.fieldIdx); - const rawGeometry = col?.get(objectInfo.index); - - const field = this.dataContainer.getField?.(geojson.fieldIdx); - const encoding = field?.metadata?.get('ARROW:extension:name'); - - const hoveredFeature = parseGeometryFromArrow({ - encoding, - data: rawGeometry - }); - - const properties = this.dataContainer.rowAsArray(objectInfo.index).reduce((prev, cur, i) => { - if (i !== geojson.fieldIdx) { - const fieldName = this.dataContainer?.getField?.(i).name; - prev[fieldName] = cur; - } - return prev; - }, {}); - - return { - ...hoveredFeature, - properties: { - ...properties, - index: objectInfo.index - } - }; - } - return null; - } - - getHoverData(object, dataContainer) { - // index of dataContainer is saved to feature.properties - const index = object; - if (index >= 0) { - return dataContainer.row(index); - } - return null; - } - - renderLayer(opts) { - const {data: dataProps, gpuFilter, objectHovered, mapState, interactionConfig} = opts; - - const {fixedRadius, featureTypes} = this.meta; - const radiusScale = this.getRadiusScaleByZoom(mapState, fixedRadius); - const zoomFactor = this.getZoomFactor(mapState); - const eleZoomFactor = this.getElevationZoomFactor(mapState); - - const {visConfig} = this.config; - - const layerProps = { - lineWidthScale: visConfig.thickness * zoomFactor * 8, - elevationScale: visConfig.elevationScale * eleZoomFactor, - pointRadiusScale: radiusScale, - lineMiterLimit: 4 - }; - - const updateTriggers = { - ...this.getVisualChannelUpdateTriggers(), - getFilterValue: gpuFilter.filterValueUpdateTriggers, - getFiltered: this.filteredIndexTrigger - }; - - const defaultLayerProps = this.getDefaultDeckLayerProps(opts); - const opaOverwrite = { - opacity: visConfig.strokeOpacity - }; - - const pickable = interactionConfig.tooltip.enabled; - const hoveredObject = this.hasHoveredObject(objectHovered); - const {data, ...props} = dataProps; - - const deckLayers = data.map((d, i) => { - return new DeckGLGeoJsonLayer({ - ...defaultLayerProps, - ...layerProps, - ...props, - data: d, - id: `${this.id}-${i}`, - pickable, - highlightColor: HIGHLIGH_COLOR_3D, - autoHighlight: visConfig.enable3d && pickable, - stroked: visConfig.stroked, - filled: visConfig.filled, - extruded: visConfig.enable3d, - wireframe: visConfig.wireframe, - wrapLongitude: false, - lineMiterLimit: 2, - capRounded: true, - jointRounded: true, - updateTriggers, - // extensions: [...defaultLayerProps.extensions, new FilterArrowExtension()], - _subLayerProps: { - ...(featureTypes?.polygon ? {'polygons-stroke': opaOverwrite} : {}), - ...(featureTypes?.line ? {linestrings: opaOverwrite} : {}), - ...(featureTypes?.point - ? { - points: { - lineOpacity: visConfig.strokeOpacity - } - } - : {}) - } - }); - }); - return [ - ...deckLayers, - // hover layer - ...(hoveredObject && !visConfig.enable3d - ? [ - new DeckGLGeoJsonLayer({ - ...this.getDefaultHoverLayerProps(), - ...layerProps, - visible: defaultLayerProps.visible, - wrapLongitude: false, - data: [hoveredObject], - getLineWidth: dataProps.getLineWidth, - getPointRadius: dataProps.getPointRadius, - getElevation: dataProps.getElevation, - getLineColor: this.config.highlightColor, - getFillColor: this.config.highlightColor, - // always draw outline - stroked: true, - filled: false - }) - ] - : []) - ]; - } -} diff --git a/src/layers/src/geojson-layer/geojson-layer.ts b/src/layers/src/geojson-layer/geojson-layer.ts index e145bb586a..1a6d2363e7 100644 --- a/src/layers/src/geojson-layer/geojson-layer.ts +++ b/src/layers/src/geojson-layer/geojson-layer.ts @@ -419,7 +419,7 @@ export default class GeoJsonLayer extends Layer { const getGeoColumn = geoColumnAccessor(this.config.columns); const getGeoField = geoFieldAccessor(this.config.columns); - if (this.dataToFeature.length === 0) { + // if (this.dataToFeature.length === 0) { const updateLayerMetaFunc = dataContainer instanceof ArrowDataContainer ? getGeojsonLayerMetaFromArrow @@ -431,9 +431,13 @@ export default class GeoJsonLayer extends Layer { getGeoField }); - this.dataToFeature = dataToFeature; + // append new data from binaryGeometries to this.binaryFeatures + for (let i = this.dataToFeature.length; i < dataToFeature.length; ++i) { + this.dataToFeature.push(dataToFeature[i]); + } + // this.dataToFeature = dataToFeature; this.updateMeta({bounds, fixedRadius, featureTypes}); - } + // } } setInitialLayerConfig({dataContainer}) { @@ -497,7 +501,7 @@ export default class GeoJsonLayer extends Layer { const updateTriggers = { ...this.getVisualChannelUpdateTriggers(), getFilterValue: gpuFilter.filterValueUpdateTriggers, - getFiltered: this.filteredIndexTrigger + // getFiltered: this.filteredIndexTrigger }; const defaultLayerProps = this.getDefaultDeckLayerProps(opts); @@ -531,7 +535,7 @@ export default class GeoJsonLayer extends Layer { capRounded: true, jointRounded: true, updateTriggers, - extensions: [...defaultLayerProps.extensions, new FilterArrowExtension()], + // extensions: [...defaultLayerProps.extensions, new FilterArrowExtension()], _subLayerProps: { ...(featureTypes?.polygon ? {'polygons-stroke': opaOverwrite} : {}), ...(featureTypes?.line ? {linestrings: opaOverwrite} : {}), diff --git a/src/layers/src/geojson-layer/geojson-utils.ts b/src/layers/src/geojson-layer/geojson-utils.ts index 217e44b8bf..e965ecde52 100644 --- a/src/layers/src/geojson-layer/geojson-utils.ts +++ b/src/layers/src/geojson-layer/geojson-utils.ts @@ -43,12 +43,6 @@ export enum FeatureTypes { } /* eslint-enable */ - -type RawArrowFeature = { - encoding?: string; - data: any; -}; - export function parseGeoJsonRawFeature(rawFeature: unknown): Feature | null { if (typeof rawFeature === 'object') { // Support GeoJson feature as object diff --git a/src/layers/src/index.ts b/src/layers/src/index.ts index 53b0fffd92..df1212bcae 100644 --- a/src/layers/src/index.ts +++ b/src/layers/src/index.ts @@ -31,7 +31,6 @@ import {default as LineLayer} from './line-layer/line-layer'; import {default as GridLayer} from './grid-layer/grid-layer'; export {pointToPolygonGeo} from './grid-layer/grid-utils'; import {default as HexagonLayer} from './hexagon-layer/hexagon-layer'; -import {default as ArrowLayer} from './arrow-layer/arrow-layer'; import {default as GeojsonLayer} from './geojson-layer/geojson-layer'; export {defaultElevation, defaultLineWidth, defaultRadius} from './geojson-layer/geojson-layer'; import {default as ClusterLayer} from './cluster-layer/cluster-layer'; @@ -72,7 +71,6 @@ export const KeplerGlLayers = { GridLayer, HexagonLayer, GeojsonLayer, - ArrowLayer, ClusterLayer, IconLayer, HeatmapLayer, @@ -90,7 +88,6 @@ export const LayerClasses = { [LAYER_TYPES.grid]: GridLayer, [LAYER_TYPES.hexagon]: HexagonLayer, [LAYER_TYPES.geojson]: GeojsonLayer, - [LAYER_TYPES.geoarrow]: ArrowLayer, [LAYER_TYPES.cluster]: ClusterLayer, [LAYER_TYPES.icon]: IconLayer, [LAYER_TYPES.heatmap]: HeatmapLayer, diff --git a/src/reducers/src/vis-state-updaters.ts b/src/reducers/src/vis-state-updaters.ts index a23ab97eff..a7ae41db9b 100644 --- a/src/reducers/src/vis-state-updaters.ts +++ b/src/reducers/src/vis-state-updaters.ts @@ -2313,6 +2313,7 @@ export const nextFileBatchUpdater = ( progress: parseProgress(state.fileLoadingProgress[fileName], progress) }); if (accumulated && accumulated.data?.length > 0) { + console.log(accumulated); const payload = { content: accumulated, fileCache: [] @@ -2320,6 +2321,14 @@ export const nextFileBatchUpdater = ( stateWithProgress = processFileContentUpdater(stateWithProgress, {payload}); } return withTask(stateWithProgress, [ + ...(accumulated && accumulated.data?.length > 0 + ? [ + PROCESS_FILE_DATA({content: accumulated, fileCache: []}).bimap( + result => loadBatchDataSuccess({fileName, fileCache: result}), + err => loadFilesErr(fileName, err) + ) + ] + : []), UNWRAP_TASK(gen.next()).bimap( ({value, done}) => { return done diff --git a/src/utils/src/arrow-data-container.ts b/src/utils/src/arrow-data-container.ts index 7b236001a3..d372846458 100644 --- a/src/utils/src/arrow-data-container.ts +++ b/src/utils/src/arrow-data-container.ts @@ -8,7 +8,6 @@ import {ALL_FIELD_TYPES} from '@kepler.gl/constants'; import {DataRow, SharedRowOptions} from './data-row'; import {DataContainerInterface, RangeOptions} from './data-container-interface'; -import {Field} from '@kepler.gl/types'; type ArrowDataContainerInput = { cols: arrow.Vector[]; @@ -65,6 +64,14 @@ export class ArrowDataContainer implements DataContainerInterface { // this._colData = data.cols.map(c => c.toArray()); } + update(updateData: arrow.Vector[]) { + this._cols = updateData; + this._numColumns = this._cols.length; + this._numRows = this._cols[0].length; + // cache column data to make valueAt() faster + // this._colData = this._cols.map(c => c.toArray()); + } + numRows(): number { return this._numRows; } diff --git a/src/utils/src/dataset-utils.ts b/src/utils/src/dataset-utils.ts index d09742ee96..bf4073f776 100644 --- a/src/utils/src/dataset-utils.ts +++ b/src/utils/src/dataset-utils.ts @@ -18,7 +18,6 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. -import {DataType as ArrowDataType} from 'apache-arrow'; import {console as globalConsole} from 'global/window'; import { ALL_FIELD_TYPES, @@ -588,80 +587,6 @@ export function analyzerTypeToFieldType(aType: string): string { } } -/** - * Convert arrow data type to kepler.gl field types - * - * @param arrowType the arrow data type - * @returns corresponding type in `ALL_FIELD_TYPES` - */ -export function arrowDataTypeToFieldType(arrowType: ArrowDataType): string { - // Note: this function doesn't return ALL_FIELD_TYPES.geojson or ALL_FIELD_TYPES.array, which - // should be further detected by caller - if (ArrowDataType.isDate(arrowType)) { - return ALL_FIELD_TYPES.date; - } else if (ArrowDataType.isTimestamp(arrowType) || ArrowDataType.isTime(arrowType)) { - return ALL_FIELD_TYPES.timestamp; - } else if (ArrowDataType.isFloat(arrowType)) { - return ALL_FIELD_TYPES.real; - } else if (ArrowDataType.isInt(arrowType)) { - return ALL_FIELD_TYPES.integer; - } else if (ArrowDataType.isBool(arrowType)) { - return ALL_FIELD_TYPES.boolean; - } else if (ArrowDataType.isUtf8(arrowType) || ArrowDataType.isNull(arrowType)) { - return ALL_FIELD_TYPES.string; - } else if ( - ArrowDataType.isBinary(arrowType) || - ArrowDataType.isDictionary(arrowType) || - ArrowDataType.isFixedSizeBinary(arrowType) || - ArrowDataType.isFixedSizeList(arrowType) || - ArrowDataType.isList(arrowType) || - ArrowDataType.isMap(arrowType) || - ArrowDataType.isStruct(arrowType) - ) { - return ALL_FIELD_TYPES.object; - } else { - globalConsole.warn(`Unsupported arrow type: ${arrowType}`); - return ALL_FIELD_TYPES.string; - } -} - -/** - * Convert arrow data type to analyzer type - * - * @param arrowType the arrow data type - * @returns corresponding type in `AnalyzerDATA_TYPES` - */ -export function arrowDataTypeToAnalyzerDataType( - arrowType: ArrowDataType -): typeof AnalyzerDATA_TYPES { - if (ArrowDataType.isDate(arrowType)) { - return AnalyzerDATA_TYPES.DATE; - } else if (ArrowDataType.isTimestamp(arrowType) || ArrowDataType.isTime(arrowType)) { - return AnalyzerDATA_TYPES.DATETIME; - } else if (ArrowDataType.isFloat(arrowType)) { - return AnalyzerDATA_TYPES.FLOAT; - } else if (ArrowDataType.isInt(arrowType)) { - return AnalyzerDATA_TYPES.INT; - } else if (ArrowDataType.isBool(arrowType)) { - return AnalyzerDATA_TYPES.BOOLEAN; - } else if (ArrowDataType.isUtf8(arrowType) || ArrowDataType.isNull(arrowType)) { - return AnalyzerDATA_TYPES.STRING; - } else if ( - ArrowDataType.isBinary(arrowType) || - ArrowDataType.isDictionary(arrowType) || - ArrowDataType.isFixedSizeBinary(arrowType) || - ArrowDataType.isFixedSizeList(arrowType) || - ArrowDataType.isList(arrowType) || - ArrowDataType.isMap(arrowType) || - ArrowDataType.isStruct(arrowType) - ) { - return AnalyzerDATA_TYPES.OBJECT; - } else { - globalConsole.warn(`Unsupported arrow type: ${arrowType}`); - return AnalyzerDATA_TYPES.STRING; - } -} - const TIME_DISPLAY = '2020-05-11 14:00'; const addTimeLabel = (formats: TimeLabelFormat[]) => diff --git a/src/utils/src/index.ts b/src/utils/src/index.ts index 25594fdbd3..98635d8093 100644 --- a/src/utils/src/index.ts +++ b/src/utils/src/index.ts @@ -53,9 +53,7 @@ export { renameDuplicateFields, analyzerTypeToFieldType, getFormatLabels, - getFieldFormatLabels, - arrowDataTypeToFieldType, - arrowDataTypeToAnalyzerDataType + getFieldFormatLabels } from './dataset-utils'; export {getFormatValue} from './format'; export {exportMapToHTML} from './export-map-html'; diff --git a/yarn.lock b/yarn.lock index 92eb6f5da4..13742617c6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2165,43 +2165,43 @@ "@math.gl/geospatial" "^3.5.1" long "^5.2.1" -"@loaders.gl/arrow@^4.0.2": - version "4.0.2" - resolved "https://registry.yarnpkg.com/@loaders.gl/arrow/-/arrow-4.0.2.tgz#3dbc108c2c69b48e0b92d6c91e5b5dc1343ca59a" - integrity sha512-3jqOxb8nvzf9knTfL1t1LJqh8J3e+fjEeeun9laVOuO8YA1psq0GAnQKxQbZcF+8bae4Yu2kFX3iLHd9h2PFZg== +"@loaders.gl/arrow@^4.0.3": + version "4.0.3" + resolved "https://registry.yarnpkg.com/@loaders.gl/arrow/-/arrow-4.0.3.tgz#e4a5478380e70d8176b1e0031687fdb17e98d227" + integrity sha512-RJQMkyTL51z5XYjRqIYBUrzIIC8ukmQj0NTeqSJAYClaSTu07PppjakYZ757hc53KPEl9b7DpLEuFE+Tobbkkg== dependencies: - "@loaders.gl/gis" "4.0.2" - "@loaders.gl/loader-utils" "4.0.2" - "@loaders.gl/schema" "4.0.2" + "@loaders.gl/gis" "4.0.3" + "@loaders.gl/loader-utils" "4.0.3" + "@loaders.gl/schema" "4.0.3" apache-arrow "^13.0.0" -"@loaders.gl/core@^2.1.6", "@loaders.gl/core@^3.4.13", "@loaders.gl/core@^4.0.2": - version "4.0.2" - resolved "https://registry.yarnpkg.com/@loaders.gl/core/-/core-4.0.2.tgz#99fcda9a7a5236f3aad8f7cc92333f434bdeb901" - integrity sha512-itvzdiDg85lmF7O/QYNgE7TOhpMzHdUdMAVpt9P+5D0LZPxOqNIfWbxtuT0DDCssRmWkmm4tgXiOeONHnS293A== +"@loaders.gl/core@^2.1.6", "@loaders.gl/core@^3.4.13", "@loaders.gl/core@^4.0.3": + version "4.0.3" + resolved "https://registry.yarnpkg.com/@loaders.gl/core/-/core-4.0.3.tgz#a99a97623c5f3c37fef21e87aebefde828b4ec86" + integrity sha512-L2MNtzchhTyOZi8OwD8Q62VgzgCk22b9lIQ1fojR/k9/Nv8xdozMhVgV/nhiwYCdd+qVGcZzyH43B0U8jlU+QA== dependencies: "@babel/runtime" "^7.3.1" - "@loaders.gl/loader-utils" "4.0.2" - "@loaders.gl/worker-utils" "4.0.2" + "@loaders.gl/loader-utils" "4.0.3" + "@loaders.gl/worker-utils" "4.0.3" "@probe.gl/log" "^4.0.2" -"@loaders.gl/crypto@4.0.2": - version "4.0.2" - resolved "https://registry.yarnpkg.com/@loaders.gl/crypto/-/crypto-4.0.2.tgz#903c061dee1dc5ad59b7abbc19ccb3bc48ab525c" - integrity sha512-Z9rhJ1D8BfPc+I5R4GJrZhgNW6KzV/+VHiUmmIqzpBAcaVOafB0jQ3td7UIWzBcRBsCgWLOc+FCmu3FeHQc5vw== +"@loaders.gl/crypto@4.0.3": + version "4.0.3" + resolved "https://registry.yarnpkg.com/@loaders.gl/crypto/-/crypto-4.0.3.tgz#2baef207bb0333fe3efcaba4d064d8695afa1aa3" + integrity sha512-oJmDQrtSyAiBh4V9F54SljmIasNdayB0epcaJNeal/i+PFXTn45gOPdovgFuQuuAm0rWo+S4r25KDmLBBzE3Rg== dependencies: "@babel/runtime" "^7.3.1" - "@loaders.gl/loader-utils" "4.0.2" - "@loaders.gl/worker-utils" "4.0.2" + "@loaders.gl/loader-utils" "4.0.3" + "@loaders.gl/worker-utils" "4.0.3" "@types/crypto-js" "^4.0.2" -"@loaders.gl/csv@^4.0.2": - version "4.0.2" - resolved "https://registry.yarnpkg.com/@loaders.gl/csv/-/csv-4.0.2.tgz#aa22b291819815cbf4c87e1988e639fc4a7250fe" - integrity sha512-loy5e8lnjZWlpBKeuby53tFDomv825pouyI9xhnhjXcpQWSqo7O85qVwDdLp8Yu6AFU6AFLeK6whCGgPq0XIYA== +"@loaders.gl/csv@^4.0.3": + version "4.0.3" + resolved "https://registry.yarnpkg.com/@loaders.gl/csv/-/csv-4.0.3.tgz#72679e7bbd7bdf27291352c07502823f3b051d96" + integrity sha512-oEYscUld0xrKlmb3ZEaNqrHIgF0kwpoEIVz5yFb/It+2kwSok0j7UdU29lT6t5NlCHTWL6Du+7NuOkSB1UGLzA== dependencies: - "@loaders.gl/loader-utils" "4.0.2" - "@loaders.gl/schema" "4.0.2" + "@loaders.gl/loader-utils" "4.0.3" + "@loaders.gl/schema" "4.0.3" "@loaders.gl/draco@3.4.14": version "3.4.14" @@ -2214,15 +2214,15 @@ "@loaders.gl/worker-utils" "3.4.14" draco3d "1.5.5" -"@loaders.gl/draco@4.0.2": - version "4.0.2" - resolved "https://registry.yarnpkg.com/@loaders.gl/draco/-/draco-4.0.2.tgz#69c71143f8148da0d147e074b06f40cfb55f68a6" - integrity sha512-dsCmcRJHewETedmZyyFrdXzsBYHo8RxMvZclWgTewcl74PbQBvJNP2j2jKnzNw67UO+Oyuh/Sbfdgf69IItWbQ== +"@loaders.gl/draco@4.0.3": + version "4.0.3" + resolved "https://registry.yarnpkg.com/@loaders.gl/draco/-/draco-4.0.3.tgz#a52481b1738b56cb5fb87938edfa9389c8271d9b" + integrity sha512-W6m4L5bcov2rqluZsM+wg/5kH0+mU5Vp+2DLx/CMA7LYCnrho7b1apAqPJ/fHVwQCyL392Nv+p9i8GdyX4UCEw== dependencies: "@babel/runtime" "^7.3.1" - "@loaders.gl/loader-utils" "4.0.2" - "@loaders.gl/schema" "4.0.2" - "@loaders.gl/worker-utils" "4.0.2" + "@loaders.gl/loader-utils" "4.0.3" + "@loaders.gl/schema" "4.0.3" + "@loaders.gl/worker-utils" "4.0.3" draco3d "1.5.5" "@loaders.gl/gis@3.4.14", "@loaders.gl/gis@^3.4.13": @@ -2236,26 +2236,26 @@ "@math.gl/polygon" "^3.5.1" pbf "^3.2.1" -"@loaders.gl/gis@4.0.2", "@loaders.gl/gis@^4.0.2": - version "4.0.2" - resolved "https://registry.yarnpkg.com/@loaders.gl/gis/-/gis-4.0.2.tgz#edd3f1e57a66c1a16571a5d9a801a516cf6575ce" - integrity sha512-uZgdvAhsPcWHim5whFiFpemyGO4BhPBuAlhBmmzdD+b8QsEJHwMIouAIleqIkgShRHbseE3xZ+rtRmFCXhiUNQ== +"@loaders.gl/gis@4.0.3", "@loaders.gl/gis@^4.0.3": + version "4.0.3" + resolved "https://registry.yarnpkg.com/@loaders.gl/gis/-/gis-4.0.3.tgz#bdaee00825d12909eeef0fa82cfc8e60555ea96b" + integrity sha512-fBd5vxlcxZpn0g7yuW/NvhdBbcVuFfiSPmJDVOP3oyT5/c1va4h8FJaRd5RLpLep3tcrHevzjiBjfaEw9U9Z2g== dependencies: - "@loaders.gl/loader-utils" "4.0.2" - "@loaders.gl/schema" "4.0.2" + "@loaders.gl/loader-utils" "4.0.3" + "@loaders.gl/schema" "4.0.3" "@mapbox/vector-tile" "^1.3.1" "@math.gl/polygon" "^4.0.0" pbf "^3.2.1" -"@loaders.gl/gltf@3.4.14", "@loaders.gl/gltf@^3.4.13", "@loaders.gl/gltf@^4.0.2": - version "4.0.2" - resolved "https://registry.yarnpkg.com/@loaders.gl/gltf/-/gltf-4.0.2.tgz#2a2bcb5394e4741b8552cb4d673867b806e65764" - integrity sha512-P/SOpPZGXxlGSkHtcXRzwTToWTnMCkEPmTarX1fWOfnAHLp8fsps3FfnF1zm+CO/Z2SH7uJ6muwQRF6F0ZbRxA== +"@loaders.gl/gltf@3.4.14", "@loaders.gl/gltf@^3.4.13", "@loaders.gl/gltf@^4.0.3": + version "4.0.3" + resolved "https://registry.yarnpkg.com/@loaders.gl/gltf/-/gltf-4.0.3.tgz#60a29464df34a8bee0b429ae92a3f9ce2a4d4f07" + integrity sha512-Lbve+DGkhrYMZTXCPBFbn9J30xmdoAt2TnqB3Xr6ZHytM3WOJmYeou5/t3vmUuBM1fjK0rKY1BFDvgQsX+5nNw== dependencies: - "@loaders.gl/draco" "4.0.2" - "@loaders.gl/images" "4.0.2" - "@loaders.gl/loader-utils" "4.0.2" - "@loaders.gl/textures" "4.0.2" + "@loaders.gl/draco" "4.0.3" + "@loaders.gl/images" "4.0.3" + "@loaders.gl/loader-utils" "4.0.3" + "@loaders.gl/textures" "4.0.3" "@math.gl/core" "^4.0.0" "@loaders.gl/images@3.4.14", "@loaders.gl/images@^3.4.13": @@ -2265,29 +2265,29 @@ dependencies: "@loaders.gl/loader-utils" "3.4.14" -"@loaders.gl/images@4.0.2": - version "4.0.2" - resolved "https://registry.yarnpkg.com/@loaders.gl/images/-/images-4.0.2.tgz#cefb6a9b812db93ce3e65e81447b8796cfeebc1a" - integrity sha512-mnBIH8mLrN9djvGHQNDsRrlxn+/fvDFwv8iMEf61a347GQsVSxd2OQSONSzHHKvCDfON37hY/EpkvVsEaJwn0Q== +"@loaders.gl/images@4.0.3": + version "4.0.3" + resolved "https://registry.yarnpkg.com/@loaders.gl/images/-/images-4.0.3.tgz#fd09f51c1afb25af0bf4fbe74cb4de9edd3db224" + integrity sha512-nWbp9wzO7OPt20A7hY3k0xydR9ooY4rBASiNLrzdOELQYS0YMGHsNdSQpgyZlnAUMtcQHP8CqEUHRWlO3dAi3Q== dependencies: - "@loaders.gl/loader-utils" "4.0.2" + "@loaders.gl/loader-utils" "4.0.3" -"@loaders.gl/json@^4.0.2": - version "4.0.2" - resolved "https://registry.yarnpkg.com/@loaders.gl/json/-/json-4.0.2.tgz#e2e738650e6996b2d2e12ccd02667425e21bd7ee" - integrity sha512-q5sKK0gXNPxbTtUrtZkT2WRE3aQ30tF7WAHKd2z/8Q/URtA5w7Irxk45oVkoJgY+C3kJCYYFKdBzQRcjlXoKqA== +"@loaders.gl/json@^4.0.3": + version "4.0.3" + resolved "https://registry.yarnpkg.com/@loaders.gl/json/-/json-4.0.3.tgz#ad53e4aa808d670902f12720b5cfe771484b4b85" + integrity sha512-iZUiI3KkwgXjZD1GcfyubxPhCxAtf0L+XSLDl7kIcF9Fc7ap+84JqYtmgdhzyDfK5BmvVCUh6PaouPYzCALXZA== dependencies: - "@loaders.gl/gis" "4.0.2" - "@loaders.gl/loader-utils" "4.0.2" - "@loaders.gl/schema" "4.0.2" + "@loaders.gl/gis" "4.0.3" + "@loaders.gl/loader-utils" "4.0.3" + "@loaders.gl/schema" "4.0.3" -"@loaders.gl/loader-utils@3.4.14", "@loaders.gl/loader-utils@4.0.2", "@loaders.gl/loader-utils@^2.1.3", "@loaders.gl/loader-utils@^3.4.13", "@loaders.gl/loader-utils@^4.0.1", "@loaders.gl/loader-utils@^4.0.2": - version "4.0.2" - resolved "https://registry.yarnpkg.com/@loaders.gl/loader-utils/-/loader-utils-4.0.2.tgz#076b9830f3bda7690e7f939aa6bdf097bc40cfb3" - integrity sha512-Obb62xjbe5Hul3IM17bVQB+gIz5XoFKaqXKX1KDErlbOYJ8SiBFTHPfNcAK9bhmYYVgf6jWU9Vn94l241lcJLw== +"@loaders.gl/loader-utils@3.4.14", "@loaders.gl/loader-utils@4.0.3", "@loaders.gl/loader-utils@^2.1.3", "@loaders.gl/loader-utils@^3.4.13", "@loaders.gl/loader-utils@^4.0.3": + version "4.0.3" + resolved "https://registry.yarnpkg.com/@loaders.gl/loader-utils/-/loader-utils-4.0.3.tgz#a3229e070d849bb3699a13857df5aa0e56ba73bc" + integrity sha512-orklRrTVX95C4CbPUBVwhQTe992DiRsdIh9r2vHX+geQCrPM2gkdTpm+DQvulm7uFCmP/hmqbE37mye7DnJV+g== dependencies: "@babel/runtime" "^7.3.1" - "@loaders.gl/worker-utils" "4.0.2" + "@loaders.gl/worker-utils" "4.0.3" "@probe.gl/stats" "^4.0.2" "@loaders.gl/math@3.4.14": @@ -2310,14 +2310,14 @@ "@math.gl/polygon" "^3.5.1" pbf "^3.2.1" -"@loaders.gl/polyfills@^4.0.2": - version "4.0.2" - resolved "https://registry.yarnpkg.com/@loaders.gl/polyfills/-/polyfills-4.0.2.tgz#d681377efa3d98456f6253d6ed8b1f03f601e53e" - integrity sha512-vqhRcr4D+N12e9cWHXpnx8pgOLRhwPYAdsqWZWfGe00mvbVmbEjBbPmoGg+NaHxDVq8ZCw/CeDG09521WX2BMA== +"@loaders.gl/polyfills@^4.0.3": + version "4.0.3" + resolved "https://registry.yarnpkg.com/@loaders.gl/polyfills/-/polyfills-4.0.3.tgz#a307909795c8af1f778c94bc540122e617cb4bb9" + integrity sha512-ldQEl7M80VNY9FewUOANASV2Q08OToVuSdO5LbuLoIO7n1VNxJmYg8AbXN5SZ5j93RUSyKVyO5WxhBQicoDuDQ== dependencies: "@babel/runtime" "^7.3.1" - "@loaders.gl/crypto" "4.0.2" - "@loaders.gl/loader-utils" "4.0.2" + "@loaders.gl/crypto" "4.0.3" + "@loaders.gl/loader-utils" "4.0.3" buffer "^6.0.3" get-pixels "^3.3.3" ndarray "^1.0.19" @@ -2333,10 +2333,10 @@ dependencies: "@types/geojson" "^7946.0.7" -"@loaders.gl/schema@4.0.2": - version "4.0.2" - resolved "https://registry.yarnpkg.com/@loaders.gl/schema/-/schema-4.0.2.tgz#700dcb4166e406a478ef5d7ed05319378453e908" - integrity sha512-R7SI7u4WNrTVbKpOMtpCVfCB/s5OjVBjvO/NtF8IItR4cWMVaGXS5TjYXa0BheLEoJcsIIPcY9FLtMnOXCeGLg== +"@loaders.gl/schema@4.0.3": + version "4.0.3" + resolved "https://registry.yarnpkg.com/@loaders.gl/schema/-/schema-4.0.3.tgz#93e0dc640c528c044b040e960d5014e746ba6fcc" + integrity sha512-WC+T0S76RbLcDq+a/aAViNSAf2Gr8rCs6tXmk3Cq/pcwLWYM8XNWlR1ZUMuyRyeZIBBur24LE4GSGlvt+xD4JA== dependencies: "@types/geojson" "^7946.0.7" @@ -2351,15 +2351,15 @@ "@loaders.gl/schema" "3.4.14" "@mapbox/martini" "^0.2.0" -"@loaders.gl/textures@4.0.2": - version "4.0.2" - resolved "https://registry.yarnpkg.com/@loaders.gl/textures/-/textures-4.0.2.tgz#577402857c994812657a982552f6d37705d0e1a7" - integrity sha512-LLf0oWykS/15KglT7Y9MahjcP0O+ySiZAKcOofty8MWzLzBHDds4CfaarwppvaTp/KFh/GPG8PwVmZ+MyBDZbw== +"@loaders.gl/textures@4.0.3": + version "4.0.3" + resolved "https://registry.yarnpkg.com/@loaders.gl/textures/-/textures-4.0.3.tgz#d4e3e33d349e71797c46899d14e7470a07c26586" + integrity sha512-nwexaPrctTrwPXDMiS++jmQGUcCMg51XGSMu9kfLKhrPWiOU4yEPyAK3wjmlXHymv4FVIy8UAgGAu+8jZf3g6w== dependencies: - "@loaders.gl/images" "4.0.2" - "@loaders.gl/loader-utils" "4.0.2" - "@loaders.gl/schema" "4.0.2" - "@loaders.gl/worker-utils" "4.0.2" + "@loaders.gl/images" "4.0.3" + "@loaders.gl/loader-utils" "4.0.3" + "@loaders.gl/schema" "4.0.3" + "@loaders.gl/worker-utils" "4.0.3" ktx-parse "^0.0.4" texture-compressor "^1.0.2" @@ -2384,13 +2384,13 @@ "@loaders.gl/loader-utils" "^2.1.3" gifshot "^0.4.5" -"@loaders.gl/wkt@^4.0.2": - version "4.0.2" - resolved "https://registry.yarnpkg.com/@loaders.gl/wkt/-/wkt-4.0.2.tgz#7cdc97c0330f1fe7841c6d4084e4ff547bfab742" - integrity sha512-Rw1qoKvSRSR6ZKWOaf92HXejJNpE4JxjhrBsEFweJtXwUU/MeRxyiRvr7fbPJR8H3jrIDv5duMGqn6Z7H8YofQ== +"@loaders.gl/wkt@^4.0.3": + version "4.0.3" + resolved "https://registry.yarnpkg.com/@loaders.gl/wkt/-/wkt-4.0.3.tgz#b734a0aa99bcf5c12322f0f7e1b321b77ff3a2a4" + integrity sha512-4PsAhDKmP6sRUfeHTaClwkTi+JGlEkdU3faZaLKcF5MAuFksytZOXX4kLG2e84lFtpFH72zztivHUihEIeXuPg== dependencies: - "@loaders.gl/loader-utils" "4.0.2" - "@loaders.gl/schema" "4.0.2" + "@loaders.gl/loader-utils" "4.0.3" + "@loaders.gl/schema" "4.0.3" "@loaders.gl/wms@^3.4.13": version "3.4.14" @@ -2413,10 +2413,10 @@ dependencies: "@babel/runtime" "^7.3.1" -"@loaders.gl/worker-utils@4.0.2": - version "4.0.2" - resolved "https://registry.yarnpkg.com/@loaders.gl/worker-utils/-/worker-utils-4.0.2.tgz#9808d8003d4b4eed6f08bbf83d422b39641967c3" - integrity sha512-ZEbOSA3ryX2julRKA7nzPAqOWUc8RV/u/ysIIdHYuASck0N+VRljowZIzLAZ70hK4LWn5eIHvmoCDauznEoxeA== +"@loaders.gl/worker-utils@4.0.3": + version "4.0.3" + resolved "https://registry.yarnpkg.com/@loaders.gl/worker-utils/-/worker-utils-4.0.3.tgz#94bda0e57f686421247beb3b7c8d6eaba26b235c" + integrity sha512-P8ZvWNE3fpdb7KHYv5TxInL2AH3Z+VVnLrJjuClZrPPouvBA/pAhgPu+Y2ktvawZ35PJ1Y9EMLDin864pMXN+Q== dependencies: "@babel/runtime" "^7.3.1"