|
|
@@ -25,18 +25,19 @@
|
|
|
<script lang="ts" setup>
|
|
|
import 'vjmap/dist/vjmap.min.css';
|
|
|
import { ref, onMounted, onUnmounted, computed } from 'vue';
|
|
|
- import { Button } from 'ant-design-vue';
|
|
|
+ import { Button, message } from 'ant-design-vue';
|
|
|
import { useAppStore } from '/@/store/modules/app';
|
|
|
// import { useRoute } from 'vue-router';
|
|
|
import vjmap from 'vjmap';
|
|
|
- import type vjmap3d from 'vjmap3d';
|
|
|
+ // import type vjmap3d from 'vjmap3d';
|
|
|
import { getGeoJSON } from '/@/api/sys/map';
|
|
|
import { useMineDepartmentStore } from '/@/store/modules/mine';
|
|
|
import { get, last } from 'lodash-es';
|
|
|
import { env } from '/@/views/system/cadFile/env';
|
|
|
import { StatusColorEnum } from '/@/enums/jeecgEnum';
|
|
|
- import { generatePopupContent, generateSimplePopup } from './SimpleMap/simpleMap.data';
|
|
|
- import { initMap2d } from '/@/views/system/cadFile/app';
|
|
|
+ import { generatePopupContent, generateSimplePopup } from './hooks/popup';
|
|
|
+ import { initMap2d, renderGoafMarkers } from '/@/views/system/cadFile/app';
|
|
|
+ import { getGoafList } from '/@/views/system/cadFile/cad.api';
|
|
|
|
|
|
const appStore = useAppStore();
|
|
|
const mineStore = useMineDepartmentStore();
|
|
|
@@ -44,9 +45,9 @@
|
|
|
// const route = useRoute();
|
|
|
|
|
|
const mapContainer = ref<HTMLElement>();
|
|
|
+ let svc = new vjmap.Service(env.serviceUrl, env.accessToken);
|
|
|
let map: vjmap.Map;
|
|
|
- let app: vjmap3d.App;
|
|
|
- let cadOpened = false;
|
|
|
+ // let app: vjmap3d.App;
|
|
|
|
|
|
const GEO_LAYER_ID = 'geojson-layer';
|
|
|
const CIRCLE_LAYER_ID = 'circle-layer';
|
|
|
@@ -64,6 +65,7 @@
|
|
|
const historyStack = ref([DEFAULT_NODE]); // 用于存储历史节点的栈,实现返回上一级功能
|
|
|
const isTopLevel = computed(() => historyStack.value.length === 1);
|
|
|
|
|
|
+ /** 根据GeoJSON文件绘制省市边界和填充色到地图上,其将作为一个新图层 */
|
|
|
function initMapGeoJSON(map: vjmap.Map, geojson) {
|
|
|
map.addSource('geojson-data', {
|
|
|
type: 'geojson',
|
|
|
@@ -84,6 +86,7 @@
|
|
|
map.hoverFeatureState(GEO_LAYER_ID);
|
|
|
}
|
|
|
|
|
|
+ /** 根据标记点信息绘制两个图层,一个圆标点图层和一个文本标点图层 */
|
|
|
function initMapMarker(map: vjmap.Map, markers) {
|
|
|
// 绘制背景圆圈
|
|
|
const circles = new vjmap.Circle({
|
|
|
@@ -129,82 +132,102 @@
|
|
|
});
|
|
|
}
|
|
|
|
|
|
+ /** 标记点点击后,如果不是叶节点那么聚焦到下一级,如果已经是叶节点了则显示该节点的CAD地图 */
|
|
|
function markerClickHandler() {
|
|
|
const node: any = last(historyStack.value);
|
|
|
if (!node) return;
|
|
|
|
|
|
appStore.setSimpleMapParams({ deptId: node.id, isLeaf: node.isLeaf });
|
|
|
|
|
|
+ // 标点点击后,如果是叶节点需要显示CAD图
|
|
|
if (node.isLeaf) {
|
|
|
- document.getElementById('map2dContainer')!.style.display = 'block';
|
|
|
- initMap2d('map2dContainer').then((r) => {
|
|
|
- app = r!;
|
|
|
- cadOpened = true;
|
|
|
+ toggleCADMap(true);
|
|
|
+ } else {
|
|
|
+ map.setFilter(CIRCLE_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.flyTo({
|
|
|
+ center: [node.longitude, node.latitude],
|
|
|
+ zoom: node.zoom,
|
|
|
});
|
|
|
- return;
|
|
|
}
|
|
|
-
|
|
|
- map.setFilter(CIRCLE_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.flyTo({
|
|
|
- center: [node.longitude, node.latitude],
|
|
|
- zoom: node.zoom,
|
|
|
- });
|
|
|
}
|
|
|
|
|
|
- function revertStack() {
|
|
|
- if (cadOpened) {
|
|
|
- document.getElementById('map2dContainer')!.style.display = 'none';
|
|
|
- app.destroy();
|
|
|
- }
|
|
|
- if (historyStack.value.length > 1) {
|
|
|
- historyStack.value.pop();
|
|
|
+ /** 返回上一级操作,如果存在CAD地图,则切换至底图地图,否则回退历史记录栈 */
|
|
|
+ async function revertStack() {
|
|
|
+ if (historyStack.value.length === 1) return;
|
|
|
+ historyStack.value.pop()!;
|
|
|
+
|
|
|
+ toggleCADMap(false).then(() => {
|
|
|
markerClickHandler();
|
|
|
- }
|
|
|
+ });
|
|
|
}
|
|
|
|
|
|
+ /** 初始化地图对象,仅负责初始化地图及其瓦片底图,待map加载完成后返回 */
|
|
|
async function initMap(HTMLElement) {
|
|
|
- let svc = new vjmap.Service(env.serviceUrl, env.accessToken);
|
|
|
- map = new vjmap.Map({
|
|
|
+ const map = new vjmap.Map({
|
|
|
container: HTMLElement,
|
|
|
// 这个zoom配合了getGeoJSON,要改两边都要改
|
|
|
maxZoom: 20,
|
|
|
minZoom: 1,
|
|
|
center: [DEFAULT_NODE.longitude, DEFAULT_NODE.latitude],
|
|
|
zoom: DEFAULT_NODE.zoom,
|
|
|
- // style: {
|
|
|
- // version: 8,
|
|
|
- // name: 'my-style',
|
|
|
- // // 关键:配置字体服务地址
|
|
|
- // glyphs: 'https://fonts.vjmap.com/{fontstack}/{range}.pbf',
|
|
|
- // sources: {},
|
|
|
- // layers: [],
|
|
|
- // },
|
|
|
style: svc.rasterStyle('https://webrd01.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=7&x={x}&y={y}&z={z}'),
|
|
|
});
|
|
|
- // const [geojson, __, markers] = await getGeoJSON({ deptId: mineStore.getRoot?.id, pageSize: 9999 });
|
|
|
- const [___, [geojson, __, markers]] = await Promise.all([map.onLoad(), getGeoJSON({ deptId: mineStore.getRootId, pageSize: 9999 })]);
|
|
|
+ await map.onLoad();
|
|
|
|
|
|
- // await map.onLoad();
|
|
|
- // initMapWMS(map);
|
|
|
- initMapGeoJSON(map, geojson);
|
|
|
- initMapMarker(map, markers);
|
|
|
+ return map;
|
|
|
}
|
|
|
|
|
|
- onMounted(() => {
|
|
|
- if (!mineStore.getRoot?.isLeaf) {
|
|
|
- initMap(mapContainer.value!);
|
|
|
+ let cadOpened: boolean;
|
|
|
+ /** 切换CAD地图和瓦片地图的显示,通过重新初始化进行切换,避免出现动画异常和多个DOM节点 */
|
|
|
+ async function toggleCADMap(visiable: boolean) {
|
|
|
+ if (cadOpened === visiable) return;
|
|
|
+
|
|
|
+ cadOpened = visiable;
|
|
|
+ map?.destory();
|
|
|
+ if (visiable) {
|
|
|
+ const hide = message.loading('CAD图加载中...', 0);
|
|
|
+ const [m, res] = await Promise.all([
|
|
|
+ initMap2d(mapContainer.value!, {
|
|
|
+ // fileUrl: node.url
|
|
|
+ style: { backcolor: 0xe6f3ff },
|
|
|
+ }),
|
|
|
+ getGoafList({
|
|
|
+ mineCode: mineStore.getRoot?.fax,
|
|
|
+ deptId: mineStore.getRootId,
|
|
|
+ }),
|
|
|
+ ]);
|
|
|
+ hide();
|
|
|
+ map = m;
|
|
|
+
|
|
|
+ renderGoafMarkers(res); // 渲染标记
|
|
|
} else {
|
|
|
- document.getElementById('map2dContainer')!.style.display = 'block';
|
|
|
- initMap2d('map2dContainer')!.then((r) => (app = r!));
|
|
|
+ const hide = message.loading('地图加载中...', 0);
|
|
|
+ const [m, res] = await Promise.all([
|
|
|
+ initMap(mapContainer.value!),
|
|
|
+ getGeoJSON({
|
|
|
+ deptId: mineStore.getRootId,
|
|
|
+ pageSize: 9999,
|
|
|
+ }),
|
|
|
+ ]);
|
|
|
+ const [geojson, __, markers] = res;
|
|
|
+ hide();
|
|
|
+ map = m;
|
|
|
+
|
|
|
+ initMapGeoJSON(map, geojson);
|
|
|
+ initMapMarker(map, markers);
|
|
|
}
|
|
|
+ }
|
|
|
+
|
|
|
+ onMounted(() => {
|
|
|
+ toggleCADMap(mineStore.getRoot?.isLeaf || false);
|
|
|
});
|
|
|
|
|
|
onUnmounted(() => {
|
|
|
map?.remove();
|
|
|
- app?.destroy();
|
|
|
+ // app?.destroy();
|
|
|
});
|
|
|
</script>
|
|
|
|
|
|
@@ -232,63 +255,6 @@
|
|
|
// filter: sepia(0.3) hue-rotate(180deg) saturate(1.8);
|
|
|
}
|
|
|
|
|
|
- // .leaflet-popup {
|
|
|
- // color: @white;
|
|
|
- // &-content-wrapper {
|
|
|
- // background-color: @map-popup-bg;
|
|
|
- // }
|
|
|
-
|
|
|
- // &-tip {
|
|
|
- // background-color: @map-popup-bg;
|
|
|
- // }
|
|
|
-
|
|
|
- // .leaflet-popup-content {
|
|
|
- // margin: 13px 20px;
|
|
|
- // min-width: 280px;
|
|
|
- // // &__popup {
|
|
|
- // // }
|
|
|
-
|
|
|
- // &__divider {
|
|
|
- // height: 1px;
|
|
|
- // background-color: @white;
|
|
|
- // margin: 10px 5px;
|
|
|
- // }
|
|
|
-
|
|
|
- // &__title {
|
|
|
- // color: @white;
|
|
|
- // text-align: center;
|
|
|
- // }
|
|
|
-
|
|
|
- // &__board {
|
|
|
- // padding: 10px;
|
|
|
- // border-radius: 5px;
|
|
|
- // background-color: @map-popup-board-bg;
|
|
|
- // 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;
|
|
|
- // }
|
|
|
- // }
|
|
|
- // }
|
|
|
- // }
|
|
|
- // }
|
|
|
-
|
|
|
.vjmapgis-popup {
|
|
|
color: @white;
|
|
|
// &-content-wrapper {
|