<template> <div class="AMapContainer" v-loading="loading" element-loading-text="地图加载中..." element-loading-spinner="el-icon-place" element-loading-background="rgba(0, 0, 0, 0.42)" ref="mapContainerRef" :style="{ ...this.size, ...getReverseStyle }" /> </template> <script lang="ts"> import { onceObserver } from "@screen/utils/resizeObserver"; import { loadAMap } from "./loadAMap"; const acData = require("./data/ac.json"); const lcz = require("./data/lcz.json"); export default { name: "AMapContainer", inject: ["adpScale"], data() { return { size: null, loading: true, }; }, computed: { getReverseStyle() { return { transform: `scale(${1 / this.adpScale.scaleX}, ${1 / this.adpScale.scaleY})`, }; }, }, async mounted() { // console.log(this.$refs.mapContainerRef); this.AMap = await loadAMap(); if (!this.AMap) return; onceObserver.call( this, this.$refs.mapContainerRef.parentElement, ({ width, height }) => (this.size = { width: `${width}px`, height: `${height + 24}px`, }) ); this.aMapIns = new this.AMap.Map(this.$refs.mapContainerRef, { resizeEnable: true, //是否监控地图容器尺寸变化 mapStyle: "amap://styles/blue", zoom: 9, center: [116.629514, 35.794168], }); this.aMapIns.on("complete", () => { this.loading = false; // var polyline1 = new this.AMap.Polyline({ // path: [], // strokeColor: "#67EBF7", // strokeWeight: 6, // strokeOpacity: 0.9, // zIndex: 50, // bubble: true, // }) // this.aMapIns.add([polyline1]) // this.initPolygon(this.AMap); //各市边界线 let acPolylines = []; for (let i = 0; i < acData.length; i++) { let datas = []; var poly = acData[i].polyline.split(";"); for (let j = 0; j < poly.length; j++) { datas.push(poly[j].split(",")); } let pl = drawingLine(this.AMap, datas); acPolylines.push(pl); // polyline.setMap(this.aMapIns) } this.aMapIns.add(acPolylines); //济菏高速里程桩数据 let lczDatas = []; for (let key in lcz) { lczDatas.push([lcz[key].lng, lcz[key].lat]); } //低缩放级别显示的道路 let jhgsPl1 = drawingLine(this.AMap, lczDatas, 3, 0); this.aMapIns.add(jhgsPl1); //高缩放级别显示的车道 let jhgsPl2 = drawJHPath(this.AMap, lczDatas, 1, 60); //地图缩放事件,缩放到一定级别显示道路 this.aMapIns.on('zoomend', () => { this.aMapIns.getZoom() > 19.5 ? this.aMapIns.add(jhgsPl2) : this.aMapIns.remove(jhgsPl2); }); this.aMapIns.on('zoomstart', () => { this.aMapIns.remove(jhgsPl2); }); }); //画线 function drawingLine(AMap, datas, borderWeight = 1,strokeWeight = 0, olColor = "#00B3CC") { return new AMap.Polyline({ path: datas, isOutline: true, outlineColor: olColor, borderWeight: borderWeight,//轮廓线宽度 strokeWeight: strokeWeight, // 线宽 strokeColor: '#394851', // 线颜色 // strokeColor: "#3366FF", strokeOpacity: 1,// 线透明度 strokeStyle: "solid",// 折线样式还支持 'dashed' // strokeStyle是dashed时有效 // strokeDasharray: [10, 5], lineJoin: "round", lineCap: "round", zIndex: 50 }); } //画车道 // let jhPolyline; function drawJHPath(AMap, lczPointList,borderWeight = 1,strokeWeight = 60) { return new AMap.Polyline({ path: lczPointList, // 设置线覆盖物路径 showDir: true, dirImg: createCanvas(), isOutline: true, outlineColor: '#C4C6C7', borderWeight: 2,//轮廓线宽度 strokeWeight: strokeWeight, // 线宽 strokeOpacity: 1, // 线透明度 draggable: false, //是否可移动 strokeStyle: "solid", // strokeDasharray: [10, 2, 10], strokeColor: '#394851', // 线颜色 }); } //画车道线 function createCanvas() { let canvasDir = document.createElement('canvas') let width = 150; let height = 150; canvasDir.width = width; canvasDir.height = height; var context = canvasDir.getContext('2d'); context.strokeStyle = '#C4C6C7'; context.lineJoin = 'round'; context.lineWidth = 5; //左边实线 // context.moveTo(5, 0); // context.lineTo(5, height); //左边虚线 context.moveTo(35, 0); context.lineTo(35, 50); context.moveTo(35, 100); context.lineTo(35, 150); //中间虚线 context.moveTo(75, 20); context.lineTo(75, 70); context.moveTo(75, 120); context.lineTo(75, 170); //右边虚线 context.moveTo(115, 0); context.lineTo(115, 50); context.moveTo(115, 100); context.lineTo(115, 150); //最右侧实线 // context.moveTo(width - 5, 0); // context.lineTo(width - 5, height); context.stroke(); // 绘制一个填充矩形 // context.fillStyle = "red"; // context.fillRect(0, 0, width, height); return canvasDir; } // this.aMapIns.enableAutoResize(); }, methods: { getMapInstance() { return { AMap: this.AMap, mapIns: this.aMapIns, }; }, }, unmounted() { if (!this.aMapIns) return; this.aMapIns.destroyed(); }, }; </script> <style lang='scss' scoped> .AMapContainer { position: absolute; z-index: -1; width: 100%; height: 100%; transform-origin: left top; background-color: #103253 !important; transition: all 0.15s linear; left: 0; top: 0; ::v-deep { .el-loading-mask { user-select: none; .el-loading-spinner { display: flex; align-items: center; justify-content: center; flex-direction: column; .el-loading-text, .el-icon-place { color: #59d1fe; font-size: 15px; } .el-icon-place { font-size: 18px; animation: 1.2s infinite jump; } } } } } @keyframes jump { 0%, 20%, 50%, 80%, 100% { transform: translateY(0); } 40% { transform: translateY(-30px); } 60% { transform: translateY(-15px); } } </style>