echarts地图 区分内外边界线 自定义背景图 大屏自适应

在这里插入图片描述
本效果实现的难点在于:1、区分地图内外边界线 2、为地图添加自定义的背景图 3、实现大小自适应

设计地图分层结构

问题1:如何为echarts地图设置不同颜色的内外轮廓

探索:echarts没有提供专门区分内外border的配置项,网上常见的方法是在geo和series中叠加两层,让上层(设置了内轮廓)覆盖住下层(设置了外轮廓),但前提是两层地图的背景都是纯色不透明的,否则会导致下层地图的内轮廓遮不住

解决方法:沿用叠加的思想,初始化两个地图,一个使用带内边界的json,用于定义内边界效果;一个使用只带外轮廓的json,用于定义外边界效果。且外边界要更粗,内外边界颜色区别不能太大。

问题2:如何为echarts地图设置背景图

探索:网络上有使用itemStyle.color.image进行配置的,也可以使用graphic进行配置,但几种方法都不便于调整背景图的位置,导致地图边界与背景图无法契合

解决方法:使用img标签引入ui切好的背景图置于最底层,将两层echarts地图背景色都设置为透明,在浏览器中逐步调整背景图位置

整体dom结构如下:
在这里插入图片描述
需要设置各个层的position和z-index来实现叠加
在这里插入图片描述

地图配置

首先初始化顶层地图,即带内边框的地图,使用的是完整的json

		let mapJson = './map/430000_full.json'
        const myChart = echarts.init(document.getElementById('map1'))
        let option = {
          backgroundColor: 'rgba(0,0,0,0)',
          tooltip: {
            show: false
          },
          legend: {
            show: false
          },
          geo: [
            {
              zlevel: 1,//geo显示级别,默认是0
              map: 'hunan',
              // 顶层地图的样式
              itemStyle: {
                normal: {
                  areaColor: 'rgba(0,0,0,0)',
                  borderWidth: 1,
                  borderColor: '#0dd6ed',
                  // shadowBlur: 10,
                  // shadowColor: "#FFFFFF"
                },
                emphasis: {
                  areaColor: "rgba(3,248,255,0.3)"
                }
              },
              label: {
                normal: {
                  show: true,
                  color: "#fff",
                  formatter: function (params) {
                    if (params.name == "湘西土家族苗族自治州") {
                      return "湘西州"
                    }
                  }
                },
                emphasis: {
                  show: true,
                  color: "#fff",
                  formatter: function (params) {
                    if (params.name == "湘西土家族苗族自治州") {
                      return "湘西州"
                    }
                  }
                }
              }
            }
          ],
          series: [
            {
              zlevel: 2,
              name: '国家级园区',
              type: 'scatter',
              coordinateSystem: 'geo',
              data: this.gjLevel,
              symbol: 'image://./img/gj.png',
              symbolSize: function (val) {
                return 15;
              },
                },
                position: 'inside',
              }

            },
            {
              zlevel: 2,
              name: '省级园区',
              type: 'scatter',
              coordinateSystem: 'geo',
              data: this.sjLevel,
              symbol: 'image://./img/sj.png',
              symbolSize: function (val) {
                return 15;
              },
                position: 'inside',
              }

            },
            {
              zlevel: 2,
              name: '综合保税区',
              type: 'scatter',
              coordinateSystem: 'geo',
              data: this.zhLevel,
              symbol: 'image://./img/zh.png',
              symbolSize: function (val) {
                return 15;
              },
                position: 'inside',
                extraCssText: ''
              }

            }
          ]
        }

        myChart.showLoading();
        $.getJSON(mapJson, function (geoJson) {
          echarts.registerMap('hunan', geoJson);
          myChart.hideLoading();
          myChart.setOption(option);
        });

然后初始化第二层地图,即只带外边框的地图,使用的是不完整的json

		// 中间层 只有外部轮廓的地图
        let mapJson2 = './map/430000.json'
        const myChart2 = echarts.init(document.getElementById('map2'))
        let option2 = {
          backgroundColor: 'rgba(0,0,0,0)',
          tooltip: {
            show: false
          },
          legend: {
            show: false
          },
          geo: [
            {
              zlevel: 1,//geo显示级别,默认是0
              map: 'hunan2',
              // 顶层地图的样式
              itemStyle: {
                normal: {
                  areaColor: 'rgba(0,0,0,0)',
                  borderWidth: 7,
                  borderColor: '#8ddffc',
                  shadowBlur: 10,
                  shadowColor: "#8ddffc"
                }
              },
              label: {
                show: false
              }
            }
          ]
        }
        $.getJSON(mapJson2, function (geoJson) {
          echarts.registerMap('hunan2', geoJson);
          myChart2.hideLoading();
          myChart2.setOption(option2);
        });

最底层是背景图片层,这层只需要在css中设置其宽高、位置即可

大屏自适应

用这种多层叠加方法绘制的地图无法使用echarts自带的resize,为了实现对这三层统一的控制,这里采用flex布局和动态调整scale的方法。
为地图容器的外层容器设置flex布局,使得地图始终居中:
在这里插入图片描述
定义动态改变容器大小比例的函数:

setScale() {
        let designWidth = 1920;//设计稿的宽度,根据实际项目调整
        let designHeight = 961;//设计稿的高度,根据实际项目调整
        let scale = document.documentElement.clientWidth / 			
        document.documentElement.clientHeight < designWidth / designHeight ?
          (document.documentElement.clientWidth / designWidth) :
          (document.documentElement.clientHeight / designHeight);
        document.querySelector('.container').style.transform = `scale(${scale})`;
      }

监听窗口尺寸改变,动态改变地图容器的比例大小:

window.onresize = () => {
  this.setScale()
}

有其他问题欢迎评论或者私信咨询!

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
ECharts大屏地图是一种基于ECharts框架开发的交互式地图展示工具,可以将地理数据以直观的方式呈现在大屏幕上。它包括了丰富的地图效果和交互功能,方便用户观察地理分布和趋势。 ECharts大屏地图具有以下特点和优势: 1.高度可定制化:ECharts大屏地图支持用户自定义地图样式,包括地区边界、颜色渐变、图标标记等;同时,用户可以根据需要选择要展示的地理数据,如人口分布、商业区域、交通流量等。 2.视觉效果出众:ECharts大屏地图通过丰富多样的图表类型和动画效果,使地理数据更加直观生动。用户可以通过交互操作,动态切换地理要素和样式,进一步突出重点区域或数据。 3.交互性强:ECharts大屏地图支持鼠标滚动、拖拽、缩放等操作,用户可以轻松浏览地图区域,并通过点击地图上的元素获取详细信息。同时,用户还可以添加自定义的交互组件,如下拉框、滑块等,以满足特定需求。 4.数据联动:ECharts大屏地图可以与其他数据源进行联动,在地图中展示实时数据或与外部系统进行数据交互。这样,用户可以实时监测地理要素的变化,并根据需要进行相应的调整和决策。 总之,ECharts大屏地图是一种便捷、灵活的地图展示工具,可广泛应用于数据可视化、市场分析、城市规划等领域。通过互动性强和视觉效果出众的特点,它可以更好地帮助用户理解和分析地理数据,从而支持决策和管理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值