Newer
Older
KaiFengPC / src / views / floodSys / floodOneMap / centerSearch.vue
@zhangdeliang zhangdeliang on 23 May 6 KB 初始化项目
<template>
  <!-- 排水防涝一张图降雨图 -->
  <div class="centerWarnSea" v-show="centerWarnSeaShow">
    <img class="warnImg" src="@/assets/images/gisMap/color.png" />
    <el-date-picker
      type="daterange"
      v-model="daterange"
      value-format="YYYY-MM-DD"
      start-placeholder="开始日期"
      end-placeholder="结束日期"
      placeholder="请选择日期"
      style="width: 320px"
      @change="getRainDistribution"
    >
    </el-date-picker>
    <el-select v-model="searchVal" placeholder="倍数" style="width: 80px; margin-left: 10px" @change="changeMul">
      <el-option v-for="item in bsType" :key="item.value" :label="item.label" :value="item.value" />
    </el-select>
    <el-progress :stroke-width="20" :percentage="processVal" status="success" :text-inside="true" style="width: 640px"></el-progress>
    <el-button type="warning" @click="startImitate" v-if="ifStart">开始</el-button>
    <el-button type="danger" @click="stopImitate" v-if="!ifStart">暂停</el-button>
    <el-button type="warning" @click="showKring" v-if="ifShowKring">显示</el-button>
    <el-button type="danger" @click="unshowKring" v-if="!ifShowKring">隐藏</el-button>
  </div>
</template>

<script setup name="page">
import bus from '@/bus';
import { rainDistributionMapData } from '@/api/floodSys/floodStation.js';
import { getKrigingByPoints } from '@/utils/gis/rainkriging';
import bjBoundaryJson from '@/assets/geojson/krigingBoundary.json';
import { onBeforeUnmount } from 'vue';
const { proxy } = getCurrentInstance();
const daterange = ref(
  [proxy.moment().format('YYYY-MM-DD'), proxy.moment(new Date()).add(7, 'days').format('YYYY-MM-DD')] //未来7天
);
const searchVal = ref(2);
const processVal = ref(0);
const timer = ref(null);
const ifStart = ref(true);
const ifShowKring = ref(true);
const centerWarnSeaShow = ref(false);
const krigingJson = ref([]);
const featureStep = ref(0);
const bsType = ref([
  { value: 2, label: '2倍' },
  { value: 4, label: '4倍' },
  { value: 6, label: '6倍' },
]);
const searchText = ref('');

// 关键字搜索
function changeText(val) {
  console.log(val);
}

// 开始模拟
function startImitate() {
  ifStart.value = false;
  if (krigingJson.value.length < 1) {
    return;
  }
  if (krigingJson.value.length > 1) {
    let proStept = Math.round(100 / krigingJson.value.length);
    timer.value = setInterval(() => {
      processVal.value += proStept;
      featureStep.value += 1;
      let kriging = getKrigingByPoints(krigingJson.value[krigingJson.value.length - featureStep.value], bjBoundaryJson);
      newfiberMapbox.map.getSource('kriging_source').setData(kriging);
      if (processVal.value > 100) {
        processVal.value = 0;
        stopImitate();
      }
      if (featureStep.value == krigingJson.value.length) {
        featureStep.value = 0;
        //stopImitate();
      }
    }, 1000 / searchVal.value);
  } else {
    timer.value = setInterval(() => {
      processVal.value += 100;
      if (processVal.value > 100) {
        processVal.value = 0;
        stopImitate();
      }
    }, 1000);
  }
}
// 暂停模拟
function stopImitate() {
  ifStart.value = true;
  stopTimer();
}
//显示插值图
function showKring() {
  ifShowKring.value = false;
  !!newfiberMapbox.map.getLayer('kriging_layer') && newfiberMapbox.map.setLayoutProperty('kriging_layer', 'visibility', 'none');
}
//隐藏插值图
function unshowKring() {
  ifShowKring.value = true;
  !!newfiberMapbox.map.getLayer('kriging_layer') && newfiberMapbox.map.setLayoutProperty('kriging_layer', 'visibility', 'visible');
}
// 倍数选择
function changeMul(val) {
  searchVal.value = val;
}
// 定时器清除
function stopTimer() {
  if (timer.value) {
    clearInterval(timer.value);
  }
}
//获取降雨插值
const getRainDistribution = async () => {
  !!newfiberMapbox.map.getLayer('kriging_layer') && newfiberMapbox.map.removeLayer('kriging_layer');
  !!newfiberMapbox.map.getSource('kriging_source') && newfiberMapbox.map.removeSource('kriging_source');
  krigingJson.value = [];
  let params = {
    startTime: daterange.value[0],
    endTime: daterange.value[1],
  };
  let res = await rainDistributionMapData(params);
  if (res && res.code == 200) {
    let allRainData = res.data;
    if (!!!allRainData.length) {
      proxy.$modal.msgError('暂无数据');
      return;
    }
    allRainData.forEach(data => {
      let rainDataJson = getKrigingJson(data.rainSiteDistributionVOS);
      krigingJson.value.push(rainDataJson);
    });
    addKrigingLayer(krigingJson.value[0]);
  }
};
//获取雨量插值json
const getKrigingJson = dataList => {
  if (!!!dataList.length) return;
  let features = [];
  dataList.forEach(element => {
    let feature = {
      type: 'Feature',
      geometry: {
        type: 'Point',
        coordinates: [Number(element.lonLat.split(',')[0]), Number(element.lonLat.split(',')[1])],
      },
      properties: { value: element.p24, name: `${element.p24}mm` },
    };
    features.push(feature);
  });
  return {
    type: 'FeatureCollection',
    features: features,
  };
};
//地图添加降雨插值图
const addKrigingLayer = geoJson => {
  let layerId = `kriging_layer`;
  let sourceId = `kriging_source`;
  let kriging = getKrigingByPoints(geoJson, bjBoundaryJson);
  !newfiberMapbox.map.getSource(sourceId) && newfiberMapbox.map.addSource(sourceId, { type: 'geojson', data: kriging });
  !newfiberMapbox.map.getLayer(layerId) &&
    newfiberMapbox.map.addLayer({
      id: layerId,
      type: 'fill',
      source: sourceId,
      layout: {},
      paint: {
        'fill-color': { type: 'identity', property: 'color' },
        'fill-opacity': 0.6,
      },
    });
};
onMounted(() => {
  bus.on('centerSearchShow', value => {
    centerWarnSeaShow.value = value;
    if (!value) {
      !!newfiberMapbox.map.getLayer('kriging_layer') && newfiberMapbox.map.removeLayer('kriging_layer');
      !!newfiberMapbox.map.getSource('kriging_source') && newfiberMapbox.map.removeSource('kriging_source');
    }
  });
});
onBeforeMount(() => {
  stopTimer();
});
onBeforeUnmount(() => {
  if (!newfiberMapbox) return;
  !!newfiberMapbox.map.getLayer('kriging_layer') && newfiberMapbox.map.removeLayer('kriging_layer');
  !!newfiberMapbox.map.getSource('kriging_source') && newfiberMapbox.map.removeSource('kriging_source');
});
</script>
<style lang="scss">
@import '@/assets/styles/variables.module.scss';
.centerWarnSea {
  background: $mainColor1;
  box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.3);
  border-radius: 8px;
  position: absolute;
  top: 10px;
  left: 5px;
  z-index: 99;
  padding: 0px 10px;
  display: flex;
  align-items: center;
  width: 85%;
  .warnImg {
    width: 324px;
    height: 70px;
    margin-top: -20px;
  }
  .el-select {
    width: 150px;
  }
  .el-progress {
    width: 700px;
    margin: 0px 15px;
    .el-progress__text span {
      font-size: 12px;
    }
  }
}
</style>