import { MapGIS } from '../Base';
import { OGCService } from './OGCService';
import xml from 'fast-xml-parser';
import axios from 'axios';
import qs from 'qs';
/**
* @author 基础平台-潘卓然
* @class module:OGC服务.WFS
* @classdesc OGC服务类
* @description MapGIS.OGC.WFS
* @extends OGCService
* @link https://www.ogc.org/standards/wfs
* @param option - {Object} 属性键值对。<br>
* @param {String} [option.url = ""] 必选。服务url
* @param {String} [option.version = "1.1.1"] 请求的版本号,1.1.1或1.3.0,服务默认版本为1.1.1。(getWMSInfo,getFeatureInfo)
*/
class WFS extends OGCService {
constructor(option) {
var options = option || {};
super(options);
this.url = options.url;
this.featureTypes = [];
this.layers = [];
}
isBaseUrl() {
let valid = false;
const name = 'WFSServer';
const length = this.url.length;
const index = this.url.indexOf(name) + name.length;
let fullurl;
if (index === length) {
fullurl = `${this.url}?request=GetCapabilities&service=WFS`;
valid = true;
} else if (index === length - 1) {
fullurl = `${this.url}request=GetCapabilities&service=WFS`;
valid = true;
}
return valid;
}
setVersion(version) {
this.version = version;
return this;
}
setCrs(crs) {
this.srsname = crs;
return this;
}
setName(name) {
this.typename = name;
return this;
}
setOutputFormat(format) {
this.outputFormat = format;
}
async getCapabilities() {
const name = 'WFSServer';
const length = this.url.length;
const index = this.url.indexOf(name) + name.length;
let fullurl = this.url;
if (index === length) {
fullurl = `${this.url}?request=GetCapabilities&service=WFS`;
} else if (index === length - 1) {
fullurl = `${this.url}request=GetCapabilities&service=WFS`;
}
let res = await axios.get(fullurl);
let data = res.data;
let obj = xml.getTraversalObj(data, {});
let json = xml.convertToJson(obj, {});
let version = json['wfs:WFS_Capabilities']['ows:ServiceIdentification']['ows:ServiceTypeVersion'];
if (version === '1.1.0') {
// MapGIS 10.3.5 10.5.0
this.featureTypes = json['wfs:WFS_Capabilities']['FeatureTypeList']['FeatureType'];
let crs;
let name = '';
this.featureTypes.forEach((f, i) => {
if (i == 0) {
crs = f['DefaultSRS'];
name = `${f['Name']}`;
}
});
this.layers = this.featureTypes.map((f) => f['Name']);
this.setName(name).setCrs(crs).setVersion(version).setOutputFormat('text/xml; subtype=gml/3.2');
} else if (version === '2.0.0') {
let featureType = json['wfs:WFS_Capabilities']['wfs:FeatureTypeList']['wfs:FeatureType'];
let crs = featureType['wfs:DefaultCRS'];
let name = featureType['wfs:Name'];
this.setName(name).setCrs(crs).setVersion(version);
}
return json;
}
async getFeature() {
const name = 'WFSServer';
const length = this.url.length;
const index = this.url.indexOf(name) + name.length;
let fullurl = this.url;
let { maxFeatures = 100, version = '1.1.0', typename = '', outputFormat, srsname = 'EPSG:4326', bbox } = this;
let object = {
service: 'WFS',
request: 'GetFeature',
version,
typename,
outputFormat,
srsname,
maxFeatures
};
if (version === '1.1.0') {
if (bbox) {
object = Object.assign(object, { bbox: `${bbox},${srsname}` });
} else {
object = object;
}
} else if (version === '2.0.0') {
object = Object.assign(object, { Envelope: `${bbox},${srsname}`});
}
if (index === length) {
fullurl = `${this.url}?${qs.stringify(object)}`;
} else if (index === length - 1) {
fullurl = `${this.url}${qs.stringify(object)}`;
}
let res = await axios.get(fullurl);
let data = res.data;
let obj = xml.getTraversalObj(data, {});
let json = xml.convertToJson(obj, {});
let result = {
geojson: undefined,
xml: json
};
let geojson;
switch (version) {
case '1.1.0':
geojson = convert
break;
case '2.0.0':
break;
}
return result;
}
}
export { WFS };
MapGIS.OGC.WFS = WFS;