You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

141 lines
4.0 KiB

import axios from "axios";
const identifyLayerActions = {
"021102": async (params) => {
return new Promise(async (resolve, reject) => {
const {
url,
input_geometry,
geometry_type,
layers = "all",
returnGeometry = false,
tolerance = 1,
} = params;
const result = await axios.get(`${url}.json`);
if (result.status === 200 && result.data) {
const { xmin, ymin, xmax, ymax } = result.data.fullExtent;
const mapExtent = `${xmin},${ymin},${xmax},${ymax}`;
const data = await axios.get(
`${url}/identify?geometry=${input_geometry}&geometryType=${geometry_type}&layers=${layers}&returnGeometry=${returnGeometry}&mapExtent=${mapExtent}&imageDisplay=600,550,96&tolerance=${tolerance}&out_fields=*&f=json`
);
if (data.status === 200 && data.data) {
resolve(data.data);
} else {
resolve(null);
}
}
});
},
"030300": async (params) => {
console.log(params);
},
"081100": async (params) => {
return new Promise(async (resolve, reject) => {
2 months ago
let {
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`;
if (k) {
requestUrl += `&k=${k}`;
}
const result = await axios.post(
requestUrl,
JSON.stringify({
datasetNames: [layerTable || layerName],
getFeatureMode: queryMode,
bufferDistance,
geometry,
}),
{
headers: {
"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
},
}
);
resolve(result);
});
},
};
export const queryLayersByPos = (position, layerList = [], cb) => {
const { lng, lat } = position;
const layers = layerList;
layers.forEach(async (layer) => {
const action = identifyLayerActions[layer.layerType];
switch (layer.layerType) {
case "021102": {
const input_geometry = `${lng},${lat}`;
const geometry_type = "esriGeometryPoint";
const result = await action({
input_geometry,
geometry_type,
url: layer.url,
});
let res;
if (result?.results?.length > 0) {
res = result.results[0];
}
if (cb) cb(res);
break;
}
case "030300":
break;
case '081100': {
const queryMode = 'BUFFER';
// const bufferDistance = 0.0005; // 缓冲距离大概是50米
const bufferDistance = 0.5; // 缓冲距离大概是??米
const spatialQueryMode = 'INTERSECT';
const geometry = {
id: 0,
style: null,
parts: [1],
points: [
{
x: lng,
y: lat,
},
],
type: "POINT",
};
let type = "";
let isSite = false;
let layerTable = "";
if (layer.extendData) {
const extendData = JSON.parse(layer.extendData);
}
const result = await action({
queryMode,
spatialQueryMode,
bufferDistance,
geometry,
layerName: layer.text,
layerTable,
url: layer.url,
k: layer.serviceToken,
});
if ([200, 201].includes(result.status)) {
console.log("处理业务数据 >>>>>> ", result);
}
break;
}
default:
break;
}
});
};