Browse Source

feat(水利工程场景): 对接地图模块的相关地图事件

sy-water-data-board-ui
chenhaojie 1 year ago
parent
commit
b26cc05a8c
  1. 25409
      public/lib/sycim.min.js
  2. 17
      src/views/aiSupervision/waterSetting/runScene/detail/index.vue
  3. 109
      src/views/aiSupervision/waterSetting/runScene/detail/sceneConfig.vue
  4. 225
      src/views/aiSupervision/waterSetting/runScene/layerTree/index.js
  5. 37
      src/views/aiSupervision/waterSetting/runScene/layerTree/index.vue
  6. 12
      vue.config.js

25409
public/lib/sycim.min.js

File diff suppressed because one or more lines are too long

17
src/views/aiSupervision/waterSetting/runScene/detail/index.vue

@ -9,7 +9,7 @@ import {
updateSceneLayerDirs updateSceneLayerDirs
} from '@/api/aiSupervision/layerConfigApi'; } from '@/api/aiSupervision/layerConfigApi';
import { deepClone } from '@/utils'; import { deepClone } from '@/utils';
import LayerTree from './layerTree.vue'; import LayerTree from '../layerTree/index.vue';
export default { export default {
name: 'RunSceneDetail', name: 'RunSceneDetail',
@ -100,7 +100,10 @@ export default {
this.$router.back(); this.$router.back();
}, },
viewDetail(item) { viewDetail(item) {
console.log(item); this.$router.push({
path: 'resourceDetails',
query: { id: item.id }
});
}, },
deleteItem(item) { deleteItem(item) {
MessageBox.confirm(`是否要删除图层“${item.name}`, '删除提示', { MessageBox.confirm(`是否要删除图层“${item.name}`, '删除提示', {
@ -208,6 +211,9 @@ export default {
this.closeDialog(); this.closeDialog();
} }
}); });
},
setCheckedKeys(keys) {
this.checkedKeys = keys;
} }
} }
}; };
@ -288,7 +294,12 @@ export default {
</div> </div>
</el-tab-pane> </el-tab-pane>
<el-tab-pane label="项目场景初始化配置" name="scene"> <el-tab-pane label="项目场景初始化配置" name="scene">
<scene-config ref="sceneConfig" :default-checked-keys="checkedKeys" :scene-id="currentItem.id"></scene-config> <scene-config
ref="sceneConfig"
:default-checked-keys="checkedKeys"
:scene-id="currentItem.id"
@set-checked-keys="setCheckedKeys"
></scene-config>
</el-tab-pane> </el-tab-pane>
</el-tabs> </el-tabs>
</div> </div>

109
src/views/aiSupervision/waterSetting/runScene/detail/sceneConfig.vue

@ -1,7 +1,8 @@
<script> <script>
import { getCanvasImageAndViewPoint } from '@/utils'; import { getCanvasImageAndViewPoint } from '@/utils';
import { getSceneConfig, getLayerTreeBySceneId, updateSceneConfig } from '@/api/aiSupervision/layerConfigApi'; import { getSceneConfig, getLayerTreeBySceneId, updateSceneConfig } from '@/api/aiSupervision/layerConfigApi';
import LayerTree from './layerTree.vue'; import LayerTree from '../layerTree/index.vue';
import { addLayer, removeLayer, zoomToLayer } from '../layerTree/index.js';
let viewer = undefined; let viewer = undefined;
export default { export default {
@ -25,7 +26,7 @@ export default {
viewForm: { image: '', lng: '', lat: '', alt: '', heading: '', pitch: '', roll: '' }, viewForm: { image: '', lng: '', lat: '', alt: '', heading: '', pitch: '', roll: '' },
initForm: { initForm: {
initTime: '', initTime: '',
initWeather: '1', initWeather: 1,
ambientLightIntensity: '', ambientLightIntensity: '',
weatherIntensity: '', weatherIntensity: '',
movementSensitivity: '', movementSensitivity: '',
@ -64,7 +65,10 @@ export default {
weatherIntensity, weatherIntensity,
movementSensitivity, movementSensitivity,
rotationSensitivity, rotationSensitivity,
zoomSensitivity zoomSensitivity,
cameraPosture,
viewImg,
layerId
} = res.data; } = res.data;
this.initForm.initTime = initTime; this.initForm.initTime = initTime;
this.initForm.initWeather = initWeather; this.initForm.initWeather = initWeather;
@ -73,14 +77,24 @@ export default {
this.initForm.movementSensitivity = movementSensitivity; this.initForm.movementSensitivity = movementSensitivity;
this.initForm.rotationSensitivity = rotationSensitivity; this.initForm.rotationSensitivity = rotationSensitivity;
this.initForm.zoomSensitivity = zoomSensitivity; this.initForm.zoomSensitivity = zoomSensitivity;
this.viewForm = JSON.parse(cameraPosture);
this.viewForm.image = viewImg;
const layerIds = JSON.parse(layerId);
this.$emit('set-checked-keys', layerIds);
} }
}); });
}, },
fetchLayerTree() { fetchLayerTree() {
getLayerTreeBySceneId(this.sceneId).then((res) => { getLayerTreeBySceneId(this.sceneId).then((res) => {
if (res.success && res.data) { if (res.success && res.data) {
console.log(res.data);
this.treeData = this.restructTreeData([res.data]); this.treeData = this.restructTreeData([res.data]);
this.$nextTick(() => {
const checkedNodes = this.$refs.layerTree.getCheckedNodes(true);
checkedNodes.forEach((node, index) => {
this.onCheck(node);
});
});
} }
}); });
}, },
@ -104,17 +118,19 @@ export default {
}, },
initMap() { initMap() {
viewer = new sycim.Viewer('cesiumContainer'); viewer = new sycim.Viewer('cesiumContainer');
window.viewer = viewer;
let baseLayer = sycim.ImageryLayerFactory.createImageryLayer(sycim.ImageryType.ARCGIS, { let baseLayer = sycim.ImageryLayerFactory.createImageryLayer(sycim.ImageryType.ARCGIS, {
url: 'https://services.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer' url: 'https://services.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer'
}); });
viewer.addBaseLayer(baseLayer); viewer.addBaseLayer(baseLayer);
this.$nextTick(() => { // this.$nextTick(() => {
let Tlayer = new sycim.TilesetLayer('Tlayer').addTo(viewer); // let Tlayer = new sycim.TilesetLayer('Tlayer').addTo(viewer);
const tileset = new sycim.Tileset('/mapserver/jky-3dtiles/zjcm_encrypt/tileset.json'); // const tileset = new sycim.Tileset('/mapserver/jky-3dtiles/zjcm_encrypt/tileset.json');
Tlayer.addGraphic(tileset); // console.log(tileset);
viewer.flyTo(tileset); // Tlayer.addGraphic(tileset);
}); // viewer.flyTo(tileset);
// });
}, },
fetchView() { fetchView() {
const { imageSrc, position, heading, pitch, roll } = getCanvasImageAndViewPoint(viewer); const { imageSrc, position, heading, pitch, roll } = getCanvasImageAndViewPoint(viewer);
@ -133,20 +149,63 @@ export default {
} }
this.isEdit = !this.isEdit; this.isEdit = !this.isEdit;
}, },
onCheck(data) {
if (!data.iconCls) {
//
const checkedKeys = this.$refs.layerTree.getCheckedKeys();
this.handleCheckChange(data, { checkedKeys });
}
},
handleCheckChange(data, checkedData) {
const { id } = data;
const { checkedKeys } = checkedData;
const nodes = [data];
if (data.children?.length > 0) {
this.flattenTree(data.children, nodes);
}
const checked = checkedKeys.includes(id);
this.toggleLayer(nodes, checked);
},
flattenTree(tree, flatArray = []) {
tree.forEach((node) => {
const { children, ...rest } = node;
flatArray.push(rest);
if (children && children.length > 0) {
flattenTree(children, flatArray);
}
});
return flatArray;
},
toggleLayer(nodes, checked) {
if (Array.isArray(nodes)) {
nodes.forEach((node) => {
if (checked) {
addLayer(node);
} else {
removeLayer(node);
}
});
}
},
goPosition(node) {
zoomToLayer(node.data);
},
saveSceneConfig() { saveSceneConfig() {
const form = JSON.parse(JSON.stringify(this.viewForm)); const form = JSON.parse(JSON.stringify(this.viewForm));
delete form.image; delete form.image;
const layerIds = this.$refs.layerTree.getCheckedKeys(); const layerId = this.$refs.layerConfigTree.getCheckedKeys();
const params = { const params = {
sceneId: this.sceneId, sceneId: this.sceneId,
...this.initForm, ...this.initForm,
viewImg: this.viewForm.image, viewImg: this.viewForm.image,
layerIds, layerId: JSON.stringify(layerId),
cameraPosture: { cameraPosture: JSON.stringify({ ...form })
...form
}
}; };
console.log(params); updateSceneConfig(params).then((res) => {
if (res.success) {
this.$message.success('保存成功');
}
});
}, },
cancelEvent() { cancelEvent() {
this.isEdit = false; this.isEdit = false;
@ -162,7 +221,16 @@ export default {
<el-collapse-item title="初始环境配置" name="1"> <el-collapse-item title="初始环境配置" name="1">
<el-form :model="initForm" label-width="100px" :disabled="!isEdit"> <el-form :model="initForm" label-width="100px" :disabled="!isEdit">
<el-form-item label="时间模式" prop="initTime"> <el-form-item label="时间模式" prop="initTime">
<el-input v-model="initForm.initTime"></el-input> <el-time-select
v-model="initForm.initTime"
:picker-options="{
start: '00:00',
step: '00:15',
end: '23:45'
}"
placeholder="选择时间"
>
</el-time-select>
</el-form-item> </el-form-item>
<el-form-item label="天气模式" prop="initWeather"> <el-form-item label="天气模式" prop="initWeather">
<el-select v-model="initForm.initWeather"> <el-select v-model="initForm.initWeather">
@ -215,7 +283,7 @@ export default {
</el-collapse-item> </el-collapse-item>
<el-collapse-item title="初始化图层配置" name="3"> <el-collapse-item title="初始化图层配置" name="3">
<layer-tree <layer-tree
ref="layerTree" ref="layerConfigTree"
:show-search="true" :show-search="true"
:show-checkbox="true" :show-checkbox="true"
:default-checked-keys="defaultCheckedKeys" :default-checked-keys="defaultCheckedKeys"
@ -237,11 +305,15 @@ export default {
<span class="title">项目图层资源目录</span> <span class="title">项目图层资源目录</span>
</div> </div>
<layer-tree <layer-tree
ref="layerTree"
:show-checkbox="true" :show-checkbox="true"
:show-search="true" :show-search="true"
:show-btns="true"
:default-checked-keys="defaultCheckedKeys" :default-checked-keys="defaultCheckedKeys"
:data="treeData" :data="treeData"
:default-props="defaultProps" :default-props="defaultProps"
@check-change="onCheck"
@location="goPosition"
></layer-tree> ></layer-tree>
</div> </div>
<el-button slot="reference" icon="el-icon-menu"></el-button> <el-button slot="reference" icon="el-icon-menu"></el-button>
@ -290,6 +362,7 @@ export default {
} }
} }
} }
.el-date-editor,
.el-select { .el-select {
width: 100%; width: 100%;
} }

225
src/views/aiSupervision/waterSetting/runScene/layerTree/index.js

@ -0,0 +1,225 @@
const createXyzLayer = (data) =>
new sycim.XyzLayer(data.id, {
...data,
maximumLevel: data.maximumLevel || 22
});
const layerTypeEnum = {
'011100': 'BAIDU',
'012000': 'PRIMITIVE',
'013000': 'TILESET',
'014000': 'XYZ',
'030100': 'WMTS',
'030200': 'WMS',
'030300': 'WFS',
'030400': 'GEOJSON',
'050100': 'TDTWMTS',
'060100': 'XYZ',
'070100': 'BINGMAP',
'040003': 'WFS',
'021102': 'ARCGIS_DYNAMIC',
113200: 'S3M'
};
// 图层响应动作
const layerActions = {
'030200': (data) =>
new sycim.WmsLayer(data.id, {
...data,
url: data.url,
layer: data.layerTable,
parameters: {
version: '1.3.0'
}
}),
'030300': async (data) => {
const options = {};
if (data.relationStyleId) {
const res = await getLayerStyle(data.relationStyleId);
options.styleConfig = res.information ? JSON.parse(res.information) : '';
}
return new sycim.WfsLayer(data.id, data.url, data.layerTable, options);
},
'030100': (data) =>
new sycim.WmtsLayer(data.id, {
...data,
url: data.url,
layer: data.layerTable,
tileMatrixSetID: data.tileMatrixSet,
style: data.style || ''
}),
'030400': async (data) => {
const options = {};
if (data.relationStyleId) {
const res = await getLayerStyle(data.relationStyleId);
options.styleConfig = res.information ? JSON.parse(res.information) : '';
}
return new sycim.GeoJsonLayer(data.id, data.url, options);
},
'011100': (data) =>
new sycim.BaiduLayer(data.id, {
...data,
style: data.layerTable,
crs: 'WGS84'
}),
'050100': (data) => {
let url = `${data.proxyUrl}${data.url}`;
if (!url.includes('?tk=') && data.serviceToken) {
url = `${url}?tk=${data.serviceToken}`;
}
return new sycim.TdtWmtsLayer(data.id, {
...data,
url,
layer: data.layerTable,
tileMatrixSetID: data.tileMatrixSet,
spatialReference: {
wkid: data.epsg
}
});
},
'070100': (data) =>
new sycim.BingMapLayer(data.id, {
...data
}),
'060100': createXyzLayer,
'014000': createXyzLayer,
'013000': (data) => new sycim.TilesetLayer(data.id),
'012000': (data) => new sycim.PrimitiveLayer(data.id),
'040003': (data) =>
new sycim.WfsLayer(data.id, data.url, data.layerTable, {
cql_filter: data.filter,
propertyName: '*'
}),
'021102': (data) =>
new sycim.ArcgisDynamicLayer(data.id, {
url: data.url
})
};
//图层缩放
function defaultZoomToLayer(data) {
const { mapParam } = data;
if (!mapParam?.tileCenter) return;
const p = mapParam.tileCenter.split(',');
window.viewer.flyToPosition(new sycim.Position(+p[0], +p[1], 500, 0, -90, 0));
}
// 根据图层类型缩放
function zoomToLayerByType(data) {
const { id, layerType } = data;
if (!layerType) return;
const type = sycim.LayerType[layerTypeEnum[layerType]];
const layer = window.viewer._layerCache[type][id];
if (layer?.zoomToLayer) {
layer.zoomToLayer();
} else {
defaultZoomToLayer(data);
}
}
const supermapTileLayer = {};
function zoomToS3MLayer(data) {
if (supermapTileLayer[data.id]) {
Cesium.Resource.fetchJson(data.url + '/scenes.json').then(function (scenes) {
let sname = scenes && scenes[0].name;
Cesium.Resource.fetchJson(data.url + '/scenes/' + sname + '.json').then(function (jsonData) {
var cameraPosition = jsonData.camera;
var tilt = Cesium.Math.toRadians(cameraPosition.tilt - 90);
//设置相机位置、视角,便于观察场景
window.viewer.scene.camera.setView({
destination: new Cesium.Cartesian3.fromDegrees(
cameraPosition.longitude,
cameraPosition.latitude,
cameraPosition.altitude
),
orientation: {
heading: cameraPosition.heading,
pitch: tilt,
roll: 0
}
});
});
});
} else {
alert('请先加载s3m图层');
}
}
// 图层缩放响应动作
const zoomToLayerActions = {
'030200': zoomToLayerByType,
'030300': zoomToLayerByType,
'030100': zoomToLayerByType,
'030400': zoomToLayerByType,
'011100': zoomToLayerByType,
'050100': zoomToLayerByType,
'070100': zoomToLayerByType,
'060100': zoomToLayerByType,
'014000': zoomToLayerByType,
'013000': zoomToLayerByType,
'012000': (data) => {
// modal
const { modelInitPosition } = data;
if (!modelInitPosition) return;
const p = JSON.parse(modelInitPosition);
window.viewer.flyToPosition(new sycim.Position(p.lng, p.lat, p.alt + 500, 0, -90, 0));
},
'040003': zoomToLayerByType,
'021102': zoomToLayerByType,
113200: zoomToS3MLayer
};
// 添加图层
export async function addLayer(layerData) {
const { layerType, url, id } = layerData;
let action = null;
if (layerType === '113200') {
if (supermapTileLayer[id]) {
supermapTileLayer[id].show = true;
} else {
const layerPromise = window.viewer.scene.open(url, {
autoSetView: false //不自动定位
});
layerPromise.then((layer) => {
supermapTileLayer[id] = layer?.[0];
});
}
return;
}
if (!layerType || !(action = layerActions[layerType])) return;
const layer = await action(layerData);
layer && window.viewer.addLayer(layer);
if (['013000'].includes(layerType)) {
// 3d tiles
const tileset = new sycim.Tileset(url);
tileset.id = layerData.id;
layer.addGraphic(tileset);
} else if (['012000'].includes(layerType)) {
// modal
if (!layerData.modelInitPosition) return;
const p = JSON.parse(layerData.modelInitPosition);
const model = new sycim.ModelPrimitive(new sycim.Position(p.lng, p.lat, p.alt, p.heading, p.pitch, p.roll), url);
model.id = layerData.id;
layer.addGraphic(model);
}
}
export function removeLayer(layerData) {
const { id, layerType } = layerData;
if (!layerType) return;
const type = layerTypeEnum[layerType];
if (layerType === '113200') {
if (supermapTileLayer[id]) {
supermapTileLayer[id].show = false;
}
} else {
window.viewer.removeLayer({
id,
type: sycim.LayerType[type]
});
}
}
export function zoomToLayer(data) {
const { layerType } = data;
zoomToLayerActions[layerType]?.(data);
}

37
src/views/aiSupervision/waterSetting/runScene/detail/layerTree.vue → src/views/aiSupervision/waterSetting/runScene/layerTree/index.vue

@ -18,6 +18,10 @@ export default {
type: Boolean, type: Boolean,
default: false default: false
}, },
showBtns: {
type: Boolean,
default: false
},
nodeKey: { nodeKey: {
type: String, type: String,
default: 'id' default: 'id'
@ -47,9 +51,18 @@ export default {
handleNodeClick(node, data) { handleNodeClick(node, data) {
this.$emit('node-click', node, data); this.$emit('node-click', node, data);
}, },
handleCheckChange(data, checked, indeterminate) {
this.$emit('check-change', data, checked, indeterminate);
},
getCheckedNodes(leafOnly = false) {
return this.$refs.tree.getCheckedNodes(leafOnly);
},
filterNode(value, data) { filterNode(value, data) {
if (!value) return true; if (!value) return true;
return data[this.defaultProps.label].indexOf(value) !== -1; return data[this.defaultProps.label].indexOf(value) !== -1;
},
goPosition(node) {
this.$emit('location', node);
} }
} }
}; };
@ -70,7 +83,19 @@ export default {
:expand-on-click-node="false" :expand-on-click-node="false"
default-expand-all default-expand-all
@node-click="handleNodeClick" @node-click="handleNodeClick"
></el-tree> @check-change="handleCheckChange"
>
<template #default="{ node, data }">
<span class="custom-tree-node">
<span>{{ node.label }}</span>
<i
v-if="showBtns && !data.iconCls && !(data.isBase || data.isTerrain)"
class="el-icon-location-outline"
@click="goPosition(node)"
></i>
</span>
</template>
</el-tree>
</div> </div>
</template> </template>
@ -79,5 +104,15 @@ export default {
.search-btn { .search-btn {
margin-bottom: 12px; margin-bottom: 12px;
} }
/deep/.el-tree {
.custom-tree-node {
flex: 1;
display: flex;
align-items: center;
justify-content: space-between;
font-size: 14px;
padding-right: 8px;
}
}
} }
</style> </style>

12
vue.config.js

@ -53,7 +53,7 @@ module.exports = {
// } // }
// }, // },
[process.env.VUE_APP_BASE_API]: { [process.env.VUE_APP_BASE_API]: {
target: 'http://shuili-admin.product.dev.com:30115', target: 'http://172.16.34.59:18083',
// target: "http://127.0.0.1:18082", // target: "http://127.0.0.1:18082",
changeOrigin: true, changeOrigin: true,
pathRewrite: { pathRewrite: {
@ -61,11 +61,11 @@ module.exports = {
} }
}, },
'/iserver': { '/iserver': {
target: 'http://172.16.32.63:52111/iserver/services', target: 'http://172.16.32.63:52111',
changeOrigin: true, changeOrigin: true
pathRewrite: { // pathRewrite: {
'^/iserver': '' // '^/iserver': ''
} // }
}, },
'/mapserver': { '/mapserver': {
target: 'http://172.16.32.63/tiles', target: 'http://172.16.32.63/tiles',

Loading…
Cancel
Save