import axios from "axios";
|
|
let serverList = new Map();
|
export default {
|
data() {
|
return {
|
arcgis_front: '', // arcgisserver wfs属性前置字段
|
geoserver_front: '', // geoserver wfs属性前置字段
|
};
|
},
|
methods: {
|
// 判断是否是sgs服务
|
sgsServer(url = '') {
|
return url.indexOf("/SG") > -1 || url.indexOf("/sg") > -1 || url.indexOf("/SE") > -1
|
},
|
// 判断是否是arcgisserver服务
|
arcgisServer(url = '') {
|
return url.indexOf("/arcgis") > -1
|
},
|
// 判断是否是geoserver服务
|
geoServer(url = '') {
|
return url.indexOf("/geoserver") > -1
|
},
|
// 判断是否是gisserver服务
|
gisServer(url = '') {
|
return url.indexOf("/gisserver") > -1
|
},
|
// 获取完整的wfs请求路径
|
getWfsFullURL(urls, layer) {
|
if (
|
this.sgsServer(urls) &&
|
urls.indexOf("/Streamer.ashx") === -1
|
) {
|
urls += "/Streamer.ashx"
|
} else if (this.geoServer(urls)) {
|
let workArea = this.getGeoServerWorkArea(layer); //获取GeoServer工作区
|
if (urls.indexOf(workArea) === -1) {
|
urls += `/${workArea}/ows`
|
} else if (urls.indexOf("/ows") === -1) {
|
urls += "/ows"
|
}
|
}
|
return urls
|
},
|
checkURL(url) {
|
url = url.replaceAll('//', '/');
|
url = url.replace('http:/', 'http://');
|
url = url.replace('https:/', 'https://');
|
return url;
|
},
|
getWfsLayers(url) {
|
url = this.checkURL(url);
|
if (this.geoServer(url) && url.indexOf("/ows") === -1) {
|
url += "/ows";
|
}
|
if (serverList.has(url)) {
|
return new Promise(function (resolve) {
|
resolve({
|
layers: serverList.get(url)
|
});
|
})
|
} else {
|
let promise =
|
axios
|
.get(
|
url + "?request=GetCapabilities&service=WFS"
|
)
|
promise.then((data) => {
|
let xml = this.loadXML(data.data);
|
let layersDom = xml.getElementsByTagName("FeatureType");
|
if (!layersDom.length) {
|
layersDom = xml.getElementsByTagName("wfs:FeatureType");
|
}
|
let layers = [];
|
for (let i = 0; i < layersDom.length; i++) {
|
layers.push(layersDom[i].firstChild.innerHTML)
|
}
|
data.layers = layers;
|
serverList.set(url, layers);
|
})
|
.catch(() => {
|
console.log("获取Gisserver服务列表失败");
|
})
|
return promise;
|
}
|
},
|
getGisserverLayerList(url) {
|
url = this.checkURL(url);
|
if (serverList.has(url)) {
|
return new Promise(function (resolve) {
|
resolve({
|
layers: serverList.get(url)
|
});
|
})
|
} else {
|
let promise =
|
axios
|
.get(
|
url + "/FileManager/fmc/serviceList"
|
)
|
promise.then((data) => {
|
let servers = data.data && data.data.servers;
|
let layers = {}
|
if (servers) {
|
servers.forEach((item) => {
|
!layers[item.type] && (layers[item.type] = [])
|
layers[item.type].push({
|
label: item.title,
|
...item,
|
});
|
});
|
}
|
data.layers = layers;
|
serverList.set(url, layers);
|
})
|
.catch(() => {
|
console.log("获取Gisserver服务列表失败");
|
})
|
return promise;
|
}
|
},
|
/**
|
* 获取wfs属性字段
|
*/
|
confirmWfsAddress(url, layer) {
|
url = this.getWfsFullURL(url, layer)
|
|
if (this.arcgisServer(url)) {
|
this.getArcGISField(url); // 获取arcgisserver所必须的字段
|
}
|
|
if (this.geoServer(url)) {
|
let workArea = this.getGeoServerWorkArea(layer); //获取GeoServer工作区
|
this.geoserver_front = workArea + ':';
|
}
|
let searchUrl;
|
if (this.geoServer(url)) {
|
searchUrl =
|
url +
|
"?service=WFS&version=1.0.0&request=GetFeature&typeName=" +
|
layer +
|
"&maxFeatures=1&outputFormat=application%2Fjson";
|
} else if (this.arcgisServer(url)) {
|
searchUrl =
|
url +
|
"?" +
|
layer +
|
"?SERVICE=WFS&VERSION=1.1.0&REQUEST=DescribeFeatureType&VERSION=1.1.0";
|
} else {
|
searchUrl =
|
url +
|
"?" +
|
layer +
|
"?SERVICE=WFS&VERSION=1.1.0&REQUEST=DescribeFeatureType&VERSION=1.1.0&typeName=" +
|
layer;
|
}
|
return axios({
|
method: "get",
|
url: searchUrl,
|
}).then((data) => {
|
let xml = data.data;
|
//获取xml指定标签
|
let entities;
|
// arcgis
|
if (this.arcgis_front !== "") {
|
//加载XML
|
let xmlDoc = this.loadXML(xml);
|
entities = xmlDoc.getElementsByTagName("xs:element");
|
/**
|
* 获取标签属性值——字段名
|
* 排除第一项:图层名
|
*/
|
for (let i = 1; i < entities.length; i++) {
|
let attr = entities[i].getAttribute("name");
|
this.fields.push(attr);
|
}
|
} else if (this.geoserver_front !== "") { //geoserver
|
entities = xml.features[0].properties;
|
for (let attr in entities) {
|
this.fields.push(attr);
|
}
|
} else {
|
//加载XML
|
let xmlDoc = this.loadXML(xml);
|
entities = xmlDoc.getElementsByTagName("xsd:element");
|
/**
|
* 获取标签属性值——字段名
|
* 排除第一项:图层名
|
*/
|
for (let i = 1; i < entities.length; i++) {
|
let attr = entities[i].getAttribute("name");
|
this.fields.push(attr);
|
}
|
}
|
let fieldJSON = JSON.parse(JSON.stringify(this.fields));
|
return fieldJSON;
|
});
|
},
|
/**
|
* arcgis server的裁剪urls
|
*/
|
getArcGISField(url) {
|
let result = "";
|
let front = url.indexOf("services");
|
let end = url.indexOf("MapServer");
|
let addtional_string = url.substr(front + 9, end - 10 - front);
|
let string_arr = addtional_string.split("/");
|
for (let i = 0; i < string_arr.length; i++) {
|
result = result + string_arr[i];
|
if (i < string_arr.length - 1) {
|
result = result + "_";
|
}
|
}
|
result = result + ":";
|
this.arcgis_front = result;
|
return result;
|
},
|
/**
|
* GeoServer的裁剪layer
|
*/
|
getGeoServerWorkArea(layer) {
|
let layernameArr = layer.split(":");
|
return layernameArr[0];
|
},
|
|
/**
|
* 解析XML
|
* param {xmlString} xml字符串
|
*/
|
loadXML(xmlString) {
|
let xmlDoc = null;
|
if (!window.DOMParser && window.ActiveXObject) {
|
let xmlDomVersions = [
|
"MSXML.2.DOMDocument.6.0",
|
"MSXML.2.DOMDocument.3.0",
|
"Microsoft.XMLDOM",
|
];
|
for (var i = 0; i < xmlDomVersions.length; i++) {
|
try {
|
xmlDoc = new ActiveXObject(xmlDomVersions[i]);
|
xmlDoc.async = false;
|
xmlDoc.loadXML(xmlString); //loadXML方法载入xml字符串
|
break;
|
} catch (e) {
|
console.log(e, "出现异常");
|
}
|
}
|
} else if (
|
window.DOMParser &&
|
document.implementation &&
|
document.implementation.createDocument
|
) {
|
try {
|
let domParser = new DOMParser();
|
xmlDoc = domParser.parseFromString(xmlString, "text/xml");
|
} catch (e) {
|
console.log(e, "出现异常");
|
}
|
} else {
|
return null;
|
}
|
return xmlDoc;
|
},
|
},
|
};
|