@sqlrooms/deck 0.29.0-rc.11 → 0.29.0-rc.13
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.
- package/README.md +193 -35
- package/dist/BlockMapSettings.d.ts.map +1 -1
- package/dist/BlockMapSettings.js +4 -16
- package/dist/BlockMapSettings.js.map +1 -1
- package/dist/DashboardMapSettings.d.ts.map +1 -1
- package/dist/DashboardMapSettings.js +7 -10
- package/dist/DashboardMapSettings.js.map +1 -1
- package/dist/DeckJsonMap.d.ts.map +1 -1
- package/dist/DeckJsonMap.js +75 -23
- package/dist/DeckJsonMap.js.map +1 -1
- package/dist/DeckJsonMapSpec.d.ts +41 -0
- package/dist/DeckJsonMapSpec.d.ts.map +1 -1
- package/dist/DeckJsonMapSpec.js +2 -0
- package/dist/DeckJsonMapSpec.js.map +1 -1
- package/dist/DeckMapBasemapSelect.d.ts +9 -0
- package/dist/DeckMapBasemapSelect.d.ts.map +1 -0
- package/dist/DeckMapBasemapSelect.js +20 -0
- package/dist/DeckMapBasemapSelect.js.map +1 -0
- package/dist/DeckMapDefaultStylesProvider.d.ts +13 -19
- package/dist/DeckMapDefaultStylesProvider.d.ts.map +1 -1
- package/dist/DeckMapDefaultStylesProvider.js +11 -18
- package/dist/DeckMapDefaultStylesProvider.js.map +1 -1
- package/dist/DeckMapSurface.d.ts +1 -1
- package/dist/DeckMapSurface.js +1 -1
- package/dist/DeckMapSurface.js.map +1 -1
- package/dist/DeckMapsSlice.d.ts +5 -0
- package/dist/DeckMapsSlice.d.ts.map +1 -1
- package/dist/DeckMapsSlice.js +6 -3
- package/dist/DeckMapsSlice.js.map +1 -1
- package/dist/MapSettings.d.ts +14 -0
- package/dist/MapSettings.d.ts.map +1 -1
- package/dist/MapSettings.js +548 -192
- package/dist/MapSettings.js.map +1 -1
- package/dist/MapSettingsControls.d.ts +8 -1
- package/dist/MapSettingsControls.d.ts.map +1 -1
- package/dist/MapSettingsControls.js +24 -2
- package/dist/MapSettingsControls.js.map +1 -1
- package/dist/ai.d.ts.map +1 -1
- package/dist/ai.js +20 -12
- package/dist/ai.js.map +1 -1
- package/dist/aiNormalize.d.ts.map +1 -1
- package/dist/aiNormalize.js +2 -1
- package/dist/aiNormalize.js.map +1 -1
- package/dist/basemap.d.ts +23 -0
- package/dist/basemap.d.ts.map +1 -0
- package/dist/basemap.js +23 -0
- package/dist/basemap.js.map +1 -0
- package/dist/block.d.ts +1 -1
- package/dist/block.d.ts.map +1 -1
- package/dist/block.js +13 -9
- package/dist/block.js.map +1 -1
- package/dist/createOrUpdateDeckMapResource.d.ts +6 -2
- package/dist/createOrUpdateDeckMapResource.d.ts.map +1 -1
- package/dist/createOrUpdateDeckMapResource.js +57 -4
- package/dist/createOrUpdateDeckMapResource.js.map +1 -1
- package/dist/datasets/PreparedDatasetStore.d.ts +3 -4
- package/dist/datasets/PreparedDatasetStore.d.ts.map +1 -1
- package/dist/datasets/PreparedDatasetStore.js +4 -8
- package/dist/datasets/PreparedDatasetStore.js.map +1 -1
- package/dist/datasets/helpers.d.ts +39 -2
- package/dist/datasets/helpers.d.ts.map +1 -1
- package/dist/datasets/helpers.js +86 -3
- package/dist/datasets/helpers.js.map +1 -1
- package/dist/datasets/usePreparedDatasetStates.d.ts.map +1 -1
- package/dist/datasets/usePreparedDatasetStates.js +12 -8
- package/dist/datasets/usePreparedDatasetStates.js.map +1 -1
- package/dist/index.d.ts +6 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -2
- package/dist/index.js.map +1 -1
- package/dist/json/colorScaleFunction.d.ts +12 -4
- package/dist/json/colorScaleFunction.d.ts.map +1 -1
- package/dist/json/colorScaleFunction.js.map +1 -1
- package/dist/json/compileColorScale.d.ts +3 -2
- package/dist/json/compileColorScale.d.ts.map +1 -1
- package/dist/json/compileColorScale.js +16 -1
- package/dist/json/compileColorScale.js.map +1 -1
- package/dist/json/createDeckJsonConfiguration.d.ts.map +1 -1
- package/dist/json/createDeckJsonConfiguration.js +235 -175
- package/dist/json/createDeckJsonConfiguration.js.map +1 -1
- package/dist/json/defaultClasses.d.ts.map +1 -1
- package/dist/json/defaultClasses.js +3 -3
- package/dist/json/defaultClasses.js.map +1 -1
- package/dist/json/extractColorScaleLegends.d.ts.map +1 -1
- package/dist/json/extractColorScaleLegends.js +41 -26
- package/dist/json/extractColorScaleLegends.js.map +1 -1
- package/dist/json/heatmapDefaults.d.ts +17 -7
- package/dist/json/heatmapDefaults.d.ts.map +1 -1
- package/dist/json/heatmapDefaults.js +54 -12
- package/dist/json/heatmapDefaults.js.map +1 -1
- package/dist/json/layers/DeckHeatmapLayer.d.ts +32 -0
- package/dist/json/layers/DeckHeatmapLayer.d.ts.map +1 -0
- package/dist/json/layers/DeckHeatmapLayer.js +69 -0
- package/dist/json/layers/DeckHeatmapLayer.js.map +1 -0
- package/dist/json/layers/index.d.ts +1 -0
- package/dist/json/layers/index.d.ts.map +1 -1
- package/dist/json/layers/index.js +1 -0
- package/dist/json/layers/index.js.map +1 -1
- package/dist/json/rewriteGeoArrowAccessors.d.ts.map +1 -1
- package/dist/json/rewriteGeoArrowAccessors.js +13 -5
- package/dist/json/rewriteGeoArrowAccessors.js.map +1 -1
- package/dist/json/scaleFunction.d.ts +5 -8
- package/dist/json/scaleFunction.d.ts.map +1 -1
- package/dist/json/scaleFunction.js +30 -5
- package/dist/json/scaleFunction.js.map +1 -1
- package/dist/mapAiConfig.d.ts +6 -0
- package/dist/mapAiConfig.d.ts.map +1 -1
- package/dist/mapAiConfig.js +7 -0
- package/dist/mapAiConfig.js.map +1 -1
- package/dist/mapAiSharedInstructions.d.ts +1 -1
- package/dist/mapAiSharedInstructions.d.ts.map +1 -1
- package/dist/mapAiSharedInstructions.js +4 -3
- package/dist/mapAiSharedInstructions.js.map +1 -1
- package/dist/mapConfig.d.ts +6 -1
- package/dist/mapConfig.d.ts.map +1 -1
- package/dist/mapConfig.js +28 -3
- package/dist/mapConfig.js.map +1 -1
- package/dist/mapConfigUtils.d.ts +22 -0
- package/dist/mapConfigUtils.d.ts.map +1 -1
- package/dist/mapConfigUtils.js +152 -5
- package/dist/mapConfigUtils.js.map +1 -1
- package/dist/mapLayerConfigUtils.d.ts +55 -0
- package/dist/mapLayerConfigUtils.d.ts.map +1 -1
- package/dist/mapLayerConfigUtils.js +222 -11
- package/dist/mapLayerConfigUtils.js.map +1 -1
- package/dist/mapResourceAuthoring.d.ts +1 -1
- package/dist/mapResourceAuthoring.d.ts.map +1 -1
- package/dist/mapResourceAuthoring.js +14 -7
- package/dist/mapResourceAuthoring.js.map +1 -1
- package/dist/mapStyles.d.ts +16 -0
- package/dist/mapStyles.d.ts.map +1 -0
- package/dist/mapStyles.js +32 -0
- package/dist/mapStyles.js.map +1 -0
- package/dist/prepare/prepareDeckDataset.d.ts.map +1 -1
- package/dist/prepare/prepareDeckDataset.js +1 -0
- package/dist/prepare/prepareDeckDataset.js.map +1 -1
- package/dist/prepare/types.d.ts +3 -0
- package/dist/prepare/types.d.ts.map +1 -1
- package/dist/prepare/types.js.map +1 -1
- package/dist/prepare/wkbDecoder.d.ts.map +1 -1
- package/dist/prepare/wkbDecoder.js +62 -16
- package/dist/prepare/wkbDecoder.js.map +1 -1
- package/dist/prepare/wkbParser.d.ts +2 -0
- package/dist/prepare/wkbParser.d.ts.map +1 -1
- package/dist/prepare/wkbParser.js +1 -0
- package/dist/prepare/wkbParser.js.map +1 -1
- package/dist/protomapsStyles.d.ts +18 -0
- package/dist/protomapsStyles.d.ts.map +1 -0
- package/dist/protomapsStyles.js +38 -0
- package/dist/protomapsStyles.js.map +1 -0
- package/dist/types.d.ts +13 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +11 -9
|
@@ -4,7 +4,7 @@ import { tryAggregateWaypointsToLineStrings } from './aggregateWaypoints';
|
|
|
4
4
|
import { createColorScaleMarker, getAllColorScales, COLOR_SCALE_PROP_NAMES, } from './colorScaleFunction';
|
|
5
5
|
import { compileColorScale } from './compileColorScale';
|
|
6
6
|
import { DEFAULT_DECK_JSON_CLASSES, DEFAULT_DECK_JSON_CONSTANTS, DEFAULT_DECK_JSON_ENUMERATIONS, } from './defaultClasses';
|
|
7
|
-
import { DEFAULT_HEATMAP_COLOR_RANGE } from './heatmapDefaults';
|
|
7
|
+
import { DEFAULT_HEATMAP_COLOR_RANGE, DEFAULT_HEATMAP_WEIGHTS_TEXTURE_SIZE, } from './heatmapDefaults';
|
|
8
8
|
import { getLayerCompatibility } from './layerCompatibility';
|
|
9
9
|
import { isManagedLayer, resolveConfiguredColumn, resolveDatasetId, resolveGeometryColumn, stripLayerExtensionProps, } from './layerConfig';
|
|
10
10
|
import { rewriteGeoArrowAccessors } from './rewriteGeoArrowAccessors';
|
|
@@ -14,6 +14,15 @@ function getLayerName(Class) {
|
|
|
14
14
|
const maybeClass = Class;
|
|
15
15
|
return maybeClass.layerName ?? maybeClass.name ?? 'UnknownLayer';
|
|
16
16
|
}
|
|
17
|
+
/**
|
|
18
|
+
* Deck.gl matches layers by id. Each JSON convert would otherwise create a new
|
|
19
|
+
* GPU layer. Dataset id alone collides when two layers share a dataset.
|
|
20
|
+
*/
|
|
21
|
+
function assignStableLayerId(props, datasetId, layerName, index) {
|
|
22
|
+
if (typeof props.id === 'string' && props.id !== '')
|
|
23
|
+
return;
|
|
24
|
+
props.id = `${datasetId}:${layerName}:${index}`;
|
|
25
|
+
}
|
|
17
26
|
function applyColorScale(options) {
|
|
18
27
|
const { props, table } = options;
|
|
19
28
|
const allScales = getAllColorScales(props);
|
|
@@ -46,6 +55,93 @@ function applyColorScale(options) {
|
|
|
46
55
|
}
|
|
47
56
|
return result;
|
|
48
57
|
}
|
|
58
|
+
function getElevationTrigger(rawElev) {
|
|
59
|
+
if (rawElev === undefined)
|
|
60
|
+
return 'none';
|
|
61
|
+
if (typeof rawElev === 'string' || typeof rawElev === 'number') {
|
|
62
|
+
return String(rawElev);
|
|
63
|
+
}
|
|
64
|
+
try {
|
|
65
|
+
return JSON.stringify(rawElev);
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
return String(rawElev);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
function mergeGetElevationTrigger(props, rawElev) {
|
|
72
|
+
const existing = props.updateTriggers &&
|
|
73
|
+
typeof props.updateTriggers === 'object' &&
|
|
74
|
+
!Array.isArray(props.updateTriggers)
|
|
75
|
+
? props.updateTriggers
|
|
76
|
+
: {};
|
|
77
|
+
return {
|
|
78
|
+
...props,
|
|
79
|
+
updateTriggers: {
|
|
80
|
+
...existing,
|
|
81
|
+
getElevation: getElevationTrigger(rawElev),
|
|
82
|
+
},
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
/** Compile `getElevation` scale / `@@=` column accessors against the Arrow table. */
|
|
86
|
+
function compileGetElevation(options) {
|
|
87
|
+
const { table, layerName, datasetId, requireFunctionAccessor } = options;
|
|
88
|
+
const nextProps = { ...options.props };
|
|
89
|
+
const rawElev = nextProps.getElevation;
|
|
90
|
+
if (isScaleMarker(rawElev)) {
|
|
91
|
+
const expression = requireFunctionAccessor
|
|
92
|
+
? undefined
|
|
93
|
+
: compileLinearScaleExpression(table, rawElev);
|
|
94
|
+
if (expression) {
|
|
95
|
+
nextProps.getElevation = expression;
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
const accessor = compileLinearScaleAccessor(table, rawElev);
|
|
99
|
+
if (accessor) {
|
|
100
|
+
nextProps.getElevation = accessor;
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
const field = typeof rawElev.field === 'string' ? rawElev.field : '';
|
|
104
|
+
throw new Error(`Layer "${layerName}" getElevation scale field "${field || '(missing)'}" was not found in dataset "${datasetId}".`);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
else if (typeof rawElev === 'string' && rawElev.startsWith('@@=')) {
|
|
109
|
+
const elevField = rawElev.slice(3).trim();
|
|
110
|
+
const elevVector = table.getChild(elevField);
|
|
111
|
+
if (elevVector) {
|
|
112
|
+
let min = Infinity;
|
|
113
|
+
for (let i = 0; i < elevVector.length; i++) {
|
|
114
|
+
if (typeof elevVector.isValid === 'function' &&
|
|
115
|
+
!elevVector.isValid(i)) {
|
|
116
|
+
continue;
|
|
117
|
+
}
|
|
118
|
+
const raw = elevVector.get(i);
|
|
119
|
+
if (raw == null)
|
|
120
|
+
continue;
|
|
121
|
+
const v = Number(raw);
|
|
122
|
+
if (Number.isFinite(v) && v < min)
|
|
123
|
+
min = v;
|
|
124
|
+
}
|
|
125
|
+
if (Number.isFinite(min)) {
|
|
126
|
+
if (!requireFunctionAccessor &&
|
|
127
|
+
isBindableGeoArrowFieldIdentifier(elevField)) {
|
|
128
|
+
if (min !== 0) {
|
|
129
|
+
nextProps.getElevation = `@@=Math.max(0, ${elevField} - ${min})`;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
const accessor = compileLinearScaleAccessor(table, {
|
|
134
|
+
field: elevField,
|
|
135
|
+
domain: [min, min],
|
|
136
|
+
});
|
|
137
|
+
if (accessor)
|
|
138
|
+
nextProps.getElevation = accessor;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
return nextProps;
|
|
144
|
+
}
|
|
49
145
|
function resolveGeoArrowBindings(options) {
|
|
50
146
|
const { layerName, compatibility, layerProps, prepared, props } = options;
|
|
51
147
|
let table = prepared.table;
|
|
@@ -111,7 +207,7 @@ function resolveGeoArrowBindings(options) {
|
|
|
111
207
|
`(geometry encoding "${resolvedGeometry.encoding}"). ` +
|
|
112
208
|
`Use a point geometry column, or transformSql with ` +
|
|
113
209
|
`ST_AsWKB(ST_Centroid(geom)) / ST_PointOnSurface(geom). ` +
|
|
114
|
-
`For building footprints prefer GeoArrowPolygonLayer
|
|
210
|
+
`For building footprints prefer GeoArrowPolygonLayer or GeoJsonLayer.`);
|
|
115
211
|
}
|
|
116
212
|
boundProps[binding.prop] = promoted.geometryColumn;
|
|
117
213
|
if (table === prepared.table) {
|
|
@@ -164,6 +260,7 @@ function resolveGeoArrowBindings(options) {
|
|
|
164
260
|
}
|
|
165
261
|
export function createDeckJsonConfiguration(options) {
|
|
166
262
|
const { datasetStates, datasetIds } = options;
|
|
263
|
+
let nextManagedLayerIndex = 0;
|
|
167
264
|
return new JSONConfiguration({
|
|
168
265
|
classes: DEFAULT_DECK_JSON_CLASSES,
|
|
169
266
|
enumerations: DEFAULT_DECK_JSON_ENUMERATIONS,
|
|
@@ -177,198 +274,161 @@ export function createDeckJsonConfiguration(options) {
|
|
|
177
274
|
// can rewrite them for GeoArrow's batch-oriented callback contract.
|
|
178
275
|
convertFunction: ((expression) => `@@=${expression}`),
|
|
179
276
|
preProcessClassProps: (Class, props) => {
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
if (!compatibility) {
|
|
183
|
-
return props;
|
|
184
|
-
}
|
|
185
|
-
const layerProps = props;
|
|
186
|
-
const extensionProps = layerProps;
|
|
187
|
-
const datasetId = resolveDatasetId(extensionProps, datasetIds);
|
|
188
|
-
const managed = isManagedLayer(extensionProps, datasetIds) ||
|
|
189
|
-
(datasetIds.length > 1 && layerProps.data === undefined);
|
|
190
|
-
if (!managed) {
|
|
191
|
-
return props;
|
|
192
|
-
}
|
|
193
|
-
if (!datasetId) {
|
|
194
|
-
throw new Error(`Layer "${layerName}" must declare _sqlroomsBinding.dataset when multiple datasets are available.`);
|
|
195
|
-
}
|
|
196
|
-
const datasetState = datasetStates[datasetId];
|
|
197
|
-
if (!datasetState) {
|
|
198
|
-
throw new Error(`Layer "${layerName}" references unknown dataset "${datasetId}".`);
|
|
277
|
+
try {
|
|
278
|
+
return preprocessManagedLayer();
|
|
199
279
|
}
|
|
200
|
-
|
|
201
|
-
|
|
280
|
+
catch (error) {
|
|
281
|
+
// JSONConverter skips postProcessConvertedJson when convert throws.
|
|
282
|
+
nextManagedLayerIndex = 0;
|
|
283
|
+
throw error;
|
|
202
284
|
}
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
285
|
+
function preprocessManagedLayer() {
|
|
286
|
+
const layerName = getLayerName(Class);
|
|
287
|
+
const compatibility = getLayerCompatibility(layerName);
|
|
288
|
+
if (!compatibility) {
|
|
289
|
+
return props;
|
|
290
|
+
}
|
|
291
|
+
const layerProps = props;
|
|
292
|
+
const extensionProps = layerProps;
|
|
293
|
+
const datasetId = resolveDatasetId(extensionProps, datasetIds);
|
|
294
|
+
const managed = isManagedLayer(extensionProps, datasetIds) ||
|
|
295
|
+
(datasetIds.length > 1 && layerProps.data === undefined);
|
|
296
|
+
if (!managed) {
|
|
297
|
+
return props;
|
|
298
|
+
}
|
|
299
|
+
if (!datasetId) {
|
|
300
|
+
throw new Error(`Layer "${layerName}" must declare _sqlroomsBinding.dataset when multiple datasets are available.`);
|
|
301
|
+
}
|
|
302
|
+
const datasetState = datasetStates[datasetId];
|
|
303
|
+
if (!datasetState) {
|
|
304
|
+
throw new Error(`Layer "${layerName}" references unknown dataset "${datasetId}".`);
|
|
305
|
+
}
|
|
306
|
+
if (datasetState.status !== 'ready') {
|
|
307
|
+
const pendingProps = stripLayerExtensionProps(layerProps);
|
|
308
|
+
assignStableLayerId(pendingProps, datasetId, layerName, nextManagedLayerIndex++);
|
|
309
|
+
return { ...pendingProps, data: [] };
|
|
310
|
+
}
|
|
311
|
+
const prepared = datasetState.prepared;
|
|
312
|
+
const geometryColumn = resolveGeometryColumn(extensionProps);
|
|
313
|
+
const strippedProps = stripLayerExtensionProps(layerProps);
|
|
314
|
+
assignStableLayerId(strippedProps, datasetId, layerName, nextManagedLayerIndex++);
|
|
315
|
+
if (compatibility.representation === 'geojson') {
|
|
316
|
+
const baseProps = applyColorScale({
|
|
317
|
+
props: strippedProps,
|
|
318
|
+
table: prepared.table,
|
|
319
|
+
});
|
|
320
|
+
const withElevation = compileGetElevation({
|
|
321
|
+
props: baseProps,
|
|
322
|
+
table: prepared.table,
|
|
323
|
+
layerName,
|
|
324
|
+
datasetId: prepared.datasetId,
|
|
325
|
+
requireFunctionAccessor: true,
|
|
326
|
+
});
|
|
327
|
+
return {
|
|
328
|
+
...mergeGetElevationTrigger(withElevation, baseProps.getElevation),
|
|
329
|
+
data: prepared.getGeoJsonBinaryData(geometryColumn),
|
|
330
|
+
};
|
|
331
|
+
}
|
|
332
|
+
const { table, boundProps } = resolveGeoArrowBindings({
|
|
333
|
+
layerName,
|
|
334
|
+
compatibility: compatibility,
|
|
335
|
+
layerProps: extensionProps,
|
|
336
|
+
prepared,
|
|
337
|
+
props: strippedProps,
|
|
338
|
+
});
|
|
207
339
|
const baseProps = applyColorScale({
|
|
208
340
|
props: strippedProps,
|
|
209
|
-
table
|
|
341
|
+
table,
|
|
210
342
|
});
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
if (expression) {
|
|
237
|
-
nextProps.getElevation = expression;
|
|
238
|
-
}
|
|
239
|
-
else {
|
|
240
|
-
// Non-identifier fields need a compiled accessor, not @@=.
|
|
241
|
-
const accessor = compileLinearScaleAccessor(table, rawElev);
|
|
242
|
-
if (accessor) {
|
|
243
|
-
nextProps.getElevation = accessor;
|
|
343
|
+
const nextProps = compileGetElevation({
|
|
344
|
+
props: {
|
|
345
|
+
...baseProps,
|
|
346
|
+
data: table,
|
|
347
|
+
...boundProps,
|
|
348
|
+
},
|
|
349
|
+
table,
|
|
350
|
+
layerName,
|
|
351
|
+
datasetId: prepared.datasetId,
|
|
352
|
+
});
|
|
353
|
+
const rewritten = rewriteGeoArrowAccessors({
|
|
354
|
+
props: nextProps,
|
|
355
|
+
table,
|
|
356
|
+
layerName,
|
|
357
|
+
});
|
|
358
|
+
// Set updateTriggers for @@= accessor props and getElevation
|
|
359
|
+
// so deck.gl re-evaluates them when references change or are cleared.
|
|
360
|
+
{
|
|
361
|
+
const accessorTriggers = {};
|
|
362
|
+
for (const [propName, propValue] of Object.entries(nextProps)) {
|
|
363
|
+
if (typeof propValue === 'string' &&
|
|
364
|
+
propValue.startsWith('@@=') &&
|
|
365
|
+
propName.startsWith('get')) {
|
|
366
|
+
accessorTriggers[propName] = propValue;
|
|
367
|
+
}
|
|
244
368
|
}
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
369
|
+
// Always emit getElevation trigger so clearing the column invalidates
|
|
370
|
+
// stale heights from a previous column-based accessor.
|
|
371
|
+
if (!('getElevation' in accessorTriggers)) {
|
|
372
|
+
const elev = nextProps.getElevation;
|
|
373
|
+
accessorTriggers.getElevation =
|
|
374
|
+
elev !== undefined ? String(elev) : 'none';
|
|
250
375
|
}
|
|
376
|
+
const existingTriggers = rewritten.updateTriggers &&
|
|
377
|
+
typeof rewritten.updateTriggers === 'object' &&
|
|
378
|
+
!Array.isArray(rewritten.updateTriggers)
|
|
379
|
+
? rewritten.updateTriggers
|
|
380
|
+
: {};
|
|
381
|
+
rewritten.updateTriggers = {
|
|
382
|
+
...existingTriggers,
|
|
383
|
+
...accessorTriggers,
|
|
384
|
+
};
|
|
251
385
|
}
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
min = v;
|
|
269
|
-
}
|
|
270
|
-
if (Number.isFinite(min)) {
|
|
271
|
-
if (isBindableGeoArrowFieldIdentifier(elevField)) {
|
|
272
|
-
if (min !== 0) {
|
|
273
|
-
nextProps.getElevation = `@@=Math.max(0, ${elevField} - ${min})`;
|
|
386
|
+
// For TripsLayer: compute max timestamp for animation and set defaults
|
|
387
|
+
if (layerName === 'GeoArrowTripsLayer' || layerName === 'TripsLayer') {
|
|
388
|
+
const tsVector = boundProps.getTimestamps;
|
|
389
|
+
if (tsVector) {
|
|
390
|
+
let maxTs = 0;
|
|
391
|
+
for (let i = 0; i < tsVector.length; i++) {
|
|
392
|
+
const listItem = tsVector.get(i);
|
|
393
|
+
if (listItem &&
|
|
394
|
+
typeof listItem === 'object' &&
|
|
395
|
+
'length' in listItem) {
|
|
396
|
+
const list = listItem;
|
|
397
|
+
for (let j = 0; j < list.length; j++) {
|
|
398
|
+
const v = Number(list.get(j)) || 0;
|
|
399
|
+
if (v > maxTs)
|
|
400
|
+
maxTs = v;
|
|
401
|
+
}
|
|
274
402
|
}
|
|
275
403
|
}
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
}
|
|
281
|
-
if (
|
|
282
|
-
|
|
404
|
+
if (maxTs > 0) {
|
|
405
|
+
rewritten._tripsMaxTimestamp = maxTs;
|
|
406
|
+
if (!rewritten.trailLength) {
|
|
407
|
+
rewritten.trailLength = maxTs;
|
|
408
|
+
}
|
|
409
|
+
if (rewritten.currentTime === undefined ||
|
|
410
|
+
rewritten.currentTime === 0) {
|
|
411
|
+
rewritten.currentTime = maxTs;
|
|
412
|
+
}
|
|
283
413
|
}
|
|
284
414
|
}
|
|
285
415
|
}
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
// Set updateTriggers for @@= accessor props and getElevation
|
|
293
|
-
// so deck.gl re-evaluates them when references change or are cleared.
|
|
294
|
-
{
|
|
295
|
-
const accessorTriggers = {};
|
|
296
|
-
for (const [propName, propValue] of Object.entries(nextProps)) {
|
|
297
|
-
if (typeof propValue === 'string' &&
|
|
298
|
-
propValue.startsWith('@@=') &&
|
|
299
|
-
propName.startsWith('get')) {
|
|
300
|
-
accessorTriggers[propName] = propValue;
|
|
301
|
-
}
|
|
302
|
-
}
|
|
303
|
-
// Always emit getElevation trigger so clearing the column invalidates
|
|
304
|
-
// stale heights from a previous column-based accessor.
|
|
305
|
-
if (!('getElevation' in accessorTriggers)) {
|
|
306
|
-
const elev = nextProps.getElevation;
|
|
307
|
-
accessorTriggers.getElevation =
|
|
308
|
-
elev !== undefined ? String(elev) : 'none';
|
|
309
|
-
}
|
|
310
|
-
const existingTriggers = rewritten.updateTriggers &&
|
|
311
|
-
typeof rewritten.updateTriggers === 'object' &&
|
|
312
|
-
!Array.isArray(rewritten.updateTriggers)
|
|
313
|
-
? rewritten.updateTriggers
|
|
314
|
-
: {};
|
|
315
|
-
rewritten.updateTriggers = {
|
|
316
|
-
...existingTriggers,
|
|
317
|
-
...accessorTriggers,
|
|
318
|
-
};
|
|
319
|
-
}
|
|
320
|
-
// For TripsLayer: compute max timestamp for animation and set defaults
|
|
321
|
-
if (layerName === 'GeoArrowTripsLayer' || layerName === 'TripsLayer') {
|
|
322
|
-
const tsVector = boundProps.getTimestamps;
|
|
323
|
-
if (tsVector) {
|
|
324
|
-
let maxTs = 0;
|
|
325
|
-
for (let i = 0; i < tsVector.length; i++) {
|
|
326
|
-
const listItem = tsVector.get(i);
|
|
327
|
-
if (listItem &&
|
|
328
|
-
typeof listItem === 'object' &&
|
|
329
|
-
'length' in listItem) {
|
|
330
|
-
const list = listItem;
|
|
331
|
-
for (let j = 0; j < list.length; j++) {
|
|
332
|
-
const v = Number(list.get(j)) || 0;
|
|
333
|
-
if (v > maxTs)
|
|
334
|
-
maxTs = v;
|
|
335
|
-
}
|
|
336
|
-
}
|
|
416
|
+
// HeatmapLayer remaps colorRange in _updateColorTexture. Putting it in
|
|
417
|
+
// getWeight updateTriggers would mark aggregation dirty and rebuild the
|
|
418
|
+
// GPU weight texture when only the colormap changed.
|
|
419
|
+
if (layerName === 'GeoArrowHeatmapLayer') {
|
|
420
|
+
if (!rewritten.colorRange) {
|
|
421
|
+
rewritten.colorRange = DEFAULT_HEATMAP_COLOR_RANGE;
|
|
337
422
|
}
|
|
338
|
-
if (
|
|
339
|
-
rewritten.
|
|
340
|
-
if (!rewritten.trailLength) {
|
|
341
|
-
rewritten.trailLength = maxTs;
|
|
342
|
-
}
|
|
343
|
-
if (rewritten.currentTime === undefined ||
|
|
344
|
-
rewritten.currentTime === 0) {
|
|
345
|
-
rewritten.currentTime = maxTs;
|
|
346
|
-
}
|
|
423
|
+
if (rewritten.weightsTextureSize === undefined) {
|
|
424
|
+
rewritten.weightsTextureSize = DEFAULT_HEATMAP_WEIGHTS_TEXTURE_SIZE;
|
|
347
425
|
}
|
|
348
426
|
}
|
|
427
|
+
return rewritten;
|
|
349
428
|
}
|
|
350
|
-
// For HeatmapLayer: apply default colorRange (YlOrRd) when not explicitly set.
|
|
351
|
-
// Also set updateTriggers to force re-aggregation when colorRange changes.
|
|
352
|
-
if (layerName === 'GeoArrowHeatmapLayer') {
|
|
353
|
-
if (!rewritten.colorRange) {
|
|
354
|
-
rewritten.colorRange = DEFAULT_HEATMAP_COLOR_RANGE;
|
|
355
|
-
}
|
|
356
|
-
const existingTriggers = rewritten.updateTriggers &&
|
|
357
|
-
typeof rewritten.updateTriggers === 'object' &&
|
|
358
|
-
!Array.isArray(rewritten.updateTriggers)
|
|
359
|
-
? rewritten.updateTriggers
|
|
360
|
-
: {};
|
|
361
|
-
const previousGetWeight = existingTriggers.getWeight;
|
|
362
|
-
rewritten.updateTriggers = {
|
|
363
|
-
...existingTriggers,
|
|
364
|
-
getWeight: previousGetWeight === undefined
|
|
365
|
-
? JSON.stringify(rewritten.colorRange)
|
|
366
|
-
: [previousGetWeight, JSON.stringify(rewritten.colorRange)],
|
|
367
|
-
};
|
|
368
|
-
}
|
|
369
|
-
return rewritten;
|
|
370
429
|
},
|
|
371
430
|
postProcessConvertedJson: (json) => {
|
|
431
|
+
nextManagedLayerIndex = 0;
|
|
372
432
|
if (json &&
|
|
373
433
|
typeof json === 'object' &&
|
|
374
434
|
'layers' in json &&
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createDeckJsonConfiguration.js","sourceRoot":"","sources":["../../src/json/createDeckJsonConfiguration.ts"],"names":[],"mappings":"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","sourcesContent":["import {JSONConfiguration} from '@deck.gl/json';\nimport * as arrow from 'apache-arrow';\nimport type {ColorScaleConfig} from '@sqlrooms/color-scales';\nimport {\n isPointPositionLayer,\n promoteToPointPositions,\n wkbGeometryDecoder,\n describeGeoArrowPromotionFailure,\n} from '../prepare/wkbDecoder';\nimport {tryAggregateWaypointsToLineStrings} from './aggregateWaypoints';\nimport type {LayerBindingProps, PreparedDeckDatasetState} from '../types';\nimport {\n createColorScaleMarker,\n getAllColorScales,\n COLOR_SCALE_PROP_NAMES,\n} from './colorScaleFunction';\nimport {compileColorScale} from './compileColorScale';\nimport {\n DEFAULT_DECK_JSON_CLASSES,\n DEFAULT_DECK_JSON_CONSTANTS,\n DEFAULT_DECK_JSON_ENUMERATIONS,\n} from './defaultClasses';\nimport {DEFAULT_HEATMAP_COLOR_RANGE} from './heatmapDefaults';\nimport {getLayerCompatibility} from './layerCompatibility';\nimport {\n isManagedLayer,\n resolveConfiguredColumn,\n resolveDatasetId,\n resolveGeometryColumn,\n stripLayerExtensionProps,\n} from './layerConfig';\nimport {rewriteGeoArrowAccessors} from './rewriteGeoArrowAccessors';\nimport {isBindableGeoArrowFieldIdentifier} from './compileGeoArrowAccessor';\nimport {\n compileLinearScaleAccessor,\n compileLinearScaleExpression,\n createScaleMarker,\n isScaleMarker,\n} from './scaleFunction';\n\ntype CreateDeckJsonConfigurationOptions = {\n datasetStates: Record<string, PreparedDeckDatasetState>;\n datasetIds: string[];\n};\n\nfunction getLayerName(Class: unknown) {\n const maybeClass = Class as {layerName?: string; name?: string};\n return maybeClass.layerName ?? maybeClass.name ?? 'UnknownLayer';\n}\n\nfunction applyColorScale(options: {\n props: Record<string, unknown>;\n table: import('apache-arrow').Table;\n}) {\n const {props, table} = options;\n const allScales = getAllColorScales(props);\n\n let result = props;\n const triggers: Record<string, unknown> =\n result.updateTriggers &&\n typeof result.updateTriggers === 'object' &&\n !Array.isArray(result.updateTriggers)\n ? {...(result.updateTriggers as Record<string, unknown>)}\n : {};\n\n for (const {propName, colorScale} of allScales) {\n result = {\n ...result,\n [propName]: compileColorScale({\n table,\n colorScale,\n }),\n };\n triggers[propName] = JSON.stringify(colorScale);\n }\n\n // Set updateTriggers for color props that are static or absent (not a scale)\n // so deck.gl detects changes when a scale is cleared or a constant value changes.\n for (const propName of COLOR_SCALE_PROP_NAMES) {\n if (!(propName in triggers)) {\n const value = result[propName];\n triggers[propName] = value !== undefined ? JSON.stringify(value) : 'none';\n }\n }\n\n if (Object.keys(triggers).length > 0) {\n result = {...result, updateTriggers: triggers};\n }\n\n return result;\n}\n\nfunction resolveGeoArrowBindings(options: {\n layerName: string;\n compatibility: NonNullable<ReturnType<typeof getLayerCompatibility>> & {\n representation: 'geoarrow';\n };\n layerProps: LayerBindingProps & Record<string, unknown>;\n prepared: Extract<PreparedDeckDatasetState, {status: 'ready'}>['prepared'];\n props: Record<string, unknown>;\n}) {\n const {layerName, compatibility, layerProps, prepared, props} = options;\n let table = prepared.table;\n const boundProps: Record<string, unknown> = {};\n\n for (const binding of compatibility.bindings) {\n const existing = props[binding.prop];\n // Prefer Arrow Vector over `@@=column` (avoids empty H3 / missing-column silence).\n const existingIsSimpleAccessor =\n typeof existing === 'string' &&\n /^@@=[A-Za-z_$][\\w$]*$/.test(existing.trim());\n if (existing !== undefined && !existingIsSimpleAccessor) {\n continue;\n }\n\n if (binding.kind === 'geometry') {\n const columnName =\n resolveConfiguredColumn(layerProps, binding.configKey) ??\n (existingIsSimpleAccessor\n ? (existing as string).trim().slice(3)\n : undefined);\n if (binding.required && !columnName) {\n throw new Error(\n `Layer \"${layerName}\" requires _sqlroomsBinding.${binding.configKey}.`,\n );\n }\n\n let resolvedGeometry;\n try {\n resolvedGeometry = prepared.resolveGeometry(columnName);\n } catch {\n throw new Error(\n `Geometry column \"${columnName}\" was not found in dataset \"${prepared.datasetId}\".`,\n );\n }\n\n // Detect mismatch: synthesized points can't satisfy a LineString binding.\n // For PathLayer, try auto-aggregating waypoint rows into linestrings.\n if (\n resolvedGeometry.encoding === 'geoarrow.point' &&\n binding.prop === 'getPath'\n ) {\n const aggregated = tryAggregateWaypointsToLineStrings(prepared.table);\n if (aggregated) {\n table = aggregated.table;\n boundProps[binding.prop] = aggregated.geometryVector;\n continue;\n }\n const available = prepared.table.schema.fields\n .map((f) => f.name)\n .join(', ');\n throw new Error(\n `Layer \"${layerName}\" requires LineString geometry for getPath, ` +\n `but only point coordinates were found and auto-aggregation failed. ` +\n `The dataset sqlQuery must aggregate rows into linestrings using ST_MakeLine. ` +\n `Available columns: ${available}.`,\n );\n }\n if (\n resolvedGeometry.encoding === 'geoarrow.point' &&\n binding.prop === 'getPolygon'\n ) {\n const available = prepared.table.schema.fields\n .map((f) => f.name)\n .join(', ');\n throw new Error(\n `Layer \"${layerName}\" requires Polygon geometry for ${binding.prop}, ` +\n `but only point coordinates were found. Available columns: ${available}.`,\n );\n }\n if (!resolvedGeometry.nativeGeoArrow) {\n if (!compatibility.allowGeoArrowPromotion) {\n throw new Error(\n `Layer \"${layerName}\" cannot render geometry encoding \"${resolvedGeometry.encoding}\" for dataset \"${prepared.datasetId}\".`,\n );\n }\n\n // Point layers: promote Points only — no silent polygon centroid.\n if (isPointPositionLayer(layerName)) {\n const promoted = promoteToPointPositions(\n prepared.table,\n resolvedGeometry.columnName,\n resolvedGeometry.encoding,\n );\n if (!promoted) {\n throw new Error(\n `Layer \"${layerName}\" needs Point positions for dataset \"${prepared.datasetId}\" ` +\n `(geometry encoding \"${resolvedGeometry.encoding}\"). ` +\n `Use a point geometry column, or transformSql with ` +\n `ST_AsWKB(ST_Centroid(geom)) / ST_PointOnSurface(geom). ` +\n `For building footprints prefer GeoArrowPolygonLayer / GeoArrowSolidPolygonLayer.`,\n );\n }\n boundProps[binding.prop] = promoted.geometryColumn;\n if (table === prepared.table) {\n table = promoted.table;\n }\n continue;\n }\n\n if (\n !wkbGeometryDecoder.supportsGeoArrowPromotion(\n layerName,\n resolvedGeometry.encoding,\n prepared.table,\n resolvedGeometry.columnName,\n )\n ) {\n const pathHint =\n layerName === 'GeoArrowPathLayer' ||\n layerName === 'GeoArrowTripsLayer'\n ? ` GeoArrowPathLayer needs LineString WKB (or a single-part MultiLineString). Multi-part MultiLineString cannot be stitched into one path — explode/merge with ST_Dump / ST_LineMerge first, then ST_AsWKB.`\n : '';\n const mixedHint = describeGeoArrowPromotionFailure(\n layerName,\n resolvedGeometry.encoding,\n prepared.table,\n resolvedGeometry.columnName,\n );\n throw new Error(\n `Layer \"${layerName}\" cannot render geometry encoding \"${resolvedGeometry.encoding}\" for dataset \"${prepared.datasetId}\".${pathHint}${mixedHint}`,\n );\n }\n }\n\n const layerData = prepared.getGeoArrowLayerData(columnName);\n if (layerData.source === 'promoted') {\n boundProps[binding.prop] = layerData.geometryColumn;\n if (table === prepared.table) {\n table = layerData.table;\n }\n } else {\n if (table !== prepared.table && table !== layerData.table) {\n throw new Error(\n `Layer \"${layerName}\" cannot combine promoted geometry columns from different prepared tables.`,\n );\n }\n table = layerData.table;\n boundProps[binding.prop] = layerData.geometryColumn;\n }\n continue;\n }\n\n const columnName =\n resolveConfiguredColumn(layerProps, binding.configKey) ??\n (existingIsSimpleAccessor\n ? (existing as string).trim().slice(3)\n : undefined);\n if (!columnName) {\n if (binding.required) {\n throw new Error(\n `Layer \"${layerName}\" requires _sqlroomsBinding.${binding.configKey}.`,\n );\n }\n continue;\n }\n\n const vector =\n table.getChild(columnName) ?? prepared.table.getChild(columnName);\n if (!vector) {\n throw new Error(\n `Layer \"${layerName}\" references unknown column \"${columnName}\" for ${binding.prop}.`,\n );\n }\n\n boundProps[binding.prop] = vector;\n }\n\n return {table, boundProps};\n}\n\nexport function createDeckJsonConfiguration(\n options: CreateDeckJsonConfigurationOptions,\n) {\n const {datasetStates, datasetIds} = options;\n\n return new JSONConfiguration({\n classes: DEFAULT_DECK_JSON_CLASSES,\n enumerations: DEFAULT_DECK_JSON_ENUMERATIONS,\n constants: DEFAULT_DECK_JSON_CONSTANTS,\n functions: {\n colorScale: (props: ColorScaleConfig) => createColorScaleMarker(props),\n scale: (props: Record<string, unknown>) => createScaleMarker(props),\n },\n // We preserve raw `@@=` strings here because `@deck.gl/json` would otherwise\n // eagerly compile them into row-based accessors before `preProcessClassProps`\n // can rewrite them for GeoArrow's batch-oriented callback contract.\n convertFunction: ((expression: string) => `@@=${expression}`) as never,\n preProcessClassProps: (Class: unknown, props: Record<string, unknown>) => {\n const layerName = getLayerName(Class);\n const compatibility = getLayerCompatibility(layerName);\n\n if (!compatibility) {\n return props;\n }\n\n const layerProps = props as Record<string, unknown>;\n const extensionProps = layerProps as typeof layerProps &\n LayerBindingProps;\n const datasetId = resolveDatasetId(extensionProps, datasetIds);\n const managed =\n isManagedLayer(extensionProps, datasetIds) ||\n (datasetIds.length > 1 && layerProps.data === undefined);\n\n if (!managed) {\n return props;\n }\n\n if (!datasetId) {\n throw new Error(\n `Layer \"${layerName}\" must declare _sqlroomsBinding.dataset when multiple datasets are available.`,\n );\n }\n\n const datasetState = datasetStates[datasetId];\n if (!datasetState) {\n throw new Error(\n `Layer \"${layerName}\" references unknown dataset \"${datasetId}\".`,\n );\n }\n\n if (datasetState.status !== 'ready') {\n return {...stripLayerExtensionProps(layerProps), data: []};\n }\n\n const prepared = datasetState.prepared;\n const geometryColumn = resolveGeometryColumn(extensionProps);\n const strippedProps = stripLayerExtensionProps(layerProps);\n\n if (compatibility.representation === 'geojson') {\n const baseProps = applyColorScale({\n props: strippedProps,\n table: prepared.table,\n });\n return {\n ...baseProps,\n data: prepared.getGeoJsonBinaryData(geometryColumn),\n };\n }\n\n const {table, boundProps} = resolveGeoArrowBindings({\n layerName,\n compatibility: compatibility as NonNullable<\n ReturnType<typeof getLayerCompatibility>\n > & {representation: 'geoarrow'},\n layerProps: extensionProps,\n prepared,\n props: strippedProps,\n });\n const baseProps = applyColorScale({\n props: strippedProps,\n table,\n });\n const nextProps: Record<string, unknown> = {\n ...baseProps,\n data: table,\n ...boundProps,\n };\n\n // getElevation: scale markers → linear map; plain @@=field → minus column min.\n const rawElev = nextProps.getElevation;\n if (isScaleMarker(rawElev)) {\n const expression = compileLinearScaleExpression(table, rawElev);\n if (expression) {\n nextProps.getElevation = expression;\n } else {\n // Non-identifier fields need a compiled accessor, not @@=.\n const accessor = compileLinearScaleAccessor(table, rawElev);\n if (accessor) {\n nextProps.getElevation = accessor;\n } else {\n const field =\n typeof (rawElev as {field?: unknown}).field === 'string'\n ? (rawElev as {field: string}).field\n : '';\n throw new Error(\n `Layer \"${layerName}\" getElevation scale field \"${field || '(missing)'}\" was not found in dataset \"${prepared.datasetId}\".`,\n );\n }\n }\n } else if (typeof rawElev === 'string' && rawElev.startsWith('@@=')) {\n const elevField = rawElev.slice(3).trim();\n const elevVector = table.getChild(elevField);\n if (elevVector) {\n let min = Infinity;\n for (let i = 0; i < elevVector.length; i++) {\n if (\n typeof elevVector.isValid === 'function' &&\n !elevVector.isValid(i)\n ) {\n continue;\n }\n const raw = elevVector.get(i);\n if (raw == null) continue;\n const v = Number(raw);\n if (Number.isFinite(v) && v < min) min = v;\n }\n if (Number.isFinite(min)) {\n if (isBindableGeoArrowFieldIdentifier(elevField)) {\n if (min !== 0) {\n nextProps.getElevation = `@@=Math.max(0, ${elevField} - ${min})`;\n }\n } else {\n const accessor = compileLinearScaleAccessor(table, {\n field: elevField,\n domain: [min, min],\n });\n if (accessor) nextProps.getElevation = accessor;\n }\n }\n }\n }\n\n const rewritten = rewriteGeoArrowAccessors({\n props: nextProps,\n table,\n layerName,\n });\n\n // Set updateTriggers for @@= accessor props and getElevation\n // so deck.gl re-evaluates them when references change or are cleared.\n {\n const accessorTriggers: Record<string, unknown> = {};\n for (const [propName, propValue] of Object.entries(nextProps)) {\n if (\n typeof propValue === 'string' &&\n propValue.startsWith('@@=') &&\n propName.startsWith('get')\n ) {\n accessorTriggers[propName] = propValue;\n }\n }\n // Always emit getElevation trigger so clearing the column invalidates\n // stale heights from a previous column-based accessor.\n if (!('getElevation' in accessorTriggers)) {\n const elev = nextProps.getElevation;\n accessorTriggers.getElevation =\n elev !== undefined ? String(elev) : 'none';\n }\n const existingTriggers =\n rewritten.updateTriggers &&\n typeof rewritten.updateTriggers === 'object' &&\n !Array.isArray(rewritten.updateTriggers)\n ? (rewritten.updateTriggers as Record<string, unknown>)\n : {};\n rewritten.updateTriggers = {\n ...existingTriggers,\n ...accessorTriggers,\n };\n }\n\n // For TripsLayer: compute max timestamp for animation and set defaults\n if (layerName === 'GeoArrowTripsLayer' || layerName === 'TripsLayer') {\n const tsVector = boundProps.getTimestamps as arrow.Vector | undefined;\n if (tsVector) {\n let maxTs = 0;\n for (let i = 0; i < tsVector.length; i++) {\n const listItem = tsVector.get(i);\n if (\n listItem &&\n typeof listItem === 'object' &&\n 'length' in listItem\n ) {\n const list = listItem as {\n length: number;\n get: (i: number) => unknown;\n };\n for (let j = 0; j < list.length; j++) {\n const v = Number(list.get(j)) || 0;\n if (v > maxTs) maxTs = v;\n }\n }\n }\n if (maxTs > 0) {\n rewritten._tripsMaxTimestamp = maxTs;\n if (!rewritten.trailLength) {\n rewritten.trailLength = maxTs;\n }\n if (\n rewritten.currentTime === undefined ||\n rewritten.currentTime === 0\n ) {\n rewritten.currentTime = maxTs;\n }\n }\n }\n }\n\n // For HeatmapLayer: apply default colorRange (YlOrRd) when not explicitly set.\n // Also set updateTriggers to force re-aggregation when colorRange changes.\n if (layerName === 'GeoArrowHeatmapLayer') {\n if (!rewritten.colorRange) {\n rewritten.colorRange = DEFAULT_HEATMAP_COLOR_RANGE;\n }\n const existingTriggers =\n rewritten.updateTriggers &&\n typeof rewritten.updateTriggers === 'object' &&\n !Array.isArray(rewritten.updateTriggers)\n ? (rewritten.updateTriggers as Record<string, unknown>)\n : {};\n const previousGetWeight = existingTriggers.getWeight;\n rewritten.updateTriggers = {\n ...existingTriggers,\n getWeight:\n previousGetWeight === undefined\n ? JSON.stringify(rewritten.colorRange)\n : [previousGetWeight, JSON.stringify(rewritten.colorRange)],\n };\n }\n\n return rewritten;\n },\n postProcessConvertedJson: (json: unknown) => {\n if (\n json &&\n typeof json === 'object' &&\n 'layers' in json &&\n Array.isArray((json as {layers?: unknown[]}).layers)\n ) {\n (json as {layers: unknown[]}).layers = (\n json as {layers: unknown[]}\n ).layers.filter(Boolean);\n }\n\n return json;\n },\n });\n}\n"]}
|
|
1
|
+
{"version":3,"file":"createDeckJsonConfiguration.js","sourceRoot":"","sources":["../../src/json/createDeckJsonConfiguration.ts"],"names":[],"mappings":"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","sourcesContent":["import {JSONConfiguration} from '@deck.gl/json';\nimport * as arrow from 'apache-arrow';\nimport {\n isPointPositionLayer,\n promoteToPointPositions,\n wkbGeometryDecoder,\n describeGeoArrowPromotionFailure,\n} from '../prepare/wkbDecoder';\nimport {tryAggregateWaypointsToLineStrings} from './aggregateWaypoints';\nimport type {LayerBindingProps, PreparedDeckDatasetState} from '../types';\nimport {\n createColorScaleMarker,\n getAllColorScales,\n COLOR_SCALE_PROP_NAMES,\n type DeckColorScaleConfig,\n} from './colorScaleFunction';\nimport {compileColorScale} from './compileColorScale';\nimport {\n DEFAULT_DECK_JSON_CLASSES,\n DEFAULT_DECK_JSON_CONSTANTS,\n DEFAULT_DECK_JSON_ENUMERATIONS,\n} from './defaultClasses';\nimport {\n DEFAULT_HEATMAP_COLOR_RANGE,\n DEFAULT_HEATMAP_WEIGHTS_TEXTURE_SIZE,\n} from './heatmapDefaults';\nimport {getLayerCompatibility} from './layerCompatibility';\nimport {\n isManagedLayer,\n resolveConfiguredColumn,\n resolveDatasetId,\n resolveGeometryColumn,\n stripLayerExtensionProps,\n} from './layerConfig';\nimport {rewriteGeoArrowAccessors} from './rewriteGeoArrowAccessors';\nimport {isBindableGeoArrowFieldIdentifier} from './compileGeoArrowAccessor';\nimport {\n compileLinearScaleAccessor,\n compileLinearScaleExpression,\n createScaleMarker,\n isScaleMarker,\n} from './scaleFunction';\n\ntype CreateDeckJsonConfigurationOptions = {\n datasetStates: Record<string, PreparedDeckDatasetState>;\n datasetIds: string[];\n};\n\nfunction getLayerName(Class: unknown) {\n const maybeClass = Class as {layerName?: string; name?: string};\n return maybeClass.layerName ?? maybeClass.name ?? 'UnknownLayer';\n}\n\n/**\n * Deck.gl matches layers by id. Each JSON convert would otherwise create a new\n * GPU layer. Dataset id alone collides when two layers share a dataset.\n */\nfunction assignStableLayerId(\n props: Record<string, unknown>,\n datasetId: string,\n layerName: string,\n index: number,\n) {\n if (typeof props.id === 'string' && props.id !== '') return;\n props.id = `${datasetId}:${layerName}:${index}`;\n}\n\nfunction applyColorScale(options: {\n props: Record<string, unknown>;\n table: import('apache-arrow').Table;\n}) {\n const {props, table} = options;\n const allScales = getAllColorScales(props);\n\n let result = props;\n const triggers: Record<string, unknown> =\n result.updateTriggers &&\n typeof result.updateTriggers === 'object' &&\n !Array.isArray(result.updateTriggers)\n ? {...(result.updateTriggers as Record<string, unknown>)}\n : {};\n\n for (const {propName, colorScale} of allScales) {\n result = {\n ...result,\n [propName]: compileColorScale({\n table,\n colorScale,\n }),\n };\n triggers[propName] = JSON.stringify(colorScale);\n }\n\n // Set updateTriggers for color props that are static or absent (not a scale)\n // so deck.gl detects changes when a scale is cleared or a constant value changes.\n for (const propName of COLOR_SCALE_PROP_NAMES) {\n if (!(propName in triggers)) {\n const value = result[propName];\n triggers[propName] = value !== undefined ? JSON.stringify(value) : 'none';\n }\n }\n\n if (Object.keys(triggers).length > 0) {\n result = {...result, updateTriggers: triggers};\n }\n\n return result;\n}\n\nfunction getElevationTrigger(rawElev: unknown) {\n if (rawElev === undefined) return 'none';\n if (typeof rawElev === 'string' || typeof rawElev === 'number') {\n return String(rawElev);\n }\n try {\n return JSON.stringify(rawElev);\n } catch {\n return String(rawElev);\n }\n}\n\nfunction mergeGetElevationTrigger(\n props: Record<string, unknown>,\n rawElev: unknown,\n) {\n const existing =\n props.updateTriggers &&\n typeof props.updateTriggers === 'object' &&\n !Array.isArray(props.updateTriggers)\n ? (props.updateTriggers as Record<string, unknown>)\n : {};\n return {\n ...props,\n updateTriggers: {\n ...existing,\n getElevation: getElevationTrigger(rawElev),\n },\n };\n}\n\n/** Compile `getElevation` scale / `@@=` column accessors against the Arrow table. */\nfunction compileGetElevation(options: {\n props: Record<string, unknown>;\n table: arrow.Table;\n layerName: string;\n datasetId: string;\n /** GeoJSON cannot evaluate `@@=` column expressions; always emit a function. */\n requireFunctionAccessor?: boolean;\n}): Record<string, unknown> {\n const {table, layerName, datasetId, requireFunctionAccessor} = options;\n const nextProps = {...options.props};\n const rawElev = nextProps.getElevation;\n\n if (isScaleMarker(rawElev)) {\n const expression = requireFunctionAccessor\n ? undefined\n : compileLinearScaleExpression(table, rawElev);\n if (expression) {\n nextProps.getElevation = expression;\n } else {\n const accessor = compileLinearScaleAccessor(table, rawElev);\n if (accessor) {\n nextProps.getElevation = accessor;\n } else {\n const field = typeof rawElev.field === 'string' ? rawElev.field : '';\n throw new Error(\n `Layer \"${layerName}\" getElevation scale field \"${field || '(missing)'}\" was not found in dataset \"${datasetId}\".`,\n );\n }\n }\n } else if (typeof rawElev === 'string' && rawElev.startsWith('@@=')) {\n const elevField = rawElev.slice(3).trim();\n const elevVector = table.getChild(elevField);\n if (elevVector) {\n let min = Infinity;\n for (let i = 0; i < elevVector.length; i++) {\n if (\n typeof elevVector.isValid === 'function' &&\n !elevVector.isValid(i)\n ) {\n continue;\n }\n const raw = elevVector.get(i);\n if (raw == null) continue;\n const v = Number(raw);\n if (Number.isFinite(v) && v < min) min = v;\n }\n if (Number.isFinite(min)) {\n if (\n !requireFunctionAccessor &&\n isBindableGeoArrowFieldIdentifier(elevField)\n ) {\n if (min !== 0) {\n nextProps.getElevation = `@@=Math.max(0, ${elevField} - ${min})`;\n }\n } else {\n const accessor = compileLinearScaleAccessor(table, {\n field: elevField,\n domain: [min, min],\n });\n if (accessor) nextProps.getElevation = accessor;\n }\n }\n }\n }\n\n return nextProps;\n}\n\nfunction resolveGeoArrowBindings(options: {\n layerName: string;\n compatibility: NonNullable<ReturnType<typeof getLayerCompatibility>> & {\n representation: 'geoarrow';\n };\n layerProps: LayerBindingProps & Record<string, unknown>;\n prepared: Extract<PreparedDeckDatasetState, {status: 'ready'}>['prepared'];\n props: Record<string, unknown>;\n}) {\n const {layerName, compatibility, layerProps, prepared, props} = options;\n let table = prepared.table;\n const boundProps: Record<string, unknown> = {};\n\n for (const binding of compatibility.bindings) {\n const existing = props[binding.prop];\n // Prefer Arrow Vector over `@@=column` (avoids empty H3 / missing-column silence).\n const existingIsSimpleAccessor =\n typeof existing === 'string' &&\n /^@@=[A-Za-z_$][\\w$]*$/.test(existing.trim());\n if (existing !== undefined && !existingIsSimpleAccessor) {\n continue;\n }\n\n if (binding.kind === 'geometry') {\n const columnName =\n resolveConfiguredColumn(layerProps, binding.configKey) ??\n (existingIsSimpleAccessor\n ? (existing as string).trim().slice(3)\n : undefined);\n if (binding.required && !columnName) {\n throw new Error(\n `Layer \"${layerName}\" requires _sqlroomsBinding.${binding.configKey}.`,\n );\n }\n\n let resolvedGeometry;\n try {\n resolvedGeometry = prepared.resolveGeometry(columnName);\n } catch {\n throw new Error(\n `Geometry column \"${columnName}\" was not found in dataset \"${prepared.datasetId}\".`,\n );\n }\n\n // Detect mismatch: synthesized points can't satisfy a LineString binding.\n // For PathLayer, try auto-aggregating waypoint rows into linestrings.\n if (\n resolvedGeometry.encoding === 'geoarrow.point' &&\n binding.prop === 'getPath'\n ) {\n const aggregated = tryAggregateWaypointsToLineStrings(prepared.table);\n if (aggregated) {\n table = aggregated.table;\n boundProps[binding.prop] = aggregated.geometryVector;\n continue;\n }\n const available = prepared.table.schema.fields\n .map((f) => f.name)\n .join(', ');\n throw new Error(\n `Layer \"${layerName}\" requires LineString geometry for getPath, ` +\n `but only point coordinates were found and auto-aggregation failed. ` +\n `The dataset sqlQuery must aggregate rows into linestrings using ST_MakeLine. ` +\n `Available columns: ${available}.`,\n );\n }\n if (\n resolvedGeometry.encoding === 'geoarrow.point' &&\n binding.prop === 'getPolygon'\n ) {\n const available = prepared.table.schema.fields\n .map((f) => f.name)\n .join(', ');\n throw new Error(\n `Layer \"${layerName}\" requires Polygon geometry for ${binding.prop}, ` +\n `but only point coordinates were found. Available columns: ${available}.`,\n );\n }\n if (!resolvedGeometry.nativeGeoArrow) {\n if (!compatibility.allowGeoArrowPromotion) {\n throw new Error(\n `Layer \"${layerName}\" cannot render geometry encoding \"${resolvedGeometry.encoding}\" for dataset \"${prepared.datasetId}\".`,\n );\n }\n\n // Point layers: promote Points only — no silent polygon centroid.\n if (isPointPositionLayer(layerName)) {\n const promoted = promoteToPointPositions(\n prepared.table,\n resolvedGeometry.columnName,\n resolvedGeometry.encoding,\n );\n if (!promoted) {\n throw new Error(\n `Layer \"${layerName}\" needs Point positions for dataset \"${prepared.datasetId}\" ` +\n `(geometry encoding \"${resolvedGeometry.encoding}\"). ` +\n `Use a point geometry column, or transformSql with ` +\n `ST_AsWKB(ST_Centroid(geom)) / ST_PointOnSurface(geom). ` +\n `For building footprints prefer GeoArrowPolygonLayer or GeoJsonLayer.`,\n );\n }\n boundProps[binding.prop] = promoted.geometryColumn;\n if (table === prepared.table) {\n table = promoted.table;\n }\n continue;\n }\n\n if (\n !wkbGeometryDecoder.supportsGeoArrowPromotion(\n layerName,\n resolvedGeometry.encoding,\n prepared.table,\n resolvedGeometry.columnName,\n )\n ) {\n const pathHint =\n layerName === 'GeoArrowPathLayer' ||\n layerName === 'GeoArrowTripsLayer'\n ? ` GeoArrowPathLayer needs LineString WKB (or a single-part MultiLineString). Multi-part MultiLineString cannot be stitched into one path — explode/merge with ST_Dump / ST_LineMerge first, then ST_AsWKB.`\n : '';\n const mixedHint = describeGeoArrowPromotionFailure(\n layerName,\n resolvedGeometry.encoding,\n prepared.table,\n resolvedGeometry.columnName,\n );\n throw new Error(\n `Layer \"${layerName}\" cannot render geometry encoding \"${resolvedGeometry.encoding}\" for dataset \"${prepared.datasetId}\".${pathHint}${mixedHint}`,\n );\n }\n }\n\n const layerData = prepared.getGeoArrowLayerData(columnName);\n if (layerData.source === 'promoted') {\n boundProps[binding.prop] = layerData.geometryColumn;\n if (table === prepared.table) {\n table = layerData.table;\n }\n } else {\n if (table !== prepared.table && table !== layerData.table) {\n throw new Error(\n `Layer \"${layerName}\" cannot combine promoted geometry columns from different prepared tables.`,\n );\n }\n table = layerData.table;\n boundProps[binding.prop] = layerData.geometryColumn;\n }\n continue;\n }\n\n const columnName =\n resolveConfiguredColumn(layerProps, binding.configKey) ??\n (existingIsSimpleAccessor\n ? (existing as string).trim().slice(3)\n : undefined);\n if (!columnName) {\n if (binding.required) {\n throw new Error(\n `Layer \"${layerName}\" requires _sqlroomsBinding.${binding.configKey}.`,\n );\n }\n continue;\n }\n\n const vector =\n table.getChild(columnName) ?? prepared.table.getChild(columnName);\n if (!vector) {\n throw new Error(\n `Layer \"${layerName}\" references unknown column \"${columnName}\" for ${binding.prop}.`,\n );\n }\n\n boundProps[binding.prop] = vector;\n }\n\n return {table, boundProps};\n}\n\nexport function createDeckJsonConfiguration(\n options: CreateDeckJsonConfigurationOptions,\n) {\n const {datasetStates, datasetIds} = options;\n let nextManagedLayerIndex = 0;\n\n return new JSONConfiguration({\n classes: DEFAULT_DECK_JSON_CLASSES,\n enumerations: DEFAULT_DECK_JSON_ENUMERATIONS,\n constants: DEFAULT_DECK_JSON_CONSTANTS,\n functions: {\n colorScale: (props: DeckColorScaleConfig) =>\n createColorScaleMarker(props),\n scale: (props: Record<string, unknown>) => createScaleMarker(props),\n },\n // We preserve raw `@@=` strings here because `@deck.gl/json` would otherwise\n // eagerly compile them into row-based accessors before `preProcessClassProps`\n // can rewrite them for GeoArrow's batch-oriented callback contract.\n convertFunction: ((expression: string) => `@@=${expression}`) as never,\n preProcessClassProps: (Class: unknown, props: Record<string, unknown>) => {\n try {\n return preprocessManagedLayer();\n } catch (error) {\n // JSONConverter skips postProcessConvertedJson when convert throws.\n nextManagedLayerIndex = 0;\n throw error;\n }\n\n function preprocessManagedLayer() {\n const layerName = getLayerName(Class);\n const compatibility = getLayerCompatibility(layerName);\n\n if (!compatibility) {\n return props;\n }\n\n const layerProps = props as Record<string, unknown>;\n const extensionProps = layerProps as typeof layerProps &\n LayerBindingProps;\n const datasetId = resolveDatasetId(extensionProps, datasetIds);\n const managed =\n isManagedLayer(extensionProps, datasetIds) ||\n (datasetIds.length > 1 && layerProps.data === undefined);\n\n if (!managed) {\n return props;\n }\n\n if (!datasetId) {\n throw new Error(\n `Layer \"${layerName}\" must declare _sqlroomsBinding.dataset when multiple datasets are available.`,\n );\n }\n\n const datasetState = datasetStates[datasetId];\n if (!datasetState) {\n throw new Error(\n `Layer \"${layerName}\" references unknown dataset \"${datasetId}\".`,\n );\n }\n\n if (datasetState.status !== 'ready') {\n const pendingProps = stripLayerExtensionProps(layerProps);\n assignStableLayerId(\n pendingProps,\n datasetId,\n layerName,\n nextManagedLayerIndex++,\n );\n return {...pendingProps, data: []};\n }\n\n const prepared = datasetState.prepared;\n const geometryColumn = resolveGeometryColumn(extensionProps);\n const strippedProps = stripLayerExtensionProps(layerProps);\n assignStableLayerId(\n strippedProps,\n datasetId,\n layerName,\n nextManagedLayerIndex++,\n );\n\n if (compatibility.representation === 'geojson') {\n const baseProps = applyColorScale({\n props: strippedProps,\n table: prepared.table,\n });\n const withElevation = compileGetElevation({\n props: baseProps,\n table: prepared.table,\n layerName,\n datasetId: prepared.datasetId,\n requireFunctionAccessor: true,\n });\n return {\n ...mergeGetElevationTrigger(withElevation, baseProps.getElevation),\n data: prepared.getGeoJsonBinaryData(geometryColumn),\n };\n }\n\n const {table, boundProps} = resolveGeoArrowBindings({\n layerName,\n compatibility: compatibility as NonNullable<\n ReturnType<typeof getLayerCompatibility>\n > & {representation: 'geoarrow'},\n layerProps: extensionProps,\n prepared,\n props: strippedProps,\n });\n const baseProps = applyColorScale({\n props: strippedProps,\n table,\n });\n const nextProps = compileGetElevation({\n props: {\n ...baseProps,\n data: table,\n ...boundProps,\n },\n table,\n layerName,\n datasetId: prepared.datasetId,\n });\n\n const rewritten = rewriteGeoArrowAccessors({\n props: nextProps,\n table,\n layerName,\n });\n\n // Set updateTriggers for @@= accessor props and getElevation\n // so deck.gl re-evaluates them when references change or are cleared.\n {\n const accessorTriggers: Record<string, unknown> = {};\n for (const [propName, propValue] of Object.entries(nextProps)) {\n if (\n typeof propValue === 'string' &&\n propValue.startsWith('@@=') &&\n propName.startsWith('get')\n ) {\n accessorTriggers[propName] = propValue;\n }\n }\n // Always emit getElevation trigger so clearing the column invalidates\n // stale heights from a previous column-based accessor.\n if (!('getElevation' in accessorTriggers)) {\n const elev = nextProps.getElevation;\n accessorTriggers.getElevation =\n elev !== undefined ? String(elev) : 'none';\n }\n const existingTriggers =\n rewritten.updateTriggers &&\n typeof rewritten.updateTriggers === 'object' &&\n !Array.isArray(rewritten.updateTriggers)\n ? (rewritten.updateTriggers as Record<string, unknown>)\n : {};\n rewritten.updateTriggers = {\n ...existingTriggers,\n ...accessorTriggers,\n };\n }\n\n // For TripsLayer: compute max timestamp for animation and set defaults\n if (layerName === 'GeoArrowTripsLayer' || layerName === 'TripsLayer') {\n const tsVector = boundProps.getTimestamps as arrow.Vector | undefined;\n if (tsVector) {\n let maxTs = 0;\n for (let i = 0; i < tsVector.length; i++) {\n const listItem = tsVector.get(i);\n if (\n listItem &&\n typeof listItem === 'object' &&\n 'length' in listItem\n ) {\n const list = listItem as {\n length: number;\n get: (i: number) => unknown;\n };\n for (let j = 0; j < list.length; j++) {\n const v = Number(list.get(j)) || 0;\n if (v > maxTs) maxTs = v;\n }\n }\n }\n if (maxTs > 0) {\n rewritten._tripsMaxTimestamp = maxTs;\n if (!rewritten.trailLength) {\n rewritten.trailLength = maxTs;\n }\n if (\n rewritten.currentTime === undefined ||\n rewritten.currentTime === 0\n ) {\n rewritten.currentTime = maxTs;\n }\n }\n }\n }\n\n // HeatmapLayer remaps colorRange in _updateColorTexture. Putting it in\n // getWeight updateTriggers would mark aggregation dirty and rebuild the\n // GPU weight texture when only the colormap changed.\n if (layerName === 'GeoArrowHeatmapLayer') {\n if (!rewritten.colorRange) {\n rewritten.colorRange = DEFAULT_HEATMAP_COLOR_RANGE;\n }\n if (rewritten.weightsTextureSize === undefined) {\n rewritten.weightsTextureSize = DEFAULT_HEATMAP_WEIGHTS_TEXTURE_SIZE;\n }\n }\n\n return rewritten;\n }\n },\n postProcessConvertedJson: (json: unknown) => {\n nextManagedLayerIndex = 0;\n if (\n json &&\n typeof json === 'object' &&\n 'layers' in json &&\n Array.isArray((json as {layers?: unknown[]}).layers)\n ) {\n (json as {layers: unknown[]}).layers = (\n json as {layers: unknown[]}\n ).layers.filter(Boolean);\n }\n\n return json;\n },\n });\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"defaultClasses.d.ts","sourceRoot":"","sources":["../../src/json/defaultClasses.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"defaultClasses.d.ts","sourceRoot":"","sources":["../../src/json/defaultClasses.ts"],"names":[],"mappings":"AAmDA,eAAO,MAAM,yBAAyB,EAAE,MAAM,CAC5C,MAAM,EACN,KAAK,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAgBhD,CAAC;AAEF,eAAO,MAAM,8BAA8B;;;;;;;;CAE1C,CAAC;AAEF,eAAO,MAAM,2BAA2B,IAAK,CAAC"}
|