256 lines
		
	
	
		
			7.1 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
			
		
		
	
	
			256 lines
		
	
	
		
			7.1 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
<template>
 | 
						|
  <div class="AiDvMap" v-resize="onDomResize">
 | 
						|
    <div class="chart-map" :class="v" style="width: 800px; height: 600px"></div>
 | 
						|
  </div>
 | 
						|
</template>
 | 
						|
 | 
						|
<script>
 | 
						|
import * as echarts from 'echarts'
 | 
						|
import http from "dui/lib/js/request";
 | 
						|
 | 
						|
export default {
 | 
						|
  name: 'AiDvMap',
 | 
						|
  data() {
 | 
						|
    return {
 | 
						|
      timer: null,
 | 
						|
      v: `AiDvMap-${new Date().getTime()}`,
 | 
						|
      chart: null
 | 
						|
    }
 | 
						|
  },
 | 
						|
  directives: {
 | 
						|
    resize: {
 | 
						|
      bind(el, binding) {
 | 
						|
        let width = ''
 | 
						|
        let height = ''
 | 
						|
 | 
						|
        function isReize() {
 | 
						|
          const style = document.defaultView.getComputedStyle(el)
 | 
						|
          if (width !== style.width || height !== style.height) {
 | 
						|
            binding.value({
 | 
						|
              width: style.width,
 | 
						|
              height: style.height
 | 
						|
            })
 | 
						|
          }
 | 
						|
          width = style.width
 | 
						|
          height = style.height
 | 
						|
        }
 | 
						|
 | 
						|
        el.__vueSetInterval__ = setInterval(isReize, 300)
 | 
						|
      },
 | 
						|
 | 
						|
      unbind(el) {
 | 
						|
        clearInterval(el.__vueSetInterval__)
 | 
						|
      }
 | 
						|
    }
 | 
						|
  },
 | 
						|
  mounted() {
 | 
						|
    this.$nextTick(() => {
 | 
						|
      this.initChart()
 | 
						|
    })
 | 
						|
  },
 | 
						|
 | 
						|
  methods: {
 | 
						|
    onDomResize() {
 | 
						|
      this.$nextTick(() => {
 | 
						|
        this.chart.resize()
 | 
						|
      })
 | 
						|
    },
 | 
						|
 | 
						|
    initChart() {
 | 
						|
      this.chart = echarts.init(document.querySelector(`.${this.v}`))
 | 
						|
      this.getData().then(res => {
 | 
						|
        if (res.code === 0) {
 | 
						|
          echarts.registerMap('滨海县', res.data)
 | 
						|
 | 
						|
          let option = {
 | 
						|
            geo: [
 | 
						|
              {
 | 
						|
                map: "滨海县",
 | 
						|
                aspectScale: 1,
 | 
						|
                zoom: 0.65,
 | 
						|
                layoutCenter: ["50%", "50%"],
 | 
						|
                layoutSize: "180%",
 | 
						|
                show: true,
 | 
						|
                roam: false,
 | 
						|
                emphasis: {
 | 
						|
                  show: true,
 | 
						|
                  label: {
 | 
						|
                    textStyle: {
 | 
						|
                      color: "#FFFFFF"
 | 
						|
                    },
 | 
						|
                  },
 | 
						|
                  itemStyle: {
 | 
						|
                    // areaColor: '#fff'
 | 
						|
                  }
 | 
						|
                },
 | 
						|
                label: {
 | 
						|
                  normal: {
 | 
						|
                    show: false,
 | 
						|
                    color: '#fff',
 | 
						|
                    fontSize: '20'
 | 
						|
                  }
 | 
						|
                },
 | 
						|
                itemStyle: {
 | 
						|
                  normal: {
 | 
						|
                    borderColor: "rgba(2, 198, 220, 1)",
 | 
						|
                    borderWidth: 2,
 | 
						|
                    shadowColor: "rgba(2, 198, 220, 0.1)",
 | 
						|
                    shadowOffsetY: 10,
 | 
						|
                    shadowBlur: 120,
 | 
						|
                    areaColor: "#163c56",
 | 
						|
                  },
 | 
						|
                }
 | 
						|
              },
 | 
						|
              // 重影
 | 
						|
              {
 | 
						|
                type: "map",
 | 
						|
                map: "滨海县",
 | 
						|
                zlevel: -1,
 | 
						|
                aspectScale: 1,
 | 
						|
                zoom: 0.65,
 | 
						|
                layoutCenter: ["50%", "51%"],
 | 
						|
                layoutSize: "180%",
 | 
						|
                roam: false,
 | 
						|
                silent: true,
 | 
						|
                itemStyle: {
 | 
						|
                  normal: {
 | 
						|
                    borderWidth: 1,
 | 
						|
                    // borderColor:"rgba(17, 149, 216,0.6)",
 | 
						|
                    borderColor: "rgba(2, 198, 220, 0.6)",
 | 
						|
                    shadowColor: "rgba(2, 198, 220, 0.6)",
 | 
						|
                    shadowOffsetY: 5,
 | 
						|
                    shadowBlur: 15,
 | 
						|
                    areaColor: "rgba(5,21,35,0.1)",
 | 
						|
                  },
 | 
						|
                },
 | 
						|
              },
 | 
						|
              {
 | 
						|
                type: "map",
 | 
						|
                map: "滨海县",
 | 
						|
                zlevel: -2,
 | 
						|
                aspectScale: 1,
 | 
						|
                zoom: 0.65,
 | 
						|
                layoutCenter: ["50%", "52%"],
 | 
						|
                layoutSize: "180%",
 | 
						|
                roam: false,
 | 
						|
                silent: true,
 | 
						|
                itemStyle: {
 | 
						|
                  normal: {
 | 
						|
                    borderWidth: 1,
 | 
						|
                    // borderColor: "rgba(57, 132, 188,0.4)",
 | 
						|
                    borderColor: "rgba(2, 198, 220, 0.4)",
 | 
						|
                    shadowColor: "rgba(2, 198, 220, 0.4)",
 | 
						|
                    shadowOffsetY: 5,
 | 
						|
                    shadowBlur: 15,
 | 
						|
                    areaColor: "transpercent",
 | 
						|
                  },
 | 
						|
                },
 | 
						|
              },
 | 
						|
              {
 | 
						|
                type: "map",
 | 
						|
                map: "滨海县",
 | 
						|
                zlevel: -3,
 | 
						|
                aspectScale: 1,
 | 
						|
                zoom: 0.65,
 | 
						|
                layoutCenter: ["50%", "53%"],
 | 
						|
                layoutSize: "180%",
 | 
						|
                roam: false,
 | 
						|
                silent: true,
 | 
						|
                itemStyle: {
 | 
						|
                  normal: {
 | 
						|
                    borderWidth: 1,
 | 
						|
                    // borderColor: "rgba(11, 43, 97,0.8)",
 | 
						|
                    borderColor: "rgba(2, 198, 220, 0.2)",
 | 
						|
                    shadowColor: "rgba(2, 198, 220, 0.2)",
 | 
						|
                    shadowOffsetY: 15,
 | 
						|
                    shadowBlur: 10,
 | 
						|
                    areaColor: "transpercent",
 | 
						|
                  },
 | 
						|
                },
 | 
						|
              }
 | 
						|
            ],
 | 
						|
            series: [
 | 
						|
              {
 | 
						|
                type: 'scatter',
 | 
						|
                coordinateSystem: 'geo',
 | 
						|
                z: 3,
 | 
						|
                zlevel: 3,
 | 
						|
                // symbol: 'none',
 | 
						|
                symbolSize: 16,
 | 
						|
                rippleEffect: {
 | 
						|
                  period: 2,
 | 
						|
                  scale: 4,
 | 
						|
                  brushType: 'fill'
 | 
						|
                },
 | 
						|
                label: {
 | 
						|
                  show: true,
 | 
						|
                  formatter: e => {
 | 
						|
                    const name = e.data[3]
 | 
						|
                    const value = e.data[2]
 | 
						|
                    return `{a|${name}}\n{b|${value}}`
 | 
						|
                  },
 | 
						|
                  fontSize: 16,
 | 
						|
                  rich: {
 | 
						|
                    a: {
 | 
						|
                      width: '100%',
 | 
						|
                      color: '#fff',
 | 
						|
                      lineHeight: 20,
 | 
						|
                      fontSize: 16
 | 
						|
                    },
 | 
						|
                    b: {
 | 
						|
                      backgroundColor: {
 | 
						|
                        // image: require('@/assets/images/point.png')
 | 
						|
                      },
 | 
						|
                      color: '#fff',
 | 
						|
                      height: 56,
 | 
						|
                      align: 'center',
 | 
						|
                      width: 50,
 | 
						|
                      fontSize: 16
 | 
						|
                    }
 | 
						|
                  }
 | 
						|
                },
 | 
						|
                data: []
 | 
						|
              }
 | 
						|
            ]
 | 
						|
          }
 | 
						|
          this.chart.setOption(option)
 | 
						|
        }
 | 
						|
      })
 | 
						|
    },
 | 
						|
 | 
						|
    convertData(data) {
 | 
						|
      return data.map(v => {
 | 
						|
        return [this.qqMapTransBMap(v.point[1], v.point[0]).lng, this.qqMapTransBMap(v.point[1], v.point[0]).lat, v.value, v.name]
 | 
						|
      })
 | 
						|
    },
 | 
						|
 | 
						|
    qqMapTransBMap(lng, lat) {
 | 
						|
      const x_pi = 3.14159265358979324 * 3000.0 / 180.0
 | 
						|
      var x = lng
 | 
						|
      var y = lat
 | 
						|
      var z = Math.sqrt(x * x + y * y) + 0.00002 * Math.sin(y * x_pi)
 | 
						|
      var theta = Math.atan2(y, x) + 0.000003 * Math.cos(x * x_pi)
 | 
						|
 | 
						|
      return {
 | 
						|
        lng: z * Math.cos(theta) + 0.0065,
 | 
						|
        lat: z * Math.sin(theta) + 0.006
 | 
						|
      }
 | 
						|
    },
 | 
						|
 | 
						|
    getData() {
 | 
						|
      return http.post(`/app/appdvcpconfig/apiForward?url=${encodeURIComponent(`https://geo.datav.aliyun.com/areas_v3/bound/geojson?code=${this.$store.state.user.info.areaId.substr(0, 6)}`)}`,)
 | 
						|
    }
 | 
						|
  }
 | 
						|
}
 | 
						|
</script>
 | 
						|
 | 
						|
<style lang="scss" scoped>
 | 
						|
.AiDvMap {
 | 
						|
  display: flex;
 | 
						|
  align-items: center;
 | 
						|
  justify-content: center;
 | 
						|
  width: 100%;
 | 
						|
  height: 100%;
 | 
						|
}
 | 
						|
</style>
 |