Newer
Older
HuangJiPC / src / pages / views / WatershedOneMap / modalPart / rainTz.vue
@zengcong zengcong on 5 Jul 12 KB update
<template>
  <!-- 降雨特征 -->
  <div class="natureOne">
    <!-- 气象信息 -->
    <div class="weatherPart">
      <div class="publicTitle">气象信息</div>
      <div class="content">
        <div class="part" v-for="(item, index) in weatherArr" :key="'a' + index">
          <img :src="getNowImage(item.WEA)" />
          <p>{{ item.WEA }}</p>
          <p style="font-size: 20px">{{ item.TIME ? item.TIME.substring(5, 10) : '--' }}</p>
          <p>{{ item.TEM2 }}--{{ item.TEM1 }}</p>
        </div>
      </div>
    </div>
    <!-- 降雨时空统计 -->
    <div class="rainTime">
      <div class="publicTitle">降雨数据采集</div>
      <n-data-table
        :columns="columns"
        :max-height="200"
        style="margin-top: 10px"
        striped
        :data="tableData"
        :loading="tableLoading"
        :bordered="false"
      />
    </div>
    <!-- 积水点统计 -->
    <div class="rainTime">
      <div class="publicTitle">积水点数据采集</div>
      <div class="introduction-contents3">
        <div class="head">
          <span style="width: 33.3%" class="center">积水点名称</span>
          <span style="width: 33.3%" class="center">积水深度(mm)</span>
          <span style="width: 33.3%" class="center">监测时间</span>
        </div>
        <div class="content">
          <ul class="list" ref="dispatchRef">
            <li
              style="display: flex; align-items: center"
              v-for="(item, index) in tableDataJ"
              @click="handleRowClick(item, index)"
              :key="index"
            >
              <div style="width: 33.3%; text-align: left" class="ellipsis">
                <n-popover trigger="hover">
                  <template #trigger>
                    <div class="ellipsis popovers">
                      {{ item.STNM }}
                    </div>
                  </template>
                  <span>{{ item.STNM }}</span>
                </n-popover>
              </div>
              <div style="width: 33.3%" class="center">
                {{ item.Z }}
              </div>
              <div style="width: 33.3%" class="center">
                {{ item.TM }}
              </div>
            </li>
          </ul>
        </div>
      </div>

      <!-- <n-data-table
        :columns="columnsJ"
        :max-height="200"
        style="margin-top: 10px"
        striped
        :data="tableDataJ"
        :loading="tableLoadingJ"
        :bordered="false"
        :row-key="(row) => row.id"
        @row-click="handleRowClick"
      /> -->
    </div>
    <!-- 降雨场次统计 -->
    <div class="rainCount">
      <div class="publicTitle">降雨场次统计</div>
      <div id="echartCount"></div>
    </div>
  </div>
</template>
<script>
import { toRefs, onMounted, reactive, onBeforeUnmount, nextTick } from 'vue';
import * as echarts from 'echarts';
import { rainlistHjly, dayWeather, jsdListHjly } from '@/services';
import Popup from './Popup.vue';
import bus from '@/utils/util';
import yuliangImg from '@/assets/newImgs/layerIcon/rainStation_gis.png';
import { getWeatherImg, formatDate } from '@/utils/util';

export default {
  name: 'natureOne',
  components: {
    Popup,
  },
  setup() {
    const allData = reactive({
      tableLoading: true,
      weatherArr: [],
      rainAnalyses: {},
      index: 0,
      months: new Date().getTime(),
      checkedLegend: [{ isCheck: false, layername: 'waterLoging' }], // 设置默认选中的图例图层
      columns: [
        { title: '雨量站名称', width: '150', key: 'STNM' },
        { title: '今日降雨(mm)', key: 'DAYDRP' },
        {
          title: '明日预报降雨(mm)',
          key: 'preRain',
          render(row) {
            return '--';
          },
        },
      ],
      tableData: [],

      columnsJ: [
        { title: '积水点名称', width: '150', key: 'STNM' },
        {
          title: '积水深度(mm)',
          key: 'Z',
          render(row) {
            return row.Z || '--';
          },
        },
        {
          title: '监测时间',
          key: 'TM',
          width: '160',
          render(row) {
            return row.TM || '--';
          },
        },
      ],
      tableDataJ: [],
      tableLoadingJ: true,
    });
    // 饼图加载
    let echartNature = null;
    const echartCount = () => {
      let option = {
        legend: {
          show: false,
        },
        tooltip: {
          show: false,
        },
        title: {
          text: '21',
          left: 'center',
          top: '38%',
          textStyle: {
            color: '#fff',
            fontSize: 20,
            align: 'center',
          },
          subtext: '降雨数',
          subtextStyle: {
            color: '#A5BBD2',
            fontStyle: 'normal',
            fontSize: 14,
          },
        },
        series: [
          {
            name: 'Access From',
            type: 'pie',
            radius: ['40%', '55%'],
            labelLine: {
              length: 30,
            },
            label: {
              formatter: '\n{b|{b}} \n {hr|}\n  {c} {per|{d}%}  ',
              backgroundColor: '#00596B',
              borderColor: '#14ccca',
              color: '#14ccca',
              fontWeight: 'bold',
              borderWidth: 1,
              borderRadius: 4,
              rich: {
                hr: {
                  borderColor: '#14ccca',
                  width: '100%',
                  borderWidth: 1,
                  textAlign: 'center',
                  height: 0,
                },
                b: {
                  color: '#fff',
                  fontSize: 14,
                  fontWeight: '500',
                  padding: [13, 4],
                  lineHeight: 16,
                },
                per: {
                  color: '#14ccca',
                  padding: [3, 4],
                  borderRadius: 4,
                },
              },
            },
            data: [
              { value: 2, name: '10年1遇' },
              { value: 4, name: '5年1遇' },
              { value: 5, name: '2年1遇' },
              { value: 10, name: '1年1遇' },
            ],
          },
        ],
      };
      echartNature = echarts.init(document.getElementById('echartCount'));
      echartNature.clear();
      echartNature.setOption(option);
    };
    // 获取气象数据信息
    const getWeather = async () => {
      let res = await dayWeather();
      let arrs = res || [];
      if (arrs.length > 4) {
        allData.weatherArr = arrs.splice(0, 4);
      }
    };
    // 天气图标
    function getNowImage(code) {
      let image = '';
      if (code === '晴转多云' || code === '多云转晴' || code === '晴') {
        image = getWeatherImg('sunny.png');
      } else if (code === '多云' || code === '阴转多云' || code === '多云转阴' || code === '阴' || code.includes('多云')) {
        image = getWeatherImg('cloudy.png');
      } else if (code === '小雨转阴' || code === '阴转小雨' || code === '晴转阴' || code.includes('小雨')) {
        image = getWeatherImg('overcast.png');
      } else if (code === '阵雨' || code === '小雨转晴' || code === '阵雨转阴' || code.includes('阵雨')) {
        image = getWeatherImg('shower.png');
      } else if (code === '雷阵雨') {
        image = getWeatherImg('thunder-shower.png');
      } else if (code === '小雨' || code === '晴转小雨' || code === '小雨转中雨' || code === '小雨转多云') {
        image = getWeatherImg('light-rain.png');
      } else if (code === '中雨' || code === '中雨转阴' || code.includes('中雨')) {
        image = getWeatherImg('moderate-rain.png');
      } else if (code === '暴雨' || code.includes('大雨')) {
        image = getWeatherImg('heavy-rain.png');
      }
      return image;
    }
    //获取雨量站geojson
    const getRainStationGeojson = (dataList) => {
      return turf.featureCollection(
        dataList.map((data) => {
          return turf.point([Number(data.LGTD), Number(data.LTTD)], data);
        })
      );
    };

    //获取雨量站基本信息
    const getRainStation = async () => {
      let yuliangJSON = getRainStationGeojson(allData.tableData);
      // 加载雨量监测站点位
      newfiberMap.addGeojsonPoint({
        id: 'yuliangJC',
        data: yuliangJSON,
        icon: yuliangImg,
        text: '',
        fontSize: '18',
        font: 'Source Han Sans CN',
        height: 124,
        width: 64,
        labelOffset: [0, -140],
        imgOffset: [0, 0],
        showBackground: false,
        backgroundColor: '#ff0000',
        fillColor: 'rgba(66, 144, 234,1)',
        outlineColor: 'rgba(0, 0, 0, 0.8)',
        outlineWidth: 6,
        show: true,
        style: Cesium.LabelStyle.FILL_AND_OUTLINE, //Cesium.LabelStyle.FILL_AND_OUTLINE  Cesium.LabelStyle.OUTLINE
      });
    };
    // 获取降雨数据采集
    const getRainList = async () => {
      allData.tableLoading = true;
      // 市信息中心接口
      let params = {
        currentPage: 1,
        pageSize: 99,
        searchFilters: [],
        paramMap: {
          begindate: formatDate(Date.now(), 'YYYY-MM-DD') + ' 00:00:00',
          enddate: formatDate(Date.now(), 'YYYY-MM-DD') + ' 23:23:59',
        },
      };

      let res = await rainlistHjly(params);
      if (res) {
        allData.tableData = res.result || [];
        allData.tableData.forEach((item) => {
          item.name = item.STNM;
          item.DAYDRP = item.DAYDRP + 'mm';
          item.MAXDRP = item.MAXDRP + 'mm';
          item.stationType = 'rainStation';
        });
        allData.tableLoading = false;
        // 地图渲染雨量站点位
        setTimeout(() => {
          // getRainStation();
        }, 1000);
      }
    };

    // 获取积水点数据
    const getWaterLoging = async () => {
      allData.tableLoadingJ = true;
      let res = await jsdListHjly({ currentPage: 1, pageSize: 99, searchFilters: [] });
      console.log(res);
      allData.tableDataJ = res.result || [];
      allData.tableLoadingJ = false;
    };
    const handleRowClick = (row) => {
      newfiberMap.map.camera.flyTo({
        destination: Cesium.Cartesian3.fromDegrees(row.LNG, row.LAT, 3000.0),
      });
    };

    onMounted(() => {
      getRainList(); //获取雨量站列表
      getWaterLoging(); //积水点
      let closePopup = false;
      bus.emit('closePopup', closePopup);
      //  设置默认选中的图例图层
      setTimeout(() => {
        bus.emit('showDefaultLegend', allData.checkedLegend);
      }, 1000);

      /*      newfiberMap.flyTo({
        lon: 114.264596,
        lat: 30.500028,
        heading: 2.281299097855777,
        zoom: 5358.12942752382,
        pitch: -25.2508969308367,
        roll: 0.005453465256790101,
      });*/
      echartCount();
      getWeather();
    });
    onBeforeUnmount(() => {
      bus.emit('ifQixiang', false);
      bus.emit('showDefaultLegend', [{ isCheck: true, layername: 'waterLoging' }]); //清空图例默认开启
      if (echartNature) echartNature.dispose();
    });
    return {
      ...toRefs(allData),
      getRainStation,
      getNowImage,
      getWaterLoging,
      handleRowClick,
    };
  },
};
</script>
<style lang="less">
.natureOne {
  width: 100%;
  height: 100%;

  .weatherPart {
    margin-top: 10px;

    .content {
      width: 435px;
      background: #023b53;
      border-radius: 15px;
      margin: 10px 0px;
      display: flex;
      justify-content: space-around;
      .part {
        width: 100px;
        flex-shrink: 0;
        padding: 10px 0px;
        text-align: center;
        font-size: 15px;
        img {
          width: 60%;
        }
        p {
          height: 30px;
          line-height: 30px;
        }
      }
      .part:nth-of-type(odd) {
        background: #012c3f;
      }
    }
  }
  .rainTime {
    margin-top: 20px;
    .n-data-table {
      .n-data-table-th,
      .n-data-table-td {
        text-align: center;
      }
    }
  }
  .rainCount {
    margin-top: 20px;
    #echartCount {
      margin-top: 20px;
      width: 430px;
      height: 200px;
    }
  }
}
.introduction-contents3 {
  height: 200px;
  .head {
    display: flex;
    height: 40px;
    padding: 0 10px;
    align-items: center;
    background: #012c3f;
    span {
      font-size: 14px;
      font-family: PingFang SC;
      font-weight: 400;
      color: #669db4;
      // text-align: center;
    }
  }

  .headbgc1 {
    background-image: url('/src/assets/imgs/gateway1/I.png');
    background-size: cover;
  }
  .content {
    height: calc(100% - 45px);
    overflow: hidden;
  }
  .list {
    padding: 0 10px;
    height: 100%;
    overflow: auto;
    color: #ffffff;

    li {
      height: 45px;
      cursor: pointer;
    }

    li:nth-child(odd) {
      background: rgba(0, 0, 0, 0.2);
    }
  }

  ul {
    list-style-type: none;
  }

  li span {
    width: 8px;
    height: 8px;
    border-radius: 50%;
    margin-right: 5px;
    display: inline-block;
  }
}
.center {
  text-align: center;
}
</style>