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.
JiangningUrbanManagePc/src/views/components/personagetrack/index.vue

697 lines
23 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<template>
<dia-log ref="dialog" width="45%" :title="title" :type="1">
<div class="personage-track">
<div class="track-title">
<div class="titlebg"></div>
<span class="name">{{ person ? personItem.userName : "执法一队1号车" }}</span>
<span>{{ person ? "执法1队队员" : "苏A568974" }}</span>
</div>
<div class="track-content">
<div class="oneList">
<div class="item" :class="person ? 'item-left' : 'car-item'">
<div class="ball"></div>
<div class="content">
{{ person ? "人员编号:" : "车辆编号:"
}}<span>{{
person ? personItem.userId : "201128881111100"
}}</span>
</div>
</div>
<!-- <div class="item car-item" v-if="!person">
<div class="ball"></div>
<div class="content">驾驶员姓名:<span>张三</span></div>
</div> -->
<div class="item">
<div class="ball"></div>
<div class="content">
当前状态:<span>{{ person ? personItem.status == '1' ? '在线' : personItem.status == '0' ? '离线' : '' : "行驶中" }}</span>
</div>
</div>
</div>
<div class="twoList">
<div class="item">
<div class="ball"></div>
<div class="content">
时间范围:
<div class="time-query">
<div class="interval-select">
<div class="star-time">
<el-date-picker
v-model="queryTime.fromTime"
type="datetime"
align="right"
:clearable="false"
format="yyyy-MM-dd HH:mm:ss"
value-format="yyyy-MM-dd HH:mm:ss"
placeholder="开始时间"
>
</el-date-picker>
</div>
<div class="symbol"></div>
<div class="end-time">
<el-date-picker
v-model="queryTime.toTime"
type="datetime"
align="right"
:clearable="false"
format="yyyy-MM-dd HH:mm:ss"
value-format="yyyy-MM-dd HH:mm:ss"
placeholder="结束时间"
>
</el-date-picker>
<img
class="data_icon"
src="@/assets/images/timeIcon.png"
alt=""
/>
</div>
</div>
</div>
<div class="btns reset" @click="reset">
<img src="@/assets/images/reset.png" alt="" />
<span>重置</span>
</div>
<div class="btns" @click="query">
<img src="@/assets/images/inquire.png" alt="" />
<span>查询</span>
</div>
</div>
</div>
</div>
<div class="threeList">
<div class="item">
<div class="item-top">
<div class="ball"></div>
<div class="contentTitle">轨迹地图:</div>
</div>
<div class="contentMap">
<!-- <div id="personageTrackMap">
</div> -->
<el-amap
v-loading="loading"
element-loading-background="rgba(16, 49, 92, 0.8)"
ref="personMap"
map-style="amap://styles/d02b66b0a7f190d5a1556a3f59c86518"
:center="center"
:zoom="zoom"
:zooms="zooms"
@init="init"
view-mode="3D"
:extra-options="{ vectorMapForeign: 'style_zh_cn' }"
class="amap-person"
>
<!-- 江宁GeoJson文件 -->
<!-- <el-amap-geojson @init="initLocation" :geo="jiangninggeo" ref="jiangningGeojson" :polygon-options="polygonOptions" :visible="true" :draggable="false"></el-amap-geojson> -->
</el-amap>
<!-- <img src="@/assets/images/minMap.png" alt="" /> -->
</div>
</div>
</div>
</div>
</div>
</dia-log>
</template>
<script>
import diaLog from "../../components/dialog/index.vue";
import jiangninggeo from "@/utils/mapJson/jiangningjingkaiqugeo.json";
import OneGJ02 from "@/utils/mapJson/1GJ02.json";
import TwoGJ02 from "@/utils/mapJson/2GJ02.json";
import ThreeGJ02 from "@/utils/mapJson/3GJ02.json";
import FourGJ02 from "@/utils/mapJson/4GJ02.json";
import kaifaqu from "@/utils/mapJson/开发区空港开发区GJ02.json";
import ruanjianyuan from "@/utils/mapJson/开发区软件园GJ02.json";
// import L from "leaflet";
// import "@/utils/lib/leaflet.ChineseTmsProviders.js";
// import "@/utils/lib/leaflet-tilelayer-colorizr.js";
import { getLocInfoByImei } from "@/api/bigScreenApi"
import { getCenter } from "@/utils/amap"
export default {
components: { diaLog },
data() {
return {
title: "人员行程轨迹",
person: false,
personItem: null,
queryTime: {
fromTime: "",
toTime: "",
},
heightStyle: {
height: "500px",
},
zoom: 12,
zooms:[10,18],
center: [118.835418, 31.863971],
map:null,
polygonOptions: {
strokeColor: '#00C5EC', // 线条颜色使用16进制颜色代码赋值。默认值为#00D3FC
fillColor: 'rgba(64,175,255,0.4)' // 多边形填充颜色使用16进制颜色代码赋值#00B2D5
},
jiangninggeo:jiangninggeo,
globalMap: null,
track: null,
mapLayer1: null,
loading: false,
layers:{
layer:null,
}
};
},
methods: {
init(map){
this.map = map;
map.setMapStyle("amap://styles/d02b66b0a7f190d5a1556a3f59c86518");
this.layers.layer = new AMap.OverlayGroup();
this.$nextTick(() => {
var geojson1 = new AMap.Polygon({
path:OneGJ02.features[0].geometry.coordinates[0][0],
strokeColor: '#00C5EC',
fillColor: '#00AEFF',
fillOpacity: 0.4,
// fillOpacity: 0.3,
editable:false,
visible:true,
})
var text1 = new AMap.Text({
// position: [element.properties.CENTERX,element.properties.CENTERY],
position: getCenter(OneGJ02.features[0].geometry.coordinates[0][0]),
anchor: 'bottom-center',
text: OneGJ02.features[0].properties.NAME,
style:{
'font-size': '16px',
'font-weight': 'bold',
'text-align': 'center',
'color': '#00AEFF',
'text-shadow': '0px 1px 0px rgba(0,0,0,0.3)',
'white-space': 'nowrap',
},
});
var geojson2 = new AMap.Polygon({
path:TwoGJ02.features[0].geometry.coordinates[0][0],
strokeColor: '#00C5EC',
fillColor: '#00AEFF',
fillOpacity: 0.4,
// fillOpacity: 0.3,
editable:false,
visible:true,
})
var text2 = new AMap.Text({
// position: [element.properties.CENTERX,element.properties.CENTERY],
position: getCenter(TwoGJ02.features[0].geometry.coordinates[0][0]),
anchor: 'bottom-center',
text: TwoGJ02.features[0].properties.NAME,
style:{
'font-size': '16px',
'font-weight': 'bold',
'text-align': 'center',
'color': '#00AEFF',
'text-shadow': '0px 1px 0px rgba(0,0,0,0.3)',
'white-space': 'nowrap',
},
});
var geojson3 = new AMap.Polygon({
path:ThreeGJ02.features[0].geometry.coordinates[0][0],
strokeColor: '#00C5EC',
fillColor: '#00AEFF',
fillOpacity: 0.4,
// fillOpacity: 0.3,
editable:false,
visible:true,
})
var text3 = new AMap.Text({
// position: [element.properties.CENTERX,element.properties.CENTERY],
position: getCenter(ThreeGJ02.features[0].geometry.coordinates[0][0]),
anchor: 'bottom-center',
text: ThreeGJ02.features[0].properties.NAME,
style:{
'font-size': '16px',
'font-weight': 'bold',
'text-align': 'center',
'color': '#00AEFF',
'text-shadow': '0px 1px 0px rgba(0,0,0,0.3)',
'white-space': 'nowrap',
},
});
var geojson4 = new AMap.Polygon({
path:FourGJ02.features[0].geometry.coordinates[0][0],
strokeColor: '#00C5EC',
fillColor: '#00AEFF',
fillOpacity: 0.4,
// fillOpacity: 0.3,
editable:false,
visible:true,
})
var text4 = new AMap.Text({
// position: [element.properties.CENTERX,element.properties.CENTERY],
position: getCenter(FourGJ02.features[0].geometry.coordinates[0][0]),
anchor: 'bottom-center',
text: FourGJ02.features[0].properties.NAME,
style:{
'font-size': '16px',
'font-weight': 'bold',
'text-align': 'center',
'color': '#00AEFF',
'text-shadow': '0px 1px 0px rgba(0,0,0,0.3)',
'white-space': 'nowrap',
},
});
var geojson5 = new AMap.Polygon({
path:kaifaqu.features[0].geometry.coordinates[0][0],
strokeColor: '#00C5EC',
fillColor: '#00AEFF',
fillOpacity: 0.4,
// fillOpacity: 0.3,
editable:false,
visible:true,
})
var text5 = new AMap.Text({
// position: [element.properties.CENTERX,element.properties.CENTERY],
position: getCenter(kaifaqu.features[0].geometry.coordinates[0][0]),
anchor: 'bottom-center',
text: kaifaqu.features[0].properties.NAME,
style:{
'font-size': '16px',
'font-weight': 'bold',
'text-align': 'center',
'color': '#00AEFF',
'text-shadow': '0px 1px 0px rgba(0,0,0,0.3)',
'white-space': 'nowrap',
},
});
var geojson6 = new AMap.Polygon({
path:ruanjianyuan.features[0].geometry.coordinates[0][0],
strokeColor: '#00C5EC',
fillColor: '#00AEFF',
fillOpacity: 0.4,
// fillOpacity: 0.3,
editable:false,
visible:true,
})
var text6 = new AMap.Text({
// position: [element.properties.CENTERX,element.properties.CENTERY],
position: getCenter(ruanjianyuan.features[0].geometry.coordinates[0][0]),
anchor: 'bottom-center',
text: ruanjianyuan.features[0].properties.NAME,
style:{
'font-size': '16px',
'font-weight': 'bold',
'text-align': 'center',
'color': '#00AEFF',
'text-shadow': '0px 1px 0px rgba(0,0,0,0.3)',
'white-space': 'nowrap',
},
});
this.layers.layer.addOverlay(geojson1);
this.layers.layer.addOverlay(geojson2);
this.layers.layer.addOverlay(geojson3);
this.layers.layer.addOverlay(geojson4);
this.layers.layer.addOverlay(geojson5);
this.layers.layer.addOverlay(geojson6);
this.map.add(this.layers.layer);
map.setFitView();
})
},
initLocation(){
// 获取地图实例
const mapInstance = this.$refs.personMap.$$getInstance();
// 调用 setFitView 方法居中和缩放地图以适应 GeoJSON 数据
mapInstance.setFitView();
},
open(person, item) {
// console.log(person)
// console.log(item);
if (person == "person") {
this.title = "人员行程轨迹";
this.personItem = item;
this.person = true;
this.queryTime.fromTime = this.getCurrentTime();
this.queryTime.toTime = this.getCurrentTime(1);
this.query();
} else {
this.title = "车辆行程轨迹";
this.person = false;
}
this.$refs.dialog.open("1");
// this.$nextTick(()=>{
// this.initMap();
// })
},
Close() {
this.$refs.dialog.Close();
},
// 地图初始化
initMap() {
this.globalMap = L.map("personageTrackMap", {
center: [31.953175, 118.839514], // 地图中心[纬度,经度]
zoom: 18, // 地图层级
zoomControl: false,
attributionControl: false, // 右下角leaflet图标
doubleClickZoom: false, // 双击放大
scrollWheelZoom: true, // 滚轮放大
dragging: true,
renderer: L.svg(),
});
L.tileLayer
.chinaProvider("GaoDe.Normal.Map", {
maxZoom: 18,
minZoom: 5,
color: { r: 10, g: 38, b: 74 }, //自定义颜色滤镜
})
.addTo(this.globalMap);
this.globalMap.createPane("mapLayer1");
this.globalMap.getPane("mapLayer1").style.zIndex = 501;
this.globalMap.getPane("mapLayer1").style.pointerEvents = "none";
this.addLayer1();
},
addLayer1() {
let geojson = L.geoJSON(
jiangninggeo,
{
style: function (feature) {
return {
color: "#00C5EC",
weight: 1,
fillColor: "rgba(64,175,255,0.4)",
fillOpacity: 1,
};
},
},
{ className: "jack-s" }
).addTo(this.globalMap);
// this.addMark()
// 获取json文件的中心位置
this.mapLayer1 = geojson.getBounds();
// 居中加载json文件
this.globalMap.fitBounds(this.mapLayer1);
},
// 时间重置
reset(){
Object.keys(this.queryTime).forEach(key=>{this.queryTime[key]=''})
if(this.map.getAllOverlays('polyline')) {
this.map.remove(this.map.getAllOverlays('polyline'));
}
const mapInstance = this.$refs.personMap.$$getInstance();
// 调用 setFitView 方法居中和缩放地图以适应 GeoJSON 数据
mapInstance.setFitView();
},
// 查询
query(){
if(!this.queryTime.fromTime) {
this.$modal.msgError("请选择查询的起始时间");
} else if(!this.queryTime.toTime) {
this.$modal.msgError("请选择查询的截止时间");
} else {
this.loading = true;
getLocInfoByImei({...this.queryTime,imei:this.personItem.imei}).then(res=>{
console.log(res,'行动轨迹');
this.loading = false;
if(res.code == 200 && res.data.result == '000') {
let arr = []
res.data.data.forEach(element => {
let arrTwo = [];
arrTwo[1] = element.latitude;
arrTwo[0] = element.longitude;
arr.push(arrTwo);
});
// if(this.track) {
// this.globalMap.removeLayer(this.track);
// }
if(this.map.getAllOverlays('polyline')) {
this.map.remove(this.map.getAllOverlays('polyline'));
}
this.track = new AMap.Polyline({
path: arr,
strokeColor: '#F44444',
strokeOpacity: 1,
})
this.map.add(this.track);
const mapInstance = this.$refs.personMap.$$getInstance();
// 调用 setFitView 方法居中和缩放地图以适应 GeoJSON 数据
mapInstance.setFitView(this.track);
// this.track = L.polyline(arr,{
// pane:'mapLayer1',
// // color: '#F894AF'
// color: 'red'
// }).addTo(this.globalMap)
// this.globalMap.fitBounds(this.track.getBounds());
} else if(res.code == 200 && res.data.msg) {
this.$modal.msgError(res.data.msg);
}
})
}
},
// 获取当前时间
getCurrentTime(id){
// 获取当前时间
const now = new Date();
// 获取年月日时分秒
const year = now.getFullYear();
const month = String(now.getMonth() + 1).padStart(2, '0'); // 月份从0开始所以加1并且格式化为两位数
const day = String(now.getDate()).padStart(2, '0'); // 格式化为两位数
const hours = String(now.getHours()).padStart(2, '0');
const minutes = String(now.getMinutes()).padStart(2, '0');
const seconds = String(now.getSeconds()).padStart(2, '0');
// 格式化为字符串
const formattedDateTime = `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
const formattedTime = `${year}-${month}-${day} 00:00:00`;
if(id == 1) {
return formattedDateTime;
} else {
return formattedTime;
}
},
},
};
</script>
<style lang="scss" scoped>
.personage-track {
.track-title {
display: flex;
align-items: center;
position: relative;
.titlebg {
position: absolute;
left: -15px;
top: -18px;
width: 50px;
height: 50px;
background-image: url("../../../assets/images/personnel.png");
background-position: center;
background-size: 100% 100%;
}
span {
font-size: 14px;
font-family: "Source Han Sans CN-Medium";
font-weight: 500;
color: #e9f4ff;
line-height: 14px;
}
.name {
margin: 0 15px 0 30px;
}
}
.track-content {
margin-top: 15px;
padding-left: 20px;
display: grid;
grid-column: 1fr;
grid-row-gap: 15px;
.oneList {
display: flex;
.item {
display: flex;
align-items: center;
.ball {
width: 4px;
height: 4px;
background: #daebff;
box-shadow: 0px 0px 10px 5px rgba(0, 119, 255, 0.25),
0px 0px 5px 0px rgba(229, 241, 255, 0.25);
border-radius: 20px 20px 20px 20px;
margin-right: 15px;
}
.content {
font-size: 14px;
font-family: "Source Han Sans CN-Medium";
font-weight: 500;
color: #cccccc;
line-height: 20px;
span {
font-size: 14px;
font-family: "Source Han Sans CN-Medium";
font-weight: 500;
color: #e9f4ff;
line-height: 20px;
}
}
}
.item-left {
margin-right: 150px;
}
.car-item {
margin-right: 80px;
}
}
.twoList {
.item {
display: flex;
align-items: center;
.ball {
width: 4px;
height: 4px;
background: #daebff;
box-shadow: 0px 0px 10px 5px rgba(0, 119, 255, 0.25),
0px 0px 5px 0px rgba(229, 241, 255, 0.25);
border-radius: 20px 20px 20px 20px;
margin-right: 15px;
}
.content {
display: flex;
align-items: center;
font-size: 14px;
font-family: "Source Han Sans CN-Medium";
font-weight: 500;
color: #cccccc;
line-height: 20px;
.time-query {
background-image: url("../../../assets/images/timebg.png");
width: 440px;
height: 35px;
background-size: 100% 100%;
.interval-select {
display: flex;
align-items: center;
::v-deep .el-input__prefix {
display: none;
}
.star-time,
.end-time {
position: relative;
.data_icon {
position: absolute;
right: 5px;
top: 8px;
width: 20px;
}
::v-deep .el-date-editor {
background-color: transparent;
width: 210px;
.el-input__inner {
background-color: transparent;
border: none;
width: 100%;
height: 35px;
font-size: 14px;
font-family: "Source Han Sans CN-Medium";
font-weight: 500;
color: #e9f4ff;
padding-left: 15px;
}
.el-input__inner::placeholder {
/* 在这里添加你想要修改的 placeholder 样式 */
font-size: 14px;
font-family: "Source Han Sans CN-Regular";
font-weight: 400;
color: #d3eef2;
-webkit-background-clip: text;
-webkit-text-fill-color: rgba(211, 238, 242, 0.2);
}
}
}
.symbol {
width: 14px;
height: 6px;
background-image: url("../../../assets/images/routeTime.png");
background-size: 100% 100%;
}
}
}
.btns {
width: 92px;
height: 35px;
background-image: url("../../../assets/images/inquirebg.png");
background-size: 100% 100%;
display: flex;
align-items: center;
justify-content: center;
cursor: pointer;
img {
width: 24px;
margin-right: 5px;
}
span {
font-size: 14px;
font-family: "Source Han Sans CN-Regular";
font-weight: 400;
color: #ffffff;
line-height: 20px;
}
}
.reset {
background-image: url("../../../assets/images/resetbg.png");
margin: 0 20px;
}
}
}
}
.threeList {
.item {
display: flex;
flex-direction: column;
.item-top {
display: flex;
align-items: center;
.ball {
width: 4px;
height: 4px;
background: #daebff;
box-shadow: 0px 0px 10px 5px rgba(0, 119, 255, 0.25),
0px 0px 5px 0px rgba(229, 241, 255, 0.25);
border-radius: 20px 20px 20px 20px;
margin-right: 15px;
}
.contentTitle {
font-size: 14px;
font-family: "Source Han Sans CN-Medium";
font-weight: 500;
color: #cccccc;
line-height: 20px;
}
}
.contentMap {
padding: 15px 74px 0 14px;
width: 100%;
height: 400px;
#personageTrackMap {
width: 100%;
height: 100%;
background-color: #fff;
}
.amap-person {
width: 100%;
height: 100%;
}
// img {
// width: 100%;
// height: 100%;
// }
}
}
}
}
}
</style>