Browse Source

feat: 超图数据服务和地图服务不兼容时特殊处理

master_tdsql
caoqi 2 months ago
parent
commit
0222749d20
  1. 59
      src/api/aiSupervision/layerConfigApi.js
  2. 1
      src/views/aiSupervision/layerManage/resource/LayerDetails.vue
  3. 82
      src/views/reservoir/safeOperation/js/mapUtils.js

59
src/api/aiSupervision/layerConfigApi.js

@ -176,7 +176,8 @@ export function queryServiceInfoApi(url, layer) {
return new Promise(async (resolve, reject) => { return new Promise(async (resolve, reject) => {
const result = await axios.get(`${url}.json`); const result = await axios.get(`${url}.json`);
if (result.status === 200 && result.data) { if (result.status === 200 && result.data) {
const layerId = result.data.layers.find((f) => f.parentLayerId === -1)?.subLayerIds?.[0]; const layerId = result.data.layers.find((f) => f.parentLayerId === -1)
?.subLayerIds?.[0];
const data = await axios.get(`${url}/${layerId}?f=json`); const data = await axios.get(`${url}/${layerId}?f=json`);
if (data.status === 200 && data.data) { if (data.status === 200 && data.data) {
resolve(data.data); resolve(data.data);
@ -186,30 +187,58 @@ export function queryServiceInfoApi(url, layer) {
} }
case "081100": case "081100":
return new Promise(async (resolve, reject) => { return new Promise(async (resolve, reject) => {
// layer.name的规则:xxx;xxx:xxx
const name = layer.name; const name = layer.name;
const nameArr = name.split(":"); let nameArr = name.split(";");
const splitUrl = url?.split("/rest/")[0]; const splitUrl = url?.split("/rest/")[0];
const token = layer.token; const token = layer.token;
const newUrl = `${splitUrl.replace("/map-", "/data-")}/rest/data/datasources/${nameArr[0]}/datasets/${nameArr[1]}/fields.json?k=${token}`; if (nameArr.length === 1) {
const result = await axios.get(newUrl); const newUrl = `${splitUrl.replace(
if (result.status === 200 && result.data) { "/map-",
const fields = result.data.fieldNames.map((item) => { "/data-"
return { )}/rest/data/datasources/${nameArr[0]}/datasets/${
name: item, nameArr[1]
alias: item, }/fields.json?k=${token}`;
type: "-", const result = await axios.get(newUrl);
}; if (result.status === 200 && result.data) {
}); const fields = result.data.fieldNames.map((item) => {
resolve({ fields }); return {
name: item,
alias: item,
type: "-",
};
});
resolve({ fields });
}
} else if (nameArr.length === 2) {
let layerName = nameArr[1];
nameArr = layerName.split(":");
const newUrl = `${nameArr[1]}/rest/data/datasources/${nameArr[0]}/datasets/${nameArr[1]}/fields.json?k=${token}`;
const result = await axios.get(newUrl);
if (result.status === 200 && result.data) {
const fields = result.data.fieldNames.map((item) => {
return {
name: item,
alias: item,
type: "-",
};
});
resolve({ fields });
} else {
reject("请求失败");
}
} }
}); });
case "030300": case "030300":
return new Promise(async (resolve, reject) => { return new Promise(async (resolve, reject) => {
const result = await axios.get( const result = await axios.get(
`${url}?service=wfs&version=2.0.0&request=DescribeFeatureType&typeNames=${layer.index}`, `${url}?service=wfs&version=2.0.0&request=DescribeFeatureType&typeNames=${layer.index}`
); );
if (result.status === 200 && result.data) { if (result.status === 200 && result.data) {
const xmlDom = new window.DOMParser().parseFromString(result.data, "text/xml"); const xmlDom = new window.DOMParser().parseFromString(
result.data,
"text/xml"
);
const elements = xmlDom.getElementsByTagName("xs:element"); const elements = xmlDom.getElementsByTagName("xs:element");
let fields = []; let fields = [];
for (let i = 0; i < elements.length; i++) { for (let i = 0; i < elements.length; i++) {

1
src/views/aiSupervision/layerManage/resource/LayerDetails.vue

@ -48,6 +48,7 @@
prop="serviceName" prop="serviceName"
style="font-size: 1rem" style="font-size: 1rem"
:label-width="'120px'" :label-width="'120px'"
placeholder="服务名称由两部分构成:数据服务url(如/iserver/services/data-supermap_shuili/rest);服务名称(如namespace:layer1)"
> >
<el-input <el-input
v-model.trim="editDataInfoForm.serviceName" v-model.trim="editDataInfoForm.serviceName"

82
src/views/reservoir/safeOperation/js/mapUtils.js

@ -1,9 +1,16 @@
import axios from 'axios' import axios from "axios";
const identifyLayerActions = { const identifyLayerActions = {
'021102': async (params) => { "021102": async (params) => {
return new Promise(async (resolve, reject) => { return new Promise(async (resolve, reject) => {
const { url, input_geometry, geometry_type, layers = 'all', returnGeometry = false, tolerance = 1 } = params; const {
url,
input_geometry,
geometry_type,
layers = "all",
returnGeometry = false,
tolerance = 1,
} = params;
const result = await axios.get(`${url}.json`); const result = await axios.get(`${url}.json`);
if (result.status === 200 && result.data) { if (result.status === 200 && result.data) {
const { xmin, ymin, xmax, ymax } = result.data.fullExtent; const { xmin, ymin, xmax, ymax } = result.data.fullExtent;
@ -19,13 +26,29 @@ const identifyLayerActions = {
} }
}); });
}, },
'030300': async (params) => { "030300": async (params) => {
console.log(params); console.log(params);
}, },
'081100': async (params) => { "081100": async (params) => {
return new Promise(async (resolve, reject) => { return new Promise(async (resolve, reject) => {
const { queryMode, bufferDistance, geometry, url, layerTable, layerName, k } = params; const {
const queryUrl = url.split('maps/')[0].replace('map-', 'data-'); queryMode,
bufferDistance,
geometry,
url,
layerTable,
layerName,
k,
} = params;
// const queryUrl = url.split('maps/')[0].replace('map-', 'data-');
let queryUrl = "";
if (layerName.split(";").length == 1 && layerName.includes(":")) {
queryUrl = url.split("maps/")[0].replace("map-", "data-");
} else if (layerName.split(";").length == 2 && layerName.includes(":")) {
let dataServiceLayerInfo = layerName.split(";");
queryUrl = dataServiceLayerInfo[0];
layerName = dataServiceLayerInfo[1];
}
let requestUrl = `${queryUrl}data/featureResults.rjson?returnContent=true`; let requestUrl = `${queryUrl}data/featureResults.rjson?returnContent=true`;
if (k) { if (k) {
requestUrl += `&k=${k}`; requestUrl += `&k=${k}`;
@ -36,47 +59,46 @@ const identifyLayerActions = {
datasetNames: [layerTable || layerName], datasetNames: [layerTable || layerName],
getFeatureMode: queryMode, getFeatureMode: queryMode,
bufferDistance, bufferDistance,
geometry geometry,
}), }),
{ {
headers: { headers: {
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8' "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
} },
} }
); );
resolve(result); resolve(result);
}); });
} },
}; };
export const queryLayersByPos = (position, layerList = [], cb) => { export const queryLayersByPos = (position, layerList = [], cb) => {
const { lng, lat } = position; const { lng, lat } = position;
const layers = layerList const layers = layerList;
layers.forEach(async (layer) => { layers.forEach(async (layer) => {
const action = identifyLayerActions[layer.layerType]; const action = identifyLayerActions[layer.layerType];
switch (layer.layerType) { switch (layer.layerType) {
case '021102': { case "021102": {
const input_geometry = `${lng},${lat}`; const input_geometry = `${lng},${lat}`;
const geometry_type = 'esriGeometryPoint'; const geometry_type = "esriGeometryPoint";
const result = await action({ const result = await action({
input_geometry, input_geometry,
geometry_type, geometry_type,
url: layer.url url: layer.url,
}); });
let res; let res;
if (result?.results?.length > 0) { if (result?.results?.length > 0) {
res = result.results[0] res = result.results[0];
} }
if(cb) cb(res) if (cb) cb(res);
break; break;
} }
case '030300': case "030300":
break; break;
case '081100': { case "081100": {
const queryMode = 'BUFFER'; const queryMode = "BUFFER";
const bufferDistance = 0.0005; // 缓冲距离大概是50米 const bufferDistance = 0.0005; // 缓冲距离大概是50米
const spatialQueryMode = 'INTERSECT'; const spatialQueryMode = "INTERSECT";
const geometry = { const geometry = {
id: 0, id: 0,
style: null, style: null,
@ -84,17 +106,16 @@ export const queryLayersByPos = (position, layerList = [], cb) => {
points: [ points: [
{ {
x: lng, x: lng,
y: lat y: lat,
} },
], ],
type: 'POINT' type: "POINT",
}; };
let type = ''; let type = "";
let isSite = false; let isSite = false;
let layerTable = ''; let layerTable = "";
if (layer.extendData) { if (layer.extendData) {
const extendData = JSON.parse(layer.extendData); const extendData = JSON.parse(layer.extendData);
} }
const result = await action({ const result = await action({
queryMode, queryMode,
@ -104,11 +125,10 @@ export const queryLayersByPos = (position, layerList = [], cb) => {
layerName: layer.text, layerName: layer.text,
layerTable, layerTable,
url: layer.url, url: layer.url,
k: layer.serviceToken k: layer.serviceToken,
}); });
if ([200, 201].includes(result.status)) { if ([200, 201].includes(result.status)) {
console.log('处理业务数据 >>>>>> ', result) console.log("处理业务数据 >>>>>> ", result);
} }
break; break;
} }

Loading…
Cancel
Save