Skip to content

Commit cff12ba

Browse files
committed
[fix] WMS layer fixes 2
Signed-off-by: Ihor Dykhta <dikhta.igor@gmail.com>
1 parent b3f6ad4 commit cff12ba

14 files changed

Lines changed: 414 additions & 130 deletions

File tree

package.json

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

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/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
});

src/components/src/modals/tilesets-modals/common.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
// SPDX-License-Identifier: MIT
22
// Copyright contributors to the kepler.gl project
33

4+
import type {WMSCapabilities} from '@loaders.gl/wms';
5+
46
import type {VectorTileMetadata} from '@kepler.gl/table';
57
import type {StacTypes} from '@kepler.gl/types';
68

@@ -11,7 +13,7 @@ export type DatasetCreationAttributes = {
1113
};
1214

1315
export type MetaResponse = {
14-
metadata?: VectorTileMetadata | StacTypes.CompleteSTACObject | null;
16+
metadata?: VectorTileMetadata | StacTypes.CompleteSTACObject | WMSCapabilities | null;
1517
dataset?: DatasetCreationAttributes | null;
1618
loading?: boolean;
1719
error?: Error | null;

src/components/src/modals/tilesets-modals/load-tileset.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,6 @@ function LoadTilesetTabFactory() {
164164
</TilesetTypeContainer>
165165
<div>
166166
<CurrentForm setResponse={setResponse} />
167-
{error && <div>{getError(error)}</div>}
168167
</div>
169168
</div>
170169
<MetaContainer>

src/components/src/modals/tilesets-modals/tileset-wms-form.tsx

Lines changed: 30 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,12 @@
33

44
import React, {useCallback, useEffect, useState} from 'react';
55
import styled from 'styled-components';
6-
import {WMSCapabilities, WMSCapabilitiesLoader} from '@loaders.gl/wms';
7-
import {load} from '@loaders.gl/core';
6+
import {WMSCapabilities} from '@loaders.gl/wms';
7+
8+
import {validateUrl} from '@kepler.gl/common-utils';
9+
import {DatasetType, REMOTE_TILE, RemoteTileFormat, WMSDatasetMetadata} from '@kepler.gl/constants';
10+
import {getWMSCapabilities, wmsCapabilitiesToDatasetMetadata} from '@kepler.gl/table';
811

9-
import {DatasetType, REMOTE_TILE, RemoteTileFormat} from '@kepler.gl/constants';
1012
import {MetaResponse} from './common';
1113
import {InputLight} from '../../common';
1214

@@ -26,14 +28,18 @@ type WMSTileFormProps = {
2628
setResponse: (response: MetaResponse) => void;
2729
};
2830

31+
type WMSData = {
32+
metadata: WMSCapabilities | null;
33+
layers: WMSDatasetMetadata['layers'];
34+
version: string;
35+
};
36+
2937
const TilesetWMSForm: React.FC<WMSTileFormProps> = ({setResponse}) => {
3038
const [layerName, setLayerName] = useState<string>('');
3139
const [wmsUrl, setWmsUrl] = useState<string>('');
32-
const [metadata, setMetadata] = useState<any>(null);
3340
const [loading, setLoading] = useState<boolean>(false);
3441
const [error, setError] = useState<Error | null>(null);
35-
const [availableLayers, setAvailableLayers] = useState<{name: string; title: string}[]>([]);
36-
const [wmsVersion, setWmsVersion] = useState<string>('1.3.0');
42+
const [wmsData, setWMSData] = useState<WMSData | null>(null);
3743

3844
const onLayerNameChange = useCallback(
3945
(event: React.ChangeEvent<HTMLInputElement>) => {
@@ -49,48 +55,34 @@ const TilesetWMSForm: React.FC<WMSTileFormProps> = ({setResponse}) => {
4955
const newWmsUrl = event.target.value;
5056
setWmsUrl(newWmsUrl);
5157

58+
if (!validateUrl(newWmsUrl)) {
59+
setWMSData(null);
60+
return;
61+
}
62+
5263
// Fetch WMS GetCapabilities
5364
try {
5465
setLoading(true);
5566
setError(null);
56-
const data = (await load(
57-
`${newWmsUrl}?service=WMS&request=GetCapabilities`,
58-
WMSCapabilitiesLoader
59-
)) as WMSCapabilities;
67+
68+
const data = await getWMSCapabilities(newWmsUrl);
69+
70+
const datasetMetadata = wmsCapabilitiesToDatasetMetadata(data);
6071

6172
// Extract name or title from GetCapabilities response
6273
const serviceTitle = data?.title || data?.name;
6374
if (serviceTitle && !layerName) {
6475
setLayerName(serviceTitle);
6576
}
6677

67-
// Flatten layers if they are nested
68-
const layers = data.layers.flatMap(layer => {
69-
if (layer.layers && layer.layers.length > 0) {
70-
return layer.layers;
71-
}
72-
return layer;
78+
setWMSData({
79+
metadata: data,
80+
layers: datasetMetadata.layers,
81+
version: datasetMetadata.version
7382
});
74-
75-
if (Array.isArray(layers)) {
76-
const layerOptions = layers.map((layer: any) => ({
77-
name: layer.name,
78-
title: layer.title || layer.name,
79-
boundingBox: layer.geographicBoundingBox
80-
}));
81-
setAvailableLayers(layerOptions);
82-
} else {
83-
setAvailableLayers([]);
84-
}
85-
86-
// Set WMS version
87-
const version = data.version || '1.3.0';
88-
setWmsVersion(version);
89-
90-
setMetadata(data);
9183
} catch (err) {
9284
setError(err instanceof Error ? err : new Error('Unknown error'));
93-
setMetadata(null);
85+
setWMSData(null);
9486
} finally {
9587
setLoading(false);
9688
}
@@ -108,12 +100,12 @@ const TilesetWMSForm: React.FC<WMSTileFormProps> = ({setResponse}) => {
108100
remoteTileFormat: RemoteTileFormat.WMS,
109101
tilesetDataUrl: wmsUrl,
110102
tilesetMetadataUrl: `${wmsUrl}?service=WMS&request=GetCapabilities`,
111-
layers: availableLayers,
112-
wmsVersion: wmsVersion
103+
layers: wmsData?.layers || [],
104+
wmsVersion: wmsData?.version || '1.3.0'
113105
}
114106
};
115107
setResponse({
116-
metadata,
108+
metadata: wmsData?.metadata ?? null,
117109
dataset,
118110
loading,
119111
error
@@ -126,7 +118,7 @@ const TilesetWMSForm: React.FC<WMSTileFormProps> = ({setResponse}) => {
126118
error
127119
});
128120
}
129-
}, [setResponse, layerName, wmsUrl, metadata, loading, error, availableLayers, wmsVersion]);
121+
}, [setResponse, layerName, wmsUrl, wmsData, loading, error]);
130122

131123
return (
132124
<TilesetInputContainer>

src/components/src/side-panel/layer-panel/layer-configurator.tsx

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1032,14 +1032,10 @@ export default function LayerConfiguratorFactory(
10321032
}) {
10331033
return (
10341034
<StyledLayerVisualConfigurator>
1035-
<LayerConfigGroup label={'layer.wms'} collapsible>
1036-
<VisConfigSlider {...layer.visConfigSettings.opacity} {...visConfiguratorProps} />
1037-
<VisConfigSwitch
1038-
label={'layerVisConfigs.transparentBackground'}
1039-
{...layer.visConfigSettings.transparent}
1040-
{...visConfiguratorProps}
1041-
property="transparent"
1042-
/>
1035+
<LayerConfigGroup label={'layer.service'}>
1036+
<PanelLabel>
1037+
<FormattedMessage id={'layer.layer'} />
1038+
</PanelLabel>
10431039
<ItemSelector
10441040
selectedItems={layer.config.visConfig.wmsLayer}
10451041
options={layerChannelConfigProps.dataset.metadata.layers}
@@ -1067,6 +1063,15 @@ export default function LayerConfiguratorFactory(
10671063
}}
10681064
/>
10691065
</LayerConfigGroup>
1066+
<LayerConfigGroup label={'layer.appearance'}>
1067+
<VisConfigSlider {...layer.visConfigSettings.opacity} {...visConfiguratorProps} />
1068+
<VisConfigSwitch
1069+
label={'layerVisConfigs.transparentBackground'}
1070+
{...layer.visConfigSettings.transparent}
1071+
{...visConfiguratorProps}
1072+
property="transparent"
1073+
/>
1074+
</LayerConfigGroup>
10701075
</StyledLayerVisualConfigurator>
10711076
);
10721077
}

src/constants/src/dataset.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,3 +66,12 @@ export type RasterTileMetadataSourceType = {
6666
*/
6767
export type RasterTileDatasetMetadata = (RasterTileLocalMetadata | RasterTileRemoteMetadata) &
6868
RasterTileMetadataSourceType;
69+
70+
export type WMSDatasetMetadata = {
71+
type: typeof REMOTE_TILE;
72+
remoteTileFormat: RemoteTileFormat.WMS;
73+
tilesetDataUrl: string;
74+
tilesetMetadataUrl: string;
75+
version: string;
76+
layers: {name: string; title: string; boundingBox: number[] | null}[];
77+
};

src/deckgl-layers/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
"@kepler.gl/constants": "3.1.8",
3939
"@kepler.gl/types": "3.1.8",
4040
"@kepler.gl/utils": "3.1.8",
41+
"@loaders.gl/wms": "4.3.2",
4142
"@luma.gl/constants": "^8.5.20",
4243
"@luma.gl/core": "^8.5.20",
4344
"@mapbox/geo-viewport": "^0.4.1",

0 commit comments

Comments
 (0)