superset-frontend/plugins/plugin-chart-cartodiagram/src/util/layerUtil.tsx (97 lines of code) (raw):
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/**
* Util for layer related operations.
*/
import OlParser from 'geostyler-openlayers-parser';
import TileLayer from 'ol/layer/Tile';
import TileWMS from 'ol/source/TileWMS';
import { bbox as bboxStrategy } from 'ol/loadingstrategy';
import VectorLayer from 'ol/layer/Vector';
import VectorSource from 'ol/source/Vector';
import XyzSource from 'ol/source/XYZ';
import GeoJSON from 'ol/format/GeoJSON';
import { WmsLayerConf, WfsLayerConf, LayerConf, XyzLayerConf } from '../types';
import { isWfsLayerConf, isWmsLayerConf, isXyzLayerConf } from '../typeguards';
import { isVersionBelow } from './serviceUtil';
/**
* Create a WMS layer.
*
* @param wmsLayerConf The layer configuration
*
* @returns The created WMS layer
*/
export const createWmsLayer = (wmsLayerConf: WmsLayerConf) => {
const { url, layersParam, version, attribution } = wmsLayerConf;
return new TileLayer({
source: new TileWMS({
url,
params: {
LAYERS: layersParam,
VERSION: version,
},
attributions: attribution,
}),
});
};
/**
* Create a XYZ layer.
*
* @param xyzLayerConf The layer configuration
*
* @returns The created XYZ layer
*/
export const createXyzLayer = (xyzLayerConf: XyzLayerConf) => {
const { url, attribution } = xyzLayerConf;
return new TileLayer({
source: new XyzSource({
url,
attributions: attribution,
}),
});
};
/**
* Create a WFS layer.
*
* @param wfsLayerConf The layer configuration
*
* @returns The created WFS layer
*/
export const createWfsLayer = async (wfsLayerConf: WfsLayerConf) => {
const {
url,
typeName,
maxFeatures,
version = '1.1.0',
style,
attribution,
} = wfsLayerConf;
const wfsSource = new VectorSource({
format: new GeoJSON(),
attributions: attribution,
url: extent => {
const requestUrl = new URL(url);
const params = requestUrl.searchParams;
params.append('service', 'wfs');
params.append('request', 'GetFeature');
params.append('outputFormat', 'application/json');
// TODO: make CRS configurable or take it from Ol Map
params.append('srsName', 'EPSG:3857');
params.append('version', version);
let typeNameQuery = 'typeNames';
if (isVersionBelow(version, '2.0.0', 'WFS')) {
typeNameQuery = 'typeName';
}
params.append(typeNameQuery, typeName);
params.append('bbox', extent.join(','));
if (maxFeatures) {
let maxFeaturesQuery = 'count';
if (isVersionBelow(version, '2.0.0', 'WFS')) {
maxFeaturesQuery = 'maxFeatures';
}
params.append(maxFeaturesQuery, maxFeatures.toString());
}
return requestUrl.toString();
},
strategy: bboxStrategy,
});
let writeStyleResult;
if (style) {
const olParser = new OlParser();
writeStyleResult = await olParser.writeStyle(style);
if (writeStyleResult.errors) {
console.warn('Could not create ol-style', writeStyleResult.errors);
return undefined;
}
}
return new VectorLayer({
source: wfsSource,
// @ts-ignore
style: writeStyleResult?.output,
});
};
/**
* Create a layer instance with the provided configuration.
*
* @param layerConf The layer configuration
*
* @returns The created layer
*/
export const createLayer = async (layerConf: LayerConf) => {
let layer;
if (isWmsLayerConf(layerConf)) {
layer = createWmsLayer(layerConf);
} else if (isWfsLayerConf(layerConf)) {
layer = await createWfsLayer(layerConf);
} else if (isXyzLayerConf(layerConf)) {
layer = createXyzLayer(layerConf);
} else {
console.warn('Provided layerconfig is not recognized');
}
return layer;
};