|
@@ -8,7 +8,7 @@
|
|
|
|
|
|
|
|
<script lang="ts" setup>
|
|
<script lang="ts" setup>
|
|
|
import 'vjmap/dist/vjmap.min.css';
|
|
import 'vjmap/dist/vjmap.min.css';
|
|
|
- import { ref, onMounted, onUnmounted, computed } from 'vue';
|
|
|
|
|
|
|
+ import { ref, onMounted, onUnmounted, computed, createApp } from 'vue';
|
|
|
import { Button } from 'ant-design-vue';
|
|
import { Button } from 'ant-design-vue';
|
|
|
import { useAppStore } from '/@/store/modules/app';
|
|
import { useAppStore } from '/@/store/modules/app';
|
|
|
// import { useRoute } from 'vue-router';
|
|
// import { useRoute } from 'vue-router';
|
|
@@ -19,9 +19,10 @@
|
|
|
import { get, last } from 'lodash-es';
|
|
import { get, last } from 'lodash-es';
|
|
|
// import { env } from '/@/views/system/cadFile/env';
|
|
// import { env } from '/@/views/system/cadFile/env';
|
|
|
import { StatusColorEnum } from '/@/enums/jeecgEnum';
|
|
import { StatusColorEnum } from '/@/enums/jeecgEnum';
|
|
|
- import { generatePopupContent, generateSimplePopup } from './hooks/popup';
|
|
|
|
|
|
|
+ import { generateSimplePopup } from './hooks/popup';
|
|
|
import { initMap2d, renderGoafMarkers } from '/@/views/system/cadFile/app';
|
|
import { initMap2d, renderGoafMarkers } from '/@/views/system/cadFile/app';
|
|
|
import { getGoafList } from '/@/views/system/cadFile/cad.api';
|
|
import { getGoafList } from '/@/views/system/cadFile/cad.api';
|
|
|
|
|
+ import LeafPopup from './components/LeafPopup.vue';
|
|
|
// import { useGlobSetting } from '/@/hooks/setting';
|
|
// import { useGlobSetting } from '/@/hooks/setting';
|
|
|
|
|
|
|
|
const appStore = useAppStore();
|
|
const appStore = useAppStore();
|
|
@@ -36,6 +37,7 @@
|
|
|
// let app: vjmap3d.App;
|
|
// let app: vjmap3d.App;
|
|
|
|
|
|
|
|
const GEO_LAYER_ID = 'geojson-layer';
|
|
const GEO_LAYER_ID = 'geojson-layer';
|
|
|
|
|
+ const GEO_BORDER_ID = 'geoline-layer';
|
|
|
const CIRCLE_LAYER_ID = 'circle-layer';
|
|
const CIRCLE_LAYER_ID = 'circle-layer';
|
|
|
const SYMBOL_LAYER_ID = 'symbol-layer';
|
|
const SYMBOL_LAYER_ID = 'symbol-layer';
|
|
|
const DEFAULT_NODE = {
|
|
const DEFAULT_NODE = {
|
|
@@ -62,11 +64,12 @@
|
|
|
fillColor: ['get', 'fillColor'],
|
|
fillColor: ['get', 'fillColor'],
|
|
|
fillOpacity: ['case', ['to-boolean', ['feature-state', 'hover']], 0.6, 0.2],
|
|
fillOpacity: ['case', ['to-boolean', ['feature-state', 'hover']], 0.6, 0.2],
|
|
|
fillOutlineColor: '#ff9100', // 边线颜色,没错,确实没有边线宽度这个选项,所以有了下面的LineLayer做边线
|
|
fillOutlineColor: '#ff9100', // 边线颜色,没错,确实没有边线宽度这个选项,所以有了下面的LineLayer做边线
|
|
|
- // filter: ['in', last(historyStack.value) as string, ['get', 'children']],
|
|
|
|
|
|
|
+ filter: ['in', last(historyStack.value)!.id, ['get', 'deptIds']],
|
|
|
});
|
|
});
|
|
|
- map.addLineLayer('geoline-layer', 'geojson-data', {
|
|
|
|
|
|
|
+ map.addLineLayer(GEO_BORDER_ID, 'geojson-data', {
|
|
|
lineColor: '#ff9100',
|
|
lineColor: '#ff9100',
|
|
|
lineWidth: 2,
|
|
lineWidth: 2,
|
|
|
|
|
+ filter: ['in', last(historyStack.value)!.id, ['get', 'deptIds']],
|
|
|
});
|
|
});
|
|
|
// map.hoverPointer([GEO_LAYER_ID]);
|
|
// map.hoverPointer([GEO_LAYER_ID]);
|
|
|
map.hoverFeatureState(GEO_LAYER_ID);
|
|
map.hoverFeatureState(GEO_LAYER_ID);
|
|
@@ -92,14 +95,12 @@
|
|
|
circles.hoverFeatureState();
|
|
circles.hoverFeatureState();
|
|
|
circles.hoverPopup(
|
|
circles.hoverPopup(
|
|
|
(f) => {
|
|
(f) => {
|
|
|
- if (f.properties.isLeaf) {
|
|
|
|
|
- return generatePopupContent(f.properties);
|
|
|
|
|
- } else {
|
|
|
|
|
|
|
+ if (!f.properties.isLeaf) {
|
|
|
return generateSimplePopup(f.properties);
|
|
return generateSimplePopup(f.properties);
|
|
|
}
|
|
}
|
|
|
},
|
|
},
|
|
|
{
|
|
{
|
|
|
- maxWidth: '500px',
|
|
|
|
|
|
|
+ maxWidth: '300px',
|
|
|
}
|
|
}
|
|
|
);
|
|
);
|
|
|
|
|
|
|
@@ -131,17 +132,33 @@
|
|
|
appStore.setSimpleMapParams({ deptId: node.id, isLeaf: node.isLeaf });
|
|
appStore.setSimpleMapParams({ deptId: node.id, isLeaf: node.isLeaf });
|
|
|
|
|
|
|
|
// 标点点击后,如果是叶节点需要显示CAD图
|
|
// 标点点击后,如果是叶节点需要显示CAD图
|
|
|
- if (node.isLeaf) {
|
|
|
|
|
- toggleCADMap(true, node);
|
|
|
|
|
- } else {
|
|
|
|
|
|
|
+ if (!node.isLeaf) {
|
|
|
map.setFilter(CIRCLE_LAYER_ID, ['==', node.id, ['get', 'parentId']]);
|
|
map.setFilter(CIRCLE_LAYER_ID, ['==', node.id, ['get', 'parentId']]);
|
|
|
map.setFilter(SYMBOL_LAYER_ID, ['==', node.id, ['get', 'parentId']]);
|
|
map.setFilter(SYMBOL_LAYER_ID, ['==', node.id, ['get', 'parentId']]);
|
|
|
- // map.setFilter(GEO_LAYER_ID, ['in', node.id, ['get', 'children']]);
|
|
|
|
|
|
|
+ map.setFilter(GEO_LAYER_ID, ['in', node.id, ['get', 'deptIds']]);
|
|
|
|
|
+ map.setFilter(GEO_BORDER_ID, ['in', node.id, ['get', 'deptIds']]);
|
|
|
|
|
|
|
|
map.flyTo({
|
|
map.flyTo({
|
|
|
center: [node.longitude, node.latitude],
|
|
center: [node.longitude, node.latitude],
|
|
|
zoom: node.zoom,
|
|
zoom: node.zoom,
|
|
|
});
|
|
});
|
|
|
|
|
+ } else {
|
|
|
|
|
+ const popup = new vjmap.Popup({ maxWidth: '1000' });
|
|
|
|
|
+ const app = createApp(LeafPopup, {
|
|
|
|
|
+ node,
|
|
|
|
|
+ callback() {
|
|
|
|
|
+ toggleCADMap(true, node).then(() => {
|
|
|
|
|
+ // 将历史栈推一个进去,因为用户要点击返回上一级时需要
|
|
|
|
|
+ historyStack.value.push(node);
|
|
|
|
|
+ });
|
|
|
|
|
+ },
|
|
|
|
|
+ });
|
|
|
|
|
+ const el = document.createElement('div');
|
|
|
|
|
+ app.mount(el);
|
|
|
|
|
+ // 将历史栈拉一个出来,因为点击后页面上并没有钻入下一级
|
|
|
|
|
+ historyStack.value.pop();
|
|
|
|
|
+
|
|
|
|
|
+ popup.setLngLat([node.longitude, node.latitude]).setDOMContent(el).addTo(map);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -259,63 +276,17 @@
|
|
|
// background-color: @map-popup-bg;
|
|
// background-color: @map-popup-bg;
|
|
|
// }
|
|
// }
|
|
|
|
|
|
|
|
- &-tip {
|
|
|
|
|
- background-color: @map-popup-bg;
|
|
|
|
|
|
|
+ &-anchor-bottom &-tip {
|
|
|
|
|
+ border-top-color: @map-popup-bg;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- .vjmapgis-popup-content {
|
|
|
|
|
|
|
+ &-content {
|
|
|
// margin: 13px 20px;
|
|
// margin: 13px 20px;
|
|
|
// min-width: 300px;
|
|
// min-width: 300px;
|
|
|
background-color: @map-popup-bg;
|
|
background-color: @map-popup-bg;
|
|
|
|
|
+ box-shadow: 0 0 10px #00000088;
|
|
|
// &__popup {
|
|
// &__popup {
|
|
|
// }
|
|
// }
|
|
|
-
|
|
|
|
|
- &__divider {
|
|
|
|
|
- height: 1px;
|
|
|
|
|
- background-color: @white;
|
|
|
|
|
- margin: 10px 5px;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- &__title {
|
|
|
|
|
- color: @white;
|
|
|
|
|
- text-align: center;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- &__strong {
|
|
|
|
|
- color: @white;
|
|
|
|
|
- text-align: center;
|
|
|
|
|
- font-weight: bold;
|
|
|
|
|
- font-size: 20px;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- &__board {
|
|
|
|
|
- padding: 10px;
|
|
|
|
|
- border-radius: 5px;
|
|
|
|
|
- background-color: @map-popup-board-bg;
|
|
|
|
|
- color: @text-color-base;
|
|
|
|
|
- display: flex;
|
|
|
|
|
- justify-content: space-between;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- &__table {
|
|
|
|
|
- color: @white;
|
|
|
|
|
- text-align: center;
|
|
|
|
|
-
|
|
|
|
|
- thead {
|
|
|
|
|
- height: 20px;
|
|
|
|
|
- }
|
|
|
|
|
- tbody {
|
|
|
|
|
- tr {
|
|
|
|
|
- background-color: @map-popup-table-th-bg;
|
|
|
|
|
- }
|
|
|
|
|
- tr:nth-child(even) {
|
|
|
|
|
- background-color: @map-popup-table-theven-bg;
|
|
|
|
|
- }
|
|
|
|
|
- td {
|
|
|
|
|
- padding: 5px;
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
.map-reset-btn {
|
|
.map-reset-btn {
|