@sqlrooms/deck 0.29.0-rc.2 → 0.29.0-rc.4
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 +9 -0
- package/README.md +69 -0
- package/dist/DeckJsonMap.d.ts +4 -0
- package/dist/DeckJsonMap.d.ts.map +1 -0
- package/dist/{DeckMap.js → DeckJsonMap.js} +57 -44
- package/dist/DeckJsonMap.js.map +1 -0
- package/dist/DeckJsonMapSpec.d.ts +7617 -0
- package/dist/DeckJsonMapSpec.d.ts.map +1 -0
- package/dist/DeckJsonMapSpec.js +81 -0
- package/dist/DeckJsonMapSpec.js.map +1 -0
- package/dist/DeckMapConfigPopoverEditor.d.ts +8 -0
- package/dist/DeckMapConfigPopoverEditor.d.ts.map +1 -0
- package/dist/DeckMapConfigPopoverEditor.js +43 -0
- package/dist/DeckMapConfigPopoverEditor.js.map +1 -0
- package/dist/createDeckJsonSpecFromDatasets.d.ts +11 -0
- package/dist/createDeckJsonSpecFromDatasets.d.ts.map +1 -0
- package/dist/createDeckJsonSpecFromDatasets.js +85 -0
- package/dist/createDeckJsonSpecFromDatasets.js.map +1 -0
- package/dist/dashboard.d.ts +4 -0
- package/dist/dashboard.d.ts.map +1 -0
- package/dist/dashboard.js +465 -0
- package/dist/dashboard.js.map +1 -0
- package/dist/dashboardConfig.d.ts +51 -0
- package/dist/dashboardConfig.d.ts.map +1 -0
- package/dist/dashboardConfig.js +54 -0
- package/dist/dashboardConfig.js.map +1 -0
- package/dist/datasets/PreparedDatasetStore.d.ts +120 -0
- package/dist/datasets/PreparedDatasetStore.d.ts.map +1 -0
- package/dist/datasets/PreparedDatasetStore.js +262 -0
- package/dist/datasets/PreparedDatasetStore.js.map +1 -0
- package/dist/datasets/helpers.d.ts +57 -0
- package/dist/datasets/helpers.d.ts.map +1 -0
- package/dist/datasets/helpers.js +146 -0
- package/dist/datasets/helpers.js.map +1 -0
- package/dist/datasets/normalizeDatasets.d.ts +8 -2
- package/dist/datasets/normalizeDatasets.d.ts.map +1 -1
- package/dist/datasets/normalizeDatasets.js +33 -48
- package/dist/datasets/normalizeDatasets.js.map +1 -1
- package/dist/datasets/tableAdapter.d.ts +11 -0
- package/dist/datasets/tableAdapter.d.ts.map +1 -0
- package/dist/datasets/tableAdapter.js +11 -0
- package/dist/datasets/tableAdapter.js.map +1 -0
- package/dist/datasets/types.d.ts +40 -0
- package/dist/datasets/types.d.ts.map +1 -0
- package/dist/datasets/types.js +2 -0
- package/dist/datasets/types.js.map +1 -0
- package/dist/datasets/usePreparedDatasetStates.d.ts +16 -0
- package/dist/datasets/usePreparedDatasetStates.d.ts.map +1 -0
- package/dist/datasets/usePreparedDatasetStates.js +59 -0
- package/dist/datasets/usePreparedDatasetStates.js.map +1 -0
- package/dist/index.d.ts +10 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -2
- package/dist/index.js.map +1 -1
- package/dist/json/colorScaleFunction.d.ts +14 -0
- package/dist/json/colorScaleFunction.d.ts.map +1 -0
- package/dist/json/colorScaleFunction.js +34 -0
- package/dist/json/colorScaleFunction.js.map +1 -0
- package/dist/json/compileColorScale.d.ts +4 -27
- package/dist/json/compileColorScale.d.ts.map +1 -1
- package/dist/json/compileColorScale.js +16 -450
- package/dist/json/compileColorScale.js.map +1 -1
- package/dist/json/compileGeoArrowAccessor.d.ts +7 -0
- package/dist/json/compileGeoArrowAccessor.d.ts.map +1 -1
- package/dist/json/compileGeoArrowAccessor.js +68 -2
- package/dist/json/compileGeoArrowAccessor.js.map +1 -1
- package/dist/json/createDeckJsonConfiguration.d.ts.map +1 -1
- package/dist/json/createDeckJsonConfiguration.js +86 -33
- package/dist/json/createDeckJsonConfiguration.js.map +1 -1
- package/dist/json/defaultClasses.d.ts +12 -6
- package/dist/json/defaultClasses.d.ts.map +1 -1
- package/dist/json/defaultClasses.js +7 -1
- package/dist/json/defaultClasses.js.map +1 -1
- package/dist/json/extractColorScaleLegends.d.ts +1 -1
- package/dist/json/extractColorScaleLegends.d.ts.map +1 -1
- package/dist/json/extractColorScaleLegends.js +8 -6
- package/dist/json/extractColorScaleLegends.js.map +1 -1
- package/dist/json/layerCompatibility.d.ts +9 -3
- package/dist/json/layerCompatibility.d.ts.map +1 -1
- package/dist/json/layerCompatibility.js +135 -11
- package/dist/json/layerCompatibility.js.map +1 -1
- package/dist/json/layerConfig.d.ts +7 -3
- package/dist/json/layerConfig.d.ts.map +1 -1
- package/dist/json/layerConfig.js +19 -8
- package/dist/json/layerConfig.js.map +1 -1
- package/dist/prepare/detectGeometryColumn.d.ts.map +1 -1
- package/dist/prepare/detectGeometryColumn.js +1 -1
- package/dist/prepare/detectGeometryColumn.js.map +1 -1
- package/dist/prepare/geoarrow.d.ts.map +1 -1
- package/dist/prepare/geoarrow.js.map +1 -1
- package/dist/prepare/geometryDecoder.d.ts +1 -2
- package/dist/prepare/geometryDecoder.d.ts.map +1 -1
- package/dist/prepare/geometryDecoder.js.map +1 -1
- package/dist/prepare/prepareDeckDataset.d.ts +46 -0
- package/dist/prepare/prepareDeckDataset.d.ts.map +1 -1
- package/dist/prepare/prepareDeckDataset.js +46 -0
- package/dist/prepare/prepareDeckDataset.js.map +1 -1
- package/dist/prepare/toGeoJsonBinary.d.ts.map +1 -1
- package/dist/prepare/toGeoJsonBinary.js +3 -2
- package/dist/prepare/toGeoJsonBinary.js.map +1 -1
- package/dist/prepare/wkbDecoder.d.ts.map +1 -1
- package/dist/prepare/wkbDecoder.js +36 -9
- package/dist/prepare/wkbDecoder.js.map +1 -1
- package/dist/types.d.ts +31 -92
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +6 -1
- package/dist/types.js.map +1 -1
- package/dist/useDeckLayersReadyRedraw.d.ts +13 -0
- package/dist/useDeckLayersReadyRedraw.d.ts.map +1 -0
- package/dist/useDeckLayersReadyRedraw.js +35 -0
- package/dist/useDeckLayersReadyRedraw.js.map +1 -0
- package/package.json +35 -29
- package/dist/ColorScaleLegend.d.ts +0 -8
- package/dist/ColorScaleLegend.d.ts.map +0 -1
- package/dist/ColorScaleLegend.js +0 -11
- package/dist/ColorScaleLegend.js.map +0 -1
- package/dist/DeckMap.d.ts +0 -4
- package/dist/DeckMap.d.ts.map +0 -1
- package/dist/DeckMap.js.map +0 -1
- package/dist/datasets/usePreparedDeckDatasets.d.ts +0 -3
- package/dist/datasets/usePreparedDeckDatasets.d.ts.map +0 -1
- package/dist/datasets/usePreparedDeckDatasets.js +0 -61
- package/dist/datasets/usePreparedDeckDatasets.js.map +0 -1
|
@@ -1,113 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { scaleDiverging, scaleOrdinal, scaleQuantile, scaleQuantize, scaleSequential, scaleThreshold, } from 'd3-scale';
|
|
3
|
-
import * as chromatic from 'd3-scale-chromatic';
|
|
4
|
-
const DEFAULT_NULL_COLOR = [0, 0, 0, 0];
|
|
5
|
-
const DEFAULT_UNKNOWN_COLOR = [
|
|
6
|
-
180, 180, 180, 180,
|
|
7
|
-
];
|
|
8
|
-
const DEFAULT_BIN_COUNT = 5;
|
|
9
|
-
const CONTINUOUS_SEQUENTIAL_SCHEMES = {
|
|
10
|
-
Blues: chromatic.interpolateBlues,
|
|
11
|
-
BuGn: chromatic.interpolateBuGn,
|
|
12
|
-
BuPu: chromatic.interpolateBuPu,
|
|
13
|
-
Cividis: chromatic.interpolateCividis,
|
|
14
|
-
Cool: chromatic.interpolateCool,
|
|
15
|
-
CubehelixDefault: chromatic.interpolateCubehelixDefault,
|
|
16
|
-
GnBu: chromatic.interpolateGnBu,
|
|
17
|
-
Greens: chromatic.interpolateGreens,
|
|
18
|
-
Greys: chromatic.interpolateGreys,
|
|
19
|
-
Inferno: chromatic.interpolateInferno,
|
|
20
|
-
Magma: chromatic.interpolateMagma,
|
|
21
|
-
OrRd: chromatic.interpolateOrRd,
|
|
22
|
-
Oranges: chromatic.interpolateOranges,
|
|
23
|
-
Plasma: chromatic.interpolatePlasma,
|
|
24
|
-
PuBu: chromatic.interpolatePuBu,
|
|
25
|
-
PuBuGn: chromatic.interpolatePuBuGn,
|
|
26
|
-
PuRd: chromatic.interpolatePuRd,
|
|
27
|
-
Purples: chromatic.interpolatePurples,
|
|
28
|
-
Rainbow: chromatic.interpolateRainbow,
|
|
29
|
-
RdPu: chromatic.interpolateRdPu,
|
|
30
|
-
Reds: chromatic.interpolateReds,
|
|
31
|
-
Sinebow: chromatic.interpolateSinebow,
|
|
32
|
-
Turbo: chromatic.interpolateTurbo,
|
|
33
|
-
Viridis: chromatic.interpolateViridis,
|
|
34
|
-
Warm: chromatic.interpolateWarm,
|
|
35
|
-
YlGn: chromatic.interpolateYlGn,
|
|
36
|
-
YlGnBu: chromatic.interpolateYlGnBu,
|
|
37
|
-
YlOrBr: chromatic.interpolateYlOrBr,
|
|
38
|
-
YlOrRd: chromatic.interpolateYlOrRd,
|
|
39
|
-
};
|
|
40
|
-
const CONTINUOUS_DIVERGING_SCHEMES = {
|
|
41
|
-
BrBG: chromatic.interpolateBrBG,
|
|
42
|
-
PRGn: chromatic.interpolatePRGn,
|
|
43
|
-
PiYG: chromatic.interpolatePiYG,
|
|
44
|
-
PuOr: chromatic.interpolatePuOr,
|
|
45
|
-
RdBu: chromatic.interpolateRdBu,
|
|
46
|
-
RdGy: chromatic.interpolateRdGy,
|
|
47
|
-
RdYlBu: chromatic.interpolateRdYlBu,
|
|
48
|
-
RdYlGn: chromatic.interpolateRdYlGn,
|
|
49
|
-
Spectral: chromatic.interpolateSpectral,
|
|
50
|
-
};
|
|
51
|
-
const DISCRETE_NUMERIC_SCHEMES = {
|
|
52
|
-
Blues: chromatic.schemeBlues,
|
|
53
|
-
BuGn: chromatic.schemeBuGn,
|
|
54
|
-
BuPu: chromatic.schemeBuPu,
|
|
55
|
-
GnBu: chromatic.schemeGnBu,
|
|
56
|
-
Greens: chromatic.schemeGreens,
|
|
57
|
-
Greys: chromatic.schemeGreys,
|
|
58
|
-
OrRd: chromatic.schemeOrRd,
|
|
59
|
-
Oranges: chromatic.schemeOranges,
|
|
60
|
-
PuBu: chromatic.schemePuBu,
|
|
61
|
-
PuBuGn: chromatic.schemePuBuGn,
|
|
62
|
-
PuRd: chromatic.schemePuRd,
|
|
63
|
-
Purples: chromatic.schemePurples,
|
|
64
|
-
RdPu: chromatic.schemeRdPu,
|
|
65
|
-
Reds: chromatic.schemeReds,
|
|
66
|
-
YlGn: chromatic.schemeYlGn,
|
|
67
|
-
YlGnBu: chromatic.schemeYlGnBu,
|
|
68
|
-
YlOrBr: chromatic.schemeYlOrBr,
|
|
69
|
-
YlOrRd: chromatic.schemeYlOrRd,
|
|
70
|
-
BrBG: chromatic.schemeBrBG,
|
|
71
|
-
PRGn: chromatic.schemePRGn,
|
|
72
|
-
PiYG: chromatic.schemePiYG,
|
|
73
|
-
PuOr: chromatic.schemePuOr,
|
|
74
|
-
RdBu: chromatic.schemeRdBu,
|
|
75
|
-
RdGy: chromatic.schemeRdGy,
|
|
76
|
-
RdYlBu: chromatic.schemeRdYlBu,
|
|
77
|
-
RdYlGn: chromatic.schemeRdYlGn,
|
|
78
|
-
Spectral: chromatic.schemeSpectral,
|
|
79
|
-
};
|
|
80
|
-
const CATEGORICAL_SCHEMES = {
|
|
81
|
-
Accent: chromatic.schemeAccent,
|
|
82
|
-
Category10: chromatic.schemeCategory10,
|
|
83
|
-
Dark2: chromatic.schemeDark2,
|
|
84
|
-
Observable10: chromatic.schemeObservable10,
|
|
85
|
-
Paired: chromatic.schemePaired,
|
|
86
|
-
Pastel1: chromatic.schemePastel1,
|
|
87
|
-
Pastel2: chromatic.schemePastel2,
|
|
88
|
-
Set1: chromatic.schemeSet1,
|
|
89
|
-
Set2: chromatic.schemeSet2,
|
|
90
|
-
Set3: chromatic.schemeSet3,
|
|
91
|
-
Tableau10: chromatic.schemeTableau10,
|
|
92
|
-
};
|
|
93
|
-
function createNullColorAccessor(nullColor) {
|
|
94
|
-
return () => nullColor;
|
|
95
|
-
}
|
|
96
|
-
function normalizeColor(color, fallback) {
|
|
97
|
-
if (!color) {
|
|
98
|
-
return fallback;
|
|
99
|
-
}
|
|
100
|
-
return [color[0], color[1], color[2], color[3] ?? 255];
|
|
101
|
-
}
|
|
102
|
-
function parseColorString(value, alpha = 255) {
|
|
103
|
-
const parsed = rgb(value);
|
|
104
|
-
return [parsed.r, parsed.g, parsed.b, alpha];
|
|
105
|
-
}
|
|
106
|
-
function formatLegendNumber(value) {
|
|
107
|
-
return new Intl.NumberFormat('en-US', {
|
|
108
|
-
maximumFractionDigits: Math.abs(value) >= 100 ? 0 : 2,
|
|
109
|
-
}).format(value);
|
|
110
|
-
}
|
|
1
|
+
import { buildColorScaleLegend as buildGenericColorScaleLegend, coerceFiniteNumber, createColorScaleMapper, } from '@sqlrooms/color-scales';
|
|
111
2
|
function resolveFieldName(schemaOwner, requestedField) {
|
|
112
3
|
const exactMatch = schemaOwner.schema.fields.find((field) => field.name === requestedField)?.name;
|
|
113
4
|
if (exactMatch) {
|
|
@@ -155,105 +46,6 @@ function getRowValue(row, fieldName) {
|
|
|
155
46
|
}
|
|
156
47
|
return undefined;
|
|
157
48
|
}
|
|
158
|
-
function toFiniteNumber(value) {
|
|
159
|
-
if (typeof value === 'number') {
|
|
160
|
-
return Number.isFinite(value) ? value : undefined;
|
|
161
|
-
}
|
|
162
|
-
if (typeof value === 'bigint') {
|
|
163
|
-
return Number(value);
|
|
164
|
-
}
|
|
165
|
-
if (typeof value === 'string' && value.trim() !== '') {
|
|
166
|
-
const parsed = Number(value);
|
|
167
|
-
return Number.isFinite(parsed) ? parsed : undefined;
|
|
168
|
-
}
|
|
169
|
-
return undefined;
|
|
170
|
-
}
|
|
171
|
-
function getNumericValues(vector) {
|
|
172
|
-
const values = [];
|
|
173
|
-
for (let index = 0; index < vector.length; index += 1) {
|
|
174
|
-
const numericValue = toFiniteNumber(vector.get(index));
|
|
175
|
-
if (numericValue !== undefined) {
|
|
176
|
-
values.push(numericValue);
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
return values;
|
|
180
|
-
}
|
|
181
|
-
function getSequentialDomain(values) {
|
|
182
|
-
const min = Math.min(...values);
|
|
183
|
-
const max = Math.max(...values);
|
|
184
|
-
if (min === max) {
|
|
185
|
-
return [min - 1, max + 1];
|
|
186
|
-
}
|
|
187
|
-
return [min, max];
|
|
188
|
-
}
|
|
189
|
-
function getDivergingDomain(values) {
|
|
190
|
-
const min = Math.min(...values);
|
|
191
|
-
const max = Math.max(...values);
|
|
192
|
-
if (min === max) {
|
|
193
|
-
return [min - 1, min, max + 1];
|
|
194
|
-
}
|
|
195
|
-
if (min < 0 && max > 0) {
|
|
196
|
-
return [min, 0, max];
|
|
197
|
-
}
|
|
198
|
-
return [min, (min + max) / 2, max];
|
|
199
|
-
}
|
|
200
|
-
function unique(values) {
|
|
201
|
-
return [...new Set(values)];
|
|
202
|
-
}
|
|
203
|
-
function clampBinCount(bins) {
|
|
204
|
-
return Math.max(2, Math.round(bins));
|
|
205
|
-
}
|
|
206
|
-
function sampleInterpolator(interpolator, bins) {
|
|
207
|
-
if (bins === 1) {
|
|
208
|
-
return [interpolator(0.5)];
|
|
209
|
-
}
|
|
210
|
-
return Array.from({ length: bins }, (_, index) => interpolator(index / (bins - 1)));
|
|
211
|
-
}
|
|
212
|
-
function getNumericInterpolator(scheme) {
|
|
213
|
-
const sequential = CONTINUOUS_SEQUENTIAL_SCHEMES[scheme];
|
|
214
|
-
if (sequential) {
|
|
215
|
-
return sequential;
|
|
216
|
-
}
|
|
217
|
-
return CONTINUOUS_DIVERGING_SCHEMES[scheme];
|
|
218
|
-
}
|
|
219
|
-
function getDiscreteNumericColors(options) {
|
|
220
|
-
const { scheme, reverse } = options;
|
|
221
|
-
const bins = clampBinCount(options.bins);
|
|
222
|
-
const discreteScheme = DISCRETE_NUMERIC_SCHEMES[scheme];
|
|
223
|
-
const directColors = discreteScheme[bins];
|
|
224
|
-
const colors = Array.isArray(directColors)
|
|
225
|
-
? [...directColors]
|
|
226
|
-
: sampleInterpolator(getNumericInterpolator(scheme) ??
|
|
227
|
-
(() => {
|
|
228
|
-
throw new Error(`Unsupported numeric colorScale scheme "${scheme}".`);
|
|
229
|
-
})(), bins);
|
|
230
|
-
return reverse ? colors.reverse() : colors;
|
|
231
|
-
}
|
|
232
|
-
function formatExtentLabel(extent) {
|
|
233
|
-
const start = toFiniteNumber(extent[0]);
|
|
234
|
-
const end = toFiniteNumber(extent[1]);
|
|
235
|
-
if (start === undefined && end === undefined) {
|
|
236
|
-
return 'unknown';
|
|
237
|
-
}
|
|
238
|
-
if (start === undefined && end !== undefined) {
|
|
239
|
-
return `< ${formatLegendNumber(end)}`;
|
|
240
|
-
}
|
|
241
|
-
if (start !== undefined && end === undefined) {
|
|
242
|
-
return `>= ${formatLegendNumber(start)}`;
|
|
243
|
-
}
|
|
244
|
-
return `${formatLegendNumber(start)} - ${formatLegendNumber(end)}`;
|
|
245
|
-
}
|
|
246
|
-
function buildSteppedLegendItems(scale, range) {
|
|
247
|
-
return range.map((color) => ({
|
|
248
|
-
label: formatExtentLabel(scale.invertExtent(color)),
|
|
249
|
-
color: parseColorString(color),
|
|
250
|
-
}));
|
|
251
|
-
}
|
|
252
|
-
function buildGradient(interpolator) {
|
|
253
|
-
return `linear-gradient(to right, ${[0, 0.25, 0.5, 0.75, 1]
|
|
254
|
-
.map((offset) => `${interpolator(offset)} ${offset * 100}%`)
|
|
255
|
-
.join(', ')})`;
|
|
256
|
-
}
|
|
257
49
|
function getGeoArrowOrRowValue(options) {
|
|
258
50
|
const { value, fieldName, vector } = options;
|
|
259
51
|
if (value &&
|
|
@@ -272,256 +64,30 @@ function getGeoArrowOrRowValue(options) {
|
|
|
272
64
|
}
|
|
273
65
|
return getRowValue(value, fieldName);
|
|
274
66
|
}
|
|
275
|
-
function
|
|
276
|
-
|
|
277
|
-
return (value) => {
|
|
278
|
-
const rawValue = getGeoArrowOrRowValue({ value, fieldName, vector });
|
|
279
|
-
const numericValue = toFiniteNumber(rawValue);
|
|
280
|
-
if (numericValue === undefined) {
|
|
281
|
-
return nullColor;
|
|
282
|
-
}
|
|
283
|
-
return parseColorString(colorForValue(numericValue));
|
|
284
|
-
};
|
|
67
|
+
function getColumnValues(vector) {
|
|
68
|
+
return Array.from({ length: vector.length }, (_, index) => vector.get(index));
|
|
285
69
|
}
|
|
286
70
|
export function compileColorScale(options) {
|
|
287
71
|
const { table, colorScale } = options;
|
|
288
72
|
const { fieldName, vector } = getColumn(table, colorScale.field);
|
|
289
|
-
const
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
if (!baseRange) {
|
|
293
|
-
throw new Error(`Unsupported categorical colorScale scheme "${colorScale.scheme}".`);
|
|
294
|
-
}
|
|
295
|
-
const range = colorScale.reverse
|
|
296
|
-
? [...baseRange].reverse()
|
|
297
|
-
: [...baseRange];
|
|
298
|
-
const scale = scaleOrdinal(range);
|
|
299
|
-
const unknownColor = normalizeColor(colorScale.unknownColor, DEFAULT_UNKNOWN_COLOR);
|
|
300
|
-
return (value) => {
|
|
301
|
-
const rawValue = getGeoArrowOrRowValue({ value, fieldName, vector });
|
|
302
|
-
if (rawValue == null) {
|
|
303
|
-
return nullColor;
|
|
304
|
-
}
|
|
305
|
-
if (typeof rawValue !== 'string' &&
|
|
306
|
-
typeof rawValue !== 'number' &&
|
|
307
|
-
typeof rawValue !== 'boolean') {
|
|
308
|
-
return unknownColor;
|
|
309
|
-
}
|
|
310
|
-
return parseColorString(scale(String(rawValue)));
|
|
311
|
-
};
|
|
312
|
-
}
|
|
313
|
-
const numericValues = getNumericValues(vector);
|
|
314
|
-
if (numericValues.length === 0) {
|
|
315
|
-
return createNullColorAccessor(nullColor);
|
|
316
|
-
}
|
|
317
|
-
if (colorScale.type === 'sequential') {
|
|
318
|
-
const interpolator = CONTINUOUS_SEQUENTIAL_SCHEMES[colorScale.scheme];
|
|
319
|
-
const domain = colorScale.domain === 'auto'
|
|
320
|
-
? getSequentialDomain(numericValues)
|
|
321
|
-
: colorScale.domain;
|
|
322
|
-
const colorInterpolator = colorScale.reverse
|
|
323
|
-
? (t) => interpolator(1 - t)
|
|
324
|
-
: interpolator;
|
|
325
|
-
const scale = scaleSequential(colorInterpolator).domain(domain);
|
|
326
|
-
if (colorScale.clamp) {
|
|
327
|
-
scale.clamp(true);
|
|
328
|
-
}
|
|
329
|
-
return createContinuousAccessor({
|
|
330
|
-
fieldName,
|
|
331
|
-
vector,
|
|
332
|
-
nullColor,
|
|
333
|
-
colorForValue: (value) => scale(value),
|
|
334
|
-
});
|
|
335
|
-
}
|
|
336
|
-
if (colorScale.type === 'diverging') {
|
|
337
|
-
const interpolator = CONTINUOUS_DIVERGING_SCHEMES[colorScale.scheme];
|
|
338
|
-
const domain = colorScale.domain === 'auto'
|
|
339
|
-
? getDivergingDomain(numericValues)
|
|
340
|
-
: colorScale.domain;
|
|
341
|
-
const colorInterpolator = colorScale.reverse
|
|
342
|
-
? (t) => interpolator(1 - t)
|
|
343
|
-
: interpolator;
|
|
344
|
-
const scale = scaleDiverging(colorInterpolator).domain(domain);
|
|
345
|
-
if (colorScale.clamp) {
|
|
346
|
-
scale.clamp(true);
|
|
347
|
-
}
|
|
348
|
-
return createContinuousAccessor({
|
|
349
|
-
fieldName,
|
|
350
|
-
vector,
|
|
351
|
-
nullColor,
|
|
352
|
-
colorForValue: (value) => scale(value),
|
|
353
|
-
});
|
|
354
|
-
}
|
|
355
|
-
if (colorScale.type === 'quantize') {
|
|
356
|
-
const range = getDiscreteNumericColors({
|
|
357
|
-
scheme: colorScale.scheme,
|
|
358
|
-
bins: colorScale.bins ?? DEFAULT_BIN_COUNT,
|
|
359
|
-
reverse: colorScale.reverse,
|
|
360
|
-
});
|
|
361
|
-
const domain = colorScale.domain === 'auto'
|
|
362
|
-
? getSequentialDomain(numericValues)
|
|
363
|
-
: colorScale.domain;
|
|
364
|
-
const scale = scaleQuantize()
|
|
365
|
-
.domain(domain)
|
|
366
|
-
.range(range);
|
|
367
|
-
return createContinuousAccessor({
|
|
368
|
-
fieldName,
|
|
369
|
-
vector,
|
|
370
|
-
nullColor,
|
|
371
|
-
colorForValue: scale,
|
|
372
|
-
});
|
|
373
|
-
}
|
|
374
|
-
if (colorScale.type === 'quantile') {
|
|
375
|
-
const range = getDiscreteNumericColors({
|
|
376
|
-
scheme: colorScale.scheme,
|
|
377
|
-
bins: colorScale.bins ?? DEFAULT_BIN_COUNT,
|
|
378
|
-
reverse: colorScale.reverse,
|
|
379
|
-
});
|
|
380
|
-
const scale = scaleQuantile()
|
|
381
|
-
.domain(numericValues)
|
|
382
|
-
.range(range);
|
|
383
|
-
return createContinuousAccessor({
|
|
384
|
-
fieldName,
|
|
385
|
-
vector,
|
|
386
|
-
nullColor,
|
|
387
|
-
colorForValue: scale,
|
|
388
|
-
});
|
|
389
|
-
}
|
|
390
|
-
const thresholds = [...colorScale.thresholds].sort((left, right) => left - right);
|
|
391
|
-
if (!thresholds.length) {
|
|
392
|
-
throw new Error('Threshold colorScale requires at least one threshold.');
|
|
393
|
-
}
|
|
394
|
-
const range = getDiscreteNumericColors({
|
|
395
|
-
scheme: colorScale.scheme,
|
|
396
|
-
bins: thresholds.length + 1,
|
|
397
|
-
reverse: colorScale.reverse,
|
|
398
|
-
});
|
|
399
|
-
const scale = scaleThreshold()
|
|
400
|
-
.domain(thresholds)
|
|
401
|
-
.range(range);
|
|
402
|
-
return createContinuousAccessor({
|
|
403
|
-
fieldName,
|
|
404
|
-
vector,
|
|
405
|
-
nullColor,
|
|
406
|
-
colorForValue: (value) => scale(value),
|
|
73
|
+
const mapper = createColorScaleMapper({
|
|
74
|
+
colorScale,
|
|
75
|
+
values: getColumnValues(vector),
|
|
407
76
|
});
|
|
77
|
+
return (value) => mapper(getGeoArrowOrRowValue({ value, fieldName, vector }));
|
|
408
78
|
}
|
|
409
79
|
export function buildColorScaleLegend(options) {
|
|
410
|
-
const { table, colorScale
|
|
411
|
-
const {
|
|
412
|
-
const
|
|
413
|
-
if (colorScale.type
|
|
414
|
-
|
|
415
|
-
const range = colorScale.reverse
|
|
416
|
-
? [...baseRange].reverse()
|
|
417
|
-
: [...baseRange];
|
|
418
|
-
const values = unique(Array.from({ length: vector.length }, (_, index) => vector.get(index)).filter((value) => value != null &&
|
|
419
|
-
(typeof value === 'string' ||
|
|
420
|
-
typeof value === 'number' ||
|
|
421
|
-
typeof value === 'boolean')));
|
|
422
|
-
if (values.length === 0) {
|
|
423
|
-
return null;
|
|
424
|
-
}
|
|
425
|
-
return {
|
|
426
|
-
type: 'categorical',
|
|
427
|
-
title: resolvedTitle,
|
|
428
|
-
items: values.map((value, index) => ({
|
|
429
|
-
label: String(value),
|
|
430
|
-
color: parseColorString(range[index % range.length]),
|
|
431
|
-
})),
|
|
432
|
-
};
|
|
433
|
-
}
|
|
434
|
-
const numericValues = getNumericValues(vector);
|
|
435
|
-
if (numericValues.length === 0) {
|
|
436
|
-
return null;
|
|
437
|
-
}
|
|
438
|
-
if (colorScale.type === 'sequential') {
|
|
439
|
-
const interpolator = CONTINUOUS_SEQUENTIAL_SCHEMES[colorScale.scheme];
|
|
440
|
-
const domain = colorScale.domain === 'auto'
|
|
441
|
-
? getSequentialDomain(numericValues)
|
|
442
|
-
: colorScale.domain;
|
|
443
|
-
const colorInterpolator = colorScale.reverse
|
|
444
|
-
? (t) => interpolator(1 - t)
|
|
445
|
-
: interpolator;
|
|
446
|
-
return {
|
|
447
|
-
type: 'continuous',
|
|
448
|
-
title: resolvedTitle,
|
|
449
|
-
gradient: buildGradient(colorInterpolator),
|
|
450
|
-
ticks: [
|
|
451
|
-
{ label: formatLegendNumber(domain[0]), offset: 0 },
|
|
452
|
-
{ label: formatLegendNumber((domain[0] + domain[1]) / 2), offset: 50 },
|
|
453
|
-
{ label: formatLegendNumber(domain[1]), offset: 100 },
|
|
454
|
-
],
|
|
455
|
-
};
|
|
456
|
-
}
|
|
457
|
-
if (colorScale.type === 'diverging') {
|
|
458
|
-
const interpolator = CONTINUOUS_DIVERGING_SCHEMES[colorScale.scheme];
|
|
459
|
-
const domain = colorScale.domain === 'auto'
|
|
460
|
-
? getDivergingDomain(numericValues)
|
|
461
|
-
: colorScale.domain;
|
|
462
|
-
const colorInterpolator = colorScale.reverse
|
|
463
|
-
? (t) => interpolator(1 - t)
|
|
464
|
-
: interpolator;
|
|
465
|
-
return {
|
|
466
|
-
type: 'continuous',
|
|
467
|
-
title: resolvedTitle,
|
|
468
|
-
gradient: buildGradient(colorInterpolator),
|
|
469
|
-
ticks: [
|
|
470
|
-
{ label: formatLegendNumber(domain[0]), offset: 0 },
|
|
471
|
-
{ label: formatLegendNumber(domain[1]), offset: 50 },
|
|
472
|
-
{ label: formatLegendNumber(domain[2]), offset: 100 },
|
|
473
|
-
],
|
|
474
|
-
};
|
|
475
|
-
}
|
|
476
|
-
if (colorScale.type === 'quantize') {
|
|
477
|
-
const range = getDiscreteNumericColors({
|
|
478
|
-
scheme: colorScale.scheme,
|
|
479
|
-
bins: colorScale.bins ?? DEFAULT_BIN_COUNT,
|
|
480
|
-
reverse: colorScale.reverse,
|
|
481
|
-
});
|
|
482
|
-
const domain = colorScale.domain === 'auto'
|
|
483
|
-
? getSequentialDomain(numericValues)
|
|
484
|
-
: colorScale.domain;
|
|
485
|
-
const scale = scaleQuantize()
|
|
486
|
-
.domain(domain)
|
|
487
|
-
.range(range);
|
|
488
|
-
return {
|
|
489
|
-
type: 'stepped',
|
|
490
|
-
title: resolvedTitle,
|
|
491
|
-
items: buildSteppedLegendItems(scale, range),
|
|
492
|
-
};
|
|
493
|
-
}
|
|
494
|
-
if (colorScale.type === 'quantile') {
|
|
495
|
-
const range = getDiscreteNumericColors({
|
|
496
|
-
scheme: colorScale.scheme,
|
|
497
|
-
bins: colorScale.bins ?? DEFAULT_BIN_COUNT,
|
|
498
|
-
reverse: colorScale.reverse,
|
|
499
|
-
});
|
|
500
|
-
const scale = scaleQuantile()
|
|
501
|
-
.domain(numericValues)
|
|
502
|
-
.range(range);
|
|
503
|
-
return {
|
|
504
|
-
type: 'stepped',
|
|
505
|
-
title: resolvedTitle,
|
|
506
|
-
items: buildSteppedLegendItems(scale, range),
|
|
507
|
-
};
|
|
508
|
-
}
|
|
509
|
-
const thresholds = [...colorScale.thresholds].sort((left, right) => left - right);
|
|
510
|
-
if (!thresholds.length) {
|
|
80
|
+
const { table, colorScale } = options;
|
|
81
|
+
const { vector } = getColumn(table, colorScale.field);
|
|
82
|
+
const values = getColumnValues(vector);
|
|
83
|
+
if (colorScale.type !== 'categorical' &&
|
|
84
|
+
values.every((value) => coerceFiniteNumber(value) === undefined)) {
|
|
511
85
|
return null;
|
|
512
86
|
}
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
87
|
+
return buildGenericColorScaleLegend({
|
|
88
|
+
colorScale,
|
|
89
|
+
values,
|
|
90
|
+
title: options.title,
|
|
517
91
|
});
|
|
518
|
-
const scale = scaleThreshold()
|
|
519
|
-
.domain(thresholds)
|
|
520
|
-
.range(range);
|
|
521
|
-
return {
|
|
522
|
-
type: 'stepped',
|
|
523
|
-
title: resolvedTitle,
|
|
524
|
-
items: buildSteppedLegendItems(scale, range),
|
|
525
|
-
};
|
|
526
92
|
}
|
|
527
93
|
//# sourceMappingURL=compileColorScale.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compileColorScale.js","sourceRoot":"","sources":["../../src/json/compileColorScale.ts"],"names":[],"mappings":"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","sourcesContent":["import type * as arrow from 'apache-arrow';\nimport {rgb} from 'd3-color';\nimport {\n scaleDiverging,\n scaleOrdinal,\n scaleQuantile,\n scaleQuantize,\n scaleSequential,\n scaleThreshold,\n} from 'd3-scale';\nimport * as chromatic from 'd3-scale-chromatic';\nimport type {\n BinnedNumericScheme,\n CategoricalScheme,\n ContinuousDivergingScheme,\n ContinuousSequentialScheme,\n LayerColorScale,\n} from '../types';\n\nconst DEFAULT_NULL_COLOR: [number, number, number, number] = [0, 0, 0, 0];\nconst DEFAULT_UNKNOWN_COLOR: [number, number, number, number] = [\n 180, 180, 180, 180,\n];\nconst DEFAULT_BIN_COUNT = 5;\n\nconst CONTINUOUS_SEQUENTIAL_SCHEMES: Record<\n ContinuousSequentialScheme,\n (t: number) => string\n> = {\n Blues: chromatic.interpolateBlues,\n BuGn: chromatic.interpolateBuGn,\n BuPu: chromatic.interpolateBuPu,\n Cividis: chromatic.interpolateCividis,\n Cool: chromatic.interpolateCool,\n CubehelixDefault: chromatic.interpolateCubehelixDefault,\n GnBu: chromatic.interpolateGnBu,\n Greens: chromatic.interpolateGreens,\n Greys: chromatic.interpolateGreys,\n Inferno: chromatic.interpolateInferno,\n Magma: chromatic.interpolateMagma,\n OrRd: chromatic.interpolateOrRd,\n Oranges: chromatic.interpolateOranges,\n Plasma: chromatic.interpolatePlasma,\n PuBu: chromatic.interpolatePuBu,\n PuBuGn: chromatic.interpolatePuBuGn,\n PuRd: chromatic.interpolatePuRd,\n Purples: chromatic.interpolatePurples,\n Rainbow: chromatic.interpolateRainbow,\n RdPu: chromatic.interpolateRdPu,\n Reds: chromatic.interpolateReds,\n Sinebow: chromatic.interpolateSinebow,\n Turbo: chromatic.interpolateTurbo,\n Viridis: chromatic.interpolateViridis,\n Warm: chromatic.interpolateWarm,\n YlGn: chromatic.interpolateYlGn,\n YlGnBu: chromatic.interpolateYlGnBu,\n YlOrBr: chromatic.interpolateYlOrBr,\n YlOrRd: chromatic.interpolateYlOrRd,\n};\n\nconst CONTINUOUS_DIVERGING_SCHEMES: Record<\n ContinuousDivergingScheme,\n (t: number) => string\n> = {\n BrBG: chromatic.interpolateBrBG,\n PRGn: chromatic.interpolatePRGn,\n PiYG: chromatic.interpolatePiYG,\n PuOr: chromatic.interpolatePuOr,\n RdBu: chromatic.interpolateRdBu,\n RdGy: chromatic.interpolateRdGy,\n RdYlBu: chromatic.interpolateRdYlBu,\n RdYlGn: chromatic.interpolateRdYlGn,\n Spectral: chromatic.interpolateSpectral,\n};\n\nconst DISCRETE_NUMERIC_SCHEMES: Record<\n BinnedNumericScheme,\n ReadonlyArray<ReadonlyArray<string>>\n> = {\n Blues: chromatic.schemeBlues,\n BuGn: chromatic.schemeBuGn,\n BuPu: chromatic.schemeBuPu,\n GnBu: chromatic.schemeGnBu,\n Greens: chromatic.schemeGreens,\n Greys: chromatic.schemeGreys,\n OrRd: chromatic.schemeOrRd,\n Oranges: chromatic.schemeOranges,\n PuBu: chromatic.schemePuBu,\n PuBuGn: chromatic.schemePuBuGn,\n PuRd: chromatic.schemePuRd,\n Purples: chromatic.schemePurples,\n RdPu: chromatic.schemeRdPu,\n Reds: chromatic.schemeReds,\n YlGn: chromatic.schemeYlGn,\n YlGnBu: chromatic.schemeYlGnBu,\n YlOrBr: chromatic.schemeYlOrBr,\n YlOrRd: chromatic.schemeYlOrRd,\n BrBG: chromatic.schemeBrBG,\n PRGn: chromatic.schemePRGn,\n PiYG: chromatic.schemePiYG,\n PuOr: chromatic.schemePuOr,\n RdBu: chromatic.schemeRdBu,\n RdGy: chromatic.schemeRdGy,\n RdYlBu: chromatic.schemeRdYlBu,\n RdYlGn: chromatic.schemeRdYlGn,\n Spectral: chromatic.schemeSpectral,\n};\n\nconst CATEGORICAL_SCHEMES: Record<CategoricalScheme, ReadonlyArray<string>> = {\n Accent: chromatic.schemeAccent,\n Category10: chromatic.schemeCategory10,\n Dark2: chromatic.schemeDark2,\n Observable10: chromatic.schemeObservable10,\n Paired: chromatic.schemePaired,\n Pastel1: chromatic.schemePastel1,\n Pastel2: chromatic.schemePastel2,\n Set1: chromatic.schemeSet1,\n Set2: chromatic.schemeSet2,\n Set3: chromatic.schemeSet3,\n Tableau10: chromatic.schemeTableau10,\n};\n\ntype DiscreteScaleWithInvertExtent = {\n invertExtent: (value: string) => [unknown, unknown];\n};\ntype NumericColorScale = ((value: number) => string) &\n DiscreteScaleWithInvertExtent;\n\nexport type ResolvedColorLegend =\n | {\n type: 'continuous';\n title: string;\n gradient: string;\n ticks: Array<{label: string; offset: number}>;\n }\n | {\n type: 'stepped';\n title: string;\n items: Array<{label: string; color: [number, number, number, number]}>;\n }\n | {\n type: 'categorical';\n title: string;\n items: Array<{label: string; color: [number, number, number, number]}>;\n };\n\nfunction createNullColorAccessor(nullColor: [number, number, number, number]) {\n return () => nullColor;\n}\n\nfunction normalizeColor(\n color: [number, number, number, number?] | undefined,\n fallback: [number, number, number, number],\n) {\n if (!color) {\n return fallback;\n }\n\n return [color[0], color[1], color[2], color[3] ?? 255] as [\n number,\n number,\n number,\n number,\n ];\n}\n\nfunction parseColorString(value: string, alpha = 255) {\n const parsed = rgb(value);\n return [parsed.r, parsed.g, parsed.b, alpha] as [\n number,\n number,\n number,\n number,\n ];\n}\n\nfunction formatLegendNumber(value: number) {\n return new Intl.NumberFormat('en-US', {\n maximumFractionDigits: Math.abs(value) >= 100 ? 0 : 2,\n }).format(value);\n}\n\nfunction resolveFieldName(\n schemaOwner: arrow.Table | arrow.RecordBatch,\n requestedField: string,\n) {\n const exactMatch = schemaOwner.schema.fields.find(\n (field) => field.name === requestedField,\n )?.name;\n if (exactMatch) {\n return exactMatch;\n }\n\n const caseInsensitiveMatches = schemaOwner.schema.fields\n .map((field) => field.name)\n .filter(\n (fieldName) => fieldName.toLowerCase() === requestedField.toLowerCase(),\n );\n\n if (caseInsensitiveMatches.length === 1) {\n return caseInsensitiveMatches[0]!;\n }\n\n return undefined;\n}\n\nfunction getColumn(table: arrow.Table, field: string) {\n const resolvedFieldName = resolveFieldName(table, field);\n if (!resolvedFieldName) {\n throw new Error(`Unknown colorScale field \"${field}\".`);\n }\n\n const vector = table.getChild(resolvedFieldName);\n if (!vector) {\n throw new Error(`Unable to read colorScale field \"${resolvedFieldName}\".`);\n }\n\n return {\n fieldName: resolvedFieldName,\n vector,\n };\n}\n\nfunction getRowValue(row: unknown, fieldName: string) {\n if (!row || typeof row !== 'object') {\n return undefined;\n }\n\n const object = row as Record<string, unknown>;\n const sources = [\n object,\n object.properties as Record<string, unknown> | undefined,\n ].filter((value): value is Record<string, unknown> =>\n Boolean(value && typeof value === 'object'),\n );\n\n for (const source of sources) {\n if (fieldName in source) {\n return source[fieldName];\n }\n\n const caseInsensitiveMatches = Object.keys(source).filter(\n (key) => key.toLowerCase() === fieldName.toLowerCase(),\n );\n if (caseInsensitiveMatches.length === 1) {\n return source[caseInsensitiveMatches[0]!] as unknown;\n }\n }\n\n return undefined;\n}\n\nfunction toFiniteNumber(value: unknown) {\n if (typeof value === 'number') {\n return Number.isFinite(value) ? value : undefined;\n }\n\n if (typeof value === 'bigint') {\n return Number(value);\n }\n\n if (typeof value === 'string' && value.trim() !== '') {\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : undefined;\n }\n\n return undefined;\n}\n\nfunction getNumericValues(vector: arrow.Vector) {\n const values: number[] = [];\n for (let index = 0; index < vector.length; index += 1) {\n const numericValue = toFiniteNumber(vector.get(index));\n if (numericValue !== undefined) {\n values.push(numericValue);\n }\n }\n\n return values;\n}\n\nfunction getSequentialDomain(values: number[]) {\n const min = Math.min(...values);\n const max = Math.max(...values);\n if (min === max) {\n return [min - 1, max + 1] as [number, number];\n }\n\n return [min, max] as [number, number];\n}\n\nfunction getDivergingDomain(values: number[]) {\n const min = Math.min(...values);\n const max = Math.max(...values);\n if (min === max) {\n return [min - 1, min, max + 1] as [number, number, number];\n }\n\n if (min < 0 && max > 0) {\n return [min, 0, max] as [number, number, number];\n }\n\n return [min, (min + max) / 2, max] as [number, number, number];\n}\n\nfunction unique<T>(values: T[]) {\n return [...new Set(values)];\n}\n\nfunction clampBinCount(bins: number) {\n return Math.max(2, Math.round(bins));\n}\n\nfunction sampleInterpolator(interpolator: (t: number) => string, bins: number) {\n if (bins === 1) {\n return [interpolator(0.5)];\n }\n\n return Array.from({length: bins}, (_, index) =>\n interpolator(index / (bins - 1)),\n );\n}\n\nfunction getNumericInterpolator(scheme: BinnedNumericScheme) {\n const sequential =\n CONTINUOUS_SEQUENTIAL_SCHEMES[scheme as ContinuousSequentialScheme];\n if (sequential) {\n return sequential;\n }\n\n return CONTINUOUS_DIVERGING_SCHEMES[scheme as ContinuousDivergingScheme];\n}\n\nfunction getDiscreteNumericColors(options: {\n scheme: BinnedNumericScheme;\n bins: number;\n reverse?: boolean;\n}) {\n const {scheme, reverse} = options;\n const bins = clampBinCount(options.bins);\n const discreteScheme = DISCRETE_NUMERIC_SCHEMES[scheme];\n const directColors = discreteScheme[bins];\n const colors = Array.isArray(directColors)\n ? [...directColors]\n : sampleInterpolator(\n getNumericInterpolator(scheme) ??\n (() => {\n throw new Error(\n `Unsupported numeric colorScale scheme \"${scheme}\".`,\n );\n })(),\n bins,\n );\n\n return reverse ? colors.reverse() : colors;\n}\n\nfunction formatExtentLabel(extent: [unknown, unknown]) {\n const start = toFiniteNumber(extent[0]);\n const end = toFiniteNumber(extent[1]);\n\n if (start === undefined && end === undefined) {\n return 'unknown';\n }\n\n if (start === undefined && end !== undefined) {\n return `< ${formatLegendNumber(end)}`;\n }\n\n if (start !== undefined && end === undefined) {\n return `>= ${formatLegendNumber(start)}`;\n }\n\n return `${formatLegendNumber(start!)} - ${formatLegendNumber(end!)}`;\n}\n\nfunction buildSteppedLegendItems(\n scale: DiscreteScaleWithInvertExtent,\n range: string[],\n) {\n return range.map((color) => ({\n label: formatExtentLabel(scale.invertExtent(color)),\n color: parseColorString(color),\n }));\n}\n\nfunction buildGradient(interpolator: (t: number) => string) {\n return `linear-gradient(to right, ${[0, 0.25, 0.5, 0.75, 1]\n .map((offset) => `${interpolator(offset)} ${offset * 100}%`)\n .join(', ')})`;\n}\n\nfunction getGeoArrowOrRowValue(options: {\n value: unknown;\n fieldName: string;\n vector: arrow.Vector;\n}) {\n const {value, fieldName, vector} = options;\n if (\n value &&\n typeof value === 'object' &&\n 'index' in value &&\n typeof (value as {index?: unknown}).index === 'number'\n ) {\n const objectInfo = value as {\n index: number;\n data?: {data?: arrow.Table | arrow.RecordBatch};\n };\n const batch = objectInfo.data?.data;\n const batchFieldName = batch\n ? resolveFieldName(batch, fieldName)\n : undefined;\n\n if (batch && batchFieldName) {\n return batch.getChild(batchFieldName)?.get(objectInfo.index);\n }\n\n return vector.get(objectInfo.index);\n }\n\n return getRowValue(value, fieldName);\n}\n\nfunction createContinuousAccessor(options: {\n fieldName: string;\n vector: arrow.Vector;\n nullColor: [number, number, number, number];\n colorForValue: (value: number) => string;\n}) {\n const {fieldName, vector, nullColor, colorForValue} = options;\n\n return (value: unknown) => {\n const rawValue = getGeoArrowOrRowValue({value, fieldName, vector});\n const numericValue = toFiniteNumber(rawValue);\n if (numericValue === undefined) {\n return nullColor;\n }\n\n return parseColorString(colorForValue(numericValue));\n };\n}\n\nexport function compileColorScale(options: {\n table: arrow.Table;\n colorScale: LayerColorScale;\n}) {\n const {table, colorScale} = options;\n const {fieldName, vector} = getColumn(table, colorScale.field);\n const nullColor = normalizeColor(colorScale.nullColor, DEFAULT_NULL_COLOR);\n\n if (colorScale.type === 'categorical') {\n const baseRange = CATEGORICAL_SCHEMES[colorScale.scheme];\n if (!baseRange) {\n throw new Error(\n `Unsupported categorical colorScale scheme \"${colorScale.scheme}\".`,\n );\n }\n\n const range = colorScale.reverse\n ? [...baseRange].reverse()\n : [...baseRange];\n const scale = scaleOrdinal<string, string>(range);\n const unknownColor = normalizeColor(\n colorScale.unknownColor,\n DEFAULT_UNKNOWN_COLOR,\n );\n\n return (value: unknown) => {\n const rawValue = getGeoArrowOrRowValue({value, fieldName, vector});\n if (rawValue == null) {\n return nullColor;\n }\n\n if (\n typeof rawValue !== 'string' &&\n typeof rawValue !== 'number' &&\n typeof rawValue !== 'boolean'\n ) {\n return unknownColor;\n }\n\n return parseColorString(scale(String(rawValue)));\n };\n }\n\n const numericValues = getNumericValues(vector);\n if (numericValues.length === 0) {\n return createNullColorAccessor(nullColor);\n }\n\n if (colorScale.type === 'sequential') {\n const interpolator = CONTINUOUS_SEQUENTIAL_SCHEMES[colorScale.scheme];\n const domain =\n colorScale.domain === 'auto'\n ? getSequentialDomain(numericValues)\n : colorScale.domain;\n const colorInterpolator = colorScale.reverse\n ? (t: number) => interpolator(1 - t)\n : interpolator;\n const scale = scaleSequential(colorInterpolator).domain(domain);\n if (colorScale.clamp) {\n scale.clamp(true);\n }\n\n return createContinuousAccessor({\n fieldName,\n vector,\n nullColor,\n colorForValue: (value) => scale(value) as string,\n });\n }\n\n if (colorScale.type === 'diverging') {\n const interpolator = CONTINUOUS_DIVERGING_SCHEMES[colorScale.scheme];\n const domain =\n colorScale.domain === 'auto'\n ? getDivergingDomain(numericValues)\n : colorScale.domain;\n const colorInterpolator = colorScale.reverse\n ? (t: number) => interpolator(1 - t)\n : interpolator;\n const scale = scaleDiverging(colorInterpolator).domain(domain);\n if (colorScale.clamp) {\n scale.clamp(true);\n }\n\n return createContinuousAccessor({\n fieldName,\n vector,\n nullColor,\n colorForValue: (value) => scale(value) as string,\n });\n }\n\n if (colorScale.type === 'quantize') {\n const range = getDiscreteNumericColors({\n scheme: colorScale.scheme,\n bins: colorScale.bins ?? DEFAULT_BIN_COUNT,\n reverse: colorScale.reverse,\n });\n const domain =\n colorScale.domain === 'auto'\n ? getSequentialDomain(numericValues)\n : colorScale.domain;\n const scale = scaleQuantize<number, string>()\n .domain(domain)\n .range(range) as unknown as NumericColorScale;\n\n return createContinuousAccessor({\n fieldName,\n vector,\n nullColor,\n colorForValue: scale,\n });\n }\n\n if (colorScale.type === 'quantile') {\n const range = getDiscreteNumericColors({\n scheme: colorScale.scheme,\n bins: colorScale.bins ?? DEFAULT_BIN_COUNT,\n reverse: colorScale.reverse,\n });\n const scale = scaleQuantile<string>()\n .domain(numericValues)\n .range(range) as unknown as NumericColorScale;\n\n return createContinuousAccessor({\n fieldName,\n vector,\n nullColor,\n colorForValue: scale,\n });\n }\n\n const thresholds = [...colorScale.thresholds].sort(\n (left, right) => left - right,\n );\n if (!thresholds.length) {\n throw new Error('Threshold colorScale requires at least one threshold.');\n }\n\n const range = getDiscreteNumericColors({\n scheme: colorScale.scheme,\n bins: thresholds.length + 1,\n reverse: colorScale.reverse,\n });\n const scale = scaleThreshold<number, string>()\n .domain(thresholds)\n .range(range) as unknown as NumericColorScale;\n\n return createContinuousAccessor({\n fieldName,\n vector,\n nullColor,\n colorForValue: (value) => scale(value) as string,\n });\n}\n\nexport function buildColorScaleLegend(options: {\n table: arrow.Table;\n colorScale: LayerColorScale;\n title?: string;\n}): ResolvedColorLegend | null {\n const {table, colorScale, title} = options;\n const {fieldName, vector} = getColumn(table, colorScale.field);\n const resolvedTitle = title && title.trim() ? title.trim() : fieldName;\n\n if (colorScale.type === 'categorical') {\n const baseRange = CATEGORICAL_SCHEMES[colorScale.scheme];\n const range = colorScale.reverse\n ? [...baseRange].reverse()\n : [...baseRange];\n const values = unique(\n Array.from({length: vector.length}, (_, index) =>\n vector.get(index),\n ).filter(\n (value): value is string | number | boolean =>\n value != null &&\n (typeof value === 'string' ||\n typeof value === 'number' ||\n typeof value === 'boolean'),\n ),\n );\n\n if (values.length === 0) {\n return null;\n }\n\n return {\n type: 'categorical',\n title: resolvedTitle,\n items: values.map((value, index) => ({\n label: String(value),\n color: parseColorString(range[index % range.length]!),\n })),\n };\n }\n\n const numericValues = getNumericValues(vector);\n if (numericValues.length === 0) {\n return null;\n }\n\n if (colorScale.type === 'sequential') {\n const interpolator = CONTINUOUS_SEQUENTIAL_SCHEMES[colorScale.scheme];\n const domain =\n colorScale.domain === 'auto'\n ? getSequentialDomain(numericValues)\n : colorScale.domain;\n const colorInterpolator = colorScale.reverse\n ? (t: number) => interpolator(1 - t)\n : interpolator;\n\n return {\n type: 'continuous',\n title: resolvedTitle,\n gradient: buildGradient(colorInterpolator),\n ticks: [\n {label: formatLegendNumber(domain[0]), offset: 0},\n {label: formatLegendNumber((domain[0] + domain[1]) / 2), offset: 50},\n {label: formatLegendNumber(domain[1]), offset: 100},\n ],\n };\n }\n\n if (colorScale.type === 'diverging') {\n const interpolator = CONTINUOUS_DIVERGING_SCHEMES[colorScale.scheme];\n const domain =\n colorScale.domain === 'auto'\n ? getDivergingDomain(numericValues)\n : colorScale.domain;\n const colorInterpolator = colorScale.reverse\n ? (t: number) => interpolator(1 - t)\n : interpolator;\n\n return {\n type: 'continuous',\n title: resolvedTitle,\n gradient: buildGradient(colorInterpolator),\n ticks: [\n {label: formatLegendNumber(domain[0]), offset: 0},\n {label: formatLegendNumber(domain[1]), offset: 50},\n {label: formatLegendNumber(domain[2]), offset: 100},\n ],\n };\n }\n\n if (colorScale.type === 'quantize') {\n const range = getDiscreteNumericColors({\n scheme: colorScale.scheme,\n bins: colorScale.bins ?? DEFAULT_BIN_COUNT,\n reverse: colorScale.reverse,\n });\n const domain =\n colorScale.domain === 'auto'\n ? getSequentialDomain(numericValues)\n : colorScale.domain;\n const scale = scaleQuantize<number, string>()\n .domain(domain)\n .range(range) as unknown as NumericColorScale;\n\n return {\n type: 'stepped',\n title: resolvedTitle,\n items: buildSteppedLegendItems(scale, range),\n };\n }\n\n if (colorScale.type === 'quantile') {\n const range = getDiscreteNumericColors({\n scheme: colorScale.scheme,\n bins: colorScale.bins ?? DEFAULT_BIN_COUNT,\n reverse: colorScale.reverse,\n });\n const scale = scaleQuantile<string>()\n .domain(numericValues)\n .range(range) as unknown as NumericColorScale;\n\n return {\n type: 'stepped',\n title: resolvedTitle,\n items: buildSteppedLegendItems(scale, range),\n };\n }\n\n const thresholds = [...colorScale.thresholds].sort(\n (left, right) => left - right,\n );\n if (!thresholds.length) {\n return null;\n }\n\n const range = getDiscreteNumericColors({\n scheme: colorScale.scheme,\n bins: thresholds.length + 1,\n reverse: colorScale.reverse,\n });\n const scale = scaleThreshold<number, string>()\n .domain(thresholds)\n .range(range) as unknown as NumericColorScale;\n\n return {\n type: 'stepped',\n title: resolvedTitle,\n items: buildSteppedLegendItems(scale, range),\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"compileColorScale.js","sourceRoot":"","sources":["../../src/json/compileColorScale.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n buildColorScaleLegend as buildGenericColorScaleLegend,\n coerceFiniteNumber,\n createColorScaleMapper,\n type ColorScaleConfig,\n type ResolvedColorLegend,\n} from '@sqlrooms/color-scales';\nimport type * as arrow from 'apache-arrow';\n\nfunction resolveFieldName(\n schemaOwner: arrow.Table | arrow.RecordBatch,\n requestedField: string,\n) {\n const exactMatch = schemaOwner.schema.fields.find(\n (field) => field.name === requestedField,\n )?.name;\n if (exactMatch) {\n return exactMatch;\n }\n\n const caseInsensitiveMatches = schemaOwner.schema.fields\n .map((field) => field.name)\n .filter(\n (fieldName) => fieldName.toLowerCase() === requestedField.toLowerCase(),\n );\n\n if (caseInsensitiveMatches.length === 1) {\n return caseInsensitiveMatches[0]!;\n }\n\n return undefined;\n}\n\nfunction getColumn(table: arrow.Table, field: string) {\n const resolvedFieldName = resolveFieldName(table, field);\n if (!resolvedFieldName) {\n throw new Error(`Unknown colorScale field \"${field}\".`);\n }\n\n const vector = table.getChild(resolvedFieldName);\n if (!vector) {\n throw new Error(`Unable to read colorScale field \"${resolvedFieldName}\".`);\n }\n\n return {\n fieldName: resolvedFieldName,\n vector,\n };\n}\n\nfunction getRowValue(row: unknown, fieldName: string) {\n if (!row || typeof row !== 'object') {\n return undefined;\n }\n\n const object = row as Record<string, unknown>;\n const sources = [\n object,\n object.properties as Record<string, unknown> | undefined,\n ].filter((value): value is Record<string, unknown> =>\n Boolean(value && typeof value === 'object'),\n );\n\n for (const source of sources) {\n if (fieldName in source) {\n return source[fieldName];\n }\n\n const caseInsensitiveMatches = Object.keys(source).filter(\n (key) => key.toLowerCase() === fieldName.toLowerCase(),\n );\n if (caseInsensitiveMatches.length === 1) {\n return source[caseInsensitiveMatches[0]!] as unknown;\n }\n }\n\n return undefined;\n}\n\nfunction getGeoArrowOrRowValue(options: {\n value: unknown;\n fieldName: string;\n vector: arrow.Vector;\n}) {\n const {value, fieldName, vector} = options;\n if (\n value &&\n typeof value === 'object' &&\n 'index' in value &&\n typeof (value as {index?: unknown}).index === 'number'\n ) {\n const objectInfo = value as {\n index: number;\n data?: {data?: arrow.Table | arrow.RecordBatch};\n };\n const batch = objectInfo.data?.data;\n const batchFieldName = batch\n ? resolveFieldName(batch, fieldName)\n : undefined;\n\n if (batch && batchFieldName) {\n return batch.getChild(batchFieldName)?.get(objectInfo.index);\n }\n\n return vector.get(objectInfo.index);\n }\n\n return getRowValue(value, fieldName);\n}\n\nfunction getColumnValues(vector: arrow.Vector) {\n return Array.from({length: vector.length}, (_, index) => vector.get(index));\n}\n\nexport function compileColorScale(options: {\n table: arrow.Table;\n colorScale: ColorScaleConfig;\n}) {\n const {table, colorScale} = options;\n const {fieldName, vector} = getColumn(table, colorScale.field);\n const mapper = createColorScaleMapper({\n colorScale,\n values: getColumnValues(vector),\n });\n\n return (value: unknown) =>\n mapper(getGeoArrowOrRowValue({value, fieldName, vector}));\n}\n\nexport function buildColorScaleLegend(options: {\n table: arrow.Table;\n colorScale: ColorScaleConfig;\n title?: string;\n}): ResolvedColorLegend | null {\n const {table, colorScale} = options;\n const {vector} = getColumn(table, colorScale.field);\n const values = getColumnValues(vector);\n\n if (\n colorScale.type !== 'categorical' &&\n values.every((value) => coerceFiniteNumber(value) === undefined)\n ) {\n return null;\n }\n\n return buildGenericColorScaleLegend({\n colorScale,\n values,\n title: options.title,\n });\n}\n"]}
|
|
@@ -8,4 +8,11 @@ export declare function compileGeoArrowAccessor(expression: string, table: arrow
|
|
|
8
8
|
};
|
|
9
9
|
target: number[];
|
|
10
10
|
}) => unknown;
|
|
11
|
+
export declare function isCompiledGeoArrowAccessor(value: unknown): value is (info: {
|
|
12
|
+
index: number;
|
|
13
|
+
data: {
|
|
14
|
+
data: unknown;
|
|
15
|
+
};
|
|
16
|
+
target: number[];
|
|
17
|
+
}) => unknown;
|
|
11
18
|
//# sourceMappingURL=compileGeoArrowAccessor.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compileGeoArrowAccessor.d.ts","sourceRoot":"","sources":["../../src/json/compileGeoArrowAccessor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,KAAK,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"compileGeoArrowAccessor.d.ts","sourceRoot":"","sources":["../../src/json/compileGeoArrowAccessor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,KAAK,MAAM,cAAc,CAAC;AA+H3C,wBAAgB,uBAAuB,CACrC,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,KAAK,CAAC,KAAK,8BAkCf;IACD,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE;QAAC,IAAI,EAAE;YAAC,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;SAAC,CAAA;KAAC,CAAC;IAC5D,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB,aAiBF;AAED,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,OAAO,GACb,KAAK,IAAI,CAAC,IAAI,EAAE;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE;QAAC,IAAI,EAAE,OAAO,CAAA;KAAC,CAAC;IACtB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB,KAAK,OAAO,CASZ"}
|