echarts实现地图数据迁徙效果

实际效果如下:

第一步,我们先获取地图底图,不包含区镇的地图文件可以从这个网站 上面下载DataV.GeoAtlas地理小工具系列,

如果要获取市或县底下的区镇数据,可通过下面的链接来获取

https://blog.sina.cn/dpool/blog/s/blog_c47286b00102zg2p.html

通过bigemap和geojson获取echarts精确到乡镇、街道的地图json数据(获取的json数据与echarts比少cp坐标,自行添加即可)

通过bigemap和geojson获取echarts精确到乡镇、街道的地图json数据

(一):进入bigemap下载页面,下载红框里的版本

22222222.png

(二):下载安装之后打开,可以在右上角进行区域的选择,可以发现,它是精确到镇级的,然后选择每个乡镇街道的区名等下载相应的kml,然后所有的区的kml文件放在一个文件夹

这里 不要点击左边的下载按钮,请选择图中 红框选中的导出按钮,即可保存kml文件:

33333.png

可以在地图上看到效果:

444444444.png

(三)在geojson.io上把刚刚在bigemap地图下载器导出的kml文件导入进来geojson.io | powered by Mapbox

666666.png

open-file 选中刚才的文件打开它

777777.png

可以看到,左边就是你导入文件选择的数据区域,右边则是自动生成的geojson数据。

这样就完成了北京-平谷区其中一部分区域的绘制

88888.png

接下来只要把所有区域选择一个区域一个区域下载下来,生成的kml文件导出保存在一个文件夹,再导入到这个网站,像拼拼图一样拼起来就可以了。

9999999.png

最后全部导入拼好之后,全选右边的数据,新建一个.json文件,拷贝进去保存,这样引用的时候就可以正常使用了。

既然地图的json已经获取到了,那如何通过echarts做成第一张的样子,下面是接口中返回的数据

[{
    "xmmc": "xxxx",
    "dtdmc": "xxxx",
    "sl": 101,
    "cfdjd": "120.980000",
    "cfdwd": "31.380000",
    "mddjd": "120.865",
    "mddwd": "31.145"
}]
<template>
  <div class="content" ref="echarts"></div>
</template>
  
  <script>
// 引入echarts
import * as echarts from 'echarts'
// 引入地图
import 'echarts/lib/chart/map'
import chinaMap from '@/utils/china.json'
// 引入js
//   import 'echarts/map/js/china.js'

export default {
  components: {},
  props: ['mapArr', 'isOpen'],
  watch: {
    isOpen: {
      handler(newVal) {
        if (newVal) {
          this.lineData = this.mapArr
        }
      },
      deep: true
    }
  },
  data() {
    // 这里存放数据
    return {
      planePath:
        'image://data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAF92lUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNi4wLWMwMDIgNzkuMTY0NDYwLCAyMDIwLzA1LzEyLTE2OjA0OjE3ICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgMjEuMiAoTWFjaW50b3NoKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjQtMDctMzFUMTA6Mjg6NDUrMDg6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDI0LTA3LTMxVDEwOjMxOjMyKzA4OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDI0LTA3LTMxVDEwOjMxOjMyKzA4OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjZlYTFiMjYwLTcyMzUtNDBlZS04ODQwLTQ2YjNiYzFiNDdlYyIgeG1wTU06RG9jdW1lbnRJRD0iYWRvYmU6ZG9jaWQ6cGhvdG9zaG9wOjVhM2E4Y2U1LTZlNzEtNWI0Mi1iOWI3LWNiNDU0OTFmZmQ1YiIgeG1wTU06T3JpZ2luYWxEb2N1bWVudElEPSJ4bXAuZGlkOjQ0ZWQ5ZTAxLTQ0MzItNGNjNy04YmU4LTU5NWFmZDRkYzY1YSI+IDx4bXBNTTpIaXN0b3J5PiA8cmRmOlNlcT4gPHJkZjpsaSBzdEV2dDphY3Rpb249ImNyZWF0ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6NDRlZDllMDEtNDQzMi00Y2M3LThiZTgtNTk1YWZkNGRjNjVhIiBzdEV2dDp3aGVuPSIyMDI0LTA3LTMxVDEwOjI4OjQ1KzA4OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgMjEuMiAoTWFjaW50b3NoKSIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6NmVhMWIyNjAtNzIzNS00MGVlLTg4NDAtNDZiM2JjMWI0N2VjIiBzdEV2dDp3aGVuPSIyMDI0LTA3LTMxVDEwOjMxOjMyKzA4OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgMjEuMiAoTWFjaW50b3NoKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8L3JkZjpTZXE+IDwveG1wTU06SGlzdG9yeT4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz4bI5FAAAADMUlEQVRYhc2WTWxUVRSAv3Pfm1I6toPQNoo2SIgbSaBAgFBIbGLQkJBgSOjODWFBNNEVunABxr2GEPZEd4VIDGBMgARr2oipDJ2kA4U0Wmuhai2106Ezzbx7XLx5A9iZNy8zhOGs5p7fb+49594nqkojxTS0+vMA4IZaP3yXKx9/BUDe+ke1tdkDuAlsrhSm1n4GnAjWa19qrxFguXwyqSs+7ZJ8azlj8maK5EiK+9N/7b99e2wYuAhw5dLZugGOv9rSdOz1F9z48IMlcJY73Lk7zhcnTwfLbcAFq3ZPcT1YKXFoDxRUemPG/N7TvvLE2EIhfuTGHGcnH5b1HU3fAmBL9ya2dG8CQMTsFTF7w2pE2oFzUzm+ubcIwBpXyvrMz2cAmJ19UNIJdFTLHQkg9XeWmX/8AtmYA6+tWuazY/s27o6PMzExGaiSYql8+JEADL3rrvUn3pNY9s1MLhuo2yZn0v933Ql0b1xtfumIJQBOJW/twaH8eT0mEnYTeh8drOmaVPSJMXRPnq/o2/CLqOEAoT2QW8zTvHJFzcn3pWMAXK4V4InirkKh/AgCZC2cnxMGFgzzHu/PemDgy6L535oAlnJLNDU3+b8PT2DSrZhf40jGRRZcsI980znh69nSiXYIHPdc+3Nx/V1NAEFxANuZx3bmoXempJOsi5Nqw73awQ8Zf3d29+wEYHDoOsZwqC4Ar+DhuA52fflx1ngBbfEA6GpSQBgcuv7IDmNh+asCOK7/6tiuqvcJb7cpww+V1KIE1a9ZMWeqxUUaQye5qqrPiw4cbVfealXeaNYRkA8cZdpRpsPiIr0Fkim6eeI3YNCECy7mtxYAUovCsanS/9mM6IhBdxXXw3UBALgD7bgDayrav5/3t/6VtS8DMHXvvusJh+sCCJrQB6hcHPx7AGDDhvUBACiJ0KBqAEHxKNITV37KCgM/DpV0Br6tC0CEUVU2RgF4p03JqeVqRpjz+OPPgvlckf66AIy1fdaY/qgQBxLKgYQCtFgpjESJqTaGaWNtnwijUZI9JqtFZZ+oIFr5/YgCUA9EJIk6hmljbV9BpfNpAzT8gyT0m/BZSMN34D817xsTy1El4AAAAABJRU5ErkJggg==',
      res: [],
      series: [],
      lineData: []
    }
  },

  mounted() {
    // this.$nextTick(() => {
    //     this.init()
    // })
  },
  // 方法集合
  methods: {
    init() {
      echarts.registerMap('china', { geoJSON: chinaMap }) // 注册地图文件
      const myChart = echarts.init(this.$refs.echarts)

      this.res = []
      this.series = []
      let arr = []
      for (var i = 0; i < this.lineData.length; i++) {
        if (this.lineData[i].cfdjd && this.lineData[i].cfdwd) {
          arr.push({
            name: this.lineData[i].xmmc,
            value: [this.lineData[i].cfdjd, this.lineData[i].cfdwd],
            count: this.lineData[i].sl
          })
        }
        if (this.lineData[i].mddjd && this.lineData[i].mddwd) {
          arr.push({
            name: this.lineData[i].dtdmc,
            value: [this.lineData[i].mddjd, this.lineData[i].mddwd]
          })
        }

        if (
          this.lineData[i].cfdjd &&
          this.lineData[i].cfdwd &&
          this.lineData[i].mddjd &&
          this.lineData[i].mddwd
        ) {
          this.res.push({
            fromName: this.lineData[i].xmmc,
            toName: this.lineData[i].dtdmc,
            coords: [
              [this.lineData[i].cfdjd, this.lineData[i].cfdwd],
              [this.lineData[i].mddjd, this.lineData[i].mddwd]
            ],
            count: this.lineData[i].sl
          })
        }
      }
    //   console.log(this.res, 'this.res')

      this.series.push(
        //
        {
          name: '',
          type: 'effectScatter',
          coordinateSystem: 'geo',
          // 要有对应的经纬度才显示,先经度再维度
          data: arr,
          showEffectOn: 'render',
          rippleEffect: {
            scale: 2, // 波纹的最大缩放比例
            brushType: 'stroke'
          },
          //   hoverAnimation: true,
          label: {
            normal: {
              show: true,
              formatter: params => {
                // console.log(params, 'params')
                return params.data.count ? params.data.count : ''
              },
              position: 'right',
            //   fontWeight: 500,
              fontSize: 14,
            //   color: '#fff'
            }
          },
          itemStyle: {
            normal: {
              color: '#00e3ff',
              shadowBlur: 10,
              shadowColor: '#333'
            }
          },
          emphasis: {
            itemStyle: {
              color: '#f4e925' // 高亮颜色
            }
          },
          zlevel: 1,
          tooltip: {
            show: true,
            formatter: params => {
                return `${params.data.name}`
                // console.log(params, 'params')
            }
          }
        },
        {
          name: '',
          type: 'lines',
          zlevel: 1,
          effect: {
            show: true,
            constantSpeed: 20,
            symbol: this.planePath,
            symbolSize: 20,
            trailLength: 0,
            symbolRotate: 90
          },
          tooltip: {
            formatter: function (param) {
                // console.log(param, 'params')
                return (`<div style="word-break: break-all;word-wrap: break-word;white-space: normal;margin: 0; padding: 0; max-width: 300px;">
                    <span style="margin: 0; padding: 0; line-height: 2; display: block;">起始地: ${param.data.fromName}</span>
                    <span style="margin: 0; padding: 0; line-height: 2; display: block;">目的地: ${param.data.toName}</span>
                    <span style="margin: 0; padding: 0; line-height: 2; display: block;">趟数:${param.data.count}</span>
                </div>`)
            //   return (
            //     param.data.fromName +
            //     '>' +
            //     param.data.toName +
            //     '<br>:' +
            //     param.data.count
            //   )
            }
          },
          lineStyle: {
            normal: {
              color: new echarts.graphic.LinearGradient(
                0,
                0,
                0,
                1,
                [
                  {
                    offset: 0,
                    color: '#58B3CC'
                  },
                  {
                    offset: 1,
                    color: '#F58158'
                  }
                ],
                false
              ),
              width: 3,
              opacity: 0.5,
              curveness: 0.1
            }
          },
          data: this.res
        }
      )

      let option = {
        title: {
          text: '',
          textStyle: {
            // color: '#ffffff'
          }
        },
        legend: {
          show: true,
          selected: {},
          x: 'left',
          orient: 'vertical',
          textStyle: {
            color: 'white'
          },
          data: []
        },
        tooltip: {
          trigger: 'item',
          show: true
        },
        geo: {
          map: 'china',
          // show: true,
          roam: true,
          top: '0',
          center: [120.983219, 31.369131],
          zoom: 36,
          label: {
            normal: {
              show: false
            },
            emphasis: {
              show: false
            }
          },
          // 地图的背景色
          itemStyle: {
            normal: {
              areaColor: '#09184F',
              borderColor: '#00ffff',
              shadowColor: '#09184F',
              shadowBlur: 20
            },
            emphasis: {
              // 设置高亮状态下的样式
              areaColor: '#0e64d7' // 地图区域的高亮背景色
            }
          }
        },
        series: this.series
      }

      myChart.setOption(option)
      // window.addEventListener('resize', function() {
      //   myChart.resize()
      // })
    }
  }
}
</script>
  <style lang="scss" scoped>
.content {
  width: 100%;
  height: 100%;
}
</style>

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值