Newer
Older
cockpit_hxrq_front / src / views / maps / mapOverview.vue
StephanieGitHub on 6 Apr 2021 11 KB first commit
<template>
  <div id="centerDiv" class="mapcontainer">
    <!--时钟-->
    <clock/>
    <!--天气-->
    <weather/>
    <!--选择区-->
    <select-all/>
    <!--统计结果显示-->
    <div class="label-div">
      <div class="label">
        全省高后果区
      </div>
      <div class="value">
        77
      </div>
    </div>

    <!--地图-->
    <Map :url="configUrl" @onload="onMapload" />
    <!--遮罩-->
    <div class="mask">航天二院203所</div>
  </div>
</template>

<script>
import Map from '@/components/Map/MarsMap.vue'
import 'mars3d-heatmap'
import axios from 'axios'
import Weather from '@/components/weather/weather'
import Clock from '@/components/clock/Clock'
import SelectAll from './components/selectAll'
export default {
  name: 'Index',
  components: {
    SelectAll,
    Weather,
    Clock,
    Map
  },

  data() {
    return {
      map: null, // 地图
      configUrl: 'static/config/config.json',
      alpha: 100, // 透明度
      underground: null, // ?
      manageStations: [
        { 'x': 112.73874, 'y': 37.693689, 'z': 0, 'name': '晋中管理处' },
        { 'x': 111.121552, 'y': 37.5245, 'z': 0, 'name': '吕梁管理处' },
        { 'x': 112.929902, 'y': 39.622888, 'z': 0, 'name': '同朔管理处' },
        { 'x': 112.72496, 'y': 38.415485, 'z': 0, 'name': '忻州管理处' },
        { 'x': 113.58249, 'y': 37.851892, 'z': 0, 'name': '阳泉管理处' },
        { 'x': 110.980927, 'y': 35.010828, 'z': 0, 'name': '运城管理处' },
        { 'x': 113.038394, 'y': 35.850111, 'z': 0, 'name': '长晋管理处' },
        { 'x': 111.491467, 'y': 36.064572, 'z': 0, 'name': '临汾管理处' }
      ],
      highSequence: [
        { x: 112.73874, y: 37.693689, id: 0, name: '晋中管理处', count: 158 },
        { x: 111.121552, y: 37.5245, id: 0, name: '吕梁管理处', count: 10 },
        { x: 112.929902, y: 39.622888, id: 0, name: '同朔管理处', count: 44 },
        { x: 112.72496, y: 38.415485, id: 0, name: '忻州管理处', count: 9 },
        { x: 113.58249, y: 37.851892, id: 0, name: '阳泉管理处', count: 21 },
        { x: 110.980927, y: 35.010828, id: 0, name: '运城管理处', count: 21 },
        { x: 113.038394, y: 35.850111, id: 0, name: '长晋管理处', count: 11 },
        { x: 111.491467, y: 36.064572, id: 0, name: '临汾管理处', count: 30 }
      ],
      stationLayer: null, // 管理站图层
      hqaLayer: null // 高后果区热力图
    }
  },

  methods: {
    // 地图构造完成回调
    onMapload(map) {
      // 以下为演示代码
      this.map = map
      // 背景透明
      this.map._viewer.scene.backgroundColor = new this.Cesium.Color(0.0, 0.0, 0.0, 0.0)
      this.map._viewer.scene.globe.baseColor.alpha = 0
      // this.addPipe()
      // 创建entity图层
      const graphicLayer = new this.mars3d.layer.GraphicLayer()
      map.addLayer(graphicLayer)
      this.addHighConsequenceArea()
      // 添加管理处
      this.addStation(graphicLayer)

      // this.addLine()
      // this.addProvinceWall(graphicLayer)
      // this.addProvinceLine(graphicLayer)
      // 开启炫光
      // var bloomEffect = new this.mars3d.effect.BloomEffect()
      // map.addEffect(bloomEffect)
      // this.addGraphic_05(graphicLayer)
    },
    // 高后果区热力图
    addHighConsequenceArea() {
      const { mars3d } = this
      const hqaLayer = new mars3d.layer.HeatLayer({
        positions: this.highSequence.map(item => {
          return { lng: item.x, lat: item.y, value: item.count }
        }),
        heatStyle: {
          radius: 50, // 半径
          blur: 0.85 // 模糊因子
        },
        // 以下为矩形矢量对象的样式参数
        style: {
          opacity: 1.0,
          clampToGround: true
        },
        redrawZoom: true,
        flyTo: false
      })
      this.hqaLayer = hqaLayer
      this.map.addLayer(hqaLayer)
    },
    // 管理处
    addStation(graphicLayer) {
      const { mars3d } = this
      const stationLayer = new mars3d.layer.ModelLayer({
        name: '管理处',
        url: './static/gltf/house02.gltf',
        // url: './static/gltf/qwe.gltf',
        style: {
          scale: 10,
          heading: 0,
          minimumPixelSize: 30,
          clampToGround: true
        },
        positions: this.manageStations.map(item => {
          return { lng: item.x, lat: item.y, alt: item.z }
        })
      })
      this.stationLayer = stationLayer
      this.map.addLayer(stationLayer)

      // for (const station of this.manageStations) {
      //   console.log(station.name)
      //   var primitive = new mars3d.graphic.ModelPrimitive({
      //     position: [station.x, station.y, station.z],
      //     style: {
      //       url: './static/gltf/house02.gltf',
      //       scale: 10, // 比例
      //       minimumPixelSize: 50, // 最近像素大小,不考虑缩放
      //       heading: 0,
      //       label: {
      //         text: station.name,
      //         font_size: 18,
      //         color: '#ffffff',
      //         pixelOffsetY: -50,
      //         distanceDisplayCondition: true,
      //         distanceDisplayCondition_far: 500000,
      //         distanceDisplayCondition_near: 0
      //       }
      //     }
      //   })
      //   graphicLayer.addGraphic(primitive)
      // }
    },

    addProvinceWall(graphicLayer) {
      const { mars3d, Cesium } = this
      axios.get('static/geojson/140000_single.json').then((res) => {
        if (res.status === 200) {
          const feature = res.data.features[0]
          var coordinates = feature.geometry.coordinates[0]
          debugger
          var graphic = new mars3d.graphic.WallEntity({
            positions: coordinates,
            style: {
              diffHeight: 2000,
              // color: '#bdf700',
              // opacity: 0.6
              material: new mars3d.material.LineFlowMaterialProperty({
                image: './static/images/map/fence.png',
                color: Cesium.Color.fromCssColorString('#bdf700'),
                repeat: new Cesium.Cartesian2(5, 1),
                axisY: true, // 方向,true时上下,false左右
                speed: 10 // 速度,建议取值范围1-100
              })
            }
          })
          graphicLayer.addGraphic(graphic)
        }
      })
    },
    addProvinceLine(graphicLayer) {
      const { mars3d, Cesium } = this
      axios.get('static/geojson/140000_single.json').then((res) => {
        if (res.status === 200) {
          const feature = res.data.features[0]
          const _color1 = Cesium.Color.fromCssColorString('#1fe1ff').withAlpha(0.2)
          const _color2 = Cesium.Color.fromCssColorString('#1fe1ff').withAlpha(0.9)
          let _color = _color1
          setInterval(function() {
            _color = _color === _color1 ? _color2 : _color1
          }, 500)
          var coordinates = feature.geometry.coordinates[0]
          const graphic = new mars3d.graphic.PolylineEntity({
            positions: coordinates,
            style: {
              width: 5,
              material: new Cesium.ColorMaterialProperty(
                new Cesium.CallbackProperty(function(time) {
                  return _color
                }, false)
              )
            }
          })
          graphicLayer.addGraphic(graphic)
        }
      })
    },
    // 自定义的弹窗
    addGraphic_05(graphicLayer) {
      const { Cesium, mars3d } = this
      var graphic = new mars3d.graphic.DivGraphic({
        position: Cesium.Cartesian3.fromDegrees(111.031145, 36.948563, -2100),
        style: {
          html: `<div class="divpoint divpoint-theme-29baf1">
                    <div class="divpoint-wrap">
                        <div class="area">
                            <div class="arrow-lt"></div>
                            <div class="b-t"></div>
                            <div class="b-r"></div>
                            <div class="b-b"></div>
                            <div class="b-l"></div>
                            <div class="arrow-rb"></div>
                            <div class="label-wrap">
                                <div class="title">燃气管线</div>
                                <div class="label-content">
                                    <div class="data-li">
                                        <div class="data-label">管径:</div>
                                        <div class="data-value"><span class="label-num">1200</span><span class="label-unit">mm</span>
                                        </div>
                                    </div>
                                    <div class="data-li">
                                        <div class="data-label">材质:</div>
                                        <div class="data-value"><span class="label-num">3pe</span>
                                        </div>
                                    </div>
                                    <div class="data-li">
                                        <div class="data-label">压力等级:</div>
                                        <div class="data-value"><span class="label-num">中</span>
                                        </div>
                                    </div>
                                    <div class="data-li">
                                        <div class="data-label">铺设年代:</div>
                                        <div class="data-value"><span class="label-num">2000</span><span class="label-unit">年</span>
                                        </div>
                                    </div>

                                    <!--<div class="data-li">-->
              <!--<div class="data-label">出水阀门:</div>-->
              <!--<div class="data-value"><span class="label-tag data-value-status-1" alt="中间状态">1号</span><span-->
              <!--class="label-tag data-value-status-2" alt="打开状态">2号</span></div>-->
              <!--</div>-->
              </div>
              </div>
              </div>
              <div class="b-t-l"></div>
              <div class="b-b-r"></div>
              </div>
              <div class="arrow" ></div>
              </div>`,
          // anchor: [0, 0],
          horizontalOrigin: Cesium.HorizontalOrigin.LEFT,
          verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
          distanceDisplayCondition: new Cesium.DistanceDisplayCondition(1000, 200000), // 按视距距离显示
          scaleByDistance: new Cesium.NearFarScalar(10000, 1.0, 100000, 0.1),
          heightReference: Cesium.HeightReference.CLAMP_TO_GROUND
        },
        pointerEvents: false // false时不允许拾取和触发任意鼠标事件,但可以穿透div缩放地球
      })
      graphicLayer.addGraphic(graphic)
      graphic.testPoint = true // 打开测试点,与DIV点进行对比位置调整css
    }
  }
}
</script>

<style rel="stylesheet/scss" lang="scss" scoped>
  .label-div{
    position: absolute;
    top: 6rem;
    left:30rem;
    z-index:100;
    color: white;
    .label{
      margin-bottom: 1rem;
      font-size:1.5rem;
    }
    .value{
      font-family: DS-DigitalBold;
      font-size:3rem;
    }
  }
</style>

<style rel="stylesheet/scss" lang="scss">
  /*整个容器*/
  .mapcontainer {
    position: relative;
    height: 100%;
    width: 100%;
    /*background-color: transparent;*/
    background-color: #051151;
  }
  /*logo遮罩*/
  .mask{
    position: fixed;
    padding-left:10px;
    padding-right:10px;
    bottom:0px;
    left:0px;
    background-color:#000000;
    color:#ffffff;
    line-height:2
  }

</style>