You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
263 lines
6.4 KiB
263 lines
6.4 KiB
<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>
|
|
|