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.

349 lines
9.4 KiB

<template>
<div class="map-container">
<div class="container-top">
<div class="next-stand">
<img src="../assets/images/next.png" alt="" />
<span>10.8</span>
</div>
<div class="real-time">
<img src="../assets/images/realTime.png" alt="" />
<span>5.1</span>
</div>
</div>
<mars-map @mapLoad="mapLoad" :options="options"></mars-map>
<div class="video-list">
<grids></grids>
</div>
</div>
</template>
<script>
import MarsMap from "@/components/mars-map";
import grids from "@/components/grids.vue";
export default {
data() {
const basePathUrl = window.basePathUrl || "";
return {
graphicLayer: null,
baseUrl: basePathUrl + "lib/geoJson/tileset.json",
map: null,
options: {
scene: {
center: {
lat: 31.212805,
lng: 120.607156,
alt: 5096.4,
heading: 357.9,
pitch: -31.5,
},
},
basemaps: [
{
name: "mapbox影像图",
icon: "img/basemaps/mapboxSatellite.png",
type: "mapbox",
username: "sharealex",
styleId: "cly5i21fn00e901prgq643t4r",
token:
"pk.eyJ1Ijoic2hhcmVhbGV4IiwiYSI6ImNsaXNhZmRjbTFhbnczZmxib3h1OW05YXYifQ.PhlKv60ar3K359d8x2yBPw",
tilesize: 256,
scaleFactor: false,
show: true,
},
],
},
};
},
components: { MarsMap, grids },
beforeDestroy() {},
mounted() {},
methods: {
mapLoad(map) {
this.map = map;
this.graphicLayer = new mars3d.layer.GraphicLayer();
map.addLayer(this.graphicLayer);
this.initTilesetLayer();
// this.createCar();
},
/**
* 加载姑苏区三维图层
*/
initTilesetLayer() {
let _this = this;
// 添加参考三维模型;
let tiles3dLayer = new mars3d.layer.TilesetLayer({
name: "姑苏区建筑物",
url: "https://www.jichuanglanhai.com:88/3dtiles/yunkun/tileset.json",
maximumScreenSpaceError: 1,
style: {
color: {
conditions: [["true", `color("rgba(42, 160, 224, 1)")`]],
},
},
});
this.map.addLayer(tiles3dLayer);
tiles3dLayer.on(mars3d.EventType.load, function (event) {
_this.createCar();
});
},
/**
* 生成车辆实时点位
*/
createCar() {
let _this = this;
for (let i = 0; i < 1; i++) {
const graphic = new mars3d.graphic.DivGraphic({
id: "car" + i,
position: [120.590416, 31.275593],
style: {
className: `carIcon`,
html: `<div>
<div class="car-name">001号线_01_早送_守押001_苏E</div>
</div>`,
color: "#fff",
horizontalOrigin: Cesium.HorizontalOrigin.CENTER, //居中防止自定义位置偏差
verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
distanceDisplayCondition: false,
clampToGround: true,
},
attr: {
index: i,
id: "car" + i,
},
});
this.graphicLayer.addGraphic(graphic);
// //绑定弹窗
this.bindPopup(graphic);
this.$nextTick(() => {
graphic.openPopup();
graphic.openHighlight(
{
className: `carIconActive`,
},
false
);
});
}
const circleGraphic = new mars3d.graphic.CircleEntity({
id: `circle1`,
position: new mars3d.LngLatPoint(120.590416, 31.275593),
style: {
radius: 150,
materialType: mars3d.MaterialType.CircleWave,
materialOptions: {
color: "#FAAC51",
count: 2,
speed: 10,
},
},
});
this.graphicLayer.addGraphic(circleGraphic);
this.map.flyToPoint([120.590416, 31.275593], {
radius: 798.9,
heading: 357.9,
pitch: -31.6,
});
// this.changePosition(0);
// 定时更新动态位置setInterval为演示
// const interval = 30;
// this.changePosition(interval);
// setInterval(() => {
// _this.changePosition(interval);
// }, interval * 1000);
},
bindPopup(fixedRoute) {
fixedRoute.bindPopup(
`<div class="diy-popup">
<div class="popup-title">001号线_01_早送_守押<br/>
001_苏E12345
</div>
<div class="popup-item">
<div class="popup-lable">线路类型</div>
<div class="popup-value">押运线路</div>
</div>
<div class="sub-title">装备信息</div>
<div class="popup-grid">
<div class="popup-item">
<div class="popup-lable">车牌号码</div>
<div class="popup-value">苏E12345守押001</div>
</div>
<div class="popup-item">
<div class="popup-lable">枪支</div>
<div class="popup-value">枪支147897-x</div>
</div>
<div class="popup-item">
<div class="popup-lable">枪支</div>
<div class="popup-value">枪支148097-x</div>
</div>
<div class="popup-item">
<div class="popup-lable">弹夹</div>
<div class="popup-value">弹夹585</div>
</div>
</div>
<div class="sub-title">人员信息</div>
<div class="popup-grid">
<div class="popup-item">
<div class="popup-lable">车长</div>
<div class="popup-value">张宏伟</div>
</div>
<div class="popup-item">
<div class="popup-lable">驾驶员</div>
<div class="popup-value">陈贵华</div>
</div>
<div class="popup-item">
<div class="popup-lable">押运员</div>
<div class="popup-value">王昌文</div>
</div>
<div class="popup-item">
<div class="popup-lable">押运员</div>
<div class="popup-value">李名</div>
</div>
</div>
</div>`,
{
className: "carPopup",
offsetX: 250,
offsetY: -50,
closeButton: false,
}
);
},
// 改变位置
changePosition(time) {
let _this = this;
this.graphicLayer.eachGraphic((graphic) => {
if (graphic.isPrivate) {
return;
}
graphic.addDynamicPosition(_this.randomPoint(), time); // 按time秒运动至指定位置
});
},
// 取区域内的随机点
randomPoint() {
const jd = this.random(120.5265 * 1000, 120.7177 * 1000) / 1000;
const wd = this.random(31.2783 * 1000, 31.4647 * 1000) / 1000;
return Cesium.Cartesian3.fromDegrees(jd, wd);
},
random(min, max) {
return Math.floor(Math.random() * (max - min + 1) + min);
},
chkShadows(val) {
let _this = this;
this.map.viewer.shadows = val;
if (val) {
setTimeout(function () {
// 光照沿着相机方向
_this.map.scene.shadowMap._lightCamera = _this.map.scene.camera;
}, 1500);
}
},
},
};
</script>
<style lang="scss" scoped>
.container-top {
position: fixed;
top: 23px;
left: 50%;
transform: translateX(-50%);
z-index: 2000;
display: flex;
align-items: center;
justify-content: center;
.next-stand {
margin-right: 40px;
}
& > div {
width: 200px;
img {
height: 38px;
width: 100%;
display: block;
margin-bottom: 10px;
}
span {
display: block;
font-size: 40px;
color: #ffffff;
line-height: 51px;
letter-spacing: 1px;
text-align: center;
font-style: normal;
background: linear-gradient(270deg, #00e5ff 0%, #d8d8d8 100%);
/* 将背景限制在文字区域内 */
-webkit-background-clip: text;
background-clip: text;
/* 设置文字颜色,会被背景图像遮住 */
color: transparent;
font-family: "DIN-Regular-2";
}
}
}
.video-list {
position: absolute;
bottom: 25px;
left: 50%;
transform: translateX(-50%);
z-index: 50;
padding: 10px;
display: flex;
align-items: center;
border: 1px solid #415367;
border-radius: 10px;
background: rgba(28, 31, 34, 0.6);
}
.multiple {
position: absolute;
bottom: 0;
left: 50%;
transform: translateX(-50%);
z-index: 50;
width: 880px;
height: 80px;
display: flex;
align-items: center;
justify-content: space-between;
background: url("../assets/images/multipleList.png");
background-size: 100% 100%;
padding: 0 230px;
.checkbox {
cursor: pointer;
width: 112px;
height: 32px;
line-height: 32px;
text-align: center;
font-size: 14px;
color: #ffffff;
background: linear-gradient(180deg, #072853 0%, #0079ff 100%);
// border-radius: 16px;
border: 1px solid #0084ff;
border-radius: 16px;
display: flex;
align-items: center;
justify-content: center;
}
.checked {
background: #fd873f;
color: #612500;
border: 0;
font-weight: bold;
border: 1px solid #f7c75d;
}
.btn-icon {
width: 15px;
height: 16px;
margin-right: 10px;
}
}
</style>