@sqlrooms/deck 0.29.0-rc.10 → 0.29.0-rc.11
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 +42 -6
- package/dist/DeckJsonMap.d.ts.map +1 -1
- package/dist/DeckJsonMap.js +2 -6
- package/dist/DeckJsonMap.js.map +1 -1
- package/dist/DeckJsonMapSpec.d.ts +875 -53
- package/dist/DeckJsonMapSpec.d.ts.map +1 -1
- package/dist/DeckJsonMapSpec.js +7 -0
- package/dist/DeckJsonMapSpec.js.map +1 -1
- package/dist/DeckMapDefaultStylesProvider.d.ts +3 -4
- package/dist/DeckMapDefaultStylesProvider.d.ts.map +1 -1
- package/dist/DeckMapDefaultStylesProvider.js +13 -7
- package/dist/DeckMapDefaultStylesProvider.js.map +1 -1
- package/dist/MapSettings.d.ts.map +1 -1
- package/dist/MapSettings.js +25 -11
- package/dist/MapSettings.js.map +1 -1
- package/dist/ai.d.ts +19 -5
- package/dist/ai.d.ts.map +1 -1
- package/dist/ai.js +60 -112
- package/dist/ai.js.map +1 -1
- package/dist/aiNormalize.d.ts +31 -0
- package/dist/aiNormalize.d.ts.map +1 -0
- package/dist/aiNormalize.js +629 -0
- package/dist/aiNormalize.js.map +1 -0
- package/dist/dashboard.d.ts.map +1 -1
- package/dist/dashboard.js +72 -8
- package/dist/dashboard.js.map +1 -1
- package/dist/dashboardConfig.d.ts +10 -1
- package/dist/dashboardConfig.d.ts.map +1 -1
- package/dist/dashboardConfig.js +55 -22
- package/dist/dashboardConfig.js.map +1 -1
- package/dist/datasets/PreparedDatasetStore.d.ts.map +1 -1
- package/dist/datasets/PreparedDatasetStore.js +31 -2
- package/dist/datasets/PreparedDatasetStore.js.map +1 -1
- package/dist/datasets/wrapGeometryAsWkb.d.ts +20 -0
- package/dist/datasets/wrapGeometryAsWkb.d.ts.map +1 -0
- package/dist/datasets/wrapGeometryAsWkb.js +65 -0
- package/dist/datasets/wrapGeometryAsWkb.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/json/compileGeoArrowAccessor.d.ts +5 -0
- package/dist/json/compileGeoArrowAccessor.d.ts.map +1 -1
- package/dist/json/compileGeoArrowAccessor.js +17 -3
- package/dist/json/compileGeoArrowAccessor.js.map +1 -1
- package/dist/json/createDeckJsonConfiguration.d.ts.map +1 -1
- package/dist/json/createDeckJsonConfiguration.js +85 -18
- package/dist/json/createDeckJsonConfiguration.js.map +1 -1
- package/dist/json/extractColorScaleLegends.d.ts.map +1 -1
- package/dist/json/extractColorScaleLegends.js +21 -7
- package/dist/json/extractColorScaleLegends.js.map +1 -1
- package/dist/json/layers/DeckH3HexagonLayer.d.ts.map +1 -1
- package/dist/json/layers/DeckH3HexagonLayer.js +9 -14
- package/dist/json/layers/DeckH3HexagonLayer.js.map +1 -1
- package/dist/json/layers/h3IndexFormat.d.ts +6 -0
- package/dist/json/layers/h3IndexFormat.d.ts.map +1 -0
- package/dist/json/layers/h3IndexFormat.js +17 -0
- package/dist/json/layers/h3IndexFormat.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 +9 -0
- package/dist/json/rewriteGeoArrowAccessors.js.map +1 -1
- package/dist/json/scaleFunction.d.ts +30 -0
- package/dist/json/scaleFunction.d.ts.map +1 -0
- package/dist/json/scaleFunction.js +126 -0
- package/dist/json/scaleFunction.js.map +1 -0
- package/dist/mapAiConfig.d.ts +2 -0
- package/dist/mapAiConfig.d.ts.map +1 -1
- package/dist/mapAiConfig.js +2 -1
- package/dist/mapAiConfig.js.map +1 -1
- package/dist/mapAiSharedInstructions.d.ts +3 -0
- package/dist/mapAiSharedInstructions.d.ts.map +1 -0
- package/dist/mapAiSharedInstructions.js +16 -0
- package/dist/mapAiSharedInstructions.js.map +1 -0
- package/dist/mapConfig.d.ts +6 -0
- package/dist/mapConfig.d.ts.map +1 -1
- package/dist/mapConfig.js.map +1 -1
- package/dist/mapConfigUtils.d.ts.map +1 -1
- package/dist/mapConfigUtils.js +2 -0
- package/dist/mapConfigUtils.js.map +1 -1
- package/dist/mapFit.d.ts +16 -0
- package/dist/mapFit.d.ts.map +1 -1
- package/dist/mapFit.js +208 -30
- package/dist/mapFit.js.map +1 -1
- package/dist/mapLayerConfigUtils.d.ts +9 -1
- package/dist/mapLayerConfigUtils.d.ts.map +1 -1
- package/dist/mapLayerConfigUtils.js +62 -12
- package/dist/mapLayerConfigUtils.js.map +1 -1
- package/dist/mapResourceAuthoring.d.ts +2 -0
- package/dist/mapResourceAuthoring.d.ts.map +1 -1
- package/dist/mapResourceAuthoring.js +402 -16
- package/dist/mapResourceAuthoring.js.map +1 -1
- package/dist/mosaic.d.ts +1 -1
- package/dist/mosaic.d.ts.map +1 -1
- package/dist/mosaic.js.map +1 -1
- package/dist/prepare/geoarrow.js.map +1 -1
- package/dist/prepare/wkbDecoder.d.ts +10 -0
- package/dist/prepare/wkbDecoder.d.ts.map +1 -1
- package/dist/prepare/wkbDecoder.js +93 -18
- package/dist/prepare/wkbDecoder.js.map +1 -1
- package/dist/prepare/wkbParser.d.ts +7 -0
- package/dist/prepare/wkbParser.d.ts.map +1 -1
- package/dist/prepare/wkbParser.js +21 -0
- package/dist/prepare/wkbParser.js.map +1 -1
- package/dist/selectStarAsWkbCollision.d.ts +3 -0
- package/dist/selectStarAsWkbCollision.d.ts.map +1 -0
- package/dist/selectStarAsWkbCollision.js +78 -0
- package/dist/selectStarAsWkbCollision.js.map +1 -0
- package/dist/types.d.ts +1 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/useDeckMapFitToBounds.d.ts.map +1 -1
- package/dist/useDeckMapFitToBounds.js +1 -1
- package/dist/useDeckMapFitToBounds.js.map +1 -1
- package/package.json +15 -15
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { JSONConfiguration } from '@deck.gl/json';
|
|
2
|
-
import { wkbGeometryDecoder } from '../prepare/wkbDecoder';
|
|
2
|
+
import { isPointPositionLayer, promoteToPointPositions, wkbGeometryDecoder, describeGeoArrowPromotionFailure, } from '../prepare/wkbDecoder';
|
|
3
3
|
import { tryAggregateWaypointsToLineStrings } from './aggregateWaypoints';
|
|
4
4
|
import { createColorScaleMarker, getAllColorScales, COLOR_SCALE_PROP_NAMES, } from './colorScaleFunction';
|
|
5
5
|
import { compileColorScale } from './compileColorScale';
|
|
@@ -8,6 +8,8 @@ import { DEFAULT_HEATMAP_COLOR_RANGE } from './heatmapDefaults';
|
|
|
8
8
|
import { getLayerCompatibility } from './layerCompatibility';
|
|
9
9
|
import { isManagedLayer, resolveConfiguredColumn, resolveDatasetId, resolveGeometryColumn, stripLayerExtensionProps, } from './layerConfig';
|
|
10
10
|
import { rewriteGeoArrowAccessors } from './rewriteGeoArrowAccessors';
|
|
11
|
+
import { isBindableGeoArrowFieldIdentifier } from './compileGeoArrowAccessor';
|
|
12
|
+
import { compileLinearScaleAccessor, compileLinearScaleExpression, createScaleMarker, isScaleMarker, } from './scaleFunction';
|
|
11
13
|
function getLayerName(Class) {
|
|
12
14
|
const maybeClass = Class;
|
|
13
15
|
return maybeClass.layerName ?? maybeClass.name ?? 'UnknownLayer';
|
|
@@ -49,11 +51,18 @@ function resolveGeoArrowBindings(options) {
|
|
|
49
51
|
let table = prepared.table;
|
|
50
52
|
const boundProps = {};
|
|
51
53
|
for (const binding of compatibility.bindings) {
|
|
52
|
-
|
|
54
|
+
const existing = props[binding.prop];
|
|
55
|
+
// Prefer Arrow Vector over `@@=column` (avoids empty H3 / missing-column silence).
|
|
56
|
+
const existingIsSimpleAccessor = typeof existing === 'string' &&
|
|
57
|
+
/^@@=[A-Za-z_$][\w$]*$/.test(existing.trim());
|
|
58
|
+
if (existing !== undefined && !existingIsSimpleAccessor) {
|
|
53
59
|
continue;
|
|
54
60
|
}
|
|
55
61
|
if (binding.kind === 'geometry') {
|
|
56
|
-
const columnName = resolveConfiguredColumn(layerProps, binding.configKey)
|
|
62
|
+
const columnName = resolveConfiguredColumn(layerProps, binding.configKey) ??
|
|
63
|
+
(existingIsSimpleAccessor
|
|
64
|
+
? existing.trim().slice(3)
|
|
65
|
+
: undefined);
|
|
57
66
|
if (binding.required && !columnName) {
|
|
58
67
|
throw new Error(`Layer "${layerName}" requires _sqlroomsBinding.${binding.configKey}.`);
|
|
59
68
|
}
|
|
@@ -91,10 +100,33 @@ function resolveGeoArrowBindings(options) {
|
|
|
91
100
|
`but only point coordinates were found. Available columns: ${available}.`);
|
|
92
101
|
}
|
|
93
102
|
if (!resolvedGeometry.nativeGeoArrow) {
|
|
94
|
-
if (!compatibility.allowGeoArrowPromotion
|
|
95
|
-
!wkbGeometryDecoder.supportsGeoArrowPromotion(layerName, resolvedGeometry.encoding, prepared.table, resolvedGeometry.columnName)) {
|
|
103
|
+
if (!compatibility.allowGeoArrowPromotion) {
|
|
96
104
|
throw new Error(`Layer "${layerName}" cannot render geometry encoding "${resolvedGeometry.encoding}" for dataset "${prepared.datasetId}".`);
|
|
97
105
|
}
|
|
106
|
+
// Point layers: promote Points only — no silent polygon centroid.
|
|
107
|
+
if (isPointPositionLayer(layerName)) {
|
|
108
|
+
const promoted = promoteToPointPositions(prepared.table, resolvedGeometry.columnName, resolvedGeometry.encoding);
|
|
109
|
+
if (!promoted) {
|
|
110
|
+
throw new Error(`Layer "${layerName}" needs Point positions for dataset "${prepared.datasetId}" ` +
|
|
111
|
+
`(geometry encoding "${resolvedGeometry.encoding}"). ` +
|
|
112
|
+
`Use a point geometry column, or transformSql with ` +
|
|
113
|
+
`ST_AsWKB(ST_Centroid(geom)) / ST_PointOnSurface(geom). ` +
|
|
114
|
+
`For building footprints prefer GeoArrowPolygonLayer / GeoArrowSolidPolygonLayer.`);
|
|
115
|
+
}
|
|
116
|
+
boundProps[binding.prop] = promoted.geometryColumn;
|
|
117
|
+
if (table === prepared.table) {
|
|
118
|
+
table = promoted.table;
|
|
119
|
+
}
|
|
120
|
+
continue;
|
|
121
|
+
}
|
|
122
|
+
if (!wkbGeometryDecoder.supportsGeoArrowPromotion(layerName, resolvedGeometry.encoding, prepared.table, resolvedGeometry.columnName)) {
|
|
123
|
+
const pathHint = layerName === 'GeoArrowPathLayer' ||
|
|
124
|
+
layerName === 'GeoArrowTripsLayer'
|
|
125
|
+
? ` 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.`
|
|
126
|
+
: '';
|
|
127
|
+
const mixedHint = describeGeoArrowPromotionFailure(layerName, resolvedGeometry.encoding, prepared.table, resolvedGeometry.columnName);
|
|
128
|
+
throw new Error(`Layer "${layerName}" cannot render geometry encoding "${resolvedGeometry.encoding}" for dataset "${prepared.datasetId}".${pathHint}${mixedHint}`);
|
|
129
|
+
}
|
|
98
130
|
}
|
|
99
131
|
const layerData = prepared.getGeoArrowLayerData(columnName);
|
|
100
132
|
if (layerData.source === 'promoted') {
|
|
@@ -112,7 +144,10 @@ function resolveGeoArrowBindings(options) {
|
|
|
112
144
|
}
|
|
113
145
|
continue;
|
|
114
146
|
}
|
|
115
|
-
const columnName = resolveConfiguredColumn(layerProps, binding.configKey)
|
|
147
|
+
const columnName = resolveConfiguredColumn(layerProps, binding.configKey) ??
|
|
148
|
+
(existingIsSimpleAccessor
|
|
149
|
+
? existing.trim().slice(3)
|
|
150
|
+
: undefined);
|
|
116
151
|
if (!columnName) {
|
|
117
152
|
if (binding.required) {
|
|
118
153
|
throw new Error(`Layer "${layerName}" requires _sqlroomsBinding.${binding.configKey}.`);
|
|
@@ -135,12 +170,7 @@ export function createDeckJsonConfiguration(options) {
|
|
|
135
170
|
constants: DEFAULT_DECK_JSON_CONSTANTS,
|
|
136
171
|
functions: {
|
|
137
172
|
colorScale: (props) => createColorScaleMarker(props),
|
|
138
|
-
scale: (props) =>
|
|
139
|
-
const field = typeof props.field === 'string' ? props.field : undefined;
|
|
140
|
-
if (!field)
|
|
141
|
-
return undefined;
|
|
142
|
-
return `@@=${field}`;
|
|
143
|
-
},
|
|
173
|
+
scale: (props) => createScaleMarker(props),
|
|
144
174
|
},
|
|
145
175
|
// We preserve raw `@@=` strings here because `@deck.gl/json` would otherwise
|
|
146
176
|
// eagerly compile them into row-based accessors before `preProcessClassProps`
|
|
@@ -199,21 +229,58 @@ export function createDeckJsonConfiguration(options) {
|
|
|
199
229
|
data: table,
|
|
200
230
|
...boundProps,
|
|
201
231
|
};
|
|
202
|
-
//
|
|
203
|
-
// feature sits at ground level and differences are clearly visible.
|
|
232
|
+
// getElevation: scale markers → linear map; plain @@=field → minus column min.
|
|
204
233
|
const rawElev = nextProps.getElevation;
|
|
205
|
-
if (
|
|
234
|
+
if (isScaleMarker(rawElev)) {
|
|
235
|
+
const expression = compileLinearScaleExpression(table, rawElev);
|
|
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;
|
|
244
|
+
}
|
|
245
|
+
else {
|
|
246
|
+
const field = typeof rawElev.field === 'string'
|
|
247
|
+
? rawElev.field
|
|
248
|
+
: '';
|
|
249
|
+
throw new Error(`Layer "${layerName}" getElevation scale field "${field || '(missing)'}" was not found in dataset "${prepared.datasetId}".`);
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
else if (typeof rawElev === 'string' && rawElev.startsWith('@@=')) {
|
|
206
254
|
const elevField = rawElev.slice(3).trim();
|
|
207
255
|
const elevVector = table.getChild(elevField);
|
|
208
256
|
if (elevVector) {
|
|
209
257
|
let min = Infinity;
|
|
210
258
|
for (let i = 0; i < elevVector.length; i++) {
|
|
211
|
-
|
|
259
|
+
if (typeof elevVector.isValid === 'function' &&
|
|
260
|
+
!elevVector.isValid(i)) {
|
|
261
|
+
continue;
|
|
262
|
+
}
|
|
263
|
+
const raw = elevVector.get(i);
|
|
264
|
+
if (raw == null)
|
|
265
|
+
continue;
|
|
266
|
+
const v = Number(raw);
|
|
212
267
|
if (Number.isFinite(v) && v < min)
|
|
213
268
|
min = v;
|
|
214
269
|
}
|
|
215
|
-
if (Number.isFinite(min)
|
|
216
|
-
|
|
270
|
+
if (Number.isFinite(min)) {
|
|
271
|
+
if (isBindableGeoArrowFieldIdentifier(elevField)) {
|
|
272
|
+
if (min !== 0) {
|
|
273
|
+
nextProps.getElevation = `@@=Math.max(0, ${elevField} - ${min})`;
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
else {
|
|
277
|
+
const accessor = compileLinearScaleAccessor(table, {
|
|
278
|
+
field: elevField,
|
|
279
|
+
domain: [min, min],
|
|
280
|
+
});
|
|
281
|
+
if (accessor)
|
|
282
|
+
nextProps.getElevation = accessor;
|
|
283
|
+
}
|
|
217
284
|
}
|
|
218
285
|
}
|
|
219
286
|
}
|
|
@@ -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 {wkbGeometryDecoder} 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';\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 if (props[binding.prop] !== undefined) {\n continue;\n }\n\n if (binding.kind === 'geometry') {\n const columnName = resolveConfiguredColumn(layerProps, binding.configKey);\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 (\n !compatibility.allowGeoArrowPromotion ||\n !wkbGeometryDecoder.supportsGeoArrowPromotion(\n layerName,\n resolvedGeometry.encoding,\n prepared.table,\n resolvedGeometry.columnName,\n )\n ) {\n throw new Error(\n `Layer \"${layerName}\" cannot render geometry encoding \"${resolvedGeometry.encoding}\" for dataset \"${prepared.datasetId}\".`,\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 = resolveConfiguredColumn(layerProps, binding.configKey);\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>) => {\n const field = typeof props.field === 'string' ? props.field : undefined;\n if (!field) return undefined;\n return `@@=${field}`;\n },\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 // Normalize getElevation: subtract column minimum so the lowest\n // feature sits at ground level and differences are clearly visible.\n const rawElev = nextProps.getElevation;\n 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 const v = Number(elevVector.get(i));\n if (Number.isFinite(v) && v < min) min = v;\n }\n if (Number.isFinite(min) && min !== 0) {\n nextProps.getElevation = `@@=Math.max(0, ${elevField} - ${min})`;\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 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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extractColorScaleLegends.d.ts","sourceRoot":"","sources":["../../src/json/extractColorScaleLegends.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,mBAAmB,EAAC,MAAM,wBAAwB,CAAC;AAChE,OAAO,KAAK,EAAC,wBAAwB,EAAC,MAAM,UAAU,CAAC;AAoDvD,wBAAgB,wBAAwB,CAAC,OAAO,EAAE;IAChD,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACrC,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,wBAAwB,CAAC,CAAC;CACzD,
|
|
1
|
+
{"version":3,"file":"extractColorScaleLegends.d.ts","sourceRoot":"","sources":["../../src/json/extractColorScaleLegends.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,mBAAmB,EAAC,MAAM,wBAAwB,CAAC;AAChE,OAAO,KAAK,EAAC,wBAAwB,EAAC,MAAM,UAAU,CAAC;AAoDvD,wBAAgB,wBAAwB,CAAC,OAAO,EAAE;IAChD,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACrC,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,wBAAwB,CAAC,CAAC;CACzD,yBA+EA"}
|
|
@@ -64,20 +64,34 @@ export function extractColorScaleLegends(options) {
|
|
|
64
64
|
if (!datasetState || datasetState.status !== 'ready') {
|
|
65
65
|
continue;
|
|
66
66
|
}
|
|
67
|
+
// Show a legend for each distinct color-scale accessor on the layer
|
|
68
|
+
// (fill + stroke, or arc source/target). Skip duplicates that resolve to
|
|
69
|
+
// the same title/type/scheme/field.
|
|
70
|
+
const seenLegendKeys = new Set();
|
|
67
71
|
for (const { propName, colorScale } of resolvedColorScales) {
|
|
68
|
-
let resolvedLegend = null;
|
|
69
72
|
try {
|
|
70
|
-
|
|
73
|
+
const title = resolveLegendTitle(layerProps, propName, colorScale.field);
|
|
74
|
+
const key = [
|
|
75
|
+
title,
|
|
76
|
+
colorScale.type,
|
|
77
|
+
String(colorScale.scheme ?? ''),
|
|
78
|
+
colorScale.field,
|
|
79
|
+
JSON.stringify(colorScale),
|
|
80
|
+
].join('\0');
|
|
81
|
+
if (seenLegendKeys.has(key))
|
|
82
|
+
continue;
|
|
83
|
+
const resolvedLegend = buildColorScaleLegend({
|
|
71
84
|
table: datasetState.prepared.table,
|
|
72
85
|
colorScale,
|
|
73
|
-
title
|
|
86
|
+
title,
|
|
74
87
|
});
|
|
88
|
+
if (resolvedLegend) {
|
|
89
|
+
seenLegendKeys.add(key);
|
|
90
|
+
legends.push(resolvedLegend);
|
|
91
|
+
}
|
|
75
92
|
}
|
|
76
93
|
catch {
|
|
77
|
-
|
|
78
|
-
}
|
|
79
|
-
if (resolvedLegend) {
|
|
80
|
-
legends.push(resolvedLegend);
|
|
94
|
+
// try next accessor
|
|
81
95
|
}
|
|
82
96
|
}
|
|
83
97
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extractColorScaleLegends.js","sourceRoot":"","sources":["../../src/json/extractColorScaleLegends.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"extractColorScaleLegends.js","sourceRoot":"","sources":["../../src/json/extractColorScaleLegends.ts"],"names":[],"mappings":"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","sourcesContent":["import type {ResolvedColorLegend} from '@sqlrooms/color-scales';\nimport type {PreparedDeckDatasetState} from '../types';\nimport {getAllColorScales} from './colorScaleFunction';\nimport {buildColorScaleLegend} from './compileColorScale';\nimport {DEFAULT_HEATMAP_COLOR_RANGE} from './heatmapDefaults';\nimport {resolveColorLegend, resolveDatasetId} from './layerConfig';\n\nimport type {ColorScalePropName} from './colorScaleFunction';\n\nfunction resolveLegendTitle(\n layerProps: Record<string, unknown>,\n propName: ColorScalePropName,\n fallbackField: string,\n) {\n const legend = resolveColorLegend(layerProps, propName);\n if (\n legend &&\n typeof legend === 'object' &&\n typeof legend.title === 'string'\n ) {\n return legend.title;\n }\n\n return fallbackField;\n}\n\nfunction buildHeatmapLegend(\n layerProps: Record<string, unknown>,\n): ResolvedColorLegend | null {\n const rawRange = layerProps.colorRange as\n | Array<[number, number, number, number]>\n | undefined;\n const colorRange =\n Array.isArray(rawRange) && rawRange.length >= 2\n ? rawRange\n : DEFAULT_HEATMAP_COLOR_RANGE;\n\n const stops = colorRange.map((c, i) => {\n const pct = (i / (colorRange.length - 1)) * 100;\n return `rgba(${c[0]},${c[1]},${c[2]},${(c[3] ?? 255) / 255}) ${pct.toFixed(1)}%`;\n });\n\n return {\n type: 'continuous',\n title: 'Density',\n gradient: `linear-gradient(to right, ${stops.join(', ')})`,\n ticks: [\n {label: 'Low', offset: 0},\n {label: 'High', offset: 100},\n ],\n };\n}\n\nexport function extractColorScaleLegends(options: {\n spec: Record<string, unknown> | null;\n datasetIds: string[];\n datasetStates: Record<string, PreparedDeckDatasetState>;\n}) {\n const {spec, datasetIds, datasetStates} = options;\n if (!spec || !Array.isArray(spec.layers)) {\n return [] as ResolvedColorLegend[];\n }\n\n const legends: ResolvedColorLegend[] = [];\n\n for (const layer of spec.layers) {\n if (!layer || typeof layer !== 'object') {\n continue;\n }\n\n const layerProps = layer as Record<string, unknown>;\n\n if (layerProps.visible === false) {\n continue;\n }\n\n const layerType = layerProps['@@type'];\n if (layerType === 'GeoArrowHeatmapLayer') {\n const heatmapLegend = buildHeatmapLegend(layerProps);\n if (heatmapLegend) {\n legends.push(heatmapLegend);\n }\n continue;\n }\n\n const resolvedColorScales = getAllColorScales(layerProps);\n if (resolvedColorScales.length === 0) {\n continue;\n }\n\n const datasetId = resolveDatasetId(layerProps, datasetIds);\n if (!datasetId) {\n continue;\n }\n\n const datasetState = datasetStates[datasetId];\n if (!datasetState || datasetState.status !== 'ready') {\n continue;\n }\n\n // Show a legend for each distinct color-scale accessor on the layer\n // (fill + stroke, or arc source/target). Skip duplicates that resolve to\n // the same title/type/scheme/field.\n const seenLegendKeys = new Set<string>();\n for (const {propName, colorScale} of resolvedColorScales) {\n try {\n const title = resolveLegendTitle(\n layerProps,\n propName,\n colorScale.field,\n );\n const key = [\n title,\n colorScale.type,\n String(colorScale.scheme ?? ''),\n colorScale.field,\n JSON.stringify(colorScale),\n ].join('\\0');\n if (seenLegendKeys.has(key)) continue;\n\n const resolvedLegend = buildColorScaleLegend({\n table: datasetState.prepared.table,\n colorScale,\n title,\n });\n if (resolvedLegend) {\n seenLegendKeys.add(key);\n legends.push(resolvedLegend);\n }\n } catch {\n // try next accessor\n }\n }\n }\n\n return legends;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DeckH3HexagonLayer.d.ts","sourceRoot":"","sources":["../../../src/json/layers/DeckH3HexagonLayer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,cAAc,EAAE,KAAK,KAAK,EAAE,KAAK,UAAU,EAAC,MAAM,eAAe,CAAC;AAE1E,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"DeckH3HexagonLayer.d.ts","sourceRoot":"","sources":["../../../src/json/layers/DeckH3HexagonLayer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,cAAc,EAAE,KAAK,KAAK,EAAE,KAAK,UAAU,EAAC,MAAM,eAAe,CAAC;AAE1E,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AAGtC;;;;;;;;;;;GAWG;AACH,qBAAa,kBAAmB,SAAQ,cAAc,CAAC;IACrD,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC;IAClB,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC;IACzB,YAAY,CAAC,EACT,KAAK,CAAC,MAAM,GACZ,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAChC,CAAC,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC,CAAC;IAC9B,YAAY,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,MAAM,GAAG,CAAC,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC,CAAC;IACjE,YAAY,CAAC,EACT,KAAK,CAAC,MAAM,GACZ,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAChC,CAAC,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC,CAAC;IAC9B,YAAY,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,MAAM,GAAG,CAAC,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC,CAAC;IACjE,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB,CAAC;IACA,MAAM,CAAC,SAAS,SAA4B;IAC5C,MAAM,CAAC,YAAY;;;;;;;;;MAIjB;IAEF,YAAY,IAAI,KAAK,GAAG,UAAU,GAAG,IAAI;CAsG1C"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { CompositeLayer } from '@deck.gl/core';
|
|
2
2
|
import { H3HexagonLayer } from '@deck.gl/geo-layers';
|
|
3
3
|
import * as arrow from 'apache-arrow';
|
|
4
|
+
import { formatH3IndexForDeck } from './h3IndexFormat';
|
|
4
5
|
/**
|
|
5
6
|
* Custom GeoArrow-compatible H3HexagonLayer wrapper.
|
|
6
7
|
*
|
|
@@ -26,9 +27,6 @@ export class DeckH3HexagonLayer extends CompositeLayer {
|
|
|
26
27
|
return null;
|
|
27
28
|
const numRows = table.numRows;
|
|
28
29
|
const isVector = hexProp instanceof arrow.Vector;
|
|
29
|
-
const isBigIntColumn = isVector &&
|
|
30
|
-
(hexProp.type instanceof arrow.Int64 ||
|
|
31
|
-
hexProp.type instanceof arrow.Uint64);
|
|
32
30
|
// Build a lookup from global row index to {batch, localIndex} for
|
|
33
31
|
// multi-batch tables so compiled accessors receive the correct batch.
|
|
34
32
|
const batches = table.batches;
|
|
@@ -52,11 +50,7 @@ export class DeckH3HexagonLayer extends CompositeLayer {
|
|
|
52
50
|
// Resolve hex value per row
|
|
53
51
|
const getHexValue = (i) => {
|
|
54
52
|
if (isVector) {
|
|
55
|
-
|
|
56
|
-
if (isBigIntColumn && typeof raw === 'bigint') {
|
|
57
|
-
return raw.toString(16);
|
|
58
|
-
}
|
|
59
|
-
return String(raw ?? '');
|
|
53
|
+
return formatH3IndexForDeck(hexProp.get(i));
|
|
60
54
|
}
|
|
61
55
|
// Compiled accessor function
|
|
62
56
|
if (typeof hexProp === 'function') {
|
|
@@ -66,9 +60,7 @@ export class DeckH3HexagonLayer extends CompositeLayer {
|
|
|
66
60
|
data: { data: batch },
|
|
67
61
|
target: [],
|
|
68
62
|
});
|
|
69
|
-
|
|
70
|
-
return result.toString(16);
|
|
71
|
-
return String(result ?? '');
|
|
63
|
+
return formatH3IndexForDeck(result);
|
|
72
64
|
}
|
|
73
65
|
return '';
|
|
74
66
|
};
|
|
@@ -87,8 +79,10 @@ export class DeckH3HexagonLayer extends CompositeLayer {
|
|
|
87
79
|
if (propValue instanceof arrow.Vector) {
|
|
88
80
|
// Arrow Vector → row accessor (H3 layer uses row-based iteration)
|
|
89
81
|
const vec = propValue;
|
|
90
|
-
layerProps[propName] = (
|
|
91
|
-
|
|
82
|
+
layerProps[propName] = (_d, { index }) => {
|
|
83
|
+
const raw = vec.get(index);
|
|
84
|
+
// Int64 elevation/width columns arrive as bigint; deck.gl needs numbers.
|
|
85
|
+
return typeof raw === 'bigint' ? Number(raw) : raw;
|
|
92
86
|
};
|
|
93
87
|
}
|
|
94
88
|
else if (typeof propValue === 'function') {
|
|
@@ -96,11 +90,12 @@ export class DeckH3HexagonLayer extends CompositeLayer {
|
|
|
96
90
|
const fn = propValue;
|
|
97
91
|
layerProps[propName] = (_object, objectInfo) => {
|
|
98
92
|
const { batch, localIndex } = resolveBatchContext(objectInfo.index);
|
|
99
|
-
|
|
93
|
+
const result = fn({
|
|
100
94
|
index: localIndex,
|
|
101
95
|
data: { data: batch },
|
|
102
96
|
target: objectInfo.target,
|
|
103
97
|
});
|
|
98
|
+
return typeof result === 'bigint' ? Number(result) : result;
|
|
104
99
|
};
|
|
105
100
|
}
|
|
106
101
|
else {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DeckH3HexagonLayer.js","sourceRoot":"","sources":["../../../src/json/layers/DeckH3HexagonLayer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,cAAc,EAA8B,MAAM,eAAe,CAAC;AAC1E,OAAO,EAAC,cAAc,EAAC,MAAM,qBAAqB,CAAC;AACnD,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"DeckH3HexagonLayer.js","sourceRoot":"","sources":["../../../src/json/layers/DeckH3HexagonLayer.ts"],"names":[],"mappings":"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","sourcesContent":["import {CompositeLayer, type Layer, type LayersList} from '@deck.gl/core';\nimport {H3HexagonLayer} from '@deck.gl/geo-layers';\nimport * as arrow from 'apache-arrow';\nimport {formatH3IndexForDeck} from './h3IndexFormat';\n\n/**\n * Custom GeoArrow-compatible H3HexagonLayer wrapper.\n *\n * The upstream GeoArrowH3HexagonLayer (from @geoarrow/deck.gl-geoarrow@0.4.x)\n * expects `getHexagon: Data<Utf8 | Uint64>`, but our pipeline may produce\n * BigInt H3 indices that need hex-string conversion. Additionally, H3HexagonLayer\n * internally iterates rows using createIterable and calls getHexagon(object)\n * expecting string H3 indices, which is incompatible with binary attribute passing.\n *\n * This wrapper converts Arrow data to row objects with proper BigInt→hex string\n * conversion, then passes them to the native H3HexagonLayer.\n */\nexport class DeckH3HexagonLayer extends CompositeLayer<{\n data: arrow.Table;\n getHexagon: arrow.Vector;\n getFillColor?:\n | arrow.Vector\n | [number, number, number, number]\n | ((...args: any[]) => any);\n getElevation?: arrow.Vector | number | ((...args: any[]) => any);\n getLineColor?:\n | arrow.Vector\n | [number, number, number, number]\n | ((...args: any[]) => any);\n getLineWidth?: arrow.Vector | number | ((...args: any[]) => any);\n [key: string]: unknown;\n}> {\n static layerName = 'GeoArrowH3HexagonLayer';\n static defaultProps = {\n highPrecision: 'auto',\n coverage: {type: 'number', min: 0, max: 1, value: 1},\n extruded: true,\n };\n\n renderLayers(): Layer | LayersList | null {\n const {data: table, getHexagon: hexProp, ...otherProps} = this.props;\n\n if (!table || !hexProp) return null;\n\n const numRows = table.numRows;\n const isVector = hexProp instanceof arrow.Vector;\n\n // Build a lookup from global row index to {batch, localIndex} for\n // multi-batch tables so compiled accessors receive the correct batch.\n const batches = table.batches;\n const batchOffsets = new Int32Array(batches.length);\n for (let i = 1; i < batches.length; i++) {\n batchOffsets[i] = batchOffsets[i - 1]! + batches[i - 1]!.numRows;\n }\n\n const resolveBatchContext = (globalIndex: number) => {\n let batchIdx = batches.length - 1;\n for (let i = 1; i < batches.length; i++) {\n if (globalIndex < batchOffsets[i]!) {\n batchIdx = i - 1;\n break;\n }\n }\n return {\n batch: batches[batchIdx]!,\n localIndex: globalIndex - batchOffsets[batchIdx]!,\n };\n };\n\n // Resolve hex value per row\n const getHexValue = (i: number): string => {\n if (isVector) {\n return formatH3IndexForDeck(hexProp.get(i));\n }\n // Compiled accessor function\n if (typeof hexProp === 'function') {\n const {batch, localIndex} = resolveBatchContext(i);\n const result = (hexProp as (...args: unknown[]) => unknown)({\n index: localIndex,\n data: {data: batch},\n target: [],\n });\n return formatH3IndexForDeck(result);\n }\n return '';\n };\n\n // Build row objects from Arrow table\n const rows: Record<string, unknown>[] = Array.from(\n {length: numRows},\n (_, i) => {\n const row: Record<string, unknown> = {};\n for (const field of table.schema.fields) {\n row[field.name] = table.getChild(field.name)?.get(i);\n }\n row.__h3Index = getHexValue(i);\n return row;\n },\n );\n\n // Resolve accessor props: Arrow Vectors → row functions, keep scalars\n const layerProps: Record<string, unknown> = {};\n for (const [propName, propValue] of Object.entries(otherProps)) {\n if (propValue instanceof arrow.Vector) {\n // Arrow Vector → row accessor (H3 layer uses row-based iteration)\n const vec = propValue;\n layerProps[propName] = (\n _d: Record<string, unknown>,\n {index}: {index: number},\n ) => {\n const raw = vec.get(index);\n // Int64 elevation/width columns arrive as bigint; deck.gl needs numbers.\n return typeof raw === 'bigint' ? Number(raw) : raw;\n };\n } else if (typeof propValue === 'function') {\n // Compiled GeoArrow accessor → wrap with batch context\n const fn = propValue;\n layerProps[propName] = (\n _object: unknown,\n objectInfo: {index: number; target?: number[]},\n ) => {\n const {batch, localIndex} = resolveBatchContext(objectInfo.index);\n const result = fn({\n index: localIndex,\n data: {data: batch},\n target: objectInfo.target,\n });\n return typeof result === 'bigint' ? Number(result) : result;\n };\n } else {\n layerProps[propName] = propValue;\n }\n }\n\n return new H3HexagonLayer({\n ...layerProps,\n id: `${this.props.id}-geoarrow-h3`,\n data: rows,\n getHexagon: (d: Record<string, unknown>) => d.__h3Index as string,\n } as any);\n }\n}\n"]}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Convert Arrow/DuckDB H3 cell ids to hex strings for H3HexagonLayer.
|
|
3
|
+
* Bigint must use base-16 — `String(bigint)` is decimal and invalid for deck.gl.
|
|
4
|
+
*/
|
|
5
|
+
export declare function formatH3IndexForDeck(value: unknown): string;
|
|
6
|
+
//# sourceMappingURL=h3IndexFormat.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"h3IndexFormat.d.ts","sourceRoot":"","sources":["../../../src/json/layers/h3IndexFormat.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAU3D"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Convert Arrow/DuckDB H3 cell ids to hex strings for H3HexagonLayer.
|
|
3
|
+
* Bigint must use base-16 — `String(bigint)` is decimal and invalid for deck.gl.
|
|
4
|
+
*/
|
|
5
|
+
export function formatH3IndexForDeck(value) {
|
|
6
|
+
if (value == null)
|
|
7
|
+
return '';
|
|
8
|
+
if (typeof value === 'bigint') {
|
|
9
|
+
return BigInt.asUintN(64, value).toString(16);
|
|
10
|
+
}
|
|
11
|
+
if (typeof value === 'number' && Number.isFinite(value)) {
|
|
12
|
+
// Narrow ints only; unsafe for full H3 range.
|
|
13
|
+
return BigInt.asUintN(64, BigInt(Math.trunc(value))).toString(16);
|
|
14
|
+
}
|
|
15
|
+
return String(value);
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=h3IndexFormat.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"h3IndexFormat.js","sourceRoot":"","sources":["../../../src/json/layers/h3IndexFormat.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,KAAc;IACjD,IAAI,KAAK,IAAI,IAAI;QAAE,OAAO,EAAE,CAAC;IAC7B,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,MAAM,CAAC,OAAO,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAChD,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACxD,8CAA8C;QAC9C,OAAO,MAAM,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IACpE,CAAC;IACD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;AACvB,CAAC","sourcesContent":["/**\n * Convert Arrow/DuckDB H3 cell ids to hex strings for H3HexagonLayer.\n * Bigint must use base-16 — `String(bigint)` is decimal and invalid for deck.gl.\n */\nexport function formatH3IndexForDeck(value: unknown): string {\n if (value == null) return '';\n if (typeof value === 'bigint') {\n return BigInt.asUintN(64, value).toString(16);\n }\n if (typeof value === 'number' && Number.isFinite(value)) {\n // Narrow ints only; unsafe for full H3 range.\n return BigInt.asUintN(64, BigInt(Math.trunc(value))).toString(16);\n }\n return String(value);\n}\n"]}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export { createTableToRecordBatchAdapter } from './createTableToRecordBatchAdapter';
|
|
2
2
|
export { DeckColumnLayer } from './DeckColumnLayer';
|
|
3
3
|
export { DeckH3HexagonLayer } from './DeckH3HexagonLayer';
|
|
4
|
+
export { formatH3IndexForDeck } from './h3IndexFormat';
|
|
4
5
|
export { DeckTripsLayer } from './DeckTripsLayer';
|
|
5
6
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/json/layers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,+BAA+B,EAAC,MAAM,mCAAmC,CAAC;AAClF,OAAO,EAAC,eAAe,EAAC,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAC,kBAAkB,EAAC,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAC,cAAc,EAAC,MAAM,kBAAkB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/json/layers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,+BAA+B,EAAC,MAAM,mCAAmC,CAAC;AAClF,OAAO,EAAC,eAAe,EAAC,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAC,kBAAkB,EAAC,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAC,oBAAoB,EAAC,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAC,cAAc,EAAC,MAAM,kBAAkB,CAAC"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export { createTableToRecordBatchAdapter } from './createTableToRecordBatchAdapter';
|
|
2
2
|
export { DeckColumnLayer } from './DeckColumnLayer';
|
|
3
3
|
export { DeckH3HexagonLayer } from './DeckH3HexagonLayer';
|
|
4
|
+
export { formatH3IndexForDeck } from './h3IndexFormat';
|
|
4
5
|
export { DeckTripsLayer } from './DeckTripsLayer';
|
|
5
6
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/json/layers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,+BAA+B,EAAC,MAAM,mCAAmC,CAAC;AAClF,OAAO,EAAC,eAAe,EAAC,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAC,kBAAkB,EAAC,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAC,cAAc,EAAC,MAAM,kBAAkB,CAAC","sourcesContent":["export {createTableToRecordBatchAdapter} from './createTableToRecordBatchAdapter';\nexport {DeckColumnLayer} from './DeckColumnLayer';\nexport {DeckH3HexagonLayer} from './DeckH3HexagonLayer';\nexport {DeckTripsLayer} from './DeckTripsLayer';\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/json/layers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,+BAA+B,EAAC,MAAM,mCAAmC,CAAC;AAClF,OAAO,EAAC,eAAe,EAAC,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAC,kBAAkB,EAAC,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAC,oBAAoB,EAAC,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAC,cAAc,EAAC,MAAM,kBAAkB,CAAC","sourcesContent":["export {createTableToRecordBatchAdapter} from './createTableToRecordBatchAdapter';\nexport {DeckColumnLayer} from './DeckColumnLayer';\nexport {DeckH3HexagonLayer} from './DeckH3HexagonLayer';\nexport {formatH3IndexForDeck} from './h3IndexFormat';\nexport {DeckTripsLayer} from './DeckTripsLayer';\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rewriteGeoArrowAccessors.d.ts","sourceRoot":"","sources":["../../src/json/rewriteGeoArrowAccessors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"rewriteGeoArrowAccessors.d.ts","sourceRoot":"","sources":["../../src/json/rewriteGeoArrowAccessors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AAqCtC,wBAAgB,wBAAwB,CAAC,OAAO,EAAE;IAChD,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB,2BA4CA"}
|
|
@@ -5,6 +5,15 @@ function isSimpleColumnReference(expression) {
|
|
|
5
5
|
return /^[A-Za-z_$][\w$]*$/.test(expression.trim());
|
|
6
6
|
}
|
|
7
7
|
function canUseDirectVectorAccessor(propName, vector) {
|
|
8
|
+
// H3 index columns are safe as Vectors — DeckH3HexagonLayer reads them
|
|
9
|
+
// directly and converts BigInt → hex string when needed.
|
|
10
|
+
if (propName === 'getHexagon') {
|
|
11
|
+
const type = vector.type;
|
|
12
|
+
return (arrow.DataType.isUtf8(type) ||
|
|
13
|
+
arrow.DataType.isLargeUtf8(type) ||
|
|
14
|
+
// DuckDB UBIGINT often arrives as Int(true, 64), not instanceof Int64.
|
|
15
|
+
(arrow.DataType.isInt(type) && type.bitWidth === 64));
|
|
16
|
+
}
|
|
8
17
|
// Direct numeric vectors (for example `getRadius`) currently end up in deck's
|
|
9
18
|
// binary attribute path and trigger `Float64Array` initialization failures in the
|
|
10
19
|
// GeoArrow scatterplot wrapper. Re-test which direct vector accessors are safe
|