<template>
  <div style="position: relative">

    <!-- 组织路由 -->
    <div class="div_top">
      <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>
    </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 size="mini"
                    WarningColor='warning'
                    placeholder="请输入姓名"
                    v-model="name">
            <i slot="prefix"
               class="icon">
              <img src="../../../../assets/img/modules/visual/sousuo.png"
                   alt />
            </i>
          </el-input>

          <div class="btn"
               @click="handleSearch">搜索</div>

        </div>
        <div class="div_infolist"></div>
      </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: [],

    }
  },
  async mounted () {
    //加载组织数据
    await this.loadOrgData()

    //初始化地图
    this.initMap()

    //添加标注图层
    this.addPolygonLayer()

    //加载当前园区的标注
    this.loadPolygon(this.subAgencyArray)

  },
  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"
      let params = {
        orgId: this.orgId,
        level: this.orgLevel
      }

      const { data, code, msg } = await requestPost(url, params)

      if (code === 0) {
        this.orgData = 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"
  src="@/assets/scss/modules/visual/basicInfoMain.scss"
  scoped
></style>

<style lang=scss>
.ol-overlaycontainer-stopevent {
  display: none;
}
.el-input__inner[WarningColor="warning"] {
  background-color: #011168;
  border-radius: 4px 0 0 4px;
  height: 56px;
  border: none;
  box-shadow: 0 0 10px inset #1a5afd;
  padding-left: 70px;
  font-size: 18px;
  font-family: PingFang SC;
  font-weight: 400;
  color: #ffffff;
  opacity: 0.7;
}
</style>   