| | |
| | | <template> |
| | | <div class="main_body"> |
| | | <el-container |
| | | style="height: 100%" |
| | | > |
| | | <el-container style="height: 100%"> |
| | | <el-aside |
| | | v-if="this.$store.state.aside" |
| | | width="300px" |
| | | style="background-color: rgb(238, 241, 246);padding-top:10px" |
| | | style="background-color: rgb(238, 241, 246); padding-top: 10px" |
| | | > |
| | | <span style="font-size:13px;padding-left:10px;font-weight:500;color:rgb(64, 158, 255)">走航车设备</span> |
| | | <el-menu style="margin-top:10px"> |
| | | <span |
| | | style=" |
| | | font-size: 13px; |
| | | padding-left: 10px; |
| | | font-weight: 500; |
| | | color: rgb(64, 158, 255); |
| | | " |
| | | >走航车设备</span |
| | | > |
| | | <el-menu style="margin-top: 10px"> |
| | | <el-menu-item |
| | | v-for="(item,index) in defaultData" |
| | | v-for="(item, index) in defaultData" |
| | | :key="index" |
| | | style="display: flex;justify-content: space-between;align-items: center;padding-right: 0;border-bottom:1px solid #eee" |
| | | :index="(index+1 + '-' + index + 1).toString()" |
| | | style=" |
| | | display: flex; |
| | | justify-content: space-between; |
| | | align-items: center; |
| | | padding-right: 0; |
| | | border-bottom: 1px solid #eee; |
| | | " |
| | | :index="(index + 1 + '-' + index + 1).toString()" |
| | | @click="changeCarData(item)" |
| | | > |
| | | <span>{{ item.name }}</span> |
| | | <i |
| | | style="vertical-align: -2.5px;font-size: 20px;margin-right:10px;margin-left:auto" |
| | | class="iconfont iconfaxianzuobiao" |
| | | @click="deviceDetail(item.mac,null,item,0)" |
| | | style=" |
| | | vertical-align: -2.5px; |
| | | font-size: 20px; |
| | | margin-right: 10px; |
| | | margin-left: auto; |
| | | " |
| | | class="iconfont iconfaxianzuobiao" |
| | | @click="deviceDetail(item.mac, null, item, 0)" |
| | | /> |
| | | <!-- @click="deviceDetail('p5dnd7a0245390',null,item,0)"--> |
| | | <!-- @click="deviceDetail('p5dnd7a0245390',null,item,0)"--> |
| | | </el-menu-item> |
| | | </el-menu> |
| | | </el-aside> |
| | | <el-dialog> </el-dialog> |
| | | <el-container style="position: relative"> |
| | | <div class="carTop"> |
| | | <span style="float:left;margin: 1px 10px 0 0;"> |
| | | <el-button size="medium" type="primary" icon="el-icon-setting" @click="dialogFormVisible = true">6参设定</el-button> |
| | | <span style="float: left; margin: 1px 10px 0 0"> |
| | | <el-button |
| | | size="medium" |
| | | type="primary" |
| | | icon="el-icon-setting" |
| | | @click="dialogFormVisible = true" |
| | | >6参设定</el-button |
| | | > |
| | | </span> |
| | | <span |
| | | v-for="(item, index) in snesorParams" |
| | |
| | | class="left" |
| | | :class="{ click: changeColor == index }" |
| | | @click="changeCode(index)" |
| | | >{{ item }} |
| | | >{{ item }} |
| | | </span> |
| | | <span |
| | | v-for="(item,index) in viewOptions" |
| | | :key="index+ '-only'" |
| | | v-for="(item, index) in viewOptions" |
| | | :key="index + '-only'" |
| | | class="right" |
| | | :class="{ click: changeColor1 == index }" |
| | | @click="changeCode1(index)" |
| | | >{{ item }} |
| | | >{{ item }} |
| | | </span> |
| | | <span v-if="webSocketView" style="float:right;margin: 2px 10px 0 0;"> |
| | | <el-button size="medium" type="primary" @click="wsStart()">开启实时</el-button> |
| | | <span v-if="webSocketView" style="float: right; margin: 2px 10px 0 0"> |
| | | <el-button size="medium" type="primary" @click="wsStart()" |
| | | >开启实时</el-button |
| | | > |
| | | </span> |
| | | <!-- <el-date-picker |
| | | v-if="historyView" |
| | | v-model="dateValue" |
| | | value-format="yyyy-MM-dd" |
| | | style="float:right;margin-right: 10px;line-height: 40px;" |
| | | align="right" |
| | | type="date" |
| | | placeholder="选择日期" |
| | | :picker-options="pickerOptions" |
| | | @change="dateChange" |
| | | />--> |
| | | <!-- <el-date-picker |
| | | v-if="historyView" |
| | | v-model="dateValue" |
| | | value-format="yyyy-MM-dd" |
| | | style="float:right;margin-right: 10px;line-height: 40px;" |
| | | align="right" |
| | | type="date" |
| | | placeholder="选择日期" |
| | | :picker-options="pickerOptions" |
| | | @change="dateChange" |
| | | />--> |
| | | <!-- 选择时间段 --> |
| | | <el-time-picker |
| | | :disabled="isDisTime" |
| | | style="float:right;width: 210px" |
| | | is-range |
| | | v-model="timeValue" |
| | | @blur="blurChange" |
| | | range-separator="至" |
| | | start-placeholder="开始时间" |
| | | end-placeholder="结束时间" |
| | | placeholder="选择时间范围"> |
| | | </el-time-picker> |
| | | <!-- <el-time-picker--> |
| | | <!-- :disabled="isDisTime"--> |
| | | <!-- style="float:right;width: 210px"--> |
| | | <!-- is-range--> |
| | | <!-- v-model="timeValue"--> |
| | | <!-- @blur="blurChange"--> |
| | | <!-- range-separator="至"--> |
| | | <!-- start-placeholder="开始时间"--> |
| | | <!-- end-placeholder="结束时间"--> |
| | | <!-- placeholder="选择时间范围">--> |
| | | <!-- </el-time-picker>--> |
| | | <!-- 历史日期选择下拉框 --> |
| | | <el-select v-if="historyView" v-model="dateValue" placeholder="选择日期" style="float:right;line-height:40px;margin-right:10px;width:140px" @change="dateChange"> |
| | | <el-option |
| | | v-for="item in isDataList" |
| | | :key="item.value" |
| | | :label="item.label" |
| | | :value="item.value" |
| | | @click.native="dataChangeClick" |
| | | /> |
| | | </el-select> |
| | | <!-- <el-select v-if="historyView" v-model="dateValue" placeholder="选择日期" style="float:right;line-height:40px;margin-right:10px;width:140px" @change="dateChange">--> |
| | | <!-- <el-option--> |
| | | <!-- v-for="item in isDataList"--> |
| | | <!-- :key="item.value"--> |
| | | <!-- :label="item.label"--> |
| | | <!-- :value="item.value"--> |
| | | <!-- @click.native="dataChangeClick"--> |
| | | <!-- />--> |
| | | <!-- </el-select>--> |
| | | <el-date-picker |
| | | style="float: right; margin-right: 10px" |
| | | @change="dateChange" |
| | | v-model="dateValue" |
| | | type="datetimerange" |
| | | :picker-options="threeOptions" |
| | | range-separator="至" |
| | | start-placeholder="开始日期" |
| | | end-placeholder="结束日期" |
| | | > |
| | | </el-date-picker> |
| | | <!-- 历史/实时切换下拉框 --> |
| | | <el-select v-model="dataTypeValue" placeholder="数据类型" style="float:right;line-height:40px;margin-right:10px;width:103px"> |
| | | <el-select |
| | | v-model="dataTypeValue" |
| | | placeholder="数据类型" |
| | | style=" |
| | | float: right; |
| | | line-height: 40px; |
| | | margin-right: 10px; |
| | | width: 103px; |
| | | " |
| | | > |
| | | <el-option |
| | | v-for="item in dataTypeList" |
| | | :key="item.value" |
| | |
| | | </el-select> |
| | | </div> |
| | | <div v-if="noneData" class="noneData">当前时间没有走航数据</div> |
| | | <div id="map_container" v-loading="loading" /> <!-- 百度地图 --> |
| | | <div id="map_container" v-loading="loading" /> |
| | | <!-- 百度地图 --> |
| | | </el-container> |
| | | </el-container> |
| | | <!-- <div id="selectSenor"> |
| | |
| | | <!-- 6参设定弹窗 --> |
| | | <el-dialog title="6参设定" :visible.sync="dialogFormVisible" width="1000px"> |
| | | <el-descriptions title="国控6参" :column="3" border> |
| | | <el-descriptions-item label="PM2.5 | ug/m³" label-class-name="my-label" content-class-name="my-content">22</el-descriptions-item> |
| | | <el-descriptions-item |
| | | label="PM2.5 | ug/m³" |
| | | label-class-name="my-label" |
| | | content-class-name="my-content" |
| | | >22</el-descriptions-item |
| | | > |
| | | <el-descriptions-item label="PM10 | ug/m³">34</el-descriptions-item> |
| | | <el-descriptions-item label="SO2 | ug/m³">4</el-descriptions-item> |
| | | <el-descriptions-item label="NO2 | ug/m³">16</el-descriptions-item> |
| | |
| | | <!-- <el-descriptions title="设备标准值" border> |
| | | </el-descriptions> --> |
| | | <div |
| | | style="font-size: 16px;font-weight: 700;margin:10px 0 20px 0;font-size: 16px; |
| | | font-weight: 700;color: #303133;" |
| | | >设备标准值</div> |
| | | style=" |
| | | font-size: 16px; |
| | | font-weight: 700; |
| | | margin: 10px 0 20px 0; |
| | | font-size: 16px; |
| | | font-weight: 700; |
| | | color: #303133; |
| | | " |
| | | > |
| | | 设备标准值 |
| | | </div> |
| | | <el-table :data="sensorTableData" border> |
| | | <el-table-column |
| | | prop="sensorName" |
| | | label="名称" |
| | | /> |
| | | <el-table-column |
| | | prop="unit" |
| | | label="单位" |
| | | /> |
| | | <el-table-column prop="sensorName" label="名称" /> |
| | | <el-table-column prop="unit" label="单位" /> |
| | | <el-table-column label="一级"> |
| | | <template slot-scope="scope"> |
| | | <el-input v-model="scope.row.tab1" placeholder="请输入内容" /> |
| | |
| | | <script> |
| | | import $ from 'jquery' |
| | | import '@/assets/icon/iconfont.css' |
| | | import requestObj from '@/utils/request' |
| | | var GPS = { |
| | | PI: 3.14159265358979324, |
| | | x_pi: 3.14159265358979324 * 3000.0 / 180.0, |
| | | delta: function(lat, lon) { |
| | | x_pi: (3.14159265358979324 * 3000.0) / 180.0, |
| | | delta: function (lat, lon) { |
| | | var a = 6378245.0 // a: 卫星椭球坐标投影到平面地图坐标系的投影因子。 |
| | | var ee = 0.00669342162296594323 // ee: 椭球的偏心率。 |
| | | var dLat = this.transformLat(lon - 105.0, lat - 35.0) |
| | | var dLon = this.transformLon(lon - 105.0, lat - 35.0) |
| | | var radLat = lat / 180.0 * this.PI |
| | | var radLat = (lat / 180.0) * this.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) * this.PI) |
| | | dLon = (dLon * 180.0) / (a / sqrtMagic * Math.cos(radLat) * this.PI) |
| | | return { 'lat': dLat, 'lon': dLon } |
| | | dLat = (dLat * 180.0) / (((a * (1 - ee)) / (magic * sqrtMagic)) * this.PI) |
| | | dLon = (dLon * 180.0) / ((a / sqrtMagic) * Math.cos(radLat) * this.PI) |
| | | return { lat: dLat, lon: dLon } |
| | | }, |
| | | |
| | | // WGS-84 to GCJ-02 |
| | | gcj_encrypt: function(wgsLat, wgsLon) { |
| | | if (this.outOfChina(wgsLat, wgsLon)) { return { 'lat': wgsLat, 'lon': wgsLon } } |
| | | gcj_encrypt: function (wgsLat, wgsLon) { |
| | | if (this.outOfChina(wgsLat, wgsLon)) { |
| | | return { lat: wgsLat, lon: wgsLon } |
| | | } |
| | | |
| | | var d = this.delta(wgsLat, wgsLon) |
| | | return { 'lat': wgsLat + d.lat, 'lon': wgsLon + d.lon } |
| | | return { lat: wgsLat + d.lat, lon: wgsLon + d.lon } |
| | | }, |
| | | // GCJ-02 to WGS-84 |
| | | gcj_decrypt: function(gcjLat, gcjLon) { |
| | | if (this.outOfChina(gcjLat, gcjLon)) { return { 'lat': gcjLat, 'lon': gcjLon } } |
| | | gcj_decrypt: function (gcjLat, gcjLon) { |
| | | if (this.outOfChina(gcjLat, gcjLon)) { |
| | | return { lat: gcjLat, lon: gcjLon } |
| | | } |
| | | |
| | | var d = this.delta(gcjLat, gcjLon) |
| | | return { 'lat': gcjLat - d.lat, 'lon': gcjLon - d.lon } |
| | | return { lat: gcjLat - d.lat, lon: gcjLon - d.lon } |
| | | }, |
| | | // GCJ-02 to WGS-84 exactly |
| | | gcj_decrypt_exact: function(gcjLat, gcjLon) { |
| | | gcj_decrypt_exact: function (gcjLat, gcjLon) { |
| | | var initDelta = 0.01 |
| | | var threshold = 0.000000001 |
| | | var dLat = initDelta; var dLon = initDelta |
| | | var mLat = gcjLat - dLat; var mLon = gcjLon - dLon |
| | | var pLat = gcjLat + dLat; var pLon = gcjLon + dLon |
| | | var wgsLat; var wgsLon; var i = 0 |
| | | var dLat = initDelta |
| | | var dLon = initDelta |
| | | var mLat = gcjLat - dLat |
| | | var mLon = gcjLon - dLon |
| | | var pLat = gcjLat + dLat |
| | | var pLon = gcjLon + dLon |
| | | var wgsLat |
| | | var wgsLon |
| | | var i = 0 |
| | | while (1) { |
| | | wgsLat = (mLat + pLat) / 2 |
| | | wgsLon = (mLon + pLon) / 2 |
| | | var tmp = this.gcj_encrypt(wgsLat, wgsLon) |
| | | dLat = tmp.lat - gcjLat |
| | | dLon = tmp.lon - gcjLon |
| | | if ((Math.abs(dLat) < threshold) && (Math.abs(dLon) < threshold)) { break } |
| | | if (Math.abs(dLat) < threshold && Math.abs(dLon) < threshold) { |
| | | break |
| | | } |
| | | |
| | | if (dLat > 0) pLat = wgsLat; else mLat = wgsLat |
| | | if (dLon > 0) pLon = wgsLon; else mLon = wgsLon |
| | | if (dLat > 0) pLat = wgsLat |
| | | else mLat = wgsLat |
| | | if (dLon > 0) pLon = wgsLon |
| | | else mLon = wgsLon |
| | | |
| | | if (++i > 10000) break |
| | | } |
| | | return { 'lat': wgsLat, 'lon': wgsLon } |
| | | return { lat: wgsLat, lon: wgsLon } |
| | | }, |
| | | // GCJ-02 to BD-09 |
| | | bd_encrypt: function(gcjLat, gcjLon) { |
| | | var x = gcjLon; var y = gcjLat |
| | | bd_encrypt: function (gcjLat, gcjLon) { |
| | | var x = gcjLon |
| | | var y = gcjLat |
| | | var z = Math.sqrt(x * x + y * y) + 0.00002 * Math.sin(y * this.x_pi) |
| | | var theta = Math.atan2(y, x) + 0.000003 * Math.cos(x * this.x_pi) |
| | | this.bdLon = z * Math.cos(theta) + 0.0065 |
| | | this.bdLat = z * Math.sin(theta) + 0.006 |
| | | return { 'lat': this.bdLat, 'lon': this.bdLon } |
| | | return { lat: this.bdLat, lon: this.bdLon } |
| | | }, |
| | | // BD-09 to GCJ-02 |
| | | bd_decrypt: function(bdLat, bdLon) { |
| | | var x = bdLon - 0.0065; var y = bdLat - 0.006 |
| | | bd_decrypt: function (bdLat, bdLon) { |
| | | var x = bdLon - 0.0065 |
| | | var y = bdLat - 0.006 |
| | | var z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * this.x_pi) |
| | | var theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * this.x_pi) |
| | | var gcjLon = z * Math.cos(theta) |
| | | var gcjLat = z * Math.sin(theta) |
| | | return { 'lat': gcjLat, 'lon': gcjLon } |
| | | return { lat: gcjLat, lon: gcjLon } |
| | | }, |
| | | // WGS-84 to Web mercator |
| | | // mercatorLat -> y mercatorLon -> x |
| | | mercator_encrypt: function(wgsLat, wgsLon) { |
| | | var x = wgsLon * 20037508.34 / 180.0 |
| | | var y = Math.log(Math.tan((90.0 + wgsLat) * this.PI / 360.0)) / (this.PI / 180.0) |
| | | y = y * 20037508.34 / 180.0 |
| | | return { 'lat': y, 'lon': x } |
| | | mercator_encrypt: function (wgsLat, wgsLon) { |
| | | var x = (wgsLon * 20037508.34) / 180.0 |
| | | var y = |
| | | Math.log(Math.tan(((90.0 + wgsLat) * this.PI) / 360.0)) / |
| | | (this.PI / 180.0) |
| | | y = (y * 20037508.34) / 180.0 |
| | | return { lat: y, lon: x } |
| | | }, |
| | | // Web mercator to WGS-84 |
| | | // mercatorLat -> y mercatorLon -> x |
| | | mercator_decrypt: function(mercatorLat, mercatorLon) { |
| | | var x = mercatorLon / 20037508.34 * 180.0 |
| | | var y = mercatorLat / 20037508.34 * 180.0 |
| | | y = 180 / this.PI * (2 * Math.atan(Math.exp(y * this.PI / 180.0)) - this.PI / 2) |
| | | return { 'lat': y, 'lon': x } |
| | | mercator_decrypt: function (mercatorLat, mercatorLon) { |
| | | var x = (mercatorLon / 20037508.34) * 180.0 |
| | | var y = (mercatorLat / 20037508.34) * 180.0 |
| | | y = |
| | | (180 / this.PI) * |
| | | (2 * Math.atan(Math.exp((y * this.PI) / 180.0)) - this.PI / 2) |
| | | return { lat: y, lon: x } |
| | | }, |
| | | // two point's distance |
| | | distance: function(latA, lonA, latB, lonB) { |
| | | distance: function (latA, lonA, latB, lonB) { |
| | | var earthR = 6371000.0 |
| | | var x = Math.cos(latA * this.PI / 180.0) * Math.cos(latB * this.PI / 180.0) * Math.cos((lonA - lonB) * this.PI / 180) |
| | | var y = Math.sin(latA * this.PI / 180.0) * Math.sin(latB * this.PI / 180.0) |
| | | var x = |
| | | Math.cos((latA * this.PI) / 180.0) * |
| | | Math.cos((latB * this.PI) / 180.0) * |
| | | Math.cos(((lonA - lonB) * this.PI) / 180) |
| | | var y = |
| | | Math.sin((latA * this.PI) / 180.0) * Math.sin((latB * this.PI) / 180.0) |
| | | var s = x + y |
| | | if (s > 1) s = 1 |
| | | if (s < -1) s = -1 |
| | |
| | | var distance = alpha * earthR |
| | | return distance |
| | | }, |
| | | outOfChina: function(lat, lon) { |
| | | if (lon < 72.004 || lon > 137.8347) { return true } |
| | | if (lat < 0.8293 || lat > 55.8271) { return true } |
| | | outOfChina: function (lat, lon) { |
| | | if (lon < 72.004 || lon > 137.8347) { |
| | | return true |
| | | } |
| | | if (lat < 0.8293 || lat > 55.8271) { |
| | | return true |
| | | } |
| | | return false |
| | | }, |
| | | transformLat: function(x, y) { |
| | | var ret = -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y + 0.2 * Math.sqrt(Math.abs(x)) |
| | | ret += (20.0 * Math.sin(6.0 * x * this.PI) + 20.0 * Math.sin(2.0 * x * this.PI)) * 2.0 / 3.0 |
| | | ret += (20.0 * Math.sin(y * this.PI) + 40.0 * Math.sin(y / 3.0 * this.PI)) * 2.0 / 3.0 |
| | | ret += (160.0 * Math.sin(y / 12.0 * this.PI) + 320 * Math.sin(y * this.PI / 30.0)) * 2.0 / 3.0 |
| | | transformLat: function (x, y) { |
| | | var ret = |
| | | -100.0 + |
| | | 2.0 * x + |
| | | 3.0 * y + |
| | | 0.2 * y * y + |
| | | 0.1 * x * y + |
| | | 0.2 * Math.sqrt(Math.abs(x)) |
| | | ret += |
| | | ((20.0 * Math.sin(6.0 * x * this.PI) + |
| | | 20.0 * Math.sin(2.0 * x * this.PI)) * |
| | | 2.0) / |
| | | 3.0 |
| | | ret += |
| | | ((20.0 * Math.sin(y * this.PI) + 40.0 * Math.sin((y / 3.0) * this.PI)) * |
| | | 2.0) / |
| | | 3.0 |
| | | ret += |
| | | ((160.0 * Math.sin((y / 12.0) * this.PI) + |
| | | 320 * Math.sin((y * this.PI) / 30.0)) * |
| | | 2.0) / |
| | | 3.0 |
| | | return ret |
| | | }, |
| | | transformLon: function(x, y) { |
| | | var ret = 300.0 + x + 2.0 * y + 0.1 * x * x + 0.1 * x * y + 0.1 * Math.sqrt(Math.abs(x)) |
| | | ret += (20.0 * Math.sin(6.0 * x * this.PI) + 20.0 * Math.sin(2.0 * x * this.PI)) * 2.0 / 3.0 |
| | | ret += (20.0 * Math.sin(x * this.PI) + 40.0 * Math.sin(x / 3.0 * this.PI)) * 2.0 / 3.0 |
| | | ret += (150.0 * Math.sin(x / 12.0 * this.PI) + 300.0 * Math.sin(x / 30.0 * this.PI)) * 2.0 / 3.0 |
| | | transformLon: function (x, y) { |
| | | var ret = |
| | | 300.0 + |
| | | x + |
| | | 2.0 * y + |
| | | 0.1 * x * x + |
| | | 0.1 * x * y + |
| | | 0.1 * Math.sqrt(Math.abs(x)) |
| | | ret += |
| | | ((20.0 * Math.sin(6.0 * x * this.PI) + |
| | | 20.0 * Math.sin(2.0 * x * this.PI)) * |
| | | 2.0) / |
| | | 3.0 |
| | | ret += |
| | | ((20.0 * Math.sin(x * this.PI) + 40.0 * Math.sin((x / 3.0) * this.PI)) * |
| | | 2.0) / |
| | | 3.0 |
| | | ret += |
| | | ((150.0 * Math.sin((x / 12.0) * this.PI) + |
| | | 300.0 * Math.sin((x / 30.0) * this.PI)) * |
| | | 2.0) / |
| | | 3.0 |
| | | return ret |
| | | } |
| | | }, |
| | | } |
| | | export default { |
| | | data() { |
| | |
| | | 'CO', |
| | | 'O3', |
| | | 'TVOC', |
| | | '尘负荷' |
| | | '尘负荷', |
| | | ], |
| | | changeColor: 0, |
| | | changeColor1: 0, |
| | |
| | | dataType: 'history', |
| | | responseJSON: null, |
| | | radio1: null, |
| | | viewOptions: [ |
| | | '平铺', |
| | | '立体' |
| | | ], |
| | | dateValue: null, |
| | | viewOptions: ['平铺', '立体'], |
| | | dateValue: [], |
| | | pickerOptions: { |
| | | disabledDate(time) { |
| | | return time.getTime() > Date.now() |
| | | }, |
| | | shortcuts: [{ |
| | | text: '今天', |
| | | onClick(picker) { |
| | | picker.$emit('pick', new Date()) |
| | | shortcuts: [ |
| | | { |
| | | text: '今天', |
| | | onClick(picker) { |
| | | picker.$emit('pick', new Date()) |
| | | }, |
| | | }, |
| | | { |
| | | text: '昨天', |
| | | onClick(picker) { |
| | | const date = new Date() |
| | | date.setTime(date.getTime() - 3600 * 1000 * 24) |
| | | picker.$emit('pick', date) |
| | | }, |
| | | }, |
| | | { |
| | | text: '一周前', |
| | | onClick(picker) { |
| | | const date = new Date() |
| | | date.setTime(date.getTime() - 3600 * 1000 * 24 * 7) |
| | | picker.$emit('pick', date) |
| | | }, |
| | | }, |
| | | ], |
| | | }, |
| | | timeOne: '', |
| | | threeOptions: { |
| | | onPick: ({ maxDate, minDate }) => { |
| | | // 最大时间 最小时间 |
| | | this.timeOne = minDate.getTime() // 当选一个日期时 就是最小日期 |
| | | // 如何你选择了两个日期了,就把那个变量置空 |
| | | if (maxDate) this.timeOne = '' |
| | | }, |
| | | disabledDate: (time) => { |
| | | if (this.timeOne) { |
| | | const WEEK = 3 * 24 * 3600 * 1000 - 1 // 这里乘以3再减去1相当于 限制3天以内 |
| | | const minTime = this.timeOne // 三天之前 |
| | | const maxTime = this.timeOne + WEEK // 三天之后 |
| | | return ( |
| | | time.getTime() < minTime || |
| | | time.getTime() > maxTime || |
| | | time.getTime() > new Date() |
| | | ) |
| | | } else { |
| | | return time.getTime() > new Date() |
| | | } |
| | | }, { |
| | | text: '昨天', |
| | | onClick(picker) { |
| | | const date = new Date() |
| | | date.setTime(date.getTime() - 3600 * 1000 * 24) |
| | | picker.$emit('pick', date) |
| | | } |
| | | }, { |
| | | text: '一周前', |
| | | onClick(picker) { |
| | | const date = new Date() |
| | | date.setTime(date.getTime() - 3600 * 1000 * 24 * 7) |
| | | picker.$emit('pick', date) |
| | | } |
| | | }] |
| | | }, |
| | | }, |
| | | sensorDate: null, |
| | | noneData: false, |
| | |
| | | carMac: null, |
| | | dialogFormVisible: false, |
| | | sensorTableData: [ |
| | | { sensorName: 'PM2.5', unit: 'ug/m³', tab1: '35', tab2: '75', tab3: '115', tab4: '150', tab5: '250', tab6: '350' }, |
| | | { sensorName: 'PM10', unit: 'ug/m³', tab1: '50', tab2: '150', tab3: '250', tab4: '350', tab5: '420', tab6: '500' }, |
| | | { sensorName: 'SO2', unit: 'ug/m³', tab1: '50', tab2: '150', tab3: '475', tab4: '800', tab5: '1600', tab6: '2100' }, |
| | | { sensorName: 'NO2', unit: 'ug/m³', tab1: '40', tab2: '80', tab3: '180', tab4: '280', tab5: '565', tab6: '750' }, |
| | | { sensorName: 'CO', unit: 'mg/m³', tab1: '2', tab2: '4', tab3: '14', tab4: '24', tab5: '36', tab6: '48' }, |
| | | { sensorName: 'O3', unit: 'ug/m³', tab1: '100', tab2: '160', tab3: '215', tab4: '265', tab5: '800', tab6: '800' }, |
| | | { sensorName: 'TVOC', unit: 'mg/m³', tab1: '0.1', tab2: '0.3', tab3: '0.5', tab4: '0.7', tab5: '0.9', tab6: '1' }, |
| | | { sensorName: '尘负荷', unit: 'ug/m³', tab1: '300', tab2: '500', tab3: '1000', tab4: '10000', tab5: '20000', tab6: '50000' } |
| | | { |
| | | sensorName: 'PM2.5', |
| | | unit: 'ug/m³', |
| | | tab1: '35', |
| | | tab2: '75', |
| | | tab3: '115', |
| | | tab4: '150', |
| | | tab5: '250', |
| | | tab6: '350', |
| | | }, |
| | | { |
| | | sensorName: 'PM10', |
| | | unit: 'ug/m³', |
| | | tab1: '50', |
| | | tab2: '150', |
| | | tab3: '250', |
| | | tab4: '350', |
| | | tab5: '420', |
| | | tab6: '500', |
| | | }, |
| | | { |
| | | sensorName: 'SO2', |
| | | unit: 'ug/m³', |
| | | tab1: '50', |
| | | tab2: '150', |
| | | tab3: '475', |
| | | tab4: '800', |
| | | tab5: '1600', |
| | | tab6: '2100', |
| | | }, |
| | | { |
| | | sensorName: 'NO2', |
| | | unit: 'ug/m³', |
| | | tab1: '40', |
| | | tab2: '80', |
| | | tab3: '180', |
| | | tab4: '280', |
| | | tab5: '565', |
| | | tab6: '750', |
| | | }, |
| | | { |
| | | sensorName: 'CO', |
| | | unit: 'mg/m³', |
| | | tab1: '2', |
| | | tab2: '4', |
| | | tab3: '14', |
| | | tab4: '24', |
| | | tab5: '36', |
| | | tab6: '48', |
| | | }, |
| | | { |
| | | sensorName: 'O3', |
| | | unit: 'ug/m³', |
| | | tab1: '100', |
| | | tab2: '160', |
| | | tab3: '215', |
| | | tab4: '265', |
| | | tab5: '800', |
| | | tab6: '800', |
| | | }, |
| | | { |
| | | sensorName: 'TVOC', |
| | | unit: 'mg/m³', |
| | | tab1: '0.1', |
| | | tab2: '0.3', |
| | | tab3: '0.5', |
| | | tab4: '0.7', |
| | | tab5: '0.9', |
| | | tab6: '1', |
| | | }, |
| | | { |
| | | sensorName: '尘负荷', |
| | | unit: 'ug/m³', |
| | | tab1: '300', |
| | | tab2: '500', |
| | | tab3: '1000', |
| | | tab4: '10000', |
| | | tab5: '20000', |
| | | tab6: '50000', |
| | | }, |
| | | ], |
| | | carWs: null, |
| | | map: null, |
| | |
| | | firstPlayFlag: true, |
| | | firstWsFlag: true, |
| | | msgTemp: [], |
| | | dataTypeList: [{ |
| | | value: 'history', |
| | | label: '历史数据' |
| | | }, { |
| | | value: 'webSocket', |
| | | label: '实时数据' |
| | | }], |
| | | dataTypeList: [ |
| | | { |
| | | value: 'history', |
| | | label: '历史数据', |
| | | }, |
| | | { |
| | | value: 'webSocket', |
| | | label: '实时数据', |
| | | }, |
| | | ], |
| | | dataTypeValue: 'history', |
| | | historyView: true, |
| | | webSocketView: false, |
| | |
| | | endTime: '', |
| | | dataDate: '', |
| | | sensorTime: [], |
| | | timeValue: [new Date(2020, 1, 1, 0, 0, 0), new Date(2022, 12, 31, 23, 59, 59)] |
| | | timeValue: [ |
| | | new Date(2020, 1, 1, 0, 0, 0), |
| | | new Date(2022, 12, 31, 23, 59, 59), |
| | | ], |
| | | } |
| | | }, |
| | | watch: { |
| | | dataTypeValue(n, o) { |
| | | if (this.dataTypeValue === 'webSocket') { |
| | | this.dateValue = null |
| | | this.dateValue = [] |
| | | this.historyView = false |
| | | this.webSocketView = true |
| | | } else { |
| | | this.dateValue = null |
| | | this.dateValue = [] |
| | | this.historyView = true |
| | | this.webSocketView = false |
| | | } |
| | | }, |
| | | dateValue(n, o) { |
| | | if (n === null) { |
| | | this.dateValue = [] |
| | | } |
| | | }, |
| | | viewKey(n, o) { |
| | | // console.log(n) |
| | | } |
| | | }, |
| | | deep: true, |
| | | immediate: true, |
| | | // timeValue: { |
| | | // handler(newVal, oldVal) { |
| | | // this.sensorTime = this.newTime() |
| | |
| | | } |
| | | // }) |
| | | }, |
| | | beforeDestroy() { |
| | | }, |
| | | beforeDestroy() {}, |
| | | created() { |
| | | this.newTime(this.timeValue) |
| | | this.newDate() |
| | | this.getCarData() |
| | | this.$watch('carMac', () => { |
| | | this.getMacDate() |
| | | }) |
| | | // this.$watch('carMac', () => { |
| | | // this.getMacDate() |
| | | // }) |
| | | }, |
| | | methods: { |
| | | // 时间处理函数 |
| | | newTime2(timeArr) { |
| | | var arr = [] |
| | | timeArr.map((v) => { |
| | | var date = new Date(v) |
| | | var y = date.getFullYear() |
| | | var m = date.getMonth() + 1 |
| | | m = m < 10 ? '0' + m : m |
| | | var d = date.getDate() |
| | | d = d < 10 ? '0' + d : d |
| | | var h = date.getHours() |
| | | h = h < 10 ? '0' + h : h |
| | | var minute = date.getMinutes() |
| | | minute = minute < 10 ? '0' + minute : minute |
| | | var s = date.getSeconds() |
| | | s = s < 10 ? '0' + s : s |
| | | arr.push(y + '-' + m + '-' + d + ' ' + h + ':' + minute + ':' + s) |
| | | }) |
| | | return arr |
| | | }, |
| | | // 跳转设备详情页 |
| | | deviceDetail(mac, item, items, indexs) { |
| | | // console.log('这是传输过去的值') |
| | |
| | | device: items, |
| | | macName: mac, |
| | | indexs: indexs, |
| | | items: [items.latitude, items.longitude] |
| | | items: [items.latitude, items.longitude], |
| | | }, |
| | | query: { |
| | | monitorPointInfo: JSON.stringify(item), |
| | |
| | | macName: mac, |
| | | indexs: indexs, |
| | | items: [items.latitude, items.longitude], |
| | | equipment: 'car' |
| | | } |
| | | equipment: 'car', |
| | | }, |
| | | }) |
| | | }, |
| | | // 6参设定方法 |
| | |
| | | getCarData() { |
| | | this.$request({ |
| | | url: '/cruiser/selectCruisers', |
| | | method: 'get' |
| | | method: 'get', |
| | | }) |
| | | .then(res => { |
| | | .then((res) => { |
| | | this.defaultData = res.data |
| | | this.carMac = res.data[0].mac |
| | | }) |
| | | .catch(err => { |
| | | .catch((err) => { |
| | | console.log(err) |
| | | }) |
| | | }, |
| | |
| | | url: '/cruiser/getDates', |
| | | method: 'get', |
| | | params: { |
| | | mac: this.carMac |
| | | } |
| | | mac: this.carMac, |
| | | }, |
| | | }) |
| | | .then(res => { |
| | | .then((res) => { |
| | | for (let i = 0; i < res.data.length; i++) { |
| | | // this.isDataList[i].value = res.data.data[i] |
| | | // this.isDataList[i].label = res.data.data[i] |
| | | // this.isDataList[i] = { value: res.data.data[i], label: res.data.data[i] } |
| | | this.isDataList.push({ |
| | | value: res.data[i], |
| | | label: res.data[i] |
| | | label: res.data[i], |
| | | }) |
| | | } |
| | | }) |
| | | .catch(err => { |
| | | .catch((err) => { |
| | | console.log(err) |
| | | }) |
| | | }, |
| | | // 进行经纬度转换为距离的计算 |
| | | Rad(d) { |
| | | return d * Math.PI / 180.0// 经纬度转换成三角函数中度分表形式。 |
| | | return (d * Math.PI) / 180.0 // 经纬度转换成三角函数中度分表形式。 |
| | | }, |
| | | // 计算距离,参数分别为第一点的纬度,经度;第二点的纬度,经度 |
| | | GetDistance(lat1, lng1, lat2, lng2) { |
| | |
| | | var radLat2 = this.Rad(lat2) |
| | | var a = radLat1 - radLat2 |
| | | var b = this.Rad(lng1) - this.Rad(lng2) |
| | | var s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) + |
| | | Math.cos(radLat1) * Math.cos(radLat2) * Math.pow(Math.sin(b / 2), 2))) |
| | | var s = |
| | | 2 * |
| | | Math.asin( |
| | | Math.sqrt( |
| | | Math.pow(Math.sin(a / 2), 2) + |
| | | Math.cos(radLat1) * |
| | | Math.cos(radLat2) * |
| | | Math.pow(Math.sin(b / 2), 2) |
| | | ) |
| | | ) |
| | | s = s * 6378.137 // EARTH_RADIUS; |
| | | s = Math.round(s * 10000) / 10000 // 输出为公里 |
| | | // s=s.toFixed(4); |
| | |
| | | // 日期格式化 |
| | | newDate() { |
| | | var aData = new Date() |
| | | var month = aData.getMonth() < 9 ? '0' + (aData.getMonth() + 1) : aData.getMonth() + 1 |
| | | var month = |
| | | aData.getMonth() < 9 |
| | | ? '0' + (aData.getMonth() + 1) |
| | | : aData.getMonth() + 1 |
| | | var date = aData.getDate() <= 9 ? '0' + aData.getDate() : aData.getDate() |
| | | this.sensorDate = aData.getFullYear() + '-' + month + '-' + date |
| | | }, |
| | |
| | | let str = '' |
| | | let str2 = '' |
| | | this.sensorTime = [] |
| | | timeArr.map(v => { |
| | | timeArr.map((v) => { |
| | | v = JSON.stringify(v) |
| | | str2 = v.substr(12, 8).split(':') |
| | | str2[0] = (str2[0] - 0 + 8) % 24 < 9 ? '0' + (str2[0] - 0 + 8) % 24 : (str2[0] - 0 + 8) % 24 |
| | | str2[0] = |
| | | (str2[0] - 0 + 8) % 24 < 9 |
| | | ? '0' + ((str2[0] - 0 + 8) % 24) |
| | | : (str2[0] - 0 + 8) % 24 |
| | | str = str2.join(':') |
| | | this.sensorTime.push(str) |
| | | }) |
| | | }, |
| | | // 数据类型 |
| | | dateChange(e) { |
| | | this.sensorDate = e; |
| | | // if (this.view) { |
| | | // this.view.removeAllLayers() |
| | | // this.map.clearOverlays() |
| | | // // console.log('清除图层') |
| | | // } |
| | | // this.dataType = 'history' |
| | | // // this.map = null |
| | | // this.getStart() |
| | | }, |
| | | // 日期选择点击事件 |
| | | dataChangeClick(e) { |
| | | if (!this.isDisTime) { |
| | | // 更改时间格式 |
| | | this.newTime(this.timeValue) |
| | | if (e === null) { |
| | | this.sensorDate = [] |
| | | } else { |
| | | this.sensorDate = this.newTime2(e) |
| | | if (this.view) { |
| | | this.view.removeAllLayers() |
| | | this.map.clearOverlays() |
| | |
| | | // this.map = null |
| | | this.getStart() |
| | | } |
| | | this.isDisTime = false |
| | | }, |
| | | // 日期选择点击事件 |
| | | // dataChangeClick(e) { |
| | | // if (!this.isDisTime) { |
| | | // // 更改时间格式 |
| | | // if (this.dateValue.length <= 1) { |
| | | // this.newTime(this.timeValue) |
| | | // } |
| | | // if (this.view) { |
| | | // this.view.removeAllLayers() |
| | | // this.map.clearOverlays() |
| | | // // console.log('清除图层') |
| | | // } |
| | | // this.dataType = 'history' |
| | | // // this.map = null |
| | | // this.getStart() |
| | | // } |
| | | // this.isDisTime = false |
| | | // }, |
| | | // 时间选框失去焦点 |
| | | blurChange() { |
| | | // 更改时间格式 |
| | |
| | | } |
| | | that.dataType = 'webSocket' |
| | | // 拼写URL |
| | | // const baseUrl = `${requestObj.baseUrl}` |
| | | var socketUrl = 'cruiserWebsocket/' + this.carMac |
| | | // 替换http为WS |
| | | socketUrl = socketUrl.replace('https', 'ws').replace('http', 'ws') |
| | | this.ws = new WebSocket(socketUrl) |
| | | this.ws.onopen = function() { |
| | | this.ws.onopen = function () { |
| | | console.log('wsStart开启成功') |
| | | } |
| | | // 获得消息事件,监听后台返回来的消息 |
| | | this.ws.onmessage = function(msg) { |
| | | this.ws.onmessage = function (msg) { |
| | | if (that.firstWsFlag) { |
| | | that.initStart([JSON.parse(msg.data)]) |
| | | that.firstWsFlag = false |
| | |
| | | var lon = parseFloat(JSON.parse(msg.data).flylon) |
| | | if (that.msgTemp.length < 2) { |
| | | that.msgTemp.push({ lat: lat, lon: lon }) |
| | | } |
| | | var distance = that.GetDistance(that.msgTemp[0].lat, that.msgTemp[0].lon, that.msgTemp[1].lat, that.msgTemp[1].lon) |
| | | } |
| | | var distance = that.GetDistance( |
| | | that.msgTemp[0].lat, |
| | | that.msgTemp[0].lon, |
| | | that.msgTemp[1].lat, |
| | | that.msgTemp[1].lon |
| | | ) |
| | | if (distance >= 0.05) { |
| | | that.msgTemp.shift() |
| | | that.msgTemp.push({ lat: lat, lon: lon }) |
| | |
| | | that.msgTemp.pop() |
| | | } |
| | | } |
| | | |
| | | }, |
| | | // 走航车轨迹数据 |
| | | getStart() { |
| | |
| | | this.view.removeAllLayers() |
| | | this.map.clearOverlays() |
| | | } |
| | | var time1 = this.sensorDate + ' ' + this.sensorTime[0] |
| | | var time2 = this.sensorDate + ' ' + this.sensorTime[1] |
| | | |
| | | this.$request({ |
| | | url: '/cruiser/cruiserTrajectory', |
| | | method: 'get', |
| | | params: { |
| | | mac: this.carMac, |
| | | time1, |
| | | time2 |
| | | } |
| | | }).then(res => { |
| | | console.log(res); |
| | | time1: this.sensorDate[0], |
| | | time2: this.sensorDate[1], |
| | | }, |
| | | }).then((res) => { |
| | | if (!res.data.length) { |
| | | this.noneData = true |
| | | this.loading = false |
| | |
| | | this.loading = false |
| | | if (this.responseJSON.length > 0) { |
| | | this.noneData = false |
| | | console.log(that.carMac, 'mac') |
| | | $.each(this.responseJSON, (item, value) => { |
| | | if (typeof (value.flylon) === 'undefined') { |
| | | if (typeof value.flylon === 'undefined') { |
| | | showNoPoints() |
| | | } else { |
| | | var lng = parseFloat(value.flylon.substr(0, value.flylon.length - 1)) |
| | | var lat = parseFloat(value.flylat.substr(0, value.flylat.length - 1)) |
| | | var lng = parseFloat( |
| | | value.flylon.substr(0, value.flylon.length - 1) |
| | | ) |
| | | var lat = parseFloat( |
| | | value.flylat.substr(0, value.flylat.length - 1) |
| | | ) |
| | | if (lng < 70 || lng > 150 || lat > 60 || lat < 20) { |
| | | return true |
| | | } |
| | |
| | | lat = GPS.gcj_encrypt(lat, lng).lat |
| | | lng = GPS.bd_encrypt(lat, lng).lon |
| | | lat = GPS.bd_encrypt(lat, lng).lat |
| | | var point = new BMapGL.Point(lng, lat); |
| | | var point = new BMapGL.Point(lng, lat) |
| | | point.a34004 = parseInt(value.a34004) |
| | | point.a34002 = parseInt(value.a34002) |
| | | point.a21026 = parseInt(value.a21026) |
| | |
| | | point.a21005 = parseFloat(value.a21005).toFixed(3) |
| | | point.a05024 = parseInt(value.a05024) |
| | | point.a99054 = parseFloat(value.a99054).toFixed(3) |
| | | if (value.dustld - 0 !== 0 && value.dustld - 0 < 100 && that.carMac === 'p5dnd7a0243622') { |
| | | if ( |
| | | value.dustld - 0 !== 0 && |
| | | value.dustld - 0 < 100 && |
| | | (that.carMac === 'p5dnd7a0243622' || |
| | | that.carMac === 'p5dnd7a0243625') |
| | | ) { |
| | | point.dustld = 100 |
| | | } else { |
| | | point.dustld = value.dustld - 0 |
| | |
| | | that.sensor = this.sensorKey |
| | | that.viewType = this.viewKey |
| | | that.size = 50 |
| | | that.distance = that.size / 2 / Math.sin(1 * Math.PI / 4) |
| | | that.distance = that.size / 2 / Math.sin((1 * Math.PI) / 4) |
| | | // 已有地图,避免再次请求 |
| | | if (!that.showPoints) { |
| | | that.map = new BMapGL.Map('map_container') |
| | |
| | | } else { |
| | | that.map.setTilt(52) |
| | | } |
| | | that.map.setDisplayOptions({ // 设置天空颜色 |
| | | that.map.setDisplayOptions({ |
| | | // 设置天空颜色 |
| | | skyColors: ['rgba(186, 0, 255, 0)', 'rgba(186, 0, 255, 0.2)'], // 天空颜色 |
| | | building: false, // 不显示建筑物 |
| | | poiText: true// 显示poi文字 |
| | | poiText: true, // 显示poi文字 |
| | | }) |
| | | that.map.addControl(new BMapGL.NavigationControl3D())// 添加3d控件 |
| | | that.map.addControl(new BMapGL.NavigationControl3D()) // 添加3d控件 |
| | | if (this.responseJSON.length === 0) { |
| | | showNoPoints() |
| | | } |
| | |
| | | that.mapZoom = that.viewport.zoom |
| | | that.centerPoint = that.viewport.center |
| | | if (that.firstPlayFlag) { |
| | | that.map.centerAndZoom(that.centerPoint, that.mapZoom) |
| | | that.map.centerAndZoom(that.centerPoint, that.mapZoom) |
| | | that.view = new mapvgl.View({ |
| | | map: that.map |
| | | map: that.map, |
| | | }) |
| | | that.firstPlayFlag = false |
| | | } else { |
| | |
| | | // drawPolygon(sensor);//多边形 |
| | | draw(that.sensor, that.viewType, that.carMac) |
| | | // drawLine()// 轨迹 |
| | | drawStartAndEnd()// 起点和终点标注 |
| | | drawStartAndEnd() // 起点和终点标注 |
| | | function draw(sensor, type, carMac) { |
| | | var levels = getGrading(sensor, type, carMac) |
| | | $.each(levels, function(index, value) { |
| | | $.each(levels, function (index, value) { |
| | | var color = value.color |
| | | var data = value.data |
| | | var data = value.data |
| | | if (data.length > 0) { |
| | | // 创建MapVGL图层管理器,需要使用插件mapvgl |
| | | that.shapeLayer = new mapvgl.ShapeLayer({ |
| | | color: color, // 柱状图颜色 |
| | | enablePicked: true, // 是否可以拾取 |
| | | selectedIndex: -1, // 选中项 |
| | | selectedColor: '#ee1111', // 选中项颜色 |
| | | selectedColor: '#ee1111', // 选中项颜色 |
| | | autoSelect: true, // 根据鼠标位置来自动设置选中项 |
| | | riseTime: 1800 // 楼块初始化升起时间 |
| | | riseTime: 1800, // 楼块初始化升起时间 |
| | | onClick: (e) => { |
| | | console.log(e) |
| | | }, |
| | | }) |
| | | that.shapeLayer.setData(data) |
| | | that.view.addLayer(that.shapeLayer) |
| | |
| | | }) |
| | | that.map.setDefaultCursor('default') |
| | | if (type === '2D') { |
| | | $.each(that.showPoints, function(item, point) { |
| | | $.each(that.showPoints, function (item, point) { |
| | | setLabelStyle(point[sensor], point) |
| | | }) |
| | | } |
| | |
| | | |
| | | // 画方块,上色,添加文字 |
| | | function drawPolygon(sensor) { |
| | | $.each(that.showPoints, function(item, point) { |
| | | $.each(that.showPoints, function (item, point) { |
| | | var sw = getPoint(225, point.lng, point.lat, that.distance) |
| | | var ne = getPoint(45, point.lng, point.lat, that.distance) |
| | | var data = point[sensor] |
| | | // 根据因子浓度变换方块颜色 |
| | | // 根据因子浓度变换方块颜色 |
| | | color = getColorAndLevel(sensor, data).color |
| | | var polygon = new BMapGL.Polygon([ |
| | | new BMapGL.Point(sw.lng, sw.lat), // 左下角 |
| | | new BMapGL.Point(ne.lng, sw.lat), // 左上角 |
| | | new BMapGL.Point(ne.lng, ne.lat), // 右上角 |
| | | new BMapGL.Point(sw.lng, ne.lat)// 右下角 |
| | | ], { strokeWeight: 0.5, strokeOpacity: 0.0, fillColor: color }) |
| | | var polygon = new BMapGL.Polygon( |
| | | [ |
| | | new BMapGL.Point(sw.lng, sw.lat), // 左下角 |
| | | new BMapGL.Point(ne.lng, sw.lat), // 左上角 |
| | | new BMapGL.Point(ne.lng, ne.lat), // 右上角 |
| | | new BMapGL.Point(sw.lng, ne.lat), // 右下角 |
| | | ], |
| | | { strokeWeight: 0.5, strokeOpacity: 0.0, fillColor: color } |
| | | ) |
| | | that.map.addOverlay(polygon) |
| | | // 方块内添加label文本 |
| | | setLabelStyle(data, point) |
| | |
| | | |
| | | // 起点和终点标注 |
| | | function drawStartAndEnd() { |
| | | var startIcon = new BMapGL.Icon(require('@/assets/images/start.png'), new BMapGL.Size(48, 48)) |
| | | var startMark = new BMapGL.Marker(that.showPoints[0], { icon: startIcon, offset: new BMapGL.Size(0, -20) }) |
| | | that.map.addOverlay(startMark) |
| | | var endIcon = new BMapGL.Icon(require('@/assets/images/end.png'), new BMapGL.Size(48, 48)) |
| | | var endMark = new BMapGL.Marker(that.showPoints[that.showPoints.length - 1], { |
| | | icon: endIcon, |
| | | offset: new BMapGL.Size(0, -20) |
| | | var startIcon = new BMapGL.Icon( |
| | | require('@/assets/images/start.png'), |
| | | new BMapGL.Size(48, 48) |
| | | ) |
| | | var startMark = new BMapGL.Marker(that.showPoints[0], { |
| | | icon: startIcon, |
| | | offset: new BMapGL.Size(0, -20), |
| | | }) |
| | | that.map.addOverlay(startMark) |
| | | var endIcon = new BMapGL.Icon( |
| | | require('@/assets/images/end.png'), |
| | | new BMapGL.Size(48, 48) |
| | | ) |
| | | var endMark = new BMapGL.Marker( |
| | | that.showPoints[that.showPoints.length - 1], |
| | | { |
| | | icon: endIcon, |
| | | offset: new BMapGL.Size(0, -20), |
| | | } |
| | | ) |
| | | that.map.addOverlay(endMark) |
| | | } |
| | | |
| | |
| | | function drawLine() { |
| | | var data = [] |
| | | var points = [] |
| | | $.each(trackPoints, function(index, value) { |
| | | $.each(trackPoints, function (index, value) { |
| | | var point = [] |
| | | point.push(value['lng'],value['lat']) |
| | | point.push(value['lng'], value['lat']) |
| | | points.push(point) |
| | | }) |
| | | data.push({ |
| | | geometry: { |
| | | type: '"LineString"', |
| | | coordinates: [points] |
| | | } |
| | | coordinates: [points], |
| | | }, |
| | | }) |
| | | var lineLayer = new mapvgl.LineLayer({ |
| | | color: 'red', |
| | | width: 3, |
| | | width: 3, |
| | | animation: true, |
| | | duration: 10, // 循环时间2s |
| | | trailLength: 0.1, // 拖尾长度占间隔的0.4 |
| | | interval: 0.3 // 粒子长度占线整体长度的0.2 |
| | | interval: 0.3, // 粒子长度占线整体长度的0.2 |
| | | }) |
| | | that.view.addLayer(lineLayer) |
| | | lineLayer.setData(data) |
| | |
| | | points.push(point1) |
| | | } |
| | | } |
| | | |
| | | return points |
| | | } |
| | | |
| | |
| | | // 将距离转换成经度的计算公式 |
| | | var ra = distance / EARTH_RADIUS |
| | | // 转换为radian,否则结果会不正确 |
| | | angle = angle / 180 * Math.PI |
| | | lng = lng / 180 * Math.PI |
| | | lat = lat / 180 * Math.PI |
| | | lng = lng + Math.atan2(Math.sin(angle) * Math.sin(ra) * Math.cos(lat), Math.cos(ra) - Math.sin(lat) * Math.sin(lat)) |
| | | lat = Math.asin(Math.sin(lat) * Math.cos(ra) + Math.cos(lat) * Math.sin(ra) * Math.cos(angle)) |
| | | angle = (angle / 180) * Math.PI |
| | | lng = (lng / 180) * Math.PI |
| | | lat = (lat / 180) * Math.PI |
| | | lng = |
| | | lng + |
| | | Math.atan2( |
| | | Math.sin(angle) * Math.sin(ra) * Math.cos(lat), |
| | | Math.cos(ra) - Math.sin(lat) * Math.sin(lat) |
| | | ) |
| | | lat = Math.asin( |
| | | Math.sin(lat) * Math.cos(ra) + |
| | | Math.cos(lat) * Math.sin(ra) * Math.cos(angle) |
| | | ) |
| | | // 转为正常的10进制经纬度 |
| | | lng = lng * 180 / Math.PI |
| | | lat = lat * 180 / Math.PI |
| | | lng = (lng * 180) / Math.PI |
| | | lat = (lat * 180) / Math.PI |
| | | console.log(lng, lat) |
| | | return new BMapGL.Point(lng, lat) |
| | | } |
| | | |
| | |
| | | level5.color = '#99004c' |
| | | level6.color = '#7e0023' |
| | | |
| | | $.each(that.showPoints, function(index, value) { |
| | | $.each(that.showPoints, function (index, value) { |
| | | var sw = getPoint(225, value.lng, value.lat, that.distance) |
| | | var ne = getPoint(45, value.lng, value.lat, that.distance) |
| | | var polygon = [] |
| | |
| | | data0.push({ |
| | | geometry: { |
| | | type: 'Polygon', |
| | | coordinates: [polygon] |
| | | coordinates: [polygon], |
| | | }, |
| | | properties: { |
| | | height: height |
| | | } |
| | | height: height, |
| | | }, |
| | | }) |
| | | break |
| | | case 1: |
| | | data1.push({ |
| | | geometry: { |
| | | type: 'Polygon', |
| | | coordinates: [polygon] |
| | | coordinates: [polygon], |
| | | }, |
| | | properties: { |
| | | height: height |
| | | } |
| | | height: height, |
| | | }, |
| | | }) |
| | | break |
| | | case 2: |
| | | data2.push({ |
| | | geometry: { |
| | | type: 'Polygon', |
| | | coordinates: [polygon] |
| | | coordinates: [polygon], |
| | | }, |
| | | properties: { |
| | | height: height |
| | | } |
| | | height: height, |
| | | }, |
| | | }) |
| | | break |
| | | case 3: |
| | | data3.push({ |
| | | geometry: { |
| | | type: 'Polygon', |
| | | coordinates: [polygon] |
| | | coordinates: [polygon], |
| | | }, |
| | | properties: { |
| | | height: height |
| | | } |
| | | height: height, |
| | | }, |
| | | }) |
| | | break |
| | | case 4: |
| | | data4.push({ |
| | | geometry: { |
| | | type: 'Polygon', |
| | | coordinates: [polygon] |
| | | coordinates: [polygon], |
| | | }, |
| | | properties: { |
| | | height: height |
| | | } |
| | | height: height, |
| | | }, |
| | | }) |
| | | break |
| | | case 5: |
| | | data5.push({ |
| | | geometry: { |
| | | type: 'Polygon', |
| | | coordinates: [polygon] |
| | | coordinates: [polygon], |
| | | }, |
| | | properties: { |
| | | height: height |
| | | } |
| | | height: height, |
| | | }, |
| | | }) |
| | | break |
| | | case 6: |
| | | data6.push({ |
| | | geometry: { |
| | | type: 'Polygon', |
| | | coordinates: [polygon] |
| | | coordinates: [polygon], |
| | | }, |
| | | properties: { |
| | | height: height |
| | | } |
| | | height: height, |
| | | }, |
| | | }) |
| | | break |
| | | } |
| | |
| | | |
| | | // point上添加label文本 |
| | | function setLabelStyle(content, point) { |
| | | var label = new BMapGL.Label("<span class='my-maptip'>" + content + '<br /><span>', // 为lable填写内容 |
| | | |
| | | var label = new BMapGL.Label( |
| | | "<span class='my-maptip'>" + content + '<br /><span>', // 为lable填写内容 |
| | | { |
| | | offset: new BMapGL.Size(-8, -10), // label的偏移量,为了让label的中心显示在点上 |
| | | position: point |
| | | position: point, |
| | | } |
| | | )// label的位置 |
| | | |
| | | ) // label的位置 |
| | | var offsetSize = new BMapGL.Size(0, 0) |
| | | var size = '10px' |
| | | if (that.map.getZoom() <= 15.5) { |
| | |
| | | lineHeight: '20px', |
| | | fontFamily: '微软雅黑', |
| | | backgroundColor: '0.05', |
| | | fontWeight: 'bold' |
| | | } |
| | | fontWeight: 'bold', |
| | | } |
| | | label.setStyle(labelStyle) |
| | | that.map.addOverlay(label) |
| | | } |
| | |
| | | // 无数据时,缩放至该中心 |
| | | function showNoPoints() { |
| | | that.map.centerAndZoom('昆山市', 17) |
| | | setTimeout(function() { |
| | | setTimeout(function () { |
| | | document.getElementById('cpm').style.display = 'block' |
| | | document.getElementById('data').style.display = 'none' |
| | | }, 250) |
| | | } |
| | | |
| | | // 地图缩放级别监控 |
| | | that.map.addEventListener('zoomend', function() { |
| | | that.map.addEventListener('zoomend', function () { |
| | | // 这里根据缩放显示和隐藏文本 |
| | | var zoom = that.map.getZoom() |
| | | $('span.my-maptip').parent()[zoom <= 15.5 ? 'hide' : 'show']() |
| | | $('span.my-maptip').parent().css('font-size', 30 - zoom) |
| | | $('span.my-maptip') |
| | | .parent() |
| | | .css('font-size', 30 - zoom) |
| | | }) |
| | | |
| | | // var that = this |
| | |
| | | this.changeColor = index |
| | | // var pr = '' |
| | | switch (index) { |
| | | case 0: this.sensorKey = 'a34004' |
| | | case 0: |
| | | this.sensorKey = 'a34004' |
| | | // this.bg = require('@/assets/images/tl_PM10.png') |
| | | break |
| | | case 1: this.sensorKey = 'a34002' |
| | | case 1: |
| | | this.sensorKey = 'a34002' |
| | | // this.bg = require('@/assets/images/tl_PM2.5.png') |
| | | break |
| | | case 2: this.sensorKey = 'a21026' |
| | | case 2: |
| | | this.sensorKey = 'a21026' |
| | | // this.bg = require('@/assets/images/tl_SO2.png') |
| | | break |
| | | case 3: this.sensorKey = 'a21004' |
| | | case 3: |
| | | this.sensorKey = 'a21004' |
| | | // this.bg = require('@/assets/images/tl_NO2.png') |
| | | break |
| | | case 4: this.sensorKey = 'a21005' |
| | | case 4: |
| | | this.sensorKey = 'a21005' |
| | | // this.bg = require('@/assets/images/tl_CO.png') |
| | | break |
| | | case 5: this.sensorKey = 'a05024' |
| | | case 5: |
| | | this.sensorKey = 'a05024' |
| | | // this.bg = require('@/assets/images/tl_O3.png') |
| | | break |
| | | case 6: this.sensorKey = 'a99054' |
| | | case 6: |
| | | this.sensorKey = 'a99054' |
| | | // this.bg = require('@/assets/images/tl_TVOCNew.png') |
| | | break |
| | | case 7: this.sensorKey = 'dustld' |
| | | case 7: |
| | | this.sensorKey = 'dustld' |
| | | // this.bg = require('@/assets/images/tl_TVOCNew.png') |
| | | break |
| | | } |
| | |
| | | this.viewKey = '3D' |
| | | } |
| | | this.getStart() |
| | | } |
| | | } |
| | | }, |
| | | }, |
| | | } |
| | | </script> |
| | | <style lang="less" scoped> |
| | | body, |
| | | html, |
| | | #map_container { |
| | | width: 100%; |
| | | height: 100%; |
| | | overflow: hidden; |
| | | margin: 0; |
| | | z-index: 0; |
| | | font-size: 14px; |
| | | font-family: "微软雅黑"; |
| | | width: 100%; |
| | | height: 100%; |
| | | overflow: hidden; |
| | | margin: 0; |
| | | z-index: 0; |
| | | font-size: 14px; |
| | | font-family: '微软雅黑'; |
| | | } |
| | | |
| | | .main_body { |
| | | border: 0; |
| | | margin: 0; |
| | | width: 100%; |
| | | height: 100%; |
| | | position: relative; |
| | | border: 0; |
| | | margin: 0; |
| | | width: 100%; |
| | | height: 100%; |
| | | position: relative; |
| | | } |
| | | |
| | | #cpm { |
| | | width: 300px; |
| | | height: 100px; |
| | | position: absolute; |
| | | background-color: #ffffff; |
| | | display: none; |
| | | left: 50%; |
| | | top: 50%; |
| | | margin-left: -150px; |
| | | margin-top: -50px; |
| | | z-index: 11; |
| | | color: #000000; |
| | | border: 2px solid #FF7F50; |
| | | font-size: 28px; |
| | | line-height: 100px; |
| | | text-align: center; |
| | | width: 300px; |
| | | height: 100px; |
| | | position: absolute; |
| | | background-color: #ffffff; |
| | | display: none; |
| | | left: 50%; |
| | | top: 50%; |
| | | margin-left: -150px; |
| | | margin-top: -50px; |
| | | z-index: 11; |
| | | color: #000000; |
| | | border: 2px solid #ff7f50; |
| | | font-size: 28px; |
| | | line-height: 100px; |
| | | text-align: center; |
| | | } |
| | | |
| | | .BMap_pop > img { |
| | | top: 42px !important; |
| | | margin-left: -10px; |
| | | top: 42px !important; |
| | | margin-left: -10px; |
| | | } |
| | | |
| | | .BMap_pop div:nth-child(1) div { |
| | | display: none; |
| | | display: none; |
| | | } |
| | | |
| | | .BMap_pop div:nth-child(3) { |
| | | display: none; |
| | | display: none; |
| | | } |
| | | |
| | | .BMap_pop div:nth-child(5) { |
| | | display: none; |
| | | display: none; |
| | | } |
| | | |
| | | .BMap_pop div:nth-child(7) { |
| | | display: none; |
| | | display: none; |
| | | } |
| | | |
| | | .BMap_pop div:nth-child(9) { |
| | | top: 35px !important; |
| | | border-radius: 5px; |
| | | top: 35px !important; |
| | | border-radius: 5px; |
| | | } |
| | | |
| | | #selectSenor { |
| | | position: absolute; |
| | | z-index: 1; |
| | | left: 30px; |
| | | top: 20px; |
| | | font-size: 20px; |
| | | background: lightgrey; |
| | | position: absolute; |
| | | z-index: 1; |
| | | left: 30px; |
| | | top: 20px; |
| | | font-size: 20px; |
| | | background: lightgrey; |
| | | } |
| | | |
| | | #type { |
| | | position: absolute; |
| | | z-index: 1; |
| | | left: 30px; |
| | | top: 50px; |
| | | font-size: 20px; |
| | | background: lightgrey; |
| | | position: absolute; |
| | | z-index: 1; |
| | | left: 30px; |
| | | top: 50px; |
| | | font-size: 20px; |
| | | background: lightgrey; |
| | | } |
| | | |
| | | button { |
| | | font-size: 15px; |
| | | font-size: 15px; |
| | | } |
| | | |
| | | .sensorLevel { |
| | | position: absolute; |
| | | z-index: 1; |
| | | bottom: 50px; |
| | | left: 10px; |
| | | width: 100px; |
| | | height: 200px; |
| | | position: absolute; |
| | | z-index: 1; |
| | | bottom: 50px; |
| | | left: 10px; |
| | | width: 100px; |
| | | height: 200px; |
| | | } |
| | | .carTop { |
| | | position: absolute; |
| | |
| | | background: rgba(204, 204, 204, 0.5); |
| | | box-shadow: 1px 1px 5px #666; |
| | | } |
| | | .carTop > .left,.right { |
| | | .carTop > .left, |
| | | .right { |
| | | padding: 5px 10px; |
| | | border: 1px solid #aaa; |
| | | border-right: none; |
| | |
| | | margin-top: 4px; |
| | | -webkit-transform-origin-x: 0; |
| | | } |
| | | .carTop .left:nth-child(1),.carTop .right:nth-child(1) { |
| | | .carTop .left:nth-child(1), |
| | | .carTop .right:nth-child(1) { |
| | | border-radius: 5px 0 0 5px; |
| | | } |
| | | .carTop .left:nth-last-child(2),.carTop .right:nth-child(2) { |
| | | .carTop .left:nth-last-child(2), |
| | | .carTop .right:nth-child(2) { |
| | | border-radius: 0 5px 5px 0; |
| | | border-right: 1px solid #aaa; |
| | | } |
| | | .carTop{ |
| | | &>.left:nth-child(1){ |
| | | border-radius: 5px 0 0 5px; |
| | | } |
| | | .carTop { |
| | | & > .left:nth-child(1) { |
| | | border-radius: 5px 0 0 5px; |
| | | } |
| | | } |
| | | .carTop { |
| | | .left{ |
| | | &:nth-last-child(2){ |
| | | .left { |
| | | &:nth-last-child(2) { |
| | | margin-left: -12px !important; |
| | | } |
| | | } |
| | | } |
| | | .carTop > .left:hover,.right:hover { |
| | | .carTop > .left:hover, |
| | | .right:hover { |
| | | background: rgb(64, 158, 255); |
| | | color: #fff; |
| | | } |
| | |
| | | font-size: 28px; |
| | | border: 2px solid #ff7f50; |
| | | } |
| | | .main_body .el-date-editor .el-range-input{ |
| | | .main_body .el-date-editor .el-range-input { |
| | | width: 30%; |
| | | } |
| | | .main_body /deep/ .el-date-editor .el-range-separator{ |
| | | .main_body /deep/ .el-date-editor .el-range-separator { |
| | | width: 15%; |
| | | } |
| | | </style> |
| | | |