Echarts +Amap 实现点击地图下钻功能

1、最近的项目需求中,需要实现地图下钻到区的功能,所以在查阅一些资料后,决定使用Amap。

     下钻效果:

       

2、前期工作:

     ①、首先要去高德api上申请密钥,免费的一天可以发出5000次:developer.amap.com/

     ②、控制台 新建应用,就会生成一个key

       

3、在vue中引入

// 打开 index.html

* xxxx  是你的key值  比如:'4565465413213465asdaaffafaa'

 <script type="text/javascript" src="//webapi.amap.com/maps?v=1.4.15&key=xxxxxxxxxxxxxxxxxxx"></script>
  <!-- UI组件库 1.0 -->
  <script type="text/javascript" src="//webapi.amap.com/ui/1.1/main.js"></script>

//这里我们是用cdn引入的,所以要在build/webpack.base.conf.js里面让webpack不处理aMap的依赖库
externals: {
    'AMap':'AMap',
   'AMapUI': 'AMapUI'
}

4、高德api:用获取行政区的api方法也就是 AMapUI 组件库https://lbs.amap.com/api/amap-ui/intro)的 DistrictExplorer 进行行政区geoJson的获取。 (详细使用请仔细阅读)

//获取geoJson数据

 mounted(){
     this.getGeoJson(100000);
   }
  methods:{

     getGeoJson(adcode) {
      this.map = new AMap.Map("map", {
        resizeEnable: true,
        center: [116.30946, 39.937629],
        zoom: 3
      });
      let that = this;
      AMapUI.loadUI(["geo/DistrictExplorer"], DistrictExplorer => {
        var districtExplorer = (window.districtExplorer = new DistrictExplorer({
          eventSupport: true, //打开事件支持
          map: this.map
        }));
        districtExplorer.loadAreaNode(adcode, function(error, areaNode) {
          if (error) {
            // console.error(error);
            return;
          }
          let Json = areaNode.getSubFeatures();

          if (Json.length > 0 && Json[0].properties.level == "district") {
            that.parentJson = Json;
          } else if (Json.length == 0) {
            Json = that.parentJson.filter(item => {
              if (item.properties.adcode == adcode) {
                return item;
              }
            });
          }
          that.geoJsonData = {
            features: Json
          };
          //console.log(that.geoJsonData);

          // 此处可执行 获取 地图数据的方法

          //获取地图数据 例如:

          this.getMapData()
        });

      });
    },
}
    

5、使用Echarts加载地图 (热力图)

    ①、地图数据 格式:

//  数据格式
 
//  name,value是必须参数,后面的根据自己实际情况自定义添加
[
  {
    name:'山东',
    value: 1,
    leave:''
  }
]

  ②、渲染

<template>
   <div class="map" ref="cndb_echartsData" style="height:100%;width:100%">
</template>

 drawLineEchertsChange(sjcnsjArr) {
      console.log(sjcnsjArr);
      var e = document.body.clientWidth;
      // 基于准备好的dom,初始化echarts实例
        this.myEchertsSix= echarts.init(this.$refs.cndb_echartsData)
    //注册地图,前面名字自定义,后面是高德获取的geoJson
      this.$echarts.registerMap("Map", this.geoJsonData);
      myEchertsSix.setOption({
        tooltip: {
          // 鼠标移到图里面的浮动提示框
          // formatter详细配置: https://echarts.baidu.com/option.html#tooltip.formatter
          formatter(params, ticket, callback) {
            // params.data 就是series配置项中的data数据遍历
            let localValue, perf, downloadSpeep, usability, point;
            if (params.data) {
              // console.log(params.data)
              localValue = params.data.value;
              perf = params.data.perf;
              downloadSpeep = params.data.downloadSpeep;
              usability = params.data.usability;
              point = params.data.point;
            } else {
              // 为了防止没有定义数据的时候报错写的
              localValue = 0;
              perf = 0;
              downloadSpeep = 0;
              usability = 0;
              point = 0;
            }
            //     let htmlStr = `
            //   <div style='font-size:18px;'> ${params.name}</div>
            //   <p style='text-align:left;margin-top:3px;'>
            //    测试1:${localValue}<br/>
            //   </p>
            // `;
            //     return htmlStr;
          }
          // backgroundColor:"#ff7f50",//提示标签背景颜色
          // textStyle:{color:"#fff"} //提示标签字体颜色
        },
        visualMap: {
          // 左下角的颜色区域
          type: "piecewise", // 定义为分段型 visualMap
          min: -2,
          max: 1,
          itemWidth: 8,
          itemHeight: 8,
          left: "-1%", //组件离容器左侧的距离,'left', 'center', 'right','20%'
          top: "70%", //组件离容器上侧的距离,'top', 'middle', 'bottom','20%'
          right: "auto", //组件离容器右侧的距离,'20%'
          bottom: "auto", //组件离容器下侧的距离,'20%'w
          padding: 0.5,
          textGap: 5,
          pieces: [
            { value: -1, label: "实际<设计", color: "#4E79E0" },
            { value: 0, label: "实际=设计", color: "#564EBC" },
            { value: 1, label: "实际>设计", color: "#3C9CFF" }
          ],
          textStyle: {
            color: "#C0A4C3",
            fontSize: 9
          }
        },
        geo: {
          map: "Map",
          show: true,
          zoom: 1.25,
          geoIndex: 1,
          aspectScale: 0.75, //长宽比
          showLegendSymbol: true, // 存在legend时显示
          roam: false,
          label: {
            normal: {
              //静态的时候展示样式
              show: false, //是否显示地图省份得名称
              textStyle: {
                color: "#fff",
                fontSize: 9
                // fontFamily: "Arial"
              }
            },
            emphasis: {
              //动态展示的样式
              color: "#43d0d6"
            }
          },
          itemStyle: {
            // 地图区域的多边形 图形样式。
            borderColor: "rgba(0, 0, 0, 0.2)",
            emphasis: {
              // 高亮状态下的多边形和标签样式
              shadowBlur: 20,
              shadowColor: "rgba(0, 0, 0, 0.5)"
            }
          }
        },
        series: [
          {
            name: "地图",
            type: "map",
            data: sjcnsjArr,
            geoIndex: 0,
            // coordinateSystem: "geo",
            label: {
              show: true
            },
            roam: false,
            layoutCenter: ["60%", "60%"], //属性定义地图中心在屏幕中的位置,一般结合layoutSize 定义地图的大小
            layoutSize: "100%"
          }
        ]
      });
      window.addEventListener("resize", function() {
        // console.log("222222222")
        myEchertsSix.resize(); //myChart指自己定义的echartsDom对象
      });
    },

6、效果如下:

7、参考资源:

     Echarts社区:https://gallery.echartsjs.com/editor.html?c=xz3jGj90ns 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值