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; }, }, };