kepler.gl
Version:
kepler.gl is a webgl based application to visualize large scale location data in the browser
477 lines (421 loc) • 11.1 kB
TypeScript
// SPDX-License-Identifier: MIT
// Copyright contributors to the kepler.gl project
import {HexColor, RGBColor, RGBAColor} from './types';
export type LayerBaseConfig = {
dataId: string;
label: string;
color: RGBColor;
columns: LayerColumns;
isVisible: boolean;
isConfigActive: boolean;
highlightColor: RGBColor | RGBAColor;
hidden: boolean;
visConfig: LayerVisConfig;
textLabel: LayerTextLabel[];
colorUI: {
color: ColorUI;
colorRange: ColorUI;
};
animation: {
enabled: boolean;
domain?: [number, number] | null;
};
// for aggregate layer, aggregatedBins is returned for custom color scale
aggregatedBins?: AggregatedBin[];
columnMode?: string;
heightField?: VisualChannelField;
heightDomain?: VisualChannelDomain;
heightScale?: string;
};
/**
* Used to configure geospatial data source columns like Longitude, Latitude, Geojson.
*/
export type LayerColumn = {value: string | null; fieldIdx: number; optional?: boolean};
export type LayerConfigColumn = LayerColumn;
export type LayerColumns = {
[key: string]: LayerConfigColumn;
};
export type ColumnPair = {
pair: string | string[];
fieldPairKey: string | string[];
};
export type ColumnPairs = {[key: string]: ColumnPair};
export type ColumnLabels = {
[key: string]: string;
};
export type EnhancedFieldPair = {
name: string;
type: 'point';
pair: FieldPair['pair'];
};
export type SupportedColumnMode = {
key: string;
label: string;
requiredColumns: string[];
optionalColumns?: string[];
hasHelp?: boolean;
verifyField?: (field: Field) => boolean;
};
export type VisualChannelField = Field | null;
export type VisualChannelScale = keyof typeof SCALE_TYPES;
export type LayerColorConfig = {
colorField: VisualChannelField;
colorDomain: VisualChannelDomain;
colorScale: VisualChannelScale;
};
export type LayerSizeConfig = {
// color by size, domain is set by filters, field, scale type
sizeDomain: VisualChannelDomain;
sizeScale: VisualChannelScale;
sizeField: VisualChannelField;
};
export type LayerHeightConfig = {
heightField: VisualChannelField;
heightDomain: VisualChannelDomain;
heightScale: VisualChannelScale;
};
export type LayerStrokeColorConfig = {
strokeColorField: VisualChannelField;
strokeColorDomain: VisualChannelDomain;
strokeColorScale: VisualChannelScale;
};
export type LayerCoverageConfig = {
coverageField: VisualChannelField;
coverageDomain: VisualChannelDomain;
coverageScale: VisualChannelScale;
};
export type LayerRadiusConfig = {
radiusField: VisualChannelField;
radiusDomain: VisualChannelDomain;
radiusScale: VisualChannelScale;
};
export type LayerWeightConfig = {
weightField: VisualChannelField;
};
export type IndexBy = {
format: string;
type: string;
mappedValue: Record<number, string>;
timeDomain: {
domain: [number, number];
timeSteps: number[];
duration?: number;
};
};
export type Field = {
name: string;
displayName: string;
type: string;
fieldIdx: number;
valueAccessor(v: {index: number}): any;
analyzerType?: string;
id?: string;
format: string;
filterProps?: FilterProps;
metadata?: Record<string, any>;
displayFormat?: string;
isLoadingStats?: boolean;
indexBy?: IndexBy;
};
export type FieldPair = {
defaultName: string;
pair: {
lat: {
fieldIdx: number;
value: string;
};
lng: {
fieldIdx: number;
value: string;
};
altitude?: {
fieldIdx: number;
value: string;
};
};
suffix: string[];
};
export type SizeRange = [number, number];
export type LayerTextLabel = {
field: Field | null;
color: RGBColor;
background: boolean;
size: number;
offset: [number, number];
anchor: string;
alignment: string;
outlineWidth: number;
outlineColor: RGBAColor;
backgroundColor: RGBAColor;
};
export type ColorRangeConfig = {
type: string;
steps: number;
reversed: boolean;
custom: boolean;
customBreaks: boolean;
colorBlindSafe: boolean;
};
export type ColorMap = [string[] | number[] | string | number | null, HexColor][];
// Key is HexColor but as key we can use only string
export type ColorLegends = {[key: HexColor]: string};
export type ColorRange = {
name?: string;
type?: string;
category?: string;
colors: HexColor[];
reversed?: boolean;
colorMap?: ColorMap | null;
colorLegends?: ColorLegends;
};
export type MiniColorRange = {
name: string;
type: string;
category: string;
colors: HexColor[];
};
export type ColorUI = {
// customPalette in edit
customPalette: ColorRange;
// show color sketcher modal
showSketcher: boolean | number;
// show color range selection panel
showDropdown: boolean | number;
// show color scale chart
showColorChart: boolean;
// color range selector config
colorRangeConfig: ColorRangeConfig;
};
export type VisConfig = {
label:
| string
| ((
config: LayerBaseConfig &
Partial<LayerColorConfig> &
Partial<LayerHeightConfig> &
Partial<LayerSizeConfig> &
Partial<LayerWeightConfig>
) => string);
group: keyof typeof PROPERTY_GROUPS;
property: string;
description?: string;
condition?: (
config: LayerBaseConfig &
Partial<LayerColorConfig> &
Partial<LayerHeightConfig> &
Partial<LayerSizeConfig> &
Partial<LayerWeightConfig>
) => boolean;
allowCustomValue?: boolean;
};
export type VisConfigNumber = VisConfig & {
type: 'number';
isRanged: false;
defaultValue: number;
range: SizeRange;
step: number;
};
export type VisConfigBoolean = VisConfig & {
type: 'boolean';
defaultValue: boolean;
};
export type VisConfigSelection = VisConfig & {
type: 'select';
defaultValue: string;
options: string[];
};
export type VisConfigRange = VisConfig & {
type: 'number';
isRanged: boolean;
range: SizeRange;
defaultValue: SizeRange;
step: number;
};
export type VisConfigColorSelect = VisConfig & {
type: 'color-select';
defaultValue: null;
};
export type VisConfigColorRange = VisConfig & {
type: 'color-range-select';
defaultValue: ColorRange;
};
export type LayerVisConfigSettings = {
thickness: VisConfigNumber;
strokeWidthRange: VisConfigRange;
trailLength: VisConfigNumber;
fadeTrail: VisConfigBoolean;
billboard: VisConfigBoolean;
radius: VisConfigNumber;
fixedRadius: VisConfigBoolean;
radiusRange: VisConfigRange;
clusterRadius: VisConfigNumber;
clusterRadiusRange: VisConfigRange;
opacity: VisConfigNumber;
coverage: VisConfigNumber;
outline: VisConfigBoolean;
colorRange: VisConfigColorRange;
strokeColorRange: VisConfigColorRange;
targetColor: VisConfigColorSelect;
strokeColor: VisConfigColorSelect;
colorAggregation: VisConfigSelection;
sizeAggregation: VisConfigSelection;
percentile: VisConfigRange;
elevationPercentile: VisConfigRange;
resolution: VisConfigNumber;
sizeScale: VisConfigNumber;
angle: VisConfigNumber;
worldUnitSize: VisConfigNumber;
elevationScale: VisConfigNumber;
enableElevationZoomFactor: VisConfigBoolean;
elevationRange: VisConfigRange;
heightRange: VisConfigRange;
coverageRange: VisConfigRange;
'hi-precision': VisConfigBoolean;
enable3d: VisConfigBoolean;
stroked: VisConfigBoolean;
filled: VisConfigBoolean;
extruded: VisConfigBoolean;
wireframe: VisConfigBoolean;
weight: VisConfigNumber;
heatmapRadius: VisConfigNumber;
darkBaseMapEnabled: VisConfigBoolean;
fixedHeight: VisConfigBoolean;
allowHover: VisConfigBoolean;
showNeighborOnHover: VisConfigBoolean;
showHighlightColor: VisConfigBoolean;
};
// TODO: Move this to individual layers
export type LayerVisConfig = {
[key: string]: any;
// possible visConfigs
// thickness: number;
// sizeRange: number;
// trailLength: number;
// radius: number;
// fixedRadius: boolean;
// radiusRange: [number, number];
// clusterRadius: number;
// opacity: number;
// coverage: number;
// outline: boolean;
// colorRange: ColorRange;
// strokeColorRange: ColorRange;
// targetColor: any;
// strokeColor: any;
// colorAggregation: keyof typeof AGGREGATION_TYPES;
// sizeAggregation: keyof typeof AGGREGATION_TYPES;
// percentile: [number, number];
// elevationPercentile: [number, number];
// resolution: number;
// sizeScale: number;
// angle: number;
// worldUnitSize: number;
// elevationScale: number;
// enableElevationZoomFactor: boolean;
// heightRange: [number, number];
// coverageRange: [number, number];
// 'hi-precision': boolean;
// enable3d: boolean;
// stroked: boolean;
// filled: boolean;
// extruded: boolean;
// wireframe: boolean;
// weight: number;
// scenegraph: VisConfig;
};
export type TextConfigSelect = {
type: 'select';
options: string[];
multiSelect: boolean;
searchable: boolean;
};
export type TextConfigNumber = {
type: 'number';
range: number[];
value0: number;
step: number;
isRanged: boolean;
label: string;
showInput: boolean;
};
export type LayerTextConfig = {
fontSize: TextConfigNumber;
outlineWidth: TextConfigNumber;
textAnchor: TextConfigSelect;
textAlignment: TextConfigSelect;
};
export type LayerCallbacks = {
onLayerHover?: (idx: number, value: any) => void;
onSetLayerDomain?: (idx: number, value: any) => void;
onFilteredItemsChange?: (
idx: number,
event: {
id: string;
count: number;
}
) => void;
};
export type BindedLayerCallbacks = {
onLayerHover?: (value: any) => void;
onSetLayerDomain?: (value: any) => void;
onFilteredItemsChange?: (event: {id: string; count: number}) => void;
};
export type VisualChannelAggregation = 'colorAggregation' | 'sizeAggregation';
export type SupportedFieldTypes =
| 'boolean'
| 'date'
| 'geojson'
| 'integer'
| 'real'
| 'string'
| 'timestamp'
| 'point'
| 'array'
| 'object'
| 'geoarrow'
| 'h3';
export type VisualChannel = {
property: string;
field: string;
scale: string;
domain: string;
range: string;
key: string;
channelScaleType: string;
nullValue?: any;
defaultMeasure?: any;
accessor?: string;
condition?: (config: any) => boolean;
defaultValue?: ((config: any) => any) | any;
getAttributeValue?: (config: any) => (d: any) => any;
// TODO: define fixed
fixed?: any;
supportedFieldTypes?: Array<SupportedFieldTypes>;
aggregation?: VisualChannelAggregation;
};
export type VisualChannels = {[key: string]: VisualChannel};
export interface KeplerLayer {
id: string;
meta: Record<string, any>;
visConfigSettings: {
[key: string]: ValueOf<LayerVisConfigSettings>;
};
config: LayerBaseConfig;
get type(): string | null;
get supportedDatasetTypes(): string[] | null;
getColorScale(
colorScale: string,
colorDomain: VisualChannelDomain,
colorRange: ColorRange
): GetVisChannelScaleReturnType;
}
export type VisualChannelDomain = number[] | string[];
export type GetVisChannelScaleReturnType = {
(z: number): any;
byZoom?: boolean;
} | null;
export type AggregatedBin = {
i: number;
value: number;
counts: number;
};