|
|
|
<template>
|
|
|
|
<a-modal :title="title" :visible="visible" @ok="handleOk" @cancel="handleCancel" width="60vw" :destroyOnClose="true"
|
|
|
|
wrapClassName="EarthMap">
|
|
|
|
<a-row>
|
|
|
|
<a-col :span="24">
|
|
|
|
<div id="earthContainer" :style="{ cursor: cursorCss }"></div>
|
|
|
|
<!-- <span class="mapManage" @click="() => { mapManageShow = !mapManageShow }">
|
|
|
|
<a-icon type="setting" theme="filled" />
|
|
|
|
</span> -->
|
|
|
|
<span :class="['scaleWin', 'iconSpan', scaleWin.status ? 'colorBlue' : '']" title="放大或缩小" @click="scaleWinFunc">
|
|
|
|
<ExpandOutlined v-if="!scaleWin.status" />
|
|
|
|
<CompressOutlined v-else />
|
|
|
|
</span>
|
|
|
|
<span :class="['mapModel', 'iconSpan']" @click="modelChange" title="地图维度切换">
|
|
|
|
{{ modelText == "2D" ? "3D" : "2D" }}
|
|
|
|
</span>
|
|
|
|
<span :class="['selectIcon', 'iconSpan']" title="选取区域" @click="SelectArea">
|
|
|
|
<GatewayOutlined />
|
|
|
|
</span>
|
|
|
|
<!-- <span :class="['testIcon', 'iconSpan']" title="测试" @click="test">
|
|
|
|
<GatewayOutlined />
|
|
|
|
</span> -->
|
|
|
|
<a-popconfirm title="确认重置区域?" placement="right" ok-text="确认" cancel-text="取消" @confirm="clearArea">
|
|
|
|
<span :class="['clearIcon', 'iconSpan']" title="重置区域">
|
|
|
|
<FormatPainterOutlined />
|
|
|
|
</span>
|
|
|
|
</a-popconfirm>
|
|
|
|
<template v-if="editTileModel != undefined && modelText == '3D'">
|
|
|
|
<span class="buildManage iconSpan" @click="enableTileChange" title="建筑加载">
|
|
|
|
<img src="../../../../../../../assets/images/build_close.png" class="iconSize" v-show="!enableTile" />
|
|
|
|
<img src="../../../../../../../assets/images/build_able.png" class="iconSize" v-show="enableTile" />
|
|
|
|
</span>
|
|
|
|
<span class="modelDw iconSpan" @click="modelDwFunc" title="模型跟随鼠标">
|
|
|
|
<img src="../../../../../../../assets/images/dw_close.png" class="iconSize" v-show="!modelDw" />
|
|
|
|
<img src="../../../../../../../assets/images/dw_able.png" class="iconSize" v-show="modelDw" />
|
|
|
|
</span>
|
|
|
|
<span class="modelMove iconSpan" @click="modelMoveFunc" title="模型移动">
|
|
|
|
<img src="../../../../../../../assets/images/move_close.png" class="iconSize" v-show="!modelMove" />
|
|
|
|
<img src="../../../../../../../assets/images/move_able.png" class="iconSize" v-show="modelMove" />
|
|
|
|
</span>
|
|
|
|
<span class="modelRotation iconSpan" @click="modelRotationFunc" title="模型旋转">
|
|
|
|
<img src="../../../../../../../assets/images/rotation_close.png" class="iconSize" v-show="!modelRotation" />
|
|
|
|
<img src="../../../../../../../assets/images/rotation_able.png" class="iconSize" v-show="modelRotation" />
|
|
|
|
</span>
|
|
|
|
<span class="modelScale iconSpan" title="缩放">
|
|
|
|
<a-tooltip placement="left" trigger="click"
|
|
|
|
:getPopupContainer="(triggerNode) => { return triggerNode.parentElement }">
|
|
|
|
<img src="../../../../../../../assets/images/scale_close.png" class="iconSize" v-show="!modelScaleStatus"
|
|
|
|
@click="modelScaleStatusChange" />
|
|
|
|
<img src="../../../../../../../assets/images/scale_able.png" class="iconSize" v-show="modelScaleStatus"
|
|
|
|
@click="modelScaleStatusChange" />
|
|
|
|
<template #title>
|
|
|
|
<div class="sliderContainer">
|
|
|
|
<a-row class="sliderRow">
|
|
|
|
<a-col :span="4">
|
|
|
|
X轴:
|
|
|
|
</a-col>
|
|
|
|
<a-col :span="11">
|
|
|
|
<a-slider v-model:value="scaleValues[0]" :min="scaleConfig.X.min" :max="scaleConfig.X.max"
|
|
|
|
:step="scaleConfig.X.step" />
|
|
|
|
</a-col>
|
|
|
|
<a-col :span="6">
|
|
|
|
<a-input-number v-model:value="scaleValues[0]" :min="scaleConfig.X.min" :max="scaleConfig.X.max"
|
|
|
|
:step="scaleConfig.X.step" style="width:100%"></a-input-number>
|
|
|
|
</a-col>
|
|
|
|
<a-col :span="2" :offset="1" @click="() => { scaleConfig.X.show = !scaleConfig.X.show }">
|
|
|
|
<SettingOutlined :style="{ color: scaleConfig.X.show ? '#1296db' : '#FFF' }" />
|
|
|
|
</a-col>
|
|
|
|
</a-row>
|
|
|
|
<a-row v-show="scaleConfig.X.show" type="flex" justify="space-around" align="middle" :gutter="[0, 12]">
|
|
|
|
<a-col :span="8">
|
|
|
|
最小值:
|
|
|
|
</a-col>
|
|
|
|
<a-col :span="16">
|
|
|
|
<a-input-number v-model:value="scaleConfig.X.min" class="fill-9-row"></a-input-number>
|
|
|
|
</a-col>
|
|
|
|
<a-col :span="8">
|
|
|
|
最大值:
|
|
|
|
</a-col>
|
|
|
|
<a-col :span="16">
|
|
|
|
<a-input-number v-model:value="scaleConfig.X.max" class="fill-9-row"></a-input-number>
|
|
|
|
</a-col>
|
|
|
|
<a-col :span="8">
|
|
|
|
步长:
|
|
|
|
</a-col>
|
|
|
|
<a-col :span="16">
|
|
|
|
<a-input-number v-model:value="scaleConfig.X.step" class="fill-9-row"></a-input-number>
|
|
|
|
</a-col>
|
|
|
|
<a-col :span="24" class="sliderRow">
|
|
|
|
<a-button type="primary" class="fill-9-row" @click="() => { allSetting('X') }">应用全部</a-button>
|
|
|
|
</a-col>
|
|
|
|
</a-row>
|
|
|
|
<a-row class="sliderRow">
|
|
|
|
<a-col :span="4">
|
|
|
|
Y轴:
|
|
|
|
</a-col>
|
|
|
|
<a-col :span="11">
|
|
|
|
<a-slider v-model:value="scaleValues[1]" :min="scaleConfig.Y.min" :max="scaleConfig.Y.max"
|
|
|
|
:step="scaleConfig.Y.step" />
|
|
|
|
</a-col>
|
|
|
|
<a-col :span="6">
|
|
|
|
<a-input-number v-model:value="scaleValues[1]" :min="scaleConfig.Y.min" :max="scaleConfig.Y.max"
|
|
|
|
:step="scaleConfig.Y.step" style="width:100%"></a-input-number>
|
|
|
|
</a-col>
|
|
|
|
<a-col :span="2" :offset="1" @click="() => { scaleConfig.Y.show = !scaleConfig.Y.show }">
|
|
|
|
<SettingOutlined :style="{ color: scaleConfig.X.show ? '#1296db' : '#FFF' }" />
|
|
|
|
</a-col>
|
|
|
|
</a-row>
|
|
|
|
<a-row v-show="scaleConfig.Y.show" type="flex" justify="space-around" align="middle" :gutter="[0, 12]">
|
|
|
|
<a-col :span="8">
|
|
|
|
最小值:
|
|
|
|
</a-col>
|
|
|
|
<a-col :span="16">
|
|
|
|
<a-input-number v-model:value="scaleConfig.Y.min" class="fill-9-row"></a-input-number>
|
|
|
|
</a-col>
|
|
|
|
<a-col :span="8">
|
|
|
|
最大值:
|
|
|
|
</a-col>
|
|
|
|
<a-col :span="16">
|
|
|
|
<a-input-number v-model:value="scaleConfig.Y.max" class="fill-9-row"></a-input-number>
|
|
|
|
</a-col>
|
|
|
|
<a-col :span="8">
|
|
|
|
步长:
|
|
|
|
</a-col>
|
|
|
|
<a-col :span="16">
|
|
|
|
<a-input-number v-model:value="scaleConfig.Y.step" class="fill-9-row"></a-input-number>
|
|
|
|
</a-col>
|
|
|
|
<a-col :span="24" class="sliderRow">
|
|
|
|
<a-button type="primary" class="fill-9-row" @click="() => { allSetting('Y') }">应用全部</a-button>
|
|
|
|
</a-col>
|
|
|
|
</a-row>
|
|
|
|
<a-row class="sliderRow">
|
|
|
|
<a-col :span="4">
|
|
|
|
Z轴:
|
|
|
|
</a-col>
|
|
|
|
<a-col :span="11">
|
|
|
|
<a-slider v-model:value="scaleValues[2]" :min="scaleConfig.Z.min" :max="scaleConfig.Z.max"
|
|
|
|
:step="scaleConfig.Z.step" />
|
|
|
|
</a-col>
|
|
|
|
<a-col :span="6">
|
|
|
|
<a-input-number v-model:value="scaleValues[2]" :min="scaleConfig.Z.min" :max="scaleConfig.Z.max"
|
|
|
|
:step="scaleConfig.Z.step" style="width:100%"></a-input-number>
|
|
|
|
</a-col>
|
|
|
|
<a-col :span="2" :offset="1" @click="() => { scaleConfig.Z.show = !scaleConfig.Z.show }">
|
|
|
|
<SettingOutlined :style="{ color: scaleConfig.X.show ? '#1296db' : '#FFF' }" />
|
|
|
|
</a-col>
|
|
|
|
</a-row>
|
|
|
|
<a-row v-show="scaleConfig.Z.show" type="flex" justify="space-around" align="middle" :gutter="[0, 12]">
|
|
|
|
<a-col :span="8">
|
|
|
|
最小值:
|
|
|
|
</a-col>
|
|
|
|
<a-col :span="16">
|
|
|
|
<a-input-number v-model:value="scaleConfig.Z.min" class="fill-9-row"></a-input-number>
|
|
|
|
</a-col>
|
|
|
|
<a-col :span="8">
|
|
|
|
最大值:
|
|
|
|
</a-col>
|
|
|
|
<a-col :span="16">
|
|
|
|
<a-input-number v-model:value="scaleConfig.Z.max" class="fill-9-row"></a-input-number>
|
|
|
|
</a-col>
|
|
|
|
<a-col :span="8">
|
|
|
|
步长:
|
|
|
|
</a-col>
|
|
|
|
<a-col :span="16">
|
|
|
|
<a-input-number v-model:value="scaleConfig.Z.step" class="fill-9-row"></a-input-number>
|
|
|
|
</a-col>
|
|
|
|
<a-col :span="24" class="sliderRow">
|
|
|
|
<a-button type="primary" class="fill-9-row" @click="() => { allSetting('Z') }">应用全部</a-button>
|
|
|
|
</a-col>
|
|
|
|
</a-row>
|
|
|
|
</div>
|
|
|
|
|
|
|
|
</template>
|
|
|
|
</a-tooltip>
|
|
|
|
</span>
|
|
|
|
</template>
|
|
|
|
</a-col>
|
|
|
|
</a-row>
|
|
|
|
<!-- <EarthMapManage :show="mapManageShow"></EarthMapManage> -->
|
|
|
|
</a-modal>
|
|
|
|
</template>
|
|
|
|
<script setup>
|
|
|
|
import { toRefs, watch, nextTick, ref, reactive, onMounted, getCurrentInstance } from 'vue';
|
|
|
|
import { message } from 'ant-design-vue';
|
|
|
|
import { useEarthMapStore } from '/@/store/modules/earthMap';
|
|
|
|
import rotationXYZ from '@/assets/images/rotationXYZ.png';
|
|
|
|
import { defHttp } from '@/utils/http/axios';
|
|
|
|
import { FormatPainterOutlined, SettingOutlined, ExpandOutlined, GatewayOutlined, ZoomInOutlined, ZoomOutOutlined, CompressOutlined } from '@ant-design/icons-vue';
|
|
|
|
// import dwPng from '/@/assets/images/dwPng.png';
|
|
|
|
import dwPng from '@/assets/images/rotationXYZ.png';
|
|
|
|
import { drawPolygonSave, drawGeoSmoothPolygon } from "@/utils/earthMap/earthDraw";
|
|
|
|
const store = useEarthMapStore();
|
|
|
|
const { proxy } = getCurrentInstance();
|
|
|
|
// 获取地图
|
|
|
|
const getMapPage = (params) => defHttp.get({ url: "/military/msMapManage/list/page", params: params }, { isTransformResponse: false });
|
|
|
|
// 鼠标样式
|
|
|
|
const cursorCss = ref("grab");
|
|
|
|
const props = defineProps(['areaData', 'drawData', 'title', 'visible', 'hasMoveMethod', 'initModeType', 'editTileModel', 'enableTile', 'enablePointer']);
|
|
|
|
const { title, visible, hasMoveMethod, initModeType, editTileModel, enablePointer } = toRefs(props);
|
|
|
|
// 禁用切片
|
|
|
|
const enableTile = ref(props.enableTile);
|
|
|
|
const pointerXyz = ref([]);
|
|
|
|
const defaultPinUrl = "../";
|
|
|
|
const emit = defineEmits(["closeWin", "checkPosition", "moveChinaPosition", 'update:areaData', 'update:drawData'])
|
|
|
|
// 确认事件
|
|
|
|
const handleOk = function () {
|
|
|
|
let position = null;
|
|
|
|
let rotation = null;
|
|
|
|
let fov = null;
|
|
|
|
if (CModel.value) {
|
|
|
|
position = [...CModel.value.czmObject.xbsjPosition];
|
|
|
|
rotation = [...CModel.value.czmObject.xbsjRotation];
|
|
|
|
emit("checkPosition", position, rotation, [...scaleValues.value]);
|
|
|
|
} else {
|
|
|
|
let cposition = [window.earth.camera.position[0], window.earth.camera.position[1], window.earth.camera.position[2]];
|
|
|
|
if (pin) {
|
|
|
|
position = [pin.position[0], pin.position[1], pin.position[2]];
|
|
|
|
}
|
|
|
|
rotation = [window.earth.camera.rotation[0], window.earth.camera.rotation[1], window.earth.camera.rotation[2]];
|
|
|
|
fov = window.earth.camera.fov;
|
|
|
|
emit("checkPosition", position, cposition, rotation, fov);
|
|
|
|
}
|
|
|
|
handleCancel();
|
|
|
|
|
|
|
|
//整理数据
|
|
|
|
sceneTreeToAreaObjList()
|
|
|
|
//上传-画图数据
|
|
|
|
updateDraw()
|
|
|
|
//上传-监控范围数据
|
|
|
|
updateArea()
|
|
|
|
//退出
|
|
|
|
handleCancel()
|
|
|
|
}
|
|
|
|
const handleCancel = function () {
|
|
|
|
emit("closeWin");
|
|
|
|
}
|
|
|
|
// 地球对象
|
|
|
|
let earth = undefined;
|
|
|
|
let _viewer = undefined;
|
|
|
|
watch(
|
|
|
|
visible, async (value, oldValue) => {
|
|
|
|
// 初始化地球和其他
|
|
|
|
if (value) {
|
|
|
|
await nextTick()
|
|
|
|
// 地图初始化
|
|
|
|
window.XE.ready().then(() => {
|
|
|
|
// 加载标绘插件
|
|
|
|
return window.XE.HTML.loadJS('/earthsdk/XbsjEarth-Plugins/plottingSymbol/plottingSymbol.js');
|
|
|
|
}).then(async () => {
|
|
|
|
earth = new window.XE.Earth('earthContainer');
|
|
|
|
window.earth = window.$earth = earth
|
|
|
|
window.$viewer = _viewer = window.earth.czm.viewer;
|
|
|
|
initMode();
|
|
|
|
listenMouseHandler();
|
|
|
|
listenMouseHandlerSelect();
|
|
|
|
addContainerClickListen();
|
|
|
|
await getDataSource();
|
|
|
|
moveChinaPosition();
|
|
|
|
await getDrawArea()
|
|
|
|
});
|
|
|
|
|
|
|
|
} else {
|
|
|
|
// 销毁缓存
|
|
|
|
destroyCache();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
)
|
|
|
|
|
|
|
|
// ---------- 监控区域选择部分 ----------
|
|
|
|
//重置范围
|
|
|
|
const clearArea = function () {
|
|
|
|
if (window.earth.sceneTree.root.children.length > 1) {
|
|
|
|
window.earth.sceneTree.root.children.pop();
|
|
|
|
emit('clearAreaData')
|
|
|
|
// message.success('重置成功,请保存设置');
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// 区域模型数组
|
|
|
|
let areaObjList = ref([])
|
|
|
|
// 加载区域选择-多边形
|
|
|
|
const getDrawArea = function () {
|
|
|
|
if (props.areaData || props.drawData) {
|
|
|
|
areaObjList.value = JSON.parse(props.drawData)
|
|
|
|
// console.log("aa",areaObjList.value);
|
|
|
|
areaObjList.value.forEach((e) => {
|
|
|
|
//绘画
|
|
|
|
let t = drawPolygonSave(e, 1)
|
|
|
|
t.name = '区域选取'
|
|
|
|
//存入store
|
|
|
|
store.shapeShowList.push(t.xbsjGuid)
|
|
|
|
//创建叶子节点
|
|
|
|
let leaf = new window.XE.SceneTree.Leaf(t)
|
|
|
|
//添加叶子节点属性
|
|
|
|
leaf.ref = t.guid
|
|
|
|
leaf.guid = t.guid;
|
|
|
|
//push 场景树
|
|
|
|
window.earth.sceneTree.root.children.push(leaf);
|
|
|
|
})
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// 加载区域选择-平滑多边形、圆弧
|
|
|
|
// const getDrawAreaSmooth = function () {
|
|
|
|
// if (props.areaData || props.drawData) {
|
|
|
|
// areaObjList.value = JSON.parse(props.drawData)
|
|
|
|
// // console.log("aa",areaObjList.value);
|
|
|
|
// areaObjList.value.forEach((e) => {
|
|
|
|
// //绘画
|
|
|
|
// let t = drawGeoSmoothPolygon(e, 1)
|
|
|
|
// t.name = '区域选取'
|
|
|
|
// //存入store
|
|
|
|
// store.shapeShowList.push(t.xbsjGuid)
|
|
|
|
// //创建叶子节点
|
|
|
|
// let leaf = new window.XE.SceneTree.Leaf(t)
|
|
|
|
// //添加叶子节点属性
|
|
|
|
// leaf.ref = t.guid
|
|
|
|
// leaf.guid = t.guid;
|
|
|
|
// //push 场景树
|
|
|
|
// window.earth.sceneTree.root.children.push(leaf);
|
|
|
|
// })
|
|
|
|
// }
|
|
|
|
// }
|
|
|
|
// 创建区域选择-多边形
|
|
|
|
const SelectArea = function () {
|
|
|
|
console.log(window.earth.sceneTree.root.children);
|
|
|
|
// 如果场景树中存在区域数据,则清除
|
|
|
|
if (window.earth.sceneTree.root.children.length > 1) {
|
|
|
|
window.earth.sceneTree.root.children.pop();
|
|
|
|
}
|
|
|
|
// 使用绘制方法
|
|
|
|
let t = drawPolygonSave(null, 1)
|
|
|
|
t.creating = true
|
|
|
|
t.creatingWithoutHeight = true
|
|
|
|
t.ground = true
|
|
|
|
t.name = '区域选取'
|
|
|
|
//创建叶子节点
|
|
|
|
let leaf = new window.XE.SceneTree.Leaf(t)
|
|
|
|
//添加叶子节点属性
|
|
|
|
leaf.ref = t.guid
|
|
|
|
leaf.guid = t.guid;
|
|
|
|
//push 场景树
|
|
|
|
window.earth.sceneTree.root.children.push(leaf);
|
|
|
|
// areaObjList.value.push(t)
|
|
|
|
// return t
|
|
|
|
}
|
|
|
|
// 创建区域选择-平滑多边形
|
|
|
|
// const SelectAreaSmooth = function () {
|
|
|
|
// if (window.earth.sceneTree.root.children.length > 1) {
|
|
|
|
// window.earth.sceneTree.root.children.pop();
|
|
|
|
// }
|
|
|
|
// let t2 = drawGeoSmoothPolygon(null, 1);
|
|
|
|
// console.log('t2', t2);
|
|
|
|
// t2.creating = true
|
|
|
|
// t2.creatingWithoutHeight = true
|
|
|
|
// t2.ground = true
|
|
|
|
// t2.name = '区域选取'
|
|
|
|
// let leaf = new window.XE.SceneTree.Leaf(t2)
|
|
|
|
// leaf.ref = t2.guid
|
|
|
|
// leaf.guid = t2.guid
|
|
|
|
// window.earth.sceneTree.root.children.push(leaf)
|
|
|
|
// }
|
|
|
|
//整理数据
|
|
|
|
// 将场景树中的模型数据转换到区域模型数组中
|
|
|
|
const sceneTreeToAreaObjList = function () {
|
|
|
|
areaObjList.value = []
|
|
|
|
let sceneTree = window.earth.sceneTree.$refs
|
|
|
|
for (let element in sceneTree) {
|
|
|
|
if (sceneTree[element].title == "区域选取") {
|
|
|
|
areaObjList.value.push(sceneTree[element].czmObject)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
//上传-画图数据
|
|
|
|
const updateDraw = function () {
|
|
|
|
let drawDataToString = JSON.stringify(areaObjList.value)
|
|
|
|
//上传-画图数据
|
|
|
|
if (drawDataToString == '[]') {
|
|
|
|
emit('update:drawData', '');
|
|
|
|
} else {
|
|
|
|
emit('update:drawData', drawDataToString);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// 上传-监控范围数据(多边形)
|
|
|
|
function updateArea() {
|
|
|
|
//上传监控范围数据
|
|
|
|
let areaData = []
|
|
|
|
let k = 1; //序号
|
|
|
|
areaObjList.value.forEach((e) => {
|
|
|
|
//全部弧度转角度
|
|
|
|
let positionToDegrees = []
|
|
|
|
e.positions.forEach((p) => {
|
|
|
|
positionToDegrees.push(window.Cesium.Math.toDegrees(p))
|
|
|
|
})
|
|
|
|
//经纬度,两两切分
|
|
|
|
let result = []
|
|
|
|
for (let i = 0; i < positionToDegrees.length; i += 2) {
|
|
|
|
result.push({
|
|
|
|
lon: positionToDegrees[i], //经度
|
|
|
|
lat: positionToDegrees[i + 1], //纬度
|
|
|
|
key: k //序号
|
|
|
|
});
|
|
|
|
k++;
|
|
|
|
}
|
|
|
|
areaData.push(result)
|
|
|
|
})
|
|
|
|
// console.log("areaData", areaData);
|
|
|
|
if (areaData.length == 0) {
|
|
|
|
emit('update:areaData', '');
|
|
|
|
} else {
|
|
|
|
emit('update:areaData', JSON.stringify(areaData));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// 上传-监控范围数据(平滑多边形、圆弧)
|
|
|
|
// function updateAreaSmooth() {
|
|
|
|
// //上传监控范围数据
|
|
|
|
// let areaData = []
|
|
|
|
// let k = 1
|
|
|
|
// areaObjList.value.forEach((e) => {
|
|
|
|
// //弧度转角度
|
|
|
|
// let positionToDegrees = []
|
|
|
|
// e.positions.forEach((i) => {
|
|
|
|
// let positionItem = []
|
|
|
|
// i.forEach(p => {
|
|
|
|
// positionItem.push(window.Cesium.Math.toDegrees(p))
|
|
|
|
// })
|
|
|
|
// positionToDegrees.push(positionItem)
|
|
|
|
// })
|
|
|
|
// //经纬度,两两切分
|
|
|
|
// let result = []
|
|
|
|
// for (let i = 0; i < positionToDegrees.length; i++) {
|
|
|
|
// result.push({
|
|
|
|
// lon: positionToDegrees[i][0], //经度
|
|
|
|
// lat: positionToDegrees[i][1], //纬度
|
|
|
|
// key: k //序号
|
|
|
|
// });
|
|
|
|
// k++;
|
|
|
|
// }
|
|
|
|
// areaData.push(result)
|
|
|
|
// console.log(result);
|
|
|
|
// })
|
|
|
|
// // emit('update:areaData', JSON.stringify(areaData));
|
|
|
|
// if (areaData.length == 0) {
|
|
|
|
// emit('update:areaData', '');
|
|
|
|
// } else {
|
|
|
|
// emit('update:areaData', JSON.stringify(areaData));
|
|
|
|
// }
|
|
|
|
// }
|
|
|
|
// const test = function () {
|
|
|
|
// _viewer.camera.moveLeft(100000)
|
|
|
|
// }
|
|
|
|
|
|
|
|
const mapManageShow = ref(false);
|
|
|
|
const modelText = ref('2D');
|
|
|
|
const modelChange = function () {
|
|
|
|
const viewer = window.earth.czm.viewer;
|
|
|
|
if (modelText.value == '3D') {
|
|
|
|
// 禁用切片,后切换为2D
|
|
|
|
// const loyauts = window.earth.sceneTree.$refs["loyauts"].children;
|
|
|
|
// loyauts.forEach(loyaut => {
|
|
|
|
// loyaut.enabled = false;
|
|
|
|
// });
|
|
|
|
modelText.value = "2D";
|
|
|
|
enableTile.value = false;
|
|
|
|
if (CModel.value) {
|
|
|
|
// CModel.value.show = false;
|
|
|
|
if (modelDw.value) {
|
|
|
|
modelDwFunc();
|
|
|
|
}
|
|
|
|
if (modelMove.value) {
|
|
|
|
modelMoveFunc();
|
|
|
|
}
|
|
|
|
if (modelRotation.value) {
|
|
|
|
modelRotationFunc();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
viewer.scene.morphTo2D(0)
|
|
|
|
} else {
|
|
|
|
viewer.scene.morphTo3D(0)
|
|
|
|
modelText.value = "3D";
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
const enableTileChange = function () {
|
|
|
|
if (modelText.value != "3D") {
|
|
|
|
message.info("2D切片。若要加载切片,请切换至3D模式!")
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
enableTile.value = !enableTile.value;
|
|
|
|
}
|
|
|
|
|
|
|
|
const initMode = function () {
|
|
|
|
const viewer = window.earth.czm.viewer;
|
|
|
|
// 当没有initModeType属性时,默认2D模式展示
|
|
|
|
if (!initModeType.value) {
|
|
|
|
modelText.value = "3D"
|
|
|
|
viewer.scene.morphTo3D(0)
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
// 2D模式
|
|
|
|
if (initModeType.value == "2D") {
|
|
|
|
modelText.value = "3D"
|
|
|
|
viewer.scene.morphTo2D(0)
|
|
|
|
} else if (initModeType.value == "3D") {
|
|
|
|
// 3D模式
|
|
|
|
modelText.value = "3D"
|
|
|
|
viewer.scene.morphTo3D(0)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
const CModel = ref(null);
|
|
|
|
// 编辑切片模型
|
|
|
|
const editTileModelFunc = function (root) {
|
|
|
|
// 空值判断
|
|
|
|
if (!editTileModel || !editTileModel.value) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
// 模型对象
|
|
|
|
const modelObj = {
|
|
|
|
ref: editTileModel.value.custom.id,
|
|
|
|
czmObject: editTileModel.value.czmObject,
|
|
|
|
enabled: true,
|
|
|
|
}
|
|
|
|
// 创建模型
|
|
|
|
root.push(modelObj);
|
|
|
|
// 拿取创建的模型
|
|
|
|
CModel.value = window.earth.sceneTree.$refs[editTileModel.value.custom.id];
|
|
|
|
// 启用
|
|
|
|
CModel.value.enabled = true;
|
|
|
|
CModel.value.czmObject.enabled = true;
|
|
|
|
// 初始大小
|
|
|
|
scaleValues.value = [...CModel.value.czmObject.xbsjScale];
|
|
|
|
}
|
|
|
|
const moveChinaPosition = function () {
|
|
|
|
// 如果外部传入了moveChinaPosition方法则调用外部的
|
|
|
|
if (hasMoveMethod.value) {
|
|
|
|
emit('moveChinaPosition');
|
|
|
|
} else {
|
|
|
|
// 否则则给一个默认位置
|
|
|
|
window.earth.camera.fov = 1.0471975511965976;
|
|
|
|
window.earth.camera.position = [1.8833961240252113, 0.6131398723508994, 8921610.846366767];
|
|
|
|
window.earth.camera.rotation = [6.283185307179586, -1.5704896980852325, 0]
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
let viewer = undefined;
|
|
|
|
// 鼠标样式
|
|
|
|
const cssGrab = function (e) {
|
|
|
|
const buttonNum = e.button;
|
|
|
|
if (buttonNum == 0) {
|
|
|
|
cursorCss.value = `grabbing`;
|
|
|
|
} else if (buttonNum == 1) {
|
|
|
|
cursorCss.value = `${rotationXYZ}`;
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
// 添加事件监听
|
|
|
|
const addContainerClickListen = function () {
|
|
|
|
const dom = document.getElementById("earthContainer");
|
|
|
|
dom.addEventListener("mousedown", cssGrab, true)
|
|
|
|
// dom.addEventListener("mouseup", cssGrab)
|
|
|
|
}
|
|
|
|
// 模型跟随鼠标
|
|
|
|
const modelFollowMouse = (event) => {
|
|
|
|
if (CModel.value && modelText.value == "3D") {
|
|
|
|
if (CModel.value.enabled == false) {
|
|
|
|
CModel.value.enabled = true;
|
|
|
|
}
|
|
|
|
//地图左键触发 右侧菜单隐藏
|
|
|
|
// 屏幕坐标转为世界坐标
|
|
|
|
let cartesian = viewer.scene.globe.pick(viewer.camera.getPickRay(event.endPosition), viewer.scene);
|
|
|
|
if (!cartesian) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
// 世界坐标转换为弧度
|
|
|
|
let ellipsoid = viewer.scene.globe.ellipsoid;
|
|
|
|
let cartographic = ellipsoid.cartesianToCartographic(cartesian);
|
|
|
|
|
|
|
|
let lon = cartographic.longitude; // 经度
|
|
|
|
let lat = cartographic.latitude; // 纬度
|
|
|
|
// let alt = cartographic.height; // 高度
|
|
|
|
let alt = 0; // 高度
|
|
|
|
CModel.value.czmObject.xbsjPosition = [lon, lat, alt];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
let pin = undefined;
|
|
|
|
// 添加地图上的鼠标监听事件
|
|
|
|
const listenMouseHandler = function () {
|
|
|
|
viewer = window.earth.czm.viewer;
|
|
|
|
window.viewer = viewer;
|
|
|
|
window.earth.interaction.picking.enabled = true;
|
|
|
|
window.earth.interaction.picking.clickedColor = [1, 0, 0, 1];
|
|
|
|
|
|
|
|
const handler = new window.Cesium.ScreenSpaceEventHandler(
|
|
|
|
viewer.scene.canvas
|
|
|
|
);
|
|
|
|
window.CesiumGlobalHandler = handler;
|
|
|
|
// 取消双击旋转事件
|
|
|
|
viewer.cesiumWidget.screenSpaceEventHandler.removeInputAction(
|
|
|
|
window.Cesium.ScreenSpaceEventType.LEFT_DOUBLE_CLICK
|
|
|
|
);
|
|
|
|
// handler.setInputAction(modelFollowMouse, Cesium.ScreenSpaceEventType.MOUSE_MOVE);
|
|
|
|
|
|
|
|
if (enablePointer.value) {
|
|
|
|
viewer.cesiumWidget.screenSpaceEventHandler.setInputAction((event) => {
|
|
|
|
let cartesian = viewer.scene.globe.pick(viewer.camera.getPickRay(event.position), viewer.scene);
|
|
|
|
if (!cartesian) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
// 世界坐标转换为弧度
|
|
|
|
let ellipsoid = viewer.scene.globe.ellipsoid;
|
|
|
|
let cartographic = ellipsoid.cartesianToCartographic(cartesian);
|
|
|
|
// 弧度转换为经纬度
|
|
|
|
let pointLon = Cesium.Math.toDegrees(cartographic.longitude); // 经度
|
|
|
|
let pointLat = Cesium.Math.toDegrees(cartographic.latitude); // 纬度
|
|
|
|
let pointAlt = cartographic.height; // 高度
|
|
|
|
|
|
|
|
console.log("点击的的经纬度坐标是:", {
|
|
|
|
"经度:": pointLon,
|
|
|
|
"纬度:": pointLat
|
|
|
|
});
|
|
|
|
pin && pin.destroy();
|
|
|
|
pin = new window.XE.Obj.Pin(window.earth);
|
|
|
|
pin.position = [cartographic.longitude, cartographic.latitude, pointAlt];
|
|
|
|
pin.imageUrl = dwPng;
|
|
|
|
},
|
|
|
|
window.Cesium.ScreenSpaceEventType.LEFT_CLICK
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
// /* 左键事件 */
|
|
|
|
handler.setInputAction((event) => {
|
|
|
|
handler.removeInputAction(window.Cesium.ScreenSpaceEventType.MOUSE_MOVE)
|
|
|
|
modelDw.value = false;
|
|
|
|
if (clearId != null) {
|
|
|
|
clearTimeout(clearId);
|
|
|
|
clearId = null;
|
|
|
|
}
|
|
|
|
cursorCss.value = `grabbing`;
|
|
|
|
}, window.Cesium.ScreenSpaceEventType.LEFT_DOWN);
|
|
|
|
handler.setInputAction((event) => {
|
|
|
|
if (clearId != null) {
|
|
|
|
clearTimeout(clearId);
|
|
|
|
clearId = null;
|
|
|
|
}
|
|
|
|
cursorCss.value = `grab`;
|
|
|
|
}, window.Cesium.ScreenSpaceEventType.LEFT_UP);
|
|
|
|
handler.setInputAction((event) => {
|
|
|
|
if (clearId != null) {
|
|
|
|
clearTimeout(clearId);
|
|
|
|
clearId = null;
|
|
|
|
}
|
|
|
|
cursorCss.value = `url(${rotationXYZ}),grab`;
|
|
|
|
}, window.Cesium.ScreenSpaceEventType.MIDDLE_DOWN);
|
|
|
|
handler.setInputAction((event) => {
|
|
|
|
if (clearId != null) {
|
|
|
|
clearTimeout(clearId);
|
|
|
|
clearId = null;
|
|
|
|
}
|
|
|
|
cursorCss.value = `grab`;
|
|
|
|
}, window.Cesium.ScreenSpaceEventType.MIDDLE_UP);
|
|
|
|
let clearId = null;
|
|
|
|
handler.setInputAction((event) => {
|
|
|
|
if (event > 0) {
|
|
|
|
cursorCss.value = `zoom-in`;
|
|
|
|
} else {
|
|
|
|
cursorCss.value = `zoom-out`;
|
|
|
|
}
|
|
|
|
|
|
|
|
clearId = setTimeout(() => {
|
|
|
|
clearTimeout(clearId);
|
|
|
|
cursorCss.value = `grab`
|
|
|
|
}, 2000);
|
|
|
|
}, window.Cesium.ScreenSpaceEventType.WHEEL);
|
|
|
|
// window.earth.onclick = function () {
|
|
|
|
// console.log(1);
|
|
|
|
// }
|
|
|
|
}
|
|
|
|
//添加地图上的监听事件-选取区域
|
|
|
|
const listenMouseHandlerSelect = function () {
|
|
|
|
// window.$earth.interaction.picking.enabled = true;
|
|
|
|
// window.$earth.interaction.picking.clickedColor = [1, 0, 0, 1];
|
|
|
|
const _handler = new window.Cesium.ScreenSpaceEventHandler(
|
|
|
|
_viewer.scene.canvas
|
|
|
|
);
|
|
|
|
// window.CesiumGlobalHandler = handler;
|
|
|
|
// 取消双击旋转事件
|
|
|
|
_viewer.cesiumWidget.screenSpaceEventHandler.removeInputAction(
|
|
|
|
window.Cesium.ScreenSpaceEventType.LEFT_DOUBLE_CLICK
|
|
|
|
);
|
|
|
|
_handler.setInputAction((click) => {
|
|
|
|
// 判断点击位置是否有实体
|
|
|
|
//返回具有 `primitive` 属性的对象,该属性包含场景中特定窗口坐标处的第一个(顶部)图元,如果该位置没有任何内容,则返回未定义的对象。其他属性可能会根据基元的类型进行设置,并可用于进一步识别拾取的对象。
|
|
|
|
let pickedFeature = _viewer.scene.pick(click.position);
|
|
|
|
// console.log("pick", pickedFeature);
|
|
|
|
|
|
|
|
let entity = pickedFeature && pickedFeature.id;
|
|
|
|
if (entity == undefined) { return; }
|
|
|
|
//区域选取
|
|
|
|
else if (typeof pickedFeature !== 'undefined' && entity.name == '区域选取') {
|
|
|
|
console.log("entity", entity);
|
|
|
|
//右键菜单
|
|
|
|
entity.showProperty()
|
|
|
|
}
|
|
|
|
|
|
|
|
}, window.Cesium.ScreenSpaceEventType.RIGHT_CLICK); //右键事件
|
|
|
|
|
|
|
|
}
|
|
|
|
// 获取其他切片
|
|
|
|
const getDataSource = async function () {
|
|
|
|
const params = {
|
|
|
|
pageNo: 1,
|
|
|
|
pageSize: 9999,
|
|
|
|
status: 1,
|
|
|
|
}
|
|
|
|
return getMapPage(params).then(
|
|
|
|
(res) => {
|
|
|
|
if (res.code == 200) {
|
|
|
|
const loyaut = {
|
|
|
|
ref: "loyauts",
|
|
|
|
expand: false,
|
|
|
|
title: "地图图层",
|
|
|
|
children: []
|
|
|
|
}
|
|
|
|
const records = res.result.records;
|
|
|
|
records.forEach(item => {
|
|
|
|
const czmObject = JSON.parse(item.czmObject);
|
|
|
|
const child = {
|
|
|
|
ref: item.id,
|
|
|
|
czmObject: czmObject,
|
|
|
|
enabled: true,
|
|
|
|
}
|
|
|
|
loyaut.children.push(child);
|
|
|
|
});
|
|
|
|
window.earth.sceneTree.root.children.push(loyaut);
|
|
|
|
|
|
|
|
const loyauts = window.earth.sceneTree.$refs["loyauts"].children;
|
|
|
|
editTileModelFunc(loyauts);
|
|
|
|
// 添加监听
|
|
|
|
watch([modelText, enableTile], ([newVal, newVal1], [oldValue, oldValue1]) => {
|
|
|
|
// 在模式为3D,并且启用切片的时候,将其他的切片展示出来
|
|
|
|
if (newVal == "3D" && newVal1) {
|
|
|
|
loyauts.forEach(loyaut => {
|
|
|
|
if (loyaut.czmObject.xbsjType == "Tileset") {
|
|
|
|
loyaut.enabled = true;
|
|
|
|
}
|
|
|
|
if (CModel.value) {
|
|
|
|
CModel.value.enabled = true;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
} else if (newVal == "2D" || !newVal1) {
|
|
|
|
// 禁用3D切片
|
|
|
|
loyauts.forEach(loyaut => {
|
|
|
|
if (loyaut.czmObject.xbsjType == "Tileset") {
|
|
|
|
loyaut.enabled = false;
|
|
|
|
}
|
|
|
|
if (CModel.value) {
|
|
|
|
CModel.value.enabled = false;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
})
|
|
|
|
} else {
|
|
|
|
message.error("无法显示数据!");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
).catch(
|
|
|
|
(e) => {
|
|
|
|
message.error("无法显示数据!");
|
|
|
|
}
|
|
|
|
)
|
|
|
|
}
|
|
|
|
// 放大缩小弹窗
|
|
|
|
const scaleWin = reactive({
|
|
|
|
status: false
|
|
|
|
})
|
|
|
|
const scaleWinFunc = function () {
|
|
|
|
const el = document.getElementsByClassName("EarthMap")[0].querySelector(".ant-modal-content");
|
|
|
|
if (!scaleWin.status) {
|
|
|
|
const width = window.innerWidth;
|
|
|
|
el.setAttribute("style", `width:${width}px;position:fixed;left:0;top:0;`);
|
|
|
|
scaleWin.status = true;
|
|
|
|
} else {
|
|
|
|
el.removeAttribute("style");
|
|
|
|
scaleWin.status = false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// 模型定位
|
|
|
|
const modelDw = ref(false);
|
|
|
|
const modelDwFunc = function (e) {
|
|
|
|
modelScaleStatus.value = false;
|
|
|
|
if (!modelDw.value) {
|
|
|
|
window.CesiumGlobalHandler.setInputAction(
|
|
|
|
modelFollowMouse, window.Cesium.ScreenSpaceEventType.MOUSE_MOVE
|
|
|
|
);
|
|
|
|
modelDw.value = true;
|
|
|
|
} else {
|
|
|
|
window.CesiumGlobalHandler.removeInputAction(window.Cesium.ScreenSpaceEventType.MOUSE_MOVE)
|
|
|
|
modelDw.value = false
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// 模型平移
|
|
|
|
const modelMove = ref(false);
|
|
|
|
const modelMoveFunc = function (e) {
|
|
|
|
if (!CModel.value) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
if (!modelMove.value) {
|
|
|
|
if (CModel.value.enabled == false) {
|
|
|
|
CModel.value.enabled = true;
|
|
|
|
}
|
|
|
|
CModel.value.czmObject.positionEditing = true;
|
|
|
|
modelRotation.value = false;
|
|
|
|
modelMove.value = true;
|
|
|
|
} else {
|
|
|
|
CModel.value.czmObject.positionEditing = false;
|
|
|
|
modelMove.value = false
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// 模型旋转
|
|
|
|
const modelRotation = ref(false);
|
|
|
|
const modelRotationFunc = function (e) {
|
|
|
|
if (!CModel.value) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
if (!modelRotation.value) {
|
|
|
|
if (CModel.value.enabled == false) {
|
|
|
|
CModel.value.enabled = true;
|
|
|
|
}
|
|
|
|
CModel.value.czmObject.rotationEditing = true;
|
|
|
|
modelMove.value = false;
|
|
|
|
modelRotation.value = true;
|
|
|
|
} else {
|
|
|
|
CModel.value.czmObject.rotationEditing = false;
|
|
|
|
modelRotation.value = false
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// 模型大小比例
|
|
|
|
const scaleValues = ref([1, 1, 1]);
|
|
|
|
const modelScaleStatus = ref(false);
|
|
|
|
// 模型放大缩小状态的切换
|
|
|
|
const modelScaleStatusChange = function () {
|
|
|
|
modelScaleStatus.value = !modelScaleStatus.value;
|
|
|
|
}
|
|
|
|
// 放大缩小值的配置
|
|
|
|
const scaleConfigObj = {
|
|
|
|
X: {
|
|
|
|
min: -10,
|
|
|
|
max: 10,
|
|
|
|
step: 1,
|
|
|
|
show: false,
|
|
|
|
},
|
|
|
|
Y: {
|
|
|
|
min: -10,
|
|
|
|
max: 10,
|
|
|
|
step: 1,
|
|
|
|
show: false,
|
|
|
|
},
|
|
|
|
Z: {
|
|
|
|
min: -10,
|
|
|
|
max: 10,
|
|
|
|
step: 1,
|
|
|
|
show: false,
|
|
|
|
},
|
|
|
|
};
|
|
|
|
const scaleConfig = ref(
|
|
|
|
{
|
|
|
|
...scaleConfigObj
|
|
|
|
}
|
|
|
|
)
|
|
|
|
// xyz所有轴都应用同一设置
|
|
|
|
const allSetting = function (propName) {
|
|
|
|
const keys = Object.keys(scaleConfig.value);
|
|
|
|
const beCopyObj = scaleConfig.value[propName];
|
|
|
|
keys.forEach(key => {
|
|
|
|
scaleConfig.value[key] = { ...beCopyObj, show: scaleConfig.value[key].show }
|
|
|
|
});
|
|
|
|
}
|
|
|
|
// 监听放大缩小值的变化
|
|
|
|
watch(scaleValues, (new_scale, scale) => {
|
|
|
|
if (!CModel.value || !CModel.value.czmObject) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
CModel.value.czmObject.xbsjScale = new_scale;
|
|
|
|
}, {
|
|
|
|
deep: true
|
|
|
|
})
|
|
|
|
// 销毁缓存
|
|
|
|
const destroyCache = function () {
|
|
|
|
scaleConfig.value = { ...scaleConfigObj };
|
|
|
|
scaleValues.value = [1, 1, 1];
|
|
|
|
modelRotation.value = false;
|
|
|
|
modelMove.value = false;
|
|
|
|
scaleWin.value = false;
|
|
|
|
modelScaleStatus.value = false;
|
|
|
|
modelDw.value = false;
|
|
|
|
enableTile.value = false;
|
|
|
|
|
|
|
|
// window.CesiumGlobalHandler.removeInputAction(window.Cesium.ScreenSpaceEventType.MOUSE_MOVE)
|
|
|
|
// window.CesiumGlobalHandler.removeInputAction(window.Cesium.ScreenSpaceEventType.LEFT_DOWN)
|
|
|
|
// window.CesiumGlobalHandler.removeInputAction(window.Cesium.ScreenSpaceEventType.LEFT_UP)
|
|
|
|
// window.CesiumGlobalHandler.removeInputAction(window.Cesium.ScreenSpaceEventType.MIDDLE_DOWN)
|
|
|
|
// window.CesiumGlobalHandler.removeInputAction(window.Cesium.ScreenSpaceEventType.MIDDLE_UP)
|
|
|
|
// window.CesiumGlobalHandler.removeInputAction(window.Cesium.ScreenSpaceEventType.WHEEL)
|
|
|
|
|
|
|
|
CModel.value && CModel.value.destroy();
|
|
|
|
earth && earth.destroy();
|
|
|
|
|
|
|
|
modelText.value = "2D";
|
|
|
|
scaleWin.status = false;
|
|
|
|
}
|
|
|
|
defineExpose(
|
|
|
|
{
|
|
|
|
CModel
|
|
|
|
}
|
|
|
|
);
|
|
|
|
</script>
|
|
|
|
<style scoped>
|
|
|
|
.container {}
|
|
|
|
|
|
|
|
.fill-9-row {
|
|
|
|
width: 90%;
|
|
|
|
}
|
|
|
|
|
|
|
|
.sliderRow {
|
|
|
|
display: flex;
|
|
|
|
justify-content: center;
|
|
|
|
align-items: center;
|
|
|
|
min-height: 50px;
|
|
|
|
}
|
|
|
|
|
|
|
|
.sliderContainer {
|
|
|
|
width: 200px;
|
|
|
|
}
|
|
|
|
|
|
|
|
.iconSize {
|
|
|
|
width: 16px;
|
|
|
|
height: 16px;
|
|
|
|
}
|
|
|
|
|
|
|
|
.colorBlue {
|
|
|
|
color: #1296db !important;
|
|
|
|
}
|
|
|
|
|
|
|
|
.iconSpan {
|
|
|
|
color: #fff;
|
|
|
|
display: block;
|
|
|
|
width: 36px;
|
|
|
|
height: 36px;
|
|
|
|
font-size: 16px;
|
|
|
|
font-style: normal;
|
|
|
|
line-height: 36px;
|
|
|
|
text-align: center;
|
|
|
|
text-transform: none;
|
|
|
|
text-rendering: auto;
|
|
|
|
background-color: rgba(0, 0, 0, 0.4);
|
|
|
|
cursor: pointer;
|
|
|
|
display: flex;
|
|
|
|
align-items: center;
|
|
|
|
justify-content: center;
|
|
|
|
}
|
|
|
|
|
|
|
|
.selectIcon {
|
|
|
|
position: absolute;
|
|
|
|
top: 108px;
|
|
|
|
left: 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
.testIcon {
|
|
|
|
position: absolute;
|
|
|
|
top: 188px;
|
|
|
|
left: 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
.clearIcon {
|
|
|
|
position: absolute;
|
|
|
|
top: 144px;
|
|
|
|
left: 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
.modelScale {
|
|
|
|
position: absolute;
|
|
|
|
top: 252px;
|
|
|
|
left: 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
.modelRotation {
|
|
|
|
position: absolute;
|
|
|
|
top: 216px;
|
|
|
|
left: 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
.modelMove {
|
|
|
|
position: absolute;
|
|
|
|
top: 180px;
|
|
|
|
left: 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
.modelDw {
|
|
|
|
position: absolute;
|
|
|
|
top: 144px;
|
|
|
|
left: 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
.scaleWin {
|
|
|
|
position: absolute;
|
|
|
|
top: 36px;
|
|
|
|
left: 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
.mapModel {
|
|
|
|
position: absolute;
|
|
|
|
top: 72px;
|
|
|
|
left: 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
.buildManage {
|
|
|
|
position: absolute;
|
|
|
|
top: 108px;
|
|
|
|
left: 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
:deep(.ant-modal-body) {
|
|
|
|
padding: 0px !important;
|
|
|
|
}
|
|
|
|
|
|
|
|
:deep(.ant-modal-close-x) {
|
|
|
|
color: #fff;
|
|
|
|
background-color: rgba(0, 0, 0, 0.4);
|
|
|
|
width: 36px;
|
|
|
|
height: 36px;
|
|
|
|
line-height: 36px;
|
|
|
|
}
|
|
|
|
</style>
|