| 
		 After Width: | Height: | Size: 14 KiB  | 
| 
		 After Width: | Height: | Size: 15 KiB  | 
| 
		 After Width: | Height: | Size: 14 KiB  | 
| 
		 After Width: | Height: | Size: 5.0 KiB  | 
| 
		 After Width: | Height: | Size: 14 KiB  | 
| 
		 After Width: | Height: | Size: 14 KiB  | 
| 
		 After Width: | Height: | Size: 205 B  | 
| 
		 After Width: | Height: | Size: 14 KiB  | 
| 
		 After Width: | Height: | Size: 16 KiB  | 
@ -0,0 +1,161 @@ | 
				
			|||
.warning-box { | 
				
			|||
  box-sizing: border-box; | 
				
			|||
  width: 1881px; | 
				
			|||
  height: 914px; | 
				
			|||
  margin: auto; | 
				
			|||
  color: #fff; | 
				
			|||
  background: url('../../../img/modules/visual/warning-box.png') no-repeat center; | 
				
			|||
  background-size: 100% 100%; | 
				
			|||
  padding: 45px 21px 35px 24px; | 
				
			|||
 | 
				
			|||
  &-top { | 
				
			|||
    display: flex; | 
				
			|||
    justify-content: space-around; | 
				
			|||
    height: 190px; | 
				
			|||
 | 
				
			|||
    .top-item { | 
				
			|||
      box-sizing: border-box; | 
				
			|||
      width: 280px; | 
				
			|||
      height: 190px; | 
				
			|||
      padding: 10px 22px 14px 21px; | 
				
			|||
      // background: rgba(255, 255, 255, 0); | 
				
			|||
      border: 1px solid #1043C0; | 
				
			|||
      box-shadow: 0px 83px 150px 0px #002790; | 
				
			|||
      border-radius: 8px; | 
				
			|||
 | 
				
			|||
      &-img { | 
				
			|||
        display: flex; | 
				
			|||
        align-items: center; | 
				
			|||
 | 
				
			|||
        img { | 
				
			|||
          width: 78px; | 
				
			|||
          height: 78px; | 
				
			|||
          margin-right: 16px; | 
				
			|||
        } | 
				
			|||
 | 
				
			|||
        .top-item-left { | 
				
			|||
          display: flex; | 
				
			|||
          flex-direction: column; | 
				
			|||
 | 
				
			|||
          span { | 
				
			|||
            display: inline-block; | 
				
			|||
          } | 
				
			|||
 | 
				
			|||
          span:nth-child(1) { | 
				
			|||
            font-size: 18px; | 
				
			|||
            font-weight: 400; | 
				
			|||
            color: #FFFFFF; | 
				
			|||
          } | 
				
			|||
 | 
				
			|||
          span:nth-child(2) { | 
				
			|||
            font-size: 28px; | 
				
			|||
            font-weight: bold; | 
				
			|||
            color: #00FFFC; | 
				
			|||
            margin-top: 10px; | 
				
			|||
          } | 
				
			|||
        } | 
				
			|||
      } | 
				
			|||
 | 
				
			|||
      &-num { | 
				
			|||
        width: 100%; | 
				
			|||
        display: flex; | 
				
			|||
        position: relative; | 
				
			|||
        flex-direction: column; | 
				
			|||
        align-items: space-between; | 
				
			|||
        // border: 1px solid red; | 
				
			|||
 | 
				
			|||
        .num-item { | 
				
			|||
          position: relative; | 
				
			|||
          width: 100%; | 
				
			|||
          height: 35px; | 
				
			|||
          display: flex; | 
				
			|||
          border-radius: 4px; | 
				
			|||
          align-items: center; | 
				
			|||
          justify-content: space-between; | 
				
			|||
          padding: 0 10px 0 29px; | 
				
			|||
 | 
				
			|||
          &::after { | 
				
			|||
            display: block; | 
				
			|||
            content: ''; | 
				
			|||
            width: 8px; | 
				
			|||
            height: 8px; | 
				
			|||
            background: #F0F3F7; | 
				
			|||
            border-radius: 50%; | 
				
			|||
            position: absolute; | 
				
			|||
            left: 12px; | 
				
			|||
            top: 50%; | 
				
			|||
            transform: translate(0, -50%); | 
				
			|||
          } | 
				
			|||
 | 
				
			|||
          div:nth-child(1) { | 
				
			|||
            font-size: 16px; | 
				
			|||
            font-family: PingFang SC; | 
				
			|||
            font-weight: 400; | 
				
			|||
            color: #FFFFFF; | 
				
			|||
          } | 
				
			|||
 | 
				
			|||
          div:nth-child(2) { | 
				
			|||
            // width: 70%; | 
				
			|||
            display: flex; | 
				
			|||
            font-size: 20px; | 
				
			|||
            font-family: PingFang SC; | 
				
			|||
            font-weight: 500; | 
				
			|||
            color: #FFFFFF; | 
				
			|||
 | 
				
			|||
            .right-icon { | 
				
			|||
              width: 10px; | 
				
			|||
              height: 14px; | 
				
			|||
            } | 
				
			|||
          } | 
				
			|||
        } | 
				
			|||
 | 
				
			|||
        .num-item-active { | 
				
			|||
          background: linear-gradient(0deg, #1A5AFD, #26C4FF); | 
				
			|||
        } | 
				
			|||
 | 
				
			|||
        .num-item:nth-child(2) { | 
				
			|||
          margin-top: 10px; | 
				
			|||
        } | 
				
			|||
      } | 
				
			|||
    } | 
				
			|||
 | 
				
			|||
 | 
				
			|||
  } | 
				
			|||
 | 
				
			|||
  &-bottom { | 
				
			|||
    box-sizing: border-box; | 
				
			|||
    width: 100%; | 
				
			|||
    height: calc(100% - 300px); | 
				
			|||
    margin-top: 60px; | 
				
			|||
 | 
				
			|||
 | 
				
			|||
    .pagination { | 
				
			|||
      box-sizing: border-box; | 
				
			|||
      margin-top: 20px; | 
				
			|||
      width: 100%; | 
				
			|||
      height: 40px; | 
				
			|||
      display: flex; | 
				
			|||
      justify-content: flex-end; | 
				
			|||
 | 
				
			|||
      /deep/ .el-pagination.is-background .el-pager li:not(.disabled).active { | 
				
			|||
        background: #0266D1; | 
				
			|||
        color: #000D3F; | 
				
			|||
      } | 
				
			|||
 | 
				
			|||
      /deep/ .el-pagination .el-pager li { | 
				
			|||
        background: #002E74; | 
				
			|||
      } | 
				
			|||
 | 
				
			|||
      /deep/ .el-pagination .btn-prev { | 
				
			|||
        background: #002E74; | 
				
			|||
      } | 
				
			|||
 | 
				
			|||
      /deep/ .el-pagination .btn-next { | 
				
			|||
        background: #002E74; | 
				
			|||
      } | 
				
			|||
    } | 
				
			|||
  } | 
				
			|||
 | 
				
			|||
 | 
				
			|||
 | 
				
			|||
} | 
				
			|||
@ -0,0 +1,237 @@ | 
				
			|||
<template> | 
				
			|||
  <div class="warning-table"> | 
				
			|||
      <div class="table"> | 
				
			|||
        <div class="table-header"> | 
				
			|||
          <div class="table-header-th" v-for="(item,index) in headerList" :key='item.title' :style="headerStyle[index]">{{item.title}}</div> | 
				
			|||
        </div> | 
				
			|||
        <div class="table-body"> | 
				
			|||
          <div class="table-body-tr" v-for="(value,index) in tableData" :key='index'> | 
				
			|||
            <div class="td" v-for="(item,indexs) in value" :key="indexs" :style="tableContentStyle[indexs]">{{item}} | 
				
			|||
              <span v-if="indexs+1==value.length" class="more" @click="onClickMorePop(index)" ref='morePop'> | 
				
			|||
                更多> | 
				
			|||
                <span class="more-pop" v-if="visiblePopList[index]"> | 
				
			|||
                  李佳琪、刘阳、赵欣、丁一、嘉敏、李岩、何嘉慧 | 
				
			|||
                  李易峰、赵敏、何军、曲树惠 | 
				
			|||
                </span> | 
				
			|||
              </span> | 
				
			|||
            </div> | 
				
			|||
          </div> | 
				
			|||
        </div> | 
				
			|||
      </div> | 
				
			|||
  </div> | 
				
			|||
</template> | 
				
			|||
 | 
				
			|||
<script> | 
				
			|||
import Vue from 'vue' | 
				
			|||
export default { | 
				
			|||
name: 'warning-table', | 
				
			|||
  props: { | 
				
			|||
    headerList: { | 
				
			|||
      type: Array, | 
				
			|||
      required: false, | 
				
			|||
      default: () => { | 
				
			|||
        return [ | 
				
			|||
          { title: '序号' }, | 
				
			|||
          { title: '所属网格'}, | 
				
			|||
          { title: '所属小区'}, | 
				
			|||
          { title: '楼号'}, | 
				
			|||
          { title: '姓名' }, | 
				
			|||
        ] | 
				
			|||
      } | 
				
			|||
    }, | 
				
			|||
    tableData: { | 
				
			|||
      type: Array, | 
				
			|||
      required: false, | 
				
			|||
      default: () => { | 
				
			|||
        return [ | 
				
			|||
        [1,'商丘路社区第一网格','商丘路小区','2号楼','杨颖、王平、刘佳敏、丁辉、杨萍'], | 
				
			|||
        [2,'商丘路社区第一网格','商丘路小区','2号楼','杨颖、王平、刘佳敏、丁辉、杨萍'], | 
				
			|||
        [3,'商丘路社区第一网格','商丘路小区','2号楼','杨颖、王平、刘佳敏、丁辉、杨萍'], | 
				
			|||
        [4,'商丘路社区第一网格','商丘路小区','2号楼','杨颖、王平、刘佳敏、丁辉、杨萍'], | 
				
			|||
        [5,'商丘路社区第一网格','商丘路小区','2号楼','杨颖、王平、刘佳敏、丁辉、杨萍'], | 
				
			|||
        [6,'商丘路社区第一网格','商丘路小区','2号楼','杨颖、王平、刘佳敏、丁辉、杨萍'], | 
				
			|||
        [7,'商丘路社区第一网格','商丘路小区','2号楼','杨颖、王平、刘佳敏、丁辉、杨萍'], | 
				
			|||
        [8,'商丘路社区第一网格','商丘路小区','2号楼','杨颖、王平、刘佳敏、丁辉、杨萍'], | 
				
			|||
        [9,'商丘路社区第一网格','商丘路小区','2号楼','杨颖、王平、刘佳敏、丁辉、杨萍'], | 
				
			|||
        [10,'商丘路社区第一网格','商丘路小区','2号楼','杨颖、王平、刘佳敏、丁辉、杨萍'], | 
				
			|||
     | 
				
			|||
        ] | 
				
			|||
      } | 
				
			|||
    }, | 
				
			|||
    // 单独给头部设置样式 | 
				
			|||
    headerStyle: { | 
				
			|||
      type: Array, | 
				
			|||
      default: () => { | 
				
			|||
        return [ | 
				
			|||
          // { | 
				
			|||
          //   width:'200px', | 
				
			|||
          //   border:'1px solid red' | 
				
			|||
          // }, | 
				
			|||
          // { | 
				
			|||
          //   width:'200px' | 
				
			|||
          // } | 
				
			|||
        ] | 
				
			|||
      } | 
				
			|||
    }, | 
				
			|||
  // 单独给内容设置样式 | 
				
			|||
    tableContentStyle: { | 
				
			|||
      type: Array, | 
				
			|||
      default: () => { | 
				
			|||
        return [ | 
				
			|||
          // { | 
				
			|||
          //   width:'200px', | 
				
			|||
          //   border:'1px solid red' | 
				
			|||
          // }, | 
				
			|||
          // { | 
				
			|||
          //   width:'200px' | 
				
			|||
          // } | 
				
			|||
        ] | 
				
			|||
      } | 
				
			|||
    }, | 
				
			|||
    // // 表格平均分的份数 | 
				
			|||
    // ava: { | 
				
			|||
    //   type: Number, | 
				
			|||
    //   default: 8 | 
				
			|||
    // }, | 
				
			|||
    // // 表头高度--默认占比10% | 
				
			|||
    // headerHeightAva: { | 
				
			|||
    //   type: String, | 
				
			|||
    //   default: '10%' | 
				
			|||
    // }, | 
				
			|||
    // // 表格主体平均分成的份数 | 
				
			|||
    // tableContentAva: { | 
				
			|||
    //   type: Number, | 
				
			|||
    //   default: 5 | 
				
			|||
    // }, | 
				
			|||
  }, | 
				
			|||
  data() { | 
				
			|||
    return { | 
				
			|||
      visiblePopList:[false,false,false,false,false,false,false,false,false,false], | 
				
			|||
    }; | 
				
			|||
  }, | 
				
			|||
mounted () { | 
				
			|||
    // window.addEventListener('click', e => { | 
				
			|||
    //   if (this.$refs.morePop && !this.$refs.morePop.contains(e.target)) { | 
				
			|||
    //      this.visiblePopList.forEach((item,indexs)=>{ | 
				
			|||
    //       Vue.set(this.visiblePopList, indexs, false) | 
				
			|||
    //     }) | 
				
			|||
    //   } | 
				
			|||
    // }) | 
				
			|||
  }, | 
				
			|||
  created(){ | 
				
			|||
  }, | 
				
			|||
  methods: { | 
				
			|||
      onClickMorePop(index) { | 
				
			|||
        this.visiblePopList.forEach((item,indexs)=>{ | 
				
			|||
          if(index==indexs){ | 
				
			|||
            Vue.set(this.visiblePopList, index, true) | 
				
			|||
              }else{ | 
				
			|||
            Vue.set(this.visiblePopList, indexs, false) | 
				
			|||
          } | 
				
			|||
        }) | 
				
			|||
      } | 
				
			|||
  }, | 
				
			|||
}; | 
				
			|||
</script> | 
				
			|||
<style lang="scss" scoped> | 
				
			|||
.warning-table{ | 
				
			|||
     box-sizing: border-box; | 
				
			|||
     width: 100%; | 
				
			|||
     height: 100%; | 
				
			|||
    .table { | 
				
			|||
      width: 100%; | 
				
			|||
      height: 100%; | 
				
			|||
      &-header { | 
				
			|||
        width: 100%; | 
				
			|||
        height: 50px; | 
				
			|||
        display: flex; | 
				
			|||
        justify-content: space-around; | 
				
			|||
        align-items: center; | 
				
			|||
        background: rgba(8, 37, 134, 0.85); | 
				
			|||
        font-size: 16px; | 
				
			|||
        font-weight: 400; | 
				
			|||
        color: #FFFFFF; | 
				
			|||
 | 
				
			|||
        &-th { | 
				
			|||
          text-align: center; | 
				
			|||
          width: calc(100% / 5); | 
				
			|||
        } | 
				
			|||
      } | 
				
			|||
 | 
				
			|||
      &-body { | 
				
			|||
        box-sizing: border-box; | 
				
			|||
        width: 100%; | 
				
			|||
        height: calc(100% - 50px); | 
				
			|||
        font-size: 18px; | 
				
			|||
        font-weight: 400; | 
				
			|||
        color: #FFFFFF; | 
				
			|||
 | 
				
			|||
        &-tr { | 
				
			|||
          width: 100%; | 
				
			|||
          // height: 50px; | 
				
			|||
          height: calc(100% / 10); | 
				
			|||
          display: flex; | 
				
			|||
          justify-content: space-around; | 
				
			|||
          align-items: center; | 
				
			|||
 | 
				
			|||
          .td { | 
				
			|||
            text-align: center; | 
				
			|||
            width: calc(100% / 5); | 
				
			|||
            .more { | 
				
			|||
              font-size: 18px; | 
				
			|||
              font-weight: 400; | 
				
			|||
              color: #E4DC00; | 
				
			|||
              position: relative; | 
				
			|||
               | 
				
			|||
              &-pop{ | 
				
			|||
                box-sizing: border-box; | 
				
			|||
                display: block; | 
				
			|||
                box-sizing: border-box; | 
				
			|||
                width: 215px; | 
				
			|||
                height: auto; | 
				
			|||
                line-height: 20px; | 
				
			|||
                border: 1px solid red; | 
				
			|||
                position: absolute; | 
				
			|||
                left: -100%; | 
				
			|||
                top: 150%; | 
				
			|||
                background: #06186D; | 
				
			|||
                border: 1px solid #1A64CC; | 
				
			|||
                border-radius: 5px; | 
				
			|||
                font-size: 9px; | 
				
			|||
                font-weight: 400; | 
				
			|||
                color: #FFFFFF; | 
				
			|||
                padding:16px 8px 10px 9px; | 
				
			|||
                z-index: 1; | 
				
			|||
                &::after{ | 
				
			|||
                  position: absolute; | 
				
			|||
                  left: 30%; | 
				
			|||
                  top: -30%; | 
				
			|||
                  display: flex; | 
				
			|||
                  content:''; | 
				
			|||
                  width: 0; | 
				
			|||
                  height: 0; | 
				
			|||
                  border-width: 13px; | 
				
			|||
                  border-style: solid; | 
				
			|||
                  border-color: transparent transparent rgba(26, 100, 204,0.5) transparent; | 
				
			|||
                  // border-color: transparent transparent red transparent; | 
				
			|||
                  transform: translate(-50%,0); | 
				
			|||
                } | 
				
			|||
              } | 
				
			|||
           | 
				
			|||
            } | 
				
			|||
          } | 
				
			|||
        } | 
				
			|||
 | 
				
			|||
        &-tr:nth-child(2n) { | 
				
			|||
          background: rgba(16, 75, 164, 0.24); | 
				
			|||
        } | 
				
			|||
 | 
				
			|||
        &-tr:hover { | 
				
			|||
          background: url('../../../../../../assets/img/modules/visual/hover-bac.png') no-repeat center; | 
				
			|||
          background-size: 100% 100%; | 
				
			|||
        } | 
				
			|||
      } | 
				
			|||
 | 
				
			|||
    } | 
				
			|||
} | 
				
			|||
</style> | 
				
			|||
@ -1,525 +1,83 @@ | 
				
			|||
<template> | 
				
			|||
  <div calss="div_main" | 
				
			|||
       style="position: relative"> | 
				
			|||
 | 
				
			|||
    <!-- 组织路由 --> | 
				
			|||
    <div> | 
				
			|||
      <div class="router_line"></div> | 
				
			|||
      <div class="div_router"> | 
				
			|||
        <span class="router_parents" | 
				
			|||
              v-for="(item,index) in runAgency" | 
				
			|||
              :key="index">{{item.name}}<span class="arrow">></span></span> | 
				
			|||
 | 
				
			|||
        <span class="router_child">{{orgData.name}}</span> | 
				
			|||
  <div class="warning-box"> | 
				
			|||
    <div class="warning-box-top"> | 
				
			|||
      <div class="top-item" v-for="item in [1, 2, 3, 4, 5, 6]" :key="item"> | 
				
			|||
        <div class="top-item-img"> | 
				
			|||
          <img | 
				
			|||
            src="../../../../assets/img/modules/visual/shiye.png" | 
				
			|||
            alt="" | 
				
			|||
            srcset="" | 
				
			|||
          /> | 
				
			|||
          <div class="top-item-left"> | 
				
			|||
            <span>失业人员</span> | 
				
			|||
            <span>1022</span> | 
				
			|||
          </div> | 
				
			|||
        </div> | 
				
			|||
        <div class="top-item-num"> | 
				
			|||
          <div class="num-item num-item-active" @click="onClickList"> | 
				
			|||
            <div>5-10人</div> | 
				
			|||
            <div> | 
				
			|||
              <div>6栋</div> | 
				
			|||
              <img | 
				
			|||
                src="../../../../assets/img/modules/visual/right-icon.png" | 
				
			|||
                alt="" | 
				
			|||
                class="right-icon" | 
				
			|||
              /> | 
				
			|||
            </div> | 
				
			|||
          </div> | 
				
			|||
          <div class="num-item"> | 
				
			|||
            <div>5-10人</div> | 
				
			|||
            <div> | 
				
			|||
              <div>6栋</div> | 
				
			|||
              <img | 
				
			|||
                src="../../../../assets/img/modules/visual/right-icon.png" | 
				
			|||
                alt="" | 
				
			|||
                class="right-icon" | 
				
			|||
              /> | 
				
			|||
            </div> | 
				
			|||
          </div> | 
				
			|||
        </div> | 
				
			|||
      </div> | 
				
			|||
    </div> | 
				
			|||
 | 
				
			|||
    <div class="div_content"> | 
				
			|||
 | 
				
			|||
      <div id="map" | 
				
			|||
           class="div_map" | 
				
			|||
           :style="{height:mapHeight+'px'}"></div> | 
				
			|||
 | 
				
			|||
      <div class="div_data"> | 
				
			|||
        <div class="div_search"> | 
				
			|||
          <el-input style="width:200px" | 
				
			|||
                    v-model="name" | 
				
			|||
                    placeholder="请输入姓名"></el-input> | 
				
			|||
 | 
				
			|||
          <el-button style="margin-left:10px" | 
				
			|||
                     type="primary" | 
				
			|||
                     icon="el-icon-plus" | 
				
			|||
                     @click="handleSearch">搜索</el-button> | 
				
			|||
 | 
				
			|||
        </div> | 
				
			|||
    <div class="warning-box-bottom"> | 
				
			|||
      <screen-table :headerList='headerList'></screen-table> | 
				
			|||
      <div class="pagination"> | 
				
			|||
      <el-pagination | 
				
			|||
        background | 
				
			|||
        layout="prev, pager, next" | 
				
			|||
        :total="1000"> | 
				
			|||
      </el-pagination> | 
				
			|||
      </div> | 
				
			|||
    </div> | 
				
			|||
 | 
				
			|||
  </div> | 
				
			|||
 | 
				
			|||
</template> | 
				
			|||
 | 
				
			|||
<script> | 
				
			|||
import 'ol/ol.css' | 
				
			|||
import { Map, View } from 'ol' | 
				
			|||
import TileLayer from 'ol/layer/Tile.js'; | 
				
			|||
import XYZ from 'ol/source/XYZ.js'; | 
				
			|||
import VectorLayer from 'ol/layer/Vector.js'; | 
				
			|||
import VectorSource from 'ol/source/Vector.js'; | 
				
			|||
import GeoJSON from 'ol/format/GeoJSON.js'; | 
				
			|||
import { defaults as defaultInteractions, Select, DoubleClickZoom } from 'ol/interaction.js'; | 
				
			|||
import { Circle as CircleStyle, Fill, Stroke, Style, Text } from 'ol/style.js'; | 
				
			|||
import { mapGetters } from "vuex"; | 
				
			|||
import { Loading } from 'element-ui'; //引入Loading服务 | 
				
			|||
import { requestPost } from "@/js/dai/request"; | 
				
			|||
 | 
				
			|||
 | 
				
			|||
 | 
				
			|||
let loading;//加载动画 | 
				
			|||
 | 
				
			|||
let x = 1500 | 
				
			|||
let y = 700 | 
				
			|||
 | 
				
			|||
let map; | 
				
			|||
let mapView; | 
				
			|||
let gaodeMapLayer;//背景地图图层 | 
				
			|||
let polygonLayer;//变电站标注图层 | 
				
			|||
let polygonSource;//变电站标注多边形 | 
				
			|||
let select;//选中标注 | 
				
			|||
 | 
				
			|||
 | 
				
			|||
//变电站标注的文字样式 | 
				
			|||
var createTextStyle = function (feature) { | 
				
			|||
  return new Text({ | 
				
			|||
    textAlign: undefined, | 
				
			|||
    font: "bold 18px Arial", | 
				
			|||
    //fontFamily: "Courier New, monospace", | 
				
			|||
    fontWeight: "bold", | 
				
			|||
    text: feature.values_.name, | 
				
			|||
    //text: "变电站名称", | 
				
			|||
    fill: new Fill({ color: "#007ab9" }), | 
				
			|||
    stroke: new Stroke({ color: "#ffffff", width: 3 }), | 
				
			|||
    offsetY: 0, | 
				
			|||
    overflow: true, | 
				
			|||
  }); | 
				
			|||
}; | 
				
			|||
//变电站标注样式 | 
				
			|||
 | 
				
			|||
var polygonStyleFunction = (function () { | 
				
			|||
  return function (feature) { | 
				
			|||
    return new Style({ | 
				
			|||
      fill: new Fill({ | 
				
			|||
        color: [255, 255, 255, 0.3] | 
				
			|||
      }), | 
				
			|||
      stroke: new Stroke({ | 
				
			|||
        color: [0, 153, 255, 1], | 
				
			|||
        width: 3 | 
				
			|||
      }), | 
				
			|||
 | 
				
			|||
      text: createTextStyle(feature) | 
				
			|||
    });; | 
				
			|||
  }; | 
				
			|||
})() | 
				
			|||
 | 
				
			|||
const vueGis = { | 
				
			|||
  name: 'HomeMap', | 
				
			|||
  data () { | 
				
			|||
    return { | 
				
			|||
      centerPoint: [],//中心点位置 | 
				
			|||
      zoom: 14,//缩放范围:区14 | 
				
			|||
      minZoom: 1,//最小缩放 | 
				
			|||
 | 
				
			|||
      orgData: {},//当前组织对象 | 
				
			|||
      orgId: '', | 
				
			|||
      orgLevel: '', | 
				
			|||
 | 
				
			|||
      subAgencyArray: [],//下拉框数据 | 
				
			|||
 | 
				
			|||
      selPolygonId: '',//选择的多边形id | 
				
			|||
      selPolygon: {}, | 
				
			|||
 | 
				
			|||
      //右侧列表 | 
				
			|||
      name: "", | 
				
			|||
 | 
				
			|||
      //下钻层级记录 | 
				
			|||
      runNum: 0, | 
				
			|||
      runAgency: [], | 
				
			|||
 | 
				
			|||
    } | 
				
			|||
import screenTable from "./components/screen-table/index"; | 
				
			|||
export default { | 
				
			|||
  name: "warning-box", | 
				
			|||
  components: { | 
				
			|||
    screenTable | 
				
			|||
  }, | 
				
			|||
  async mounted () { | 
				
			|||
    //加载组织数据 | 
				
			|||
    await this.loadOrgData() | 
				
			|||
 | 
				
			|||
    //初始化地图 | 
				
			|||
    this.initMap() | 
				
			|||
 | 
				
			|||
    //添加标注图层 | 
				
			|||
    this.addPolygonLayer() | 
				
			|||
 | 
				
			|||
    //加载当前园区的标注 | 
				
			|||
    this.loadPolygon(this.subAgencyArray) | 
				
			|||
 | 
				
			|||
  data() { | 
				
			|||
    return { | 
				
			|||
        headerList:[ | 
				
			|||
        { title: '序号' }, | 
				
			|||
        { title: '所属网格'}, | 
				
			|||
        { title: '所属小区'}, | 
				
			|||
        { title: '楼号'}, | 
				
			|||
        { title: '姓名' }, | 
				
			|||
      ], | 
				
			|||
    }; | 
				
			|||
  }, | 
				
			|||
  methods: { | 
				
			|||
    handleSearch () { | 
				
			|||
 | 
				
			|||
    }, | 
				
			|||
 | 
				
			|||
 | 
				
			|||
    //刷新地图 | 
				
			|||
    async refreshMap (isRefreshView) { | 
				
			|||
      //加载组织数据 | 
				
			|||
      await this.loadOrgData() | 
				
			|||
 | 
				
			|||
      //加载当前园区的标注 | 
				
			|||
      await this.loadPolygon(this.subAgencyArray) | 
				
			|||
 | 
				
			|||
      //重置地图中心点 | 
				
			|||
      if (isRefreshView) { | 
				
			|||
        this.setMapLocation() | 
				
			|||
        mapView.setCenter(this.centerPoint); | 
				
			|||
        mapView.setZoom(this.zoom); | 
				
			|||
      } | 
				
			|||
    }, | 
				
			|||
 | 
				
			|||
 | 
				
			|||
    //返回上一级组织 | 
				
			|||
    handleBack () { | 
				
			|||
 | 
				
			|||
      this.runNum-- | 
				
			|||
      this.runAgency.pop() | 
				
			|||
      if (this.runNum === 0) { | 
				
			|||
        this.orgId = '' | 
				
			|||
        this.orgLevel = '' | 
				
			|||
      } else { | 
				
			|||
        this.orgId = this.runAgency[this.runAgency.length - 1].id | 
				
			|||
        this.orgLevel = this.runAgency[this.runAgency.length - 1].level | 
				
			|||
      } | 
				
			|||
 | 
				
			|||
      this.refreshMap(true) | 
				
			|||
 | 
				
			|||
    }, | 
				
			|||
 | 
				
			|||
    //加载组织数据 | 
				
			|||
    async loadOrgData () { | 
				
			|||
      const url = "/gov/org/agency/maporg" | 
				
			|||
      // const url = "http://yapi.elinkservice.cn/mock/245/gov/org/agency/maporg" | 
				
			|||
      let params = { | 
				
			|||
        orgId: this.orgId, | 
				
			|||
        level: this.orgLevel | 
				
			|||
      } | 
				
			|||
 | 
				
			|||
      const { data, code, msg } = await requestPost(url, params) | 
				
			|||
 | 
				
			|||
      if (code === 0) { | 
				
			|||
        this.orgData = data | 
				
			|||
        this.runAgency.push(data) | 
				
			|||
 | 
				
			|||
        if (data.children && data.children.length > 0) { | 
				
			|||
          this.subAgencyArray = data.children | 
				
			|||
 | 
				
			|||
        } | 
				
			|||
 | 
				
			|||
      } else { | 
				
			|||
        this.$message.error(msg) | 
				
			|||
      } | 
				
			|||
 | 
				
			|||
    }, | 
				
			|||
 | 
				
			|||
    //加载当前园区的标注 | 
				
			|||
    loadPolygon (subAgencyArray) { | 
				
			|||
      polygonSource.clear()//清空变电站标注 | 
				
			|||
 | 
				
			|||
      let featureData = []//标注数据 | 
				
			|||
      if (subAgencyArray && subAgencyArray.length > 0) {//判断是否存在下级标注 | 
				
			|||
        let oneData = {} | 
				
			|||
 | 
				
			|||
        subAgencyArray.forEach(agencyItem => { | 
				
			|||
 | 
				
			|||
          if (agencyItem.coordinates && agencyItem.coordinates !== '') {//如果有坐标 | 
				
			|||
            oneData = { | 
				
			|||
              type: 'Feature', | 
				
			|||
              id: agencyItem.id, | 
				
			|||
              properties: { | 
				
			|||
                id: agencyItem.id, | 
				
			|||
                level: agencyItem.level, | 
				
			|||
                name: agencyItem.name | 
				
			|||
              }, | 
				
			|||
              geometry: { | 
				
			|||
                type: 'Polygon', | 
				
			|||
                coordinates: [], | 
				
			|||
              }, | 
				
			|||
            } | 
				
			|||
            let coorArray = agencyItem.coordinates.split(',')//坐标数组 | 
				
			|||
 | 
				
			|||
            let itemArray = []//单个点位的[lon,lat],数组 | 
				
			|||
            let polygonArray = []//整个多边形的[[lon,lat],[lon,lat],[lon,lat]]数组 | 
				
			|||
 | 
				
			|||
            coorArray.forEach((item, index) => { | 
				
			|||
              itemArray.push(item) | 
				
			|||
              if (index % 2 == 0) {//偶 | 
				
			|||
 | 
				
			|||
              } else {//奇 | 
				
			|||
                polygonArray.push(itemArray) | 
				
			|||
                itemArray = [] | 
				
			|||
              } | 
				
			|||
 | 
				
			|||
            }); | 
				
			|||
            oneData.geometry.coordinates.push(polygonArray) | 
				
			|||
            featureData.push(oneData) | 
				
			|||
          } | 
				
			|||
 | 
				
			|||
        }); | 
				
			|||
 | 
				
			|||
      } | 
				
			|||
 | 
				
			|||
      if (featureData && featureData.length > 0) { | 
				
			|||
        var geojsonObject = { | 
				
			|||
          'type': 'FeatureCollection', | 
				
			|||
          'features': featureData | 
				
			|||
        }; | 
				
			|||
        let feature = (new GeoJSON()).readFeatures(geojsonObject) | 
				
			|||
        polygonSource.addFeatures(feature) | 
				
			|||
 | 
				
			|||
      } | 
				
			|||
 | 
				
			|||
    }, | 
				
			|||
 | 
				
			|||
    //下钻到下一级 | 
				
			|||
    toSubAgency (e) { | 
				
			|||
      console.log(e) | 
				
			|||
 | 
				
			|||
      //下钻到下一级 | 
				
			|||
      this.subAgencyArray.forEach(item => { | 
				
			|||
        if (item.id === e.selected[0].id_) { | 
				
			|||
          this.selPolygonId = item.id | 
				
			|||
          this.selPolygon = item | 
				
			|||
          this.orgId = item.id | 
				
			|||
          this.orgLevel = item.level | 
				
			|||
 | 
				
			|||
        } | 
				
			|||
      }); | 
				
			|||
 | 
				
			|||
      this.runNum++ | 
				
			|||
      this.runAgency.push(this.selPolygon) | 
				
			|||
 | 
				
			|||
      this.refreshMap(true) | 
				
			|||
 | 
				
			|||
 | 
				
			|||
    }, | 
				
			|||
 | 
				
			|||
    //设置地图定位的中心点和缩放级别 | 
				
			|||
    setMapLocation () { | 
				
			|||
      this.centerPoint = [] | 
				
			|||
 | 
				
			|||
      if (this.orgData.longitude && this.orgData.latitude) { | 
				
			|||
        this.centerPoint.push(this.orgData.longitude) | 
				
			|||
        this.centerPoint.push(this.orgData.latitude) | 
				
			|||
      } | 
				
			|||
 | 
				
			|||
      this.setZoom(this.orgData.agencyLevel) | 
				
			|||
    }, | 
				
			|||
 | 
				
			|||
    //根据组织层级设置缩放级别 | 
				
			|||
    setZoom (agencyLevel) { | 
				
			|||
      if (agencyLevel === 'district') { | 
				
			|||
        this.zoom = 14 | 
				
			|||
      } else if (agencyLevel === 'street') { | 
				
			|||
        this.zoom = 15 | 
				
			|||
      } else if (agencyLevel === 'community') { | 
				
			|||
        this.zoom = 16 | 
				
			|||
      } | 
				
			|||
 | 
				
			|||
    }, | 
				
			|||
 | 
				
			|||
    initMap () { | 
				
			|||
      this.setMapLocation() | 
				
			|||
 | 
				
			|||
      gaodeMapLayer = new TileLayer({ | 
				
			|||
        title: "地图", | 
				
			|||
        source: new XYZ({ | 
				
			|||
          //指定url瓦片 | 
				
			|||
          url: 'http://wprd0{1-4}.is.autonavi.com/appmaptile?lang=zh_cn&size=1&style=7&x={x}&y={y}&z={z}', | 
				
			|||
          wrapX: true//x方向平铺,也可以选择false | 
				
			|||
        }), | 
				
			|||
        zIndex: 20 | 
				
			|||
      }); | 
				
			|||
 | 
				
			|||
      mapView = new View({ | 
				
			|||
        //中心点坐标 | 
				
			|||
        center: this.centerPoint, | 
				
			|||
        // projection: 'EPSG:3857', | 
				
			|||
        projection: 'EPSG:4326', | 
				
			|||
        zoom: this.zoom, | 
				
			|||
        minZoom: this.minZoom | 
				
			|||
      }), | 
				
			|||
        //初始化map和地图底图 | 
				
			|||
        //创建地图容器 | 
				
			|||
        map = new Map({ | 
				
			|||
          layers: [gaodeMapLayer], | 
				
			|||
          //加载瓦片图层数据 | 
				
			|||
          view: mapView, | 
				
			|||
          target: 'map' | 
				
			|||
          //目标加载到map中 | 
				
			|||
        }) | 
				
			|||
 | 
				
			|||
      map.on('singleclick', function (e) { | 
				
			|||
        console.log(e.coordinate) | 
				
			|||
        // console.log(transform(e.coordinate, 'EPSG:3857', 'EPSG:4326')); | 
				
			|||
 | 
				
			|||
      }) | 
				
			|||
 | 
				
			|||
      //去除双击放大效果 | 
				
			|||
      const dblClickInteraction = map | 
				
			|||
        .getInteractions() | 
				
			|||
        .getArray() | 
				
			|||
        .find(interaction => { | 
				
			|||
          return interaction instanceof DoubleClickZoom; | 
				
			|||
        }); | 
				
			|||
      map.removeInteraction(dblClickInteraction); | 
				
			|||
 | 
				
			|||
    }, | 
				
			|||
 | 
				
			|||
    //添加变电站标注图层 | 
				
			|||
    addPolygonLayer () { | 
				
			|||
      polygonSource = new VectorSource({ | 
				
			|||
        //features: (new GeoJSON()).readFeatures(geojsonObject) | 
				
			|||
      }); | 
				
			|||
 | 
				
			|||
      polygonLayer = new VectorLayer({ | 
				
			|||
        source: polygonSource, | 
				
			|||
        style: polygonStyleFunction, | 
				
			|||
        zIndex: 50 | 
				
			|||
      }); | 
				
			|||
 | 
				
			|||
      //选中多边形后的样式 | 
				
			|||
      var overlayStyle = (function () { | 
				
			|||
 | 
				
			|||
        return function (feature) { | 
				
			|||
          var styles = {}; | 
				
			|||
          styles['Polygon'] = [ | 
				
			|||
            new Style({ | 
				
			|||
              stroke: new Stroke({ | 
				
			|||
                color: '#ec9000', | 
				
			|||
                width: 2 | 
				
			|||
              }) | 
				
			|||
            }), | 
				
			|||
 | 
				
			|||
            new Style({ | 
				
			|||
              fill: new Fill({ | 
				
			|||
                color: 'rgba(0, 0, 255, 0.1)' | 
				
			|||
              }) | 
				
			|||
            }), | 
				
			|||
            new Style({ | 
				
			|||
              text: createTextStyle(feature) | 
				
			|||
            }) | 
				
			|||
          ]; | 
				
			|||
          styles['MultiPolygon'] = styles['Polygon']; | 
				
			|||
          return styles[feature.getGeometry().getType()]; | 
				
			|||
        }; | 
				
			|||
      })(); | 
				
			|||
 | 
				
			|||
      select = new Select({ | 
				
			|||
        style: overlayStyle | 
				
			|||
      }); | 
				
			|||
 | 
				
			|||
 | 
				
			|||
      map.addLayer(polygonLayer) | 
				
			|||
      map.addInteraction(select); | 
				
			|||
 | 
				
			|||
      select.on('select', e => { | 
				
			|||
        this.toSubAgency(e) | 
				
			|||
      }); | 
				
			|||
 | 
				
			|||
    }, | 
				
			|||
 | 
				
			|||
    //开启加载动画 | 
				
			|||
    startLoading () { | 
				
			|||
      loading = Loading.service({ | 
				
			|||
        lock: true, //是否锁定 | 
				
			|||
        text: '正在加载……', //加载中需要显示的文字 | 
				
			|||
        background: 'rgba(0,0,0,.7)' //背景颜色 | 
				
			|||
      }); | 
				
			|||
 | 
				
			|||
    }, | 
				
			|||
 | 
				
			|||
    //结束加载动画 | 
				
			|||
    endLoading () { | 
				
			|||
      //clearTimeout(timer); | 
				
			|||
      if (loading) { | 
				
			|||
        loading.close(); | 
				
			|||
      } | 
				
			|||
    }, | 
				
			|||
  }, | 
				
			|||
  props: { | 
				
			|||
 | 
				
			|||
    vueFlag: { | 
				
			|||
      type: String, | 
				
			|||
      default: "alarm" | 
				
			|||
    } | 
				
			|||
  }, | 
				
			|||
  computed: { | 
				
			|||
 | 
				
			|||
    mapHeight () { | 
				
			|||
 | 
				
			|||
      return this.clientHeight - 120; | 
				
			|||
 | 
				
			|||
    }, | 
				
			|||
    // zoom: { | 
				
			|||
    //   get () { | 
				
			|||
    //     //根据不同屏幕分辨率,控制zoom大小 | 
				
			|||
    //     if (this.clientHeight < 900) { | 
				
			|||
    //       return 2.3 | 
				
			|||
    //     } else { | 
				
			|||
    //       return 2.8 | 
				
			|||
    //     } | 
				
			|||
    //   }, | 
				
			|||
    //   set (value) { | 
				
			|||
    //   } | 
				
			|||
    // }, | 
				
			|||
    ...mapGetters(["clientHeight"]) | 
				
			|||
 | 
				
			|||
  }, | 
				
			|||
  components: {}, | 
				
			|||
} | 
				
			|||
export default vueGis; | 
				
			|||
</script> | 
				
			|||
 | 
				
			|||
<style lang="scss"> | 
				
			|||
.div_main { | 
				
			|||
  background-color: #12a3ff; | 
				
			|||
} | 
				
			|||
.router_line { | 
				
			|||
  width: 106px; | 
				
			|||
  height: 1px; | 
				
			|||
  border: 1px solid #000000; | 
				
			|||
  /* opacity: 0.09; */ | 
				
			|||
} | 
				
			|||
.div_router { | 
				
			|||
  margin-top: 5px; | 
				
			|||
 | 
				
			|||
  .router_parents { | 
				
			|||
    color: #a0c3d9; | 
				
			|||
    font-size: 8px; | 
				
			|||
 | 
				
			|||
    .arrow { | 
				
			|||
      padding: 0 5px; | 
				
			|||
    } | 
				
			|||
  } | 
				
			|||
 | 
				
			|||
  .router_child { | 
				
			|||
    color: #ffffff; | 
				
			|||
    font-size: 8px; | 
				
			|||
  onClickList(){} | 
				
			|||
  } | 
				
			|||
} | 
				
			|||
 | 
				
			|||
.div_search { | 
				
			|||
  text-align: center; | 
				
			|||
  margin-top: 20px; | 
				
			|||
  width: 100%; | 
				
			|||
  display: flex; | 
				
			|||
  justify-content: center; | 
				
			|||
} | 
				
			|||
 | 
				
			|||
.div_content { | 
				
			|||
  margin-top: 10px; | 
				
			|||
  padding: 10px 10px; | 
				
			|||
  display: flex; | 
				
			|||
} | 
				
			|||
}; | 
				
			|||
</script> | 
				
			|||
 | 
				
			|||
.div_map { | 
				
			|||
  width: 100%; | 
				
			|||
} | 
				
			|||
.div_data { | 
				
			|||
  flex: 0 0 400px; | 
				
			|||
  margin-left: 20px; | 
				
			|||
  background-color: rgb(233, 235, 235); | 
				
			|||
  border-radius: 5px; | 
				
			|||
} | 
				
			|||
</style>   | 
				
			|||
<style> | 
				
			|||
.ol-overlaycontainer-stopevent { | 
				
			|||
  display: none; | 
				
			|||
} | 
				
			|||
</style>    | 
				
			|||
<style | 
				
			|||
  lang="scss" | 
				
			|||
  src="@/assets/scss/modules/visual/warning.scss" | 
				
			|||
  scoped | 
				
			|||
></style> | 
				
			|||
 | 
				
			|||