kepler.gl 3.1.0 → 3.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (234) hide show
  1. package/README.md +27 -132
  2. package/dist/src/common-utils/src/data-type.d.ts +9 -1
  3. package/dist/src/components/src/common/data-table/header-cell.d.ts +1 -0
  4. package/dist/src/components/src/common/data-table/index.d.ts +1 -0
  5. package/dist/src/components/src/common/file-uploader/file-drop.d.ts +1 -32
  6. package/dist/src/components/src/common/item-selector/dropdown-list.d.ts +2 -2
  7. package/dist/src/components/src/common/item-selector/item-selector.d.ts +1 -1
  8. package/dist/src/components/src/common/item-selector/typeahead.d.ts +1 -1
  9. package/dist/src/components/src/geocoder/geocoder.d.ts +7 -0
  10. package/dist/src/components/src/geocoder-panel.d.ts +2 -2
  11. package/dist/src/components/src/hooks/use-fetch-vector-tile-metadata.d.ts +4 -3
  12. package/dist/src/constants/src/default-settings.d.ts +14 -1
  13. package/dist/src/deckgl-arrow-layers/src/constants.d.ts +0 -12
  14. package/dist/src/deckgl-arrow-layers/src/index.d.ts +0 -1
  15. package/dist/src/deckgl-arrow-layers/src/utils/utils.d.ts +12 -1
  16. package/dist/src/duckdb/src/components/preview-data-panel.d.ts +7 -2
  17. package/dist/src/duckdb/src/components/schema-panel.d.ts +12 -3
  18. package/dist/src/duckdb/src/processors/data-processor.d.ts +1 -0
  19. package/dist/src/duckdb/src/table/duckdb-table-utils.d.ts +106 -0
  20. package/dist/src/duckdb/src/table/duckdb-table.d.ts +5 -3
  21. package/dist/src/processors/src/data-processor.d.ts +15 -1
  22. package/dist/src/reducers/src/provider-state-updaters.d.ts +1 -0
  23. package/dist/src/reducers/src/vis-state-updaters.d.ts +1 -1
  24. package/dist/src/table/src/dataset-utils.d.ts +1 -1
  25. package/dist/src/table/src/tileset/vector-tile-utils.d.ts +17 -1
  26. package/dist/src/utils/src/application-config.d.ts +4 -3
  27. package/dist/src/utils/src/data-utils.d.ts +9 -3
  28. package/dist/src/utils/src/indexed-data-container.d.ts +2 -2
  29. package/dist/src/utils/src/map-style-utils/mapbox-utils.d.ts +1 -1
  30. package/dist/src/utils/src/map-utils.d.ts +1 -1
  31. package/dist/src/utils/src/plot.d.ts +2 -2
  32. package/package.json +5 -5
  33. package/src/actions/package.json +8 -8
  34. package/src/ai-assistant/dist/components/ai-assistant-component.js +2 -1
  35. package/src/ai-assistant/package.json +7 -7
  36. package/src/ai-assistant/src/components/ai-assistant-component.tsx +1 -0
  37. package/src/cloud-providers/package.json +2 -2
  38. package/src/common-utils/dist/data-type.d.ts +9 -1
  39. package/src/common-utils/dist/data-type.js +50 -1
  40. package/src/common-utils/package.json +3 -3
  41. package/src/common-utils/src/data-type.ts +49 -1
  42. package/src/components/dist/common/data-table/header-cell.d.ts +1 -0
  43. package/src/components/dist/common/data-table/header-cell.js +2 -2
  44. package/src/components/dist/common/data-table/index.d.ts +1 -0
  45. package/src/components/dist/common/data-table/index.js +5 -1
  46. package/src/components/dist/common/file-uploader/file-drop.d.ts +1 -32
  47. package/src/components/dist/common/file-uploader/file-drop.js +152 -167
  48. package/src/components/dist/common/item-selector/dropdown-list.d.ts +2 -2
  49. package/src/components/dist/common/item-selector/dropdown-list.js +2 -3
  50. package/src/components/dist/common/item-selector/item-selector.d.ts +1 -1
  51. package/src/components/dist/common/item-selector/typeahead.d.ts +1 -1
  52. package/src/components/dist/common/range-brush.js +3 -3
  53. package/src/components/dist/geocoder/geocoder.d.ts +7 -0
  54. package/src/components/dist/geocoder/geocoder.js +19 -11
  55. package/src/components/dist/geocoder-panel.d.ts +2 -2
  56. package/src/components/dist/geocoder-panel.js +64 -91
  57. package/src/components/dist/hooks/use-fetch-vector-tile-metadata.d.ts +4 -3
  58. package/src/components/dist/hooks/use-fetch-vector-tile-metadata.js +35 -26
  59. package/src/components/dist/hooks/use-legend-position.js +8 -4
  60. package/src/components/dist/map/map-legend-panel.js +2 -3
  61. package/src/components/dist/modal-container.js +8 -8
  62. package/src/components/dist/modals/tilesets-modals/tileset-vector-form.js +31 -12
  63. package/src/components/dist/side-panel/layer-panel/color-palette-preset.js +2 -2
  64. package/src/components/dist/side-panel/layer-panel/color-range-selector.js +10 -11
  65. package/src/components/dist/side-panel/layer-panel/color-selector.js +3 -3
  66. package/src/components/dist/side-panel/layer-panel/custom-palette.js +1 -2
  67. package/src/components/dist/side-panel/layer-panel/layer-configurator.js +6 -8
  68. package/src/components/dist/side-panel/layer-panel/vector-tile-layer-configurator.js +1 -2
  69. package/src/components/package.json +16 -16
  70. package/src/components/src/common/data-table/header-cell.tsx +2 -1
  71. package/src/components/src/common/data-table/index.tsx +4 -0
  72. package/src/components/src/common/file-uploader/file-drop.tsx +186 -161
  73. package/src/components/src/common/item-selector/dropdown-list.tsx +1 -6
  74. package/src/components/src/common/range-brush.tsx +2 -2
  75. package/src/components/src/geocoder/geocoder.tsx +16 -8
  76. package/src/components/src/geocoder-panel.tsx +95 -85
  77. package/src/components/src/hooks/use-fetch-vector-tile-metadata.ts +27 -25
  78. package/src/components/src/hooks/use-legend-position.ts +5 -2
  79. package/src/components/src/map/map-legend-panel.tsx +1 -2
  80. package/src/components/src/modal-container.tsx +7 -7
  81. package/src/components/src/modals/tilesets-modals/tileset-vector-form.tsx +12 -3
  82. package/src/components/src/side-panel/layer-panel/color-palette-preset.tsx +1 -1
  83. package/src/components/src/side-panel/layer-panel/color-range-selector.tsx +6 -11
  84. package/src/components/src/side-panel/layer-panel/color-selector.tsx +2 -2
  85. package/src/components/src/side-panel/layer-panel/custom-palette.tsx +0 -1
  86. package/src/components/src/side-panel/layer-panel/layer-configurator.tsx +23 -33
  87. package/src/components/src/side-panel/layer-panel/vector-tile-layer-configurator.tsx +0 -1
  88. package/src/constants/dist/default-settings.d.ts +14 -1
  89. package/src/constants/dist/default-settings.js +20 -5
  90. package/src/constants/node_modules/.cache/terser-webpack-plugin/content-v2/sha512/91/4f/6c65f3a1eba584ffd2d892cabc25ab5804d4a9ef53694c98707372a83e56343a274bec04f15927a6fe7602615f0f23f73ccf599f524ef97ad6c77c8832ea +1 -0
  91. package/src/constants/node_modules/.cache/terser-webpack-plugin/index-v5/a6/b2/5424aa4477192fb44cc90fd80892efdc96731f2ff0f48e8f28abf64243cc +2 -0
  92. package/src/constants/package.json +2 -2
  93. package/src/constants/src/default-settings.ts +16 -1
  94. package/src/constants/umd/keplergl.min.js +2 -2
  95. package/src/deckgl-arrow-layers/dist/constants.d.ts +0 -12
  96. package/src/deckgl-arrow-layers/dist/constants.js +4 -15
  97. package/src/deckgl-arrow-layers/dist/index.d.ts +0 -1
  98. package/src/deckgl-arrow-layers/dist/index.js +1 -8
  99. package/src/deckgl-arrow-layers/dist/layers/geo-arrow-scatterplot-layer.js +4 -4
  100. package/src/deckgl-arrow-layers/dist/layers/geo-arrow-text-layer.js +5 -5
  101. package/src/deckgl-arrow-layers/dist/utils/utils.d.ts +12 -1
  102. package/src/deckgl-arrow-layers/dist/utils/utils.js +7 -5
  103. package/src/deckgl-arrow-layers/package.json +2 -1
  104. package/src/deckgl-arrow-layers/src/constants.ts +0 -13
  105. package/src/deckgl-arrow-layers/src/index.ts +0 -2
  106. package/src/deckgl-arrow-layers/src/layers/geo-arrow-scatterplot-layer.ts +5 -3
  107. package/src/deckgl-arrow-layers/src/layers/geo-arrow-text-layer.ts +8 -4
  108. package/src/deckgl-arrow-layers/src/utils/utils.ts +7 -5
  109. package/src/deckgl-layers/dist/deckgl-extensions/filter-arrow-layer.d.ts +1 -1
  110. package/src/deckgl-layers/dist/deckgl-extensions/filter-shader-module.d.ts +1 -1
  111. package/src/deckgl-layers/dist/deckgl-extensions/filter-shader-module.js +3 -3
  112. package/src/deckgl-layers/package.json +5 -5
  113. package/src/deckgl-layers/src/deckgl-extensions/filter-shader-module.ts +4 -3
  114. package/src/duckdb/dist/components/monaco-editor.js +4 -5
  115. package/src/duckdb/dist/components/preview-data-panel.d.ts +7 -2
  116. package/src/duckdb/dist/components/preview-data-panel.js +7 -8
  117. package/src/duckdb/dist/components/schema-panel.d.ts +12 -3
  118. package/src/duckdb/dist/components/schema-panel.js +41 -24
  119. package/src/duckdb/dist/components/sql-panel.js +245 -56
  120. package/src/duckdb/dist/init.js +20 -14
  121. package/src/duckdb/dist/processors/data-processor.d.ts +1 -0
  122. package/src/duckdb/dist/processors/data-processor.js +4 -4
  123. package/src/duckdb/dist/table/duckdb-table-utils.d.ts +106 -0
  124. package/src/duckdb/dist/table/duckdb-table-utils.js +493 -2
  125. package/src/duckdb/dist/table/duckdb-table.d.ts +5 -3
  126. package/src/duckdb/dist/table/duckdb-table.js +153 -261
  127. package/src/duckdb/package.json +6 -6
  128. package/src/duckdb/src/components/monaco-editor.tsx +3 -3
  129. package/src/duckdb/src/components/preview-data-panel.tsx +15 -8
  130. package/src/duckdb/src/components/schema-panel.tsx +92 -21
  131. package/src/duckdb/src/components/sql-panel.tsx +160 -22
  132. package/src/duckdb/src/init.ts +4 -1
  133. package/src/duckdb/src/processors/data-processor.ts +2 -2
  134. package/src/duckdb/src/table/duckdb-table-utils.ts +407 -1
  135. package/src/duckdb/src/table/duckdb-table.ts +61 -92
  136. package/src/effects/package.json +5 -5
  137. package/src/layers/dist/arc-layer/arc-layer.d.ts +1 -1
  138. package/src/layers/dist/arc-layer/arc-layer.js +2 -3
  139. package/src/layers/dist/base-layer.d.ts +7 -6
  140. package/src/layers/dist/base-layer.js +36 -19
  141. package/src/layers/dist/geojson-layer/geojson-layer.js +4 -2
  142. package/src/layers/dist/geojson-layer/geojson-utils.js +10 -3
  143. package/src/layers/dist/heatmap-layer/heatmap-layer.d.ts +2 -0
  144. package/src/layers/dist/heatmap-layer/heatmap-layer.js +16 -9
  145. package/src/layers/dist/icon-layer/icon-layer.d.ts +6 -3
  146. package/src/layers/dist/icon-layer/icon-layer.js +19 -11
  147. package/src/layers/dist/index.d.ts +1 -1
  148. package/src/layers/dist/index.js +1 -1
  149. package/src/layers/dist/layer-text-label.d.ts +9 -0
  150. package/src/layers/dist/layer-text-label.js +51 -6
  151. package/src/layers/dist/layer-utils.d.ts +39 -30
  152. package/src/layers/dist/layer-utils.js +69 -9
  153. package/src/layers/dist/line-layer/line-layer.d.ts +1 -1
  154. package/src/layers/dist/line-layer/line-layer.js +2 -3
  155. package/src/layers/dist/point-layer/point-layer.d.ts +10 -7
  156. package/src/layers/dist/point-layer/point-layer.js +16 -8
  157. package/src/layers/dist/trip-layer/trip-layer.d.ts +2 -2
  158. package/src/layers/dist/trip-layer/trip-layer.js +4 -2
  159. package/src/layers/dist/vector-tile/abstract-tile-layer.d.ts +3 -7
  160. package/src/layers/dist/vector-tile/abstract-tile-layer.js +7 -6
  161. package/src/layers/dist/vector-tile/vector-tile-layer.d.ts +5 -7
  162. package/src/layers/dist/vector-tile/vector-tile-layer.js +23 -2
  163. package/src/layers/package.json +11 -10
  164. package/src/layers/src/arc-layer/arc-layer.ts +1 -1
  165. package/src/layers/src/base-layer.ts +50 -9
  166. package/src/layers/src/geojson-layer/geojson-layer.ts +3 -1
  167. package/src/layers/src/geojson-layer/geojson-utils.ts +4 -1
  168. package/src/layers/src/heatmap-layer/heatmap-layer.ts +17 -12
  169. package/src/layers/src/icon-layer/icon-layer.ts +7 -3
  170. package/src/layers/src/index.ts +1 -2
  171. package/src/layers/src/layer-text-label.ts +53 -4
  172. package/src/layers/src/layer-utils.ts +88 -9
  173. package/src/layers/src/line-layer/line-layer.ts +1 -1
  174. package/src/layers/src/point-layer/point-layer.ts +15 -11
  175. package/src/layers/src/trip-layer/trip-layer.ts +4 -2
  176. package/src/layers/src/vector-tile/abstract-tile-layer.ts +11 -5
  177. package/src/layers/src/vector-tile/vector-tile-layer.ts +33 -4
  178. package/src/localization/package.json +1 -1
  179. package/src/processors/dist/data-processor.d.ts +15 -1
  180. package/src/processors/dist/data-processor.js +104 -11
  181. package/src/processors/package.json +8 -7
  182. package/src/processors/src/data-processor.ts +116 -13
  183. package/src/reducers/dist/export-utils.js +2 -2
  184. package/src/reducers/dist/layer-utils.js +1 -1
  185. package/src/reducers/dist/provider-state-updaters.d.ts +1 -0
  186. package/src/reducers/dist/provider-state-updaters.js +5 -2
  187. package/src/reducers/dist/vis-state-updaters.d.ts +1 -1
  188. package/src/reducers/dist/vis-state-updaters.js +23 -12
  189. package/src/reducers/package.json +16 -16
  190. package/src/reducers/src/export-utils.ts +1 -1
  191. package/src/reducers/src/layer-utils.ts +2 -1
  192. package/src/reducers/src/provider-state-updaters.ts +4 -1
  193. package/src/reducers/src/vis-state-updaters.ts +45 -10
  194. package/src/schemas/dist/dataset-schema.js +35 -6
  195. package/src/schemas/package.json +7 -7
  196. package/src/schemas/src/dataset-schema.ts +36 -8
  197. package/src/styles/node_modules/.cache/terser-webpack-plugin/content-v2/sha512/a3/a9/7f26bbc52905b0e21e9366a30ef0ba98f4ccf9aa8dd8326d90ba90191ba2e305323f505bf134c825356156c793bf9386ed2cef2aeb48eb327c26d106f69a +1 -0
  198. package/src/styles/node_modules/.cache/terser-webpack-plugin/index-v5/7e/51/b8756555a0e2e696d944445ac23f7febf769006013fbc8419f39a701649d +2 -0
  199. package/src/styles/package.json +2 -2
  200. package/src/styles/umd/keplergl.min.js +2 -2
  201. package/src/table/dist/dataset-utils.js +23 -14
  202. package/src/table/dist/src/table/src/dataset-utils.d.ts +1 -1
  203. package/src/table/dist/src/table/src/tileset/vector-tile-utils.d.ts +17 -1
  204. package/src/table/dist/tileset/vector-tile-utils.js +122 -2
  205. package/src/table/package.json +5 -5
  206. package/src/table/src/dataset-utils.ts +16 -6
  207. package/src/table/src/tileset/vector-tile-utils.ts +131 -8
  208. package/src/tasks/package.json +2 -2
  209. package/src/types/actions.d.ts +1 -0
  210. package/src/types/layers.d.ts +1 -0
  211. package/src/types/package.json +1 -1
  212. package/src/types/types.d.ts +17 -0
  213. package/src/utils/dist/application-config.d.ts +4 -3
  214. package/src/utils/dist/application-config.js +3 -2
  215. package/src/utils/dist/data-scale-utils.js +4 -4
  216. package/src/utils/dist/data-utils.d.ts +9 -3
  217. package/src/utils/dist/data-utils.js +40 -7
  218. package/src/utils/dist/dataset-utils.js +23 -8
  219. package/src/utils/dist/indexed-data-container.d.ts +2 -2
  220. package/src/utils/dist/indexed-data-container.js +1 -1
  221. package/src/utils/dist/map-style-utils/mapbox-utils.d.ts +1 -1
  222. package/src/utils/dist/map-style-utils/mapbox-utils.js +3 -3
  223. package/src/utils/dist/plot.d.ts +2 -2
  224. package/src/utils/dist/plot.js +6 -6
  225. package/src/utils/map-utils.spec.js +1 -2
  226. package/src/utils/package.json +5 -4
  227. package/src/utils/src/application-config.ts +11 -8
  228. package/src/utils/src/data-scale-utils.ts +3 -3
  229. package/src/utils/src/data-utils.ts +36 -7
  230. package/src/utils/src/dataset-utils.ts +41 -9
  231. package/src/utils/src/indexed-data-container.ts +1 -1
  232. package/src/utils/src/map-style-utils/mapbox-utils.ts +2 -2
  233. package/src/utils/src/plot.ts +5 -5
  234. package/umd/keplergl.min.js +1279 -1295
@@ -53,8 +53,7 @@ export type {
53
53
  LayerBaseConfig,
54
54
  VisualChannelDomain,
55
55
  VisualChannel,
56
- VisualChannelDescription,
57
- FindDefaultLayerPropsReturnValue
56
+ VisualChannelDescription
58
57
  } from './base-layer';
59
58
  export * from './base-layer';
60
59
 
@@ -69,7 +69,9 @@ export const formatTextLabelData = ({
69
69
 
70
70
  const getTextAccessor: (d: {index: number}) => string = textLabelAccessor(tl)(dataContainer);
71
71
  let characterSet;
72
+ let getText: typeof getTextAccessor | arrow.Vector = getTextAccessor;
72
73
 
74
+ let rebuildArrowTextVector = true;
73
75
  if (
74
76
  !triggerChanged?.[`getLabelCharacterSet-${i}`] &&
75
77
  oldLayerData &&
@@ -77,6 +79,8 @@ export const formatTextLabelData = ({
77
79
  oldLayerData.textLabels[i]
78
80
  ) {
79
81
  characterSet = oldLayerData.textLabels[i].characterSet;
82
+ getText = oldLayerData.textLabels[i].getText;
83
+ rebuildArrowTextVector = false;
80
84
  } else {
81
85
  if (data instanceof arrow.Table) {
82
86
  // we don't filter out arrow tables,
@@ -100,13 +104,20 @@ export const formatTextLabelData = ({
100
104
  }
101
105
  }
102
106
 
103
- let getText: typeof getTextAccessor | arrow.Vector = getTextAccessor;
104
107
  // For Arrow Layers getText has to be an arrow vector.
105
108
  // For now check here for ArrowTable, not ArrowDataContainer.
106
- if (data instanceof arrow.Table && dataContainer instanceof ArrowDataContainer) {
107
- // TODO the data has to be a column of string type.
108
- // as numerical and other columns types lack valueOffsets prop.
109
+ if (
110
+ rebuildArrowTextVector &&
111
+ data instanceof arrow.Table &&
112
+ dataContainer instanceof ArrowDataContainer
113
+ ) {
109
114
  getText = dataContainer.getColumn(tl.field.fieldIdx);
115
+ try {
116
+ getText = getArrowTextVector(getText as arrow.Vector, getTextAccessor);
117
+ } catch (error) {
118
+ // empty text labels
119
+ getText = getArrowTextVector(getText, () => ' ');
120
+ }
110
121
  }
111
122
 
112
123
  return {
@@ -115,3 +126,41 @@ export const formatTextLabelData = ({
115
126
  };
116
127
  });
117
128
  };
129
+
130
+ /**
131
+ * Get an arrow vector suitable to render text labels with arrow layers.
132
+ * @param getText A candidate arrow vector to use for text labels.
133
+ * @param getTextAccessor Text label accessor.
134
+ */
135
+ export const getArrowTextVector = (
136
+ candidateTextVector: arrow.Vector,
137
+ getTextAccessor: ({index}: {index: number}) => string
138
+ ): arrow.Vector => {
139
+ // if the passed vector is suitable for text labels
140
+ if (arrow.DataType.isUtf8(candidateTextVector?.type)) {
141
+ return candidateTextVector;
142
+ }
143
+
144
+ // create utf8 vector from source vector with the same number of batches.
145
+ // @ts-expect-error
146
+ const offsets = candidateTextVector._offsets;
147
+ const numOffsets = offsets.length;
148
+ const batchVectors: arrow.Vector[] = [];
149
+ const datum = {index: 0};
150
+ for (let batchIndex = 0; batchIndex < numOffsets - 1; batchIndex++) {
151
+ const batchStart = offsets[batchIndex];
152
+ const batchEnd = offsets[batchIndex + 1];
153
+
154
+ const batchLabels: string[] = [];
155
+ for (let rowIndex = batchStart; rowIndex < batchEnd; ++rowIndex) {
156
+ datum.index = rowIndex;
157
+ batchLabels.push(getTextAccessor(datum));
158
+ }
159
+
160
+ batchVectors.push(arrow.vectorFromArray(batchLabels, new arrow.Utf8()));
161
+ }
162
+
163
+ const input = batchVectors.flatMap(x => x.data).flat(Number.POSITIVE_INFINITY);
164
+
165
+ return new arrow.Vector(input);
166
+ };
@@ -5,12 +5,16 @@ import * as arrow from 'apache-arrow';
5
5
  import {Feature, BBox} from 'geojson';
6
6
  import {getGeoMetadata} from '@loaders.gl/gis';
7
7
 
8
+ import {GEOARROW_EXTENSIONS, GEOARROW_METADATA_KEY} from '@kepler.gl/constants';
9
+ import {KeplerTable} from '@kepler.gl/table';
8
10
  import {
9
11
  Field,
10
12
  ProtoDatasetField,
11
13
  FieldPair,
12
14
  SupportedColumnMode,
13
- LayerColumn
15
+ LayerColumn,
16
+ LayerColumns,
17
+ RGBColor
14
18
  } from '@kepler.gl/types';
15
19
  import {DataContainerInterface, ArrowDataContainer} from '@kepler.gl/utils';
16
20
  import {
@@ -19,7 +23,6 @@ import {
19
23
  BinaryGeometriesFromArrowOptions,
20
24
  updateBoundsFromGeoArrowSamples
21
25
  } from '@loaders.gl/arrow';
22
- import {EXTENSION_NAME} from '@kepler.gl/deckgl-arrow-layers';
23
26
 
24
27
  import {WKBLoader} from '@loaders.gl/wkt';
25
28
  import {geojsonToBinary} from '@loaders.gl/gis';
@@ -33,7 +36,26 @@ import {
33
36
 
34
37
  import {DeckGlGeoTypes, GeojsonDataMaps} from './geojson-layer/geojson-utils';
35
38
 
36
- export function assignPointPairToLayerColumn(pair: FieldPair, hasAlt: boolean) {
39
+ export type FindDefaultLayerProps = {
40
+ label: string;
41
+ color?: RGBColor;
42
+ isVisible?: boolean;
43
+ columns?: Record<string, LayerColumn>;
44
+ };
45
+
46
+ export type FindDefaultLayerPropsReturnValue = {
47
+ /** Layer props to create layers by default when a dataset is added */
48
+ props: FindDefaultLayerProps[];
49
+ /** layer props of possible alternative layer configurations, not created by default */
50
+ altProps?: FindDefaultLayerProps[];
51
+ /** Already found layer configurations */
52
+ foundLayers?: (FindDefaultLayerProps & {type: string})[];
53
+ };
54
+
55
+ export function assignPointPairToLayerColumn(
56
+ pair: FieldPair,
57
+ hasAlt: boolean
58
+ ): Record<string, LayerColumn> {
37
59
  const {lat, lng, altitude} = pair.pair;
38
60
  if (!hasAlt) {
39
61
  return {lat, lng};
@@ -149,7 +171,6 @@ function getBinaryGeometriesFromWKBArrow(
149
171
  }
150
172
 
151
173
  export function getGeojsonLayerMetaFromArrow({
152
- dataContainer,
153
174
  geoColumn,
154
175
  geoField,
155
176
  chunkIndex
@@ -159,7 +180,7 @@ export function getGeojsonLayerMetaFromArrow({
159
180
  geoField: ProtoDatasetField;
160
181
  chunkIndex?: number;
161
182
  }): GeojsonLayerMetaProps {
162
- const encoding = geoField?.metadata?.get('ARROW:extension:name');
183
+ const encoding = geoField?.metadata?.get(GEOARROW_METADATA_KEY);
163
184
  const options: BinaryGeometriesFromArrowOptions = {
164
185
  ...(chunkIndex !== undefined && chunkIndex >= 0
165
186
  ? {
@@ -172,7 +193,7 @@ export function getGeojsonLayerMetaFromArrow({
172
193
  };
173
194
 
174
195
  // getBinaryGeometriesFromArrow doesn't support geoarrow.wkb
175
- if (encoding === EXTENSION_NAME.WKB) {
196
+ if (encoding === GEOARROW_EXTENSIONS.WKB) {
176
197
  return getBinaryGeometriesFromWKBArrow(geoColumn, options);
177
198
  }
178
199
 
@@ -220,7 +241,7 @@ export function getHoveredObjectFromArrow(
220
241
  const rawGeometry = col?.get(objectInfo.index);
221
242
 
222
243
  const field = fieldAccessor(dataContainer);
223
- const encoding = field?.metadata?.get('ARROW:extension:name');
244
+ const encoding = field?.metadata?.get(GEOARROW_METADATA_KEY);
224
245
 
225
246
  const hoveredFeature = parseGeometryFromArrow(rawGeometry, encoding);
226
247
 
@@ -265,7 +286,7 @@ export function getGeoArrowPointFields(fields: Field[]): Field[] {
265
286
  return fields.filter(field => {
266
287
  return (
267
288
  field.type === 'geoarrow' &&
268
- field.metadata?.get('ARROW:extension:name') === EXTENSION_NAME.POINT
289
+ field.metadata?.get(GEOARROW_METADATA_KEY) === GEOARROW_EXTENSIONS.POINT
269
290
  );
270
291
  });
271
292
  }
@@ -291,7 +312,7 @@ export function createGeoArrowPointVector(
291
312
  const precision = 2;
292
313
 
293
314
  const metadata = new Map();
294
- metadata.set('ARROW:extension:name', EXTENSION_NAME.POINT);
315
+ metadata.set(GEOARROW_METADATA_KEY, GEOARROW_EXTENSIONS.POINT);
295
316
 
296
317
  const childField = new arrow.Field('xyz', new arrow.Float(precision), false, metadata);
297
318
  const fixedSizeList = new arrow.FixedSizeList(numCoords, childField);
@@ -411,3 +432,61 @@ export function getBoundsFromArrowMetadata(
411
432
 
412
433
  return false;
413
434
  }
435
+
436
+ /**
437
+ * Finds and returns the first satisfied column mode based on the provided columns and fields.
438
+ * @param supportedColumnModes - An array of supported column modes to check.
439
+ * @param columns - The available columns.
440
+ * @param fields - Optional table fields to be used for extra verification.
441
+ * @returns The first column mode that satisfies the required conditions, or undefined if none match.
442
+ */
443
+ export function getSatisfiedColumnMode(
444
+ columnModes: SupportedColumnMode[] | null,
445
+ columns: LayerColumns | undefined,
446
+ fields?: KeplerTable['fields']
447
+ ): SupportedColumnMode | undefined {
448
+ return columnModes?.find(mode => {
449
+ return mode.requiredColumns?.every(requriedCol => {
450
+ const column = columns?.[requriedCol];
451
+ if (column?.value) {
452
+ if (mode.verifyField && fields?.[column.fieldIdx]) {
453
+ const field = fields[column.fieldIdx];
454
+ return mode.verifyField(field);
455
+ }
456
+ return true;
457
+ }
458
+ return false;
459
+ });
460
+ });
461
+ }
462
+
463
+ /**
464
+ * Returns true if the field is of geoarrow point format.
465
+ * @param field A field.
466
+ * @returns Returns true if the field is of geoarrow point format.
467
+ */
468
+ export function isGeoArrowPointField(field: Field) {
469
+ return (
470
+ field.type === 'geoarrow' &&
471
+ field.metadata?.get(GEOARROW_METADATA_KEY) === GEOARROW_EXTENSIONS.POINT
472
+ );
473
+ }
474
+
475
+ /**
476
+ * Create default geoarrow column props based on the dataset.
477
+ * @param dataset A dataset to create layer props from.
478
+ * @returns geoarrow column props.
479
+ */
480
+ export function getGeoArrowPointLayerProps(dataset: KeplerTable) {
481
+ const {label} = dataset;
482
+ const altProps: FindDefaultLayerProps[] = [];
483
+ dataset.fields.forEach(field => {
484
+ if (isGeoArrowPointField(field)) {
485
+ altProps.push({
486
+ label: (typeof label === 'string' && label.replace(/\.[^/.]+$/, '')) || field.name,
487
+ columns: {geoarrow: {value: field.name, fieldIdx: field.fieldIdx}}
488
+ });
489
+ }
490
+ });
491
+ return altProps;
492
+ }
@@ -231,7 +231,7 @@ export default class LineLayer extends ArcLayer {
231
231
  };
232
232
  }
233
233
 
234
- static findDefaultLayerProps({fields, fieldPairs = []}: KeplerTable): {
234
+ static findDefaultLayerProps({fieldPairs = []}: KeplerTable): {
235
235
  props: {color?: RGBColor; columns: LineLayerColumnsConfig; label: string}[];
236
236
  } {
237
237
  if (fieldPairs.length < 2) {
@@ -36,9 +36,12 @@ import {
36
36
  assignPointPairToLayerColumn,
37
37
  isLayerHoveredFromArrow,
38
38
  getBoundsFromArrowMetadata,
39
+ getGeoArrowPointLayerProps,
40
+ isGeoArrowPointField,
39
41
  createGeoArrowPointVector,
40
42
  getFilteredIndex,
41
- getNeighbors
43
+ getNeighbors,
44
+ FindDefaultLayerProps
42
45
  } from '../layer-utils';
43
46
  import {getGeojsonPointDataMaps, GeojsonPointDataMaps} from '../geojson-layer/geojson-utils';
44
47
  import {
@@ -150,12 +153,14 @@ const SUPPORTED_COLUMN_MODES = [
150
153
  {
151
154
  key: COLUMN_MODE_GEOJSON,
152
155
  label: 'GeoJSON Feature',
153
- requiredColumns: geojsonRequiredColumns
156
+ requiredColumns: geojsonRequiredColumns,
157
+ verifyField: f => !isGeoArrowPointField(f)
154
158
  },
155
159
  {
156
160
  key: COLUMN_MODE_GEOARROW,
157
161
  label: 'Geoarrow Points',
158
- requiredColumns: geoarrowRequiredColumns
162
+ requiredColumns: geoarrowRequiredColumns,
163
+ verifyField: f => isGeoArrowPointField(f)
159
164
  }
160
165
  ];
161
166
  const DEFAULT_COLUMN_MODE = COLUMN_MODE_POINTS;
@@ -322,13 +327,10 @@ export default class PointLayer extends Layer {
322
327
  return this;
323
328
  }
324
329
 
325
- static findDefaultLayerProps({fieldPairs = [], type}: KeplerTable) {
326
- const props: {
327
- label: string;
328
- color?: RGBColor;
329
- isVisible?: boolean;
330
- columns?: PointLayerColumnsConfig;
331
- }[] = [];
330
+ static findDefaultLayerProps(dataset: KeplerTable) {
331
+ const {fieldPairs = [], type} = dataset;
332
+
333
+ const props: FindDefaultLayerProps[] = [];
332
334
 
333
335
  if (type === DatasetType.VECTOR_TILE) {
334
336
  return {props};
@@ -362,7 +364,9 @@ export default class PointLayer extends Layer {
362
364
  props.push(prop);
363
365
  });
364
366
 
365
- return {props};
367
+ const altProps = getGeoArrowPointLayerProps(dataset);
368
+
369
+ return {props, altProps};
366
370
  }
367
371
 
368
372
  getDefaultLayerConfig(props: LayerBaseConfigPartial) {
@@ -244,7 +244,7 @@ export default class TripLayer extends Layer {
244
244
 
245
245
  static findDefaultLayerProps(
246
246
  {label, fields = [], dataContainer, id}: KeplerTable,
247
- foundLayers: any[]
247
+ foundLayers?: any[]
248
248
  ) {
249
249
  const geojsonColumns = fields.filter(f => f.type === 'geojson').map(f => f.name);
250
250
 
@@ -268,7 +268,7 @@ export default class TripLayer extends Layer {
268
268
  })),
269
269
 
270
270
  // if a geojson layer is created from this column, delete it
271
- foundLayers: foundLayers.filter(
271
+ foundLayers: foundLayers?.filter(
272
272
  prop =>
273
273
  prop.type !== 'geojson' ||
274
274
  prop.dataId !== id ||
@@ -407,6 +407,8 @@ export default class TripLayer extends Layer {
407
407
  ...columnConfig,
408
408
  columnMode: COLUMN_MODE_TABLE
409
409
  });
410
+ } else {
411
+ return this;
410
412
  }
411
413
  }
412
414
 
@@ -40,6 +40,7 @@ import {
40
40
  } from '../base-layer';
41
41
  import TileDataset from './common-tile/tile-dataset';
42
42
  import {isIndexedField, isDomainQuantiles} from './common-tile/tile-utils';
43
+ import {FindDefaultLayerPropsReturnValue} from '../layer-utils';
43
44
 
44
45
  const DEFAULT_ELEVATION = 500;
45
46
  export const DEFAULT_RADIUS = 1;
@@ -64,6 +65,7 @@ export type AbstractTileLayerVisConfigSettings = {
64
65
  export type LayerData = {
65
66
  minZoom?: number;
66
67
  maxZoom?: number;
68
+ bounds?: number[];
67
69
  getPointRadius?: () => number;
68
70
  };
69
71
 
@@ -163,9 +165,7 @@ export default abstract class AbstractTileLayer<
163
165
 
164
166
  protected abstract initTileDataset(): TileDataset<T, I>;
165
167
 
166
- static findDefaultLayerProps(dataset: KeplerDataset): {
167
- props: {dataId: string; label?: string; isVisible: boolean}[];
168
- } {
168
+ static findDefaultLayerProps(dataset: KeplerDataset): FindDefaultLayerPropsReturnValue {
169
169
  if (!isTileDataset(dataset)) {
170
170
  return {props: []};
171
171
  }
@@ -409,10 +409,16 @@ export default abstract class AbstractTileLayer<
409
409
  });
410
410
 
411
411
  const metadata = dataset?.metadata as LayerData | undefined;
412
+ const metadataToData = metadata
413
+ ? {
414
+ minZoom: metadata.minZoom,
415
+ maxZoom: metadata.maxZoom,
416
+ bounds: metadata.bounds
417
+ }
418
+ : {};
412
419
 
413
420
  return {
414
- ...(metadata ? {minZoom: metadata.minZoom} : {}),
415
- ...(metadata ? {maxZoom: metadata.maxZoom} : {}),
421
+ ...metadataToData,
416
422
  ...accessors
417
423
  };
418
424
  }
@@ -5,7 +5,7 @@ import {FeatureCollection, Feature} from 'geojson';
5
5
 
6
6
  import {Layer as DeckLayer} from '@deck.gl/core/typed';
7
7
  import {_Tile2DHeader as Tile2DHeader} from '@deck.gl/geo-layers/typed';
8
- import {GeoJsonLayer} from '@deck.gl/layers/typed';
8
+ import {GeoJsonLayer, PathLayer} from '@deck.gl/layers/typed';
9
9
  import {MVTSource, MVTTileSource} from '@loaders.gl/mvt';
10
10
  import {PMTilesSource, PMTilesTileSource} from '@loaders.gl/pmtiles';
11
11
  import GL from '@luma.gl/constants';
@@ -53,6 +53,7 @@ import {
53
53
  VisualChannelDomain,
54
54
  VisualChannelField
55
55
  } from '../base-layer';
56
+ import {FindDefaultLayerPropsReturnValue} from '../layer-utils';
56
57
 
57
58
  import AbstractTileLayer, {
58
59
  LayerData as CommonLayerData,
@@ -174,6 +175,35 @@ export type VectorTileLayerVisConfigSettings = Merge<
174
175
  }
175
176
  >;
176
177
 
178
+ export function tileLayerBoundsLayer(id: string, props: {bounds?: number[]}): DeckLayer[] {
179
+ const {bounds} = props;
180
+ if (bounds?.length !== 4) return [];
181
+
182
+ const data = [
183
+ {
184
+ path: [
185
+ [bounds[0], bounds[1]],
186
+ [bounds[2], bounds[1]],
187
+ [bounds[2], bounds[3]],
188
+ [bounds[0], bounds[3]],
189
+ [bounds[0], bounds[1]]
190
+ ]
191
+ }
192
+ ];
193
+
194
+ const layer = new PathLayer({
195
+ id: `${id}-vector-tile-bounds`,
196
+ data,
197
+ getPath: d => d.path,
198
+ getColor: [128, 128, 128, 255],
199
+ getWidth: 1,
200
+ widthUnits: 'pixels',
201
+ pickable: false
202
+ });
203
+
204
+ return [layer];
205
+ }
206
+
177
207
  export default class VectorTileLayer extends AbstractTileLayer<VectorTile, Feature[]> {
178
208
  declare config: VectorTileLayerConfig;
179
209
  declare visConfigSettings: VectorTileLayerVisConfigSettings;
@@ -186,9 +216,7 @@ export default class VectorTileLayer extends AbstractTileLayer<VectorTile, Featu
186
216
 
187
217
  meta = {};
188
218
 
189
- static findDefaultLayerProps(dataset: KeplerDataset): {
190
- props: {dataId: string; label?: string; isVisible: boolean}[];
191
- } {
219
+ static findDefaultLayerProps(dataset: KeplerDataset): FindDefaultLayerPropsReturnValue {
192
220
  if (dataset.type !== DatasetType.VECTOR_TILE) {
193
221
  return {props: []};
194
222
  }
@@ -626,6 +654,7 @@ export default class VectorTileLayer extends AbstractTileLayer<VectorTile, Featu
626
654
  })
627
655
  ]
628
656
  : [])
657
+ // ...tileLayerBoundsLayer(defaultLayerProps.id, data),
629
658
  ];
630
659
 
631
660
  return layers;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@kepler.gl/localization",
3
3
  "author": "Shan He <shan@uber.com>",
4
- "version": "3.1.0",
4
+ "version": "3.1.1",
5
5
  "description": "kepler.gl constants used by kepler.gl components, actions and reducers",
6
6
  "license": "MIT",
7
7
  "main": "dist/index.js",
@@ -166,7 +166,21 @@ export declare function processKeplerglDataset(rawData: object | object[], schem
166
166
  * @returns dataset containing `fields` and `rows` or null
167
167
  */
168
168
  export declare function processArrowTable(arrowTable: ArrowTable): ProcessorResult | null;
169
- export declare function arrowSchemaToFields(schema: arrow.Schema): Field[];
169
+ /**
170
+ * Extracts GeoArrow metadata from an Apache Arrow table schema.
171
+ * For geoparquet files geoarrow metadata isn't present in fields, so extract extra info from schema.
172
+ * @param table The Apache Arrow table to extract metadata from.
173
+ * @returns An object mapping column names to their GeoArrow encoding type.
174
+ * @throws Logs an error message if parsing of metadata fails.
175
+ */
176
+ export declare function getGeoArrowMetadataFromSchema(table: arrow.Table): Record<string, string>;
177
+ /**
178
+ * Converts an Apache Arrow table schema into an array of Kepler.gl field objects.
179
+ * @param table The Apache Arrow table whose schema needs to be converted.
180
+ * @param fieldTypeSuggestions Optional mapping of field names to suggested field types.
181
+ * @returns An array of field objects suitable for Kepler.gl.
182
+ */
183
+ export declare function arrowSchemaToFields(table: arrow.Table, fieldTypeSuggestions?: Record<string, string>): Field[];
170
184
  /**
171
185
  * Parse arrow batches returned from parseInBatches()
172
186
  *