|
|
<!--
|
|
|
* @Descripttion:
|
|
|
* @version:
|
|
|
* @Author: JC9527
|
|
|
* @Date: 2024-01-09 23:08:15
|
|
|
* @LastEditors: JC9527
|
|
|
* @LastEditTime: 2024-11-28 14:58:43
|
|
|
-->
|
|
|
<template>
|
|
|
<div class="map-main">
|
|
|
<!-- <div id="showMap" class="showMap"></div> -->
|
|
|
<!-- <el-amap
|
|
|
ref="map"
|
|
|
:min-zoom="10"
|
|
|
:max-zoom="22"
|
|
|
:center="center"
|
|
|
:zoom="zoom"
|
|
|
@init="init"
|
|
|
@click="click"
|
|
|
class="bmap-demo"
|
|
|
:events="selfMapEv"
|
|
|
>
|
|
|
</el-amap> -->
|
|
|
<el-amap
|
|
|
ref="map"
|
|
|
map-style="amap://styles/d02b66b0a7f190d5a1556a3f59c86518"
|
|
|
:center="center"
|
|
|
:zoom="zoom"
|
|
|
:zooms="zooms"
|
|
|
v-loading="mapLoading"
|
|
|
element-loading-background="rgba(11, 34, 72, 0.8)"
|
|
|
@init="init"
|
|
|
:extra-options="{ vectorMapForeign: 'style_zh_cn' }"
|
|
|
class="amap-demo"
|
|
|
>
|
|
|
<el-amap-layer-satellite :visible="visible"></el-amap-layer-satellite>
|
|
|
|
|
|
<!-- 江宁GeoJson文件 -->
|
|
|
<!-- <el-amap-geojson @init="initLocation" :geo="jiangninggeo" ref="geojson" :polygon-options="polygonOptions" :visible="true" :draggable="draggable"></el-amap-geojson> -->
|
|
|
|
|
|
<!-- marker标记点 -->
|
|
|
<!-- <el-amap-marker v-for="(marker, index) in markers" :key="index + 'marker'" :visible="componentMarker.visible" :offset='markerOffset' :position="marker.position" :draggable="false" @click="(e)=> clickMarker(marker,e)">
|
|
|
<div class="markerStyles">
|
|
|
<div v-if="marker.text" class="marker-Text">{{marker.text}}</div>
|
|
|
<div class="tag">
|
|
|
<span></span>
|
|
|
</div>
|
|
|
<img :src="marker.imgSrc" alt="">
|
|
|
</div>
|
|
|
</el-amap-marker> -->
|
|
|
|
|
|
<!-- 人员信息弹框 -->
|
|
|
<el-amap-info-window
|
|
|
v-if="personInfo.visible"
|
|
|
anchor="bottom-center"
|
|
|
:offset="[-10,-40]"
|
|
|
:closeWhenClickMap="true"
|
|
|
:position="personInfo.position"
|
|
|
:visible.sync="personInfo.visible">
|
|
|
<div class="person-popup">
|
|
|
<div class="person-title">
|
|
|
<div class="title">人员信息</div>
|
|
|
<img src="@/assets/images/dialogbg/close.png" class="mask" @click="markersClosePopup" alt="" />
|
|
|
</div>
|
|
|
<div class="person-main">
|
|
|
<div class="person-info">
|
|
|
<div class="info-left">
|
|
|
<div class="dot"></div>
|
|
|
<div class="name">姓名:</div>
|
|
|
</div>
|
|
|
<div class="position">{{ personInfo.info.userName || "-" }}</div>
|
|
|
</div>
|
|
|
<div class="person-info">
|
|
|
<div class="info-left">
|
|
|
<div class="dot"></div>
|
|
|
<div class="name">联系方式:</div>
|
|
|
</div>
|
|
|
<div class="position">{{ personInfo.personinfo ? personInfo.personinfo.phonenumber : "-" }}</div>
|
|
|
</div>
|
|
|
<div class="person-info">
|
|
|
<div class="info-left">
|
|
|
<div class="dot"></div>
|
|
|
<div class="name">所属部门:</div>
|
|
|
</div>
|
|
|
<div class="position">{{ personInfo.personinfo ? personInfo.personinfo.deptName : "-" }}</div>
|
|
|
</div>
|
|
|
<div class="person-info">
|
|
|
<div class="info-left">
|
|
|
<div class="dot"></div>
|
|
|
<div class="name">设备类型:</div>
|
|
|
</div>
|
|
|
<div class="position">执法仪</div>
|
|
|
</div>
|
|
|
<div class="person-info">
|
|
|
<div class="info-left">
|
|
|
<div class="dot"></div>
|
|
|
<div class="name">所属围栏:</div>
|
|
|
</div>
|
|
|
<div class="position">{{ personInfo.personinfo ? personInfo.personinfo.fenceName : '-' }}</div>
|
|
|
</div>
|
|
|
<div class="person-info">
|
|
|
<div class="info-left">
|
|
|
<div class="dot"></div>
|
|
|
<div class="name">当前位置:</div>
|
|
|
</div>
|
|
|
<div class="position">{{ personInfo.info.address }}</div>
|
|
|
</div>
|
|
|
<div class="btns">
|
|
|
<div @click="travelPath()">行程轨迹</div>
|
|
|
<!-- <div>附近队员</div> -->
|
|
|
<div @click="shareClick">位置分享</div>
|
|
|
<div @click="watchClick">强制观摩</div>
|
|
|
<div @click="taskClick">任务派发</div>
|
|
|
</div>
|
|
|
</div>
|
|
|
</div>
|
|
|
</el-amap-info-window>
|
|
|
|
|
|
<!-- 事件弹框 -->
|
|
|
<el-amap-info-window
|
|
|
v-if="eventInfo.visible"
|
|
|
:offset="[-10,-10]"
|
|
|
:closeWhenClickMap="true"
|
|
|
:position="eventInfo.position"
|
|
|
:visible.sync="eventInfo.visible"
|
|
|
>
|
|
|
<div class="event-popup" :class="eventInfo.info.status == '待受理' ? '':'event-popupTwo'">
|
|
|
<div class="event-title">
|
|
|
<div class="title">事件信息</div>
|
|
|
<!-- <div class="mask" @click="markersClosePopup"></div> -->
|
|
|
<img src="@/assets/images/dialogbg/close.png" class="mask" @click="markersClosePopup" alt="" />
|
|
|
</div>
|
|
|
<div class="event-main">
|
|
|
<div class="event-info">
|
|
|
<div class="dot"></div>
|
|
|
<div class="name">事件名称:</div>
|
|
|
<div class="position">{{ eventInfo.info.name }}</div>
|
|
|
</div>
|
|
|
<div class="event-info">
|
|
|
<div class="dot"></div>
|
|
|
<div class="name">事件类别:</div>
|
|
|
<el-tooltip :content="eventInfo.info.type" placement="top">
|
|
|
<div class="position">{{ eventInfo.info.type }}</div>
|
|
|
</el-tooltip>
|
|
|
</div>
|
|
|
<div class="event-info">
|
|
|
<div class="dot"></div>
|
|
|
<div class="name">事件地址:</div>
|
|
|
<el-tooltip :content="eventInfo.info.address" placement="top">
|
|
|
<div class="position">{{ eventInfo.info.address }}</div>
|
|
|
</el-tooltip>
|
|
|
</div>
|
|
|
<div class="event-info">
|
|
|
<div class="dot"></div>
|
|
|
<div class="name">描述:</div>
|
|
|
<el-tooltip :content="eventInfo.info.content" placement="top">
|
|
|
<div class="position">{{ eventInfo.info.content }}</div>
|
|
|
</el-tooltip>
|
|
|
</div>
|
|
|
<div class="event-info">
|
|
|
<div class="dot"></div>
|
|
|
<div class="name">状态:</div>
|
|
|
<div class="position">{{ eventInfo.info.status }}</div>
|
|
|
</div>
|
|
|
<div class="btn" v-show="eventInfo.info.status == '待受理'" @click="eventBtn">
|
|
|
指派
|
|
|
</div>
|
|
|
</div>
|
|
|
</div>
|
|
|
</el-amap-info-window>
|
|
|
|
|
|
<!-- 执法车辆弹框 -->
|
|
|
<el-amap-info-window
|
|
|
v-if="carInfo.visible"
|
|
|
:offset="[-0,-10]"
|
|
|
:closeWhenClickMap="true"
|
|
|
:position="carInfo.position"
|
|
|
:visible.sync="carInfo.visible"
|
|
|
>
|
|
|
<div class="car-popup">
|
|
|
<div class="car-title">
|
|
|
<div class="title">车辆信息</div>
|
|
|
<!-- <div class="mask" @click="markersClosePopup"></div> -->
|
|
|
<img src="@/assets/images/dialogbg/close.png" class="mask" @click="markersClosePopup" alt="" />
|
|
|
</div>
|
|
|
<div class="car-main">
|
|
|
<div class="car-info">
|
|
|
<div class="dot"></div>
|
|
|
<div class="name">{{carInfo.info.carName}}</div>
|
|
|
<div class="position">{{carInfo.info.carCode}}</div>
|
|
|
</div>
|
|
|
<!-- <div class="btn" @click="travelPath()">行程轨迹</div> -->
|
|
|
<div class="btns">
|
|
|
<div class="btn" @click="travelPath()">行程轨迹</div>
|
|
|
<div class="btn" @click="watchCarVideo">车载视频</div>
|
|
|
</div>
|
|
|
</div>
|
|
|
</div>
|
|
|
</el-amap-info-window>
|
|
|
|
|
|
<!-- 监控视频弹框 -->
|
|
|
<el-amap-info-window
|
|
|
v-if="monitoringInfo.visible"
|
|
|
:offset="[-10,-10]"
|
|
|
:closeWhenClickMap="true"
|
|
|
:position="monitoringInfo.position"
|
|
|
:visible.sync="monitoringInfo.visible"
|
|
|
>
|
|
|
<div class="monitoring-popup">
|
|
|
<div class="monitoring-title">
|
|
|
<div class="title">{{ monitoringInfo.info.name }}</div>
|
|
|
<!-- <div class="mask" @click="markersClosePopup"></div> -->
|
|
|
<img src="@/assets/images/dialogbg/close.png" class="mask" @click="markersClosePopup" alt="" />
|
|
|
</div>
|
|
|
<div class="monitoring">
|
|
|
<div class="monitoring-list">
|
|
|
<div class="person-info">
|
|
|
<div class="info-left">
|
|
|
<div class="dot"></div>
|
|
|
<div class="name">点位名称:</div>
|
|
|
</div>
|
|
|
<div class="position">{{ monitoringInfo.info.name || monitoringInfo.info.deviceName }}</div>
|
|
|
</div>
|
|
|
<!-- <div class="person-info">
|
|
|
<div class="info-left">
|
|
|
<div class="dot"></div>
|
|
|
<div class="name">在线状态:</div>
|
|
|
</div>
|
|
|
<div class="position">{{ monitoringInfo.info.status == 1 ? "在线":"离线" }}</div>
|
|
|
</div> -->
|
|
|
<div class="person-info">
|
|
|
<div class="info-left">
|
|
|
<div class="dot"></div>
|
|
|
<div class="name">安装位置:</div>
|
|
|
</div>
|
|
|
<div class="position">{{ monitoringInfo.info.installPlace }}</div>
|
|
|
</div>
|
|
|
</div>
|
|
|
<div class="btns">
|
|
|
<div class="btn" @click="monitorVideos(monitoringInfo.info.status)">上墙</div>
|
|
|
<div class="btn" @click="copyUrl()">转发</div>
|
|
|
</div>
|
|
|
</div>
|
|
|
</div>
|
|
|
</el-amap-info-window>
|
|
|
|
|
|
<!-- 沿街商铺分布 -->
|
|
|
<el-amap-info-window
|
|
|
v-if="shopInfo.visible"
|
|
|
:offset="[-10,-10]"
|
|
|
:closeWhenClickMap="true"
|
|
|
:position="shopInfo.position"
|
|
|
:visible.sync="shopInfo.visible"
|
|
|
>
|
|
|
<div class="event-popup">
|
|
|
<div class="event-title">
|
|
|
<div class="title">店铺基本信息</div>
|
|
|
<!-- <div class="mask" @click="markersClosePopup"></div> -->
|
|
|
<img src="@/assets/images/dialogbg/close.png" class="mask" @click="markersClosePopup" alt="" />
|
|
|
</div>
|
|
|
<div class="event-main">
|
|
|
<div class="event-info">
|
|
|
<div class="dot"></div>
|
|
|
<div class="name">商铺名称:</div>
|
|
|
<div class="position">{{ shopInfo.info.shopName }}</div>
|
|
|
</div>
|
|
|
<div class="event-info">
|
|
|
<div class="dot"></div>
|
|
|
<div class="name">商铺类型:</div>
|
|
|
<div class="position">{{ shopInfo.info.operation }}</div>
|
|
|
</div>
|
|
|
<div class="event-info">
|
|
|
<div class="dot"></div>
|
|
|
<div class="name">所在地址:</div>
|
|
|
<el-tooltip :content="shopInfo.info.bodyAddress" placement="top">
|
|
|
<div class="position">{{ shopInfo.info.bodyAddress }}</div>
|
|
|
</el-tooltip>
|
|
|
</div>
|
|
|
<div class="event-info">
|
|
|
<div class="dot"></div>
|
|
|
<div class="name">描述:</div>
|
|
|
<el-tooltip :content="shopInfo.info.bodyName" placement="top">
|
|
|
<div class="position">{{ shopInfo.info.bodyName }}</div>
|
|
|
</el-tooltip>
|
|
|
</div>
|
|
|
|
|
|
<div class="btn" @click="getShopInfo">
|
|
|
查看店铺详情
|
|
|
</div>
|
|
|
</div>
|
|
|
</div>
|
|
|
</el-amap-info-window>
|
|
|
</el-amap>
|
|
|
|
|
|
<div class="left-bg">
|
|
|
<div class="bgt"></div>
|
|
|
</div>
|
|
|
<transition name="left-animationMap">
|
|
|
<div class="map-left" v-if="leftAnimationData">
|
|
|
<!-- :personLine="personLine" -->
|
|
|
<map-left :carLine="carLine" @realTimeLocationClick="realTimeLocationClick" @carTimeLocationClick="realTimeLocationClick"></map-left>
|
|
|
</div>
|
|
|
</transition>
|
|
|
|
|
|
<img
|
|
|
:src="
|
|
|
leftAnimationData
|
|
|
? require('@/assets/images/action-left.png')
|
|
|
: require('@/assets/images/action-right.png')
|
|
|
"
|
|
|
alt=""
|
|
|
:class="!leftAnimationData ? 'left-image2' : 'left-image'"
|
|
|
@click="leftAnimation()"
|
|
|
/>
|
|
|
<div
|
|
|
class="middle-top-left"
|
|
|
:class="!leftAnimationData ? 'middle-top-left2' : 'middle-top-left'"
|
|
|
>
|
|
|
<div class="input-keyword" v-if="MyInput">
|
|
|
<!-- <el-input placeholder="请输入关键字" v-model="input">
|
|
|
<i slot="suffix" class="el-icon-search" @click="search"></i>
|
|
|
</el-input> -->
|
|
|
<el-autocomplete
|
|
|
prefix-icon="el-icon-search"
|
|
|
class="inline-input"
|
|
|
v-model="input"
|
|
|
:fetch-suggestions="querySearch"
|
|
|
placeholder="请输入关键字进行搜索"
|
|
|
:trigger-on-focus="false"
|
|
|
@select="handleSelect"
|
|
|
></el-autocomplete>
|
|
|
</div>
|
|
|
<div class="laser-positioning" @click="positioning" v-if="zadian">
|
|
|
<span>地图扎点</span>
|
|
|
<img src="@/assets/images/positioning.png" alt="" />
|
|
|
</div>
|
|
|
<div class="creation-task" @click="createdTask" v-if="zadian">
|
|
|
<span>新增事件</span>
|
|
|
<img src="@/assets/images/createdTask.png" alt="" />
|
|
|
</div>
|
|
|
</div>
|
|
|
<div class="monitoring-switch" v-if="!MyInput && actionMap == 4">
|
|
|
<div class="switchItems" v-for="(item,index) in switches" :key="index">
|
|
|
<el-switch
|
|
|
v-model="item.active"
|
|
|
@change="handleSwitchChange(index,item.id)">
|
|
|
</el-switch>
|
|
|
<div class="monitoring-type">{{ item.title }}</div>
|
|
|
</div>
|
|
|
</div>
|
|
|
<div
|
|
|
class="middle-bottom-left"
|
|
|
:class="!leftAnimationData ? 'middle-bottom-left2' : 'middle-bottom-left'"
|
|
|
>
|
|
|
<div class="list" @click="changeMap(1)">
|
|
|
<div class="leftbg" :class="actionMap == 1 ? 'action-map' : ''">
|
|
|
<img src="@/assets/images/icon1.png" alt="" />
|
|
|
</div>
|
|
|
<div class="rightbg" v-show="actionMap == 1">
|
|
|
<span>执法人员</span>
|
|
|
</div>
|
|
|
</div>
|
|
|
<div class="list" @click="changeMap(2)">
|
|
|
<div class="leftbg" :class="actionMap == 2 ? 'action-map' : ''">
|
|
|
<img src="@/assets/images/icon2.png" alt="" />
|
|
|
</div>
|
|
|
<div class="rightbg" v-show="actionMap == 2">
|
|
|
<span>巡查事件</span>
|
|
|
</div>
|
|
|
</div>
|
|
|
<!-- <div class="list" @click="changeMap(2)">
|
|
|
<div class="leftbg" :class="actionMap == 2 ? 'action-map' : ''">
|
|
|
<img src="@/assets/images/icon3.png" alt="" />
|
|
|
</div>
|
|
|
<div class="rightbg" v-show="actionMap == 2">
|
|
|
<span>重点事件</span>
|
|
|
</div>
|
|
|
</div> -->
|
|
|
<div class="list" @click="changeMap(3)">
|
|
|
<div class="leftbg" :class="actionMap == 3 ? 'action-map' : ''">
|
|
|
<img src="@/assets/images/icon4.png" alt="" />
|
|
|
</div>
|
|
|
<div class="rightbg" v-show="actionMap == 3">
|
|
|
<span>执法车辆</span>
|
|
|
</div>
|
|
|
</div>
|
|
|
<div class="list" @click="changeMap(4)">
|
|
|
<div class="leftbg" :class="actionMap == 4 ? 'action-map' : ''">
|
|
|
<img src="@/assets/images/icon5.png" alt="" />
|
|
|
</div>
|
|
|
<div class="rightbg" v-show="actionMap == 4">
|
|
|
<span>监控视频</span>
|
|
|
</div>
|
|
|
</div>
|
|
|
<div class="list" @click="changeMap(6)">
|
|
|
<div class="leftbg" :class="actionMap == 6 ? 'action-map' : ''">
|
|
|
<img class="images" src="@/assets/images/icon7.png" alt="" />
|
|
|
</div>
|
|
|
<div class="rightbg rightbgTwo" v-show="actionMap == 6">
|
|
|
<span>厂中厂园中园监控</span>
|
|
|
</div>
|
|
|
</div>
|
|
|
<div class="list" @click="changeMap(5)">
|
|
|
<div class="leftbg" :class="actionMap == 5 ? 'action-map' : ''">
|
|
|
<img src="@/assets/images/icon6.png" alt="" />
|
|
|
</div>
|
|
|
<div class="rightbg" v-show="actionMap == 5">
|
|
|
<span>沿街商铺分布</span>
|
|
|
</div>
|
|
|
</div>
|
|
|
</div>
|
|
|
<transition name="right-animationMap">
|
|
|
<div class="map-right" v-if="rightAnimationData">
|
|
|
<map-right
|
|
|
:quyuData="quyuData"
|
|
|
:weilanData="weilanData"
|
|
|
:luduanData="luduanData"
|
|
|
:wanggeData="wanggeData"
|
|
|
@divClick="divClick"
|
|
|
></map-right>
|
|
|
</div>
|
|
|
</transition>
|
|
|
|
|
|
<img
|
|
|
:src="
|
|
|
rightAnimationData
|
|
|
? require('@/assets/images/action-right.png')
|
|
|
: require('@/assets/images/action-left.png')
|
|
|
"
|
|
|
alt=""
|
|
|
:class="!rightAnimationData ? 'right-image2' : 'right-image'"
|
|
|
@click="rightAnimation()"
|
|
|
/>
|
|
|
|
|
|
<div
|
|
|
class="middle-bottom-right"
|
|
|
:class="
|
|
|
!rightAnimationData ? 'middle-bottom-right2' : 'middle-bottom-right'
|
|
|
"
|
|
|
>
|
|
|
<div class="btn-action">
|
|
|
<span :class="action == 1 ? 'action' : ''" @click="actionBtn(1)"
|
|
|
>电子地图</span
|
|
|
>
|
|
|
<span :class="action == 2 ? 'action' : ''" @click="actionBtn(2)"
|
|
|
>卫星地图</span
|
|
|
>
|
|
|
</div>
|
|
|
</div>
|
|
|
<div class="right-bg">
|
|
|
<div class="bgt"></div>
|
|
|
</div>
|
|
|
<div class="bottom-bg">
|
|
|
<div class="bgt"></div>
|
|
|
</div>
|
|
|
<personage-track ref="personageTrack"></personage-track>
|
|
|
<!-- 事件指派人员 -->
|
|
|
<crew-assign ref="crewAssign"></crew-assign>
|
|
|
<!-- <video-wall ref="videoWall"></video-wall> -->
|
|
|
<!-- 监控视频上墙 -->
|
|
|
<alone-video ref="aloneVideo"></alone-video>
|
|
|
<!-- 车载视频上墙 -->
|
|
|
<car-video ref="carVideo"></car-video>
|
|
|
<!-- 商铺详情 -->
|
|
|
<shop ref="shop" width="50%" title="商铺详情查看" />
|
|
|
<!-- 新增事件 -->
|
|
|
<new-event ref="newEvent" @cancel="cancel" @confirm="confirm"></new-event>
|
|
|
<!-- 任务派发 -->
|
|
|
<personage-task ref="personageTask"></personage-task>
|
|
|
<!-- 强制观摩弹框 -->
|
|
|
<el-dialog
|
|
|
:visible.sync="showVideo"
|
|
|
width="45%"
|
|
|
title="强制观摩"
|
|
|
:show-close="false"
|
|
|
:destroy-on-close="true"
|
|
|
:close-on-click-modal="false"
|
|
|
:close-on-press-escape="false"
|
|
|
custom-class="travel"
|
|
|
>
|
|
|
<template slot="title">
|
|
|
<div class="closeClick">
|
|
|
<div class="headline" text="title123kmalskdnj">
|
|
|
<div class="headlinetitle" text="强制观摩">强制观摩</div>
|
|
|
</div>
|
|
|
<!-- <div class="close" @click="videoClose"></div> -->
|
|
|
<img src="@/assets/images/dialogbg/close.png" class="closeimg" @click="videoClose" alt="" />
|
|
|
</div>
|
|
|
</template>
|
|
|
<div class="watch-video-play">
|
|
|
<video id='flvvideo' autoplay controls class="flv-js"></video>
|
|
|
</div>
|
|
|
</el-dialog>
|
|
|
</div>
|
|
|
</template>
|
|
|
<script>
|
|
|
import point from "@/utils/mapJson/point.json";
|
|
|
|
|
|
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 gridding from "@/utils/mapJson/中队小网格.json"
|
|
|
|
|
|
// import zhongdianluduan from "@/utils/mapJson/zhongdianluduan.json";
|
|
|
// import zhongdianquyu from "@/utils/mapJson/zhongdianquyu.json";
|
|
|
|
|
|
import mapLeft from "../components/mapLeftContent.vue";
|
|
|
import mapRight from "../components/mapRightContent.vue";
|
|
|
// import mapCentre from "../components/mapCentre.vue"
|
|
|
// 弹窗
|
|
|
import personageTrack from "../../components/personagetrack/index.vue";
|
|
|
import personageTask from "../../components/personageTask/index.vue";
|
|
|
import crewAssign from "../../components/crewAssign/index.vue";
|
|
|
import videoWall from "../../components/videoWall/index.vue";
|
|
|
import carVideo from "../../components/carVideo/index.vue";
|
|
|
import shop from "../../components/shop/index.vue";
|
|
|
import aloneVideo from "../../components/video/index.vue"
|
|
|
import newEvent from "../../components/newEvent/index.vue"
|
|
|
// import jiangningwangge from "@/utils/data/江宁开发区网格.json";
|
|
|
|
|
|
// import weilan from "@/utils/data/围栏1.json";
|
|
|
import { getCenter } from "@/utils/amap"
|
|
|
import {
|
|
|
regionalsettings,
|
|
|
roadsetting,
|
|
|
fence,
|
|
|
bgridsetting,
|
|
|
getDeviceList,
|
|
|
levelQywg,
|
|
|
videoSurveillance,
|
|
|
getVideoPageEq,
|
|
|
getPreviewURLs,
|
|
|
getCarManageList,
|
|
|
getStreetShopList,
|
|
|
listZhzz,
|
|
|
getUserByImei,
|
|
|
dwgjList,
|
|
|
onlinePeople,
|
|
|
DeviceListNewRequest,
|
|
|
getDeviceMediaUrlHls,
|
|
|
getVideoDevice
|
|
|
} from "@/api/bigScreenApi";
|
|
|
import {
|
|
|
previewURLs,
|
|
|
listpatrol
|
|
|
} from "@/api/bigScreenApi/eventApi.js"
|
|
|
import {
|
|
|
robotLogin,
|
|
|
ViewListPage
|
|
|
} from "@/api/bigScreenApi/robot.js"
|
|
|
// import { setRobotToken } from '@/utils/auth'
|
|
|
import flvjs from "flv.js";
|
|
|
import axios from "axios";
|
|
|
|
|
|
export default {
|
|
|
name: "myMap",
|
|
|
components: {
|
|
|
mapLeft,
|
|
|
mapRight,
|
|
|
personageTrack,
|
|
|
crewAssign,
|
|
|
videoWall,
|
|
|
shop,
|
|
|
aloneVideo,
|
|
|
newEvent,
|
|
|
personageTask,
|
|
|
carVideo
|
|
|
},
|
|
|
data() {
|
|
|
return {
|
|
|
zoom: 12,
|
|
|
zooms:[10,18],
|
|
|
center: [118.835418, 31.863971], // 121.59996, 31.197646
|
|
|
map: null,
|
|
|
componentMarker: {
|
|
|
visible: true,
|
|
|
},
|
|
|
switches: [
|
|
|
{ active: true, title: "视频监控", id: 1 },
|
|
|
{ active: false, title: "算法监控", id: 2 },
|
|
|
{ active: false, title: "自建监控", id: 3 },
|
|
|
],
|
|
|
// 所有点位信息
|
|
|
markers:[],
|
|
|
// 人员弹框信息
|
|
|
personInfo: {
|
|
|
position: [],
|
|
|
info: {},
|
|
|
personinfo:{},
|
|
|
visible: false,
|
|
|
},
|
|
|
// 事件弹框
|
|
|
eventInfo: {
|
|
|
position: [],
|
|
|
visible: false,
|
|
|
},
|
|
|
// 车辆弹框信息
|
|
|
carInfo: {
|
|
|
position: [],
|
|
|
info:{},
|
|
|
visible: false,
|
|
|
},
|
|
|
// 监控视频弹框信息
|
|
|
monitoringInfo: {
|
|
|
position: [],
|
|
|
info:{},
|
|
|
visible: false,
|
|
|
},
|
|
|
// 沿街商铺弹框信息
|
|
|
shopInfo: {
|
|
|
position: [],
|
|
|
info:{},
|
|
|
visible: false,
|
|
|
},
|
|
|
isClickLingtedPolygonId:false,
|
|
|
lightedPolygon:null,
|
|
|
lightedText:null,
|
|
|
highlightedPolygonId:null,
|
|
|
layers: {
|
|
|
layer:null,
|
|
|
text: null,
|
|
|
layer2:null,
|
|
|
layer3:null,
|
|
|
layer4:null,
|
|
|
text1:null,
|
|
|
markers:null,
|
|
|
},
|
|
|
showVideo:false,
|
|
|
videoCondition: {
|
|
|
destID: '9999112301',
|
|
|
msgType: 1,
|
|
|
},
|
|
|
player:null,
|
|
|
timer:null,
|
|
|
isPositioning:false,
|
|
|
markerOffset: [-35,-123],
|
|
|
mapLoading:false,
|
|
|
count:0,
|
|
|
cluster:null,
|
|
|
personMarkers:[],
|
|
|
MyInput:true,
|
|
|
zadian:false,
|
|
|
|
|
|
|
|
|
|
|
|
input: "", // 输入框的值
|
|
|
actionMap: 1, // 默认选中执法人员地图
|
|
|
action: 1, // 切换执法人员/车辆/事件分类/监控视频/沿街商铺分布 控制的值
|
|
|
leftAnimationData: true,
|
|
|
rightAnimationData: true,
|
|
|
wanggeData: null, // 区域网格数据
|
|
|
quyuData: null, // 重点区域数据
|
|
|
weilanData: null, // 考勤围栏数据
|
|
|
luduanData: null, // 重点路段
|
|
|
personLine: [], // 在线人员情况
|
|
|
carLine: [], // 车辆情况
|
|
|
visible: false, // 卫星底图是否显示
|
|
|
onIcon:null,
|
|
|
offIcon:null,
|
|
|
videoPoint:[],
|
|
|
videoUrl:"",
|
|
|
};
|
|
|
},
|
|
|
methods: {
|
|
|
// 网页刷新/浏览器关闭
|
|
|
beforeunloadHandler(event){
|
|
|
if(this.personInfo.info.userId && this.personInfo.info.imei) {
|
|
|
this._beforeUnload_time = new Date().getTime();
|
|
|
videoSurveillance({destId:this.personInfo.info.userId,imei:this.personInfo.info.imei,msgType:0}).then(res=>{})
|
|
|
}
|
|
|
},
|
|
|
unloadHandler(e){
|
|
|
this._gap_time = new Date().getTime()-this._beforeUnload_time;
|
|
|
if(this._gap_time <= 5){
|
|
|
if(this.personInfo.info.userId && this.personInfo.info.imei) {
|
|
|
videoSurveillance({destId:this.personInfo.info.userId,imei:this.personInfo.info.imei,msgType:0}).then(res=>{})
|
|
|
}
|
|
|
}
|
|
|
},
|
|
|
init(map) {
|
|
|
this.map = map;
|
|
|
// o.setMapStyle('amap://styles/darkblue')
|
|
|
map.setMapStyle("amap://styles/d02b66b0a7f190d5a1556a3f59c86518");
|
|
|
// console.log(o.getCenter())
|
|
|
// console.log(this.map,'initMapinitMap');
|
|
|
this.layers.layer = new AMap.OverlayGroup(); // 一级网格
|
|
|
this.layers.layer2 = new AMap.OverlayGroup(); // 二级网格 ⌈ 暂废弃 ⌋
|
|
|
this.layers.layer3 = new AMap.OverlayGroup(); // 围栏、路段、区域、及文本
|
|
|
this.layers.layer4 = new AMap.OverlayGroup(); // 地图扎点
|
|
|
this.layers.text = new AMap.OverlayGroup(); // 一级网格文本
|
|
|
this.layers.text1 = new AMap.OverlayGroup(); // 二级网格文本
|
|
|
this.layers.markers = new AMap.OverlayGroup(); // 监控视频markers
|
|
|
this.$nextTick(() => {
|
|
|
|
|
|
levelQywg({level:1}).then(res=>{
|
|
|
let W = [];
|
|
|
res.data.forEach(element=>{
|
|
|
let shapeStr = JSON.parse(element.shapeStr);
|
|
|
// console.log(shapeStr,"shapeStr");
|
|
|
W.push(shapeStr.features[0]);
|
|
|
let geojson = new AMap.Polygon({
|
|
|
path:shapeStr.features[0].geometry.coordinates[0],
|
|
|
strokeColor: '#00C5EC',
|
|
|
fillColor: '#00AEFF',
|
|
|
fillOpacity: 0.4,
|
|
|
// fillOpacity: 0.3,
|
|
|
editable:false,
|
|
|
visible:true,
|
|
|
extData:{
|
|
|
name: shapeStr.features[0].properties.NAME
|
|
|
},
|
|
|
})
|
|
|
var text = new AMap.Text({
|
|
|
// position: [element.properties.CENTERX,element.properties.CENTERY],
|
|
|
position: getCenter(shapeStr.features[0].geometry.coordinates[0]),
|
|
|
anchor: 'bottom-center',
|
|
|
text: shapeStr.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',
|
|
|
},
|
|
|
});
|
|
|
element.myPolygon = geojson;
|
|
|
element.text = text;
|
|
|
this.layers.layer.addOverlay(geojson);
|
|
|
this.layers.text.addOverlay(text);
|
|
|
})
|
|
|
this.wanggeData = res.data;
|
|
|
})
|
|
|
|
|
|
this.map.add(this.layers.layer);
|
|
|
this.map.add(this.layers.text);
|
|
|
map.setFitView();
|
|
|
// 获取二级网格数据
|
|
|
// this.getWanggeGeoJson();
|
|
|
// 获取围栏数据
|
|
|
this.getWeilanGeoJson();
|
|
|
// 获取重点区域数据
|
|
|
this.getQuyuGeoJson();
|
|
|
// 获取重点路段数据
|
|
|
this.getLuduanGeoJson();
|
|
|
|
|
|
// 修改图层组的层级在点击到围栏,区域,路段时监听网格时就能触发点击事件
|
|
|
// this.layers.layer2.setOptions({ zIndex: 100 });
|
|
|
// this.layers.layer3.setOptions({ zIndex: 99 });
|
|
|
this.layers.layer.on('click', (e)=>{
|
|
|
// console.log(e,'this.layers.layer2的点击事件');
|
|
|
if(this.isPositioning) {
|
|
|
// console.log(e,'eeeeeeee');
|
|
|
const icon = new AMap.Icon({
|
|
|
size: new AMap.Size(25, 34), //图标尺寸
|
|
|
image: require('../../../assets/images/icon/icon2.png'), //Icon 的图像
|
|
|
imageOffset: new AMap.Pixel(-9, -3), //图像相对展示区域的偏移量,适于雪碧图等
|
|
|
imageSize: new AMap.Size(135, 40), //根据所设置的大小拉伸或压缩图片
|
|
|
});
|
|
|
var marker = new AMap.Marker({
|
|
|
position: new AMap.LngLat(e.lnglat.lng, e.lnglat.lat),
|
|
|
anchor: 'bottom-center',
|
|
|
icon: icon
|
|
|
})
|
|
|
this.layers.layer4.addOverlay(marker);
|
|
|
map.add(this.layers.layer4)
|
|
|
let addressName
|
|
|
var lng = e.lnglat.lng + '';
|
|
|
var lat = e.lnglat.lat + '';
|
|
|
// let clickPoint = this.layers.layer2.getOverlays();
|
|
|
// for (var i = 0; i < clickPoint.length; i++) {
|
|
|
// console.log(clickPoint[i],'点击的地址');
|
|
|
// }
|
|
|
axios.get('https://restapi.amap.com/v3/geocode/regeo',{
|
|
|
params:{
|
|
|
key: "5f4a2c045cffa20551a0300c31c1ee78",
|
|
|
location: `${lng.substring(0,9)},${lat.substring(0,9)}`,
|
|
|
extensions: 'all',
|
|
|
// batch: true,
|
|
|
}
|
|
|
}).then(response=>{
|
|
|
// console.log(response,'response');
|
|
|
addressName = response.data.regeocode.aois[0]?.name || response.data.regeocode.pois[0]?.name;
|
|
|
// console.log(addressName,'this.addressName');
|
|
|
if(this.layers.layer4) {
|
|
|
// e.target.getExtData().name; e.target.getExtData()获取给图层设置的extData属性的name
|
|
|
this.$refs.newEvent.open({lnglat:e.lnglat,address:addressName,meshOccurs:e.target.getExtData().name,marker:marker});
|
|
|
this.isPositioning = false;
|
|
|
}
|
|
|
})
|
|
|
}
|
|
|
})
|
|
|
|
|
|
if(this.layers.layer3) {
|
|
|
this.layers.layer3.hide();
|
|
|
}
|
|
|
if(this.layers.text1){
|
|
|
this.layers.text1.hide();
|
|
|
}
|
|
|
// 获取点位
|
|
|
this.getMarkers(1);
|
|
|
// if(this.layers.layer2) {
|
|
|
// this.layers.layer2.hide();
|
|
|
// }
|
|
|
// zoomchange : 地图缩放级别更改后触发。 zoomstart : 缩放开始时触发。 zoomend : 缩放停止时触发。
|
|
|
map.on("zoomend", (ev) => {
|
|
|
let zoom = map.getZoom();
|
|
|
console.log(zoom,'zoom层级');
|
|
|
|
|
|
if(zoom < 11) {
|
|
|
this.componentMarker.visible = false;
|
|
|
this.personInfo.visible = false;
|
|
|
this.eventInfo.visible = false;
|
|
|
this.carInfo.visible = false;
|
|
|
this.monitoringInfo.visible = false;
|
|
|
this.shopInfo.visible = false;
|
|
|
} else {
|
|
|
this.componentMarker.visible = true;
|
|
|
if(zoom < 13.2) {
|
|
|
this.layers.layer.show();
|
|
|
this.layers.text.show();
|
|
|
if(zoom < 12) {
|
|
|
this.unlightedPolygonId()
|
|
|
}
|
|
|
if(this.layers.layer3) {
|
|
|
this.layers.layer3.hide();
|
|
|
this.isPositioning = false;
|
|
|
}
|
|
|
} else if(zoom > 13.2){
|
|
|
this.layers.layer.hide();
|
|
|
this.layers.text.hide();
|
|
|
this.layers.text1.show();
|
|
|
this.layers.layer3.show();
|
|
|
if(zoom > 14) {
|
|
|
this.layers.text1.show();
|
|
|
this.layers.layer3.show();
|
|
|
} else {
|
|
|
if(this.highlightedPolygonId !== 1) {
|
|
|
this.unlightedPolygonId()
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
});
|
|
|
});
|
|
|
},
|
|
|
|
|
|
// 人员非聚合自定义样式及点击事件
|
|
|
_personRenderMarker(context){
|
|
|
let imgSrc
|
|
|
// if(this.onIcon && this.offIcon){
|
|
|
// imgSrc = context.data[0].imgSrc == '1' ? this.onIcon : this.offIcon
|
|
|
// } else {
|
|
|
// imgSrc = context.data[0].imgSrc == '1' ? require("../../../assets/images/icon/icon1.png") : require("../../../assets/images/icon/offLine1.png")
|
|
|
// }
|
|
|
imgSrc = context.data[0].imgSrc == '1' ? require("../../../assets/images/icon/icon1.png") : require("../../../assets/images/icon/offLine1.png")
|
|
|
var content = `<div class="markerStyles"><div class="marker-Text" style="width:${context.data[0].text.length * 15}px">${context.data[0].text}</div><img src="${imgSrc}" alt=""></div>`;
|
|
|
var offset = new AMap.Pixel(-32.5, -48.5);
|
|
|
context.marker.setContent(content);
|
|
|
context.marker.setOffset(offset);
|
|
|
context.marker.on('click',(ev)=>{
|
|
|
// 根据imei获取人员信息
|
|
|
getUserByImei({imei:context.data[0].info.imei}).then(res=>{
|
|
|
if(res.code == 200) {
|
|
|
this.personInfo.position = context.data[0].position;
|
|
|
this.personInfo.info = context.data[0].info;
|
|
|
this.personInfo.personinfo = res.data[0];
|
|
|
this.personInfo.visible = true;
|
|
|
}
|
|
|
})
|
|
|
})
|
|
|
},
|
|
|
// 事件的非聚合自定义样式及点击事件
|
|
|
_eventMarker (context) {
|
|
|
// console.log(context,"context");
|
|
|
var content = `<div class="markerStyles"><img src="${context.data[0].info.status == '已处理' ? require("../../../assets/images/icon/offLine2.png") : require("../../../assets/images/icon/icon2.png")}" alt=""></div>`;
|
|
|
var offset = new AMap.Pixel(-13, -16);
|
|
|
context.marker.setContent(content)
|
|
|
context.marker.setOffset(offset)
|
|
|
context.marker.on('click',(ev)=>{
|
|
|
this.eventInfo.position = context.data[0].position;
|
|
|
this.eventInfo.info = context.data[0].info;
|
|
|
this.eventInfo.visible = true;
|
|
|
})
|
|
|
},
|
|
|
// 车辆非聚合自定义样式及点击事件
|
|
|
_carMarker(context){
|
|
|
var content = `<div class="markerStyles"><img src="${require("../../../assets/images/icon/icon4.png")}" alt=""></div>`;
|
|
|
var offset = new AMap.Pixel(-13, -16);
|
|
|
context.marker.setContent(content)
|
|
|
context.marker.setOffset(offset)
|
|
|
context.marker.on('click',(ev)=>{
|
|
|
this.carInfo.position = context.data[0].position;
|
|
|
this.carInfo.info = context.data[0].info;
|
|
|
this.carInfo.visible = true;
|
|
|
})
|
|
|
},
|
|
|
// 视频非聚合自定义样式及点击事件
|
|
|
_renderMarker (context) {
|
|
|
// ${<span v-for="(item,index) in context.data[0].info.videoTagsList">item.name</span>}
|
|
|
// ${context.data[0].info.videoTagsList?.map(item => `<span>${item.name}</span>`).join('')}
|
|
|
// var content = `<div class="markerStyles"><img src="${context.data[0].info.status == 1 ? require("../../../assets/images/icon/icon5.png") : require("../../../assets/images/icon/offLine4.png")}" alt=""></div>`;
|
|
|
var content = `<div class="markerStyles"><div class="tag">${context.data[0].info.videoTagsList?.map(item => `<span>${item.name}</span>`).join('')}</div><img src="${require("../../../assets/images/icon/icon5.png")}" alt=""></div>`;
|
|
|
var offset = new AMap.Pixel(-13.5, -15);
|
|
|
context.marker.setContent(content)
|
|
|
context.marker.setOffset(offset)
|
|
|
context.marker.on('click',(ev)=>{
|
|
|
this.monitoringInfo.position = context.data[0].position;
|
|
|
this.monitoringInfo.info = context.data[0].info;
|
|
|
this.monitoringInfo.visible = true;
|
|
|
})
|
|
|
},
|
|
|
// 厂中厂园中园视频非聚合自定义样式及点击事件
|
|
|
_renderMarkerTwo (context) {
|
|
|
// ${context.data[0].info.deviceName.length * 17}
|
|
|
var content = `<div class="markerStyles"><div class="marker-Text" style="width:85px">${context.data[0].info.deviceName}</div><img src="${require("../../../assets/images/icon/icon5.png")}" alt=""></div>`;
|
|
|
let strLength = context.data[0].info.deviceName.length / 5;
|
|
|
var offset = new AMap.Pixel(-28.5, -(Math.floor(strLength) * 36));
|
|
|
context.marker.setContent(content)
|
|
|
context.marker.setOffset(offset)
|
|
|
context.marker.on('click',(ev)=>{
|
|
|
// this.monitoringInfo.position = context.data[0].position;
|
|
|
// this.monitoringInfo.info = context.data[0].info;
|
|
|
// this.monitoringInfo.visible = true;
|
|
|
getDeviceMediaUrlHls({deviceCode:context.data[0].info.deviceCode}).then(res=>{
|
|
|
if(res.url) {
|
|
|
this.$refs.aloneVideo.open(res.url);
|
|
|
}
|
|
|
// else {
|
|
|
// this.$modal.msgError(res.msg);
|
|
|
// }
|
|
|
})
|
|
|
})
|
|
|
},
|
|
|
// 店铺非聚合自定义样式及点击事件
|
|
|
_DrenderMarker(context) {
|
|
|
// <div class="marker-Text" style="width:${context.data[0].info.shopName.length * 15}px">${context.data[0].info.shopName}</div>
|
|
|
var content = `<div class="markerStyles"><img src="${require("../../../assets/images/icon/icon6.png")}" alt=""></div>`;
|
|
|
var offset = new AMap.Pixel(-13.5, -15);
|
|
|
context.marker.setContent(content)
|
|
|
context.marker.setOffset(offset);
|
|
|
context.marker.on('click',(ev)=>{
|
|
|
this.shopInfo.position = context.data[0].position;
|
|
|
this.shopInfo.info = context.data[0].info;
|
|
|
this.shopInfo.visible = true;
|
|
|
})
|
|
|
},
|
|
|
|
|
|
|
|
|
// 各个点位获取
|
|
|
getMarkers(id,status){
|
|
|
if (this.cluster) {
|
|
|
this.cluster.setMap(null);
|
|
|
}
|
|
|
let ico1 = require("../../../assets/images/icon/icon1.png");
|
|
|
let ico2 = require("../../../assets/images/icon/icon2.png");
|
|
|
let ico3 = require("../../../assets/images/icon/icon3.png");
|
|
|
let ico4 = require("../../../assets/images/icon/icon4.png");
|
|
|
let ico5 = require("../../../assets/images/icon/icon5.png");
|
|
|
let ico6 = require("../../../assets/images/icon/icon6.png");
|
|
|
let offIcon1 = require("../../../assets/images/icon/offLine1.png");
|
|
|
let offIcon2 = require("../../../assets/images/icon/offLine2.png");
|
|
|
let offIcon3 = require("../../../assets/images/icon/offLine3.png");
|
|
|
let offIcon4 = require("../../../assets/images/icon/offLine4.png");
|
|
|
let imgUrl = require("../../../assets/images/icon/green.png")
|
|
|
var sts = [{
|
|
|
url: imgUrl,
|
|
|
size: new AMap.Size(32, 32),
|
|
|
offset: new AMap.Pixel(-16, -16),
|
|
|
textColor:"#FFFFFF",
|
|
|
textSize:14
|
|
|
}, {
|
|
|
url: imgUrl,
|
|
|
size: new AMap.Size(32, 32),
|
|
|
offset: new AMap.Pixel(-16, -16),
|
|
|
textColor:"#FFFFFF",
|
|
|
textSize:14
|
|
|
}, {
|
|
|
url: imgUrl,
|
|
|
size: new AMap.Size(32, 32),
|
|
|
offset: new AMap.Pixel(-18, -18),
|
|
|
textColor:"#FFFFFF",
|
|
|
textSize:14
|
|
|
}];
|
|
|
this.mapLoading = status ? false : true;
|
|
|
if(id == 1) {
|
|
|
this.personLine = [];
|
|
|
this.videoPoint = [];
|
|
|
// 获取人员信息
|
|
|
onlinePeople().then((res) => {
|
|
|
this.mapLoading = false;
|
|
|
// console.log(res,'点位信息');
|
|
|
if (res.data) {
|
|
|
res.data.forEach((element) => {
|
|
|
if (element.status == "0" || element.status == "1") {
|
|
|
this.personLine.push(element);
|
|
|
let obj = {position:[]};
|
|
|
obj.position[0] = element.longitude;
|
|
|
obj.position[1] = element.latitude;
|
|
|
obj.text = element.userName;
|
|
|
obj.lnglat = new AMap.LngLat(element.longitude ? element.longitude : 0 ,element.latitude ? element.latitude : 0)
|
|
|
// obj.imgSrc = element.status == "0" ? offIcon1 : element.status == "1"? ico1 : ico1;
|
|
|
obj.imgSrc = element.status;
|
|
|
obj.userId = element.userId;
|
|
|
obj.info = element;
|
|
|
this.videoPoint.push(obj)
|
|
|
}
|
|
|
})
|
|
|
this.count = this.videoPoint.length;
|
|
|
AMap.plugin(['AMap.MarkerCluster'],()=>{
|
|
|
this.cluster = new AMap.MarkerCluster(this.map,this.videoPoint,{
|
|
|
gridSize: 60, // 设置网格像素大小
|
|
|
styles: sts,
|
|
|
maxZoom: 15,
|
|
|
// renderClusterMarker: this._renderClusterMarker, // 自定义聚合点样式
|
|
|
renderMarker: this._personRenderMarker, // 自定义非聚合点样式
|
|
|
})
|
|
|
})
|
|
|
} else {
|
|
|
this.$modal.msgError("执法人员" + res.data.msg);
|
|
|
}
|
|
|
}).catch(err=>{
|
|
|
this.mapLoading = false;
|
|
|
})
|
|
|
} else if(id == 2) {
|
|
|
listpatrol({current:1,size:1000}).then(res=>{
|
|
|
this.mapLoading = false;
|
|
|
if(res.code == 200) {
|
|
|
this.videoPoint = [];
|
|
|
res.data.records.forEach((element)=>{
|
|
|
let obj = {position:[]};
|
|
|
let location = element.location?.split(',');
|
|
|
|
|
|
// obj.imgSrc = element.status == "0" ? offIcon4 : ico5;
|
|
|
if(location.length > 1) {
|
|
|
obj.position[0] = location[0];
|
|
|
obj.position[1] = location[1];
|
|
|
// let lonLat = this.wgs84togcj02(location[0],location[1]);
|
|
|
// obj.position[0] = lonLat ? lonLat[0] : 0;
|
|
|
// obj.position[1] = lonLat ? lonLat[1] : 0;
|
|
|
|
|
|
obj.lnglat = new AMap.LngLat(location.length > 0 ? location[0] : 0 ,location.length > 0 ? location[1] : 0)
|
|
|
// obj.lnglat = new AMap.LngLat(lonLat ? lonLat[0] : 0 ,lonLat ? lonLat[1] : 0)
|
|
|
} else {
|
|
|
obj.position[0] = 0;
|
|
|
obj.position[1] = 0;
|
|
|
}
|
|
|
|
|
|
obj.imgSrc = ico2;
|
|
|
obj.info = element
|
|
|
this.videoPoint.push(obj)
|
|
|
})
|
|
|
this.count = this.videoPoint.length;
|
|
|
AMap.plugin(['AMap.MarkerCluster'],()=>{
|
|
|
this.cluster = new AMap.MarkerCluster(this.map,this.videoPoint,{
|
|
|
gridSize: 60, // 设置网格像素大小
|
|
|
maxZoom: 17,
|
|
|
styles: sts,
|
|
|
// renderClusterMarker: this._renderClusterMarker, // 自定义聚合点样式
|
|
|
renderMarker: this._eventMarker, // 自定义非聚合点样式
|
|
|
})
|
|
|
})
|
|
|
}
|
|
|
})
|
|
|
} else if(id == 3){
|
|
|
getCarManageList({pageNum: 1,pageSize: 1000}).then(res=>{
|
|
|
// console.log('车辆',res);
|
|
|
this.carLine = res.rows
|
|
|
this.videoPoint = [];
|
|
|
this.mapLoading = false;
|
|
|
res.rows.forEach((element)=>{
|
|
|
// console.log(element);
|
|
|
let obj = {position:[]};
|
|
|
obj.position[0] = element.longitude;
|
|
|
obj.position[1] = element.latitude;
|
|
|
// obj.imgSrc = element.status == "0" ? offIcon4 : ico5;
|
|
|
obj.lnglat = new AMap.LngLat(element.longitude ? element.longitude : 0 ,element.latitude ? element.latitude : 0)
|
|
|
obj.imgSrc = ico4;
|
|
|
obj.info = element;
|
|
|
// this.markers.push(obj)
|
|
|
this.videoPoint.push(obj)
|
|
|
})
|
|
|
this.count = this.videoPoint.length;
|
|
|
|
|
|
AMap.plugin(['AMap.MarkerCluster','AMap.Size','AMap.Pixel'],()=>{
|
|
|
|
|
|
this.cluster = new AMap.MarkerCluster(this.map,this.videoPoint,{
|
|
|
gridSize: 60, // 设置网格像素大小
|
|
|
styles: sts,
|
|
|
maxZoom: 15,
|
|
|
// renderClusterMarker: this._renderClusterMarker, // 自定义聚合点样式
|
|
|
renderMarker: this._carMarker, // 自定义非聚合点样式
|
|
|
})
|
|
|
})
|
|
|
}).catch(err=>{
|
|
|
this.mapLoading = false;
|
|
|
})
|
|
|
} else if(id == 4){
|
|
|
// getVideoPageEq({pageNo:1,pageSize:1000}).then(res=>{
|
|
|
// this.mapLoading = false;
|
|
|
// // console.log(res,"res");
|
|
|
// this.videoPoint = [];
|
|
|
// res.data.forEach((element)=>{
|
|
|
// let obj = {position:[]};
|
|
|
// let lonLat;
|
|
|
// if(element.longitude && element.latitude) {
|
|
|
// lonLat = this.wgs84togcj02(element.longitude,element.latitude);
|
|
|
// }
|
|
|
// // obj.position[0] = element.longitude;
|
|
|
// obj.position[0] = lonLat ? lonLat[0] : 0;
|
|
|
// // obj.position[1] = element.latitude;
|
|
|
// obj.position[1] = lonLat ? lonLat[1] : 0;
|
|
|
// // obj.imgSrc = element.status == "0" ? offIcon4 : ico5;
|
|
|
// // obj.lnglat = new AMap.LngLat(element.longitude ? element.longitude : 0 ,element.latitude ? element.latitude : 0)
|
|
|
// obj.lnglat = new AMap.LngLat(lonLat ? lonLat[0] : 0 ,lonLat ? lonLat[1] : 0);
|
|
|
// obj.imgSrc = ico5;
|
|
|
// obj.info = element
|
|
|
// // this.markers.push(obj)
|
|
|
// this.videoPoint.push(obj)
|
|
|
// })
|
|
|
// this.count = this.videoPoint.length;
|
|
|
// AMap.plugin(['AMap.MarkerCluster'],()=>{
|
|
|
// this.cluster = new AMap.MarkerCluster(this.map,this.videoPoint,{
|
|
|
// gridSize: 60, // 设置网格像素大小
|
|
|
// maxZoom: 15,
|
|
|
// styles: sts,
|
|
|
// // renderClusterMarker: this._renderClusterMarker, // 自定义聚合点样式
|
|
|
// renderMarker: this._renderMarker, // 自定义非聚合点样式
|
|
|
// })
|
|
|
// })
|
|
|
// }).catch(err=>{
|
|
|
// this.$modal.msgError(err);
|
|
|
// this.mapLoading = false;
|
|
|
// })
|
|
|
getVideoDevice({current:1,size:-1}).then(res=>{
|
|
|
this.mapLoading = false;
|
|
|
this.videoPoint = [];
|
|
|
res.data.records.forEach((element)=>{
|
|
|
let obj = {position:[]};
|
|
|
let lonLat;
|
|
|
if(element.longitude && element.latitude) {
|
|
|
lonLat = this.wgs84togcj02(element.longitude,element.latitude);
|
|
|
// obj.position[0] = element.longitude;
|
|
|
obj.position[0] = lonLat ? lonLat[0] : 0;
|
|
|
// obj.position[1] = element.latitude;
|
|
|
obj.position[1] = lonLat ? lonLat[1] : 0;
|
|
|
// obj.imgSrc = element.status == "0" ? offIcon4 : ico5;
|
|
|
// obj.lnglat = new AMap.LngLat(element.longitude ? element.longitude : 0 ,element.latitude ? element.latitude : 0)
|
|
|
obj.lnglat = new AMap.LngLat(lonLat ? lonLat[0] : 0 ,lonLat ? lonLat[1] : 0);
|
|
|
obj.imgSrc = ico5;
|
|
|
obj.info = element
|
|
|
// this.markers.push(obj)
|
|
|
this.videoPoint.push(obj)
|
|
|
}
|
|
|
})
|
|
|
this.count = this.videoPoint.length;
|
|
|
AMap.plugin(['AMap.MarkerCluster'],()=>{
|
|
|
this.cluster = new AMap.MarkerCluster(this.map,this.videoPoint,{
|
|
|
gridSize: 60, // 设置网格像素大小
|
|
|
maxZoom: 15,
|
|
|
styles: sts,
|
|
|
// renderClusterMarker: this._renderClusterMarker, // 自定义聚合点样式
|
|
|
renderMarker: this._renderMarker, // 自定义非聚合点样式
|
|
|
})
|
|
|
})
|
|
|
}).catch(err=>{
|
|
|
this.$modal.msgError(err);
|
|
|
this.mapLoading = false;
|
|
|
})
|
|
|
} else if(id == 5){
|
|
|
getStreetShopList({pageSize:500,pageNum:1}).then(res=>{
|
|
|
this.videoPoint = [];
|
|
|
this.mapLoading = false;
|
|
|
res.rows.forEach((element)=>{
|
|
|
let obj = {position:[]};
|
|
|
obj.position[0] = element.longitude;
|
|
|
obj.position[1] = element.latitude;
|
|
|
// obj.imgSrc = element.status == "0" ? offIcon4 : ico5;
|
|
|
obj.lnglat = new AMap.LngLat(element.longitude ? element.longitude : 0 ,element.latitude ? element.latitude : 0)
|
|
|
obj.imgSrc = ico6;
|
|
|
obj.info = element;
|
|
|
// this.markers.push(obj)
|
|
|
this.videoPoint.push(obj)
|
|
|
})
|
|
|
this.count = this.videoPoint.length;
|
|
|
|
|
|
AMap.plugin(['AMap.MarkerCluster','AMap.Size','AMap.Pixel'],()=>{
|
|
|
|
|
|
this.cluster = new AMap.MarkerCluster(this.map,this.videoPoint,{
|
|
|
gridSize: 60, // 设置网格像素大小
|
|
|
styles: sts,
|
|
|
maxZoom: 15,
|
|
|
// renderClusterMarker: this._renderClusterMarker, // 自定义聚合点样式
|
|
|
renderMarker: this._DrenderMarker, // 自定义非聚合点样式
|
|
|
})
|
|
|
})
|
|
|
}).catch(err=>{
|
|
|
this.mapLoading = false;
|
|
|
})
|
|
|
} else if(id == 6) {
|
|
|
DeviceListNewRequest({pageSize:200}).then(res=>{
|
|
|
this.mapLoading = false;
|
|
|
// console.log(res,"res");
|
|
|
this.videoPoint = [];
|
|
|
res.forEach((element)=>{
|
|
|
let obj = {position:[]};
|
|
|
let lonLat;
|
|
|
if(element.longitude && element.latitude) {
|
|
|
lonLat = this.wgs84togcj02(element.longitude,element.latitude);
|
|
|
// obj.position[0] = element.longitude;
|
|
|
obj.position[0] = lonLat ? lonLat[0] : 0;
|
|
|
// obj.position[1] = element.latitude;
|
|
|
obj.position[1] = lonLat ? lonLat[1] : 0;
|
|
|
// obj.imgSrc = element.status == "0" ? offIcon4 : ico5;
|
|
|
// obj.lnglat = new AMap.LngLat(element.longitude ? element.longitude : 0 ,element.latitude ? element.latitude : 0)
|
|
|
obj.lnglat = new AMap.LngLat(lonLat ? lonLat[0] : 0 ,lonLat ? lonLat[1] : 0);
|
|
|
obj.imgSrc = ico5;
|
|
|
obj.info = element
|
|
|
// this.markers.push(obj)
|
|
|
this.videoPoint.push(obj)
|
|
|
}
|
|
|
})
|
|
|
this.count = this.videoPoint.length;
|
|
|
AMap.plugin(['AMap.MarkerCluster'],()=>{
|
|
|
this.cluster = new AMap.MarkerCluster(this.map,this.videoPoint,{
|
|
|
gridSize: 60, // 设置网格像素大小
|
|
|
maxZoom: 15,
|
|
|
styles: sts,
|
|
|
// renderClusterMarker: this._renderClusterMarker, // 自定义聚合点样式
|
|
|
renderMarker: this._renderMarkerTwo, // 自定义非聚合点样式
|
|
|
})
|
|
|
})
|
|
|
})
|
|
|
}
|
|
|
},
|
|
|
// 点位点击事件
|
|
|
clickMarker(marker,e){
|
|
|
// console.log(marker);
|
|
|
if (this.actionMap == 1) {
|
|
|
this.personInfo.position = marker.position;
|
|
|
this.personInfo.info = marker.info;
|
|
|
this.personInfo.visible = true;
|
|
|
} else if (this.actionMap == 2) {
|
|
|
this.eventInfo.position = marker.position;
|
|
|
this.eventInfo.visible = true;
|
|
|
} else if (this.actionMap == 3) {
|
|
|
this.carInfo.position = marker.position;
|
|
|
this.carInfo.visible = true;
|
|
|
} else if (this.actionMap == 4) {
|
|
|
this.monitoringInfo.position = marker.position;
|
|
|
this.monitoringInfo.info = marker.info;
|
|
|
this.monitoringInfo.visible = true;
|
|
|
} else if (this.actionMap == 5) {
|
|
|
this.shopInfo.position = marker.position;
|
|
|
this.shopInfo.info = marker.info;
|
|
|
// console.log(marker.info);
|
|
|
this.shopInfo.visible = true;
|
|
|
}
|
|
|
},
|
|
|
// 点位关闭事件
|
|
|
markersClosePopup(){
|
|
|
if (this.actionMap == 1) {
|
|
|
this.personInfo.visible = false;
|
|
|
} else if(this.actionMap == 2) {
|
|
|
this.eventInfo.visible = false;
|
|
|
} else if(this.actionMap == 3) {
|
|
|
this.carInfo.visible = false;
|
|
|
} else if(this.actionMap == 4) {
|
|
|
this.monitoringInfo.visible = false;
|
|
|
} else if(this,this.actionMap == 5) {
|
|
|
this.shopInfo.visible = false;
|
|
|
}
|
|
|
},
|
|
|
// 任务派发事件
|
|
|
taskClick(){
|
|
|
if(this.personInfo.info.status == "1") {
|
|
|
this.$refs.personageTask.open(this.personInfo.info);
|
|
|
} else {
|
|
|
this.$modal.msgError("该设备已离线");
|
|
|
}
|
|
|
},
|
|
|
// 播放监控视频
|
|
|
initVideoPlayer(){
|
|
|
this.$nextTick(()=>{
|
|
|
var videoDom = document.getElementById('flvvideo')
|
|
|
|
|
|
this.player = flvjs.createPlayer({
|
|
|
type: 'flv', // 媒体类型,默认是 flv,
|
|
|
isLive: true, // 是否是直播流
|
|
|
hasAudio: true, // 是否有音频
|
|
|
hanVideo: true, // 是否有视频
|
|
|
url: this.videoUrl, // 流地址
|
|
|
},{
|
|
|
// 其他的配置项可以根据项目实际情况参考 api 去配置
|
|
|
autoCleanupMinBackwardDuration: true, // 清除缓存 对 SourceBuffer 进行自动清理
|
|
|
})
|
|
|
this.player.attachMediaElement(videoDom)
|
|
|
try {
|
|
|
this.player.load();
|
|
|
this.player.play();
|
|
|
this.listenVideo();
|
|
|
} catch (error) {
|
|
|
console.log(error);
|
|
|
}
|
|
|
// 视频卡顿导致流断了,那就重连
|
|
|
// this.player.on(flvjs.Events.ERROR,(errType, errDetail)=>{
|
|
|
// // console.log(errType,'errTypeerrTypeerrType');
|
|
|
// // console.log(errDetail,'errDetailerrDetailerrDetailerrDetail');
|
|
|
// if(this.player){
|
|
|
// this.destroyVideos()
|
|
|
// this.initVideoPlayer(videoUrl)
|
|
|
// }
|
|
|
// })
|
|
|
})
|
|
|
},
|
|
|
destroyVideos() {
|
|
|
if (!this.player) return;
|
|
|
this.player.pause();
|
|
|
this.player.unload();
|
|
|
this.player.detachMediaElement();
|
|
|
this.player.destroy();
|
|
|
this.player = null;
|
|
|
},
|
|
|
// 监听视频流是否断流或者卡顿
|
|
|
listenVideo() {
|
|
|
const that = this;
|
|
|
if(this.player) {
|
|
|
this.player.on(
|
|
|
flvjs.Events.ERROR,
|
|
|
(errorType, errorDetail, errorInfo) => {
|
|
|
// console.log("errorType", errorType);
|
|
|
// console.log("errorDetail", errorDetail);
|
|
|
// console.log("errorInfo", errorInfo);
|
|
|
if(errorInfo.code == 404) {
|
|
|
setTimeout(()=>{
|
|
|
videoSurveillance({
|
|
|
...that.videoCondition,
|
|
|
destID:that.personInfo.info.userId,
|
|
|
imei:that.personInfo.info.imei
|
|
|
}).then((res) => {
|
|
|
if (res.code == 200 && res.data.msg == "操作成功") {
|
|
|
setTimeout(()=>{
|
|
|
that.videoUrl = `http://10.236.2.28:54567/bjh-admin-server/jn/live/9999_${that.personInfo.info.userId}.flv`
|
|
|
if(!that.showVideo) {
|
|
|
videoSurveillance({destId:that.personInfo.info.userId,imei:that.personInfo.info.imei,msgType:0}).then(res=>{})
|
|
|
that.destroyVideos();
|
|
|
} else {
|
|
|
that.initVideoPlayer();
|
|
|
}
|
|
|
},3000);
|
|
|
}
|
|
|
});
|
|
|
},2000)
|
|
|
} else {
|
|
|
// 视频出错后销毁重建
|
|
|
that.destroyVideos();
|
|
|
that.initVideoPlayer();
|
|
|
}
|
|
|
}
|
|
|
);
|
|
|
// 视频断流
|
|
|
this.player.on("statistics_info", function (res) {
|
|
|
if(that.lastDecodedFrames === 0){
|
|
|
that.lastDecodedFrames = res.decodedFrames
|
|
|
return
|
|
|
}
|
|
|
if(that.lastDecodedFrames != res.decodedFrames){
|
|
|
that.lastDecodedFrames = res.decodedFrames
|
|
|
}else{
|
|
|
that.lastDecodedFrames = 0
|
|
|
that.destroyVideos()
|
|
|
that.initVideoPlayer()
|
|
|
}
|
|
|
});
|
|
|
}
|
|
|
},
|
|
|
// 执法人员强制观摩
|
|
|
watchClick(){
|
|
|
if(this.personInfo.info.status == "1") {
|
|
|
// console.log(this.personInfo.info);
|
|
|
this.showVideo = true;
|
|
|
videoSurveillance({...this.videoCondition,destID:this.personInfo.info.userId,imei:this.personInfo.info.imei}).then(res=>{
|
|
|
if(res.code == 200 && res.data.msg == '操作成功') {
|
|
|
// http://121.229.2.163:9291/live/9999 http://120.27.25.166:9305/live/9999_
|
|
|
setTimeout(()=>{
|
|
|
this.videoUrl = `http://10.236.2.28:54567/bjh-admin-server/jn/live/9999_${this.personInfo.info.userId}.flv`
|
|
|
this.initVideoPlayer()
|
|
|
},3000)
|
|
|
}
|
|
|
})
|
|
|
} else {
|
|
|
this.$modal.msgError("该人员已离线");
|
|
|
}
|
|
|
},
|
|
|
// 强制观摩关闭事件
|
|
|
videoClose(){
|
|
|
this.showVideo = false;
|
|
|
if(!this.player) return
|
|
|
this.player.pause()
|
|
|
this.player.unload()
|
|
|
this.player.detachMediaElement()
|
|
|
this.player.destroy()
|
|
|
this.player = null
|
|
|
videoSurveillance({destID:this.personInfo.info.userId,imei:this.personInfo.info.imei,msgType:0})
|
|
|
if(this.timer) clearInterval(this.timer)
|
|
|
},
|
|
|
// 位置分享
|
|
|
shareClick(){
|
|
|
// console.log(this.personInfo,"位置分享");
|
|
|
if(this.personInfo.info.status == "1") {
|
|
|
var aux = document.createElement("input");
|
|
|
aux.setAttribute("value", this.personInfo.info.address);
|
|
|
document.body.appendChild(aux);
|
|
|
aux.select();
|
|
|
document.execCommand("copy");
|
|
|
document.body.removeChild(aux);
|
|
|
this.$modal.msgSuccess("位置已复制");
|
|
|
} else {
|
|
|
this.$modal.msgError("该人员已离线");
|
|
|
}
|
|
|
},
|
|
|
// 事件指派
|
|
|
eventBtn(){
|
|
|
this.$refs.crewAssign.open(this.eventInfo.info);
|
|
|
},
|
|
|
// 监控视频上墙
|
|
|
monitorVideos(status){
|
|
|
// this.$refs.aloneVideo.open(`http://liveplay.vaas.cn-yangzhou-1.ctyunxs.cn/vaas/live/3210000110004_32011502021322002389_live_1/hls.m3u8?auth_key=1728613840-588c71701551402588dcac5d76d4f910-30003-cef7053299ba90ef96453528cba0fc7f`);
|
|
|
// this.$refs.videoWall.open();
|
|
|
// if(status == 1) { // expand:"transcode=1"
|
|
|
// getPreviewURLs({protocol:'hls',cameraIndexCode:this.monitoringInfo.info.nationalStandardCode,streamType:"1",transmode:"1"}).then(res=>{
|
|
|
// if(res.code == 200) {
|
|
|
// // console.log(res,'视频地址获取');
|
|
|
// // this.$refs.aloneVideo.open(res.msg);
|
|
|
// let videoUrl = res.msg;
|
|
|
// var code1 = videoUrl.match(/\/openUrl\/(.*)/)[1]
|
|
|
// this.$refs.aloneVideo.open(`http://10.236.2.28:54567/bjh-admin-server/jn/videosLive/${code1}`);
|
|
|
// }
|
|
|
// })
|
|
|
if(this.actionMap == 4) {
|
|
|
getPreviewURLs({protocol:'hls',cameraIndexCode:this.monitoringInfo.info.nationalStandardCode,streamType:"1",transmode:"1"}).then(res=>{
|
|
|
// console.log(res,"res");
|
|
|
let url = JSON.parse(res.data)
|
|
|
// console.log(url,"url");
|
|
|
let videoUrl = url.data.url;
|
|
|
// var code1 = videoUrl.match(/\/openUrl\/(.*)/)[1]
|
|
|
// console.log(code1,"code1");
|
|
|
// this.$refs.aloneVideo.open(`http://10.236.2.28:54567/bjh-admin-server/jn/videosLive/${code1}`);
|
|
|
this.$refs.aloneVideo.open(videoUrl);
|
|
|
})
|
|
|
}
|
|
|
// if(this.actionMap == 6) {
|
|
|
// getDeviceMediaUrlHls({deviceCode:this.monitoringInfo.info.deviceCode}).then(res=>{
|
|
|
// this.$refs.aloneVideo.open(res.url)
|
|
|
// })
|
|
|
// } else
|
|
|
// } else {
|
|
|
// this.$modal.msgError("该设备已离线");
|
|
|
// }
|
|
|
},
|
|
|
// 转发,复制视频地址
|
|
|
copyUrl(){
|
|
|
getPreviewURLs({protocol:'hls',cameraIndexCode:this.monitoringInfo.info.cameraIndexCode,streamType:"1",transmode:"1"}).then(res=>{
|
|
|
if(res.code == 200) {
|
|
|
// this.$refs.aloneVideo.open(res.msg);
|
|
|
var aux = document.createElement("input");
|
|
|
aux.setAttribute("value", res.msg);
|
|
|
document.body.appendChild(aux);
|
|
|
aux.select();
|
|
|
document.execCommand("copy");
|
|
|
document.body.removeChild(aux);
|
|
|
this.$modal.msgSuccess("视频地址已复制");
|
|
|
}
|
|
|
}).catch(error=>{
|
|
|
this.$modal.msgError(error);
|
|
|
})
|
|
|
},
|
|
|
// 商铺详情查看
|
|
|
getShopInfo(){
|
|
|
this.$refs.shop.open(this.shopInfo.info);
|
|
|
},
|
|
|
|
|
|
|
|
|
// 二级网格获取
|
|
|
getWanggeGeoJson(){
|
|
|
|
|
|
bgridsetting({pageNum:1,pageSize:100,level:1}).then(res=>{
|
|
|
let W = []
|
|
|
res.rows.forEach((element)=>{
|
|
|
let shapeStr = JSON.parse(element.shapeStr)
|
|
|
W.push(shapeStr)
|
|
|
var wangge = new AMap.Polygon({
|
|
|
path:shapeStr.geometry.coordinates[0],
|
|
|
strokeColor: '#FFBF7A',
|
|
|
fillColor: '#DC8419',
|
|
|
strokeOpacity: 1,
|
|
|
fillOpacity: 0.3,
|
|
|
editable:false,
|
|
|
visible:true,
|
|
|
extData:{
|
|
|
name: shapeStr.properties.NAME
|
|
|
},
|
|
|
})
|
|
|
var text = new AMap.Text({
|
|
|
// position: [element.properties.CENTERX,element.properties.CENTERY],
|
|
|
position: getCenter(shapeStr.geometry.coordinates[0][0]),
|
|
|
anchor: 'bottom-center',
|
|
|
text: shapeStr.properties.NAME,
|
|
|
style:{
|
|
|
'font-size': '16px',
|
|
|
'font-weight': 'bold',
|
|
|
'text-align': 'center',
|
|
|
'color': '#FBFF00',
|
|
|
'text-shadow': '0px 1px 0px rgba(0,0,0,0.3)',
|
|
|
'white-space': 'nowrap',
|
|
|
},
|
|
|
});
|
|
|
shapeStr.myPolygon = wangge;
|
|
|
shapeStr.text = text;
|
|
|
this.layers.layer2.addOverlay(wangge);
|
|
|
this.layers.text1.addOverlay(text);
|
|
|
this.map.add(this.layers.layer2);
|
|
|
this.map.add(this.layers.text1);
|
|
|
})
|
|
|
this.wanggeData = W;
|
|
|
})
|
|
|
// console.log(this.layers.layer,'this.layers.layer');
|
|
|
// this.map.add(this.layers.layer);
|
|
|
},
|
|
|
// 围栏网格获取
|
|
|
getWeilanGeoJson(){
|
|
|
fence({ pageNum: 1, pageSize: 100 }).then((res) => {
|
|
|
// console.log(res,"围栏数据");
|
|
|
this.weilanData = res.rows;
|
|
|
this.weilanData.forEach((element,index) => {
|
|
|
let shapeStr = JSON.parse(element.shapeStr);
|
|
|
// 圆形围栏
|
|
|
if (shapeStr.features[0].geometry.type == "Point") {
|
|
|
var circle = new AMap.Circle({
|
|
|
center: shapeStr.features[0].geometry.coordinates,
|
|
|
radius: shapeStr.features[0].properties.radius,
|
|
|
bubble: true,
|
|
|
extData:{
|
|
|
id: '围栏polygon',
|
|
|
name: shapeStr.features[0].properties.NAME
|
|
|
},
|
|
|
strokeOpacity: 0.9,
|
|
|
strokeColor: "#62E1FA",
|
|
|
fillColor: "#62E1FA",
|
|
|
fillOpacity: 0.3,
|
|
|
editable:false,
|
|
|
visible:true,
|
|
|
})
|
|
|
var text = new AMap.Text({
|
|
|
position: shapeStr.features[0].geometry.coordinates,
|
|
|
anchor: 'bottom-center',
|
|
|
offset: [0, 12],
|
|
|
text: element.name,
|
|
|
extData:{
|
|
|
id: '围栏text',
|
|
|
},
|
|
|
style: {
|
|
|
'font-size': '14px',
|
|
|
'text-align': 'center',
|
|
|
'color': '#62E1FA',
|
|
|
'line-height': '24px',
|
|
|
'letter-spacing': '2px',
|
|
|
'white-space': 'nowrap',
|
|
|
},
|
|
|
});
|
|
|
this.layers.layer3.addOverlay(circle)
|
|
|
this.layers.layer3.addOverlay(text)
|
|
|
this.layers.layer3.hide();
|
|
|
this.map.add(this.layers.layer3);
|
|
|
element.myPolygon = circle;
|
|
|
element.text = text;
|
|
|
this.openClick(circle)
|
|
|
// this.map.add(text);
|
|
|
// 多边形围栏
|
|
|
} else if (shapeStr.features[0].geometry.type == "Polygon") {
|
|
|
var weilan = new AMap.Polygon({
|
|
|
path:shapeStr.features[0].geometry.coordinates,
|
|
|
bubble: true,
|
|
|
extData:{
|
|
|
id: '围栏polygon',
|
|
|
name: shapeStr.features[0].properties.NAME
|
|
|
},
|
|
|
strokeOpacity: 0.9,
|
|
|
strokeColor: "#62E1FA",
|
|
|
fillColor: "#62E1FA",
|
|
|
fillOpacity: 0.3,
|
|
|
editable:false,
|
|
|
visible:true,
|
|
|
})
|
|
|
// 获取多边形的中心点
|
|
|
var currentCenter = getCenter(shapeStr.features[0].geometry.coordinates[0]);
|
|
|
var text = new AMap.Text({
|
|
|
position: currentCenter,
|
|
|
anchor: 'bottom-center',
|
|
|
offset: [0, 12],
|
|
|
text: element.name,
|
|
|
extData:{
|
|
|
id: '围栏text' ,
|
|
|
},
|
|
|
style: {
|
|
|
'font-size': '14px',
|
|
|
'text-align': 'center',
|
|
|
'color': '#62E1FA',
|
|
|
'line-height': '24px',
|
|
|
'letter-spacing': '2px',
|
|
|
'white-space': 'nowrap',
|
|
|
},
|
|
|
});
|
|
|
this.layers.layer3.addOverlay(weilan)
|
|
|
this.layers.layer3.addOverlay(text)
|
|
|
this.layers.layer3.hide();
|
|
|
this.map.add(this.layers.layer3);
|
|
|
element.myPolygon = weilan;
|
|
|
element.text = text;
|
|
|
this.openClick(weilan)
|
|
|
// this.map.add([wangge,text]);
|
|
|
// this.map.add(text);
|
|
|
}
|
|
|
})
|
|
|
})
|
|
|
},
|
|
|
// 重点区域获取
|
|
|
getQuyuGeoJson(){
|
|
|
regionalsettings({ pageNum: 1, pageSize: 100 }).then((res) => {
|
|
|
this.quyuData = res.rows;
|
|
|
this.quyuData.forEach((element,index) => {
|
|
|
let shapeStr = JSON.parse(element.shapeStr);
|
|
|
var quyu = new AMap.Polygon({
|
|
|
path:shapeStr.features[0].geometry.coordinates,
|
|
|
bubble: true,
|
|
|
strokeOpacity: 0,
|
|
|
strokeColor: '#FF0000',
|
|
|
fillColor: '#FF0000',
|
|
|
fillOpacity:0.38,
|
|
|
editable:false,
|
|
|
visible:true,
|
|
|
extData:{
|
|
|
id: '区域polygon',
|
|
|
name: element.name
|
|
|
},
|
|
|
})
|
|
|
var text = new AMap.Text({
|
|
|
position: shapeStr.features[1].geometry.coordinates,
|
|
|
anchor: 'bottom-center',
|
|
|
text: element.name,
|
|
|
extData:{
|
|
|
id: '区域text'
|
|
|
},
|
|
|
style:{
|
|
|
'font-size': '16px',
|
|
|
'font-weight': 'bold',
|
|
|
'text-align': 'center',
|
|
|
'color': '#F44444',
|
|
|
'white-space': 'nowrap',
|
|
|
},
|
|
|
});
|
|
|
element.myPolygon = quyu;
|
|
|
element.text = text;
|
|
|
this.layers.layer3.addOverlay(quyu)
|
|
|
this.layers.layer3.addOverlay(text)
|
|
|
this.layers.layer3.hide();
|
|
|
this.map.add(this.layers.layer3);
|
|
|
this.openClick(quyu)
|
|
|
// this.map.add([quyu,text]);
|
|
|
// this.map.add(text);
|
|
|
})
|
|
|
})
|
|
|
},
|
|
|
// 重点路段获取
|
|
|
getLuduanGeoJson(){
|
|
|
roadsetting({ pageNum: 1, pageSize: 100 }).then((res) => {
|
|
|
this.luduanData = res.rows;
|
|
|
// console.log(res,'resresres');
|
|
|
this.luduanData.forEach((element) => {
|
|
|
let shapeStr = JSON.parse(element.shapeStr);
|
|
|
// console.log(shapeStr,'shapeStrshapeStrshapeStr');
|
|
|
var luduan = new AMap.Polyline({
|
|
|
path:shapeStr.features[0].geometry.coordinates,
|
|
|
bubble: true,
|
|
|
strokeOpacity: 1,
|
|
|
strokeColor: '#46FF77',
|
|
|
editable:false,
|
|
|
visible:true,
|
|
|
})
|
|
|
var text = new AMap.Text({
|
|
|
position: shapeStr.features[1].geometry.coordinates,
|
|
|
anchor: 'bottom-center',
|
|
|
text: element.name,
|
|
|
style:{
|
|
|
'font-size': '16px',
|
|
|
'font-weight': 'bold',
|
|
|
'text-align': 'center',
|
|
|
'color': '#46FF77',
|
|
|
'white-space': 'nowrap',
|
|
|
},
|
|
|
});
|
|
|
this.layers.layer3.addOverlay(luduan)
|
|
|
this.layers.layer3.addOverlay(text)
|
|
|
this.layers.layer3.hide();
|
|
|
this.map.add(this.layers.layer3);
|
|
|
element.myPolyline = luduan;
|
|
|
element.text = text;
|
|
|
this.openClick(luduan)
|
|
|
// this.map.add([luduan,text]);
|
|
|
// this.map.add(text);
|
|
|
})
|
|
|
})
|
|
|
},
|
|
|
// 今日明日获取
|
|
|
getCurrentTime(id) {
|
|
|
const currentDate = new Date();
|
|
|
if(id){
|
|
|
currentDate.setDate(currentDate.getDate() + 1);
|
|
|
}
|
|
|
const year = currentDate.getFullYear();
|
|
|
const month = currentDate.getMonth() + 1; // 月份从0开始,所以要加1
|
|
|
const day = currentDate.getDate();
|
|
|
|
|
|
return year + "-" +month + "-" + day;
|
|
|
},
|
|
|
// 开启围栏,路段,区域的点击事件
|
|
|
openClick(layer){
|
|
|
layer.on('click',(e)=>{
|
|
|
// console.log(e,'区域的点击事件');
|
|
|
// console.log(this.map.getAllOverlays('circle','polyline','polygon'),'this.layers.layer2');
|
|
|
if(this.isPositioning) {
|
|
|
let latlng = e.lnglat
|
|
|
let name;
|
|
|
this.layers.layer3.eachOverlay((item)=>{
|
|
|
// console.log(item,'item');
|
|
|
if(item.getBounds().contains(latlng)){
|
|
|
name = item.getExtData().name
|
|
|
}
|
|
|
})
|
|
|
// console.log(name,"点击的网格名称");
|
|
|
// 拿到点击的网格⌈ 围栏 ⌋名称
|
|
|
const icon = new AMap.Icon({
|
|
|
size: new AMap.Size(26, 26), //图标尺寸
|
|
|
image: require('../../../assets/images/icon/icon2.png'), //Icon 的图像
|
|
|
imageOffset: new AMap.Pixel(0, 0), //图像相对展示区域的偏移量,适于雪碧图等
|
|
|
imageSize: new AMap.Size(26, 26) //根据所设置的大小拉伸或压缩图片
|
|
|
});
|
|
|
var marker = new AMap.Marker({
|
|
|
position: new AMap.LngLat(e.lnglat.lng, e.lnglat.lat),
|
|
|
anchor: 'bottom-center',
|
|
|
icon: icon
|
|
|
})
|
|
|
this.layers.layer4.addOverlay(marker);
|
|
|
this.map.add(this.layers.layer4)
|
|
|
let addressName
|
|
|
var lng = e.lnglat.lng + '';
|
|
|
var lat = e.lnglat.lat + '';
|
|
|
// let clickPoint = this.layers.layer2.getOverlays();
|
|
|
// for (var i = 0; i < clickPoint.length; i++) {
|
|
|
// console.log(clickPoint[i],'点击的地址');
|
|
|
// }
|
|
|
axios.get('https://restapi.amap.com/v3/geocode/regeo',{
|
|
|
params:{
|
|
|
key: "5f4a2c045cffa20551a0300c31c1ee78",
|
|
|
location: `${lng.substring(0,9)},${lat.substring(0,9)}`,
|
|
|
extensions: 'all',
|
|
|
// batch: true,
|
|
|
}
|
|
|
}).then(response=>{
|
|
|
// console.log(response,'response');
|
|
|
addressName = response.data.regeocode.aois[0]?.name || response.data.regeocode.pois[0]?.name;
|
|
|
// console.log(addressName,'this.addressName');
|
|
|
if(this.layers.layer4) {
|
|
|
// e.target.getExtData().name; e.target.getExtData()获取给图层设置的extData属性的name
|
|
|
this.$refs.newEvent.open({lnglat:latlng,address:addressName,meshOccurs:name,marker:marker});
|
|
|
this.isPositioning = false;
|
|
|
}
|
|
|
})
|
|
|
}
|
|
|
})
|
|
|
},
|
|
|
// 子组件的实时定位事件
|
|
|
realTimeLocationClick(item,id){
|
|
|
if(id == 1 && this.actionMap == 1) {
|
|
|
this.personLine.forEach(per=>{
|
|
|
if(item.imei == per.imei) {
|
|
|
getUserByImei({imei:per.imei}).then(resTwo=>{
|
|
|
if(resTwo.code == 200) {
|
|
|
this.map.setZoomAndCenter(16,[per.longitude,per.latitude]);
|
|
|
setTimeout(()=>{
|
|
|
this.personInfo.position = [per.longitude,per.latitude];
|
|
|
this.personInfo.info = per;
|
|
|
this.personInfo.personinfo = resTwo.data[0];
|
|
|
this.personInfo.visible = true;
|
|
|
},1500)
|
|
|
}
|
|
|
})
|
|
|
}
|
|
|
})
|
|
|
} else if(id == 3 && this.actionMap == 3){
|
|
|
this.carLine.forEach(car=>{
|
|
|
if(item.id == car.id) {
|
|
|
this.map.setZoomAndCenter(16,[car.longitude,car.latitude]);
|
|
|
}
|
|
|
})
|
|
|
}
|
|
|
},
|
|
|
// 执法人员/执法车辆 行程轨迹
|
|
|
travelPath(){
|
|
|
if(this.actionMap == 1) {
|
|
|
this.$refs.personageTrack.open("person", this.personInfo.info);
|
|
|
} else if(this.actionMap == 3) {
|
|
|
this.$refs.personageTrack.open("car", this.carInfo.info);
|
|
|
}
|
|
|
},
|
|
|
// 车载监控视频
|
|
|
watchCarVideo(){
|
|
|
getPreviewURLs({protocol:'hls',cameraIndexCode:'5ab6cc3745e147918b2a96c2604ecdbb',streamType:"1",transmode:"1"}).then(res=>{
|
|
|
this.$refs.carVideo.open(res.msg);
|
|
|
})
|
|
|
// previewURLs({cameraIndexCode:'5ab6cc3745e147918b2a96c2604ecdbb',transmode:1,protocol:'hls',streamType:1}).then(res=>{
|
|
|
// let carUrl = JSON.parse(res.data);
|
|
|
// this.$refs.carVideo.open(carUrl.data.url);
|
|
|
// })
|
|
|
},
|
|
|
// 子组件的名称点击事件
|
|
|
divClick(lightedPolygonId){
|
|
|
if(this.action == 1) {
|
|
|
// 取消重点区域高亮
|
|
|
this.quyuData.forEach((element) => {
|
|
|
element.myPolygon?.setOptions({
|
|
|
strokeOpacity: 0,
|
|
|
strokeColor: '#FF0000',
|
|
|
fillColor: '#FF0000',
|
|
|
fillOpacity:0.38,
|
|
|
editable:false,
|
|
|
visible:true,
|
|
|
});
|
|
|
element.text?.setStyle({
|
|
|
'color': '#F44444',
|
|
|
});
|
|
|
})
|
|
|
// 取消重点路段高亮
|
|
|
this.luduanData.forEach((element) => {
|
|
|
element.myPolyline?.setOptions({
|
|
|
strokeOpacity: 1,
|
|
|
strokeColor: '#46FF77',
|
|
|
editable:false,
|
|
|
visible:true,
|
|
|
});
|
|
|
element.text?.setStyle({
|
|
|
'color': '#46FF77',
|
|
|
});
|
|
|
})
|
|
|
// 取消考勤围栏高亮
|
|
|
this.weilanData.forEach((element) => {
|
|
|
element.myPolygon?.setOptions({
|
|
|
strokeOpacity: 0.9,
|
|
|
strokeColor: "#62E1FA",
|
|
|
fillColor: "#62E1FA",
|
|
|
fillOpacity: 0.3,
|
|
|
editable:false,
|
|
|
visible:true,
|
|
|
});
|
|
|
element.text?.setStyle({
|
|
|
'color': '#62E1FA',
|
|
|
});
|
|
|
})
|
|
|
// 取消区域网格高亮
|
|
|
this.wanggeData.forEach((element)=>{
|
|
|
element.myPolygon?.setOptions({
|
|
|
strokeOpacity: 1,
|
|
|
strokeColor: '#00C5EC',
|
|
|
fillColor: '#00AEFF',
|
|
|
fillOpacity: 0.4,
|
|
|
editable:false,
|
|
|
visible:true,
|
|
|
});
|
|
|
|
|
|
element.text?.setStyle({
|
|
|
'color': '#00AEFF',
|
|
|
'text-shadow': '0px 1px 0px rgba(0,0,0,0.3)',
|
|
|
});
|
|
|
})
|
|
|
this.isClickLingtedPolygonId = true;
|
|
|
this.highlightedPolygonId = lightedPolygonId.id;
|
|
|
if(lightedPolygonId.id == 1) {
|
|
|
// 区域网格
|
|
|
this.wanggeData.forEach((element)=>{
|
|
|
// console.log(element,"element");
|
|
|
// let shapeStr = JSON.parse(element.shapeStr);
|
|
|
if(element.id === lightedPolygonId.item.id) {
|
|
|
element.myPolygon.setOptions({
|
|
|
strokeColor: '#46FF77',
|
|
|
fillColor: '#46FF77',
|
|
|
fillOpacity: 0.5,
|
|
|
strokeOpacity: 0.8,
|
|
|
editable:false,
|
|
|
visible:true,
|
|
|
});
|
|
|
element.text.setStyle({
|
|
|
'color': '#46FF77',
|
|
|
});
|
|
|
this.lightedPolygon = element.myPolygon;
|
|
|
this.lightedText = element.text;
|
|
|
this.map.setFitView(element.myPolygon);
|
|
|
// this.map.setFitView(element.myPolygon,false,null,13.1);
|
|
|
} else {
|
|
|
element.myPolygon.setOptions({
|
|
|
strokeColor: '#00C5EC',
|
|
|
fillColor: '#00AEFF',
|
|
|
fillOpacity: 0.4,
|
|
|
strokeOpacity: 1,
|
|
|
editable:false,
|
|
|
visible:true,
|
|
|
});
|
|
|
element.text.setStyle({
|
|
|
'color': '#00AEFF',
|
|
|
'text-shadow': '0px 1px 0px rgba(0,0,0,0.3)',
|
|
|
});
|
|
|
}
|
|
|
})
|
|
|
} else if(lightedPolygonId.id == 2) {
|
|
|
// 重点区域
|
|
|
this.quyuData.forEach((element) => {
|
|
|
if(element.id == lightedPolygonId.item.id) {
|
|
|
element.myPolygon.setOptions({
|
|
|
strokeColor: '#46FF77',
|
|
|
fillColor: '#46FF77',
|
|
|
fillOpacity: 0.5,
|
|
|
strokeOpacity: 0.8,
|
|
|
editable:false,
|
|
|
visible:true,
|
|
|
});
|
|
|
element.text.setStyle({
|
|
|
'color': '#FFDBB7',
|
|
|
});
|
|
|
this.lightedPolygon = element.myPolygon;
|
|
|
this.lightedText = element.text;
|
|
|
this.map.setFitView(element.myPolygon);
|
|
|
} else {
|
|
|
element.myPolygon.setOptions({
|
|
|
strokeOpacity: 0,
|
|
|
strokeColor: '#FF0000',
|
|
|
fillColor: '#FF0000',
|
|
|
fillOpacity:0.38,
|
|
|
editable:false,
|
|
|
visible:true,
|
|
|
});
|
|
|
element.text.setStyle({
|
|
|
'color': '#F44444',
|
|
|
});
|
|
|
}
|
|
|
})
|
|
|
} else if(lightedPolygonId.id == 3) {
|
|
|
// 重点路段
|
|
|
this.luduanData.forEach((element) => {
|
|
|
if(element.id == lightedPolygonId.item.id) {
|
|
|
element.myPolyline.setOptions({
|
|
|
strokeOpacity: 1,
|
|
|
strokeColor: '#FF0000',
|
|
|
editable:false,
|
|
|
visible:true,
|
|
|
});
|
|
|
element.text.setStyle({
|
|
|
'color': '#FF0000',
|
|
|
});
|
|
|
this.lightedPolygon = element.myPolyline;
|
|
|
this.lightedText = element.text;
|
|
|
this.map.setFitView(element.myPolyline);
|
|
|
} else {
|
|
|
element.myPolyline.setOptions({
|
|
|
strokeOpacity: 1,
|
|
|
strokeColor: '#46FF77',
|
|
|
editable:false,
|
|
|
visible:true,
|
|
|
});
|
|
|
element.text.setStyle({
|
|
|
'color': '#46FF77',
|
|
|
});
|
|
|
}
|
|
|
})
|
|
|
} else if(lightedPolygonId.id == 4) {
|
|
|
// 考勤围栏
|
|
|
this.weilanData.forEach((element) => {
|
|
|
if(element.id == lightedPolygonId.item) {
|
|
|
element.myPolygon.setOptions({
|
|
|
strokeColor: '#46FF77',
|
|
|
fillColor: '#46FF77',
|
|
|
fillOpacity: 0.5,
|
|
|
strokeOpacity: 0.8,
|
|
|
editable:false,
|
|
|
visible:true,
|
|
|
});
|
|
|
element.text.setStyle({
|
|
|
'color': '#46FF77',
|
|
|
});
|
|
|
this.lightedPolygon = element.myPolygon;
|
|
|
this.lightedText = element.text;
|
|
|
this.map.setFitView(element.myPolygon);
|
|
|
} else {
|
|
|
element.myPolygon.setOptions({
|
|
|
strokeOpacity: 0.9,
|
|
|
strokeColor: "#62E1FA",
|
|
|
fillColor: "#62E1FA",
|
|
|
fillOpacity: 0.3,
|
|
|
editable:false,
|
|
|
visible:true,
|
|
|
});
|
|
|
element.text.setStyle({
|
|
|
'color': '#62E1FA',
|
|
|
});
|
|
|
}
|
|
|
|
|
|
})
|
|
|
}
|
|
|
} else if(this.action == 2) {
|
|
|
// console.log("取消高亮并且判断是卫星地图");
|
|
|
// console.log(lightedPolygonId.item.id,"id");
|
|
|
// 取消重点区域高亮
|
|
|
this.quyuData.forEach((element) => {
|
|
|
element.myPolygon?.setOptions({
|
|
|
strokeOpacity: 0,
|
|
|
strokeColor: '#FF0000',
|
|
|
fillColor: '#FF0000',
|
|
|
fillOpacity:0.6,
|
|
|
editable:false,
|
|
|
visible:true,
|
|
|
});
|
|
|
element.text?.setStyle({
|
|
|
'color': '#E4ECFF',
|
|
|
});
|
|
|
})
|
|
|
// 取消重点路段高亮
|
|
|
this.luduanData.forEach((element) => {
|
|
|
element.myPolyline?.setOptions({
|
|
|
strokeOpacity: 1,
|
|
|
strokeColor: '#46FF77',
|
|
|
editable:false,
|
|
|
visible:true,
|
|
|
});
|
|
|
element.text?.setStyle({
|
|
|
'color': '#46FF77',
|
|
|
});
|
|
|
})
|
|
|
// 取消考勤围栏高亮
|
|
|
this.weilanData.forEach((element) => {
|
|
|
element.myPolygon?.setOptions({
|
|
|
strokeOpacity: 1,
|
|
|
strokeColor: "#00B7FF",
|
|
|
fillColor: "#001AFF",
|
|
|
fillOpacity: 0.5,
|
|
|
editable:false,
|
|
|
visible:true,
|
|
|
});
|
|
|
element.text?.setStyle({
|
|
|
'color': '#E4ECFF',
|
|
|
});
|
|
|
})
|
|
|
// 取消区域网格高亮
|
|
|
this.wanggeData.forEach((element)=>{
|
|
|
element.myPolygon?.setOptions({
|
|
|
strokeColor: '#0084FF',
|
|
|
fillColor: '#40AFFF',
|
|
|
fillOpacity: 0.8,
|
|
|
editable:false,
|
|
|
visible:true,
|
|
|
});
|
|
|
element.text?.setStyle({
|
|
|
'color': '#DFFAFF',
|
|
|
'text-shadow': '0px 1px 0px rgba(0,0,0,0.3)',
|
|
|
});
|
|
|
})
|
|
|
this.isClickLingtedPolygonId = true;
|
|
|
this.highlightedPolygonId = lightedPolygonId.id;
|
|
|
if(lightedPolygonId.id == 1) {
|
|
|
// 区域网格
|
|
|
this.wanggeData.forEach((element)=>{
|
|
|
// console.log(element,"element");
|
|
|
// let shapeStr = JSON.parse(element.shapeStr);
|
|
|
if(element.id === lightedPolygonId.item.id) {
|
|
|
element.myPolygon.setOptions({
|
|
|
strokeColor: '#46FF77',
|
|
|
fillColor: '#46FF77',
|
|
|
fillOpacity: 0.5,
|
|
|
strokeOpacity: 0.8,
|
|
|
editable:false,
|
|
|
visible:true,
|
|
|
});
|
|
|
element.text.setStyle({
|
|
|
'color': '#46FF77',
|
|
|
});
|
|
|
this.lightedPolygon = element.myPolygon;
|
|
|
this.lightedText = element.text;
|
|
|
this.map.setFitView(element.myPolygon);
|
|
|
} else {
|
|
|
element.myPolygon.setOptions({
|
|
|
strokeColor: '#0084FF',
|
|
|
fillColor: '#40AFFF',
|
|
|
fillOpacity: 0.8,
|
|
|
strokeOpacity: 1,
|
|
|
editable:false,
|
|
|
visible:true,
|
|
|
});
|
|
|
element.text.setStyle({
|
|
|
'color': '#00AEFF',
|
|
|
'text-shadow': '0px 1px 0px rgba(0,0,0,0.3)',
|
|
|
});
|
|
|
}
|
|
|
})
|
|
|
} else if(lightedPolygonId.id == 2) {
|
|
|
// 重点区域
|
|
|
this.quyuData.forEach((element) => {
|
|
|
if(element.id == lightedPolygonId.item.id) {
|
|
|
element.myPolygon.setOptions({
|
|
|
strokeColor: '#46FF77',
|
|
|
fillColor: '#46FF77',
|
|
|
fillOpacity: 0.5,
|
|
|
strokeOpacity: 0.8,
|
|
|
editable:false,
|
|
|
visible:true,
|
|
|
});
|
|
|
element.text.setStyle({
|
|
|
'color': '#FFDBB7',
|
|
|
});
|
|
|
this.lightedPolygon = element.myPolygon;
|
|
|
this.lightedText = element.text;
|
|
|
this.map.setFitView(element.myPolygon);
|
|
|
} else {
|
|
|
element.myPolygon.setOptions({
|
|
|
strokeOpacity: 0,
|
|
|
strokeColor: '#FF0000',
|
|
|
fillColor: '#FF0000',
|
|
|
fillOpacity:0.6,
|
|
|
editable:false,
|
|
|
visible:true,
|
|
|
});
|
|
|
element.text.setStyle({
|
|
|
'color': '#E4ECFF',
|
|
|
});
|
|
|
}
|
|
|
})
|
|
|
} else if(lightedPolygonId.id == 3) {
|
|
|
// 重点路段
|
|
|
this.luduanData.forEach((element) => {
|
|
|
if(element.id == lightedPolygonId.item.id) {
|
|
|
element.myPolyline.setOptions({
|
|
|
strokeOpacity: 1,
|
|
|
strokeColor: '#FF0000',
|
|
|
editable:false,
|
|
|
visible:true,
|
|
|
});
|
|
|
element.text.setStyle({
|
|
|
'color': '#FF0000',
|
|
|
});
|
|
|
this.lightedPolygon = element.myPolyline;
|
|
|
this.lightedText = element.text;
|
|
|
this.map.setFitView(element.myPolyline);
|
|
|
} else {
|
|
|
element.myPolyline.setOptions({
|
|
|
strokeOpacity: 1,
|
|
|
strokeColor: '#46FF77',
|
|
|
editable:false,
|
|
|
visible:true,
|
|
|
});
|
|
|
element.text.setStyle({
|
|
|
'color': '#46FF77',
|
|
|
});
|
|
|
}
|
|
|
})
|
|
|
} else if(lightedPolygonId.id == 4) {
|
|
|
// 考勤围栏
|
|
|
this.weilanData.forEach((element) => {
|
|
|
if(element.id == lightedPolygonId.item) {
|
|
|
element.myPolygon.setOptions({
|
|
|
strokeColor: '#46FF77',
|
|
|
fillColor: '#46FF77',
|
|
|
fillOpacity: 0.5,
|
|
|
strokeOpacity: 0.8,
|
|
|
editable:false,
|
|
|
visible:true,
|
|
|
});
|
|
|
element.text.setStyle({
|
|
|
'color': '#46FF77',
|
|
|
});
|
|
|
this.lightedPolygon = element.myPolygon;
|
|
|
this.lightedText = element.text;
|
|
|
this.map.setFitView(element.myPolygon);
|
|
|
} else {
|
|
|
element.myPolygon.setOptions({
|
|
|
strokeOpacity: 1,
|
|
|
strokeColor: "#00B7FF",
|
|
|
fillColor: "#001AFF",
|
|
|
fillOpacity: 0.5,
|
|
|
editable:false,
|
|
|
visible:true,
|
|
|
});
|
|
|
element.text.setStyle({
|
|
|
'color': '#E4ECFF',
|
|
|
});
|
|
|
}
|
|
|
|
|
|
})
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
},
|
|
|
// 地图等级变化时如果有高亮则取消高亮
|
|
|
unlightedPolygonId(){
|
|
|
// console.log(this.highlightedPolygonId,'this.highlightedPolygonId');
|
|
|
if(this.isClickLingtedPolygonId) {
|
|
|
this.isClickLingtedPolygonId = false;
|
|
|
if(this.action == 1) {
|
|
|
if(this.highlightedPolygonId == 1) {
|
|
|
this.lightedPolygon.setOptions({
|
|
|
strokeColor: '#00C5EC',
|
|
|
fillColor: '#00AEFF',
|
|
|
fillOpacity: 0.4,
|
|
|
strokeOpacity: 1,
|
|
|
editable:false,
|
|
|
visible:true,
|
|
|
});
|
|
|
this.lightedText.setStyle({
|
|
|
'color': '#00AEFF',
|
|
|
'text-shadow': '0px 1px 0px rgba(0,0,0,0.3)',
|
|
|
});
|
|
|
} else if(this.highlightedPolygonId == 2) {
|
|
|
// console.log("进入区域取消高亮");
|
|
|
this.lightedPolygon.setOptions({
|
|
|
strokeOpacity: 0,
|
|
|
strokeColor: '#FF0000',
|
|
|
fillColor: '#FF0000',
|
|
|
fillOpacity:0.38,
|
|
|
editable:false,
|
|
|
visible:true,
|
|
|
});
|
|
|
this.lightedText.setStyle({
|
|
|
'color': '#F44444',
|
|
|
});
|
|
|
} else if(this.highlightedPolygonId == 3) {
|
|
|
this.lightedPolygon.setOptions({
|
|
|
strokeOpacity: 1,
|
|
|
strokeColor: '#46FF77',
|
|
|
editable:false,
|
|
|
visible:true,
|
|
|
});
|
|
|
this.lightedText.setStyle({
|
|
|
'color': '#46FF77',
|
|
|
});
|
|
|
} else if(this.highlightedPolygonId == 4) {
|
|
|
this.lightedPolygon.setOptions({
|
|
|
strokeColor: '#62E1FA',
|
|
|
fillColor: '#62E1FA',
|
|
|
strokeOpacity: 0.9,
|
|
|
fillOpacity: 0.3,
|
|
|
editable:false,
|
|
|
visible:true,
|
|
|
});
|
|
|
this.lightedText.setStyle({
|
|
|
'color': '#62E1FA',
|
|
|
});
|
|
|
}
|
|
|
} else if(this.action == 2) {
|
|
|
if(this.highlightedPolygonId == 1) {
|
|
|
this.lightedPolygon.setOptions({
|
|
|
strokeColor: '#0084FF',
|
|
|
fillColor: '#40AFFF',
|
|
|
fillOpacity: 0.8,
|
|
|
editable:false,
|
|
|
visible:true,
|
|
|
});
|
|
|
this.lightedText.setStyle({
|
|
|
'color': '#DFFAFF',
|
|
|
'text-shadow': '0px 1px 0px rgba(0,0,0,0.3)',
|
|
|
});
|
|
|
} else if(this.highlightedPolygonId == 2) {
|
|
|
// console.log("进入区域取消高亮");
|
|
|
this.lightedPolygon.setOptions({
|
|
|
strokeOpacity: 0,
|
|
|
strokeColor: '#FF0000',
|
|
|
fillColor: '#FF0000',
|
|
|
fillOpacity:0.6,
|
|
|
editable:false,
|
|
|
visible:true,
|
|
|
});
|
|
|
this.lightedText.setStyle({
|
|
|
'color': '#E4ECFF',
|
|
|
});
|
|
|
} else if(this.highlightedPolygonId == 3) {
|
|
|
this.lightedPolygon.setOptions({
|
|
|
strokeOpacity: 1,
|
|
|
strokeColor: '#46FF77',
|
|
|
editable:false,
|
|
|
visible:true,
|
|
|
});
|
|
|
this.lightedText.setStyle({
|
|
|
'color': '#46FF77',
|
|
|
});
|
|
|
} else if(this.highlightedPolygonId == 4) {
|
|
|
this.lightedPolygon.setOptions({
|
|
|
strokeOpacity: 1,
|
|
|
strokeColor: "#00B7FF",
|
|
|
fillColor: "#001AFF",
|
|
|
fillOpacity: 0.5,
|
|
|
editable:false,
|
|
|
visible:true,
|
|
|
});
|
|
|
this.lightedText.setStyle({
|
|
|
'color': '#E4ECFF',
|
|
|
});
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
},
|
|
|
|
|
|
// 电子底图/卫星底图切换事件
|
|
|
actionBtn(id) {
|
|
|
this.action = id;
|
|
|
this.$emit("changeBackground",id)
|
|
|
if(id == 1) {
|
|
|
this.visible = false;
|
|
|
// 修改一级网格背景
|
|
|
this.layers.layer.setOptions ({
|
|
|
strokeColor: '#00C5EC',
|
|
|
fillColor: '#00AEFF',
|
|
|
fillOpacity: 0.4,
|
|
|
editable:false,
|
|
|
visible:true,
|
|
|
})
|
|
|
// 修改一级网格字体颜色
|
|
|
let text = this.layers.text.getOverlays();
|
|
|
for (let i = 0; i < text.length; i++) {
|
|
|
text[i].setStyle({
|
|
|
'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.layer2.setOptions ({
|
|
|
// strokeColor: '#FFBF7A',
|
|
|
// fillColor: '#DC8419',
|
|
|
// strokeOpacity: 1,
|
|
|
// fillOpacity: 0.3,
|
|
|
// })
|
|
|
// 修改围栏区域文本样式
|
|
|
var overlays = this.layers.layer3.getOverlays();
|
|
|
for (var i = 0; i < overlays.length; i++) {
|
|
|
let id = overlays[i].getExtData().id;
|
|
|
if(id == "围栏text" || id == "区域text") {
|
|
|
overlays[i].setStyle({
|
|
|
'font-size': '14px',
|
|
|
'text-align': 'center',
|
|
|
'color': '#62E1FA',
|
|
|
'line-height': '24px',
|
|
|
'letter-spacing': '2px',
|
|
|
'white-space': 'nowrap',
|
|
|
})
|
|
|
} else if(id == "区域polygon") {
|
|
|
overlays[i].setOptions({
|
|
|
strokeOpacity: 0,
|
|
|
strokeColor: '#FF0000',
|
|
|
fillColor: '#FF0000',
|
|
|
fillOpacity:0.38,
|
|
|
})
|
|
|
} else if(id == "围栏polygon") {
|
|
|
overlays[i].setOptions({
|
|
|
strokeOpacity: 0.9,
|
|
|
strokeColor: "#62E1FA",
|
|
|
fillColor: "#62E1FA",
|
|
|
fillOpacity: 0.3,
|
|
|
})
|
|
|
}
|
|
|
}
|
|
|
this.map.setMapStyle("amap://styles/d02b66b0a7f190d5a1556a3f59c86518")
|
|
|
} else {
|
|
|
this.visible = true;
|
|
|
// 修改一级网格背景
|
|
|
this.layers.layer.setOptions ({
|
|
|
strokeColor: '#0084FF',
|
|
|
fillColor: '#40AFFF',
|
|
|
fillOpacity: 0.8,
|
|
|
editable:false,
|
|
|
visible:true,
|
|
|
})
|
|
|
// 修改一级网格字体颜色
|
|
|
let text = this.layers.text.getOverlays();
|
|
|
for (let i = 0; i < text.length; i++) {
|
|
|
text[i].setStyle({
|
|
|
'font-size': '16px',
|
|
|
'font-weight': 'bold',
|
|
|
'text-align': 'center',
|
|
|
'color': '#DFFAFF',
|
|
|
'text-shadow': '0px 1px 0px rgba(0,0,0,0.3)',
|
|
|
'white-space': 'nowrap',
|
|
|
})
|
|
|
}
|
|
|
// // 修改二级网格背景
|
|
|
// this.layers.layer2.setOptions ({
|
|
|
// strokeColor: '#FF8400',
|
|
|
// fillColor: '#FF911A',
|
|
|
// strokeOpacity: 1,
|
|
|
// fillOpacity: 0.4,
|
|
|
// })
|
|
|
// 修改围栏区域文本样式
|
|
|
var overlays = this.layers.layer3.getOverlays();
|
|
|
for (var i = 0; i < overlays.length; i++) {
|
|
|
let id = overlays[i].getExtData().id;
|
|
|
// console.log(id,'id');
|
|
|
if(id == "围栏text" || id == "区域text") {
|
|
|
overlays[i].setStyle({
|
|
|
'font-size': '14px',
|
|
|
'text-align': 'center',
|
|
|
'color': '#E4ECFF',
|
|
|
'line-height': '24px',
|
|
|
'letter-spacing': '2px',
|
|
|
'white-space': 'nowrap',
|
|
|
})
|
|
|
} else if(id == "区域polygon") {
|
|
|
overlays[i].setOptions({
|
|
|
strokeOpacity: 0,
|
|
|
strokeColor: '#FF0000',
|
|
|
fillColor: '#FF0000',
|
|
|
fillOpacity:0.6,
|
|
|
})
|
|
|
} else if(id == "围栏polygon") {
|
|
|
overlays[i].setOptions({
|
|
|
strokeOpacity: 1,
|
|
|
strokeColor: "#00B7FF",
|
|
|
fillColor: "#001AFF",
|
|
|
fillOpacity: 0.5,
|
|
|
})
|
|
|
}
|
|
|
}
|
|
|
// this.layers.text.setOptions ({
|
|
|
// setStyle:{
|
|
|
// 'font-size': '16px',
|
|
|
// 'font-weight': 'bold',
|
|
|
// 'text-align': 'center',
|
|
|
// 'color': '#DFFAFF',
|
|
|
// 'text-shadow': '0px 1px 0px rgba(0,0,0,0.3)',
|
|
|
// 'white-space': 'nowrap',
|
|
|
// }
|
|
|
// })
|
|
|
this.map.setMapStyle("amap://styles/whitesmoke")
|
|
|
|
|
|
}
|
|
|
},
|
|
|
// 搜索数据
|
|
|
querySearch(queryString, cb){
|
|
|
this.input = queryString;
|
|
|
// 执法人员搜索
|
|
|
if(this.actionMap == 1) {
|
|
|
dwgjList({nickName:queryString}).then(res=>{
|
|
|
var restaurants = res.data;
|
|
|
let a = [];
|
|
|
restaurants.forEach((per=>{
|
|
|
let item = { value: per.nickName, imei: per.imei };
|
|
|
a.push(item);
|
|
|
}))
|
|
|
cb(a);
|
|
|
})
|
|
|
} else if (this.actionMap == 2) {
|
|
|
// 事件的搜索
|
|
|
let data = {'queryValue' : [{colCode:"name",queryValue:queryString}], "myInstanceClassify" : "all", "parameterValue":[], fks: []}
|
|
|
ViewListPage({viewCode:'event-all-list', pageNo: 1, pageSize:10}, data).then(res=>{
|
|
|
// console.log(res,"事件信息");
|
|
|
var restaurants = res.result.records;
|
|
|
let a = [];
|
|
|
restaurants.forEach((per=>{
|
|
|
let item = { value: per.name, location: per.location ? per.location : "" ,info: per };
|
|
|
a.push(item);
|
|
|
}))
|
|
|
cb(a);
|
|
|
})
|
|
|
} else if (this.actionMap == 3) {
|
|
|
// 车辆的搜索
|
|
|
} else if(this.actionMap == 4) {
|
|
|
// 监控视频搜索
|
|
|
} else if(this.actionMap == 5) {
|
|
|
// 店铺的搜索
|
|
|
getStreetShopList({shopName:queryString,pageSize:20,pageNum:1}).then(res=>{
|
|
|
// console.log(res,"店铺信息")
|
|
|
var restaurants = res.rows;
|
|
|
let a = [];
|
|
|
restaurants.forEach((per=>{
|
|
|
let item = { value: per.shopName, info: per, longitude:per.longitude, latitude:per.latitude };
|
|
|
a.push(item);
|
|
|
}))
|
|
|
cb(a);
|
|
|
})
|
|
|
}
|
|
|
},
|
|
|
// 点击事件
|
|
|
handleSelect(item){
|
|
|
// console.log(item,"item");
|
|
|
// console.log(this.actionMap,"this.actionMap");
|
|
|
this.getMarkers(this.actionMap);
|
|
|
if(this.actionMap == 1) {
|
|
|
if(item.imei) {
|
|
|
// 根据imei查询设备
|
|
|
getDeviceList({imei:item.imei}).then(res=>{
|
|
|
if(res.code == 200 && res.data.msg == "操作成功") {
|
|
|
// if(this.cluster) {
|
|
|
// this.cluster.setMap(null)
|
|
|
// }
|
|
|
// this.map.setZoomAndCenter(16,[res.data.obj[0].longitude,res.data.obj[0].latitude]);
|
|
|
getUserByImei({imei:item.imei}).then(resTwo=>{
|
|
|
if(resTwo.code == 200) {
|
|
|
this.map.setZoomAndCenter(18,[res.data.obj[0].longitude,res.data.obj[0].latitude]);
|
|
|
setTimeout(()=>{
|
|
|
this.personInfo.position = [res.data.obj[0].longitude,res.data.obj[0].latitude];
|
|
|
this.personInfo.info = res.data.obj[0];
|
|
|
this.personInfo.personinfo = resTwo.data[0];
|
|
|
this.personInfo.visible = true;
|
|
|
},2500)
|
|
|
}
|
|
|
})
|
|
|
return getUserByImei({imei:item.imei})
|
|
|
}
|
|
|
})
|
|
|
}
|
|
|
} else if (this.actionMap == 2) {
|
|
|
if(item.location) {
|
|
|
let location = item.location?.split(',');
|
|
|
this.map.setZoomAndCenter(18,[location[0],location[1]]);
|
|
|
setTimeout(()=>{
|
|
|
this.eventInfo.position = [location[0],location[1]];
|
|
|
this.eventInfo.info = item.info;
|
|
|
this.eventInfo.visible = true;
|
|
|
},1500)
|
|
|
}
|
|
|
} else if (this.actionMap == 3) {
|
|
|
// 车辆的搜索
|
|
|
} else if(this.actionMap == 4) {
|
|
|
// 监控视频搜索
|
|
|
} else if(this.actionMap == 5) {
|
|
|
// 店铺的搜索
|
|
|
if(item.longitude && item.latitude) {
|
|
|
let longitude = item.longitude
|
|
|
let latitude = item.latitude
|
|
|
|
|
|
this.map.setZoomAndCenter(18,[longitude,latitude]);
|
|
|
setTimeout(()=>{
|
|
|
this.shopInfo.position = [longitude,latitude];
|
|
|
this.shopInfo.info = item.info;
|
|
|
this.shopInfo.visible = true;
|
|
|
},1500)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
},
|
|
|
// 新增事件的点击事件
|
|
|
createdTask() {
|
|
|
this.$refs.newEvent.open();
|
|
|
},
|
|
|
// 地图扎点的点击事件
|
|
|
positioning() {
|
|
|
this.isPositioning = true;
|
|
|
// this.$refs.videoWall.open();
|
|
|
},
|
|
|
// 弹框点击取消事件
|
|
|
cancel(marker){
|
|
|
this.layers.layer4.removeOverlay(marker);
|
|
|
|
|
|
},
|
|
|
confirm() {
|
|
|
// 事件新增完毕重新请求事件列表及经纬度
|
|
|
this.getMarkers(2);
|
|
|
},
|
|
|
// 切换地图事件
|
|
|
changeMap(id) {
|
|
|
this.MyInput = true;
|
|
|
this.zadian = false;
|
|
|
this.actionMap = id;
|
|
|
this.input = "";
|
|
|
this.personInfo.visible = false;
|
|
|
this.eventInfo.visible = false;
|
|
|
this.carInfo.visible = false;
|
|
|
this.monitoringInfo.visible = false;
|
|
|
this.shopInfo.visible = false;
|
|
|
if (id == 1) {
|
|
|
this.markerOffset = new AMap.Pixel(-35, -123);
|
|
|
} else if (id == 2) {
|
|
|
this.zadian = true;
|
|
|
this.markerOffset = new AMap.Pixel(-13.5, -15);
|
|
|
} else if (id == 3) {
|
|
|
this.markerOffset = new AMap.Pixel(-30.5, -48.5);
|
|
|
} else if (id == 4) {
|
|
|
this.MyInput = false;
|
|
|
this.markerOffset = new AMap.Pixel(-27, -94);
|
|
|
} else if (id == 5) {
|
|
|
this.markerOffset = new AMap.Pixel(-27, -94);
|
|
|
} else if (id == 6) {
|
|
|
this.MyInput = false;
|
|
|
this.switches[0].active = true;
|
|
|
this.switches[1].active = false;
|
|
|
this.switches[2].active = false;
|
|
|
this.markerOffset = new AMap.Pixel(-27, -94);
|
|
|
}
|
|
|
this.getMarkers(id);
|
|
|
},
|
|
|
// 视频切换
|
|
|
handleSwitchChange(index,id){
|
|
|
// 判断是否全部都未选,allInactive为true则判断active全部都为false
|
|
|
const allInactive = this.switches.every(switchItem => !switchItem.active);
|
|
|
if(allInactive) {
|
|
|
this.switches[index].active = true;
|
|
|
return;
|
|
|
}
|
|
|
this.switches.forEach((sw, i) => {
|
|
|
// 关闭其他开关
|
|
|
if (i !== index) {
|
|
|
sw.active = false;
|
|
|
}
|
|
|
});
|
|
|
// id 1:视频监控 2:算法监控 3:自建监控
|
|
|
// console.log(id);
|
|
|
this.getVideosType(id)
|
|
|
},
|
|
|
getVideosType(id){
|
|
|
this.mapLoading = true;
|
|
|
// 点聚合重置
|
|
|
if (this.cluster) {
|
|
|
this.cluster.setMap(null);
|
|
|
}
|
|
|
this.videoPoint = [];
|
|
|
let imgUrl = require("../../../assets/images/icon/green.png")
|
|
|
var sts = [{
|
|
|
url: imgUrl,
|
|
|
size: new AMap.Size(32, 32),
|
|
|
offset: new AMap.Pixel(-16, -16),
|
|
|
textColor:"#FFFFFF",
|
|
|
textSize:14
|
|
|
}, {
|
|
|
url: imgUrl,
|
|
|
size: new AMap.Size(32, 32),
|
|
|
offset: new AMap.Pixel(-16, -16),
|
|
|
textColor:"#FFFFFF",
|
|
|
textSize:14
|
|
|
}, {
|
|
|
url: imgUrl,
|
|
|
size: new AMap.Size(32, 32),
|
|
|
offset: new AMap.Pixel(-18, -18),
|
|
|
textColor:"#FFFFFF",
|
|
|
textSize:14
|
|
|
}];
|
|
|
let ico5 = require("../../../assets/images/icon/icon5.png");
|
|
|
if(id == 1) {
|
|
|
getVideoDevice({current:1,size:-1}).then(res=>{
|
|
|
this.mapLoading = false;
|
|
|
res.data.records.forEach((element)=>{
|
|
|
let obj = {position:[]};
|
|
|
let lonLat;
|
|
|
if(element.longitude && element.latitude) {
|
|
|
lonLat = this.wgs84togcj02(element.longitude,element.latitude);
|
|
|
// obj.position[0] = element.longitude;
|
|
|
obj.position[0] = lonLat ? lonLat[0] : 0;
|
|
|
// obj.position[1] = element.latitude;
|
|
|
obj.position[1] = lonLat ? lonLat[1] : 0;
|
|
|
// obj.imgSrc = element.status == "0" ? offIcon4 : ico5;
|
|
|
// obj.lnglat = new AMap.LngLat(element.longitude ? element.longitude : 0 ,element.latitude ? element.latitude : 0)
|
|
|
obj.lnglat = new AMap.LngLat(lonLat ? lonLat[0] : 0 ,lonLat ? lonLat[1] : 0);
|
|
|
obj.imgSrc = ico5;
|
|
|
obj.info = element
|
|
|
// this.markers.push(obj)
|
|
|
this.videoPoint.push(obj)
|
|
|
}
|
|
|
})
|
|
|
this.count = this.videoPoint.length;
|
|
|
AMap.plugin(['AMap.MarkerCluster'],()=>{
|
|
|
this.cluster = new AMap.MarkerCluster(this.map,this.videoPoint,{
|
|
|
gridSize: 60, // 设置网格像素大小
|
|
|
maxZoom: 15,
|
|
|
styles: sts,
|
|
|
// renderClusterMarker: this._renderClusterMarker, // 自定义聚合点样式
|
|
|
renderMarker: this._renderMarker, // 自定义非聚合点样式
|
|
|
})
|
|
|
})
|
|
|
}).catch(err=>{
|
|
|
this.$modal.msgError(err);
|
|
|
this.mapLoading = false;
|
|
|
})
|
|
|
} else if(id == 2) {
|
|
|
getVideoDevice({current:1,size:-1,videoTagId:"1836948995594969090"}).then(res=>{
|
|
|
this.mapLoading = false;
|
|
|
res.data.records.forEach((element)=>{
|
|
|
let obj = {position:[]};
|
|
|
let lonLat;
|
|
|
if(element.longitude && element.latitude) {
|
|
|
lonLat = this.wgs84togcj02(element.longitude,element.latitude);
|
|
|
// obj.position[0] = element.longitude;
|
|
|
obj.position[0] = lonLat ? lonLat[0] : 0;
|
|
|
// obj.position[1] = element.latitude;
|
|
|
obj.position[1] = lonLat ? lonLat[1] : 0;
|
|
|
// obj.imgSrc = element.status == "0" ? offIcon4 : ico5;
|
|
|
// obj.lnglat = new AMap.LngLat(element.longitude ? element.longitude : 0 ,element.latitude ? element.latitude : 0)
|
|
|
obj.lnglat = new AMap.LngLat(lonLat ? lonLat[0] : 0 ,lonLat ? lonLat[1] : 0);
|
|
|
obj.imgSrc = ico5;
|
|
|
obj.info = element
|
|
|
// this.markers.push(obj)
|
|
|
this.videoPoint.push(obj)
|
|
|
}
|
|
|
})
|
|
|
this.count = this.videoPoint.length;
|
|
|
AMap.plugin(['AMap.MarkerCluster'],()=>{
|
|
|
this.cluster = new AMap.MarkerCluster(this.map,this.videoPoint,{
|
|
|
gridSize: 60, // 设置网格像素大小
|
|
|
maxZoom: 15,
|
|
|
styles: sts,
|
|
|
// renderClusterMarker: this._renderClusterMarker, // 自定义聚合点样式
|
|
|
renderMarker: this._renderMarker, // 自定义非聚合点样式
|
|
|
})
|
|
|
})
|
|
|
}).catch(err=>{
|
|
|
this.$modal.msgError(err);
|
|
|
this.mapLoading = false;
|
|
|
})
|
|
|
} else if(id == 3) {
|
|
|
getVideoDevice({current:1,size:-1,videoTagId:"1836949034303692802"}).then(res=>{
|
|
|
this.mapLoading = false;
|
|
|
res.data.records.forEach((element)=>{
|
|
|
let obj = {position:[]};
|
|
|
let lonLat;
|
|
|
if(element.longitude && element.latitude) {
|
|
|
lonLat = this.wgs84togcj02(element.longitude,element.latitude);
|
|
|
// obj.position[0] = element.longitude;
|
|
|
obj.position[0] = lonLat ? lonLat[0] : 0;
|
|
|
// obj.position[1] = element.latitude;
|
|
|
obj.position[1] = lonLat ? lonLat[1] : 0;
|
|
|
// obj.imgSrc = element.status == "0" ? offIcon4 : ico5;
|
|
|
// obj.lnglat = new AMap.LngLat(element.longitude ? element.longitude : 0 ,element.latitude ? element.latitude : 0)
|
|
|
obj.lnglat = new AMap.LngLat(lonLat ? lonLat[0] : 0 ,lonLat ? lonLat[1] : 0);
|
|
|
obj.imgSrc = ico5;
|
|
|
obj.info = element
|
|
|
// this.markers.push(obj)
|
|
|
this.videoPoint.push(obj)
|
|
|
}
|
|
|
})
|
|
|
this.count = this.videoPoint.length;
|
|
|
AMap.plugin(['AMap.MarkerCluster'],()=>{
|
|
|
this.cluster = new AMap.MarkerCluster(this.map,this.videoPoint,{
|
|
|
gridSize: 60, // 设置网格像素大小
|
|
|
maxZoom: 15,
|
|
|
styles: sts,
|
|
|
// renderClusterMarker: this._renderClusterMarker, // 自定义聚合点样式
|
|
|
renderMarker: this._renderMarker, // 自定义非聚合点样式
|
|
|
})
|
|
|
})
|
|
|
}).catch(err=>{
|
|
|
this.$modal.msgError(err);
|
|
|
this.mapLoading = false;
|
|
|
})
|
|
|
}
|
|
|
},
|
|
|
// 隐藏地图左侧
|
|
|
leftAnimation() {
|
|
|
setTimeout(() => {
|
|
|
this.leftAnimationData = !this.leftAnimationData;
|
|
|
}, 200);
|
|
|
this.$emit("leftAnimationAction");
|
|
|
},
|
|
|
// 隐藏地图右侧
|
|
|
rightAnimation() {
|
|
|
setTimeout(() => {
|
|
|
this.rightAnimationData = !this.rightAnimationData;
|
|
|
}, 200);
|
|
|
this.$emit("rightAnimationAction");
|
|
|
},
|
|
|
// 获取车辆信息
|
|
|
getCarList(){
|
|
|
getCarManageList({pageNum: 1,pageSize: 10}).then(res=>{
|
|
|
// console.log('车辆',res);
|
|
|
this.carLine = res.rows
|
|
|
})
|
|
|
},
|
|
|
// 定时器
|
|
|
markerInterval(){
|
|
|
|
|
|
let timer
|
|
|
if(this.actionMap == 1) {
|
|
|
timer = setInterval(() => {
|
|
|
for(let i = 0; i < this.personMarkers.length; i++) {
|
|
|
for(let j = i+1; j < this.personMarkers.length; j++) {
|
|
|
if(this.personMarkers[i].imei == this.personMarkers[j].imei) {
|
|
|
this.personMarkers.splice(i,1);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
console.log("this.personMarkers",this.personMarkers);
|
|
|
getDeviceList().then(res=>{
|
|
|
if(res.code == 200) {
|
|
|
res.data.obj.forEach((item,index)=>{
|
|
|
this.personMarkers.forEach((per)=>{
|
|
|
if(item.imei == per.imei) {
|
|
|
per.markers.setPosition(new AMap.LngLat(item.longitude,item.latitude))
|
|
|
}
|
|
|
})
|
|
|
})
|
|
|
}
|
|
|
})
|
|
|
}, 10000);
|
|
|
} else {
|
|
|
clearInterval(timer)
|
|
|
}
|
|
|
},
|
|
|
// 模拟登录获取token
|
|
|
getrobotToken(){
|
|
|
robotLogin({username:"superAdmin",password:"3ER4#er$@2024"}).then(res=>{
|
|
|
// console.log(res,"登录信息");
|
|
|
if(res.code == 200) {
|
|
|
// setRobotToken(res.result.token)
|
|
|
localStorage.setItem('robotToken',res.result.token)
|
|
|
}
|
|
|
})
|
|
|
},
|
|
|
// 获取在线和离线人员的图标
|
|
|
getPersonIcon(){
|
|
|
listZhzz().then(res=>{
|
|
|
if(res.code == 200) {
|
|
|
this.onIcon = res.rows[0].onIcon ? process.env.VUE_APP_BASE_API + res.rows[0].onIcon : require("../../../assets/images/icon/icon1.png");
|
|
|
this.offIcon = res.rows[0].offIcon ? process.env.VUE_APP_BASE_API + res.rows[0].offIcon : require("../../../assets/images/icon/offLine1.png");
|
|
|
// console.log(this.onIcon,'this.onIcon');
|
|
|
// console.log(this.offIcon,'this.offIcon');
|
|
|
const faviconUrl = res.rows[0].platformLogoUrl ? process.env.VUE_APP_BASE_API + res.rows[0].platformLogoUrl : require("@/assets/images/login-logo.png");
|
|
|
const faviconLink = document.querySelector('link[rel="icon"]');
|
|
|
const newLink = document.createElement('link');
|
|
|
newLink.setAttribute('rel', 'icon');
|
|
|
newLink.setAttribute('type', 'image/x-icon');
|
|
|
newLink.setAttribute('href', faviconUrl);
|
|
|
|
|
|
// 将新的 link 元素替换掉原来的 link 元素
|
|
|
faviconLink.parentNode.replaceChild(newLink, faviconLink);
|
|
|
}
|
|
|
})
|
|
|
},
|
|
|
// 坐标转换
|
|
|
wgs84togcj02(lng, lat) {
|
|
|
// 定义一些常量
|
|
|
var PI = 3.1415926535897932384626;
|
|
|
var a = 6378245.0;
|
|
|
var ee = 0.00669342162296594323;
|
|
|
|
|
|
var lat = +lat;
|
|
|
var lng = +lng;
|
|
|
|
|
|
// 判断是否在国内,不在国内则不做偏移
|
|
|
if (!(lng > 73.66 && lng < 135.05 && lat > 3.86 && lat < 53.55)) {
|
|
|
return [lng, lat]
|
|
|
} else {
|
|
|
// 转换lat
|
|
|
var dlatplng = lng - 105.0, dlatplat = lat - 35.0;
|
|
|
var dlat = -100.0 + 2.0 * dlatplng + 3.0 * dlatplat + 0.2 * dlatplat * dlatplat + 0.1 * dlatplng * dlatplat + 0.2 * Math.sqrt(Math.abs(dlatplng));
|
|
|
dlat += (20.0 * Math.sin(6.0 * dlatplng * PI) + 20.0 * Math.sin(2.0 * dlatplng * PI)) * 2.0 / 3.0;
|
|
|
dlat += (20.0 * Math.sin(dlatplat * PI) + 40.0 * Math.sin(dlatplat / 3.0 * PI)) * 2.0 / 3.0;
|
|
|
dlat += (160.0 * Math.sin(dlatplat / 12.0 * PI) + 320 * Math.sin(dlatplat * PI / 30.0)) * 2.0 / 3.0;
|
|
|
|
|
|
// 转换lng
|
|
|
var dlngplng = lng - 105.0, dlngplat = lat - 35.0;
|
|
|
var dlng = 300.0 + dlngplng + 2.0 * dlngplat + 0.1 * dlngplng * dlngplng + 0.1 * dlngplng * dlngplat + 0.1 * Math.sqrt(Math.abs(dlngplng));
|
|
|
dlng += (20.0 * Math.sin(6.0 * dlngplng * PI) + 20.0 * Math.sin(2.0 * dlngplng * PI)) * 2.0 / 3.0;
|
|
|
dlng += (20.0 * Math.sin(dlngplng * PI) + 40.0 * Math.sin(dlngplng / 3.0 * PI)) * 2.0 / 3.0;
|
|
|
dlng += (150.0 * Math.sin(dlngplng / 12.0 * PI) + 300.0 * Math.sin(dlngplng / 30.0 * PI)) * 2.0 / 3.0;
|
|
|
|
|
|
var radlat = lat / 180.0 * PI;
|
|
|
var magic = Math.sin(radlat);
|
|
|
magic = 1 - ee * magic * magic;
|
|
|
var sqrtmagic = Math.sqrt(magic);
|
|
|
dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * PI);
|
|
|
dlng = (dlng * 180.0) / (a / sqrtmagic * Math.cos(radlat) * PI);
|
|
|
var mglat = lat + dlat;
|
|
|
var mglng = lng + dlng;
|
|
|
|
|
|
return [mglng, mglat]
|
|
|
}
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
mounted() {
|
|
|
// this.getPersonIcon();
|
|
|
this.getCarList();
|
|
|
this.getrobotToken();
|
|
|
window.addEventListener('beforeunload', e => this.beforeunloadHandler(e));
|
|
|
window.addEventListener('unload', e => this.unloadHandler(e));
|
|
|
// this.markerInterval();
|
|
|
},
|
|
|
destroyed(){
|
|
|
window.removeEventListener('beforeunload', e => this.beforeunloadHandler(e))
|
|
|
window.removeEventListener('unload', e => this.unloadHandler(e));
|
|
|
},
|
|
|
};
|
|
|
</script>
|
|
|
<style lang="scss" scoped>
|
|
|
.map-main {
|
|
|
width: 100%;
|
|
|
height: 100%;
|
|
|
position: relative;
|
|
|
.map-mengcheng {
|
|
|
position: absolute;
|
|
|
top: 0;
|
|
|
|
|
|
}
|
|
|
.left-animationMap-enter-active,
|
|
|
.left-animationMap-leave-active {
|
|
|
transition: all 1s;
|
|
|
}
|
|
|
.left-animationMap-enter,
|
|
|
.left-animationMap-leave-to {
|
|
|
/* 进入的初始状态和离开的最终状态 */
|
|
|
opacity: 0;
|
|
|
transform: translateX(-510px);
|
|
|
}
|
|
|
|
|
|
.right-animationMap-enter-active,
|
|
|
.right-animationMap-leave-active {
|
|
|
transition: all 1s;
|
|
|
}
|
|
|
.right-animationMap-enter,
|
|
|
.right-animationMap-leave-to {
|
|
|
/* 进入的初始状态和离开的最终状态 */
|
|
|
opacity: 0;
|
|
|
transform: translateX(510px);
|
|
|
}
|
|
|
|
|
|
.left-bg {
|
|
|
position: absolute;
|
|
|
left: 20px;
|
|
|
top: 0;
|
|
|
width: 11px;
|
|
|
height: 95%;
|
|
|
padding: 20px 0 0 0;
|
|
|
z-index: 600;
|
|
|
.bgt {
|
|
|
width: 100%;
|
|
|
height: 100%;
|
|
|
background-image: url("../../../assets/images/broadside-bg.png");
|
|
|
background-size: 100% 100%;
|
|
|
}
|
|
|
}
|
|
|
.right-bg {
|
|
|
position: absolute;
|
|
|
top: 0;
|
|
|
right: 20px;
|
|
|
width: 11px;
|
|
|
height: 95%;
|
|
|
padding: 20px 0;
|
|
|
z-index: 600;
|
|
|
.bgt {
|
|
|
width: 100%;
|
|
|
height: 100%;
|
|
|
background-image: url("../../../assets/images/broadside2-bg.png");
|
|
|
background-size: 100% 100%;
|
|
|
}
|
|
|
}
|
|
|
.bottom-bg {
|
|
|
position: absolute;
|
|
|
bottom: 0;
|
|
|
left: 0;
|
|
|
right: 0;
|
|
|
width: 100%;
|
|
|
height: 20px;
|
|
|
z-index: 600;
|
|
|
.bgt {
|
|
|
width: 100%;
|
|
|
height: 100%;
|
|
|
background-image: url("../../../assets/images/bottom-bg.png");
|
|
|
background-size: 100% 100%;
|
|
|
}
|
|
|
}
|
|
|
.map-left {
|
|
|
position: absolute;
|
|
|
left: 47px;
|
|
|
top: 10px;
|
|
|
width: 460px;
|
|
|
height: 95%;
|
|
|
z-index: 600;
|
|
|
box-sizing: border-box;
|
|
|
// background: rgba(216,216,216,0.05);
|
|
|
}
|
|
|
.left-image {
|
|
|
z-index: 600;
|
|
|
position: absolute;
|
|
|
left: 527px;
|
|
|
bottom: 50%;
|
|
|
width: 40px;
|
|
|
cursor: pointer;
|
|
|
}
|
|
|
.left-image2 {
|
|
|
z-index: 600;
|
|
|
position: absolute;
|
|
|
left: 67px;
|
|
|
bottom: 50%;
|
|
|
width: 40px;
|
|
|
cursor: pointer;
|
|
|
}
|
|
|
.right-image {
|
|
|
z-index: 600;
|
|
|
position: absolute;
|
|
|
right: 527px;
|
|
|
bottom: 50%;
|
|
|
width: 40px;
|
|
|
cursor: pointer;
|
|
|
}
|
|
|
.right-image2 {
|
|
|
z-index: 600;
|
|
|
position: absolute;
|
|
|
right: 67px;
|
|
|
bottom: 50%;
|
|
|
width: 40px;
|
|
|
cursor: pointer;
|
|
|
}
|
|
|
.map-right {
|
|
|
position: absolute;
|
|
|
right: 47px;
|
|
|
top: 10px;
|
|
|
width: 460px;
|
|
|
height: 95%;
|
|
|
z-index: 600;
|
|
|
// margin: 10px 17px 0 10px;
|
|
|
// padding: 20px 0;
|
|
|
box-sizing: border-box;
|
|
|
}
|
|
|
.middle-top-left {
|
|
|
z-index: 600;
|
|
|
position: absolute;
|
|
|
left: 537px;
|
|
|
top: 10px;
|
|
|
display: flex;
|
|
|
.input-keyword {
|
|
|
::v-deep .el-input {
|
|
|
background-image: url("../../../assets/images/bgtongyong.png");
|
|
|
background-size: 100% 100%;
|
|
|
.el-input__inner {
|
|
|
background-color: transparent;
|
|
|
width: 222px;
|
|
|
height: 38px;
|
|
|
color: #fff;
|
|
|
border: none;
|
|
|
}
|
|
|
.el-input__inner::placeholder {
|
|
|
/* 在这里添加你想要修改的 placeholder 样式 */
|
|
|
font-size: 14px;
|
|
|
font-family: "Source Han Sans CN-Regular";
|
|
|
font-weight: 400;
|
|
|
color: #d3eef2;
|
|
|
line-height: 20px;
|
|
|
}
|
|
|
}
|
|
|
::v-deep .el-input__suffix {
|
|
|
line-height: 44px;
|
|
|
color: #d3eef2;
|
|
|
right: 10px;
|
|
|
cursor: pointer;
|
|
|
.el-icon-search:before {
|
|
|
font-size: 24px;
|
|
|
color: #d3eef2;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
.laser-positioning,
|
|
|
.creation-task {
|
|
|
// height: 38px;
|
|
|
width: 130px;
|
|
|
margin-left: 8px;
|
|
|
background-image: url("../../../assets/images/bgtongyong.png");
|
|
|
background-size: 100% 100%;
|
|
|
display: flex;
|
|
|
align-items: center;
|
|
|
justify-content: center;
|
|
|
padding: 9px 13px;
|
|
|
cursor: pointer;
|
|
|
span {
|
|
|
font-size: 14px;
|
|
|
font-family: "Source Han Sans CN-Regular";
|
|
|
font-weight: 400;
|
|
|
color: #d3eef2;
|
|
|
line-height: 20px;
|
|
|
margin-right: 12px;
|
|
|
}
|
|
|
img {
|
|
|
width: 20px;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
.monitoring-switch {
|
|
|
z-index: 600;
|
|
|
position: absolute;
|
|
|
left: 537px;
|
|
|
top: 10px;
|
|
|
// display: flex;
|
|
|
// flex-direction: column;
|
|
|
display: grid;
|
|
|
grid-template-columns: 1fr;
|
|
|
row-gap: 10px;
|
|
|
.switchItems {
|
|
|
display: flex;
|
|
|
flex-direction: column;
|
|
|
align-items: center;
|
|
|
// margin-bottom: 10px;
|
|
|
.monitoring-type {
|
|
|
color: #fff;
|
|
|
font-size: 12px;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
.middle-top-left2 {
|
|
|
left: 67px;
|
|
|
}
|
|
|
.middle-bottom-left {
|
|
|
// 490
|
|
|
position: absolute;
|
|
|
left: 537px;
|
|
|
bottom: 40px;
|
|
|
// width: 200px;
|
|
|
z-index: 600;
|
|
|
padding: 5px 10px;
|
|
|
display: flex;
|
|
|
flex-direction: column;
|
|
|
.list {
|
|
|
margin-top: 10px;
|
|
|
display: flex;
|
|
|
align-items: center;
|
|
|
.leftbg {
|
|
|
display: flex;
|
|
|
align-items: center;
|
|
|
justify-content: center;
|
|
|
background-image: url("../../../assets/images/iconbg2.png");
|
|
|
background-size: 100% 100%;
|
|
|
width: 36px;
|
|
|
height: 36px;
|
|
|
cursor: pointer;
|
|
|
img {
|
|
|
width: 20px;
|
|
|
}
|
|
|
.images {
|
|
|
width: 30px;
|
|
|
}
|
|
|
}
|
|
|
.action-map {
|
|
|
background-image: url("../../../assets/images/iconbg1.png");
|
|
|
}
|
|
|
.rightbg {
|
|
|
padding-left: 6px;
|
|
|
margin-left: 2px;
|
|
|
background-image: url("../../../assets/images/right-icon.png");
|
|
|
background-repeat: no-repeat; /* 不平铺 */
|
|
|
width: 115px;
|
|
|
height: 36px;
|
|
|
display: flex;
|
|
|
align-items: center;
|
|
|
span {
|
|
|
font-size: 16px;
|
|
|
font-family: "Source Han Sans CN-Bold";
|
|
|
font-weight: 700;
|
|
|
color: #ffffff;
|
|
|
line-height: 26px;
|
|
|
text-shadow: 0px 0px 5px #0077ff;
|
|
|
}
|
|
|
}
|
|
|
.rightbgTwo {
|
|
|
width: 145px;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
.middle-bottom-left2 {
|
|
|
left: 67px;
|
|
|
}
|
|
|
.middle-bottom-right {
|
|
|
position: absolute;
|
|
|
bottom: 40px;
|
|
|
right: 537px;
|
|
|
z-index: 600;
|
|
|
.btn-action {
|
|
|
display: flex;
|
|
|
span {
|
|
|
width: 142px;
|
|
|
height: 40px;
|
|
|
flex: 1;
|
|
|
display: inline-block;
|
|
|
text-align: center;
|
|
|
background-image: url("../../../assets/images/changeBtn2.png");
|
|
|
background-size: 100% 100%;
|
|
|
padding: 10px 33px;
|
|
|
font-size: 16px;
|
|
|
font-family: "Source Han Sans CN-Regular";
|
|
|
font-weight: 400;
|
|
|
line-height: 20px;
|
|
|
color: #d3eef2;
|
|
|
cursor: pointer;
|
|
|
// background: transparent;
|
|
|
// box-shadow: inset 0px 0px 6px 0px #00C2FF;
|
|
|
// border-radius: 2px 2px 2px 2px;
|
|
|
// opacity: 1;
|
|
|
// border: 1px solid rgba(181,207,255,0.5);
|
|
|
&:nth-child(1) {
|
|
|
margin-right: 10px;
|
|
|
}
|
|
|
}
|
|
|
.action {
|
|
|
color: #fff;
|
|
|
background-image: url("../../../assets/images/changeBtn1.png.png");
|
|
|
background-size: 100% 100%;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
.middle-bottom-right2 {
|
|
|
right: 67px;
|
|
|
}
|
|
|
|
|
|
.showMap {
|
|
|
width: 100%;
|
|
|
height: 100%;
|
|
|
background-color: #00192e;
|
|
|
}
|
|
|
}
|
|
|
</style>
|