Skip to content

Commit 24639f6

Browse files
committed
Merge branch 'master' into igr/duckdb-demo-branch
2 parents 55a42a4 + 7551f5d commit 24639f6

44 files changed

Lines changed: 2607 additions & 93 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -236,6 +236,7 @@
236236
"@loaders.gl/gis": "4.3.2",
237237
"@loaders.gl/schema": "4.3.2",
238238
"@loaders.gl/wkt": "4.3.2",
239+
"@loaders.gl/wms": "4.3.2",
239240
"@luma.gl/constants": "8.5.21",
240241
"@luma.gl/core": "8.5.21",
241242
"@luma.gl/experimental": "8.5.21",

src/actions/src/action-types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,7 @@ export const ActionTypes = {
148148
REMOVE_NOTIFICATION: `${ACTION_PREFIX}REMOVE_NOTIFICATION`,
149149
SET_LOCALE: `${ACTION_PREFIX}SET_LOCALE`,
150150
LAYER_FILTERED_ITEMS_CHANGE: `${ACTION_PREFIX}LAYER_FILTERED_ITEMS_CHANGE`,
151+
WMS_FEATURE_INFO: `${ACTION_PREFIX}WMS_FEATURE_INFO`,
151152
SYNC_TIME_FILTER_WITH_LAYER_TIMELINE: `${ACTION_PREFIX}SYNC_TIME_FILTER_WITH_LAYER_TIMELINE`,
152153
SYNC_TIME_FILTER_TIMELINE_MODE: `${ACTION_PREFIX}SYNC_TIME_FILTER_TIMELINE_MODE`,
153154
TOGGLE_PANEL_LIST_VIEW: `${ACTION_PREFIX}TOGGLE_PANEL_LIST_VIEW`,

src/actions/src/vis-state-actions.ts

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1629,6 +1629,33 @@ export function layerFilteredItemsChange(
16291629
};
16301630
}
16311631

1632+
export type WMSFeatureInfoAction = {
1633+
layer: Layer;
1634+
featureInfo: Array<{name: string; value: string}> | string | null;
1635+
coordinate?: [number, number] | null;
1636+
};
1637+
1638+
/**
1639+
* WMS layer feature info callback
1640+
* @memberof visStateActions
1641+
* @param layer
1642+
* @param featureInfo
1643+
* @param coordinate
1644+
* @return action
1645+
*/
1646+
export function wmsFeatureInfo(
1647+
layer: WMSFeatureInfoAction['layer'],
1648+
featureInfo: WMSFeatureInfoAction['featureInfo'],
1649+
coordinate?: WMSFeatureInfoAction['coordinate']
1650+
): Merge<WMSFeatureInfoAction, {type: typeof ActionTypes.WMS_FEATURE_INFO}> {
1651+
return {
1652+
type: ActionTypes.WMS_FEATURE_INFO,
1653+
layer,
1654+
featureInfo,
1655+
coordinate
1656+
};
1657+
}
1658+
16321659
export type SyncTimeFilterWithLayerTimelineAction = {
16331660
idx: number;
16341661
enable: boolean;

src/ai-assistant/src/components/ai-assistant-config.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import {
1616
} from '@kepler.gl/components';
1717
import {State} from '../index';
1818
import ApiKey from '../icons/api-key';
19-
import PROVIDER_MODELS from '../config/models.json';
19+
import {PROVIDER_MODELS} from '../config/models';
2020
import {useLocalStorage} from 'usehooks-ts';
2121
import {GetAssistantModelByProvider} from '@openassistant/core';
2222
import {updateAiAssistantConfig} from '../actions';
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
{
1+
export const PROVIDER_MODELS = {
22
"openai": [
33
"gpt-4.1",
44
"gpt-4o",
@@ -27,4 +27,4 @@
2727
],
2828
"xai": ["grok-3", "grok-3-fast", "grok-3-mini", "grok-3-mini-fast"],
2929
"ollama": ["deepseek-r1", "gemma3", "llama4", "llama3.3", "mistral", "phi4", "qwen3", "qwen2.5"]
30-
}
30+
};

src/components/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@
5454
"@kepler.gl/utils": "3.1.8",
5555
"@loaders.gl/mvt": "^4.3.2",
5656
"@loaders.gl/pmtiles": "^4.3.2",
57+
"@loaders.gl/wms": "4.3.2",
5758
"@mapbox/mapbox-sdk": "^0.15.3",
5859
"@nebula.gl/edit-modes": "1.0.2-alpha.1",
5960
"@tippyjs/react": "^4.2.0",

src/components/src/common/loading-spinner.tsx

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,15 +17,14 @@ const animationName = keyframes`
1717

1818
const Loader = styled.span`
1919
border-left-color: ${props => props.color || props.theme.primaryBtnBgd};
20-
animation: _preloader_spin_ 500ms linear infinite;
2120
border-radius: 50%;
2221
border-top-color: transparent;
2322
border-bottom-color: transparent;
2423
border-right-color: transparent;
2524
cursor: wait;
2625
border-style: solid;
2726
display: block;
28-
animation-name: ${animationName};
27+
animation: ${animationName} 500ms linear infinite;
2928
}`;
3029

3130
export type LoadingWrapperProps = BaseComponentProps & {

src/components/src/map-container.tsx

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -526,6 +526,20 @@ export default function MapContainerFactory(
526526
this.props.visStateActions.layerFilteredItemsChange(this.props.visState.layers[idx], event);
527527
};
528528

529+
_onWMSFeatureInfo = (
530+
idx: number,
531+
data: {
532+
featureInfo: Array<{name: string; value: string}> | string | null;
533+
coordinate?: [number, number] | null;
534+
}
535+
) => {
536+
this.props.visStateActions.wmsFeatureInfo(
537+
this.props.visState.layers[idx],
538+
data.featureInfo,
539+
data.coordinate
540+
);
541+
};
542+
529543
_handleMapToggleLayer = layerId => {
530544
const {index: mapIndex = 0, visStateActions} = this.props;
531545
visStateActions.toggleLayerForMap(mapIndex, layerId);
@@ -823,7 +837,8 @@ export default function MapContainerFactory(
823837
{
824838
onLayerHover: this._onLayerHover,
825839
onSetLayerDomain: this._onLayerSetDomain,
826-
onFilteredItemsChange: this._onLayerFilteredItemsChange
840+
onFilteredItemsChange: this._onLayerFilteredItemsChange,
841+
onWMSFeatureInfo: this._onWMSFeatureInfo
827842
},
828843
deckGlProps
829844
);

src/components/src/map/layer-hover-info.tsx

Lines changed: 38 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -138,22 +138,37 @@ const EntryInfoRow: React.FC<EntryInfoRowProps> = ({
138138
const field = fields[fieldIdx];
139139
const fieldValueAccessor = layer.accessVSFieldValue(field, currentTime);
140140
const value = fieldValueAccessor(field, data instanceof DataRow ? {index: data._rowIndex} : data);
141-
const primaryValue = primaryData
142-
? fieldValueAccessor(
143-
field,
144-
primaryData instanceof DataRow ? {index: primaryData._rowIndex} : primaryData
145-
)
146-
: null;
147-
const displayValue = getTooltipDisplayValue({item, field, value});
148141

149-
const displayDeltaValue = primaryData
150-
? getTooltipDisplayDeltaValue({
151-
field,
152-
value,
153-
primaryValue,
154-
compareType
155-
})
156-
: null;
142+
// Handle WMS layer data in comparison mode - WMS layers don't have comparable field data
143+
let primaryValue = null;
144+
let displayDeltaValue: string | null = null;
145+
146+
if (primaryData) {
147+
try {
148+
// Only calculate primary value if primaryData has a compatible structure
149+
if (
150+
primaryData instanceof DataRow ||
151+
(primaryData && typeof primaryData === 'object' && 'index' in primaryData)
152+
) {
153+
primaryValue = fieldValueAccessor(
154+
field,
155+
primaryData instanceof DataRow ? {index: primaryData._rowIndex} : primaryData
156+
);
157+
158+
displayDeltaValue = getTooltipDisplayDeltaValue({
159+
field,
160+
value,
161+
primaryValue,
162+
compareType
163+
});
164+
}
165+
} catch (error) {
166+
// If there's an error accessing primaryData (e.g., WMS layer data), skip comparison
167+
primaryValue = null;
168+
}
169+
}
170+
171+
const displayValue = getTooltipDisplayValue({item, field, value});
157172

158173
return (
159174
<Row
@@ -236,6 +251,7 @@ const LayerHoverInfoFactory = () => {
236251

237252
const hasFieldsToShow =
238253
(data.fieldValues && Object.keys(data.fieldValues).length > 0) ||
254+
(data.wmsFeatureData && data.wmsFeatureData.length > 0) ||
239255
(props.fieldsToShow && props.fieldsToShow.length > 0);
240256

241257
return (
@@ -246,7 +262,13 @@ const LayerHoverInfoFactory = () => {
246262
</StyledLayerName>
247263
{hasFieldsToShow && <StyledDivider />}
248264
<StyledTable>
249-
{data.fieldValues ? (
265+
{data.wmsFeatureData ? (
266+
<tbody>
267+
{data.wmsFeatureData.map(({name, value}, i) => (
268+
<Row key={i} name={name} value={value} />
269+
))}
270+
</tbody>
271+
) : data.fieldValues ? (
250272
<tbody>
251273
{data.fieldValues.map(({labelMessage, value}, i) => (
252274
<Row key={i} name={intl.formatMessage({id: labelMessage})} value={value} />

src/components/src/modals/export-data-modal.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,8 @@ const ExportDataModalFactory = () => {
9494
const showTiledDatasetWarning = Object.keys(datasets).some(datasetId => {
9595
return (
9696
(datasets[datasetId].type === DatasetType.VECTOR_TILE ||
97-
datasets[datasetId].type === DatasetType.RASTER_TILE) &&
97+
datasets[datasetId].type === DatasetType.RASTER_TILE ||
98+
datasets[datasetId].type === DatasetType.WMS_TILE) &&
9899
(selectedDataset === datasetId || exportAllDatasets)
99100
);
100101
});

0 commit comments

Comments
 (0)