@geogirafe/lib-geoportal
Version:
GeoGirafe is a flexible application to build online geoportals.
63 lines (62 loc) • 3 kB
JavaScript
import StateManager from '../state/statemanager';
import LayerWms from '../../models/layers/layerwms';
import { WfsClientDefault, WfsClientGeoServer, WfsClientMapServer, WfsClientQgis } from './wfsclient';
import VendorSpecificOgcServerManager from '../vendorspecificogcservermanager';
export default class WfsManager extends VendorSpecificOgcServerManager {
get state() {
return this.stateManager.state;
}
getClientId(ogcServer) {
return ogcServer.urlWfs ?? '';
}
constructor(type) {
super(type);
Object.defineProperty(this, "stateManager", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
this.stateManager = StateManager.getInstance();
this.stateManager.subscribe(/layers\.layersList\..*\.filter/, (_oldFilter, newFilter) => {
this.onSelectedFeaturesFilterChange(newFilter);
});
// Register the default client
this.registerClientClass('default', WfsClientDefault);
this.registerClientClass('geoserver', WfsClientGeoServer);
this.registerClientClass('mapserver', WfsClientMapServer);
this.registerClientClass('qgisserver', WfsClientQgis);
}
async onSelectedFeaturesFilterChange(filter) {
this.state.loading = true;
const selectionParamsFilteredlayers = this.state.selection.selectionParameters.map((param) => param.clone((l) => l.wfsQueryable && l.filter === filter));
const filteredSelectionParams = selectionParamsFilteredlayers.filter((param) => param._layers.length > 0);
const filteredLayersId = filteredSelectionParams
.map((p) => p._layers.map((l) => l.queryLayers))
.flat()
.join(';');
// WFS GetFeature
const wfsPromises = filteredSelectionParams.map((param) => {
const client = this.getClient(param._ogcServer);
const features = client.getFeature(param);
return features;
});
const filteredSelectedFeatures = (await Promise.all(wfsPromises)).flat();
// keep only the selected features that are not in the filtered layers
const selectedFeatures = this.state.selection.selectedFeatures.filter((feature) => {
const id = feature.getId();
const featureId = id === undefined ? 'UNKNOWN' : `${id}`.split('.')[0];
return !filteredLayersId.includes(featureId);
});
// add the newly filtered selected features
selectedFeatures.push(...filteredSelectedFeatures);
this.state.selection.selectedFeatures = selectedFeatures;
this.state.interface.selectionComponentVisible = selectedFeatures.length !== 0;
this.state.loading = false;
}
async getServerWfs(object) {
const ogcServer = object instanceof LayerWms ? object.ogcServer : object;
const client = this.getClient(ogcServer);
return client.getServerWfs();
}
}