|
@@ -1,7 +1,21 @@
|
|
|
<template>
|
|
|
<div class="mapContainer">
|
|
|
- <div id="map"></div>
|
|
|
- <el-button type="primary" @click="backParentMap" class="backBtn">按钮</el-button>
|
|
|
+ <div :style="{ width: mapState[mapState.active].width + 'px', height: mapState[mapState.active].height + 'px', position: 'relative' }">
|
|
|
+ <img :src="mapState[mapState.active].img" alt="" />
|
|
|
+ <div v-show="mapState.active === 'layersData'">
|
|
|
+ <div
|
|
|
+ v-for="(item, index) in mapState.markers"
|
|
|
+ :key="index"
|
|
|
+ class="marker"
|
|
|
+ :style="{ top: item.top + 'px', left: item.left + 'px' }"
|
|
|
+ @click="clickMarker(item.value)"
|
|
|
+ >
|
|
|
+ {{ item.label }}
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <el-button v-show="mapState.active !== 'layersData'" type="primary" class="backBtn" @click="backParentMap">返回上一级</el-button>
|
|
|
</div>
|
|
|
</template>
|
|
|
|
|
@@ -14,233 +28,69 @@ import gzImg from '@/assets/images/map/map-gaozhou.png';
|
|
|
import hzImg from '@/assets/images/map/map-huazhou.png';
|
|
|
import mnImg from '@/assets/images/map/map-maonan.png';
|
|
|
import xyImg from '@/assets/images/map/map-xinyi.png';
|
|
|
-import labelBg3 from '@/assets/images/map/label-bg-1-3.png';
|
|
|
-import labelBg4 from '@/assets/images/map/label-bg-1-4.png';
|
|
|
-
|
|
|
-interface Props {
|
|
|
- cityName?: '茂名市';
|
|
|
- center: number[];
|
|
|
- mapData: any[];
|
|
|
-}
|
|
|
-
|
|
|
-const props = withDefaults(defineProps<Props>(), {
|
|
|
- cityName: '茂名市',
|
|
|
- center: [110.999229, 21.919751]
|
|
|
-});
|
|
|
+import { deepClone } from '@/utils';
|
|
|
|
|
|
const emits = defineEmits(['onMarkerClick']);
|
|
|
let map = null;
|
|
|
let mapState = reactive({
|
|
|
+ active: 'layersData',
|
|
|
+ markers: [
|
|
|
+ { label: '茂南区', value: 'layersData_440902', top: 625, left: 305 },
|
|
|
+ { label: '电白区', value: 'layersData_440904', top: 625, left: 490 },
|
|
|
+ { label: '化州市', value: 'layersData_440982', top: 520, left: 120 },
|
|
|
+ { label: '高州市', value: 'layersData_440981', top: 420, left: 345 },
|
|
|
+ { label: '信宜市', value: 'layersData_440983', top: 170, left: 410 }
|
|
|
+ ],
|
|
|
// 茂名地形地图
|
|
|
layersData: {
|
|
|
img: mmImg,
|
|
|
- left: 110.297,
|
|
|
- bottom: 21.157,
|
|
|
- right: 111.723,
|
|
|
- top: 22.651
|
|
|
+ width: 810,
|
|
|
+ height: 849
|
|
|
},
|
|
|
// 地形-图片图层 - 电白
|
|
|
layersData_440904: {
|
|
|
- img: dbImg,
|
|
|
- left: 110.297,
|
|
|
- bottom: 21.157,
|
|
|
- right: 111.723,
|
|
|
- top: 22.651
|
|
|
+ img: dbImg
|
|
|
},
|
|
|
// 地形-图片图层 - 高州
|
|
|
layersData_440981: {
|
|
|
- img: gzImg,
|
|
|
- left: 110.297,
|
|
|
- bottom: 21.157,
|
|
|
- right: 111.723,
|
|
|
- top: 22.651
|
|
|
+ img: gzImg
|
|
|
},
|
|
|
// 地形-图片图层 - 化州
|
|
|
layersData_440982: {
|
|
|
- img: hzImg,
|
|
|
- left: 110.297,
|
|
|
- bottom: 21.157,
|
|
|
- right: 111.723,
|
|
|
- top: 22.651
|
|
|
+ img: hzImg
|
|
|
},
|
|
|
// 地形-图片图层 - 茂南
|
|
|
layersData_440902: {
|
|
|
- img: mnImg,
|
|
|
- left: 110.297,
|
|
|
- bottom: 21.157,
|
|
|
- right: 111.723,
|
|
|
- top: 22.651
|
|
|
+ img: mnImg
|
|
|
},
|
|
|
// 地形-图片图层 - 信宜
|
|
|
layersData_440983: {
|
|
|
- img: xyImg,
|
|
|
- left: 110.297,
|
|
|
- bottom: 21.157,
|
|
|
- right: 111.723,
|
|
|
- top: 22.651
|
|
|
- },
|
|
|
- boundaries: [],
|
|
|
- // 逻辑地图-点标记图标样式位置
|
|
|
- markerImgs: {
|
|
|
- // 3个字以内
|
|
|
- '3': {
|
|
|
- img: labelBg3,
|
|
|
- width: 148,
|
|
|
- height: 40,
|
|
|
- left: -49,
|
|
|
- top: -53
|
|
|
- },
|
|
|
- // 4个字
|
|
|
- '4': {
|
|
|
- img: labelBg4,
|
|
|
- width: 166,
|
|
|
- height: 40,
|
|
|
- left: -49,
|
|
|
- top: -53
|
|
|
- }
|
|
|
+ img: xyImg
|
|
|
}
|
|
|
});
|
|
|
|
|
|
-// 设置 地形-图片图层
|
|
|
-const setLayers = (code?: string) => {
|
|
|
- const layersData = code ? mapState['layersData_' + code] : mapState.layersData;
|
|
|
- const imageLayer = new AMap.ImageLayer({
|
|
|
- bounds: new AMap.Bounds([layersData.left, layersData.bottom], [layersData.right, layersData.top]),
|
|
|
- url: layersData.img,
|
|
|
- opacity: 1,
|
|
|
- zIndex: 3
|
|
|
- });
|
|
|
- map.setLayers([imageLayer]);
|
|
|
-};
|
|
|
-
|
|
|
-// 利用行政区查询获取边界构建mask路径 也可以直接通过经纬度构建mask路径
|
|
|
-const districtSearch = (name, callback, enable = true) => {
|
|
|
- if (!enable) {
|
|
|
- callback();
|
|
|
- return;
|
|
|
- }
|
|
|
- const district = new AMap.DistrictSearch({
|
|
|
- subdistrict: 0,
|
|
|
- extensions: 'all',
|
|
|
- level: 'city'
|
|
|
- });
|
|
|
- district.search(name, (status, result) => {
|
|
|
- const boundaries = result.districtList[0].boundaries;
|
|
|
- callback(boundaries);
|
|
|
- });
|
|
|
-};
|
|
|
-
|
|
|
-// 设置 地图下级区域Polygon多边形
|
|
|
-const setPolygons = () => {
|
|
|
- if (props.mapData.children && props.mapData.children.length) {
|
|
|
- props.mapData.children.forEach(item => {
|
|
|
- // 按产品需求,如果这个点的所有数据都为0或者空则不打点这个数据
|
|
|
- let allNull = true;
|
|
|
- item.infoData.forEach((ele) => {
|
|
|
- if (ele.value && ele.value !== '-') {
|
|
|
- allNull = false;
|
|
|
- }
|
|
|
- });
|
|
|
- if (!allNull) {
|
|
|
- const { marker, nodeMarker } = addMarker(item); // 设置逻辑地图打点marker
|
|
|
- // 标点点击事件
|
|
|
- marker.on('click', () => {
|
|
|
- console.log('click', item);
|
|
|
- emits('onMarkerClick', null, item);
|
|
|
- if (item.code) {
|
|
|
- map.clearMap();
|
|
|
- setLayers(item.code);
|
|
|
- }
|
|
|
- });
|
|
|
- marker.on('mouseover', () => {
|
|
|
- console.log('mouseover', item);
|
|
|
- });
|
|
|
- marker.on('mouseout', () => {
|
|
|
- console.log('mouseout', item);
|
|
|
- });
|
|
|
- }
|
|
|
- });
|
|
|
- // this.map.on('mouseout', e => {
|
|
|
- // !this.$store.state.mapInterval && this.intervalMarkerTips();
|
|
|
- // });
|
|
|
- }
|
|
|
+// marker样式位置
|
|
|
+const createMarkerNode = (item) => {
|
|
|
+ // console.log(item.name);
|
|
|
+ // let obj;
|
|
|
+ // let nodeMarker = `<div class="marker-container">${item.label}</div>`;
|
|
|
};
|
|
|
|
|
|
-// 添加标记
|
|
|
-const addMarker = (item) => {
|
|
|
- const position = new AMap.LngLat(item.center[0], item.center[1]);
|
|
|
- const { nodeMarker, offset } = getMarkerNode(item);
|
|
|
- console.log('开始设置打点marker');
|
|
|
- const marker = new AMap.Marker({
|
|
|
- position: position,
|
|
|
- content: nodeMarker,
|
|
|
- offset: offset
|
|
|
- });
|
|
|
- map.add(marker);
|
|
|
- return { marker, nodeMarker };
|
|
|
+// 子地图返回上级地图
|
|
|
+const backParentMap = () => {
|
|
|
+ mapState.active = 'layersData';
|
|
|
};
|
|
|
|
|
|
-// marker样式位置
|
|
|
-const getMarkerNode = (item) => {
|
|
|
- console.log(item.name);
|
|
|
- let obj;
|
|
|
- let nodeMarker = `<div class="marker-container">${item.name}</div>`;
|
|
|
- if (item.type && item.type === '1') {
|
|
|
- obj = mapState.markerImgs['4'];
|
|
|
- } else {
|
|
|
- obj = mapState.markerImgs['3'];
|
|
|
- }
|
|
|
- return {
|
|
|
- nodeMarker: nodeMarker,
|
|
|
- offset: new AMap.Pixel(obj.left, obj.top)
|
|
|
- };
|
|
|
+const initMap = () => {
|
|
|
+ mapState.active = 'layersData';
|
|
|
};
|
|
|
|
|
|
-// 子地图返回上级地图
|
|
|
-const backParentMap = () => {
|
|
|
- map.clearMap();
|
|
|
- setLayers();
|
|
|
- setPolygons();
|
|
|
+const clickMarker = (key) => {
|
|
|
+ mapState.active = key;
|
|
|
};
|
|
|
|
|
|
onMounted(() => {
|
|
|
- // window._AMapSecurityConfig = {
|
|
|
- // securityJsCode: 'c5a0d984a56ab366118f60cca08b9099'
|
|
|
- // };
|
|
|
- AMapLoader.load({
|
|
|
- // key: 'ef9090f018b879c7b896b352c01816dd', // 申请好的Web端开发者Key,首次调用 load 时必填
|
|
|
- key: '30d3d8448efd68cb0b284549fd41adcf', // 申请好的Web端开发者Key,首次调用 load 时必填
|
|
|
- version: '2.0', // 指定要加载的 JSAPI 的版本,缺省时默认为 1.4.15
|
|
|
- plugins: ['AMap.DistrictSearch']
|
|
|
- })
|
|
|
- .then((AMap) => {
|
|
|
- districtSearch(
|
|
|
- props.cityName,
|
|
|
- (boundaries) => {
|
|
|
- mapState.boundaries = boundaries;
|
|
|
- map = new AMap.Map('map', {
|
|
|
- // 是否为3D地图模式
|
|
|
- viewMode: '3D',
|
|
|
- pitch: 0,
|
|
|
- // 初始化地图级别
|
|
|
- zoom: 9.4,
|
|
|
- // 初始化地图中心点位置
|
|
|
- center: [props.center[0], props.center[1]],
|
|
|
- // 是否可拖拽
|
|
|
- dragEnable: false,
|
|
|
- // 是否允许通过鼠标滚轮来缩放
|
|
|
- scrollWheel: false
|
|
|
- });
|
|
|
- // 设置地图图层
|
|
|
- setLayers();
|
|
|
- setPolygons();
|
|
|
- },
|
|
|
- false
|
|
|
- );
|
|
|
- })
|
|
|
- .catch((e) => {
|
|
|
- console.log(e);
|
|
|
- });
|
|
|
+ initMap();
|
|
|
});
|
|
|
|
|
|
onUnmounted(() => {
|
|
@@ -252,10 +102,20 @@ onUnmounted(() => {
|
|
|
.mapContainer {
|
|
|
width: 100%;
|
|
|
height: 100%;
|
|
|
+ position: relative;
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ justify-content: center;
|
|
|
#map {
|
|
|
width: 100%;
|
|
|
height: 100%;
|
|
|
}
|
|
|
+ .marker {
|
|
|
+ position: absolute;
|
|
|
+ color: #fff;
|
|
|
+ cursor: pointer;
|
|
|
+ font-size: 16px;
|
|
|
+ }
|
|
|
.backBtn {
|
|
|
position: absolute;
|
|
|
bottom: 20px;
|