@sqlrooms/deck 0.29.0-rc.7 → 0.29.0-rc.9
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/LICENSE.md +2 -1
- package/README.md +31 -6
- package/dist/DeckJsonMap.d.ts +2 -2
- package/dist/DeckJsonMap.d.ts.map +1 -1
- package/dist/DeckJsonMap.js +204 -17
- package/dist/DeckJsonMap.js.map +1 -1
- package/dist/DeckJsonMapSpec.d.ts +36 -36
- package/dist/DeckJsonMapSpec.d.ts.map +1 -1
- package/dist/DeckJsonMapSpec.js +1 -0
- package/dist/DeckJsonMapSpec.js.map +1 -1
- package/dist/MapSettings.d.ts.map +1 -1
- package/dist/MapSettings.js +203 -25
- package/dist/MapSettings.js.map +1 -1
- package/dist/ai.d.ts +55 -8
- package/dist/ai.d.ts.map +1 -1
- package/dist/ai.js +190 -41
- package/dist/ai.js.map +1 -1
- package/dist/block.d.ts +20 -0
- package/dist/block.d.ts.map +1 -0
- package/dist/block.js +119 -0
- package/dist/block.js.map +1 -0
- package/dist/dashboard.d.ts +2 -0
- package/dist/dashboard.d.ts.map +1 -1
- package/dist/dashboard.js +194 -285
- package/dist/dashboard.js.map +1 -1
- package/dist/dashboardConfig.d.ts +11 -3
- package/dist/dashboardConfig.d.ts.map +1 -1
- package/dist/dashboardConfig.js +82 -7
- package/dist/dashboardConfig.js.map +1 -1
- package/dist/index.d.ts +4 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/dist/json/aggregateWaypoints.d.ts +14 -0
- package/dist/json/aggregateWaypoints.d.ts.map +1 -0
- package/dist/json/aggregateWaypoints.js +190 -0
- package/dist/json/aggregateWaypoints.js.map +1 -0
- package/dist/json/compileColorScale.d.ts +1 -1
- package/dist/json/compileColorScale.d.ts.map +1 -1
- package/dist/json/compileColorScale.js +42 -20
- package/dist/json/compileColorScale.js.map +1 -1
- package/dist/json/createDeckJsonConfiguration.d.ts.map +1 -1
- package/dist/json/createDeckJsonConfiguration.js +106 -8
- package/dist/json/createDeckJsonConfiguration.js.map +1 -1
- package/dist/json/defaultClasses.d.ts +5 -4
- package/dist/json/defaultClasses.d.ts.map +1 -1
- package/dist/json/defaultClasses.js +9 -4
- package/dist/json/defaultClasses.js.map +1 -1
- package/dist/json/extractColorScaleLegends.d.ts.map +1 -1
- package/dist/json/extractColorScaleLegends.js +43 -5
- package/dist/json/extractColorScaleLegends.js.map +1 -1
- package/dist/json/heatmapDefaults.d.ts +8 -0
- package/dist/json/heatmapDefaults.d.ts.map +1 -0
- package/dist/json/heatmapDefaults.js +14 -0
- package/dist/json/heatmapDefaults.js.map +1 -0
- package/dist/json/layerCompatibility.d.ts.map +1 -1
- package/dist/json/layerCompatibility.js +5 -1
- package/dist/json/layerCompatibility.js.map +1 -1
- package/dist/json/layers/DeckColumnLayer.d.ts +12 -0
- package/dist/json/layers/DeckColumnLayer.d.ts.map +1 -0
- package/dist/json/layers/DeckColumnLayer.js +26 -0
- package/dist/json/layers/DeckColumnLayer.js.map +1 -0
- package/dist/json/layers/DeckH3HexagonLayer.d.ts +37 -0
- package/dist/json/layers/DeckH3HexagonLayer.d.ts.map +1 -0
- package/dist/json/layers/DeckH3HexagonLayer.js +96 -0
- package/dist/json/layers/DeckH3HexagonLayer.js.map +1 -0
- package/dist/json/layers/DeckTripsLayer.d.ts +45 -0
- package/dist/json/layers/DeckTripsLayer.d.ts.map +1 -0
- package/dist/json/layers/DeckTripsLayer.js +169 -0
- package/dist/json/layers/DeckTripsLayer.js.map +1 -0
- package/dist/json/layers/index.d.ts +4 -0
- package/dist/json/layers/index.d.ts.map +1 -0
- package/dist/json/layers/index.js +4 -0
- package/dist/json/layers/index.js.map +1 -0
- package/dist/json/rewriteGeoArrowAccessors.d.ts.map +1 -1
- package/dist/json/rewriteGeoArrowAccessors.js +5 -0
- package/dist/json/rewriteGeoArrowAccessors.js.map +1 -1
- package/dist/mapConfigUtils.d.ts +102 -1
- package/dist/mapConfigUtils.d.ts.map +1 -1
- package/dist/mapConfigUtils.js +21 -3
- package/dist/mapConfigUtils.js.map +1 -1
- package/dist/mapLayerConfigUtils.d.ts +15 -0
- package/dist/mapLayerConfigUtils.d.ts.map +1 -1
- package/dist/mapLayerConfigUtils.js +109 -7
- package/dist/mapLayerConfigUtils.js.map +1 -1
- package/dist/prepare/detectGeometryColumn.d.ts +10 -1
- package/dist/prepare/detectGeometryColumn.d.ts.map +1 -1
- package/dist/prepare/detectGeometryColumn.js +48 -6
- package/dist/prepare/detectGeometryColumn.js.map +1 -1
- package/dist/prepare/wkbDecoder.d.ts.map +1 -1
- package/dist/prepare/wkbDecoder.js +88 -1
- package/dist/prepare/wkbDecoder.js.map +1 -1
- package/dist/prepare/wkbParser.d.ts +5 -0
- package/dist/prepare/wkbParser.d.ts.map +1 -1
- package/dist/prepare/wkbParser.js +24 -0
- package/dist/prepare/wkbParser.js.map +1 -1
- package/dist/types.d.ts +14 -4
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/useDeckMapDatasets.d.ts +17 -0
- package/dist/useDeckMapDatasets.d.ts.map +1 -0
- package/dist/useDeckMapDatasets.js +69 -0
- package/dist/useDeckMapDatasets.js.map +1 -0
- package/dist/useDeckMapFitToBounds.d.ts +29 -0
- package/dist/useDeckMapFitToBounds.d.ts.map +1 -0
- package/dist/useDeckMapFitToBounds.js +333 -0
- package/dist/useDeckMapFitToBounds.js.map +1 -0
- package/package.json +7 -6
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
import { CompositeLayer } from '@deck.gl/core';
|
|
2
|
+
import { TripsLayer } from '@deck.gl/geo-layers';
|
|
3
|
+
import * as arrow from 'apache-arrow';
|
|
4
|
+
/**
|
|
5
|
+
* Expand a per-geometry array to per-coordinate by repeating values for each
|
|
6
|
+
* vertex in the geometry (required by deck.gl's binary attribute interface for
|
|
7
|
+
* per-path attributes like getColor on PathLayer/TripsLayer).
|
|
8
|
+
*/
|
|
9
|
+
function expandToCoords(input, size, geomOffsets) {
|
|
10
|
+
const numCoords = geomOffsets[geomOffsets.length - 1];
|
|
11
|
+
// @ts-expect-error constructor signature
|
|
12
|
+
const output = new input.constructor(numCoords * size);
|
|
13
|
+
for (let geomIdx = 0; geomIdx < geomOffsets.length - 1; geomIdx++) {
|
|
14
|
+
const start = geomOffsets[geomIdx];
|
|
15
|
+
const end = geomOffsets[geomIdx + 1];
|
|
16
|
+
for (let coordIdx = start; coordIdx < end; coordIdx++) {
|
|
17
|
+
for (let i = 0; i < size; i++) {
|
|
18
|
+
output[coordIdx * size + i] = input[geomIdx * size + i];
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
return output;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Custom GeoArrow-compatible TripsLayer wrapper.
|
|
26
|
+
*
|
|
27
|
+
* GeoArrowTripsLayer from @geoarrow/deck.gl-layers@0.3.2 is incompatible with
|
|
28
|
+
* deck.gl 9.3.x: it passes the raw timestamps typed array via binary attributes,
|
|
29
|
+
* but deck.gl 9.3's PathLayer/TripsLayer attribute manager fails to initialize
|
|
30
|
+
* them correctly, producing "Float64Array Error: Float64Array".
|
|
31
|
+
*
|
|
32
|
+
* This wrapper extracts the binary data from Arrow vectors and passes it to the
|
|
33
|
+
* native TripsLayer in a compatible format, properly resolving accessor props
|
|
34
|
+
* (Arrow Vectors → binary attributes, functions → wrapped with batch context).
|
|
35
|
+
*/
|
|
36
|
+
export class DeckTripsLayer extends CompositeLayer {
|
|
37
|
+
static layerName = 'GeoArrowTripsLayer';
|
|
38
|
+
static defaultProps = {
|
|
39
|
+
currentTime: { type: 'number', value: 0 },
|
|
40
|
+
trailLength: { type: 'number', value: 120 },
|
|
41
|
+
fadeTrail: true,
|
|
42
|
+
_pathType: 'open',
|
|
43
|
+
};
|
|
44
|
+
renderLayers() {
|
|
45
|
+
const { data: table, getPath, getTimestamps, ...otherProps } = this.props;
|
|
46
|
+
if (!getPath || !getTimestamps)
|
|
47
|
+
return null;
|
|
48
|
+
const layers = [];
|
|
49
|
+
const numChunks = getPath.data.length;
|
|
50
|
+
for (let chunkIdx = 0; chunkIdx < numChunks; chunkIdx++) {
|
|
51
|
+
const lineData = getPath.data[chunkIdx];
|
|
52
|
+
if (!lineData)
|
|
53
|
+
continue;
|
|
54
|
+
const geomOffsets = lineData.valueOffsets;
|
|
55
|
+
const vertexData = lineData.children[0];
|
|
56
|
+
if (!vertexData)
|
|
57
|
+
continue;
|
|
58
|
+
const nDim = vertexData.type.listSize;
|
|
59
|
+
const coordData = vertexData.children[0];
|
|
60
|
+
if (!coordData)
|
|
61
|
+
continue;
|
|
62
|
+
// Arrow chunks may share a single backing buffer with absolute offsets.
|
|
63
|
+
// deck.gl expects relative (zero-based) offsets for startIndices.
|
|
64
|
+
const baseOffset = geomOffsets[0] ?? 0;
|
|
65
|
+
const relativeOffsets = new Int32Array(geomOffsets.length);
|
|
66
|
+
for (let i = 0; i < geomOffsets.length; i++) {
|
|
67
|
+
relativeOffsets[i] = (geomOffsets[i] ?? 0) - baseOffset;
|
|
68
|
+
}
|
|
69
|
+
const numVertices = relativeOffsets[relativeOffsets.length - 1] ?? 0;
|
|
70
|
+
// Slice the coordinate buffer to only this chunk's vertices
|
|
71
|
+
const rawValues = coordData.values;
|
|
72
|
+
const coordStart = baseOffset * nDim;
|
|
73
|
+
const coordEnd = coordStart + numVertices * nDim;
|
|
74
|
+
const flatCoords = coordStart > 0 || coordEnd < rawValues.length
|
|
75
|
+
? rawValues.slice(coordStart, coordEnd)
|
|
76
|
+
: rawValues;
|
|
77
|
+
const tsData = getTimestamps.data[chunkIdx];
|
|
78
|
+
if (!tsData)
|
|
79
|
+
continue;
|
|
80
|
+
const tsChild = tsData.children[0];
|
|
81
|
+
if (!tsChild)
|
|
82
|
+
continue;
|
|
83
|
+
// Slice timestamps to this chunk's range (same shared-buffer issue)
|
|
84
|
+
const tsBaseOffset = tsData.valueOffsets[0] ?? 0;
|
|
85
|
+
const tsRawValues = tsChild.values;
|
|
86
|
+
const tsStart = tsBaseOffset;
|
|
87
|
+
const tsEnd = tsStart + numVertices;
|
|
88
|
+
// TripsLayer's timestamps attribute does NOT have doublePrecision, so
|
|
89
|
+
// luma.gl's type resolver rejects Float64Array. Timestamps MUST be Float32.
|
|
90
|
+
let tsValues;
|
|
91
|
+
if (tsRawValues instanceof Float32Array) {
|
|
92
|
+
tsValues = tsRawValues.slice(tsStart, tsEnd);
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
tsValues = new Float32Array(numVertices);
|
|
96
|
+
const src = tsRawValues;
|
|
97
|
+
if (src instanceof BigInt64Array || src instanceof BigUint64Array) {
|
|
98
|
+
for (let i = 0; i < numVertices; i++) {
|
|
99
|
+
tsValues[i] = Number(src[tsStart + i]);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
for (let i = 0; i < numVertices; i++) {
|
|
104
|
+
tsValues[i] = Number(src[tsStart + i]) || 0;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
const { _tripsMaxTimestamp: _unused, ...restProps } = otherProps;
|
|
109
|
+
void _unused;
|
|
110
|
+
const binaryAttributes = {
|
|
111
|
+
getPath: { value: flatCoords, size: nDim },
|
|
112
|
+
getTimestamps: { value: tsValues, size: 1 },
|
|
113
|
+
};
|
|
114
|
+
const layerProps = {};
|
|
115
|
+
const batch = table.batches[chunkIdx];
|
|
116
|
+
for (const [propName, propValue] of Object.entries(restProps)) {
|
|
117
|
+
if (propValue instanceof arrow.Vector) {
|
|
118
|
+
// Arrow Vector accessor → resolve to binary attribute
|
|
119
|
+
const chunkData = propValue.data[chunkIdx];
|
|
120
|
+
if (!chunkData)
|
|
121
|
+
continue;
|
|
122
|
+
if (arrow.DataType.isFixedSizeList(chunkData.type)) {
|
|
123
|
+
const childValues = chunkData.children[0]?.values;
|
|
124
|
+
if (!childValues)
|
|
125
|
+
continue;
|
|
126
|
+
const values = expandToCoords(childValues, chunkData.type.listSize, relativeOffsets);
|
|
127
|
+
binaryAttributes[propName] = {
|
|
128
|
+
value: values,
|
|
129
|
+
size: chunkData.type.listSize,
|
|
130
|
+
normalized: true,
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
else if (arrow.DataType.isFloat(chunkData.type)) {
|
|
134
|
+
const values = expandToCoords(chunkData.values, 1, relativeOffsets);
|
|
135
|
+
binaryAttributes[propName] = { value: values, size: 1 };
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
else if (typeof propValue === 'function') {
|
|
139
|
+
// Function accessor → wrap to provide batch context
|
|
140
|
+
const fn = propValue;
|
|
141
|
+
layerProps[propName] = (_object, objectInfo) => {
|
|
142
|
+
return fn({
|
|
143
|
+
index: objectInfo.index,
|
|
144
|
+
data: { data: batch },
|
|
145
|
+
target: objectInfo.target,
|
|
146
|
+
});
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
else {
|
|
150
|
+
layerProps[propName] = propValue;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
const props = {
|
|
154
|
+
...layerProps,
|
|
155
|
+
_pathType: 'open',
|
|
156
|
+
id: `${this.props.id}-geoarrow-trip-${chunkIdx}`,
|
|
157
|
+
data: {
|
|
158
|
+
data: batch,
|
|
159
|
+
length: lineData.length,
|
|
160
|
+
startIndices: relativeOffsets,
|
|
161
|
+
attributes: binaryAttributes,
|
|
162
|
+
},
|
|
163
|
+
};
|
|
164
|
+
layers.push(new TripsLayer(props));
|
|
165
|
+
}
|
|
166
|
+
return layers;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
//# sourceMappingURL=DeckTripsLayer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DeckTripsLayer.js","sourceRoot":"","sources":["../../../src/json/layers/DeckTripsLayer.ts"],"names":[],"mappings":"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","sourcesContent":["import {CompositeLayer, type Layer, type LayersList} from '@deck.gl/core';\nimport {TripsLayer} from '@deck.gl/geo-layers';\nimport * as arrow from 'apache-arrow';\n\ntype TypedArray =\n | Uint8Array\n | Uint8ClampedArray\n | Uint16Array\n | Uint32Array\n | Int8Array\n | Int16Array\n | Int32Array\n | Float32Array\n | Float64Array;\n\n/**\n * Expand a per-geometry array to per-coordinate by repeating values for each\n * vertex in the geometry (required by deck.gl's binary attribute interface for\n * per-path attributes like getColor on PathLayer/TripsLayer).\n */\nfunction expandToCoords<T extends TypedArray>(\n input: T,\n size: number,\n geomOffsets: Int32Array,\n): T {\n const numCoords = geomOffsets[geomOffsets.length - 1]!;\n // @ts-expect-error constructor signature\n const output: T = new input.constructor(numCoords * size);\n for (let geomIdx = 0; geomIdx < geomOffsets.length - 1; geomIdx++) {\n const start = geomOffsets[geomIdx]!;\n const end = geomOffsets[geomIdx + 1]!;\n for (let coordIdx = start; coordIdx < end; coordIdx++) {\n for (let i = 0; i < size; i++) {\n output[coordIdx * size + i] = input[geomIdx * size + i]!;\n }\n }\n }\n return output;\n}\n\n/**\n * Custom GeoArrow-compatible TripsLayer wrapper.\n *\n * GeoArrowTripsLayer from @geoarrow/deck.gl-layers@0.3.2 is incompatible with\n * deck.gl 9.3.x: it passes the raw timestamps typed array via binary attributes,\n * but deck.gl 9.3's PathLayer/TripsLayer attribute manager fails to initialize\n * them correctly, producing \"Float64Array Error: Float64Array\".\n *\n * This wrapper extracts the binary data from Arrow vectors and passes it to the\n * native TripsLayer in a compatible format, properly resolving accessor props\n * (Arrow Vectors → binary attributes, functions → wrapped with batch context).\n */\nexport class DeckTripsLayer extends CompositeLayer<{\n data: arrow.Table;\n getPath: arrow.Vector;\n getTimestamps: arrow.Vector;\n getColor?:\n | arrow.Vector\n | [number, number, number, number]\n | ((...args: any[]) => any);\n getWidth?: arrow.Vector | number | ((...args: any[]) => any);\n currentTime?: number;\n trailLength?: number;\n fadeTrail?: boolean;\n widthMinPixels?: number;\n widthMaxPixels?: number;\n opacity?: number;\n _tripsMaxTimestamp?: number;\n [key: string]: unknown;\n}> {\n static layerName = 'GeoArrowTripsLayer';\n static defaultProps = {\n currentTime: {type: 'number', value: 0},\n trailLength: {type: 'number', value: 120},\n fadeTrail: true,\n _pathType: 'open',\n };\n\n renderLayers(): Layer | LayersList | null {\n const {data: table, getPath, getTimestamps, ...otherProps} = this.props;\n\n if (!getPath || !getTimestamps) return null;\n\n const layers: TripsLayer[] = [];\n const numChunks = getPath.data.length;\n\n for (let chunkIdx = 0; chunkIdx < numChunks; chunkIdx++) {\n const lineData = getPath.data[chunkIdx];\n if (!lineData) continue;\n\n const geomOffsets = lineData.valueOffsets;\n const vertexData = lineData.children[0];\n if (!vertexData) continue;\n const nDim = (vertexData.type as arrow.FixedSizeList).listSize;\n const coordData = vertexData.children[0];\n if (!coordData) continue;\n\n // Arrow chunks may share a single backing buffer with absolute offsets.\n // deck.gl expects relative (zero-based) offsets for startIndices.\n const baseOffset = geomOffsets[0] ?? 0;\n const relativeOffsets = new Int32Array(geomOffsets.length);\n for (let i = 0; i < geomOffsets.length; i++) {\n relativeOffsets[i] = (geomOffsets[i] ?? 0) - baseOffset;\n }\n const numVertices = relativeOffsets[relativeOffsets.length - 1] ?? 0;\n\n // Slice the coordinate buffer to only this chunk's vertices\n const rawValues = coordData.values;\n const coordStart = baseOffset * nDim;\n const coordEnd = coordStart + numVertices * nDim;\n const flatCoords =\n coordStart > 0 || coordEnd < rawValues.length\n ? rawValues.slice(coordStart, coordEnd)\n : rawValues;\n\n const tsData = getTimestamps.data[chunkIdx];\n if (!tsData) continue;\n const tsChild = tsData.children[0];\n if (!tsChild) continue;\n\n // Slice timestamps to this chunk's range (same shared-buffer issue)\n const tsBaseOffset = tsData.valueOffsets[0] ?? 0;\n const tsRawValues = tsChild.values;\n const tsStart = tsBaseOffset;\n const tsEnd = tsStart + numVertices;\n\n // TripsLayer's timestamps attribute does NOT have doublePrecision, so\n // luma.gl's type resolver rejects Float64Array. Timestamps MUST be Float32.\n let tsValues: Float32Array;\n if (tsRawValues instanceof Float32Array) {\n tsValues = tsRawValues.slice(tsStart, tsEnd);\n } else {\n tsValues = new Float32Array(numVertices);\n const src = tsRawValues;\n if (src instanceof BigInt64Array || src instanceof BigUint64Array) {\n for (let i = 0; i < numVertices; i++) {\n tsValues[i] = Number(src[tsStart + i]);\n }\n } else {\n for (let i = 0; i < numVertices; i++) {\n tsValues[i] = Number(src[tsStart + i]) || 0;\n }\n }\n }\n\n const {_tripsMaxTimestamp: _unused, ...restProps} = otherProps;\n void _unused;\n\n const binaryAttributes: Record<\n string,\n {value: TypedArray; size: number; normalized?: boolean}\n > = {\n getPath: {value: flatCoords, size: nDim},\n getTimestamps: {value: tsValues, size: 1},\n };\n\n const layerProps: Record<string, unknown> = {};\n const batch = table.batches[chunkIdx];\n\n for (const [propName, propValue] of Object.entries(restProps)) {\n if (propValue instanceof arrow.Vector) {\n // Arrow Vector accessor → resolve to binary attribute\n const chunkData = propValue.data[chunkIdx];\n if (!chunkData) continue;\n\n if (arrow.DataType.isFixedSizeList(chunkData.type)) {\n const childValues = chunkData.children[0]?.values;\n if (!childValues) continue;\n const values = expandToCoords(\n childValues as TypedArray,\n chunkData.type.listSize,\n relativeOffsets,\n );\n binaryAttributes[propName] = {\n value: values,\n size: chunkData.type.listSize,\n normalized: true,\n };\n } else if (arrow.DataType.isFloat(chunkData.type)) {\n const values = expandToCoords(\n chunkData.values as TypedArray,\n 1,\n relativeOffsets,\n );\n binaryAttributes[propName] = {value: values, size: 1};\n }\n } else if (typeof propValue === 'function') {\n // Function accessor → wrap to provide batch context\n const fn = propValue;\n layerProps[propName] = (\n _object: unknown,\n objectInfo: {index: number; target?: number[]},\n ) => {\n return fn({\n index: objectInfo.index,\n data: {data: batch},\n target: objectInfo.target,\n });\n };\n } else {\n layerProps[propName] = propValue;\n }\n }\n\n const props = {\n ...layerProps,\n _pathType: 'open' as const,\n id: `${this.props.id}-geoarrow-trip-${chunkIdx}`,\n data: {\n data: batch,\n length: lineData.length,\n startIndices: relativeOffsets,\n attributes: binaryAttributes,\n },\n };\n\n layers.push(new TripsLayer(props as any));\n }\n\n return layers;\n }\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/json/layers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,eAAe,EAAC,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAC,kBAAkB,EAAC,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAC,cAAc,EAAC,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/json/layers/index.ts"],"names":[],"mappings":"AAAA,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 {DeckColumnLayer} from './DeckColumnLayer';\nexport {DeckH3HexagonLayer} from './DeckH3HexagonLayer';\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;AA2BtC,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,
|
|
1
|
+
{"version":3,"file":"rewriteGeoArrowAccessors.d.ts","sourceRoot":"","sources":["../../src/json/rewriteGeoArrowAccessors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AA2BtC,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,2BA6CA"}
|
|
@@ -41,6 +41,11 @@ export function rewriteGeoArrowAccessors(options) {
|
|
|
41
41
|
nextProps[propName] = vector;
|
|
42
42
|
continue;
|
|
43
43
|
}
|
|
44
|
+
if (!vector) {
|
|
45
|
+
console.warn(`Column "${expression.trim()}" not found in dataset for accessor "${propName}". Skipping accessor.`);
|
|
46
|
+
delete nextProps[propName];
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
44
49
|
}
|
|
45
50
|
// TODO(geoarrow-upgrade): This fallback exists because 0.3.x GeoArrow layers do
|
|
46
51
|
// not share `@deck.gl/json`'s normal row accessor contract. If the next version
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rewriteGeoArrowAccessors.js","sourceRoot":"","sources":["../../src/json/rewriteGeoArrowAccessors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AACtC,OAAO,EAAC,uBAAuB,EAAC,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAC,qBAAqB,EAAC,MAAM,sBAAsB,CAAC;AAE3D,SAAS,uBAAuB,CAAC,UAAkB;IACjD,OAAO,oBAAoB,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC;AACtD,CAAC;AAED,SAAS,0BAA0B,CAAC,QAAgB,EAAE,MAAoB;IACxE,kFAAkF;IAClF,8EAA8E;IAC9E,kFAAkF;IAClF,+EAA+E;IAC/E,8EAA8E;IAC9E,YAAY;IACZ,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAChC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClC,IAAI,CAAC,UAAU,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,eAAe,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACpE,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,OAIxC;IACC,MAAM,EAAC,KAAK,EAAE,KAAK,EAAE,SAAS,EAAC,GAAG,OAAO,CAAC;IAC1C,MAAM,aAAa,GAAG,qBAAqB,CAAC,SAAS,CAAC,CAAC;IACvD,IAAI,CAAC,aAAa,IAAI,aAAa,CAAC,cAAc,KAAK,UAAU,EAAE,CAAC;QAClE,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,SAAS,GAAG,EAAC,GAAG,KAAK,EAAC,CAAC;IAE7B,KAAK,MAAM,CAAC,QAAQ,EAAE,SAAS,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9D,IACE,OAAO,SAAS,KAAK,QAAQ;YAC7B,CAAC,SAAS,CAAC,UAAU,CAAC,KAAK,CAAC;YAC5B,CAAC,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,EAC3B,CAAC;YACD,SAAS;QACX,CAAC;QAED,MAAM,UAAU,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACtC,IACE,aAAa,CAAC,mBAAmB,CAAC,QAAQ,CAAC,QAAQ,CAAC;YACpD,uBAAuB,CAAC,UAAU,CAAC,EACnC,CAAC;YACD,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC;YACjD,IAAI,MAAM,IAAI,0BAA0B,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,CAAC;gBAC3D,SAAS,CAAC,QAAQ,CAAC,GAAG,MAAM,CAAC;gBAC7B,SAAS;YACX,CAAC;QACH,CAAC;QAED,gFAAgF;QAChF,gFAAgF;QAChF,+EAA+E;QAC/E,wCAAwC;QACxC,SAAS,CAAC,QAAQ,CAAC,GAAG,uBAAuB,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;IACnE,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC","sourcesContent":["import * as arrow from 'apache-arrow';\nimport {compileGeoArrowAccessor} from './compileGeoArrowAccessor';\nimport {getLayerCompatibility} from './layerCompatibility';\n\nfunction isSimpleColumnReference(expression: string) {\n return /^[A-Za-z_$][\\w$]*$/.test(expression.trim());\n}\n\nfunction canUseDirectVectorAccessor(propName: string, vector: arrow.Vector) {\n // TODO(geoarrow-upgrade): This is intentionally conservative for published 0.3.x.\n // Direct numeric vectors (for example `getRadius`) currently end up in deck's\n // binary attribute path and trigger `Float64Array` initialization failures in the\n // GeoArrow scatterplot wrapper. Re-test which direct vector accessors are safe\n // after the next GeoArrow release and widen this gate if the runtime contract\n // improves.\n if (!propName.endsWith('Color')) {\n return false;\n }\n\n const firstChunk = vector.data[0];\n if (!firstChunk || !arrow.DataType.isFixedSizeList(firstChunk.type)) {\n return false;\n }\n\n return true;\n}\n\nexport function rewriteGeoArrowAccessors(options: {\n props: Record<string, unknown>;\n table: arrow.Table;\n layerName: string;\n}) {\n const {props, table, layerName} = options;\n const compatibility = getLayerCompatibility(layerName);\n if (!compatibility || compatibility.representation !== 'geoarrow') {\n return props;\n }\n\n const nextProps = {...props};\n\n for (const [propName, propValue] of Object.entries(nextProps)) {\n if (\n typeof propValue !== 'string' ||\n !propValue.startsWith('@@=') ||\n !propName.startsWith('get')\n ) {\n continue;\n }\n\n const expression = propValue.slice(3);\n if (\n compatibility.vectorAccessorProps.includes(propName) &&\n isSimpleColumnReference(expression)\n ) {\n const vector = table.getChild(expression.trim());\n if (vector && canUseDirectVectorAccessor(propName, vector)) {\n nextProps[propName] = vector;\n continue;\n }\n }\n\n // TODO(geoarrow-upgrade): This fallback exists because 0.3.x GeoArrow layers do\n // not share `@deck.gl/json`'s normal row accessor contract. If the next version\n // supports standard deck/json accessors, or offers native expression handling,\n // prefer that over our custom compiler.\n nextProps[propName] = compileGeoArrowAccessor(expression, table);\n }\n\n return nextProps;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"rewriteGeoArrowAccessors.js","sourceRoot":"","sources":["../../src/json/rewriteGeoArrowAccessors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AACtC,OAAO,EAAC,uBAAuB,EAAC,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAC,qBAAqB,EAAC,MAAM,sBAAsB,CAAC;AAE3D,SAAS,uBAAuB,CAAC,UAAkB;IACjD,OAAO,oBAAoB,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC;AACtD,CAAC;AAED,SAAS,0BAA0B,CAAC,QAAgB,EAAE,MAAoB;IACxE,kFAAkF;IAClF,8EAA8E;IAC9E,kFAAkF;IAClF,+EAA+E;IAC/E,8EAA8E;IAC9E,YAAY;IACZ,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAChC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClC,IAAI,CAAC,UAAU,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,eAAe,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACpE,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,OAIxC;IACC,MAAM,EAAC,KAAK,EAAE,KAAK,EAAE,SAAS,EAAC,GAAG,OAAO,CAAC;IAC1C,MAAM,aAAa,GAAG,qBAAqB,CAAC,SAAS,CAAC,CAAC;IACvD,IAAI,CAAC,aAAa,IAAI,aAAa,CAAC,cAAc,KAAK,UAAU,EAAE,CAAC;QAClE,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,SAAS,GAAG,EAAC,GAAG,KAAK,EAAC,CAAC;IAE7B,KAAK,MAAM,CAAC,QAAQ,EAAE,SAAS,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9D,IACE,OAAO,SAAS,KAAK,QAAQ;YAC7B,CAAC,SAAS,CAAC,UAAU,CAAC,KAAK,CAAC;YAC5B,CAAC,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,EAC3B,CAAC;YACD,SAAS;QACX,CAAC;QAED,MAAM,UAAU,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACtC,IACE,aAAa,CAAC,mBAAmB,CAAC,QAAQ,CAAC,QAAQ,CAAC;YACpD,uBAAuB,CAAC,UAAU,CAAC,EACnC,CAAC;YACD,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC;YACjD,IAAI,MAAM,IAAI,0BAA0B,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,CAAC;gBAC3D,SAAS,CAAC,QAAQ,CAAC,GAAG,MAAM,CAAC;gBAC7B,SAAS;YACX,CAAC;YACD,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,OAAO,CAAC,IAAI,CACV,WAAW,UAAU,CAAC,IAAI,EAAE,wCAAwC,QAAQ,uBAAuB,CACpG,CAAC;gBACF,OAAO,SAAS,CAAC,QAAQ,CAAC,CAAC;gBAC3B,SAAS;YACX,CAAC;QACH,CAAC;QAED,gFAAgF;QAChF,gFAAgF;QAChF,+EAA+E;QAC/E,wCAAwC;QACxC,SAAS,CAAC,QAAQ,CAAC,GAAG,uBAAuB,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;IACnE,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC","sourcesContent":["import * as arrow from 'apache-arrow';\nimport {compileGeoArrowAccessor} from './compileGeoArrowAccessor';\nimport {getLayerCompatibility} from './layerCompatibility';\n\nfunction isSimpleColumnReference(expression: string) {\n return /^[A-Za-z_$][\\w$]*$/.test(expression.trim());\n}\n\nfunction canUseDirectVectorAccessor(propName: string, vector: arrow.Vector) {\n // TODO(geoarrow-upgrade): This is intentionally conservative for published 0.3.x.\n // Direct numeric vectors (for example `getRadius`) currently end up in deck's\n // binary attribute path and trigger `Float64Array` initialization failures in the\n // GeoArrow scatterplot wrapper. Re-test which direct vector accessors are safe\n // after the next GeoArrow release and widen this gate if the runtime contract\n // improves.\n if (!propName.endsWith('Color')) {\n return false;\n }\n\n const firstChunk = vector.data[0];\n if (!firstChunk || !arrow.DataType.isFixedSizeList(firstChunk.type)) {\n return false;\n }\n\n return true;\n}\n\nexport function rewriteGeoArrowAccessors(options: {\n props: Record<string, unknown>;\n table: arrow.Table;\n layerName: string;\n}) {\n const {props, table, layerName} = options;\n const compatibility = getLayerCompatibility(layerName);\n if (!compatibility || compatibility.representation !== 'geoarrow') {\n return props;\n }\n\n const nextProps = {...props};\n\n for (const [propName, propValue] of Object.entries(nextProps)) {\n if (\n typeof propValue !== 'string' ||\n !propValue.startsWith('@@=') ||\n !propName.startsWith('get')\n ) {\n continue;\n }\n\n const expression = propValue.slice(3);\n if (\n compatibility.vectorAccessorProps.includes(propName) &&\n isSimpleColumnReference(expression)\n ) {\n const vector = table.getChild(expression.trim());\n if (vector && canUseDirectVectorAccessor(propName, vector)) {\n nextProps[propName] = vector;\n continue;\n }\n if (!vector) {\n console.warn(\n `Column \"${expression.trim()}\" not found in dataset for accessor \"${propName}\". Skipping accessor.`,\n );\n delete nextProps[propName];\n continue;\n }\n }\n\n // TODO(geoarrow-upgrade): This fallback exists because 0.3.x GeoArrow layers do\n // not share `@deck.gl/json`'s normal row accessor contract. If the next version\n // supports standard deck/json accessors, or offers native expression handling,\n // prefer that over our custom compiler.\n nextProps[propName] = compileGeoArrowAccessor(expression, table);\n }\n\n return nextProps;\n}\n"]}
|
package/dist/mapConfigUtils.d.ts
CHANGED
|
@@ -58,5 +58,106 @@ export declare function createDeckMapDashboardPanelConfigForTable(options: {
|
|
|
58
58
|
fillColor?: DeckMapFillColor;
|
|
59
59
|
mapStyle?: string;
|
|
60
60
|
}): any;
|
|
61
|
-
export declare function regenerateMapConfigForTable(panel: MosaicDashboardPanelConfigType, table: DataTable, longitudeColumn?: string, latitudeColumn?: string):
|
|
61
|
+
export declare function regenerateMapConfigForTable(panel: MosaicDashboardPanelConfigType, table: DataTable, longitudeColumn?: string, latitudeColumn?: string): Record<string, unknown> | {
|
|
62
|
+
chartType: "histogram";
|
|
63
|
+
settings: {
|
|
64
|
+
field?: string | undefined;
|
|
65
|
+
maxBins?: number | undefined;
|
|
66
|
+
color?: string | undefined;
|
|
67
|
+
};
|
|
68
|
+
settingsOpen?: boolean | undefined;
|
|
69
|
+
dataPolicy?: {
|
|
70
|
+
disabled?: boolean | undefined;
|
|
71
|
+
maxRows?: number | undefined;
|
|
72
|
+
reason?: string | undefined;
|
|
73
|
+
} | undefined;
|
|
74
|
+
} | {
|
|
75
|
+
chartType: "count-plot";
|
|
76
|
+
settings: {
|
|
77
|
+
field?: string | undefined;
|
|
78
|
+
};
|
|
79
|
+
settingsOpen?: boolean | undefined;
|
|
80
|
+
dataPolicy?: {
|
|
81
|
+
disabled?: boolean | undefined;
|
|
82
|
+
maxRows?: number | undefined;
|
|
83
|
+
reason?: string | undefined;
|
|
84
|
+
} | undefined;
|
|
85
|
+
} | {
|
|
86
|
+
chartType: "line-chart";
|
|
87
|
+
settings: {
|
|
88
|
+
showLegend: boolean;
|
|
89
|
+
x?: string | undefined;
|
|
90
|
+
xInterval?: "month" | "week" | "second" | "minute" | "hour" | "day" | "quarter" | "year" | undefined;
|
|
91
|
+
yFields?: {
|
|
92
|
+
field: string;
|
|
93
|
+
aggregate: "min" | "max" | "sum" | "avg";
|
|
94
|
+
color?: string | undefined;
|
|
95
|
+
}[] | undefined;
|
|
96
|
+
};
|
|
97
|
+
settingsOpen?: boolean | undefined;
|
|
98
|
+
dataPolicy?: {
|
|
99
|
+
disabled?: boolean | undefined;
|
|
100
|
+
maxRows?: number | undefined;
|
|
101
|
+
reason?: string | undefined;
|
|
102
|
+
} | undefined;
|
|
103
|
+
} | {
|
|
104
|
+
chartType: "scatter-plot";
|
|
105
|
+
settings: {
|
|
106
|
+
x?: string | undefined;
|
|
107
|
+
y?: string | undefined;
|
|
108
|
+
size?: string | undefined;
|
|
109
|
+
};
|
|
110
|
+
settingsOpen?: boolean | undefined;
|
|
111
|
+
dataPolicy?: {
|
|
112
|
+
disabled?: boolean | undefined;
|
|
113
|
+
maxRows?: number | undefined;
|
|
114
|
+
reason?: string | undefined;
|
|
115
|
+
} | undefined;
|
|
116
|
+
} | {
|
|
117
|
+
chartType: "heatmap";
|
|
118
|
+
settings: {
|
|
119
|
+
x?: string | undefined;
|
|
120
|
+
y?: string | undefined;
|
|
121
|
+
};
|
|
122
|
+
settingsOpen?: boolean | undefined;
|
|
123
|
+
dataPolicy?: {
|
|
124
|
+
disabled?: boolean | undefined;
|
|
125
|
+
maxRows?: number | undefined;
|
|
126
|
+
reason?: string | undefined;
|
|
127
|
+
} | undefined;
|
|
128
|
+
} | {
|
|
129
|
+
chartType: "box-plot";
|
|
130
|
+
settings: {
|
|
131
|
+
x?: string | undefined;
|
|
132
|
+
y?: string | undefined;
|
|
133
|
+
};
|
|
134
|
+
settingsOpen?: boolean | undefined;
|
|
135
|
+
dataPolicy?: {
|
|
136
|
+
disabled?: boolean | undefined;
|
|
137
|
+
maxRows?: number | undefined;
|
|
138
|
+
reason?: string | undefined;
|
|
139
|
+
} | undefined;
|
|
140
|
+
} | {
|
|
141
|
+
chartType: "custom-spec";
|
|
142
|
+
settings: {
|
|
143
|
+
vgPlotSpec?: unknown;
|
|
144
|
+
};
|
|
145
|
+
settingsOpen?: boolean | undefined;
|
|
146
|
+
dataPolicy?: {
|
|
147
|
+
disabled?: boolean | undefined;
|
|
148
|
+
maxRows?: number | undefined;
|
|
149
|
+
reason?: string | undefined;
|
|
150
|
+
} | undefined;
|
|
151
|
+
} | {
|
|
152
|
+
chartType: string;
|
|
153
|
+
settings: Record<string, unknown>;
|
|
154
|
+
settingsOpen?: boolean | undefined;
|
|
155
|
+
dataPolicy?: {
|
|
156
|
+
disabled?: boolean | undefined;
|
|
157
|
+
maxRows?: number | undefined;
|
|
158
|
+
reason?: string | undefined;
|
|
159
|
+
} | undefined;
|
|
160
|
+
} | {
|
|
161
|
+
pageSize?: number | undefined;
|
|
162
|
+
};
|
|
62
163
|
//# sourceMappingURL=mapConfigUtils.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mapConfigUtils.d.ts","sourceRoot":"","sources":["../src/mapConfigUtils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,8BAA8B,EAAC,MAAM,kBAAkB,CAAC;AACrE,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAEL,KAAK,2BAA2B,EACjC,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAC,oBAAoB,EAAC,MAAM,iBAAiB,CAAC;AAQ1D,MAAM,MAAM,mBAAmB,GAAG;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAC,CAAC;AAChE,MAAM,MAAM,qBAAqB,GAC7B,MAAM,GACN;IACE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AACN,MAAM,MAAM,gBAAgB,GACxB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GACxB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AAWrC,wBAAgB,mCAAmC,CACjD,OAAO,CAAC,EAAE,mBAAmB,EAAE;;;SAQhC;AAED,wBAAgB,4BAA4B,CAAC,KAAK,CAAC,EAAE,SAAS;;;SAG7D;AAwBD,wBAAgB,yBAAyB,CAAC,OAAO,CAAC,EAAE,mBAAmB,EAAE;;;SAkBxE;AAED,wBAAgB,kBAAkB,CAAC,KAAK,CAAC,EAAE,SAAS;;;SAGnD;AAED,wBAAgB,yBAAyB,CAAC,UAAU,EAAE,MAAM,UAE3D;AAED,wBAAgB,6BAA6B,CAC3C,cAAc,EAAE,qBAAqB,UAYtC;AAuED,wBAAgB,yBAAyB,CACvC,SAAS,CAAC,EAAE,MAAM,EAAE,GACnB,gBAAgB,CAQlB;AAED,wBAAgB,oCAAoC,CAAC,OAAO,EAAE;IAC5D,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,mBAAmB,EAAE,CAAC;IAC/B,cAAc,CAAC,EAAE,qBAAqB,CAAC;IACvC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;IAC5C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,gBAAgB,CAAC;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GAAG,2BAA2B,
|
|
1
|
+
{"version":3,"file":"mapConfigUtils.d.ts","sourceRoot":"","sources":["../src/mapConfigUtils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,8BAA8B,EAAC,MAAM,kBAAkB,CAAC;AACrE,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAEL,KAAK,2BAA2B,EACjC,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAC,oBAAoB,EAAC,MAAM,iBAAiB,CAAC;AAQ1D,MAAM,MAAM,mBAAmB,GAAG;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAC,CAAC;AAChE,MAAM,MAAM,qBAAqB,GAC7B,MAAM,GACN;IACE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AACN,MAAM,MAAM,gBAAgB,GACxB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GACxB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AAWrC,wBAAgB,mCAAmC,CACjD,OAAO,CAAC,EAAE,mBAAmB,EAAE;;;SAQhC;AAED,wBAAgB,4BAA4B,CAAC,KAAK,CAAC,EAAE,SAAS;;;SAG7D;AAwBD,wBAAgB,yBAAyB,CAAC,OAAO,CAAC,EAAE,mBAAmB,EAAE;;;SAkBxE;AAED,wBAAgB,kBAAkB,CAAC,KAAK,CAAC,EAAE,SAAS;;;SAGnD;AAED,wBAAgB,yBAAyB,CAAC,UAAU,EAAE,MAAM,UAE3D;AAED,wBAAgB,6BAA6B,CAC3C,cAAc,EAAE,qBAAqB,UAYtC;AAuED,wBAAgB,yBAAyB,CACvC,SAAS,CAAC,EAAE,MAAM,EAAE,GACnB,gBAAgB,CAQlB;AAED,wBAAgB,oCAAoC,CAAC,OAAO,EAAE;IAC5D,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,mBAAmB,EAAE,CAAC;IAC/B,cAAc,CAAC,EAAE,qBAAqB,CAAC;IACvC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;IAC5C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,gBAAgB,CAAC;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GAAG,2BAA2B,CAyG9B;AAED,wBAAgB,yCAAyC,CAAC,OAAO,EAAE;IACjE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,mBAAmB,EAAE,CAAC;IAC/B,cAAc,CAAC,EAAE,qBAAqB,CAAC;IACvC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;IAC5C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,gBAAgB,CAAC;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,OAKA;AAED,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,8BAA8B,EACrC,KAAK,EAAE,SAAS,EAChB,eAAe,CAAC,EAAE,MAAM,EACxB,cAAc,CAAC,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2BxB"}
|
package/dist/mapConfigUtils.js
CHANGED
|
@@ -174,7 +174,12 @@ export function createDeckMapDashboardConfigForTable(options) {
|
|
|
174
174
|
? 'GeoArrowScatterplotLayer'
|
|
175
175
|
: 'GeoArrowPolygonLayer',
|
|
176
176
|
id: datasetId,
|
|
177
|
-
_sqlroomsBinding: {
|
|
177
|
+
_sqlroomsBinding: {
|
|
178
|
+
dataset: datasetId,
|
|
179
|
+
...(detectedGeometryColumn
|
|
180
|
+
? { geometryColumn: detectedGeometryColumn.geometryColumn }
|
|
181
|
+
: {}),
|
|
182
|
+
},
|
|
178
183
|
filled: true,
|
|
179
184
|
stroked: false,
|
|
180
185
|
pickable: true,
|
|
@@ -201,7 +206,16 @@ export function createDeckMapDashboardConfigForTable(options) {
|
|
|
201
206
|
maxZoom: 12,
|
|
202
207
|
},
|
|
203
208
|
}
|
|
204
|
-
:
|
|
209
|
+
: detectedGeometryColumn
|
|
210
|
+
? {
|
|
211
|
+
fitToData: {
|
|
212
|
+
dataset: datasetId,
|
|
213
|
+
geometryColumn: detectedGeometryColumn.geometryColumn,
|
|
214
|
+
padding: 40,
|
|
215
|
+
maxZoom: 12,
|
|
216
|
+
},
|
|
217
|
+
}
|
|
218
|
+
: {}),
|
|
205
219
|
...(options.mapStyle ? { mapStyle: options.mapStyle } : {}),
|
|
206
220
|
};
|
|
207
221
|
}
|
|
@@ -225,9 +239,13 @@ export function regenerateMapConfigForTable(panel, table, longitudeColumn, latit
|
|
|
225
239
|
longitudeColumn,
|
|
226
240
|
latitudeColumn,
|
|
227
241
|
});
|
|
242
|
+
// Preserve existing layer spec (layer types, styling, bindings) — only
|
|
243
|
+
// update the dataset source and fitToData so the data re-fetches with the
|
|
244
|
+
// new coordinate columns.
|
|
228
245
|
return {
|
|
229
246
|
...existingConfig,
|
|
230
|
-
|
|
247
|
+
datasets: nextConfig.datasets,
|
|
248
|
+
fitToData: nextConfig.fitToData ?? existingConfig.fitToData,
|
|
231
249
|
};
|
|
232
250
|
}
|
|
233
251
|
//# sourceMappingURL=mapConfigUtils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mapConfigUtils.js","sourceRoot":"","sources":["../src/mapConfigUtils.ts"],"names":[],"mappings":"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","sourcesContent":["import type {MosaicDashboardPanelConfigType} from '@sqlrooms/mosaic';\nimport type {DataTable} from '@sqlrooms/duckdb';\nimport {\n createDeckMapDashboardPanelConfig,\n type DeckMapDashboardPanelConfig,\n} from './dashboardConfig';\nimport type {GeometryEncodingHint} from './prepare/types';\n\nconst LONGITUDE_COLUMN_NAMES = ['longitude', 'lon', 'lng', 'long', 'x'];\nconst LATITUDE_COLUMN_NAMES = ['latitude', 'lat', 'y'];\nconst GEOMETRY_COLUMN_NAMES = ['geometry', 'geom'];\nconst DEFAULT_GEOMETRY_COLUMN = '__sqlrooms_geom';\nconst DEFAULT_FILL_COLOR = [56, 189, 248, 180] as const;\n\nexport type DeckMapConfigColumn = {name: string; type?: string};\nexport type DeckMapTableReference =\n | string\n | {\n database?: string;\n schema?: string;\n table?: string;\n };\nexport type DeckMapFillColor =\n | [number, number, number]\n | [number, number, number, number];\n\nfunction findColumnByName(\n columns: DeckMapConfigColumn[],\n candidates: string[],\n) {\n const candidateSet = new Set(candidates);\n return columns.find((column) => candidateSet.has(column.name.toLowerCase()))\n ?.name;\n}\n\nexport function findDeckMapLongitudeLatitudeColumns(\n columns?: DeckMapConfigColumn[],\n) {\n if (!columns) return null;\n const longitudeColumn = findColumnByName(columns, LONGITUDE_COLUMN_NAMES);\n const latitudeColumn = findColumnByName(columns, LATITUDE_COLUMN_NAMES);\n return longitudeColumn && latitudeColumn\n ? {longitudeColumn, latitudeColumn}\n : null;\n}\n\nexport function findLongitudeLatitudeColumns(table?: DataTable) {\n if (!table) return null;\n return findDeckMapLongitudeLatitudeColumns(table.columns);\n}\n\nfunction inferGeometryEncodingHint(\n column: DeckMapConfigColumn,\n): GeometryEncodingHint | undefined {\n const type = column.type?.toLowerCase();\n if (!type) return undefined;\n if (\n type.includes('wkb') ||\n type.includes('blob') ||\n type.includes('binary')\n ) {\n return 'wkb';\n }\n if (\n type.includes('wkt') ||\n type.includes('varchar') ||\n type.includes('text')\n ) {\n return 'wkt';\n }\n return undefined;\n}\n\nexport function findDeckMapGeometryColumn(columns?: DeckMapConfigColumn[]) {\n if (!columns) return null;\n\n const namedGeometryColumn = findColumnByName(columns, GEOMETRY_COLUMN_NAMES);\n const geometryColumn =\n (namedGeometryColumn\n ? columns.find((column) => column.name === namedGeometryColumn)\n : undefined) ??\n columns.find((column) => {\n const type = column.type?.toLowerCase() ?? '';\n return type.includes('geometry') || type.includes('geoarrow');\n });\n\n if (!geometryColumn) return null;\n return {\n geometryColumn: geometryColumn.name,\n geometryEncodingHint: inferGeometryEncodingHint(geometryColumn),\n };\n}\n\nexport function findGeometryColumn(table?: DataTable) {\n if (!table) return null;\n return findDeckMapGeometryColumn(table.columns);\n}\n\nexport function quoteDeckMapSqlIdentifier(identifier: string) {\n return `\"${identifier.replace(/\"/g, '\"\"')}\"`;\n}\n\nexport function quoteDeckMapSqlTableReference(\n tableReference: DeckMapTableReference,\n) {\n if (typeof tableReference === 'string') {\n return tableReference\n .split('.')\n .map((part) => quoteDeckMapSqlIdentifier(part))\n .join('.');\n }\n return [tableReference.database, tableReference.schema, tableReference.table]\n .filter((part): part is string => Boolean(part))\n .map(quoteDeckMapSqlIdentifier)\n .join('.');\n}\n\nfunction ensureDeckMapColumnExists(\n columns: DeckMapConfigColumn[],\n columnName: string,\n role: string,\n) {\n if (!columns.some((column) => column.name === columnName)) {\n throw new Error(\n `Unknown ${role} column \"${columnName}\". Available columns: ${columns\n .map((column) => column.name)\n .join(', ')}.`,\n );\n }\n}\n\nfunction resolveDeckMapCoordinateColumns(options: {\n columns: DeckMapConfigColumn[];\n longitudeColumn?: string;\n latitudeColumn?: string;\n}) {\n const coordinates =\n options.longitudeColumn && options.latitudeColumn\n ? {\n longitudeColumn: options.longitudeColumn,\n latitudeColumn: options.latitudeColumn,\n }\n : findDeckMapLongitudeLatitudeColumns(options.columns);\n\n if (!coordinates) {\n throw new Error(\n 'Could not find longitude/latitude columns. Pass longitudeColumn and latitudeColumn explicitly, or provide geometryColumn.',\n );\n }\n\n ensureDeckMapColumnExists(\n options.columns,\n coordinates.longitudeColumn,\n 'longitude',\n );\n ensureDeckMapColumnExists(\n options.columns,\n coordinates.latitudeColumn,\n 'latitude',\n );\n return coordinates;\n}\n\nfunction createDeckMapPointSourceSql(options: {\n sourceSqlQuery?: string;\n tableReference: DeckMapTableReference;\n longitudeColumn: string;\n latitudeColumn: string;\n geometryColumn: string;\n}) {\n const quotedLongitude = quoteDeckMapSqlIdentifier(options.longitudeColumn);\n const quotedLatitude = quoteDeckMapSqlIdentifier(options.latitudeColumn);\n const cleanedSourceSqlQuery = options.sourceSqlQuery\n ?.trim()\n .replace(/(?:\\s*;+\\s*)+$/, '');\n const baseSource = cleanedSourceSqlQuery\n ? `(${cleanedSourceSqlQuery}) AS \"__sqlrooms_dashboard_map_source\"`\n : quoteDeckMapSqlTableReference(options.tableReference);\n\n return [\n `SELECT *, ST_AsWKB(ST_Point(${quotedLongitude}, ${quotedLatitude})) AS ${quoteDeckMapSqlIdentifier(options.geometryColumn)}`,\n `FROM ${baseSource}`,\n `WHERE ${quotedLongitude} IS NOT NULL AND ${quotedLatitude} IS NOT NULL`,\n ].join(' ');\n}\n\nexport function normalizeDeckMapFillColor(\n fillColor?: number[],\n): DeckMapFillColor {\n if (fillColor?.length === 3) {\n return [fillColor[0]!, fillColor[1]!, fillColor[2]!];\n }\n if (fillColor?.length === 4) {\n return [fillColor[0]!, fillColor[1]!, fillColor[2]!, fillColor[3]!];\n }\n return [...DEFAULT_FILL_COLOR];\n}\n\nexport function createDeckMapDashboardConfigForTable(options: {\n tableName: string;\n columns: DeckMapConfigColumn[];\n tableReference?: DeckMapTableReference;\n sourceSqlQuery?: string;\n longitudeColumn?: string;\n latitudeColumn?: string;\n geometryColumn?: string;\n geometryEncodingHint?: GeometryEncodingHint;\n pointRadius?: number;\n fillColor?: DeckMapFillColor;\n mapStyle?: string;\n}): DeckMapDashboardPanelConfig {\n const datasetId = options.tableName;\n const explicitGeometryColumn = options.geometryColumn?.trim() || undefined;\n const detectedCoordinates =\n options.longitudeColumn && options.latitudeColumn\n ? {\n longitudeColumn: options.longitudeColumn,\n latitudeColumn: options.latitudeColumn,\n }\n : findDeckMapLongitudeLatitudeColumns(options.columns);\n const detectedGeometryColumn = explicitGeometryColumn\n ? {\n geometryColumn: explicitGeometryColumn,\n geometryEncodingHint: options.geometryEncodingHint,\n }\n : detectedCoordinates\n ? null\n : findDeckMapGeometryColumn(options.columns);\n const coordinates = detectedGeometryColumn\n ? undefined\n : resolveDeckMapCoordinateColumns({\n columns: options.columns,\n longitudeColumn: options.longitudeColumn,\n latitudeColumn: options.latitudeColumn,\n });\n const geometryColumn =\n detectedGeometryColumn?.geometryColumn ?? DEFAULT_GEOMETRY_COLUMN;\n const geometryEncodingHint =\n options.geometryEncodingHint ??\n detectedGeometryColumn?.geometryEncodingHint;\n const source = coordinates\n ? {\n sqlQuery: createDeckMapPointSourceSql({\n sourceSqlQuery: options.sourceSqlQuery,\n tableReference: options.tableReference ?? options.tableName,\n longitudeColumn: coordinates.longitudeColumn,\n latitudeColumn: coordinates.latitudeColumn,\n geometryColumn,\n }),\n }\n : options.sourceSqlQuery\n ? {sqlQuery: options.sourceSqlQuery}\n : {tableName: options.tableName};\n\n if (detectedGeometryColumn) {\n ensureDeckMapColumnExists(\n options.columns,\n detectedGeometryColumn.geometryColumn,\n 'geometry',\n );\n }\n\n return {\n spec: {\n initialViewState: {longitude: 0, latitude: 20, zoom: 1.5},\n layers: [\n {\n '@@type': coordinates\n ? 'GeoArrowScatterplotLayer'\n : 'GeoArrowPolygonLayer',\n id: datasetId,\n _sqlroomsBinding: {dataset: datasetId},\n filled: true,\n stroked: false,\n pickable: true,\n radiusUnits: 'pixels',\n getRadius: options.pointRadius ?? 4,\n getFillColor: options.fillColor ?? [...DEFAULT_FILL_COLOR],\n },\n ],\n },\n datasets: {\n [datasetId]: {\n source,\n geometryColumn,\n geometryEncodingHint: coordinates ? 'wkb' : geometryEncodingHint,\n },\n },\n ...(coordinates\n ? {\n fitToData: {\n dataset: datasetId,\n longitudeColumn: coordinates.longitudeColumn,\n latitudeColumn: coordinates.latitudeColumn,\n padding: 40,\n maxZoom: 12,\n },\n }\n : {}),\n ...(options.mapStyle ? {mapStyle: options.mapStyle} : {}),\n };\n}\n\nexport function createDeckMapDashboardPanelConfigForTable(options: {\n title?: string;\n tableName: string;\n columns: DeckMapConfigColumn[];\n tableReference?: DeckMapTableReference;\n sourceSqlQuery?: string;\n longitudeColumn?: string;\n latitudeColumn?: string;\n geometryColumn?: string;\n geometryEncodingHint?: GeometryEncodingHint;\n pointRadius?: number;\n fillColor?: DeckMapFillColor;\n mapStyle?: string;\n}) {\n return createDeckMapDashboardPanelConfig({\n title: options.title,\n ...createDeckMapDashboardConfigForTable(options),\n });\n}\n\nexport function regenerateMapConfigForTable(\n panel: MosaicDashboardPanelConfigType,\n table: DataTable,\n longitudeColumn?: string,\n latitudeColumn?: string,\n) {\n if (\n !(longitudeColumn && latitudeColumn) &&\n !findLongitudeLatitudeColumns(table) &&\n !findGeometryColumn(table)\n ) {\n return panel.config;\n }\n\n const existingConfig = panel.config as any;\n const nextConfig = createDeckMapDashboardConfigForTable({\n tableName: table.tableName,\n columns: table.columns,\n tableReference: table.table,\n longitudeColumn,\n latitudeColumn,\n });\n\n return {\n ...existingConfig,\n ...nextConfig,\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"mapConfigUtils.js","sourceRoot":"","sources":["../src/mapConfigUtils.ts"],"names":[],"mappings":"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","sourcesContent":["import type {MosaicDashboardPanelConfigType} from '@sqlrooms/mosaic';\nimport type {DataTable} from '@sqlrooms/duckdb';\nimport {\n createDeckMapDashboardPanelConfig,\n type DeckMapDashboardPanelConfig,\n} from './dashboardConfig';\nimport type {GeometryEncodingHint} from './prepare/types';\n\nconst LONGITUDE_COLUMN_NAMES = ['longitude', 'lon', 'lng', 'long', 'x'];\nconst LATITUDE_COLUMN_NAMES = ['latitude', 'lat', 'y'];\nconst GEOMETRY_COLUMN_NAMES = ['geometry', 'geom'];\nconst DEFAULT_GEOMETRY_COLUMN = '__sqlrooms_geom';\nconst DEFAULT_FILL_COLOR = [56, 189, 248, 180] as const;\n\nexport type DeckMapConfigColumn = {name: string; type?: string};\nexport type DeckMapTableReference =\n | string\n | {\n database?: string;\n schema?: string;\n table?: string;\n };\nexport type DeckMapFillColor =\n | [number, number, number]\n | [number, number, number, number];\n\nfunction findColumnByName(\n columns: DeckMapConfigColumn[],\n candidates: string[],\n) {\n const candidateSet = new Set(candidates);\n return columns.find((column) => candidateSet.has(column.name.toLowerCase()))\n ?.name;\n}\n\nexport function findDeckMapLongitudeLatitudeColumns(\n columns?: DeckMapConfigColumn[],\n) {\n if (!columns) return null;\n const longitudeColumn = findColumnByName(columns, LONGITUDE_COLUMN_NAMES);\n const latitudeColumn = findColumnByName(columns, LATITUDE_COLUMN_NAMES);\n return longitudeColumn && latitudeColumn\n ? {longitudeColumn, latitudeColumn}\n : null;\n}\n\nexport function findLongitudeLatitudeColumns(table?: DataTable) {\n if (!table) return null;\n return findDeckMapLongitudeLatitudeColumns(table.columns);\n}\n\nfunction inferGeometryEncodingHint(\n column: DeckMapConfigColumn,\n): GeometryEncodingHint | undefined {\n const type = column.type?.toLowerCase();\n if (!type) return undefined;\n if (\n type.includes('wkb') ||\n type.includes('blob') ||\n type.includes('binary')\n ) {\n return 'wkb';\n }\n if (\n type.includes('wkt') ||\n type.includes('varchar') ||\n type.includes('text')\n ) {\n return 'wkt';\n }\n return undefined;\n}\n\nexport function findDeckMapGeometryColumn(columns?: DeckMapConfigColumn[]) {\n if (!columns) return null;\n\n const namedGeometryColumn = findColumnByName(columns, GEOMETRY_COLUMN_NAMES);\n const geometryColumn =\n (namedGeometryColumn\n ? columns.find((column) => column.name === namedGeometryColumn)\n : undefined) ??\n columns.find((column) => {\n const type = column.type?.toLowerCase() ?? '';\n return type.includes('geometry') || type.includes('geoarrow');\n });\n\n if (!geometryColumn) return null;\n return {\n geometryColumn: geometryColumn.name,\n geometryEncodingHint: inferGeometryEncodingHint(geometryColumn),\n };\n}\n\nexport function findGeometryColumn(table?: DataTable) {\n if (!table) return null;\n return findDeckMapGeometryColumn(table.columns);\n}\n\nexport function quoteDeckMapSqlIdentifier(identifier: string) {\n return `\"${identifier.replace(/\"/g, '\"\"')}\"`;\n}\n\nexport function quoteDeckMapSqlTableReference(\n tableReference: DeckMapTableReference,\n) {\n if (typeof tableReference === 'string') {\n return tableReference\n .split('.')\n .map((part) => quoteDeckMapSqlIdentifier(part))\n .join('.');\n }\n return [tableReference.database, tableReference.schema, tableReference.table]\n .filter((part): part is string => Boolean(part))\n .map(quoteDeckMapSqlIdentifier)\n .join('.');\n}\n\nfunction ensureDeckMapColumnExists(\n columns: DeckMapConfigColumn[],\n columnName: string,\n role: string,\n) {\n if (!columns.some((column) => column.name === columnName)) {\n throw new Error(\n `Unknown ${role} column \"${columnName}\". Available columns: ${columns\n .map((column) => column.name)\n .join(', ')}.`,\n );\n }\n}\n\nfunction resolveDeckMapCoordinateColumns(options: {\n columns: DeckMapConfigColumn[];\n longitudeColumn?: string;\n latitudeColumn?: string;\n}) {\n const coordinates =\n options.longitudeColumn && options.latitudeColumn\n ? {\n longitudeColumn: options.longitudeColumn,\n latitudeColumn: options.latitudeColumn,\n }\n : findDeckMapLongitudeLatitudeColumns(options.columns);\n\n if (!coordinates) {\n throw new Error(\n 'Could not find longitude/latitude columns. Pass longitudeColumn and latitudeColumn explicitly, or provide geometryColumn.',\n );\n }\n\n ensureDeckMapColumnExists(\n options.columns,\n coordinates.longitudeColumn,\n 'longitude',\n );\n ensureDeckMapColumnExists(\n options.columns,\n coordinates.latitudeColumn,\n 'latitude',\n );\n return coordinates;\n}\n\nfunction createDeckMapPointSourceSql(options: {\n sourceSqlQuery?: string;\n tableReference: DeckMapTableReference;\n longitudeColumn: string;\n latitudeColumn: string;\n geometryColumn: string;\n}) {\n const quotedLongitude = quoteDeckMapSqlIdentifier(options.longitudeColumn);\n const quotedLatitude = quoteDeckMapSqlIdentifier(options.latitudeColumn);\n const cleanedSourceSqlQuery = options.sourceSqlQuery\n ?.trim()\n .replace(/(?:\\s*;+\\s*)+$/, '');\n const baseSource = cleanedSourceSqlQuery\n ? `(${cleanedSourceSqlQuery}) AS \"__sqlrooms_dashboard_map_source\"`\n : quoteDeckMapSqlTableReference(options.tableReference);\n\n return [\n `SELECT *, ST_AsWKB(ST_Point(${quotedLongitude}, ${quotedLatitude})) AS ${quoteDeckMapSqlIdentifier(options.geometryColumn)}`,\n `FROM ${baseSource}`,\n `WHERE ${quotedLongitude} IS NOT NULL AND ${quotedLatitude} IS NOT NULL`,\n ].join(' ');\n}\n\nexport function normalizeDeckMapFillColor(\n fillColor?: number[],\n): DeckMapFillColor {\n if (fillColor?.length === 3) {\n return [fillColor[0]!, fillColor[1]!, fillColor[2]!];\n }\n if (fillColor?.length === 4) {\n return [fillColor[0]!, fillColor[1]!, fillColor[2]!, fillColor[3]!];\n }\n return [...DEFAULT_FILL_COLOR];\n}\n\nexport function createDeckMapDashboardConfigForTable(options: {\n tableName: string;\n columns: DeckMapConfigColumn[];\n tableReference?: DeckMapTableReference;\n sourceSqlQuery?: string;\n longitudeColumn?: string;\n latitudeColumn?: string;\n geometryColumn?: string;\n geometryEncodingHint?: GeometryEncodingHint;\n pointRadius?: number;\n fillColor?: DeckMapFillColor;\n mapStyle?: string;\n}): DeckMapDashboardPanelConfig {\n const datasetId = options.tableName;\n const explicitGeometryColumn = options.geometryColumn?.trim() || undefined;\n const detectedCoordinates =\n options.longitudeColumn && options.latitudeColumn\n ? {\n longitudeColumn: options.longitudeColumn,\n latitudeColumn: options.latitudeColumn,\n }\n : findDeckMapLongitudeLatitudeColumns(options.columns);\n const detectedGeometryColumn = explicitGeometryColumn\n ? {\n geometryColumn: explicitGeometryColumn,\n geometryEncodingHint: options.geometryEncodingHint,\n }\n : detectedCoordinates\n ? null\n : findDeckMapGeometryColumn(options.columns);\n const coordinates = detectedGeometryColumn\n ? undefined\n : resolveDeckMapCoordinateColumns({\n columns: options.columns,\n longitudeColumn: options.longitudeColumn,\n latitudeColumn: options.latitudeColumn,\n });\n const geometryColumn =\n detectedGeometryColumn?.geometryColumn ?? DEFAULT_GEOMETRY_COLUMN;\n const geometryEncodingHint =\n options.geometryEncodingHint ??\n detectedGeometryColumn?.geometryEncodingHint;\n const source = coordinates\n ? {\n sqlQuery: createDeckMapPointSourceSql({\n sourceSqlQuery: options.sourceSqlQuery,\n tableReference: options.tableReference ?? options.tableName,\n longitudeColumn: coordinates.longitudeColumn,\n latitudeColumn: coordinates.latitudeColumn,\n geometryColumn,\n }),\n }\n : options.sourceSqlQuery\n ? {sqlQuery: options.sourceSqlQuery}\n : {tableName: options.tableName};\n\n if (detectedGeometryColumn) {\n ensureDeckMapColumnExists(\n options.columns,\n detectedGeometryColumn.geometryColumn,\n 'geometry',\n );\n }\n\n return {\n spec: {\n initialViewState: {longitude: 0, latitude: 20, zoom: 1.5},\n layers: [\n {\n '@@type': coordinates\n ? 'GeoArrowScatterplotLayer'\n : 'GeoArrowPolygonLayer',\n id: datasetId,\n _sqlroomsBinding: {\n dataset: datasetId,\n ...(detectedGeometryColumn\n ? {geometryColumn: detectedGeometryColumn.geometryColumn}\n : {}),\n },\n filled: true,\n stroked: false,\n pickable: true,\n radiusUnits: 'pixels',\n getRadius: options.pointRadius ?? 4,\n getFillColor: options.fillColor ?? [...DEFAULT_FILL_COLOR],\n },\n ],\n },\n datasets: {\n [datasetId]: {\n source,\n geometryColumn,\n geometryEncodingHint: coordinates ? 'wkb' : geometryEncodingHint,\n },\n },\n ...(coordinates\n ? {\n fitToData: {\n dataset: datasetId,\n longitudeColumn: coordinates.longitudeColumn,\n latitudeColumn: coordinates.latitudeColumn,\n padding: 40,\n maxZoom: 12,\n },\n }\n : detectedGeometryColumn\n ? {\n fitToData: {\n dataset: datasetId,\n geometryColumn: detectedGeometryColumn.geometryColumn,\n padding: 40,\n maxZoom: 12,\n },\n }\n : {}),\n ...(options.mapStyle ? {mapStyle: options.mapStyle} : {}),\n };\n}\n\nexport function createDeckMapDashboardPanelConfigForTable(options: {\n title?: string;\n tableName: string;\n columns: DeckMapConfigColumn[];\n tableReference?: DeckMapTableReference;\n sourceSqlQuery?: string;\n longitudeColumn?: string;\n latitudeColumn?: string;\n geometryColumn?: string;\n geometryEncodingHint?: GeometryEncodingHint;\n pointRadius?: number;\n fillColor?: DeckMapFillColor;\n mapStyle?: string;\n}) {\n return createDeckMapDashboardPanelConfig({\n title: options.title,\n ...createDeckMapDashboardConfigForTable(options),\n });\n}\n\nexport function regenerateMapConfigForTable(\n panel: MosaicDashboardPanelConfigType,\n table: DataTable,\n longitudeColumn?: string,\n latitudeColumn?: string,\n) {\n if (\n !(longitudeColumn && latitudeColumn) &&\n !findLongitudeLatitudeColumns(table) &&\n !findGeometryColumn(table)\n ) {\n return panel.config;\n }\n\n const existingConfig = panel.config as DeckMapDashboardPanelConfig;\n const nextConfig = createDeckMapDashboardConfigForTable({\n tableName: table.tableName,\n columns: table.columns,\n tableReference: table.table,\n longitudeColumn,\n latitudeColumn,\n });\n\n // Preserve existing layer spec (layer types, styling, bindings) — only\n // update the dataset source and fitToData so the data re-fetches with the\n // new coordinate columns.\n return {\n ...existingConfig,\n datasets: nextConfig.datasets,\n fitToData: nextConfig.fitToData ?? existingConfig.fitToData,\n };\n}\n"]}
|
|
@@ -22,10 +22,25 @@ export declare const DECK_MAP_COLOR_SCALE_TYPE_OPTIONS: ReadonlyArray<{
|
|
|
22
22
|
export declare function getDeckMapLayerRecords(config: DeckMapDashboardPanelConfig): DeckMapLayerRecord[];
|
|
23
23
|
export declare function getDeckMapLayerDatasetId(layer: DeckMapLayerRecord | undefined): string | undefined;
|
|
24
24
|
export declare function usesGeometryColumnSetting(layerType: unknown): boolean;
|
|
25
|
+
export declare function usesH3ColumnSetting(layerType: unknown): boolean;
|
|
26
|
+
export declare function usesArcColumnSetting(layerType: unknown): boolean;
|
|
27
|
+
export declare function usesRadiusSetting(layerType: unknown): boolean;
|
|
28
|
+
export declare function usesColumnRadiusSetting(layerType: unknown): boolean;
|
|
29
|
+
export declare function usesTripsSettings(layerType: unknown): boolean;
|
|
30
|
+
export declare function usesExtrusionSettings(layerType: unknown): boolean;
|
|
25
31
|
export declare function getDeckMapColorAccessorOptions(layerType: unknown): typeof DECK_MAP_COLOR_ACCESSOR_OPTIONS;
|
|
26
32
|
export declare function updateDeckMapLayer(config: DeckMapDashboardPanelConfig, layerIndex: number, updater: (layer: DeckMapLayerRecord) => DeckMapLayerRecord): DeckMapDashboardPanelConfig;
|
|
27
33
|
export declare function setDeckMapLayerType(config: DeckMapDashboardPanelConfig, layerIndex: number, layerType: string): DeckMapDashboardPanelConfig;
|
|
28
34
|
export declare function setDeckMapLayerGeometryColumn(config: DeckMapDashboardPanelConfig, layerIndex: number, geometryColumn: string): DeckMapDashboardPanelConfig;
|
|
35
|
+
export declare function setDeckMapLayerHexagonColumn(config: DeckMapDashboardPanelConfig, layerIndex: number, hexagonColumn: string): DeckMapDashboardPanelConfig;
|
|
36
|
+
export declare function setDeckMapLayerArcColumns(config: DeckMapDashboardPanelConfig, layerIndex: number, columns: {
|
|
37
|
+
sourceGeometryColumn?: string;
|
|
38
|
+
targetGeometryColumn?: string;
|
|
39
|
+
sourceLatitudeColumn?: string;
|
|
40
|
+
sourceLongitudeColumn?: string;
|
|
41
|
+
targetLatitudeColumn?: string;
|
|
42
|
+
targetLongitudeColumn?: string;
|
|
43
|
+
}): DeckMapDashboardPanelConfig;
|
|
29
44
|
export declare function getDeckMapLayerColorScale(layer: DeckMapLayerRecord | undefined, accessor: DeckMapLayerColorAccessor): DeckMapLayerColorScaleFunction | undefined;
|
|
30
45
|
export declare function setDeckMapLayerColorScale(config: DeckMapDashboardPanelConfig, layerIndex: number, accessor: DeckMapLayerColorAccessor, colorScale: DeckMapLayerColorScaleFunction): DeckMapDashboardPanelConfig;
|
|
31
46
|
export declare function clearDeckMapLayerColorScale(config: DeckMapDashboardPanelConfig, layerIndex: number, accessor: DeckMapLayerColorAccessor): DeckMapDashboardPanelConfig;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mapLayerConfigUtils.d.ts","sourceRoot":"","sources":["../src/mapLayerConfigUtils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,gBAAgB,EAAE,gBAAgB,EAAC,MAAM,wBAAwB,CAAC;AAC/E,OAAO,KAAK,EAAC,2BAA2B,EAAC,MAAM,mBAAmB,CAAC;AACnE,OAAO,KAAK,EAAC,iBAAiB,EAAC,MAAM,SAAS,CAAC;AAG/C,MAAM,MAAM,kBAAkB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEzD,MAAM,MAAM,8BAA8B,GAAG,gBAAgB,GAAG;IAC9D,YAAY,EAAE,YAAY,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,yBAAyB,GACjC,cAAc,GACd,cAAc,GACd,UAAU,GACV,gBAAgB,GAChB,gBAAgB,CAAC;AAErB,eAAO,MAAM,2BAA2B,EAAE,aAAa,CAAC;IACtD,KAAK,EAAE,iBAAiB,GAAG,2BAA2B,CAAC;IACvD,KAAK,EAAE,MAAM,CAAC;CACf,CAWA,CAAC;AAEF,eAAO,MAAM,+BAA+B,EAAE,aAAa,CAAC;IAC1D,KAAK,EAAE,yBAAyB,CAAC;IACjC,KAAK,EAAE,MAAM,CAAC;CACf,CAMA,CAAC;AAEF,eAAO,MAAM,iCAAiC,EAAE,aAAa,CAAC;IAC5D,KAAK,EAAE,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,gBAAgB,CAAC;CACjC,CAMA,CAAC;
|
|
1
|
+
{"version":3,"file":"mapLayerConfigUtils.d.ts","sourceRoot":"","sources":["../src/mapLayerConfigUtils.ts"],"names":[],"mappings":"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"}
|