简单聊聊Echarts伪3D地图实现的相关配置

知识和技能真的是用进废退,还是得多实践,才不至于遗忘。

目录

前言

二、实现原理

三、从0开始实现

1.目录结构

2.地图JSON数据获取

3.具体实现,重头戏

3.一些常见问题的解决方法

总结


前言

本文简单来聊一聊Echarts伪3D地图的实现,只分离出最底层的伪3D效果,删除了其余的上层展示效果。Echarts这块还有一些重要且常用的功能,比如,地图钻取、结合散点图实现各种效果等,总之,可玩性很高。本文还是抽丝剥茧,只专注3D效果这一点,贪多嚼不烂,后续有机会可以进行扩展,或者网上能够找到不少的Echarts社区的镜像站。里面的示例良莠不齐,但仔细甄别后,有很多可取之处。


一、实现效果图

先来看效果图,如果不符合你的业务需求,也就不用再继续浪费你的时间了,再去找找其他效果实现。所有的天马行空,一定可以用技术来实现,如果不能,那就是技术还有待发展。加油,期待在别的博文中有幸再见。

 如果需要在线运行预览,可以直接点击:

 

二、实现原理

实现的原理:说白了就是多图层错位,辅以相应的颜色搭配营造出一种凸起的效果。具体的配置包括:zlevel(用于分层,数值大的在数值小的上面)、aspectScale(地图的长宽比,默认0.75)、layoutCenter(定义地图中心在屏幕中的位置)、layoutSize(定义地图的大小)等

三、从0开始实现

1.目录结构

mapdemo目录下,包含以下四个文件:

2.地图JSON数据获取

DataV.GeoAtlas地理小工具系列

我为了演示方便,直接放到了js文件里了,采用变量存储。开发中应该是放到JSON文件里进行读取。演示使用如下所示:

3.具体实现,重头戏

页面布局上使用了Grid布局,有兴趣的同学也可以进行了解学习一下,万事开头难,还是那句话,用进废退,实践是最好的老师。如果不感兴趣,也没问题,毕竟不是本文的主题,只是我希望我用一点能够达到一个抛砖引玉的效果,激发大家的好奇心。

代码如下(示例):

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Echarts伪3D地图</title>
    <script src="./echarts.min.js"></script>
    <script src="./map-shandong.js"></script>
    <script src="./map-shanxi.js"></script>
    <style>
      * {
        margin: 0;
      }
      .map-panel {
        position: relative;
        box-sizing: border-box;
        width: 100vw;
        height: 100vh;
        display: grid;
        grid-template-columns: repeat(2, 1fr);
        grid-template-rows: 55px auto;
        grid-template-areas:
          "header header"
          "left right";
        gap: 10px;
        padding: 10px;
      }
      .title {
        grid-area: header;
        display: grid;
        justify-items: center;
        align-items: center;
        font-size: 28px;
        font-weight: bold;
      }
      .shandong-map {
        grid-area: left;
        border: 1px solid #007acc;
        border-radius: 5px;
      }
      .shanxi-map {
        grid-area: right;
        border: 1px solid #007acc;
        border-radius: 5px;
      }
    </style>
  </head>
  <body>
    <div class="map-panel">
      <div class="title">Echarts伪3D地图</div>
      <div id="shandong-map" class="shandong-map"></div>
      <div id="shanxi-map" class="shanxi-map"></div>
    </div>
  </body>
  <script>
    window.onload = () => {
      initMap("shandong", mapJsonDataShanDong, "shandong-map");
      initMap("shanxi", mapJsonDataShanXi, "shanxi-map");
    };

    function initMap(mapName, mapJsonData, domId) {
      echarts.registerMap(mapName, mapJsonData);
      let option = {
        tooltip: {
          show: false,
        },
        geo: [
          {
            show: true,
            map: mapName,
            zoom: 1,
            roam: false,
            regions: [],
            zlevel: 5,
            aspectScale: 0.85,
            layoutCenter: ["50%", "50%"],
            layoutSize: "90%",
            itemStyle: {
              areaColor: "transparent",
            },
          },
          {
            show: true,
            map: mapName,
            zoom: 1,
            roam: false,
            zlevel: 4,
            layoutCenter: ["50.5%", "50.5%"],
            layoutSize: "90%",
            aspectScale: 0.85,
            itemStyle: {
              borderWidth: 1,
              borderColor: "rgba(22, 186, 212,0.8)",
              shadowColor: "rgba(80, 183, 140,0.5)",
              shadowOffsetY: 5,
              shadowBlur: 15,
              areaColor: "rgba(5,21,35,0.1)",
            },
            silent: true,
          },
          {
            show: true,
            map: mapName,
            zoom: 1,
            roam: false,
            zlevel: 3,
            layoutCenter: ["51%", "51%"],
            layoutSize: "90%",
            aspectScale: 0.85,
            itemStyle: {
              borderWidth: 1,
              borderColor: "rgba(9, 170, 148,0.6)",
              shadowColor: "rgb(80,183,140)",
              shadowOffsetY: 5,
              shadowBlur: 15,
              areaColor: "transpercent",
            },
            silent: true,
          },
          {
            show: true,
            map: mapName,
            zoom: 1,
            roam: false,
            zlevel: 2,
            layoutCenter: ["51.5%", "51.5%"],
            layoutSize: "90%",
            aspectScale: 0.85,
            itemStyle: {
              borderWidth: 1,
              borderColor: "rgba(105, 174, 253,0.4)",
              shadowColor: "rgba(10, 177, 105,0.4)",
              shadowOffsetY: 15,
              shadowBlur: 10,
              areaColor: "transpercent",
            },
            silent: true,
          },
          {
            show: true,
            map: mapName,
            zoom: 1,
            roam: false,
            zlevel: 1,
            layoutCenter: ["52%", "52%"],
            layoutSize: "90%",
            aspectScale: 0.85,
            itemStyle: {
              borderWidth: 5,
              borderColor: "rgb(6,125,119)",
              shadowColor: "rgba(10,177,105,0.3)",
              shadowOffsetY: 15,
              shadowBlur: 10,
              areaColor: "rgba(5,21,35,0.1)",
            },
            silent: true,
          },
        ],
        series: [
          {
            type: "map",
            map: mapName,
            zoom: 1,
            roam: false,
            aspectScale: 0.85,
            layoutCenter: ["50%", "50%"],
            layoutSize: "90%",
            selectedMode: false,
            itemStyle: {
              normal: {
                label: {
                  show: true,
                  color: "#FF0",
                  fontSize: 14,
                },
                borderColor: "#FFFFFF",
                borderWidth: 1,
                areaColor: {
                  type: "linear",
                  x: 1200,
                  y: 0,
                  x2: 0,
                  y2: 0,
                  colorStops: [
                    {
                      offset: 0,
                      color: "rgb(60,213,147)", // 0% 处的颜色
                    },
                    {
                      offset: 1,
                      color: "rgba(126, 207, 195,0.75)", // 50% 处的颜色
                    },
                  ],
                  global: true, // 缺省为 false
                },
              },
              emphasis: {
                label: {
                  show: true,
                  color: "#FF0",
                  fontSize: 14,
                },
                areaColor: "rgba(18, 190, 115, 0.6)",
                borderColor: "#ffdc00",
              },
            },
            zlevel: 99,
            data: [],
          },
        ],
      };

      let mapChart = echarts.init(document.getElementById(domId));
      mapChart.setOption(option);
      window.onresize = () => {
        mapChart.resize();
      };
    }
  </script>
</html>

3.一些常见问题的解决方法

echarts地图的使用过程中,可能遇到很多效果显示的问题,但是不知道如何搜索问题,总是康菲很多的时间,下面我简单的列举一些这里面需要注意的点,如果恰好有你抓耳挠腮的问题,那么我这篇文章的目的也就达到了。

        1)我们不需要geo地理坐标系图层进行交互,比如鼠标滑过、点击等事件,这时候我们可以采用silent:true配置,禁用交互。

        2)在地图钻取时候,我们基本上不需要地图点击后,地图的高亮显示,这时候我们可以通过selectedMode: false配置,禁用掉选择,这里面有个比较坑的地方,就是官网文档说的这个selectedMode属性默认是关闭的,这就容易误导我们以为默认是false,其实不然,它的意思应该说默认是关闭多选。文档原文:“选中模式,表示是否支持多个选中,默认关闭,支持布尔值和字符串,字符串取值可选'single'表示单选,或者'multiple'表示多选。”


总结

希望你工作是为了更好的生活,而不是为了活着。在这个过程中,如果能够给世界留下点什么,那就更好了。

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
/* *author:XudongChen *Date:2010-03-09 *QQ:233828249 81023617(不才) *Email:xznd@163.com */ 2009-8-13 1.加载分块地图 2.添加全景标记窗体 2009-8-14 1.增加控制条 2.增加全景标记、公交车标记显示层 3.解决地图定位问题 4.增加经纬度层功能 5.未修正图标层的定位 2009-8-15 1.已修正8.14地图定位错误,还存在放大缩小时定位不准 2.存在ie内存泄漏问题 2009-8-16 1.已修正8.15 ie内存泄漏问题,chrome下可能还存在内存泄漏 2.增加图标定位功能 3.增加鼠标滚轮事件(http://yongzhi.blog.hexun.com/5057947_d.html) 4.通过jquery加载json数据文件(图标显示层数据) 2009-8-17 1.增加建筑物高亮显示(还需完成鼠标mouseover和mouseout事件) 2009-8-18 1.完成建筑物高亮显示,有点小bug 2009-8-19 1.增加记录原始缩放比例的全局变量 2.解决建筑物高亮显示bug 2009-8-20 1.增加三维全景展示功能 2.浏览建筑详细功能 2009-8-21 1.引入jqueryAlert插件,美化弹出窗体 2009-8-23 1.增加搜索功能 2.清理建筑信息显示页和公交信息页多余数据 2009-10-22 1.增加小沙盘拖动类(鹰眼视图) BirdEye.js 完成小沙盘到地图的同步,同步方法:检测mouseup事件触发->修改url->request->计算坐标->同步行为 2.增加小沙盘样式表BirdEye.css 地图图片路径birdeyemap 3.完成window.parent地图->小沙盘的同步 问题:小沙盘->window.parent地图存在bug,可以尝试开启 2009-10-23 1.在小沙盘中增加浮动绿色框 2009-11-6 1.实现“鹰眼地图”不需移动,一幅可以看到见全景, 当主场景移动时,“鹰眼地图”只有小框在移动。 同时“小框” 主场景也在移动。 2009-12-17 1.测距功能事件配置 2009-12-21 1.完成测距功能 2009-12-22 1.配置搜索功能,后台改用s2sh框架 2.完成hessian+spring+hibernate整合,提供建筑信息和公司信息hessian查找服务 2009-12-23 1.配置hessian服务端缓存 2.配置hessian日志记录,输出到文件/log/wzucxd/html 3.完成建筑信息显示页,配置2级缓存 4.配置oscache 5.配置新闻信息模块 2010-1-13 1.完成chrome和ff下的搜索功能 2.搜索功能支持ie6.0+ //设置Theodolite$setPoint var cpointtmp = new CPoint(this.holder.offsetLeft + evt.clientX - this.mvl.offsetLeft, this.mvl.offsetTop + evt.clientY - this.mvl.offsetTop); Theodolite$setPoint(cpointtmp);
实现echarts3D地图效果,可以使用geo属性来生成地图。首先,需要引入坐标json数据并注册地图。可以在mounted钩子函数中使用echarts.init方法初始化echarts,并使用echarts.registerMap方法注册地图。然后,在data选项中定义option对象,通过geo属性来配置地图的样式和堆叠效果。可以根据实际效果调整top值来实现堆叠效果,zlevel值越大,图层则越往上。可以定义多个geo属性来构建多个相同的地图,每个地图可以设置不同的样式。可以通过itemStyle属性来设置地图的背景颜色、边框颜色等。最后,使用chart.setOption方法将option配置应用于echarts实例,即可实现echarts3D地图效果。 示例代码如下: ```javascript import jiangsu from "./jiangsu.json" // 引入地图json数据 import echarts from "echarts" export default { name: "app", data() { return { option: { geo: [ { map: 'JS', label: { show: true, color: '#eee' }, itemStyle: { color: '#2075B8', // 背景颜色 borderWidth: '1', // 边框宽度 borderColor: '#fff', // 边框颜色 } }, { map: 'JS', top: '11%', zlevel: 4, itemStyle: { color: '#3C5FA1', // 背景颜色 borderWidth: '1', // 边框宽度 borderColor: '#3C5FA1', // 边框颜色 } }, { map: 'JS', top: '12%', zlevel: 3, itemStyle: { color: '#163F6C', // 背景颜色 borderWidth: '1', // 边框宽度 borderColor: '#163F6C', // 边框颜色 } }, { map: 'JS', top: '13%', zlevel: 2, itemStyle: { color: '#31A0E6', // 背景颜色 borderWidth: '1', // 边框宽度 borderColor: '#31A0E6', // 边框颜色 shadowColor: '#fff', // 外部阴影颜色 shadowBlur: '10' // 外部阴影模糊度 } } ] } } }, mounted() { let chart = echarts.init(document.getElementById('main')); echarts.registerMap('JS', jiangsu); chart.setOption(this.option); } } ``` 通过以上代码可以实现echarts3D地图效果。在echarts的geo属性中配置不同的图层样式和堆叠效果,可以实现更加丰富的地图效果。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [使用Echarts实现地图3D效果](https://blog.csdn.net/m0_61644055/article/details/124194601)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是小宗啊?

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值